oc2token 0.1.23 → 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 +24 -15
- 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 +54 -16
- 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.d.ts +1 -1
- package/dist/src/dashboard/render/dashboard.js +21 -14
- package/dist/src/dashboard/render/dashboard.js.map +1 -1
- package/dist/src/dashboard/render/types.d.ts +8 -0
- package/dist/src/dashboard/render/types.js +17 -4
- package/dist/src/dashboard/render/types.js.map +1 -1
- package/dist/src/dashboard/settings/index.d.ts +10 -8
- package/dist/src/dashboard/settings/index.js +42 -14
- 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
|
@@ -2,15 +2,28 @@ import { promises as fs } from "node:fs";
|
|
|
2
2
|
import { join } from "node:path";
|
|
3
3
|
import { defaultCacheDirectory } from "../../application.js";
|
|
4
4
|
import { isProviderKind } from "../../domain/records.js";
|
|
5
|
-
import { DEFAULT_VISIBLE_CARDS, normalizeVisibleCards, } from "../render/types.js";
|
|
6
|
-
export const SETTINGS_MIN_REFRESH_SECONDS =
|
|
7
|
-
export const SETTINGS_MAX_REFRESH_SECONDS =
|
|
5
|
+
import { DEFAULT_VISIBLE_CARDS, DEFAULT_WIDE_CARDS, normalizeVisibleCards, } from "../render/types.js";
|
|
6
|
+
export const SETTINGS_MIN_REFRESH_SECONDS = 15;
|
|
7
|
+
export const SETTINGS_MAX_REFRESH_SECONDS = 2 * 60 * 60; // 7200
|
|
8
8
|
export const SETTINGS_DEFAULT_REFRESH_SECONDS = 300;
|
|
9
|
-
export const ALL_PROVIDER_KINDS = [
|
|
9
|
+
export const ALL_PROVIDER_KINDS = [
|
|
10
|
+
"opencode",
|
|
11
|
+
"codex",
|
|
12
|
+
"antigravity",
|
|
13
|
+
"pi",
|
|
14
|
+
"deepseek",
|
|
15
|
+
];
|
|
16
|
+
/**
|
|
17
|
+
* The provider set before Pi and DeepSeek Harness support. A persisted
|
|
18
|
+
* `enabledProviders` containing exactly this set was the old "all" default, so
|
|
19
|
+
* it migrates to the new full set instead of silently disabling the new
|
|
20
|
+
* providers after an upgrade.
|
|
21
|
+
*/
|
|
22
|
+
const LEGACY_ALL_PROVIDER_KINDS = ["opencode", "codex", "antigravity"];
|
|
10
23
|
/**
|
|
11
24
|
* Settings focus rows, numbered in the order the panel *renders* them:
|
|
12
|
-
* providers (0-
|
|
13
|
-
* -> refresh interval (
|
|
25
|
+
* providers (0-4) -> tables (5-6) -> card slots (7-12) -> card count (13)
|
|
26
|
+
* -> refresh interval (14).
|
|
14
27
|
*
|
|
15
28
|
* All six slot rows always render; slots at or past the visible count are
|
|
16
29
|
* dimmed placeholders so the indices below never shift when toggling
|
|
@@ -21,11 +34,11 @@ export const ALL_PROVIDER_KINDS = ["opencode", "codex", "antigravity"];
|
|
|
21
34
|
*/
|
|
22
35
|
export const SETTINGS_ROWS = {
|
|
23
36
|
providers: 0,
|
|
24
|
-
tables:
|
|
25
|
-
cards:
|
|
26
|
-
cardCount:
|
|
27
|
-
refresh:
|
|
28
|
-
count:
|
|
37
|
+
tables: 5,
|
|
38
|
+
cards: 7,
|
|
39
|
+
cardCount: 13,
|
|
40
|
+
refresh: 14,
|
|
41
|
+
count: 15,
|
|
29
42
|
};
|
|
30
43
|
export function clampRefreshIntervalSeconds(value) {
|
|
31
44
|
if (!Number.isFinite(value))
|
|
@@ -89,6 +102,10 @@ export function normalizeEnabledProviders(value) {
|
|
|
89
102
|
if (!Array.isArray(value))
|
|
90
103
|
return [...ALL_PROVIDER_KINDS];
|
|
91
104
|
const filtered = value.filter(isProviderKind);
|
|
105
|
+
const legacyAll = filtered.length === LEGACY_ALL_PROVIDER_KINDS.length &&
|
|
106
|
+
LEGACY_ALL_PROVIDER_KINDS.every((kind) => filtered.includes(kind));
|
|
107
|
+
if (legacyAll)
|
|
108
|
+
return [...ALL_PROVIDER_KINDS];
|
|
92
109
|
// Dedupe preserve order
|
|
93
110
|
const seen = new Set();
|
|
94
111
|
const ordered = [];
|
|
@@ -117,11 +134,19 @@ export function normalizeSettings(value) {
|
|
|
117
134
|
showProvidersTable: true,
|
|
118
135
|
showProjectsTable: true,
|
|
119
136
|
visibleCards: [...DEFAULT_VISIBLE_CARDS],
|
|
137
|
+
inactiveCards: [...DEFAULT_WIDE_CARDS],
|
|
120
138
|
};
|
|
121
139
|
}
|
|
122
140
|
const record = value;
|
|
123
141
|
const enabled = normalizeEnabledProviders(record.enabledProviders ?? record.providers ?? record.filterProviders);
|
|
124
142
|
const interval = normalizeRefreshIntervalSeconds(record.refreshIntervalSeconds);
|
|
143
|
+
const active = normalizeVisibleCards(record.visibleCards);
|
|
144
|
+
// The inactive set is always the opposite size. Files predating it fall
|
|
145
|
+
// back to defaults: the wide preset when four show, legacy four when six
|
|
146
|
+
// show (e.g. a 0.1.23 six-list keeps its layout, 4 defaults below it).
|
|
147
|
+
const inactive = record.inactiveCards !== undefined
|
|
148
|
+
? normalizeVisibleCards(record.inactiveCards, active.length > 4 ? 4 : 6)
|
|
149
|
+
: normalizeVisibleCards(active.length > 4 ? DEFAULT_VISIBLE_CARDS : DEFAULT_WIDE_CARDS, active.length > 4 ? 4 : 6);
|
|
125
150
|
return {
|
|
126
151
|
enabledProviders: enabled,
|
|
127
152
|
refreshIntervalSeconds: interval,
|
|
@@ -129,7 +154,8 @@ export function normalizeSettings(value) {
|
|
|
129
154
|
showProvidersTable: record.showProvidersTable !== false,
|
|
130
155
|
showProjectsTable: record.showProjectsTable !== false,
|
|
131
156
|
// Missing (legacy settings.json) means the legacy hour/day/week/month layout.
|
|
132
|
-
visibleCards:
|
|
157
|
+
visibleCards: active,
|
|
158
|
+
inactiveCards: inactive,
|
|
133
159
|
};
|
|
134
160
|
}
|
|
135
161
|
export function settingsFilePath(cacheDirectory) {
|
|
@@ -177,13 +203,15 @@ export async function saveDashboardSettings(settings, cacheDirectory) {
|
|
|
177
203
|
process.stderr.write(`oc2token: warning: failed to create settings directory at ${directory}: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
178
204
|
return;
|
|
179
205
|
}
|
|
206
|
+
const active = normalizeVisibleCards(settings.visibleCards);
|
|
180
207
|
const payload = JSON.stringify({
|
|
181
208
|
version: 1,
|
|
182
209
|
enabledProviders: [...settings.enabledProviders],
|
|
183
210
|
refreshIntervalSeconds: clampRefreshIntervalSeconds(settings.refreshIntervalSeconds),
|
|
184
211
|
showProvidersTable: settings.showProvidersTable !== false,
|
|
185
212
|
showProjectsTable: settings.showProjectsTable !== false,
|
|
186
|
-
visibleCards:
|
|
213
|
+
visibleCards: active,
|
|
214
|
+
inactiveCards: normalizeVisibleCards(settings.inactiveCards, active.length > 4 ? 4 : 6),
|
|
187
215
|
}, null, 2);
|
|
188
216
|
try {
|
|
189
217
|
await fs.writeFile(path, `${payload}\n`, "utf8");
|
|
@@ -192,7 +220,7 @@ export async function saveDashboardSettings(settings, cacheDirectory) {
|
|
|
192
220
|
process.stderr.write(`oc2token: warning: failed to save settings at ${path}: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
193
221
|
}
|
|
194
222
|
}
|
|
195
|
-
export const REFRESH_INTERVAL_PRESETS = [60, 120, 300, 600, 900,
|
|
223
|
+
export const REFRESH_INTERVAL_PRESETS = [15, 30, 60, 120, 300, 600, 900, 3600, 7200];
|
|
196
224
|
export function nearestPresetIndex(value) {
|
|
197
225
|
const clamped = clampRefreshIntervalSeconds(value);
|
|
198
226
|
let bestIndex = 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/dashboard/settings/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EACL,qBAAqB,EACrB,qBAAqB,GAEtB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,CAAC,MAAM,4BAA4B,GAAG,EAAE,CAAC;AAC/C,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/dashboard/settings/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -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>;
|