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.
Files changed (66) hide show
  1. package/README.md +24 -15
  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 +54 -16
  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.d.ts +1 -1
  13. package/dist/src/dashboard/render/dashboard.js +21 -14
  14. package/dist/src/dashboard/render/dashboard.js.map +1 -1
  15. package/dist/src/dashboard/render/types.d.ts +8 -0
  16. package/dist/src/dashboard/render/types.js +17 -4
  17. package/dist/src/dashboard/render/types.js.map +1 -1
  18. package/dist/src/dashboard/settings/index.d.ts +10 -8
  19. package/dist/src/dashboard/settings/index.js +42 -14
  20. package/dist/src/dashboard/settings/index.js.map +1 -1
  21. package/dist/src/deepseek/discovery.d.ts +21 -0
  22. package/dist/src/deepseek/discovery.js +83 -0
  23. package/dist/src/deepseek/discovery.js.map +1 -0
  24. package/dist/src/deepseek/doctor.d.ts +8 -0
  25. package/dist/src/deepseek/doctor.js +103 -0
  26. package/dist/src/deepseek/doctor.js.map +1 -0
  27. package/dist/src/deepseek/index.d.ts +4 -0
  28. package/dist/src/deepseek/index.js +4 -0
  29. package/dist/src/deepseek/index.js.map +1 -0
  30. package/dist/src/deepseek/scanner.d.ts +9 -0
  31. package/dist/src/deepseek/scanner.js +283 -0
  32. package/dist/src/deepseek/scanner.js.map +1 -0
  33. package/dist/src/deepseek/types.d.ts +38 -0
  34. package/dist/src/deepseek/types.js +3 -0
  35. package/dist/src/deepseek/types.js.map +1 -0
  36. package/dist/src/deepseek/zstd.d.ts +11 -0
  37. package/dist/src/deepseek/zstd.js +138 -0
  38. package/dist/src/deepseek/zstd.js.map +1 -0
  39. package/dist/src/domain/contracts.d.ts +2 -2
  40. package/dist/src/domain/contracts.js.map +1 -1
  41. package/dist/src/domain/records.d.ts +1 -1
  42. package/dist/src/domain/records.js +1 -1
  43. package/dist/src/domain/records.js.map +1 -1
  44. package/dist/src/opencode/doctor.d.ts +1 -1
  45. package/dist/src/opencode/doctor.js.map +1 -1
  46. package/dist/src/output/table.js +1 -1
  47. package/dist/src/output/table.js.map +1 -1
  48. package/dist/src/pi/discovery.d.ts +12 -0
  49. package/dist/src/pi/discovery.js +86 -0
  50. package/dist/src/pi/discovery.js.map +1 -0
  51. package/dist/src/pi/doctor.d.ts +8 -0
  52. package/dist/src/pi/doctor.js +55 -0
  53. package/dist/src/pi/doctor.js.map +1 -0
  54. package/dist/src/pi/index.d.ts +3 -0
  55. package/dist/src/pi/index.js +3 -0
  56. package/dist/src/pi/index.js.map +1 -0
  57. package/dist/src/pi/scanner.d.ts +9 -0
  58. package/dist/src/pi/scanner.js +255 -0
  59. package/dist/src/pi/scanner.js.map +1 -0
  60. package/dist/src/pi/types.d.ts +45 -0
  61. package/dist/src/pi/types.js +3 -0
  62. package/dist/src/pi/types.js.map +1 -0
  63. package/dist/src/usage/record-result.d.ts +19 -0
  64. package/dist/src/usage/record-result.js +91 -0
  65. package/dist/src/usage/record-result.js.map +1 -0
  66. package/package.json +7 -2
@@ -1 +1 @@
1
- {"version":3,"file":"table.js","sourceRoot":"","sources":["../../../src/output/table.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"table.js","sourceRoot":"","sources":["../../../src/output/table.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Pi's session root. `PI_CODING_AGENT_SESSION_DIR` overrides storage outright;
3
+ * otherwise sessions live under `<agent-dir>/sessions`, where the agent
4
+ * directory is `PI_CODING_AGENT_DIR` or `~/.pi/agent`.
5
+ */
6
+ export declare function defaultPiSessionDirectory(): string;
7
+ /**
8
+ * Walk Pi's session store. Layout is
9
+ * `<root>/--<normalized-cwd>--/<timestamp>_<session-id>.jsonl`; a shallow
10
+ * second pass also accepts session files stored directly in the root.
11
+ */
12
+ export declare function discoverPiSessionFiles(root?: string): string[];
@@ -0,0 +1,86 @@
1
+ import { readFileSync, readdirSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { isAbsolute, join } from "node:path";
4
+ /** Bounds so a huge agent directory can never hang discovery. */
5
+ const MAX_SESSION_FILES = 50_000;
6
+ const MAX_ENTRIES_PER_DIR = 10_000;
7
+ /**
8
+ * Pi's session root. `PI_CODING_AGENT_SESSION_DIR` overrides storage outright;
9
+ * otherwise sessions live under `<agent-dir>/sessions`, where the agent
10
+ * directory is `PI_CODING_AGENT_DIR` or `~/.pi/agent`.
11
+ */
12
+ export function defaultPiSessionDirectory() {
13
+ const sessionDir = process.env.PI_CODING_AGENT_SESSION_DIR;
14
+ if (typeof sessionDir === "string" && sessionDir.trim().length > 0) {
15
+ return sessionDir;
16
+ }
17
+ const agentDirEnv = process.env.PI_CODING_AGENT_DIR;
18
+ const agentDir = typeof agentDirEnv === "string" && agentDirEnv.trim().length > 0 ? agentDirEnv : join(homedir(), ".pi", "agent");
19
+ // The `sessionDir` setting is read before project trust and may relocate
20
+ // storage without an environment variable being set.
21
+ try {
22
+ const settings = JSON.parse(readFileSync(join(agentDir, "settings.json"), "utf8"));
23
+ if (typeof settings.sessionDir === "string" && settings.sessionDir.trim().length > 0) {
24
+ const configured = settings.sessionDir.trim();
25
+ const expanded = configured === "~"
26
+ ? homedir()
27
+ : configured.startsWith("~/")
28
+ ? join(homedir(), configured.slice(2))
29
+ : configured;
30
+ return isAbsolute(expanded) ? expanded : join(agentDir, expanded);
31
+ }
32
+ }
33
+ catch {
34
+ // Missing/corrupt settings are not a discovery failure.
35
+ }
36
+ return join(agentDir, "sessions");
37
+ }
38
+ function readDirEntries(directory) {
39
+ let entries;
40
+ try {
41
+ entries = readdirSync(directory, { withFileTypes: true });
42
+ }
43
+ catch {
44
+ return [];
45
+ }
46
+ const names = [];
47
+ for (const entry of entries) {
48
+ if (names.length >= MAX_ENTRIES_PER_DIR)
49
+ break;
50
+ // Never follow symlinks (files or dirs) during discovery.
51
+ if (entry.isSymbolicLink())
52
+ continue;
53
+ names.push(entry.name);
54
+ }
55
+ return names;
56
+ }
57
+ function isSessionFile(name) {
58
+ return name.endsWith(".jsonl") && !name.endsWith(".lock.jsonl");
59
+ }
60
+ /**
61
+ * Walk Pi's session store. Layout is
62
+ * `<root>/--<normalized-cwd>--/<timestamp>_<session-id>.jsonl`; a shallow
63
+ * second pass also accepts session files stored directly in the root.
64
+ */
65
+ export function discoverPiSessionFiles(root) {
66
+ const sessionRoot = root ?? defaultPiSessionDirectory();
67
+ const files = [];
68
+ for (const entry of readDirEntries(sessionRoot)) {
69
+ if (files.length >= MAX_SESSION_FILES)
70
+ break;
71
+ const path = join(sessionRoot, entry);
72
+ if (isSessionFile(entry)) {
73
+ files.push(path);
74
+ continue;
75
+ }
76
+ for (const nested of readDirEntries(path)) {
77
+ if (files.length >= MAX_SESSION_FILES)
78
+ break;
79
+ if (!isSessionFile(nested))
80
+ continue;
81
+ files.push(join(path, nested));
82
+ }
83
+ }
84
+ return files.sort();
85
+ }
86
+ //# sourceMappingURL=discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../../src/pi/discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export interface PiDoctorCheck {
2
+ readonly name: "pi";
3
+ readonly ok: boolean;
4
+ /** No Pi store exists; default `doctor` treats this as optional. */
5
+ readonly missing?: boolean;
6
+ readonly message: string;
7
+ }
8
+ export declare function runPiDoctor(): Promise<PiDoctorCheck>;
@@ -0,0 +1,55 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { discoverPiSessionFiles } from "./discovery.js";
3
+ export async function runPiDoctor() {
4
+ let files;
5
+ try {
6
+ files = discoverPiSessionFiles();
7
+ }
8
+ catch (error) {
9
+ const message = error instanceof Error ? error.message : String(error);
10
+ return { name: "pi", ok: false, message: `Pi discovery failed: ${message}` };
11
+ }
12
+ if (files.length === 0) {
13
+ return { name: "pi", ok: false, missing: true, message: "No Pi session files found" };
14
+ }
15
+ const file = files[0];
16
+ let content;
17
+ try {
18
+ content = readFileSync(file, "utf8");
19
+ }
20
+ catch (error) {
21
+ const message = error instanceof Error ? error.message : String(error);
22
+ return { name: "pi", ok: false, message: `Found ${files.length} Pi session file(s) but read failed: ${message}` };
23
+ }
24
+ let parsed = 0;
25
+ let hasUsage = false;
26
+ try {
27
+ for (const raw of content.split("\n")) {
28
+ const line = raw.trim();
29
+ if (line.length === 0)
30
+ continue;
31
+ const entry = JSON.parse(line);
32
+ parsed += 1;
33
+ if (entry.type === "message" && entry.message?.usage !== undefined)
34
+ hasUsage = true;
35
+ if (entry.type === "usage")
36
+ hasUsage = true;
37
+ }
38
+ }
39
+ catch {
40
+ return {
41
+ name: "pi",
42
+ ok: false,
43
+ message: `Found ${files.length} Pi session file(s) but JSON parse failed in ${file}`,
44
+ };
45
+ }
46
+ if (parsed === 0) {
47
+ return { name: "pi", ok: false, message: `Found ${files.length} Pi session file(s) but first file is empty` };
48
+ }
49
+ return {
50
+ name: "pi",
51
+ ok: true,
52
+ message: `Found ${files.length} Pi session file(s); ${hasUsage ? "usage found" : "JSON parse OK (no usage entries yet)"}`,
53
+ };
54
+ }
55
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/pi/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAWxD,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACH,KAAK,GAAG,sBAAsB,EAAE,CAAC;IACnC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,wBAAwB,OAAO,EAAE,EAAE,CAAC;IAC/E,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,2BAA2B,EAAE,CAAC;IACxF,CAAC;IAED,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;IACvB,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,KAAK,CAAC,MAAM,wCAAwC,OAAO,EAAE,EAAE,CAAC;IACpH,CAAC;IAED,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,CAAC;QACH,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;YACxB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YAChC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAY,CAAC;YAC1C,MAAM,IAAI,CAAC,CAAC;YACZ,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,EAAE,KAAK,KAAK,SAAS;gBAAE,QAAQ,GAAG,IAAI,CAAC;YACpF,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO;gBAAE,QAAQ,GAAG,IAAI,CAAC;QAC9C,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,IAAI,EAAE,IAAI;YACV,EAAE,EAAE,KAAK;YACT,OAAO,EAAE,SAAS,KAAK,CAAC,MAAM,gDAAgD,IAAI,EAAE;SACrF,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;QACjB,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,KAAK,CAAC,MAAM,6CAA6C,EAAE,CAAC;IAChH,CAAC;IACD,OAAO;QACL,IAAI,EAAE,IAAI;QACV,EAAE,EAAE,IAAI;QACR,OAAO,EAAE,SAAS,KAAK,CAAC,MAAM,wBAAwB,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,sCAAsC,EAAE;KAC1H,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { discoverPiSessionFiles, defaultPiSessionDirectory } from "./discovery.js";
2
+ export { collectPi } from "./scanner.js";
3
+ export type * from "./types.js";
@@ -0,0 +1,3 @@
1
+ export { discoverPiSessionFiles, defaultPiSessionDirectory } from "./discovery.js";
2
+ export { collectPi } from "./scanner.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/pi/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AACnF,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { type CollectionRequest, type CollectionResult } from "../domain/index.js";
2
+ /**
3
+ * Native Pi session scanner. Pi appends JSONL entries to
4
+ * `<agent-dir>/sessions/--<cwd>--/<timestamp>_<id>.jsonl`; assistant messages
5
+ * carry normalized usage and `usage` entries cover non-message model work
6
+ * (for example cache warming). Forked sessions repeat their parent's history,
7
+ * so a fork's pre-header entries are skipped to avoid double counting.
8
+ */
9
+ export declare function collectPi(request: CollectionRequest, root?: string): Promise<CollectionResult>;
@@ -0,0 +1,255 @@
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 { discoverPiSessionFiles } from "./discovery.js";
7
+ /** Guards against one giant session file exhausting memory. */
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 safeNumber(value) {
16
+ return typeof value === "number" && Number.isFinite(value) && value >= 0 ? value : 0;
17
+ }
18
+ function sanitizeRecordID(value, fallback) {
19
+ // eslint-disable-next-line no-control-regex
20
+ const cleaned = value.replace(/[\u0000-\u001f/]/g, "_").trim();
21
+ return cleaned.length > 0 ? cleaned : fallback;
22
+ }
23
+ function parseTimestamp(value) {
24
+ if (value instanceof Date) {
25
+ return Number.isFinite(value.getTime()) ? new Date(value.getTime()) : undefined;
26
+ }
27
+ if (typeof value === "number") {
28
+ if (!Number.isFinite(value))
29
+ return undefined;
30
+ // Pi stores nested message timestamps in milliseconds; accept whole
31
+ // seconds too so old exports do not land in 1970.
32
+ const milliseconds = Math.abs(value) < 100_000_000_000 ? value * 1_000 : value;
33
+ const date = new Date(milliseconds);
34
+ return Number.isFinite(date.getTime()) ? date : undefined;
35
+ }
36
+ if (typeof value === "string") {
37
+ const date = new Date(value);
38
+ return Number.isFinite(date.getTime()) ? date : undefined;
39
+ }
40
+ return undefined;
41
+ }
42
+ /**
43
+ * Pi reports reasoning inside `output` (`usage.reasoning` is a subset), while
44
+ * this project's accounting sums output and reasoning as separate buckets.
45
+ * Subtract it so `recorded_total` never double-counts.
46
+ */
47
+ function tokensForUsage(usage) {
48
+ const reasoning = safeNumber(usage.reasoning);
49
+ const output = Math.max(0, safeNumber(usage.output) - reasoning);
50
+ return {
51
+ input: safeNumber(usage.input),
52
+ output,
53
+ reasoning,
54
+ cacheRead: safeNumber(usage.cacheRead),
55
+ cacheWrite: safeNumber(usage.cacheWrite),
56
+ };
57
+ }
58
+ function modelName(provider, model) {
59
+ const trimmedModel = model?.trim();
60
+ const trimmedProvider = provider?.trim();
61
+ if (trimmedModel === undefined || trimmedModel.length === 0)
62
+ return "unknown";
63
+ if (trimmedProvider === undefined || trimmedProvider.length === 0 || trimmedModel.startsWith(`${trimmedProvider}/`)) {
64
+ return trimmedModel;
65
+ }
66
+ return `${trimmedProvider}/${trimmedModel}`;
67
+ }
68
+ function inRequestedWindow(request, createdAt) {
69
+ return request.windows.some((window) => containsInstant(window, createdAt));
70
+ }
71
+ function addError(state, error, fallback, sessionID) {
72
+ state.fileHasError = true;
73
+ state.errors.push(toCollectionError(error, fallback, sessionID));
74
+ }
75
+ function addUsageRecord(state, request, sessionID, messageID, createdAt, model, usage, project) {
76
+ if (!inRequestedWindow(request, createdAt))
77
+ return;
78
+ const tokens = tokensForUsage(usage);
79
+ if (tokens.input === 0 &&
80
+ tokens.output === 0 &&
81
+ tokens.reasoning === 0 &&
82
+ tokens.cacheRead === 0 &&
83
+ tokens.cacheWrite === 0) {
84
+ return;
85
+ }
86
+ try {
87
+ state.records.push(createUsageRecord({
88
+ sessionID,
89
+ messageID: sanitizeRecordID(messageID, `${createdAt.getTime()}`),
90
+ createdAt,
91
+ model,
92
+ tokens,
93
+ observedAt: new Date(request.capturedAt.getTime()),
94
+ completeness: "final",
95
+ provider: "pi",
96
+ ...(project === undefined ? {} : { project }),
97
+ }));
98
+ }
99
+ catch (error) {
100
+ addError(state, error, "invalid-data", sessionID);
101
+ }
102
+ }
103
+ function usageOf(message) {
104
+ const usage = message?.usage;
105
+ return usage !== null && typeof usage === "object" ? usage : undefined;
106
+ }
107
+ /**
108
+ * Native Pi session scanner. Pi appends JSONL entries to
109
+ * `<agent-dir>/sessions/--<cwd>--/<timestamp>_<id>.jsonl`; assistant messages
110
+ * carry normalized usage and `usage` entries cover non-message model work
111
+ * (for example cache warming). Forked sessions repeat their parent's history,
112
+ * so a fork's pre-header entries are skipped to avoid double counting.
113
+ */
114
+ export async function collectPi(request, root) {
115
+ assertNotAborted(request.signal);
116
+ if (request.windows.length === 0) {
117
+ throw new DomainError("invalid-window", "Collection request must contain at least one usage window");
118
+ }
119
+ const files = discoverPiSessionFiles(root);
120
+ const errors = [];
121
+ const reducer = new UsageRecordReducer();
122
+ let sessionsScanned = 0;
123
+ let sessionsSkipped = 0;
124
+ for (const filePath of files) {
125
+ assertNotAborted(request.signal);
126
+ const fileFallback = sanitizeRecordID(basename(filePath, ".jsonl"), "pi-session");
127
+ const state = { errors: [], records: [], fileHasError: false };
128
+ let content;
129
+ try {
130
+ const stat = await nodeFs.stat(filePath);
131
+ if (stat.size > MAX_SESSION_BYTES) {
132
+ sessionsSkipped += 1;
133
+ errors.push(toCollectionError(new DomainError("invalid-data", `Pi session file exceeds ${MAX_SESSION_BYTES} bytes`, {
134
+ sessionID: fileFallback,
135
+ }), "invalid-data", fileFallback));
136
+ continue;
137
+ }
138
+ content = await nodeFs.readFile(filePath, "utf8");
139
+ }
140
+ catch (error) {
141
+ if (isCancellationError(error))
142
+ throw cancellationError();
143
+ sessionsSkipped += 1;
144
+ errors.push(toCollectionError(error, "transport", fileFallback));
145
+ continue;
146
+ }
147
+ let sessionID = fileFallback;
148
+ let project;
149
+ let forkCutoffMs;
150
+ let currentProvider;
151
+ let currentModel;
152
+ const lines = content.split("\n");
153
+ for (let index = 0; index < lines.length; index += 1) {
154
+ assertNotAborted(request.signal);
155
+ const line = lines[index].trim();
156
+ if (line.length === 0)
157
+ continue;
158
+ let parsed;
159
+ try {
160
+ parsed = JSON.parse(line);
161
+ }
162
+ catch (error) {
163
+ addError(state, error, "invalid-data", sessionID);
164
+ continue;
165
+ }
166
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
167
+ addError(state, new DomainError("invalid-data", "Pi session line is not an object", { sessionID }), "invalid-data", sessionID);
168
+ continue;
169
+ }
170
+ const entry = parsed;
171
+ if (entry.type === "session") {
172
+ const header = entry;
173
+ sessionID = sanitizeRecordID(typeof header.id === "string" && header.id.trim().length > 0 ? header.id : fileFallback, fileFallback);
174
+ if (typeof header.cwd === "string" && header.cwd.trim().length > 0) {
175
+ project = header.cwd.trim();
176
+ }
177
+ const headerTime = parseTimestamp(header.timestamp);
178
+ if (headerTime !== undefined && typeof header.parentSession === "string" && header.parentSession.length > 0) {
179
+ // /fork and /clone copy the parent's entries with their original
180
+ // timestamps. Anything before the new header is inherited, not new
181
+ // billable work in this session.
182
+ forkCutoffMs = headerTime.getTime();
183
+ }
184
+ continue;
185
+ }
186
+ if (entry.type === "model_change") {
187
+ if (typeof entry.provider === "string" && entry.provider.trim().length > 0) {
188
+ currentProvider = entry.provider.trim();
189
+ }
190
+ if (typeof entry.modelId === "string" && entry.modelId.trim().length > 0) {
191
+ currentModel = entry.modelId.trim();
192
+ }
193
+ continue;
194
+ }
195
+ const entryTime = parseTimestamp(entry.timestamp) ?? parseTimestamp(entry.message?.timestamp);
196
+ if (entryTime === undefined) {
197
+ // Model/thinking changes and system entries may omit timestamps; only
198
+ // usage-bearing rows need one.
199
+ if (entry.usage !== undefined || entry.message?.usage !== undefined) {
200
+ addError(state, new DomainError("invalid-data", "Usage entry has no valid timestamp", { sessionID }), "invalid-data", sessionID);
201
+ }
202
+ continue;
203
+ }
204
+ if (forkCutoffMs !== undefined && entryTime.getTime() < forkCutoffMs)
205
+ continue;
206
+ const message = entry.message;
207
+ if (entry.type === "message" && typeof message === "object" && message !== null) {
208
+ if (typeof message.provider === "string" && message.provider.trim().length > 0) {
209
+ currentProvider = message.provider.trim();
210
+ }
211
+ if (typeof message.model === "string" && message.model.trim().length > 0) {
212
+ currentModel = message.model.trim();
213
+ }
214
+ const usage = usageOf(message);
215
+ if (usage === undefined)
216
+ continue;
217
+ addUsageRecord(state, request, sessionID, entry.id ?? `message-${index}`, entryTime, modelName(message.provider ?? currentProvider, message.model ?? currentModel), usage, project);
218
+ continue;
219
+ }
220
+ if (entry.type === "usage") {
221
+ const usage = entry.usage;
222
+ if (usage === null || typeof usage !== "object")
223
+ continue;
224
+ addUsageRecord(state, request, sessionID, entry.id === undefined ? `usage-${index}` : `usage-${entry.id}`, entryTime, modelName(entry.provider ?? currentProvider, entry.model ?? currentModel), usage, project);
225
+ continue;
226
+ }
227
+ if ((entry.type === "compaction" || entry.type === "branch_summary") && entry.usage !== undefined) {
228
+ const usage = entry.usage;
229
+ if (usage === null || typeof usage !== "object")
230
+ continue;
231
+ addUsageRecord(state, request, sessionID, entry.id === undefined ? `${entry.type}-${index}` : `${entry.type}-${entry.id}`, entryTime, modelName(currentProvider, currentModel), usage, project);
232
+ }
233
+ }
234
+ for (const record of state.records)
235
+ reducer.upsert(record);
236
+ errors.push(...state.errors);
237
+ if (state.fileHasError)
238
+ sessionsSkipped += 1;
239
+ else
240
+ sessionsScanned += 1;
241
+ }
242
+ assertNotAborted(request.signal);
243
+ return buildRecordResult({
244
+ capturedAt: request.capturedAt,
245
+ windows: request.windows,
246
+ source: "pi",
247
+ records: reducer.records(),
248
+ sessionsDiscovered: files.length,
249
+ sessionsScanned,
250
+ sessionsSkipped,
251
+ pagesRead: files.length,
252
+ errors,
253
+ });
254
+ }
255
+ //# sourceMappingURL=scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../../src/pi/scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /** Internal Pi session JSONL types. Not part of public domain contracts. */
2
+ export interface PiUsage {
3
+ readonly input?: number;
4
+ readonly output?: number;
5
+ readonly cacheRead?: number;
6
+ readonly cacheWrite?: number;
7
+ readonly cacheWrite1h?: number;
8
+ readonly reasoning?: number;
9
+ readonly totalTokens?: number;
10
+ readonly cost?: {
11
+ readonly input?: number;
12
+ readonly output?: number;
13
+ readonly cacheRead?: number;
14
+ readonly cacheWrite?: number;
15
+ readonly total?: number;
16
+ };
17
+ }
18
+ export interface PiMessage {
19
+ readonly role?: string;
20
+ readonly provider?: string;
21
+ readonly model?: string;
22
+ readonly usage?: PiUsage | null;
23
+ readonly timestamp?: number;
24
+ readonly stopReason?: string;
25
+ }
26
+ export interface PiSessionHeader {
27
+ readonly type: "session";
28
+ readonly version?: number;
29
+ readonly id?: string;
30
+ readonly timestamp?: string | number;
31
+ readonly cwd?: string;
32
+ readonly parentSession?: string;
33
+ }
34
+ export interface PiEntry {
35
+ readonly type?: string;
36
+ readonly id?: string;
37
+ readonly timestamp?: string | number;
38
+ readonly kind?: string;
39
+ readonly provider?: string;
40
+ readonly modelId?: string;
41
+ readonly model?: string;
42
+ readonly cwd?: string;
43
+ readonly usage?: PiUsage | null;
44
+ readonly message?: PiMessage;
45
+ }
@@ -0,0 +1,3 @@
1
+ /** Internal Pi session JSONL types. Not part of public domain contracts. */
2
+ export {};
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/pi/types.ts"],"names":[],"mappings":"AAAA,4EAA4E"}
@@ -0,0 +1,19 @@
1
+ import type { CollectionError, CollectionResult, CollectionSource, UsageRecord, UsageWindow } from "../domain/index.js";
2
+ export interface RecordResultInput {
3
+ readonly capturedAt: Date;
4
+ readonly windows: ReadonlyArray<UsageWindow>;
5
+ readonly source: CollectionSource;
6
+ readonly records: ReadonlyArray<UsageRecord>;
7
+ readonly sessionsDiscovered: number;
8
+ readonly sessionsScanned: number;
9
+ readonly sessionsSkipped: number;
10
+ readonly pagesRead: number;
11
+ readonly provisionalMessages?: number;
12
+ readonly errors: ReadonlyArray<CollectionError>;
13
+ }
14
+ /**
15
+ * Shared finalization for local-file scanners. Derives per-window totals and
16
+ * provider/model/project breakdowns from the normalized records so every
17
+ * file-backed provider reports the same shape as the Codex scanner.
18
+ */
19
+ export declare function buildRecordResult(input: RecordResultInput): CollectionResult;