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,597 @@
1
+ import { DomainError, cancellationError, isCancellationError, toCollectionError, } from "../domain/index.js";
2
+ import { createUsageRecord, sumUsageRecords, tokenRevisionFor, validateTokenComponents, } from "../domain/index.js";
3
+ import { UsageRecordReducer } from "../accounting/reducer.js";
4
+ import { intervalUnion } from "./types.js";
5
+ const DEFAULT_PAGE_LIMIT = 100;
6
+ const DEFAULT_MAX_RETRIES = 2;
7
+ const DEFAULT_MAX_WORKERS = 4;
8
+ const MAX_WORKERS = 32;
9
+ const MAX_PAGE_LIMIT = 1_000;
10
+ function assertNotAborted(signal) {
11
+ if (!signal.aborted)
12
+ return;
13
+ const reason = signal.reason;
14
+ throw cancellationError(reason instanceof Error ? reason.message : undefined);
15
+ }
16
+ function validInterval(interval) {
17
+ const from = interval.from instanceof Date ? interval.from.getTime() : Number.NaN;
18
+ const to = interval.to instanceof Date ? interval.to.getTime() : Number.NaN;
19
+ if (!Number.isFinite(from) || !Number.isFinite(to) || from >= to) {
20
+ throw new DomainError("invalid-window", "Collection interval must have valid from < to instants");
21
+ }
22
+ return { from: new Date(from), to: new Date(to) };
23
+ }
24
+ function positiveInteger(value, fallback, name) {
25
+ const result = value ?? fallback;
26
+ if (!Number.isSafeInteger(result) || result <= 0) {
27
+ throw new RangeError(name + " must be a positive safe integer");
28
+ }
29
+ return result;
30
+ }
31
+ function resolvedOptions(defaults) {
32
+ const pageLimit = positiveInteger(defaults.pageLimit, DEFAULT_PAGE_LIMIT, "pageLimit");
33
+ const maxRetries = defaults.maxRetries ?? DEFAULT_MAX_RETRIES;
34
+ const retryDelayMs = defaults.retryDelayMs ?? 0;
35
+ const maxWorkers = defaults.maxWorkers ?? 4;
36
+ if (!Number.isSafeInteger(maxRetries) || maxRetries < 0) {
37
+ throw new RangeError("maxRetries must be a non-negative safe integer");
38
+ }
39
+ if (!Number.isFinite(retryDelayMs) || retryDelayMs < 0) {
40
+ throw new RangeError("retryDelayMs must be a finite non-negative number");
41
+ }
42
+ if (!Number.isSafeInteger(maxWorkers) || maxWorkers <= 0 || maxWorkers > MAX_WORKERS) {
43
+ throw new RangeError("maxWorkers must be between 1 and " + MAX_WORKERS);
44
+ }
45
+ if (pageLimit > MAX_PAGE_LIMIT) {
46
+ throw new RangeError("pageLimit must not exceed " + MAX_PAGE_LIMIT);
47
+ }
48
+ return { pageLimit, maxRetries, retryDelayMs, maxWorkers };
49
+ }
50
+ function sessionIDOf(session) {
51
+ const id = session.id ?? session.sessionID;
52
+ if (typeof id !== "string" || id.trim().length === 0) {
53
+ throw new DomainError("invalid-data", "Session page contained a session without an id");
54
+ }
55
+ return id;
56
+ }
57
+ function pageItems(raw, names) {
58
+ if (Array.isArray(raw))
59
+ return raw;
60
+ if (typeof raw !== "object" || raw === null) {
61
+ throw new DomainError("invalid-data", "OpenCode returned a non-object page");
62
+ }
63
+ const record = raw;
64
+ for (const name of names) {
65
+ if (name in record) {
66
+ if (!Array.isArray(record[name])) {
67
+ throw new DomainError("invalid-data", name + " must be an array");
68
+ }
69
+ return record[name];
70
+ }
71
+ }
72
+ throw new DomainError("invalid-data", "OpenCode page did not contain an item array");
73
+ }
74
+ function pageCursor(raw) {
75
+ if (typeof raw !== "object" || raw === null || Array.isArray(raw))
76
+ return undefined;
77
+ const record = raw;
78
+ if ("nextCursor" in record) {
79
+ const next = record.nextCursor;
80
+ if (next === null || next === undefined || next === "")
81
+ return undefined;
82
+ if (typeof next !== "string") {
83
+ throw new DomainError("invalid-data", "nextCursor must be a string or null");
84
+ }
85
+ return next;
86
+ }
87
+ if (!("cursor" in record) || record.cursor === null || record.cursor === undefined || record.cursor === "") {
88
+ return undefined;
89
+ }
90
+ if (typeof record.cursor === "string")
91
+ return record.cursor;
92
+ if (typeof record.cursor !== "object" || Array.isArray(record.cursor)) {
93
+ throw new DomainError("invalid-data", "cursor must be a string, object, or null");
94
+ }
95
+ const next = record.cursor.next;
96
+ if (next === null || next === undefined || next === "")
97
+ return undefined;
98
+ if (typeof next !== "string") {
99
+ throw new DomainError("invalid-data", "cursor.next must be a string or null");
100
+ }
101
+ return next;
102
+ }
103
+ function normalizeSessionPage(raw) {
104
+ return {
105
+ items: pageItems(raw, ["data", "sessions", "items"]),
106
+ nextCursor: pageCursor(raw),
107
+ };
108
+ }
109
+ function normalizeMessagePage(raw) {
110
+ return {
111
+ items: pageItems(raw, ["data", "messages", "items"]),
112
+ nextCursor: pageCursor(raw),
113
+ };
114
+ }
115
+ function statusOf(error) {
116
+ if (typeof error !== "object" || error === null)
117
+ return undefined;
118
+ const value = error;
119
+ const candidates = [
120
+ value.status,
121
+ value.statusCode,
122
+ value.response?.status,
123
+ ];
124
+ return candidates.find((candidate) => typeof candidate === "number" && Number.isInteger(candidate));
125
+ }
126
+ function isRetryableReadError(error) {
127
+ if (isCancellationError(error))
128
+ return false;
129
+ if (error instanceof DomainError)
130
+ return error.retryable;
131
+ const status = statusOf(error);
132
+ if (status !== undefined) {
133
+ return status === 408 || status === 425 || status === 429 || status >= 500;
134
+ }
135
+ if (typeof error === "object" && error !== null) {
136
+ const value = error;
137
+ if (value.retryable === true)
138
+ return true;
139
+ if (typeof value.code === "string" &&
140
+ ["ECONNRESET", "ECONNREFUSED", "ETIMEDOUT", "EAI_AGAIN"].includes(value.code))
141
+ return true;
142
+ }
143
+ return error instanceof Error && /timeout|timed out|temporar|reset|network/i.test(error.message);
144
+ }
145
+ function sleepWithAbort(milliseconds, signal) {
146
+ if (milliseconds <= 0) {
147
+ assertNotAborted(signal);
148
+ return Promise.resolve();
149
+ }
150
+ return new Promise((resolve, reject) => {
151
+ const timer = setTimeout(resolve, milliseconds);
152
+ signal.addEventListener("abort", () => {
153
+ clearTimeout(timer);
154
+ reject(cancellationError());
155
+ }, { once: true });
156
+ });
157
+ }
158
+ async function readWithRetry(operation, signal, options, onRetry) {
159
+ for (let attempt = 0;; attempt += 1) {
160
+ assertNotAborted(signal);
161
+ try {
162
+ const value = await operation();
163
+ assertNotAborted(signal);
164
+ return value;
165
+ }
166
+ catch (error) {
167
+ if (isCancellationError(error) || signal.aborted)
168
+ throw cancellationError();
169
+ if (attempt >= options.maxRetries || !isRetryableReadError(error))
170
+ throw error;
171
+ onRetry();
172
+ await sleepWithAbort(options.retryDelayMs * 2 ** attempt, signal);
173
+ }
174
+ }
175
+ }
176
+ function addError(coverage, error, fallback = "transport", sessionID) {
177
+ coverage.errors.push(toCollectionError(error, fallback, sessionID));
178
+ }
179
+ function fallbackFor(error) {
180
+ if (error instanceof DomainError) {
181
+ if (error.code === "protocol")
182
+ return "protocol";
183
+ if (error.code === "invalid-data" || error.code === "missing-token-components" || error.code === "invalid-token-components") {
184
+ return "invalid-data";
185
+ }
186
+ }
187
+ return "transport";
188
+ }
189
+ function parseDate(value, field) {
190
+ if (value instanceof Date) {
191
+ if (!Number.isFinite(value.getTime())) {
192
+ throw new DomainError("invalid-data", field + " must be a valid date");
193
+ }
194
+ return new Date(value.getTime());
195
+ }
196
+ if (typeof value === "number") {
197
+ if (!Number.isFinite(value))
198
+ throw new DomainError("invalid-data", field + " must be finite");
199
+ const milliseconds = Math.abs(value) < 100_000_000_000 ? value * 1_000 : value;
200
+ const date = new Date(milliseconds);
201
+ if (!Number.isFinite(date.getTime())) {
202
+ throw new DomainError("invalid-data", field + " must be a valid date");
203
+ }
204
+ return date;
205
+ }
206
+ if (typeof value === "string") {
207
+ const date = new Date(value);
208
+ if (!Number.isFinite(date.getTime())) {
209
+ throw new DomainError("invalid-data", field + " must be a valid date");
210
+ }
211
+ return date;
212
+ }
213
+ throw new DomainError("invalid-data", field + " is required");
214
+ }
215
+ function messageType(message) {
216
+ // The shared OpenCodeTransport DTO has already filtered to assistant
217
+ // messages and therefore has messageID/createdAt but no raw `type` field.
218
+ const type = message.type ?? message.role ?? (message.messageID !== undefined ? "assistant" : undefined);
219
+ return typeof type === "string" ? type : undefined;
220
+ }
221
+ function modelName(message) {
222
+ if (typeof message.model === "string" && message.model.trim().length > 0)
223
+ return message.model;
224
+ if (typeof message.model === "object" && message.model !== null) {
225
+ const provider = message.model.providerID;
226
+ const model = message.model.id;
227
+ if (typeof provider === "string" && typeof model === "string" && provider && model) {
228
+ return provider + "/" + model;
229
+ }
230
+ if (typeof model === "string" && model)
231
+ return model;
232
+ }
233
+ return "unknown";
234
+ }
235
+ function isExplicitlyProvisional(message) {
236
+ return (message.provisional === true ||
237
+ message.completeness === "provisional" ||
238
+ ["streaming", "running", "pending", "incomplete"].includes(message.status ?? ""));
239
+ }
240
+ function projectForSession(session) {
241
+ const direct = session.project;
242
+ if (typeof direct === "string" && direct.trim().length > 0)
243
+ return direct.trim();
244
+ const pid = session.projectID;
245
+ if (typeof pid === "string" && pid.trim().length > 0) {
246
+ // Prefer directory when available for human readability, otherwise projectID
247
+ const dir = session.directory;
248
+ if (typeof dir === "string" && dir.trim().length > 0)
249
+ return dir.trim();
250
+ return pid.trim();
251
+ }
252
+ const dir = session.directory;
253
+ if (typeof dir === "string" && dir.trim().length > 0)
254
+ return dir.trim();
255
+ const location = session.location;
256
+ if (location !== null && typeof location === "object") {
257
+ const loc = location;
258
+ if (typeof loc.directory === "string" && loc.directory.trim().length > 0)
259
+ return loc.directory.trim();
260
+ }
261
+ return undefined;
262
+ }
263
+ function normalizeAssistantMessage(message, sessionID, observedAt, interval, observationOrdinal, project) {
264
+ const type = messageType(message);
265
+ if (type !== undefined && type !== "assistant")
266
+ return { provisional: false };
267
+ if (type === undefined) {
268
+ return {
269
+ provisional: true,
270
+ error: new DomainError("invalid-data", "Message page contained a message without a type"),
271
+ };
272
+ }
273
+ const messageID = message.id ?? message.messageID;
274
+ if (typeof messageID !== "string" || messageID.trim().length === 0) {
275
+ return {
276
+ provisional: true,
277
+ error: new DomainError("invalid-data", "Assistant message did not contain an id"),
278
+ };
279
+ }
280
+ let createdAt;
281
+ try {
282
+ createdAt = parseDate(message.time?.created ?? message.createdAt, "assistant.time.created");
283
+ }
284
+ catch (error) {
285
+ return {
286
+ provisional: true,
287
+ error: error instanceof DomainError
288
+ ? error
289
+ : new DomainError("invalid-data", "Assistant message date is invalid", { cause: error }),
290
+ };
291
+ }
292
+ if (createdAt.getTime() < interval.from.getTime() || createdAt.getTime() >= interval.to.getTime()) {
293
+ return { provisional: false };
294
+ }
295
+ const validation = validateTokenComponents(message.tokens);
296
+ if (!validation.ok)
297
+ return { provisional: true, error: validation.error };
298
+ const completeness = isExplicitlyProvisional(message) ? "provisional" : "final";
299
+ const rawRevision = message.tokenRevision ?? message.revision ?? message.version;
300
+ // The normalized domain DTO does not expose a server revision. A scan
301
+ // ordinal is therefore the deterministic newest-observation tie breaker for
302
+ // duplicate pages; an explicit transport revision remains authoritative.
303
+ const tokenRevision = rawRevision === undefined
304
+ ? "scan:" + String(observationOrdinal).padStart(12, "0") + ":" + tokenRevisionFor(validation.value, completeness)
305
+ : String(rawRevision);
306
+ try {
307
+ return {
308
+ provisional: completeness === "provisional",
309
+ record: createUsageRecord({
310
+ sessionID,
311
+ messageID,
312
+ createdAt,
313
+ model: modelName(message),
314
+ tokens: validation.value,
315
+ observedAt,
316
+ completeness,
317
+ tokenRevision,
318
+ ...(project === undefined ? {} : { project }),
319
+ }),
320
+ };
321
+ }
322
+ catch (error) {
323
+ return {
324
+ provisional: true,
325
+ error: error instanceof DomainError
326
+ ? error
327
+ : new DomainError("invalid-data", "Assistant message could not be normalized", { cause: error }),
328
+ };
329
+ }
330
+ }
331
+ async function discoverSessions(transport, request, signal, options, coverage) {
332
+ const sessions = new Map();
333
+ const addSessions = (items) => {
334
+ for (const item of items) {
335
+ const id = sessionIDOf(item);
336
+ if (!sessions.has(id)) {
337
+ sessions.set(id, item);
338
+ coverage.sessionsDiscovered += 1;
339
+ }
340
+ }
341
+ };
342
+ const enumerate = async (parentID, fetchPage) => {
343
+ let cursor;
344
+ const seenCursors = new Set();
345
+ try {
346
+ for (;;) {
347
+ assertNotAborted(signal);
348
+ const page = await readWithRetry(() => fetchPage({
349
+ ...(cursor === undefined ? {} : { cursor }),
350
+ limit: options.pageLimit,
351
+ ...(request.project === undefined ? {} : { project: request.project }),
352
+ signal,
353
+ ...(parentID === undefined ? {} : { parentID }),
354
+ }), signal, options, () => { coverage.jobsRetried += 1; });
355
+ coverage.pagesRead += 1;
356
+ const normalized = normalizeSessionPage(page);
357
+ addSessions(normalized.items);
358
+ if (normalized.nextCursor === undefined)
359
+ return;
360
+ if (seenCursors.has(normalized.nextCursor) || normalized.nextCursor === cursor) {
361
+ throw new DomainError("protocol", "Repeated session cursor: " + normalized.nextCursor);
362
+ }
363
+ seenCursors.add(normalized.nextCursor);
364
+ cursor = normalized.nextCursor;
365
+ }
366
+ }
367
+ catch (error) {
368
+ if (isCancellationError(error))
369
+ throw cancellationError();
370
+ addError(coverage, error, fallbackFor(error), parentID);
371
+ }
372
+ };
373
+ await enumerate(undefined, (input) => transport.listSessions(input));
374
+ const includeSubagents = request.includeSubagents !== false;
375
+ return [...sessions.values()]
376
+ .filter((session) => {
377
+ if (includeSubagents)
378
+ return true;
379
+ const parent = session.parentSessionID ?? session.parentID;
380
+ return typeof parent !== "string" || parent.length === 0;
381
+ })
382
+ .sort((left, right) => sessionIDOf(left).localeCompare(sessionIDOf(right)));
383
+ }
384
+ async function scanSession(transport, session, request, interval, observedAt, signal, options) {
385
+ const sessionID = sessionIDOf(session);
386
+ const project = projectForSession(session);
387
+ const records = [];
388
+ const errors = [];
389
+ let pagesRead = 0;
390
+ let jobsRetried = 0;
391
+ let provisionalMessages = 0;
392
+ let observationOrdinal = 0;
393
+ let cursor;
394
+ const seenCursors = new Set();
395
+ try {
396
+ for (;;) {
397
+ assertNotAborted(signal);
398
+ const page = await readWithRetry(() => {
399
+ const input = {
400
+ sessionID,
401
+ ...(cursor === undefined ? {} : { cursor }),
402
+ limit: options.pageLimit,
403
+ signal,
404
+ };
405
+ return transport.listMessages(input);
406
+ }, signal, options, () => { jobsRetried += 1; });
407
+ pagesRead += 1;
408
+ const normalized = normalizeMessagePage(page);
409
+ for (const message of normalized.items) {
410
+ const normalizedMessage = normalizeAssistantMessage(message, sessionID, observedAt, interval, observationOrdinal, project);
411
+ observationOrdinal += 1;
412
+ if (normalizedMessage.provisional)
413
+ provisionalMessages += 1;
414
+ if (normalizedMessage.error !== undefined) {
415
+ errors.push(toCollectionError(normalizedMessage.error, "invalid-data", sessionID));
416
+ }
417
+ if (normalizedMessage.record !== undefined)
418
+ records.push(normalizedMessage.record);
419
+ }
420
+ if (normalized.nextCursor === undefined)
421
+ break;
422
+ if (seenCursors.has(normalized.nextCursor) || normalized.nextCursor === cursor) {
423
+ throw new DomainError("protocol", "Repeated message cursor for " + sessionID + ": " + normalized.nextCursor, { sessionID });
424
+ }
425
+ seenCursors.add(normalized.nextCursor);
426
+ cursor = normalized.nextCursor;
427
+ }
428
+ }
429
+ catch (error) {
430
+ if (isCancellationError(error))
431
+ throw cancellationError();
432
+ errors.push(toCollectionError(error, fallbackFor(error), sessionID));
433
+ }
434
+ return { sessionID, records, pagesRead, jobsRetried, provisionalMessages, errors };
435
+ }
436
+ async function runWorkers(transport, sessions, request, interval, observedAt, signal, options, workers) {
437
+ const outcomes = new Array(sessions.length);
438
+ let nextIndex = 0;
439
+ async function worker() {
440
+ for (;;) {
441
+ assertNotAborted(signal);
442
+ const index = nextIndex;
443
+ nextIndex += 1;
444
+ if (index >= sessions.length)
445
+ return;
446
+ try {
447
+ outcomes[index] = await scanSession(transport, sessions[index], request, interval, observedAt, signal, options);
448
+ }
449
+ catch (error) {
450
+ if (isCancellationError(error))
451
+ throw cancellationError();
452
+ const sessionID = sessions[index]?.id ?? sessions[index]?.sessionID;
453
+ outcomes[index] = {
454
+ sessionID: typeof sessionID === "string" ? sessionID : "unknown",
455
+ records: [],
456
+ pagesRead: 0,
457
+ jobsRetried: 0,
458
+ provisionalMessages: 0,
459
+ errors: [toCollectionError(error, "unknown", typeof sessionID === "string" ? sessionID : undefined)],
460
+ };
461
+ }
462
+ }
463
+ }
464
+ const count = Math.min(workers, Math.max(1, sessions.length));
465
+ const settled = await Promise.allSettled(Array.from({ length: count }, () => worker()));
466
+ if (signal.aborted || settled.some((item) => item.status === "rejected" && isCancellationError(item.reason))) {
467
+ throw cancellationError();
468
+ }
469
+ return outcomes.filter((outcome) => outcome !== undefined);
470
+ }
471
+ function addOutcome(coverage, outcome) {
472
+ coverage.pagesRead += outcome.pagesRead;
473
+ coverage.jobsRetried += outcome.jobsRetried;
474
+ coverage.provisionalMessages += outcome.provisionalMessages;
475
+ coverage.errors.push(...outcome.errors);
476
+ if (outcome.errors.length === 0)
477
+ coverage.sessionsScanned += 1;
478
+ else
479
+ coverage.sessionsSkipped += 1;
480
+ }
481
+ function sortedErrors(errors) {
482
+ return [...errors].sort((left, right) => (String(left.sessionID ?? "") + "\0" + left.code + "\0" + left.message).localeCompare(String(right.sessionID ?? "") + "\0" + right.code + "\0" + right.message));
483
+ }
484
+ async function collectInternal(transport, request, defaults, workerCount) {
485
+ if (request.windows.length === 0) {
486
+ throw new DomainError("invalid-window", "Collection request must contain at least one usage window");
487
+ }
488
+ const interval = validInterval(intervalUnion(request.windows));
489
+ const observedAt = parseDate(request.capturedAt, "capturedAt");
490
+ const options = resolvedOptions(defaults);
491
+ const signal = request.signal ?? new AbortController().signal;
492
+ const coverage = {
493
+ sessionsDiscovered: 0,
494
+ sessionsScanned: 0,
495
+ sessionsSkipped: 0,
496
+ pagesRead: 0,
497
+ jobsRetried: 0,
498
+ provisionalMessages: 0,
499
+ errors: [],
500
+ };
501
+ assertNotAborted(signal);
502
+ const sessions = await discoverSessions(transport, request, signal, options, coverage);
503
+ assertNotAborted(signal);
504
+ const outcomes = await runWorkers(transport, sessions, request, interval, observedAt, signal, options, workerCount);
505
+ assertNotAborted(signal);
506
+ for (const outcome of outcomes)
507
+ addOutcome(coverage, outcome);
508
+ const reducer = new UsageRecordReducer();
509
+ for (const outcome of [...outcomes].sort((left, right) => left.sessionID.localeCompare(right.sessionID))) {
510
+ reducer.upsertMany(outcome.records);
511
+ }
512
+ const records = reducer.records();
513
+ const errors = sortedErrors(coverage.errors);
514
+ const finalCoverage = {
515
+ complete: errors.length === 0 && coverage.sessionsSkipped === 0,
516
+ sessionsDiscovered: coverage.sessionsDiscovered,
517
+ sessionsScanned: coverage.sessionsScanned,
518
+ sessionsSkipped: coverage.sessionsSkipped,
519
+ pagesRead: coverage.pagesRead,
520
+ jobsRetried: coverage.jobsRetried,
521
+ provisionalMessages: coverage.provisionalMessages,
522
+ errors,
523
+ };
524
+ // Project breakdowns per window (derived from records, similar to provider/model logic in UnifiedUsageSource)
525
+ const projectsMutable = {};
526
+ for (const w of request.windows) {
527
+ const windowRecords = records.filter((r) => r.project !== undefined && r.project.trim().length > 0 && (() => {
528
+ // containsInstant check
529
+ const t = r.createdAt.getTime();
530
+ return t >= w.from.getTime() && t < w.to.getTime();
531
+ })());
532
+ if (windowRecords.length === 0)
533
+ continue;
534
+ const byProject = new Map();
535
+ for (const r of windowRecords) {
536
+ const proj = r.project;
537
+ const arr = byProject.get(proj);
538
+ if (arr === undefined)
539
+ byProject.set(proj, [r]);
540
+ else
541
+ arr.push(r);
542
+ }
543
+ if (byProject.size > 0) {
544
+ const breakdowns = [];
545
+ for (const [projName, recs] of byProject.entries()) {
546
+ const totals = sumUsageRecords(recs, w, { includeProvisional: request.includeProvisional === true });
547
+ breakdowns.push({ name: projName, totals });
548
+ }
549
+ breakdowns.sort((a, b) => b.totals.recorded_total - a.totals.recorded_total || a.name.localeCompare(b.name));
550
+ projectsMutable[w.kind] = breakdowns;
551
+ }
552
+ }
553
+ const maybeProjects = Object.keys(projectsMutable).length > 0 ? { projectsByWindow: projectsMutable, projects: [...(projectsMutable.week ?? projectsMutable.day ?? projectsMutable.hour ?? Object.values(projectsMutable).flat())] } : {};
554
+ return {
555
+ capturedAt: observedAt,
556
+ windows: request.windows.map((window) => ({
557
+ ...window,
558
+ from: new Date(window.from.getTime()),
559
+ to: new Date(window.to.getTime()),
560
+ })),
561
+ source: "message-scan",
562
+ records,
563
+ totalsByWindow: Object.fromEntries(request.windows.map((window) => [
564
+ window.kind,
565
+ sumUsageRecords(records, window, { includeProvisional: request.includeProvisional === true }),
566
+ ])),
567
+ ...maybeProjects,
568
+ coverage: finalCoverage,
569
+ };
570
+ }
571
+ export async function collectUsageSerial(transport, request, options = {}) {
572
+ return collectInternal(transport, request, options, 1);
573
+ }
574
+ export async function collectUsageParallel(transport, request, options = {}) {
575
+ const workers = options.maxWorkers ?? DEFAULT_MAX_WORKERS;
576
+ return collectInternal(transport, request, options, workers);
577
+ }
578
+ export const collectSerial = collectUsageSerial;
579
+ export const collectParallel = collectUsageParallel;
580
+ export class UsageCollector {
581
+ transport;
582
+ options;
583
+ constructor(transport, options = {}) {
584
+ this.transport = transport;
585
+ this.options = options;
586
+ }
587
+ collectSerial(request) {
588
+ return collectUsageSerial(this.transport, request, this.options);
589
+ }
590
+ collectParallel(request) {
591
+ return collectUsageParallel(this.transport, request, this.options);
592
+ }
593
+ collect(request, mode = "parallel") {
594
+ return mode === "serial" ? this.collectSerial(request) : this.collectParallel(request);
595
+ }
596
+ }
597
+ //# sourceMappingURL=collector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collector.js","sourceRoot":"","sources":["../../../src/collector/collector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { UsageCollector, collectParallel, collectSerial, collectUsageParallel, collectUsageSerial, } from "./collector.js";
2
+ export type { CollectorOptions } from "./types.js";
3
+ export { intervalUnion, type AssistantMessage, type CollectionRequest, type CollectionResult, type Coverage, type ListMessagesRequest, type ListSessionsRequest, type MessagePage, type OpenCodeAssistantMessage, type OpenCodeSession, type OpenCodeTransport, type SessionPage, type SessionSummary, type UsageInterval, type UsageWindow, } from "./types.js";
@@ -0,0 +1,3 @@
1
+ export { UsageCollector, collectParallel, collectSerial, collectUsageParallel, collectUsageSerial, } from "./collector.js";
2
+ export { intervalUnion, } from "./types.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/collector/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,eAAe,EACf,aAAa,EACb,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,aAAa,GAed,MAAM,YAAY,CAAC"}