oc2token 0.1.28 → 0.1.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/dist/src/cli.js +40 -6
- package/dist/src/cli.js.map +1 -1
- package/dist/src/dashboard/render/dashboard.d.ts +7 -1
- package/dist/src/dashboard/render/dashboard.js +56 -3
- package/dist/src/dashboard/render/dashboard.js.map +1 -1
- package/dist/src/dashboard/render/types.d.ts +9 -0
- package/dist/src/dashboard/render/types.js.map +1 -1
- package/dist/src/dashboard/settings/index.d.ts +8 -6
- package/dist/src/dashboard/settings/index.js +9 -6
- package/dist/src/dashboard/settings/index.js.map +1 -1
- package/dist/src/opencode/index.d.ts +1 -0
- package/dist/src/opencode/index.js +1 -0
- package/dist/src/opencode/index.js.map +1 -1
- package/dist/src/opencode/live.d.ts +35 -0
- package/dist/src/opencode/live.js +224 -0
- package/dist/src/opencode/live.js.map +1 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/opencode/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/opencode/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { type Endpoint } from "@opencode-ai/client/service";
|
|
2
|
+
export interface LiveTpsEvent {
|
|
3
|
+
readonly type: string;
|
|
4
|
+
readonly data?: Readonly<Record<string, unknown>>;
|
|
5
|
+
}
|
|
6
|
+
export interface LiveTpsReading {
|
|
7
|
+
readonly tps: number;
|
|
8
|
+
readonly activeSessions: number;
|
|
9
|
+
}
|
|
10
|
+
export interface LiveTpsSnapshot extends LiveTpsReading {
|
|
11
|
+
readonly available: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface LiveTpsMeter {
|
|
14
|
+
start(): void;
|
|
15
|
+
stop(): void;
|
|
16
|
+
snapshot(now?: number): LiveTpsSnapshot;
|
|
17
|
+
}
|
|
18
|
+
export interface LiveTpsMeterOptions {
|
|
19
|
+
readonly discover?: (signal?: AbortSignal) => Promise<Endpoint | undefined>;
|
|
20
|
+
}
|
|
21
|
+
/** Heuristic live rate from streamed characters; exact counts only arrive per step. */
|
|
22
|
+
export declare class TpsAggregator {
|
|
23
|
+
private readonly sessions;
|
|
24
|
+
reset(): void;
|
|
25
|
+
ingest(event: LiveTpsEvent, now: number): void;
|
|
26
|
+
snapshot(now: number): LiveTpsReading;
|
|
27
|
+
private session;
|
|
28
|
+
private addChars;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Follow OpenCode2's global event stream. One local service backs every TUI
|
|
32
|
+
* window, so this one subscription sees every active session. The number is an
|
|
33
|
+
* estimate: live text deltas are the only real-time signal the server exposes.
|
|
34
|
+
*/
|
|
35
|
+
export declare function createLiveTpsMeter(options?: LiveTpsMeterOptions): LiveTpsMeter;
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import { OpenCode } from "@opencode-ai/client";
|
|
2
|
+
import { headers as serviceHeaders } from "@opencode-ai/client/service";
|
|
3
|
+
import { discoverNativeEndpoint } from "./native.js";
|
|
4
|
+
const WINDOW_MS = 1_000;
|
|
5
|
+
const PRUNE_MS = 30_000;
|
|
6
|
+
const CHARS_PER_TOKEN = 4;
|
|
7
|
+
const MIN_FACTOR = 0.5;
|
|
8
|
+
const MAX_FACTOR = 2;
|
|
9
|
+
const MIN_CALIBRATION_TOKENS = 10;
|
|
10
|
+
const RECONNECT_BASE_MS = 1_000;
|
|
11
|
+
const RECONNECT_MAX_MS = 5_000;
|
|
12
|
+
function asRecord(value) {
|
|
13
|
+
return typeof value === "object" && value !== null ? value : undefined;
|
|
14
|
+
}
|
|
15
|
+
function asString(value) {
|
|
16
|
+
return typeof value === "string" ? value : "";
|
|
17
|
+
}
|
|
18
|
+
function asNumber(value) {
|
|
19
|
+
return typeof value === "number" && Number.isFinite(value) ? value : 0;
|
|
20
|
+
}
|
|
21
|
+
function clamp(value, min, max) {
|
|
22
|
+
return Math.min(max, Math.max(min, value));
|
|
23
|
+
}
|
|
24
|
+
/** Heuristic live rate from streamed characters; exact counts only arrive per step. */
|
|
25
|
+
export class TpsAggregator {
|
|
26
|
+
sessions = new Map();
|
|
27
|
+
reset() {
|
|
28
|
+
this.sessions.clear();
|
|
29
|
+
}
|
|
30
|
+
ingest(event, now) {
|
|
31
|
+
const data = asRecord(event.data);
|
|
32
|
+
if (data === undefined)
|
|
33
|
+
return;
|
|
34
|
+
const sessionID = asString(data.sessionID);
|
|
35
|
+
if (sessionID.length === 0)
|
|
36
|
+
return;
|
|
37
|
+
const type = event.type;
|
|
38
|
+
if (type === "session.idle") {
|
|
39
|
+
this.sessions.delete(sessionID);
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
if (type === "session.step.started") {
|
|
43
|
+
const session = this.session(sessionID, now);
|
|
44
|
+
session.stepTokens = 0;
|
|
45
|
+
session.toolChars.clear();
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
if (type === "session.step.ended") {
|
|
49
|
+
const session = this.sessions.get(sessionID);
|
|
50
|
+
if (session === undefined)
|
|
51
|
+
return;
|
|
52
|
+
const tokens = asRecord(data.tokens);
|
|
53
|
+
const providerTokens = tokens === undefined ? 0 : asNumber(tokens.output) + asNumber(tokens.reasoning);
|
|
54
|
+
if (providerTokens > 0 && session.stepTokens >= MIN_CALIBRATION_TOKENS) {
|
|
55
|
+
session.factor = clamp(providerTokens / session.stepTokens, MIN_FACTOR, MAX_FACTOR);
|
|
56
|
+
}
|
|
57
|
+
session.stepTokens = 0;
|
|
58
|
+
session.toolChars.clear();
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
if (type === "session.text.delta" || type === "session.reasoning.delta") {
|
|
62
|
+
this.addChars(sessionID, asString(data.delta).length, now);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
if (type === "session.tool.input.delta") {
|
|
66
|
+
const key = toolKey(data);
|
|
67
|
+
if (key === undefined)
|
|
68
|
+
return;
|
|
69
|
+
const session = this.session(sessionID, now);
|
|
70
|
+
const added = asString(data.delta).length;
|
|
71
|
+
if (added > 0) {
|
|
72
|
+
session.toolChars.set(key, (session.toolChars.get(key) ?? 0) + added);
|
|
73
|
+
this.addChars(sessionID, added, now);
|
|
74
|
+
}
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
if (type === "session.tool.input.ended") {
|
|
78
|
+
const key = toolKey(data);
|
|
79
|
+
if (key === undefined)
|
|
80
|
+
return;
|
|
81
|
+
const session = this.session(sessionID, now);
|
|
82
|
+
const text = asString(data.text);
|
|
83
|
+
const counted = session.toolChars.get(key) ?? 0;
|
|
84
|
+
session.toolChars.delete(key);
|
|
85
|
+
// Some servers emit only the completed tool input, not incremental deltas.
|
|
86
|
+
if (text.length > counted)
|
|
87
|
+
this.addChars(sessionID, text.length - counted, now);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
snapshot(now) {
|
|
91
|
+
const cutoff = now - WINDOW_MS;
|
|
92
|
+
let tokens = 0;
|
|
93
|
+
let activeSessions = 0;
|
|
94
|
+
for (const [sessionID, session] of this.sessions) {
|
|
95
|
+
while (session.samples.length > 0 && session.samples[0].at <= cutoff) {
|
|
96
|
+
session.samples.shift();
|
|
97
|
+
}
|
|
98
|
+
if (session.samples.length > 0) {
|
|
99
|
+
activeSessions += 1;
|
|
100
|
+
for (const sample of session.samples)
|
|
101
|
+
tokens += sample.tokens;
|
|
102
|
+
}
|
|
103
|
+
if (now - session.lastSeen > PRUNE_MS)
|
|
104
|
+
this.sessions.delete(sessionID);
|
|
105
|
+
}
|
|
106
|
+
return { tps: tokens / (WINDOW_MS / 1_000), activeSessions };
|
|
107
|
+
}
|
|
108
|
+
session(sessionID, now) {
|
|
109
|
+
let session = this.sessions.get(sessionID);
|
|
110
|
+
if (session === undefined) {
|
|
111
|
+
session = {
|
|
112
|
+
samples: [],
|
|
113
|
+
factor: 1,
|
|
114
|
+
stepTokens: 0,
|
|
115
|
+
toolChars: new Map(),
|
|
116
|
+
lastSeen: now,
|
|
117
|
+
};
|
|
118
|
+
this.sessions.set(sessionID, session);
|
|
119
|
+
}
|
|
120
|
+
session.lastSeen = now;
|
|
121
|
+
return session;
|
|
122
|
+
}
|
|
123
|
+
addChars(sessionID, chars, now) {
|
|
124
|
+
if (chars <= 0)
|
|
125
|
+
return;
|
|
126
|
+
const session = this.session(sessionID, now);
|
|
127
|
+
const rawTokens = chars / CHARS_PER_TOKEN;
|
|
128
|
+
session.stepTokens += rawTokens;
|
|
129
|
+
session.samples.push({ at: now, tokens: rawTokens * session.factor });
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
function toolKey(data) {
|
|
133
|
+
const id = asString(data.id);
|
|
134
|
+
if (id.length === 0)
|
|
135
|
+
return undefined;
|
|
136
|
+
return `${asString(data.assistantMessageID)}:${id}`;
|
|
137
|
+
}
|
|
138
|
+
function sleep(ms, signal) {
|
|
139
|
+
if (signal.aborted)
|
|
140
|
+
return Promise.resolve();
|
|
141
|
+
return new Promise((resolve) => {
|
|
142
|
+
const onAbort = () => {
|
|
143
|
+
clearTimeout(timer);
|
|
144
|
+
signal.removeEventListener("abort", onAbort);
|
|
145
|
+
resolve();
|
|
146
|
+
};
|
|
147
|
+
const timer = setTimeout(() => {
|
|
148
|
+
signal.removeEventListener("abort", onAbort);
|
|
149
|
+
resolve();
|
|
150
|
+
}, ms);
|
|
151
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
152
|
+
// Close the race between the initial check and listener registration.
|
|
153
|
+
if (signal.aborted)
|
|
154
|
+
onAbort();
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Follow OpenCode2's global event stream. One local service backs every TUI
|
|
159
|
+
* window, so this one subscription sees every active session. The number is an
|
|
160
|
+
* estimate: live text deltas are the only real-time signal the server exposes.
|
|
161
|
+
*/
|
|
162
|
+
export function createLiveTpsMeter(options = {}) {
|
|
163
|
+
const aggregator = new TpsAggregator();
|
|
164
|
+
const discover = options.discover ?? ((signal) => discoverNativeEndpoint(signal === undefined ? {} : { signal }));
|
|
165
|
+
let running = false;
|
|
166
|
+
let available = false;
|
|
167
|
+
let lifecycle;
|
|
168
|
+
let subscription;
|
|
169
|
+
async function run() {
|
|
170
|
+
let delay = RECONNECT_BASE_MS;
|
|
171
|
+
const signal = lifecycle.signal;
|
|
172
|
+
while (running) {
|
|
173
|
+
subscription = new AbortController();
|
|
174
|
+
try {
|
|
175
|
+
const endpoint = await discover(signal);
|
|
176
|
+
if (endpoint === undefined)
|
|
177
|
+
throw new Error("OpenCode 2 service not found");
|
|
178
|
+
const client = OpenCode.make({
|
|
179
|
+
baseUrl: endpoint.url,
|
|
180
|
+
headers: serviceHeaders(endpoint) ?? {},
|
|
181
|
+
});
|
|
182
|
+
aggregator.reset();
|
|
183
|
+
for await (const event of client.event.subscribe({ signal: subscription.signal })) {
|
|
184
|
+
if (!running)
|
|
185
|
+
break;
|
|
186
|
+
available = true;
|
|
187
|
+
delay = RECONNECT_BASE_MS;
|
|
188
|
+
aggregator.ingest(event, Date.now());
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
catch {
|
|
192
|
+
// A dropped service is expected during restarts; reconnect below.
|
|
193
|
+
}
|
|
194
|
+
available = false;
|
|
195
|
+
subscription = undefined;
|
|
196
|
+
if (!running)
|
|
197
|
+
break;
|
|
198
|
+
await sleep(delay, signal);
|
|
199
|
+
delay = Math.min(delay * 2, RECONNECT_MAX_MS);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
return {
|
|
203
|
+
start() {
|
|
204
|
+
if (running)
|
|
205
|
+
return;
|
|
206
|
+
running = true;
|
|
207
|
+
lifecycle = new AbortController();
|
|
208
|
+
void run();
|
|
209
|
+
},
|
|
210
|
+
stop() {
|
|
211
|
+
if (!running)
|
|
212
|
+
return;
|
|
213
|
+
running = false;
|
|
214
|
+
lifecycle?.abort();
|
|
215
|
+
subscription?.abort();
|
|
216
|
+
aggregator.reset();
|
|
217
|
+
available = false;
|
|
218
|
+
},
|
|
219
|
+
snapshot(now = Date.now()) {
|
|
220
|
+
return { available, ...aggregator.snapshot(now) };
|
|
221
|
+
},
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
//# sourceMappingURL=live.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live.js","sourceRoot":"","sources":["../../../src/opencode/live.ts"],"names":[],"mappings":"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"}
|