oc2token 0.1.24 → 0.1.26

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.
Files changed (64) hide show
  1. package/README.md +23 -14
  2. package/dist/src/application.d.ts +15 -1
  3. package/dist/src/application.js +73 -7
  4. package/dist/src/application.js.map +1 -1
  5. package/dist/src/cache/schema.js +3 -3
  6. package/dist/src/cache/schema.js.map +1 -1
  7. package/dist/src/cli.js +33 -4
  8. package/dist/src/cli.js.map +1 -1
  9. package/dist/src/dashboard/render/ansi.d.ts +2 -0
  10. package/dist/src/dashboard/render/ansi.js +6 -0
  11. package/dist/src/dashboard/render/ansi.js.map +1 -1
  12. package/dist/src/dashboard/render/dashboard.js +38 -24
  13. package/dist/src/dashboard/render/dashboard.js.map +1 -1
  14. package/dist/src/dashboard/render/types.js +8 -4
  15. package/dist/src/dashboard/render/types.js.map +1 -1
  16. package/dist/src/dashboard/settings/index.d.ts +7 -7
  17. package/dist/src/dashboard/settings/index.js +25 -8
  18. package/dist/src/dashboard/settings/index.js.map +1 -1
  19. package/dist/src/deepseek/discovery.d.ts +21 -0
  20. package/dist/src/deepseek/discovery.js +83 -0
  21. package/dist/src/deepseek/discovery.js.map +1 -0
  22. package/dist/src/deepseek/doctor.d.ts +8 -0
  23. package/dist/src/deepseek/doctor.js +103 -0
  24. package/dist/src/deepseek/doctor.js.map +1 -0
  25. package/dist/src/deepseek/index.d.ts +4 -0
  26. package/dist/src/deepseek/index.js +4 -0
  27. package/dist/src/deepseek/index.js.map +1 -0
  28. package/dist/src/deepseek/scanner.d.ts +9 -0
  29. package/dist/src/deepseek/scanner.js +283 -0
  30. package/dist/src/deepseek/scanner.js.map +1 -0
  31. package/dist/src/deepseek/types.d.ts +38 -0
  32. package/dist/src/deepseek/types.js +3 -0
  33. package/dist/src/deepseek/types.js.map +1 -0
  34. package/dist/src/deepseek/zstd.d.ts +11 -0
  35. package/dist/src/deepseek/zstd.js +138 -0
  36. package/dist/src/deepseek/zstd.js.map +1 -0
  37. package/dist/src/domain/contracts.d.ts +2 -2
  38. package/dist/src/domain/contracts.js.map +1 -1
  39. package/dist/src/domain/records.d.ts +1 -1
  40. package/dist/src/domain/records.js +1 -1
  41. package/dist/src/domain/records.js.map +1 -1
  42. package/dist/src/opencode/doctor.d.ts +1 -1
  43. package/dist/src/opencode/doctor.js.map +1 -1
  44. package/dist/src/output/table.js +1 -1
  45. package/dist/src/output/table.js.map +1 -1
  46. package/dist/src/pi/discovery.d.ts +12 -0
  47. package/dist/src/pi/discovery.js +86 -0
  48. package/dist/src/pi/discovery.js.map +1 -0
  49. package/dist/src/pi/doctor.d.ts +8 -0
  50. package/dist/src/pi/doctor.js +55 -0
  51. package/dist/src/pi/doctor.js.map +1 -0
  52. package/dist/src/pi/index.d.ts +3 -0
  53. package/dist/src/pi/index.js +3 -0
  54. package/dist/src/pi/index.js.map +1 -0
  55. package/dist/src/pi/scanner.d.ts +9 -0
  56. package/dist/src/pi/scanner.js +255 -0
  57. package/dist/src/pi/scanner.js.map +1 -0
  58. package/dist/src/pi/types.d.ts +45 -0
  59. package/dist/src/pi/types.js +3 -0
  60. package/dist/src/pi/types.js.map +1 -0
  61. package/dist/src/usage/record-result.d.ts +19 -0
  62. package/dist/src/usage/record-result.js +91 -0
  63. package/dist/src/usage/record-result.js.map +1 -0
  64. package/package.json +7 -2
@@ -0,0 +1,21 @@
1
+ /** `${DSH_HOME:-~/.dsh}/sessions`. */
2
+ export declare function defaultDeepSeekSessionsDirectory(): string;
3
+ export interface DeepSeekSessionFile {
4
+ readonly path: string;
5
+ readonly version: number;
6
+ readonly compressed: boolean;
7
+ }
8
+ /**
9
+ * Parse a canonical generation filename: `session.jsonl`, `session.v4.jsonl`,
10
+ * optionally with a `.zstd` suffix. Noncanonical/temporary names are ignored.
11
+ */
12
+ export declare function parseDeepSeekSessionFilename(name: string): {
13
+ version: number;
14
+ compressed: boolean;
15
+ } | undefined;
16
+ /**
17
+ * Walk `${DSH_HOME:-~/.dsh}/sessions/<workspace-slug>/<session-id>/` and select
18
+ * the newest canonical generation per session directory. Older generations are
19
+ * retained by dsh beside the current one and must not be double-counted.
20
+ */
21
+ export declare function discoverDeepSeekSessionFiles(root?: string): DeepSeekSessionFile[];
@@ -0,0 +1,83 @@
1
+ import { readdirSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { join } from "node:path";
4
+ const MAX_SESSION_FILES = 50_000;
5
+ const MAX_ENTRIES_PER_DIR = 10_000;
6
+ /** `${DSH_HOME:-~/.dsh}/sessions`. */
7
+ export function defaultDeepSeekSessionsDirectory() {
8
+ const home = process.env.DSH_HOME;
9
+ const base = typeof home === "string" && home.trim().length > 0 ? home : join(homedir(), ".dsh");
10
+ return join(base, "sessions");
11
+ }
12
+ function readDirEntries(directory) {
13
+ let entries;
14
+ try {
15
+ entries = readdirSync(directory, { withFileTypes: true });
16
+ }
17
+ catch {
18
+ return [];
19
+ }
20
+ const names = [];
21
+ for (const entry of entries) {
22
+ if (names.length >= MAX_ENTRIES_PER_DIR)
23
+ break;
24
+ if (entry.isSymbolicLink())
25
+ continue;
26
+ names.push(entry.name);
27
+ }
28
+ return names;
29
+ }
30
+ /**
31
+ * Parse a canonical generation filename: `session.jsonl`, `session.v4.jsonl`,
32
+ * optionally with a `.zstd` suffix. Noncanonical/temporary names are ignored.
33
+ */
34
+ export function parseDeepSeekSessionFilename(name) {
35
+ const match = /^session(?:\.v(\d+))?\.jsonl(\.zstd)?$/.exec(name);
36
+ if (match === null)
37
+ return undefined;
38
+ const rawVersion = match[1];
39
+ const version = rawVersion === undefined ? 0 : Number(rawVersion);
40
+ if (!Number.isSafeInteger(version) || version < 0)
41
+ return undefined;
42
+ return { version, compressed: match[2] !== undefined };
43
+ }
44
+ /**
45
+ * Walk `${DSH_HOME:-~/.dsh}/sessions/<workspace-slug>/<session-id>/` and select
46
+ * the newest canonical generation per session directory. Older generations are
47
+ * retained by dsh beside the current one and must not be double-counted.
48
+ */
49
+ export function discoverDeepSeekSessionFiles(root) {
50
+ const sessionsRoot = root ?? defaultDeepSeekSessionsDirectory();
51
+ const selected = [];
52
+ for (const projectEntry of readDirEntries(sessionsRoot)) {
53
+ if (selected.length >= MAX_SESSION_FILES)
54
+ break;
55
+ const projectDir = join(sessionsRoot, projectEntry);
56
+ for (const sessionEntry of readDirEntries(projectDir)) {
57
+ if (selected.length >= MAX_SESSION_FILES)
58
+ break;
59
+ const sessionDir = join(projectDir, sessionEntry);
60
+ let best;
61
+ for (const fileEntry of readDirEntries(sessionDir)) {
62
+ const parsed = parseDeepSeekSessionFilename(fileEntry);
63
+ if (parsed === undefined)
64
+ continue;
65
+ const candidate = {
66
+ path: join(sessionDir, fileEntry),
67
+ version: parsed.version,
68
+ compressed: parsed.compressed,
69
+ };
70
+ if (best === undefined ||
71
+ candidate.version > best.version ||
72
+ // Same version in both encodings: raw is cheaper to read.
73
+ (candidate.version === best.version && best.compressed && !candidate.compressed)) {
74
+ best = candidate;
75
+ }
76
+ }
77
+ if (best !== undefined)
78
+ selected.push(best);
79
+ }
80
+ }
81
+ return selected.sort((left, right) => left.path.localeCompare(right.path));
82
+ }
83
+ //# sourceMappingURL=discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../../src/deepseek/discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export interface DeepSeekDoctorCheck {
2
+ readonly name: "deepseek";
3
+ readonly ok: boolean;
4
+ /** No DeepSeek Harness store exists; default `doctor` treats this as optional. */
5
+ readonly missing?: boolean;
6
+ readonly message: string;
7
+ }
8
+ export declare function runDeepSeekDoctor(): Promise<DeepSeekDoctorCheck>;
@@ -0,0 +1,103 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { discoverDeepSeekSessionFiles } from "./discovery.js";
3
+ import { isZstdDecompressionAvailable, readZstdFile } from "./zstd.js";
4
+ function usageInEntry(entry) {
5
+ const data = entry.data;
6
+ if (data === undefined || typeof data !== "object")
7
+ return false;
8
+ if (data.usage !== undefined)
9
+ return true;
10
+ if (entry.type !== "assistant/attempt")
11
+ return false;
12
+ const stream = data.stream;
13
+ if (!Array.isArray(stream))
14
+ return false;
15
+ return stream.some((record) => {
16
+ if (typeof record !== "object" || record === null)
17
+ return false;
18
+ const chunk = record.chunk;
19
+ return typeof chunk === "object" && chunk !== null && chunk.type === "usage";
20
+ });
21
+ }
22
+ export async function runDeepSeekDoctor() {
23
+ let files;
24
+ try {
25
+ files = discoverDeepSeekSessionFiles();
26
+ }
27
+ catch (error) {
28
+ const message = error instanceof Error ? error.message : String(error);
29
+ return { name: "deepseek", ok: false, message: `DeepSeek discovery failed: ${message}` };
30
+ }
31
+ if (files.length === 0) {
32
+ return {
33
+ name: "deepseek",
34
+ ok: false,
35
+ missing: true,
36
+ message: "No DeepSeek Harness session files found",
37
+ };
38
+ }
39
+ const file = files[0];
40
+ if (file.compressed && !isZstdDecompressionAvailable()) {
41
+ return {
42
+ name: "deepseek",
43
+ ok: false,
44
+ message: `Found ${files.length} DeepSeek session file(s), but zstd decompression is unavailable (need Node >=22.15 or the zstd CLI)`,
45
+ };
46
+ }
47
+ let content;
48
+ try {
49
+ const buffer = readFileSync(file.path);
50
+ content = file.compressed ? readZstdFile(file.path, buffer).toString("utf8") : buffer.toString("utf8");
51
+ }
52
+ catch (error) {
53
+ const message = error instanceof Error ? error.message : String(error);
54
+ return {
55
+ name: "deepseek",
56
+ ok: false,
57
+ message: `Found ${files.length} DeepSeek session file(s) but read failed: ${message}`,
58
+ };
59
+ }
60
+ let parsed = 0;
61
+ let hasUsage = false;
62
+ let hasHeader = false;
63
+ try {
64
+ for (const raw of content.split("\n")) {
65
+ const line = raw.trim();
66
+ if (line.length === 0)
67
+ continue;
68
+ const entry = JSON.parse(line);
69
+ parsed += 1;
70
+ if (entry.type === "session")
71
+ hasHeader = true;
72
+ if (usageInEntry(entry))
73
+ hasUsage = true;
74
+ }
75
+ }
76
+ catch {
77
+ return {
78
+ name: "deepseek",
79
+ ok: false,
80
+ message: `Found ${files.length} DeepSeek session file(s) but JSON parse failed in ${file.path}`,
81
+ };
82
+ }
83
+ if (parsed === 0) {
84
+ return {
85
+ name: "deepseek",
86
+ ok: false,
87
+ message: `Found ${files.length} DeepSeek session file(s) but first file is empty`,
88
+ };
89
+ }
90
+ if (!hasHeader) {
91
+ return {
92
+ name: "deepseek",
93
+ ok: false,
94
+ message: `Found ${files.length} DeepSeek session file(s) but the first file has no session header`,
95
+ };
96
+ }
97
+ return {
98
+ name: "deepseek",
99
+ ok: true,
100
+ message: `Found ${files.length} DeepSeek session file(s); ${hasUsage ? "usage found" : "JSON parse OK (no usage entries yet)"}`,
101
+ };
102
+ }
103
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/deepseek/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { discoverDeepSeekSessionFiles, defaultDeepSeekSessionsDirectory, parseDeepSeekSessionFilename, } from "./discovery.js";
2
+ export { collectDeepSeek } from "./scanner.js";
3
+ export { isZstdDecompressionAvailable, splitZstdFrames } from "./zstd.js";
4
+ export type * from "./types.js";
@@ -0,0 +1,4 @@
1
+ export { discoverDeepSeekSessionFiles, defaultDeepSeekSessionsDirectory, parseDeepSeekSessionFilename, } from "./discovery.js";
2
+ export { collectDeepSeek } from "./scanner.js";
3
+ export { isZstdDecompressionAvailable, splitZstdFrames } from "./zstd.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/deepseek/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,4BAA4B,EAC5B,gCAAgC,EAChC,4BAA4B,GAC7B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,4BAA4B,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { type CollectionRequest, type CollectionResult } from "../domain/index.js";
2
+ /**
3
+ * Native DeepSeek Harness scanner. Reads `${DSH_HOME:-~/.dsh}/sessions` and
4
+ * selects the newest `session[.vN].jsonl[.zstd]` generation in each session
5
+ * directory. Token accounting lives on `assistant/message` events (top-level
6
+ * usage, falling back to the embedded stream), failed `assistant/attempt`
7
+ * streams, and `compaction/summary` calls.
8
+ */
9
+ export declare function collectDeepSeek(request: CollectionRequest, root?: string): Promise<CollectionResult>;
@@ -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,3 @@
1
+ /** Internal DeepSeek Harness (dsh) session JSONL types. */
2
+ export {};
3
+ //# sourceMappingURL=types.js.map
@@ -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;