oc2token 0.1.24 → 0.1.25
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 +23 -14
- package/dist/src/application.d.ts +15 -1
- package/dist/src/application.js +73 -7
- package/dist/src/application.js.map +1 -1
- package/dist/src/cache/schema.js +3 -3
- package/dist/src/cache/schema.js.map +1 -1
- package/dist/src/cli.js +33 -4
- package/dist/src/cli.js.map +1 -1
- package/dist/src/dashboard/render/ansi.d.ts +2 -0
- package/dist/src/dashboard/render/ansi.js +6 -0
- package/dist/src/dashboard/render/ansi.js.map +1 -1
- package/dist/src/dashboard/render/dashboard.js +5 -1
- package/dist/src/dashboard/render/dashboard.js.map +1 -1
- package/dist/src/dashboard/render/types.js +8 -4
- package/dist/src/dashboard/render/types.js.map +1 -1
- package/dist/src/dashboard/settings/index.d.ts +7 -7
- package/dist/src/dashboard/settings/index.js +25 -8
- package/dist/src/dashboard/settings/index.js.map +1 -1
- package/dist/src/deepseek/discovery.d.ts +21 -0
- package/dist/src/deepseek/discovery.js +83 -0
- package/dist/src/deepseek/discovery.js.map +1 -0
- package/dist/src/deepseek/doctor.d.ts +8 -0
- package/dist/src/deepseek/doctor.js +103 -0
- package/dist/src/deepseek/doctor.js.map +1 -0
- package/dist/src/deepseek/index.d.ts +4 -0
- package/dist/src/deepseek/index.js +4 -0
- package/dist/src/deepseek/index.js.map +1 -0
- package/dist/src/deepseek/scanner.d.ts +9 -0
- package/dist/src/deepseek/scanner.js +283 -0
- package/dist/src/deepseek/scanner.js.map +1 -0
- package/dist/src/deepseek/types.d.ts +38 -0
- package/dist/src/deepseek/types.js +3 -0
- package/dist/src/deepseek/types.js.map +1 -0
- package/dist/src/deepseek/zstd.d.ts +11 -0
- package/dist/src/deepseek/zstd.js +138 -0
- package/dist/src/deepseek/zstd.js.map +1 -0
- package/dist/src/domain/contracts.d.ts +2 -2
- package/dist/src/domain/contracts.js.map +1 -1
- package/dist/src/domain/records.d.ts +1 -1
- package/dist/src/domain/records.js +1 -1
- package/dist/src/domain/records.js.map +1 -1
- package/dist/src/opencode/doctor.d.ts +1 -1
- package/dist/src/opencode/doctor.js.map +1 -1
- package/dist/src/output/table.js +1 -1
- package/dist/src/output/table.js.map +1 -1
- package/dist/src/pi/discovery.d.ts +12 -0
- package/dist/src/pi/discovery.js +86 -0
- package/dist/src/pi/discovery.js.map +1 -0
- package/dist/src/pi/doctor.d.ts +8 -0
- package/dist/src/pi/doctor.js +55 -0
- package/dist/src/pi/doctor.js.map +1 -0
- package/dist/src/pi/index.d.ts +3 -0
- package/dist/src/pi/index.js +3 -0
- package/dist/src/pi/index.js.map +1 -0
- package/dist/src/pi/scanner.d.ts +9 -0
- package/dist/src/pi/scanner.js +255 -0
- package/dist/src/pi/scanner.js.map +1 -0
- package/dist/src/pi/types.d.ts +45 -0
- package/dist/src/pi/types.js +3 -0
- package/dist/src/pi/types.js.map +1 -0
- package/dist/src/usage/record-result.d.ts +19 -0
- package/dist/src/usage/record-result.js +91 -0
- package/dist/src/usage/record-result.js.map +1 -0
- package/package.json +7 -2
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
import { promises as nodeFs } from "node:fs";
|
|
2
|
+
import { basename } from "node:path";
|
|
3
|
+
import { containsInstant, createUsageRecord, DomainError, cancellationError, isCancellationError, toCollectionError, } from "../domain/index.js";
|
|
4
|
+
import { UsageRecordReducer } from "../accounting/reducer.js";
|
|
5
|
+
import { buildRecordResult } from "../usage/record-result.js";
|
|
6
|
+
import { discoverDeepSeekSessionFiles } from "./discovery.js";
|
|
7
|
+
import { isZstdDecompressionAvailable, readZstdFile } from "./zstd.js";
|
|
8
|
+
const MAX_SESSION_BYTES = 256 * 1024 * 1024;
|
|
9
|
+
function assertNotAborted(signal) {
|
|
10
|
+
if (signal?.aborted) {
|
|
11
|
+
const reason = signal.reason;
|
|
12
|
+
throw cancellationError(reason instanceof Error ? reason.message : undefined);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function isRecord(value) {
|
|
16
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
17
|
+
}
|
|
18
|
+
function safeNumber(value) {
|
|
19
|
+
return typeof value === "number" && Number.isFinite(value) && value >= 0 ? value : 0;
|
|
20
|
+
}
|
|
21
|
+
function sanitizeRecordID(value, fallback) {
|
|
22
|
+
// eslint-disable-next-line no-control-regex
|
|
23
|
+
const cleaned = value.replace(/[\u0000-\u001f/]/g, "_").trim();
|
|
24
|
+
return cleaned.length > 0 ? cleaned : fallback;
|
|
25
|
+
}
|
|
26
|
+
function isTokenUsage(value) {
|
|
27
|
+
if (!isRecord(value))
|
|
28
|
+
return false;
|
|
29
|
+
return typeof value.inputTokens === "number" && typeof value.outputTokens === "number";
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* dsh reports `reasoningTokens` as informational detail already included in
|
|
33
|
+
* `outputTokens` (and its cache counters are disjoint from input). Subtract
|
|
34
|
+
* reasoning from output so this project's five-bucket sum stays exact.
|
|
35
|
+
*/
|
|
36
|
+
function tokensForUsage(usage) {
|
|
37
|
+
const reasoning = safeNumber(usage.reasoningTokens);
|
|
38
|
+
const output = Math.max(0, safeNumber(usage.outputTokens) - reasoning);
|
|
39
|
+
return {
|
|
40
|
+
input: safeNumber(usage.inputTokens),
|
|
41
|
+
output,
|
|
42
|
+
reasoning,
|
|
43
|
+
cacheRead: safeNumber(usage.cacheReadTokens),
|
|
44
|
+
cacheWrite: safeNumber(usage.cacheWriteTokens),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
function modelName(provider, model) {
|
|
48
|
+
const trimmedModel = model?.trim();
|
|
49
|
+
const trimmedProvider = provider?.trim();
|
|
50
|
+
if (trimmedModel === undefined || trimmedModel.length === 0)
|
|
51
|
+
return "unknown";
|
|
52
|
+
if (trimmedProvider === undefined || trimmedProvider.length === 0 || trimmedModel.startsWith(`${trimmedProvider}/`)) {
|
|
53
|
+
return trimmedModel;
|
|
54
|
+
}
|
|
55
|
+
return `${trimmedProvider}/${trimmedModel}`;
|
|
56
|
+
}
|
|
57
|
+
function streamUsage(stream) {
|
|
58
|
+
if (!Array.isArray(stream))
|
|
59
|
+
return undefined;
|
|
60
|
+
let found;
|
|
61
|
+
for (const record of stream) {
|
|
62
|
+
if (!isRecord(record) || record.type !== "chunk")
|
|
63
|
+
continue;
|
|
64
|
+
const chunk = record.chunk;
|
|
65
|
+
if (!isRecord(chunk) || chunk.type !== "usage")
|
|
66
|
+
continue;
|
|
67
|
+
if (isTokenUsage(chunk.usage))
|
|
68
|
+
found = chunk.usage;
|
|
69
|
+
}
|
|
70
|
+
return found;
|
|
71
|
+
}
|
|
72
|
+
function inRequestedWindow(request, createdAt) {
|
|
73
|
+
return request.windows.some((window) => containsInstant(window, createdAt));
|
|
74
|
+
}
|
|
75
|
+
function addError(state, error, fallback, sessionID) {
|
|
76
|
+
state.fileHasError = true;
|
|
77
|
+
state.errors.push(toCollectionError(error, fallback, sessionID));
|
|
78
|
+
}
|
|
79
|
+
function addUsageRecord(state, request, sessionID, messageID, createdAt, model, usage, project) {
|
|
80
|
+
if (!inRequestedWindow(request, createdAt))
|
|
81
|
+
return;
|
|
82
|
+
const tokens = tokensForUsage(usage);
|
|
83
|
+
if (tokens.input === 0 &&
|
|
84
|
+
tokens.output === 0 &&
|
|
85
|
+
tokens.reasoning === 0 &&
|
|
86
|
+
tokens.cacheRead === 0 &&
|
|
87
|
+
tokens.cacheWrite === 0) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
try {
|
|
91
|
+
state.records.push(createUsageRecord({
|
|
92
|
+
sessionID,
|
|
93
|
+
messageID: sanitizeRecordID(messageID, `${createdAt.getTime()}`),
|
|
94
|
+
createdAt,
|
|
95
|
+
model,
|
|
96
|
+
tokens,
|
|
97
|
+
observedAt: new Date(request.capturedAt.getTime()),
|
|
98
|
+
completeness: "final",
|
|
99
|
+
provider: "deepseek",
|
|
100
|
+
...(project === undefined ? {} : { project }),
|
|
101
|
+
}));
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
addError(state, error, "invalid-data", sessionID);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
function messageModel(message) {
|
|
108
|
+
if (!isRecord(message))
|
|
109
|
+
return undefined;
|
|
110
|
+
const source = message.source;
|
|
111
|
+
if (!isRecord(source))
|
|
112
|
+
return undefined;
|
|
113
|
+
const provider = typeof source.provider === "string" ? source.provider : undefined;
|
|
114
|
+
const model = typeof source.model === "string" ? source.model : undefined;
|
|
115
|
+
return provider !== undefined || model !== undefined ? { provider: provider ?? "", model: model ?? "" } : undefined;
|
|
116
|
+
}
|
|
117
|
+
function eventTime(entry, headerCreatedAt) {
|
|
118
|
+
const raw = typeof entry.time === "number" ? entry.time : headerCreatedAt;
|
|
119
|
+
if (typeof raw !== "number" || !Number.isFinite(raw))
|
|
120
|
+
return undefined;
|
|
121
|
+
const date = new Date(raw);
|
|
122
|
+
return Number.isFinite(date.getTime()) ? date : undefined;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Native DeepSeek Harness scanner. Reads `${DSH_HOME:-~/.dsh}/sessions` and
|
|
126
|
+
* selects the newest `session[.vN].jsonl[.zstd]` generation in each session
|
|
127
|
+
* directory. Token accounting lives on `assistant/message` events (top-level
|
|
128
|
+
* usage, falling back to the embedded stream), failed `assistant/attempt`
|
|
129
|
+
* streams, and `compaction/summary` calls.
|
|
130
|
+
*/
|
|
131
|
+
export async function collectDeepSeek(request, root) {
|
|
132
|
+
assertNotAborted(request.signal);
|
|
133
|
+
if (request.windows.length === 0) {
|
|
134
|
+
throw new DomainError("invalid-window", "Collection request must contain at least one usage window");
|
|
135
|
+
}
|
|
136
|
+
const files = discoverDeepSeekSessionFiles(root);
|
|
137
|
+
const errors = [];
|
|
138
|
+
const reducer = new UsageRecordReducer();
|
|
139
|
+
let sessionsScanned = 0;
|
|
140
|
+
let sessionsSkipped = 0;
|
|
141
|
+
for (const file of files) {
|
|
142
|
+
assertNotAborted(request.signal);
|
|
143
|
+
const fallbackID = sanitizeRecordID(basename(file.path, file.compressed ? ".jsonl.zstd" : ".jsonl"), "deepseek-session");
|
|
144
|
+
const state = { errors: [], records: [], fileHasError: false };
|
|
145
|
+
let content;
|
|
146
|
+
try {
|
|
147
|
+
const stat = await nodeFs.stat(file.path);
|
|
148
|
+
if (stat.size > MAX_SESSION_BYTES) {
|
|
149
|
+
sessionsSkipped += 1;
|
|
150
|
+
errors.push(toCollectionError(new DomainError("invalid-data", `DeepSeek session file exceeds ${MAX_SESSION_BYTES} bytes`, {
|
|
151
|
+
sessionID: fallbackID,
|
|
152
|
+
}), "invalid-data", fallbackID));
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
const buffer = await nodeFs.readFile(file.path);
|
|
156
|
+
if (file.compressed) {
|
|
157
|
+
if (!isZstdDecompressionAvailable()) {
|
|
158
|
+
throw new Error("DeepSeek session is zstd-compressed but neither Node Zstandard support nor the zstd CLI is available");
|
|
159
|
+
}
|
|
160
|
+
content = readZstdFile(file.path, buffer).toString("utf8");
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
content = buffer.toString("utf8");
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
if (isCancellationError(error))
|
|
168
|
+
throw cancellationError();
|
|
169
|
+
sessionsSkipped += 1;
|
|
170
|
+
errors.push(toCollectionError(error, "transport", fallbackID));
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
const entries = [];
|
|
174
|
+
for (const rawLine of content.split("\n")) {
|
|
175
|
+
assertNotAborted(request.signal);
|
|
176
|
+
const line = rawLine.trim();
|
|
177
|
+
if (line.length === 0)
|
|
178
|
+
continue;
|
|
179
|
+
try {
|
|
180
|
+
const parsed = JSON.parse(line);
|
|
181
|
+
if (!isRecord(parsed)) {
|
|
182
|
+
throw new DomainError("invalid-data", "DeepSeek session line is not an object");
|
|
183
|
+
}
|
|
184
|
+
entries.push(parsed);
|
|
185
|
+
}
|
|
186
|
+
catch (error) {
|
|
187
|
+
addError(state, error, "invalid-data", fallbackID);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
const headerIndex = entries.findIndex((entry) => entry.type === "session");
|
|
191
|
+
const header = headerIndex === -1 ? undefined : entries[headerIndex];
|
|
192
|
+
if (header === undefined) {
|
|
193
|
+
addError(state, new DomainError("invalid-data", "DeepSeek session has no session header"), "invalid-data", fallbackID);
|
|
194
|
+
}
|
|
195
|
+
const sessionID = sanitizeRecordID(typeof header?.id === "string" && header.id.trim().length > 0 ? header.id : fallbackID, fallbackID);
|
|
196
|
+
const project = typeof header?.cwd === "string" && header.cwd.trim().length > 0 ? header.cwd.trim() : undefined;
|
|
197
|
+
// Seeded sessions (subagents/forks) log the inherited prefix followed by a
|
|
198
|
+
// tagged end-seed marker; only events after the last marker are new work.
|
|
199
|
+
let startIndex = 0;
|
|
200
|
+
if (header?.isSeeded === true) {
|
|
201
|
+
const markerIndex = entries.reduce((found, entry, index) => (entry.type === "session/end-seed" ? index : found), -1);
|
|
202
|
+
if (markerIndex >= 0)
|
|
203
|
+
startIndex = markerIndex + 1;
|
|
204
|
+
}
|
|
205
|
+
let current = { provider: "", model: "" };
|
|
206
|
+
for (let index = 0; index < entries.length; index += 1) {
|
|
207
|
+
assertNotAborted(request.signal);
|
|
208
|
+
const entry = entries[index];
|
|
209
|
+
const data = isRecord(entry.data) ? entry.data : undefined;
|
|
210
|
+
if (data === undefined)
|
|
211
|
+
continue;
|
|
212
|
+
// Model routing is inherited state: fold it even for the inherited
|
|
213
|
+
// prefix so the first child-owned call can price correctly.
|
|
214
|
+
if (entry.type === "request/header") {
|
|
215
|
+
const route = isRecord(data.header) ? data.header.config : undefined;
|
|
216
|
+
if (isRecord(route)) {
|
|
217
|
+
const provider = typeof route.provider === "string" ? route.provider : current.provider;
|
|
218
|
+
const model = typeof route.model === "string" ? route.model : current.model;
|
|
219
|
+
current = { provider, model };
|
|
220
|
+
}
|
|
221
|
+
continue;
|
|
222
|
+
}
|
|
223
|
+
if (entry.type === "request/context") {
|
|
224
|
+
const provider = typeof data.provider === "string" ? data.provider : current.provider;
|
|
225
|
+
const model = typeof data.model === "string" ? data.model : current.model;
|
|
226
|
+
current = { provider, model };
|
|
227
|
+
continue;
|
|
228
|
+
}
|
|
229
|
+
if (index < startIndex || entry.type === "session/end-seed")
|
|
230
|
+
continue;
|
|
231
|
+
const createdAt = eventTime(entry, header?.createdAt);
|
|
232
|
+
if (createdAt === undefined)
|
|
233
|
+
continue;
|
|
234
|
+
const suffix = typeof entry.seq === "number" ? String(entry.seq) : String(index);
|
|
235
|
+
if (entry.type === "assistant/message") {
|
|
236
|
+
const usage = isTokenUsage(data.usage) ? data.usage : streamUsage(data.stream);
|
|
237
|
+
if (usage === undefined)
|
|
238
|
+
continue;
|
|
239
|
+
const messageSource = messageModel(data.message);
|
|
240
|
+
addUsageRecord(state, request, sessionID, `assistant-${suffix}`, createdAt, modelName(messageSource?.provider ?? current.provider, messageSource?.model ?? current.model), usage, project);
|
|
241
|
+
continue;
|
|
242
|
+
}
|
|
243
|
+
if (entry.type === "assistant/attempt") {
|
|
244
|
+
const usage = streamUsage(data.stream);
|
|
245
|
+
if (usage === undefined)
|
|
246
|
+
continue;
|
|
247
|
+
addUsageRecord(state, request, sessionID, `attempt-${suffix}`, createdAt, modelName(current.provider, current.model), usage, project);
|
|
248
|
+
continue;
|
|
249
|
+
}
|
|
250
|
+
if (entry.type === "compaction/summary") {
|
|
251
|
+
if (!isTokenUsage(data.usage))
|
|
252
|
+
continue;
|
|
253
|
+
addUsageRecord(state, request, sessionID, `compaction-${suffix}`, createdAt, modelName(typeof data.provider === "string" ? data.provider : current.provider, typeof data.model === "string" ? data.model : current.model), data.usage, project);
|
|
254
|
+
continue;
|
|
255
|
+
}
|
|
256
|
+
// Future/plugin events may carry the same TokenUsage shape. Count them
|
|
257
|
+
// under their own id so a new usage-bearing event type is not lost.
|
|
258
|
+
if (isTokenUsage(data.usage)) {
|
|
259
|
+
addUsageRecord(state, request, sessionID, `${entry.type ?? "event"}-${suffix}`, createdAt, modelName(current.provider, current.model), data.usage, project);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
for (const record of state.records)
|
|
263
|
+
reducer.upsert(record);
|
|
264
|
+
errors.push(...state.errors);
|
|
265
|
+
if (state.fileHasError)
|
|
266
|
+
sessionsSkipped += 1;
|
|
267
|
+
else
|
|
268
|
+
sessionsScanned += 1;
|
|
269
|
+
}
|
|
270
|
+
assertNotAborted(request.signal);
|
|
271
|
+
return buildRecordResult({
|
|
272
|
+
capturedAt: request.capturedAt,
|
|
273
|
+
windows: request.windows,
|
|
274
|
+
source: "deepseek",
|
|
275
|
+
records: reducer.records(),
|
|
276
|
+
sessionsDiscovered: files.length,
|
|
277
|
+
sessionsScanned,
|
|
278
|
+
sessionsSkipped,
|
|
279
|
+
pagesRead: files.length,
|
|
280
|
+
errors,
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
//# sourceMappingURL=scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../../src/deepseek/scanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/** Internal DeepSeek Harness (dsh) session JSONL types. */
|
|
2
|
+
export interface DeepSeekTokenUsage {
|
|
3
|
+
readonly inputTokens: number;
|
|
4
|
+
readonly outputTokens: number;
|
|
5
|
+
readonly totalTokens?: number;
|
|
6
|
+
readonly cacheReadTokens?: number;
|
|
7
|
+
readonly cacheWriteTokens?: number;
|
|
8
|
+
readonly reasoningTokens?: number;
|
|
9
|
+
}
|
|
10
|
+
export interface DeepSeekStreamChunk {
|
|
11
|
+
readonly type?: string;
|
|
12
|
+
readonly usage?: DeepSeekTokenUsage;
|
|
13
|
+
}
|
|
14
|
+
export interface DeepSeekStreamRecord {
|
|
15
|
+
readonly type?: string;
|
|
16
|
+
readonly chunk?: DeepSeekStreamChunk;
|
|
17
|
+
}
|
|
18
|
+
export interface DeepSeekSessionHeader {
|
|
19
|
+
readonly type: "session";
|
|
20
|
+
readonly version?: number;
|
|
21
|
+
readonly id?: string;
|
|
22
|
+
readonly createdAt?: number;
|
|
23
|
+
readonly cwd?: string;
|
|
24
|
+
readonly parentSession?: string;
|
|
25
|
+
readonly isSeeded?: boolean;
|
|
26
|
+
readonly origin?: string;
|
|
27
|
+
readonly delegationDepth?: number;
|
|
28
|
+
}
|
|
29
|
+
export interface DeepSeekEntry {
|
|
30
|
+
readonly type?: string;
|
|
31
|
+
readonly seq?: number;
|
|
32
|
+
readonly time?: number;
|
|
33
|
+
readonly data?: Record<string, unknown>;
|
|
34
|
+
}
|
|
35
|
+
export interface DeepSeekModelCall {
|
|
36
|
+
readonly provider: string;
|
|
37
|
+
readonly model: string;
|
|
38
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/deepseek/types.ts"],"names":[],"mappings":"AAAA,2DAA2D"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare function isZstdDecompressionAvailable(): boolean;
|
|
2
|
+
/**
|
|
3
|
+
* Node's Zstandard API decodes exactly one frame. DeepSeek Harness writes one
|
|
4
|
+
* frame per append batch, so a log is a concatenation and must be split before
|
|
5
|
+
* decoding. Frame boundaries are derived from the zstd frame/block headers;
|
|
6
|
+
* skippable frames are ignored.
|
|
7
|
+
*/
|
|
8
|
+
export declare function splitZstdFrames(buffer: Buffer): Buffer[];
|
|
9
|
+
export declare function decompressZstdBuffer(buffer: Buffer): Buffer;
|
|
10
|
+
/** Decompress a concatenated-frame zstd log, falling back to the zstd CLI on older Node. */
|
|
11
|
+
export declare function readZstdFile(path: string, buffer: Buffer): Buffer;
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
import * as zlib from "node:zlib";
|
|
3
|
+
const ZSTD_MAGIC = 0xfd2fb528;
|
|
4
|
+
const SKIPPABLE_MAGIC_MASK = 0xfffffff0;
|
|
5
|
+
const SKIPPABLE_MAGIC = 0x184d2a50;
|
|
6
|
+
const MAX_DECOMPRESSED_BYTES = 512 * 1024 * 1024;
|
|
7
|
+
function nodeZstdDecompress() {
|
|
8
|
+
const candidate = zlib.zstdDecompressSync;
|
|
9
|
+
return typeof candidate === "function" ? candidate : undefined;
|
|
10
|
+
}
|
|
11
|
+
export function isZstdDecompressionAvailable() {
|
|
12
|
+
return nodeZstdDecompress() !== undefined || zstdCliAvailable();
|
|
13
|
+
}
|
|
14
|
+
let cachedCliAvailability;
|
|
15
|
+
function zstdCliAvailable() {
|
|
16
|
+
if (cachedCliAvailability !== undefined)
|
|
17
|
+
return cachedCliAvailability;
|
|
18
|
+
try {
|
|
19
|
+
const result = spawnSync("zstd", ["--version"], { stdio: "ignore" });
|
|
20
|
+
cachedCliAvailability = result.status === 0;
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
cachedCliAvailability = false;
|
|
24
|
+
}
|
|
25
|
+
return cachedCliAvailability;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Node's Zstandard API decodes exactly one frame. DeepSeek Harness writes one
|
|
29
|
+
* frame per append batch, so a log is a concatenation and must be split before
|
|
30
|
+
* decoding. Frame boundaries are derived from the zstd frame/block headers;
|
|
31
|
+
* skippable frames are ignored.
|
|
32
|
+
*/
|
|
33
|
+
export function splitZstdFrames(buffer) {
|
|
34
|
+
const frames = [];
|
|
35
|
+
let offset = 0;
|
|
36
|
+
const need = (count) => {
|
|
37
|
+
if (offset + count > buffer.length) {
|
|
38
|
+
throw new Error("corrupt Zstandard log: truncated frame");
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
while (offset < buffer.length) {
|
|
42
|
+
need(4);
|
|
43
|
+
const magic = buffer.readUInt32LE(offset);
|
|
44
|
+
if ((magic & SKIPPABLE_MAGIC_MASK) === SKIPPABLE_MAGIC) {
|
|
45
|
+
need(8);
|
|
46
|
+
const size = buffer.readUInt32LE(offset + 4);
|
|
47
|
+
offset += 8 + size;
|
|
48
|
+
if (offset > buffer.length) {
|
|
49
|
+
throw new Error("corrupt Zstandard log: truncated skippable frame");
|
|
50
|
+
}
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
if (magic !== ZSTD_MAGIC) {
|
|
54
|
+
throw new Error("corrupt Zstandard log: bad frame magic");
|
|
55
|
+
}
|
|
56
|
+
const start = offset;
|
|
57
|
+
offset += 4;
|
|
58
|
+
need(1);
|
|
59
|
+
const descriptor = buffer[offset];
|
|
60
|
+
offset += 1;
|
|
61
|
+
const contentSizeFlag = descriptor >> 6;
|
|
62
|
+
const singleSegment = ((descriptor >> 5) & 1) === 1;
|
|
63
|
+
const checksum = ((descriptor >> 2) & 1) === 1;
|
|
64
|
+
const dictionaryFlag = descriptor & 3;
|
|
65
|
+
if (!singleSegment) {
|
|
66
|
+
need(1);
|
|
67
|
+
offset += 1; // window descriptor
|
|
68
|
+
}
|
|
69
|
+
const dictionarySize = [0, 1, 2, 4][dictionaryFlag];
|
|
70
|
+
need(dictionarySize);
|
|
71
|
+
offset += dictionarySize;
|
|
72
|
+
const contentSizeBytes = contentSizeFlag === 0 ? (singleSegment ? 1 : 0) : contentSizeFlag === 1 ? 2 : contentSizeFlag === 2 ? 4 : 8;
|
|
73
|
+
need(contentSizeBytes);
|
|
74
|
+
offset += contentSizeBytes;
|
|
75
|
+
for (;;) {
|
|
76
|
+
need(3);
|
|
77
|
+
const blockHeader = buffer.readUIntLE(offset, 3);
|
|
78
|
+
offset += 3;
|
|
79
|
+
const lastBlock = (blockHeader & 1) === 1;
|
|
80
|
+
const blockType = (blockHeader >> 1) & 3;
|
|
81
|
+
const blockSize = blockHeader >>> 3;
|
|
82
|
+
if (blockType === 0 || blockType === 2) {
|
|
83
|
+
need(blockSize);
|
|
84
|
+
offset += blockSize;
|
|
85
|
+
}
|
|
86
|
+
else if (blockType === 1) {
|
|
87
|
+
need(1);
|
|
88
|
+
offset += 1;
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
throw new Error("corrupt Zstandard log: reserved block type");
|
|
92
|
+
}
|
|
93
|
+
if (lastBlock)
|
|
94
|
+
break;
|
|
95
|
+
}
|
|
96
|
+
if (checksum) {
|
|
97
|
+
need(4);
|
|
98
|
+
offset += 4;
|
|
99
|
+
}
|
|
100
|
+
frames.push(buffer.subarray(start, offset));
|
|
101
|
+
}
|
|
102
|
+
return frames;
|
|
103
|
+
}
|
|
104
|
+
export function decompressZstdBuffer(buffer) {
|
|
105
|
+
const decompress = nodeZstdDecompress();
|
|
106
|
+
if (decompress === undefined) {
|
|
107
|
+
throw new Error("Node Zstandard support is unavailable");
|
|
108
|
+
}
|
|
109
|
+
const frames = splitZstdFrames(buffer);
|
|
110
|
+
const chunks = [];
|
|
111
|
+
let total = 0;
|
|
112
|
+
for (const frame of frames) {
|
|
113
|
+
const chunk = decompress(frame);
|
|
114
|
+
total += chunk.length;
|
|
115
|
+
if (total > MAX_DECOMPRESSED_BYTES) {
|
|
116
|
+
throw new Error(`decompressed session log exceeds ${MAX_DECOMPRESSED_BYTES} bytes`);
|
|
117
|
+
}
|
|
118
|
+
chunks.push(chunk);
|
|
119
|
+
}
|
|
120
|
+
return Buffer.concat(chunks, total);
|
|
121
|
+
}
|
|
122
|
+
/** Decompress a concatenated-frame zstd log, falling back to the zstd CLI on older Node. */
|
|
123
|
+
export function readZstdFile(path, buffer) {
|
|
124
|
+
if (nodeZstdDecompress() !== undefined) {
|
|
125
|
+
return decompressZstdBuffer(buffer);
|
|
126
|
+
}
|
|
127
|
+
const result = spawnSync("zstd", ["-dc", "--", path], {
|
|
128
|
+
maxBuffer: MAX_DECOMPRESSED_BYTES,
|
|
129
|
+
});
|
|
130
|
+
if (result.error !== undefined)
|
|
131
|
+
throw result.error;
|
|
132
|
+
if (result.status !== 0) {
|
|
133
|
+
const message = result.stderr?.toString("utf8").trim();
|
|
134
|
+
throw new Error(message && message.length > 0 ? message : "zstd CLI decompression failed");
|
|
135
|
+
}
|
|
136
|
+
return result.stdout;
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=zstd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zstd.js","sourceRoot":"","sources":["../../../src/deepseek/zstd.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,8 +2,8 @@ import type { CollectionError } from "./errors.js";
|
|
|
2
2
|
import type { TokenComponentsInput, UsageTotals } from "./tokens.js";
|
|
3
3
|
import type { UsageRecord, UsageRecordCompleteness } from "./records.js";
|
|
4
4
|
import type { UsageBucket, UsageWindow, UsageWindowKind } from "./windows.js";
|
|
5
|
-
export type CollectionSource = "stats" | "message-scan" | "codex" | "antigravity" | "unified";
|
|
6
|
-
export type ProviderKind = "opencode" | "codex" | "antigravity";
|
|
5
|
+
export type CollectionSource = "stats" | "message-scan" | "codex" | "antigravity" | "pi" | "deepseek" | "unified";
|
|
6
|
+
export type ProviderKind = "opencode" | "codex" | "antigravity" | "pi" | "deepseek";
|
|
7
7
|
/**
|
|
8
8
|
* Coverage describes what a collection actually observed. `complete` means
|
|
9
9
|
* traversal finished without a known gap; it does not turn provisional usage
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contracts.js","sourceRoot":"","sources":["../../../src/domain/contracts.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"contracts.js","sourceRoot":"","sources":["../../../src/domain/contracts.ts"],"names":[],"mappings":"AAoJA,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAU,CAAC"}
|
|
@@ -2,7 +2,7 @@ import { type UsageWindow } from "./windows.js";
|
|
|
2
2
|
import { type TokenComponents, type UsageTotals } from "./tokens.js";
|
|
3
3
|
import type { ProviderKind } from "./contracts.js";
|
|
4
4
|
export type UsageRecordCompleteness = "final" | "provisional";
|
|
5
|
-
export declare const PROVIDER_KINDS: readonly ["opencode", "codex", "antigravity"];
|
|
5
|
+
export declare const PROVIDER_KINDS: readonly ["opencode", "codex", "antigravity", "pi", "deepseek"];
|
|
6
6
|
export declare function isProviderKind(value: unknown): value is ProviderKind;
|
|
7
7
|
export interface UsageRecordInput {
|
|
8
8
|
readonly sessionID: string;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { DomainError } from "./errors.js";
|
|
2
2
|
import { containsInstant } from "./windows.js";
|
|
3
3
|
import { parseTokenComponents, recorded_total, toUsageTotals, } from "./tokens.js";
|
|
4
|
-
export const PROVIDER_KINDS = ["opencode", "codex", "antigravity"];
|
|
4
|
+
export const PROVIDER_KINDS = ["opencode", "codex", "antigravity", "pi", "deepseek"];
|
|
5
5
|
export function isProviderKind(value) {
|
|
6
6
|
return (typeof value === "string" &&
|
|
7
7
|
PROVIDER_KINDS.includes(value));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"records.js","sourceRoot":"","sources":["../../../src/domain/records.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAoB,MAAM,cAAc,CAAC;AACjE,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,aAAa,GAGd,MAAM,aAAa,CAAC;AAKrB,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,aAAa,CAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"records.js","sourceRoot":"","sources":["../../../src/domain/records.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type OpenCodeTransport, type UsageWindow } from "../domain/index.js";
|
|
2
2
|
import { type ConnectionOptions, type OpenCodeConnection } from "./client.js";
|
|
3
|
-
export type DoctorCheckName = "executable" | "service" | "health" | "stats-range" | "opencode" | "codex" | "antigravity";
|
|
3
|
+
export type DoctorCheckName = "executable" | "service" | "health" | "stats-range" | "opencode" | "codex" | "antigravity" | "pi" | "deepseek";
|
|
4
4
|
export interface DoctorCheck {
|
|
5
5
|
readonly name: DoctorCheckName;
|
|
6
6
|
readonly ok: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/opencode/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,GAGZ,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,eAAe,EACf,sBAAsB,GAGvB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAA4B,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/opencode/doctor.ts"],"names":[],"mappings":"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"}
|
package/dist/src/output/table.js
CHANGED
|
@@ -84,7 +84,7 @@ export function renderTable(input) {
|
|
|
84
84
|
...sortedProjects,
|
|
85
85
|
]);
|
|
86
86
|
const lines = [
|
|
87
|
-
"
|
|
87
|
+
"Coding Agent Token Usage",
|
|
88
88
|
`Source: ${safeIdentifier(displaySource)} Version: ${safeIdentifier(snapshot.version)}`,
|
|
89
89
|
`Status: ${status} Coverage: ${formatCoverage(snapshot.coverage, snapshot.stale)}`,
|
|
90
90
|
"",
|