oc2token 0.1.0

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 (159) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +399 -0
  3. package/dist/src/accounting/index.d.ts +1 -0
  4. package/dist/src/accounting/index.js +2 -0
  5. package/dist/src/accounting/index.js.map +1 -0
  6. package/dist/src/accounting/reducer.d.ts +21 -0
  7. package/dist/src/accounting/reducer.js +105 -0
  8. package/dist/src/accounting/reducer.js.map +1 -0
  9. package/dist/src/antigravity/discovery.d.ts +18 -0
  10. package/dist/src/antigravity/discovery.js +95 -0
  11. package/dist/src/antigravity/discovery.js.map +1 -0
  12. package/dist/src/antigravity/doctor.d.ts +6 -0
  13. package/dist/src/antigravity/doctor.js +78 -0
  14. package/dist/src/antigravity/doctor.js.map +1 -0
  15. package/dist/src/antigravity/index.d.ts +3 -0
  16. package/dist/src/antigravity/index.js +4 -0
  17. package/dist/src/antigravity/index.js.map +1 -0
  18. package/dist/src/antigravity/proto.d.ts +73 -0
  19. package/dist/src/antigravity/proto.js +259 -0
  20. package/dist/src/antigravity/proto.js.map +1 -0
  21. package/dist/src/antigravity/scanner.d.ts +8 -0
  22. package/dist/src/antigravity/scanner.js +552 -0
  23. package/dist/src/antigravity/scanner.js.map +1 -0
  24. package/dist/src/application.d.ts +73 -0
  25. package/dist/src/application.js +657 -0
  26. package/dist/src/application.js.map +1 -0
  27. package/dist/src/cache/filesystem.d.ts +8 -0
  28. package/dist/src/cache/filesystem.js +70 -0
  29. package/dist/src/cache/filesystem.js.map +1 -0
  30. package/dist/src/cache/index.d.ts +5 -0
  31. package/dist/src/cache/index.js +6 -0
  32. package/dist/src/cache/index.js.map +1 -0
  33. package/dist/src/cache/lock.d.ts +40 -0
  34. package/dist/src/cache/lock.js +227 -0
  35. package/dist/src/cache/lock.js.map +1 -0
  36. package/dist/src/cache/schema.d.ts +45 -0
  37. package/dist/src/cache/schema.js +308 -0
  38. package/dist/src/cache/schema.js.map +1 -0
  39. package/dist/src/cache/store.d.ts +46 -0
  40. package/dist/src/cache/store.js +396 -0
  41. package/dist/src/cache/store.js.map +1 -0
  42. package/dist/src/cache/types.d.ts +130 -0
  43. package/dist/src/cache/types.js +6 -0
  44. package/dist/src/cache/types.js.map +1 -0
  45. package/dist/src/cli.d.ts +8 -0
  46. package/dist/src/cli.js +874 -0
  47. package/dist/src/cli.js.map +1 -0
  48. package/dist/src/codex/discovery.d.ts +6 -0
  49. package/dist/src/codex/discovery.js +88 -0
  50. package/dist/src/codex/discovery.js.map +1 -0
  51. package/dist/src/codex/doctor.d.ts +6 -0
  52. package/dist/src/codex/doctor.js +52 -0
  53. package/dist/src/codex/doctor.js.map +1 -0
  54. package/dist/src/codex/index.d.ts +3 -0
  55. package/dist/src/codex/index.js +3 -0
  56. package/dist/src/codex/index.js.map +1 -0
  57. package/dist/src/codex/scanner.d.ts +6 -0
  58. package/dist/src/codex/scanner.js +487 -0
  59. package/dist/src/codex/scanner.js.map +1 -0
  60. package/dist/src/codex/types.d.ts +31 -0
  61. package/dist/src/codex/types.js +5 -0
  62. package/dist/src/codex/types.js.map +1 -0
  63. package/dist/src/collector/collector.d.ts +15 -0
  64. package/dist/src/collector/collector.js +597 -0
  65. package/dist/src/collector/collector.js.map +1 -0
  66. package/dist/src/collector/index.d.ts +3 -0
  67. package/dist/src/collector/index.js +3 -0
  68. package/dist/src/collector/index.js.map +1 -0
  69. package/dist/src/collector/types.d.ts +55 -0
  70. package/dist/src/collector/types.js +18 -0
  71. package/dist/src/collector/types.js.map +1 -0
  72. package/dist/src/dashboard/render/ansi.d.ts +53 -0
  73. package/dist/src/dashboard/render/ansi.js +106 -0
  74. package/dist/src/dashboard/render/ansi.js.map +1 -0
  75. package/dist/src/dashboard/render/dashboard.d.ts +13 -0
  76. package/dist/src/dashboard/render/dashboard.js +750 -0
  77. package/dist/src/dashboard/render/dashboard.js.map +1 -0
  78. package/dist/src/dashboard/render/format.d.ts +23 -0
  79. package/dist/src/dashboard/render/format.js +169 -0
  80. package/dist/src/dashboard/render/format.js.map +1 -0
  81. package/dist/src/dashboard/render/redraw.d.ts +13 -0
  82. package/dist/src/dashboard/render/redraw.js +24 -0
  83. package/dist/src/dashboard/render/redraw.js.map +1 -0
  84. package/dist/src/dashboard/render/types.d.ts +83 -0
  85. package/dist/src/dashboard/render/types.js +528 -0
  86. package/dist/src/dashboard/render/types.js.map +1 -0
  87. package/dist/src/dashboard/scheduler/index.d.ts +1 -0
  88. package/dist/src/dashboard/scheduler/index.js +2 -0
  89. package/dist/src/dashboard/scheduler/index.js.map +1 -0
  90. package/dist/src/dashboard/scheduler/refresh-scheduler.d.ts +46 -0
  91. package/dist/src/dashboard/scheduler/refresh-scheduler.js +137 -0
  92. package/dist/src/dashboard/scheduler/refresh-scheduler.js.map +1 -0
  93. package/dist/src/dashboard/settings/index.d.ts +25 -0
  94. package/dist/src/dashboard/settings/index.js +162 -0
  95. package/dist/src/dashboard/settings/index.js.map +1 -0
  96. package/dist/src/dashboard/state/index.d.ts +2 -0
  97. package/dist/src/dashboard/state/index.js +3 -0
  98. package/dist/src/dashboard/state/index.js.map +1 -0
  99. package/dist/src/dashboard/state/refresh-coordinator.d.ts +72 -0
  100. package/dist/src/dashboard/state/refresh-coordinator.js +346 -0
  101. package/dist/src/dashboard/state/refresh-coordinator.js.map +1 -0
  102. package/dist/src/dashboard/state/types.d.ts +68 -0
  103. package/dist/src/dashboard/state/types.js +2 -0
  104. package/dist/src/dashboard/state/types.js.map +1 -0
  105. package/dist/src/domain/contracts.d.ts +219 -0
  106. package/dist/src/domain/contracts.js +2 -0
  107. package/dist/src/domain/contracts.js.map +1 -0
  108. package/dist/src/domain/errors.d.ts +25 -0
  109. package/dist/src/domain/errors.js +65 -0
  110. package/dist/src/domain/errors.js.map +1 -0
  111. package/dist/src/domain/index.d.ts +5 -0
  112. package/dist/src/domain/index.js +6 -0
  113. package/dist/src/domain/index.js.map +1 -0
  114. package/dist/src/domain/records.d.ts +59 -0
  115. package/dist/src/domain/records.js +141 -0
  116. package/dist/src/domain/records.js.map +1 -0
  117. package/dist/src/domain/tokens.d.ts +51 -0
  118. package/dist/src/domain/tokens.js +93 -0
  119. package/dist/src/domain/tokens.js.map +1 -0
  120. package/dist/src/domain/windows.d.ts +59 -0
  121. package/dist/src/domain/windows.js +272 -0
  122. package/dist/src/domain/windows.js.map +1 -0
  123. package/dist/src/index.d.ts +9 -0
  124. package/dist/src/index.js +9 -0
  125. package/dist/src/index.js.map +1 -0
  126. package/dist/src/opencode/adapter.d.ts +47 -0
  127. package/dist/src/opencode/adapter.js +118 -0
  128. package/dist/src/opencode/adapter.js.map +1 -0
  129. package/dist/src/opencode/client.d.ts +64 -0
  130. package/dist/src/opencode/client.js +118 -0
  131. package/dist/src/opencode/client.js.map +1 -0
  132. package/dist/src/opencode/doctor.d.ts +28 -0
  133. package/dist/src/opencode/doctor.js +82 -0
  134. package/dist/src/opencode/doctor.js.map +1 -0
  135. package/dist/src/opencode/index.d.ts +5 -0
  136. package/dist/src/opencode/index.js +6 -0
  137. package/dist/src/opencode/index.js.map +1 -0
  138. package/dist/src/opencode/stats.d.ts +8 -0
  139. package/dist/src/opencode/stats.js +174 -0
  140. package/dist/src/opencode/stats.js.map +1 -0
  141. package/dist/src/opencode/transport.d.ts +54 -0
  142. package/dist/src/opencode/transport.js +621 -0
  143. package/dist/src/opencode/transport.js.map +1 -0
  144. package/dist/src/output/index.d.ts +20 -0
  145. package/dist/src/output/index.js +46 -0
  146. package/dist/src/output/index.js.map +1 -0
  147. package/dist/src/output/json.d.ts +72 -0
  148. package/dist/src/output/json.js +133 -0
  149. package/dist/src/output/json.js.map +1 -0
  150. package/dist/src/output/table.d.ts +4 -0
  151. package/dist/src/output/table.js +81 -0
  152. package/dist/src/output/table.js.map +1 -0
  153. package/dist/src/pricing/index.d.ts +1 -0
  154. package/dist/src/pricing/index.js +2 -0
  155. package/dist/src/pricing/index.js.map +1 -0
  156. package/dist/src/pricing/pricing.d.ts +19 -0
  157. package/dist/src/pricing/pricing.js +441 -0
  158. package/dist/src/pricing/pricing.js.map +1 -0
  159. package/package.json +27 -0
@@ -0,0 +1,487 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { basename } from "node:path";
3
+ import { createUsageRecord, containsInstant, sumUsageRecords } from "../domain/index.js";
4
+ import { UsageRecordReducer } from "../accounting/reducer.js";
5
+ import { DomainError, cancellationError, isCancellationError, toCollectionError, } from "../domain/index.js";
6
+ import { discoverRolloutFiles } from "./discovery.js";
7
+ function assertNotAborted(signal) {
8
+ if (signal?.aborted) {
9
+ const reason = signal.reason;
10
+ throw cancellationError(reason instanceof Error ? reason.message : undefined);
11
+ }
12
+ }
13
+ function safeNumber(value) {
14
+ return typeof value === "number" && Number.isFinite(value) ? value : 0;
15
+ }
16
+ function readRawNumber(raw, field) {
17
+ if (raw !== null && typeof raw === "object") {
18
+ const rec = raw;
19
+ const v = rec[field];
20
+ if (typeof v === "number" && Number.isFinite(v)) {
21
+ return v;
22
+ }
23
+ }
24
+ return 0;
25
+ }
26
+ function sortedErrors(errors) {
27
+ return [...errors].sort((a, b) => (String(a.sessionID ?? "") + "\0" + a.code + "\0" + a.message).localeCompare(String(b.sessionID ?? "") + "\0" + b.code + "\0" + b.message));
28
+ }
29
+ /**
30
+ * Native Codex scanner — no codeburn dependency, JSONL only.
31
+ * Mirrors codeburn dist/main.js:6329 token handling + fork guard + prevCumulativeTotal dedup.
32
+ */
33
+ export async function collectCodex(request) {
34
+ assertNotAborted(request.signal);
35
+ if (request.windows.length === 0) {
36
+ throw new DomainError("invalid-window", "Collection request must contain at least one usage window");
37
+ }
38
+ const rolloutFiles = discoverRolloutFiles();
39
+ const mutable = {
40
+ sessionsDiscovered: rolloutFiles.length,
41
+ sessionsScanned: 0,
42
+ sessionsSkipped: 0,
43
+ pagesRead: 0,
44
+ jobsRetried: 0,
45
+ provisionalMessages: 0,
46
+ errors: [],
47
+ };
48
+ const reducer = new UsageRecordReducer();
49
+ // Empty home → empty complete result (no error) but still compute window totals.
50
+ if (rolloutFiles.length === 0) {
51
+ assertNotAborted(request.signal);
52
+ const records = reducer.records();
53
+ const totalsByWindow = Object.fromEntries(request.windows.map((w) => [w.kind, sumUsageRecords(records, w)]));
54
+ const coverage = {
55
+ complete: true,
56
+ sessionsDiscovered: 0,
57
+ sessionsScanned: 0,
58
+ sessionsSkipped: 0,
59
+ pagesRead: 0,
60
+ jobsRetried: 0,
61
+ provisionalMessages: 0,
62
+ errors: [],
63
+ };
64
+ return {
65
+ capturedAt: new Date(request.capturedAt.getTime()),
66
+ windows: request.windows.map((w) => ({
67
+ ...w,
68
+ from: new Date(w.from.getTime()),
69
+ to: new Date(w.to.getTime()),
70
+ })),
71
+ source: "codex",
72
+ records,
73
+ totalsByWindow,
74
+ coverage,
75
+ };
76
+ }
77
+ for (const filePath of rolloutFiles) {
78
+ assertNotAborted(request.signal);
79
+ let content;
80
+ try {
81
+ content = readFileSync(filePath, "utf-8");
82
+ }
83
+ catch (error) {
84
+ if (isCancellationError(error)) {
85
+ throw cancellationError();
86
+ }
87
+ mutable.sessionsSkipped += 1;
88
+ mutable.errors.push(toCollectionError(error, "transport", basename(filePath)));
89
+ continue;
90
+ }
91
+ mutable.pagesRead += 1;
92
+ let sessionId;
93
+ let sessionMetaTimestampMs;
94
+ let forkCutoffMs;
95
+ let prevCumulativeTotal = null;
96
+ let prevInput = 0;
97
+ let prevCached = 0;
98
+ let prevCacheWrite = 0;
99
+ let prevOutput = 0;
100
+ let prevReasoning = 0;
101
+ let sessionModel;
102
+ let sessionProject;
103
+ let fileHasError = false;
104
+ const lines = content.split("\n");
105
+ for (const rawLine of lines) {
106
+ assertNotAborted(request.signal);
107
+ const trimmed = rawLine.trim();
108
+ if (trimmed.length === 0) {
109
+ continue;
110
+ }
111
+ let entry;
112
+ try {
113
+ entry = JSON.parse(trimmed);
114
+ }
115
+ catch (error) {
116
+ fileHasError = true;
117
+ mutable.errors.push(toCollectionError(error, "invalid-data", sessionId ?? basename(filePath, ".jsonl")));
118
+ continue;
119
+ }
120
+ if (typeof entry !== "object" || entry === null || Array.isArray(entry)) {
121
+ fileHasError = true;
122
+ mutable.errors.push(toCollectionError(new DomainError("invalid-data", "Codex rollout line is not an object", {
123
+ sessionID: sessionId ?? basename(filePath, ".jsonl"),
124
+ }), "invalid-data", sessionId ?? basename(filePath, ".jsonl")));
125
+ continue;
126
+ }
127
+ const rec = entry;
128
+ // session_meta handling — capture session_id, timestamp, forkCutoff, model
129
+ if (rec.type === "session_meta") {
130
+ const payload = (rec.payload ?? {});
131
+ const sid = payload.session_id ?? payload.sessionId;
132
+ if (typeof sid === "string" && sid.trim().length > 0) {
133
+ sessionId = sid;
134
+ }
135
+ else {
136
+ sessionId = basename(filePath, ".jsonl");
137
+ }
138
+ const tsRaw = rec.timestamp;
139
+ let tsMs;
140
+ if (typeof tsRaw === "string") {
141
+ const parsed = Date.parse(tsRaw);
142
+ if (Number.isFinite(parsed)) {
143
+ tsMs = parsed;
144
+ }
145
+ }
146
+ else if (typeof tsRaw === "number" && Number.isFinite(tsRaw)) {
147
+ tsMs = tsRaw;
148
+ }
149
+ if (tsMs !== undefined) {
150
+ sessionMetaTimestampMs = tsMs;
151
+ const forkedFromId = payload.forked_from_id ?? payload.forkedFromId;
152
+ if (typeof forkedFromId === "string" && forkedFromId.length > 0) {
153
+ forkCutoffMs = tsMs + 5_000;
154
+ }
155
+ else {
156
+ forkCutoffMs = undefined;
157
+ }
158
+ }
159
+ const modelRaw = payload.model;
160
+ const modelNameRaw = payload.model_name ?? payload.modelName;
161
+ if (typeof modelRaw === "string" && modelRaw.trim().length > 0) {
162
+ sessionModel = modelRaw;
163
+ }
164
+ else if (typeof modelNameRaw === "string" && modelNameRaw.trim().length > 0) {
165
+ sessionModel = modelNameRaw;
166
+ }
167
+ // capture cwd as project if present
168
+ const cwdRaw = payload.cwd ?? payload.workdir ?? payload.working_directory ?? payload.directory;
169
+ if (typeof cwdRaw === "string" && cwdRaw.trim().length > 0) {
170
+ sessionProject = cwdRaw.trim();
171
+ }
172
+ else if (typeof payload.cwd === "string") {
173
+ const v = payload.cwd;
174
+ if (v.trim().length > 0)
175
+ sessionProject = v.trim();
176
+ }
177
+ continue;
178
+ }
179
+ if (rec.type === "turn_context") {
180
+ const payload = (rec.payload ?? {});
181
+ const m = payload.model;
182
+ if (typeof m === "string" && m.trim().length > 0) {
183
+ sessionModel = m;
184
+ }
185
+ continue;
186
+ }
187
+ // Filter only event_msg token_count
188
+ if (rec.type !== "event_msg") {
189
+ continue;
190
+ }
191
+ const payload = (rec.payload ?? null);
192
+ if (payload === null || payload.type !== "token_count") {
193
+ continue;
194
+ }
195
+ if (sessionId === undefined) {
196
+ sessionId = basename(filePath, ".jsonl");
197
+ }
198
+ // capture cwd from token_count payload if not yet known
199
+ if (sessionProject === undefined) {
200
+ const cwdCandidate = payload.cwd ?? payload.workdir ?? payload.working_directory ?? payload.directory ?? payload.workDir;
201
+ if (typeof cwdCandidate === "string" && cwdCandidate.trim().length > 0) {
202
+ sessionProject = cwdCandidate.trim();
203
+ }
204
+ else if (typeof payload.info?.cwd === "string") {
205
+ const v = payload.info.cwd;
206
+ if (v.trim().length > 0)
207
+ sessionProject = v.trim();
208
+ }
209
+ }
210
+ // timestamp handling for fork guard and createdAt
211
+ const tsRawEvt = rec.timestamp;
212
+ let eventTsMs;
213
+ let eventTsIso;
214
+ if (typeof tsRawEvt === "string") {
215
+ const parsed = Date.parse(tsRawEvt);
216
+ if (Number.isFinite(parsed)) {
217
+ eventTsMs = parsed;
218
+ eventTsIso = tsRawEvt;
219
+ }
220
+ else {
221
+ fileHasError = true;
222
+ mutable.errors.push(toCollectionError(new DomainError("invalid-data", "Invalid timestamp in token_count event", {
223
+ sessionID: sessionId,
224
+ }), "invalid-data", sessionId));
225
+ continue;
226
+ }
227
+ }
228
+ else if (typeof tsRawEvt === "number" && Number.isFinite(tsRawEvt)) {
229
+ eventTsMs = tsRawEvt;
230
+ eventTsIso = new Date(tsRawEvt).toISOString();
231
+ }
232
+ else {
233
+ fileHasError = true;
234
+ mutable.errors.push(toCollectionError(new DomainError("invalid-data", "Missing timestamp in token_count event", {
235
+ sessionID: sessionId,
236
+ }), "invalid-data", sessionId));
237
+ continue;
238
+ }
239
+ // Fork guard: skip if event.timestamp < session_meta.timestamp + 5s
240
+ if (sessionMetaTimestampMs !== undefined &&
241
+ forkCutoffMs !== undefined &&
242
+ eventTsMs !== undefined &&
243
+ eventTsMs < forkCutoffMs) {
244
+ continue;
245
+ }
246
+ // Additional guard exactly as codeburn second check (redundant but deterministic)
247
+ if (forkCutoffMs !== undefined && eventTsMs !== undefined && eventTsMs < forkCutoffMs) {
248
+ continue;
249
+ }
250
+ const info = (payload.info ?? null);
251
+ if (info === null || typeof info !== "object" || Array.isArray(info)) {
252
+ continue;
253
+ }
254
+ const totalRaw = (info.total_token_usage ?? null);
255
+ const lastRaw = (info.last_token_usage ?? null);
256
+ const cumulativeTotal = totalRaw !== null ? safeNumber(totalRaw.total_tokens) : 0;
257
+ if (prevCumulativeTotal !== null && cumulativeTotal === prevCumulativeTotal) {
258
+ continue;
259
+ }
260
+ prevCumulativeTotal = cumulativeTotal;
261
+ let inputTokens = 0;
262
+ let cachedInputTokens = 0;
263
+ let cacheWriteTokens = 0;
264
+ let outputTokens = 0;
265
+ let reasoningTokens = 0;
266
+ if (lastRaw !== null && typeof lastRaw === "object" && !Array.isArray(lastRaw)) {
267
+ inputTokens = safeNumber(lastRaw.input_tokens);
268
+ cachedInputTokens = safeNumber(lastRaw.cached_input_tokens);
269
+ cacheWriteTokens = safeNumber(lastRaw.cache_write_input_tokens);
270
+ outputTokens = safeNumber(lastRaw.output_tokens);
271
+ reasoningTokens = safeNumber(lastRaw.reasoning_output_tokens);
272
+ }
273
+ else if (cumulativeTotal > 0 && totalRaw !== null) {
274
+ const totalInput = safeNumber(totalRaw.input_tokens);
275
+ const totalCached = safeNumber(totalRaw.cached_input_tokens);
276
+ const totalCacheWrite = safeNumber(totalRaw.cache_write_input_tokens);
277
+ const totalOutput = safeNumber(totalRaw.output_tokens);
278
+ const totalReasoning = safeNumber(totalRaw.reasoning_output_tokens);
279
+ inputTokens = totalInput - prevInput;
280
+ cachedInputTokens = totalCached - prevCached;
281
+ cacheWriteTokens = totalCacheWrite - prevCacheWrite;
282
+ outputTokens = totalOutput - prevOutput;
283
+ reasoningTokens = totalReasoning - prevReasoning;
284
+ if (inputTokens < 0)
285
+ inputTokens = 0;
286
+ if (cachedInputTokens < 0)
287
+ cachedInputTokens = 0;
288
+ if (cacheWriteTokens < 0)
289
+ cacheWriteTokens = 0;
290
+ if (outputTokens < 0)
291
+ outputTokens = 0;
292
+ if (reasoningTokens < 0)
293
+ reasoningTokens = 0;
294
+ }
295
+ else {
296
+ // No last_token_usage and no usable total delta → still need to update prev* below
297
+ // Fall through to update prev* then skip record generation
298
+ }
299
+ // Update prev* from total_token_usage for next delta (codeburn does this unconditionally)
300
+ if (totalRaw !== null && typeof totalRaw === "object" && !Array.isArray(totalRaw)) {
301
+ const t = totalRaw;
302
+ if (typeof t.input_tokens === "number" && Number.isFinite(t.input_tokens))
303
+ prevInput = t.input_tokens;
304
+ if (typeof t.cached_input_tokens === "number" && Number.isFinite(t.cached_input_tokens))
305
+ prevCached = t.cached_input_tokens;
306
+ if (typeof t.cache_write_input_tokens === "number" && Number.isFinite(t.cache_write_input_tokens))
307
+ prevCacheWrite = t.cache_write_input_tokens;
308
+ if (typeof t.output_tokens === "number" && Number.isFinite(t.output_tokens))
309
+ prevOutput = t.output_tokens;
310
+ if (typeof t.reasoning_output_tokens === "number" && Number.isFinite(t.reasoning_output_tokens))
311
+ prevReasoning = t.reasoning_output_tokens;
312
+ }
313
+ const totalTokens = inputTokens + cachedInputTokens + outputTokens + reasoningTokens;
314
+ if (totalTokens === 0) {
315
+ continue;
316
+ }
317
+ const uncachedInputTokens = Math.max(0, inputTokens - cachedInputTokens);
318
+ const cacheWriteInputTokens = Math.max(0, Math.min(cacheWriteTokens, uncachedInputTokens));
319
+ const billedCacheWriteTokens = cacheWriteInputTokens;
320
+ const billedInputTokens = uncachedInputTokens - billedCacheWriteTokens;
321
+ // Resolve model
322
+ let model = sessionModel ?? "unknown";
323
+ const payloadModel = payload.model ?? payload.model_name ?? info.model ?? info.model_name;
324
+ if (typeof payloadModel === "string" && payloadModel.trim().length > 0) {
325
+ model = payloadModel;
326
+ }
327
+ else if (typeof payload.model === "string") {
328
+ model = payload.model;
329
+ }
330
+ let createdAt;
331
+ try {
332
+ createdAt = new Date(eventTsIso ?? "");
333
+ if (Number.isNaN(createdAt.getTime())) {
334
+ if (eventTsMs !== undefined)
335
+ createdAt = new Date(eventTsMs);
336
+ else
337
+ throw new Error("invalid timestamp");
338
+ }
339
+ if (Number.isNaN(createdAt.getTime())) {
340
+ throw new Error("invalid timestamp");
341
+ }
342
+ }
343
+ catch (error) {
344
+ fileHasError = true;
345
+ mutable.errors.push(toCollectionError(error, "invalid-data", sessionId));
346
+ continue;
347
+ }
348
+ // Window filter
349
+ const inWindow = request.windows.some((w) => containsInstant(w, createdAt));
350
+ if (!inWindow) {
351
+ continue;
352
+ }
353
+ // dedupKey = codex:{sessionId}:{total.total_tokens}:{total.input}:{total.cached}:{total.output}:{total.reasoning}
354
+ const totalInputForKey = totalRaw !== null && typeof totalRaw.input_tokens === "number" ? totalRaw.input_tokens : 0;
355
+ const totalCachedForKey = totalRaw !== null && typeof totalRaw.cached_input_tokens === "number"
356
+ ? totalRaw.cached_input_tokens
357
+ : 0;
358
+ const totalOutputForKey = totalRaw !== null && typeof totalRaw.output_tokens === "number" ? totalRaw.output_tokens : 0;
359
+ const totalReasoningForKey = totalRaw !== null && typeof totalRaw.reasoning_output_tokens === "number"
360
+ ? totalRaw.reasoning_output_tokens
361
+ : 0;
362
+ const dedupKey = `codex:${sessionId}:${cumulativeTotal}:${totalInputForKey}:${totalCachedForKey}:${totalOutputForKey}:${totalReasoningForKey}`;
363
+ try {
364
+ const record = createUsageRecord({
365
+ sessionID: sessionId,
366
+ messageID: dedupKey,
367
+ createdAt,
368
+ model,
369
+ tokens: {
370
+ input: billedInputTokens,
371
+ output: outputTokens,
372
+ reasoning: reasoningTokens,
373
+ cacheRead: cachedInputTokens,
374
+ cacheWrite: billedCacheWriteTokens,
375
+ },
376
+ observedAt: new Date(request.capturedAt.getTime()),
377
+ completeness: "final",
378
+ provider: "codex",
379
+ tokenRevision: dedupKey,
380
+ ...(sessionProject === undefined ? {} : { project: sessionProject }),
381
+ });
382
+ reducer.upsert(record);
383
+ }
384
+ catch (error) {
385
+ fileHasError = true;
386
+ mutable.errors.push(toCollectionError(error, "invalid-data", sessionId));
387
+ }
388
+ }
389
+ if (fileHasError) {
390
+ mutable.sessionsSkipped += 1;
391
+ }
392
+ else {
393
+ mutable.sessionsScanned += 1;
394
+ }
395
+ }
396
+ assertNotAborted(request.signal);
397
+ const records = reducer.records();
398
+ const totalsByWindow = Object.fromEntries(request.windows.map((w) => [w.kind, sumUsageRecords(records, w)]));
399
+ const providersMutable = {};
400
+ const modelsMutable = {};
401
+ const projectsMutable = {};
402
+ for (const w of request.windows) {
403
+ const windowRecords = records.filter((r) => containsInstant(w, r.createdAt));
404
+ if (windowRecords.length === 0) {
405
+ continue;
406
+ }
407
+ const codexTotals = sumUsageRecords(windowRecords, w);
408
+ providersMutable[w.kind] = [{ name: "codex", provider: "codex", totals: codexTotals }];
409
+ const byModel = new Map();
410
+ for (const r of windowRecords) {
411
+ const key = r.model;
412
+ const arr = byModel.get(key);
413
+ if (arr === undefined)
414
+ byModel.set(key, [r]);
415
+ else
416
+ arr.push(r);
417
+ }
418
+ const modelBreakdowns = [];
419
+ for (const [modelName, recs] of byModel.entries()) {
420
+ const totals = sumUsageRecords(recs, w);
421
+ modelBreakdowns.push({ name: modelName, totals });
422
+ }
423
+ modelBreakdowns.sort((a, b) => b.totals.recorded_total - a.totals.recorded_total);
424
+ if (modelBreakdowns.length > 0) {
425
+ modelsMutable[w.kind] = modelBreakdowns;
426
+ }
427
+ // projects breakdown per window for codex (based on extracted cwd)
428
+ const byProject = new Map();
429
+ for (const r of windowRecords) {
430
+ if (r.project === undefined || r.project.trim().length === 0)
431
+ continue;
432
+ const key = r.project;
433
+ const arr = byProject.get(key);
434
+ if (arr === undefined)
435
+ byProject.set(key, [r]);
436
+ else
437
+ arr.push(r);
438
+ }
439
+ if (byProject.size > 0) {
440
+ const projectBreakdowns = [];
441
+ for (const [projName, recs] of byProject.entries()) {
442
+ const totals = sumUsageRecords(recs, w);
443
+ projectBreakdowns.push({ name: projName, totals });
444
+ }
445
+ projectBreakdowns.sort((a, b) => b.totals.recorded_total - a.totals.recorded_total || a.name.localeCompare(b.name));
446
+ projectsMutable[w.kind] = projectBreakdowns;
447
+ }
448
+ }
449
+ const providersByWindow = providersMutable;
450
+ const modelsByWindow = modelsMutable;
451
+ const projectsByWindow = projectsMutable;
452
+ const finalCoverage = {
453
+ complete: mutable.errors.length === 0 && mutable.sessionsSkipped === 0,
454
+ sessionsDiscovered: mutable.sessionsDiscovered,
455
+ sessionsScanned: mutable.sessionsScanned,
456
+ sessionsSkipped: mutable.sessionsSkipped,
457
+ pagesRead: mutable.pagesRead,
458
+ jobsRetried: mutable.jobsRetried,
459
+ provisionalMessages: mutable.provisionalMessages,
460
+ errors: sortedErrors(mutable.errors),
461
+ };
462
+ const maybeModels = Object.keys(modelsByWindow).length > 0
463
+ ? { modelsByWindow, models: [...(modelsByWindow.week ?? modelsByWindow.day ?? modelsByWindow.hour ?? Object.values(modelsByWindow).flat())] }
464
+ : {};
465
+ const maybeProviders = Object.keys(providersByWindow).length > 0
466
+ ? { providersByWindow, providers: [...(providersByWindow.week ?? providersByWindow.day ?? providersByWindow.hour ?? Object.values(providersByWindow).flat())] }
467
+ : {};
468
+ const maybeProjects = Object.keys(projectsByWindow).length > 0
469
+ ? { projectsByWindow, projects: [...(projectsByWindow.week ?? projectsByWindow.day ?? projectsByWindow.hour ?? Object.values(projectsByWindow).flat())] }
470
+ : {};
471
+ return {
472
+ capturedAt: new Date(request.capturedAt.getTime()),
473
+ windows: request.windows.map((w) => ({
474
+ ...w,
475
+ from: new Date(w.from.getTime()),
476
+ to: new Date(w.to.getTime()),
477
+ })),
478
+ source: "codex",
479
+ records,
480
+ totalsByWindow,
481
+ ...maybeModels,
482
+ ...maybeProviders,
483
+ ...maybeProjects,
484
+ coverage: finalCoverage,
485
+ };
486
+ }
487
+ //# sourceMappingURL=scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../../src/codex/scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Internal Codex JSONL types. Not part of public domain contracts.
3
+ */
4
+ export interface CodexRawUsage {
5
+ readonly input_tokens?: number;
6
+ readonly cached_input_tokens?: number;
7
+ readonly cache_write_input_tokens?: number;
8
+ readonly output_tokens?: number;
9
+ readonly reasoning_output_tokens?: number;
10
+ readonly total_tokens?: number;
11
+ }
12
+ export interface CodexInfo {
13
+ readonly last_token_usage?: CodexRawUsage | null;
14
+ readonly total_token_usage?: CodexRawUsage | null;
15
+ readonly model?: string;
16
+ readonly model_name?: string;
17
+ }
18
+ export interface CodexEventPayload {
19
+ readonly type?: string;
20
+ readonly info?: CodexInfo;
21
+ readonly model?: string;
22
+ readonly model_name?: string;
23
+ readonly session_id?: string;
24
+ readonly cwd?: string;
25
+ readonly forked_from_id?: string;
26
+ }
27
+ export interface CodexEntry {
28
+ readonly type: string;
29
+ readonly timestamp?: string;
30
+ readonly payload?: CodexEventPayload | Record<string, unknown>;
31
+ }
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Internal Codex JSONL types. Not part of public domain contracts.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/codex/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,15 @@
1
+ import { type CollectionRequest, type CollectionResult, type OpenCodeTransport } from "../domain/index.js";
2
+ import type { CollectorOptions } from "./types.js";
3
+ export declare function collectUsageSerial(transport: OpenCodeTransport, request: CollectionRequest, options?: CollectorOptions): Promise<CollectionResult>;
4
+ export declare function collectUsageParallel(transport: OpenCodeTransport, request: CollectionRequest, options?: CollectorOptions): Promise<CollectionResult>;
5
+ export declare const collectSerial: typeof collectUsageSerial;
6
+ export declare const collectParallel: typeof collectUsageParallel;
7
+ export type { CollectorOptions } from "./types.js";
8
+ export declare class UsageCollector {
9
+ private readonly transport;
10
+ private readonly options;
11
+ constructor(transport: OpenCodeTransport, options?: CollectorOptions);
12
+ collectSerial(request: CollectionRequest): Promise<CollectionResult>;
13
+ collectParallel(request: CollectionRequest): Promise<CollectionResult>;
14
+ collect(request: CollectionRequest, mode?: "serial" | "parallel"): Promise<CollectionResult>;
15
+ }