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,552 @@
1
+ import { basename } from "node:path";
2
+ import { statSync } from "node:fs";
3
+ import { createRequire } from "node:module";
4
+ import { containsInstant, createUsageRecord, sumUsageRecords } from "../domain/index.js";
5
+ import { UsageRecordReducer } from "../accounting/reducer.js";
6
+ import { DomainError, cancellationError, isCancellationError, toCollectionError, } from "../domain/index.js";
7
+ import { discoverAntigravityDatabases } from "./discovery.js";
8
+ import { antigravitySqliteCreatedAt, antigravitySqliteModel, antigravitySqliteResponseId, firstProtoField, parseProtoFields, protoFieldBytes, protoFieldPositiveInteger, } from "./proto.js";
9
+ // SQLite driver lazy loading — mirrors codeburn loadDriver/isSqliteAvailable
10
+ let CachedDatabaseSync = undefined;
11
+ let loadAttempted = false;
12
+ let loadError = null;
13
+ function getDatabaseSync() {
14
+ if (CachedDatabaseSync !== undefined) {
15
+ return CachedDatabaseSync;
16
+ }
17
+ if (loadAttempted) {
18
+ return CachedDatabaseSync ?? null;
19
+ }
20
+ loadAttempted = true;
21
+ try {
22
+ const require = createRequire(import.meta.url);
23
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
24
+ const mod = require("node:sqlite");
25
+ CachedDatabaseSync = mod.DatabaseSync ?? null;
26
+ loadError = null;
27
+ }
28
+ catch (error) {
29
+ CachedDatabaseSync = null;
30
+ loadError = error instanceof Error ? error.message : String(error);
31
+ }
32
+ return CachedDatabaseSync;
33
+ }
34
+ export function isSqliteAvailable() {
35
+ return getDatabaseSync() !== null;
36
+ }
37
+ function getSqliteLoadError() {
38
+ return loadError ?? "node:sqlite unavailable";
39
+ }
40
+ function isSqliteBusyError(error) {
41
+ const e = error;
42
+ if (e === null || typeof e !== "object") {
43
+ return false;
44
+ }
45
+ const code = typeof e.code === "string" ? e.code : "";
46
+ const errcode = typeof e.errcode === "number" ? e.errcode : null;
47
+ const message = [
48
+ typeof e.message === "string" ? e.message : "",
49
+ typeof e.errstr === "string" ? e.errstr : "",
50
+ ].join(" ");
51
+ return (errcode === 5 ||
52
+ errcode === 6 ||
53
+ code === "SQLITE_BUSY" ||
54
+ code === "SQLITE_LOCKED" ||
55
+ /\bSQLITE_(BUSY|LOCKED)\b|database (?:is |table is )?locked/i.test(message));
56
+ }
57
+ function assertNotAborted(signal) {
58
+ if (signal?.aborted) {
59
+ const reason = signal.reason;
60
+ throw cancellationError(reason instanceof Error ? reason.message : undefined);
61
+ }
62
+ }
63
+ function sortedErrors(errors) {
64
+ return [...errors].sort((a, b) => (String(a.sessionID ?? "") + "\0" + a.code + "\0" + a.message).localeCompare(String(b.sessionID ?? "") + "\0" + b.code + "\0" + b.message));
65
+ }
66
+ function normalizeDataBytes(value) {
67
+ if (value instanceof Uint8Array) {
68
+ return value;
69
+ }
70
+ if (typeof value === "string") {
71
+ return new TextEncoder().encode(value);
72
+ }
73
+ if (value !== null && typeof value === "object" && "buffer" in value) {
74
+ // Node Buffer fallback
75
+ try {
76
+ const buf = value;
77
+ return new Uint8Array(buf.buffer ?? buf, buf.byteOffset ?? 0, buf.length ?? 0);
78
+ }
79
+ catch {
80
+ return null;
81
+ }
82
+ }
83
+ return null;
84
+ }
85
+ /**
86
+ * Native Antigravity SQLite scanner — no codeburn dependency.
87
+ * Mirrors codeburn `buildCallFromSqliteGenMetadataRow` (dist/main.js:17240)
88
+ * and surrounding DB open/query logic (dist/main.js:7688).
89
+ */
90
+ export async function collectAntigravity(request) {
91
+ assertNotAborted(request.signal);
92
+ if (request.windows.length === 0) {
93
+ throw new DomainError("invalid-window", "Collection request must contain at least one usage window");
94
+ }
95
+ const dbFiles = discoverAntigravityDatabases();
96
+ // Early exit if node:sqlite unavailable — matches T3 spec
97
+ if (!isSqliteAvailable()) {
98
+ assertNotAborted(request.signal);
99
+ const emptyRecords = [];
100
+ const totalsByWindow = Object.fromEntries(request.windows.map((w) => [w.kind, sumUsageRecords(emptyRecords, w)]));
101
+ const coverage = {
102
+ complete: false,
103
+ sessionsDiscovered: dbFiles.length,
104
+ sessionsScanned: 0,
105
+ sessionsSkipped: dbFiles.length > 0 ? dbFiles.length : 0,
106
+ pagesRead: 0,
107
+ jobsRetried: 0,
108
+ provisionalMessages: 0,
109
+ errors: [
110
+ {
111
+ code: "unknown",
112
+ message: getSqliteLoadError(),
113
+ retryable: false,
114
+ },
115
+ ],
116
+ };
117
+ return {
118
+ capturedAt: new Date(request.capturedAt.getTime()),
119
+ windows: request.windows.map((w) => ({
120
+ ...w,
121
+ from: new Date(w.from.getTime()),
122
+ to: new Date(w.to.getTime()),
123
+ })),
124
+ source: "antigravity",
125
+ records: emptyRecords,
126
+ totalsByWindow,
127
+ coverage,
128
+ };
129
+ }
130
+ const mutable = {
131
+ sessionsDiscovered: dbFiles.length,
132
+ sessionsScanned: 0,
133
+ sessionsSkipped: 0,
134
+ pagesRead: 0,
135
+ jobsRetried: 0,
136
+ provisionalMessages: 0,
137
+ errors: [],
138
+ };
139
+ const reducer = new UsageRecordReducer();
140
+ if (dbFiles.length === 0) {
141
+ assertNotAborted(request.signal);
142
+ const records = reducer.records();
143
+ const totalsByWindow = Object.fromEntries(request.windows.map((w) => [w.kind, sumUsageRecords(records, w)]));
144
+ const coverage = {
145
+ complete: true,
146
+ sessionsDiscovered: 0,
147
+ sessionsScanned: 0,
148
+ sessionsSkipped: 0,
149
+ pagesRead: 0,
150
+ jobsRetried: 0,
151
+ provisionalMessages: 0,
152
+ errors: [],
153
+ };
154
+ return {
155
+ capturedAt: new Date(request.capturedAt.getTime()),
156
+ windows: request.windows.map((w) => ({
157
+ ...w,
158
+ from: new Date(w.from.getTime()),
159
+ to: new Date(w.to.getTime()),
160
+ })),
161
+ source: "antigravity",
162
+ records,
163
+ totalsByWindow,
164
+ coverage,
165
+ };
166
+ }
167
+ const DatabaseSync = getDatabaseSync();
168
+ // Should be non-null due to earlier check, but guard for race
169
+ if (DatabaseSync === null) {
170
+ const emptyRecords = [];
171
+ const totalsByWindow = Object.fromEntries(request.windows.map((w) => [w.kind, sumUsageRecords(emptyRecords, w)]));
172
+ const coverage = {
173
+ complete: false,
174
+ sessionsDiscovered: dbFiles.length,
175
+ sessionsScanned: 0,
176
+ sessionsSkipped: dbFiles.length,
177
+ pagesRead: 0,
178
+ jobsRetried: 0,
179
+ provisionalMessages: 0,
180
+ errors: [{ code: "unknown", message: getSqliteLoadError(), retryable: false }],
181
+ };
182
+ return {
183
+ capturedAt: new Date(request.capturedAt.getTime()),
184
+ windows: request.windows.map((w) => ({
185
+ ...w,
186
+ from: new Date(w.from.getTime()),
187
+ to: new Date(w.to.getTime()),
188
+ })),
189
+ source: "antigravity",
190
+ records: emptyRecords,
191
+ totalsByWindow,
192
+ coverage,
193
+ };
194
+ }
195
+ for (const filePath of dbFiles) {
196
+ assertNotAborted(request.signal);
197
+ const cascadeId = basename(filePath, ".db");
198
+ // Fallback timestamp via file mtime (assignStableTimestamps behavior)
199
+ let fallbackTimestampIso;
200
+ let fallbackDate;
201
+ try {
202
+ const stat = statSync(filePath);
203
+ fallbackDate = new Date(stat.mtimeMs);
204
+ fallbackTimestampIso = fallbackDate.toISOString();
205
+ }
206
+ catch {
207
+ fallbackDate = undefined;
208
+ fallbackTimestampIso = undefined;
209
+ }
210
+ let db = null;
211
+ // Open readonly DB — pragma busy_timeout mirrors codeburn openDatabase
212
+ try {
213
+ db = new DatabaseSync(filePath, { readOnly: true });
214
+ try {
215
+ // Best effort; some sqlite builds lack exec
216
+ db.exec?.("PRAGMA busy_timeout = 1000");
217
+ }
218
+ catch {
219
+ // ignore pragma errors
220
+ }
221
+ }
222
+ catch (error) {
223
+ if (isCancellationError(error)) {
224
+ throw cancellationError();
225
+ }
226
+ if (isSqliteBusyError(error)) {
227
+ // Retry once
228
+ let retried = false;
229
+ try {
230
+ // Small retry after busy; not sleeping to avoid latency
231
+ db = new DatabaseSync(filePath, { readOnly: true });
232
+ try {
233
+ db.exec?.("PRAGMA busy_timeout = 1000");
234
+ }
235
+ catch {
236
+ // ignore
237
+ }
238
+ retried = true;
239
+ }
240
+ catch (retryError) {
241
+ if (isCancellationError(retryError)) {
242
+ throw cancellationError();
243
+ }
244
+ mutable.sessionsSkipped += 1;
245
+ mutable.errors.push(toCollectionError(retryError, "unknown", cascadeId));
246
+ continue;
247
+ }
248
+ if (!retried) {
249
+ mutable.sessionsSkipped += 1;
250
+ mutable.errors.push(toCollectionError(error, "unknown", cascadeId));
251
+ continue;
252
+ }
253
+ // fall through to query with retried db
254
+ }
255
+ else {
256
+ mutable.sessionsSkipped += 1;
257
+ mutable.errors.push(toCollectionError(error, "unknown", cascadeId));
258
+ continue;
259
+ }
260
+ }
261
+ if (db === null) {
262
+ mutable.sessionsSkipped += 1;
263
+ mutable.errors.push(toCollectionError(new Error("Failed to open database"), "unknown", cascadeId));
264
+ continue;
265
+ }
266
+ let rows;
267
+ try {
268
+ const stmt = db.prepare("SELECT idx, data FROM gen_metadata ORDER BY idx");
269
+ // stmt.all returns rows; for readonly we pass no params
270
+ rows = stmt.all();
271
+ mutable.pagesRead += 1;
272
+ }
273
+ catch (error) {
274
+ if (isCancellationError(error)) {
275
+ try {
276
+ db.close();
277
+ }
278
+ catch {
279
+ // ignore
280
+ }
281
+ throw cancellationError();
282
+ }
283
+ if (isSqliteBusyError(error)) {
284
+ mutable.sessionsSkipped += 1;
285
+ // retry once
286
+ try {
287
+ // Re-open and retry query once
288
+ try {
289
+ db.close();
290
+ }
291
+ catch {
292
+ // ignore
293
+ }
294
+ const retryDb = new DatabaseSync(filePath, { readOnly: true });
295
+ try {
296
+ retryDb.exec?.("PRAGMA busy_timeout = 1000");
297
+ }
298
+ catch {
299
+ // ignore
300
+ }
301
+ const retryStmt = retryDb.prepare("SELECT idx, data FROM gen_metadata ORDER BY idx");
302
+ rows = retryStmt.all();
303
+ mutable.jobsRetried += 1;
304
+ mutable.pagesRead += 1;
305
+ try {
306
+ retryDb.close();
307
+ }
308
+ catch {
309
+ // ignore
310
+ }
311
+ // continue to row processing with retry rows
312
+ db = null; // already closed retryDb, prevent double close
313
+ }
314
+ catch (retryError) {
315
+ if (isCancellationError(retryError)) {
316
+ throw cancellationError();
317
+ }
318
+ mutable.errors.push(toCollectionError(retryError, "unknown", cascadeId));
319
+ try {
320
+ db?.close();
321
+ }
322
+ catch {
323
+ // ignore
324
+ }
325
+ continue;
326
+ }
327
+ }
328
+ else {
329
+ mutable.sessionsSkipped += 1;
330
+ mutable.errors.push(toCollectionError(error, "unknown", cascadeId));
331
+ try {
332
+ db?.close();
333
+ }
334
+ catch {
335
+ // ignore
336
+ }
337
+ continue;
338
+ }
339
+ }
340
+ finally {
341
+ // For non-busy-retry path, close after query; for retry success we already handled.
342
+ // We need to handle both cases: if db still open, close after row processing.
343
+ // So defer close until after row loop for normal path.
344
+ }
345
+ // If we retried successfully, rows is already set and db is null (closed). Create a new db handle not needed.
346
+ // For normal path, db is still open; we will close after processing.
347
+ const shouldCloseDb = db !== null;
348
+ // Process rows
349
+ let fileHadRows = false;
350
+ let fileHadError = false;
351
+ try {
352
+ for (const row of rows) {
353
+ assertNotAborted(request.signal);
354
+ const idx = typeof row.idx === "number" ? row.idx : Number(row.idx);
355
+ const dataBytes = normalizeDataBytes(row.data);
356
+ if (dataBytes === null) {
357
+ continue;
358
+ }
359
+ const rootFields = parseProtoFields(dataBytes);
360
+ const chatBytes = protoFieldBytes(firstProtoField(rootFields, 1));
361
+ const chatFields = parseProtoFields(chatBytes ?? new Uint8Array());
362
+ const usageBytes = protoFieldBytes(firstProtoField(chatFields, 4));
363
+ const usageFields = parseProtoFields(usageBytes ?? new Uint8Array());
364
+ if (usageFields.length === 0) {
365
+ continue;
366
+ }
367
+ const inputTokens = protoFieldPositiveInteger(firstProtoField(usageFields, 2)) ||
368
+ protoFieldPositiveInteger(firstProtoField(usageFields, 1));
369
+ const totalOutputTokens = protoFieldPositiveInteger(firstProtoField(usageFields, 3));
370
+ let responseTokens = protoFieldPositiveInteger(firstProtoField(usageFields, 9));
371
+ let thinkingTokens = protoFieldPositiveInteger(firstProtoField(usageFields, 10));
372
+ // Adjust logic mirrors codeburn buildCallFromSqliteGenMetadataRow:17255
373
+ if (responseTokens === 0 && thinkingTokens === 0) {
374
+ responseTokens = totalOutputTokens;
375
+ }
376
+ else if (totalOutputTokens > 0 && responseTokens + thinkingTokens !== totalOutputTokens) {
377
+ const adjustedResponseTokens = totalOutputTokens - thinkingTokens;
378
+ if (adjustedResponseTokens >= 0) {
379
+ responseTokens = adjustedResponseTokens;
380
+ }
381
+ }
382
+ if (inputTokens === 0 && totalOutputTokens === 0) {
383
+ continue;
384
+ }
385
+ const responseId = antigravitySqliteResponseId(usageFields, String(idx));
386
+ const model = antigravitySqliteModel(chatFields);
387
+ let createdAt = null;
388
+ const timestampIso = antigravitySqliteCreatedAt(chatFields);
389
+ if (timestampIso) {
390
+ const parsed = new Date(timestampIso);
391
+ if (!Number.isNaN(parsed.getTime())) {
392
+ createdAt = parsed;
393
+ }
394
+ }
395
+ if (createdAt === null && fallbackDate !== undefined && !Number.isNaN(fallbackDate.getTime())) {
396
+ createdAt = new Date(fallbackDate.getTime());
397
+ }
398
+ if (createdAt === null) {
399
+ // No usable timestamp — skip record but count as error?
400
+ fileHadError = true;
401
+ mutable.errors.push(toCollectionError(new DomainError("invalid-data", "Missing timestamp in gen_metadata row", { sessionID: cascadeId }), "invalid-data", cascadeId));
402
+ continue;
403
+ }
404
+ // Window filter — in-memory containsInstant
405
+ const inWindow = request.windows.some((w) => containsInstant(w, createdAt));
406
+ if (!inWindow) {
407
+ continue;
408
+ }
409
+ const deduplicationKey = `antigravity:${cascadeId}:${responseId}`;
410
+ try {
411
+ const record = createUsageRecord({
412
+ sessionID: cascadeId,
413
+ messageID: responseId,
414
+ createdAt,
415
+ model,
416
+ tokens: {
417
+ input: inputTokens,
418
+ output: responseTokens,
419
+ reasoning: thinkingTokens,
420
+ cacheRead: 0,
421
+ cacheWrite: 0,
422
+ },
423
+ observedAt: new Date(request.capturedAt.getTime()),
424
+ completeness: "final",
425
+ provider: "antigravity",
426
+ tokenRevision: deduplicationKey,
427
+ });
428
+ reducer.upsert(record);
429
+ fileHadRows = true;
430
+ }
431
+ catch (error) {
432
+ if (isCancellationError(error)) {
433
+ throw cancellationError();
434
+ }
435
+ fileHadError = true;
436
+ mutable.errors.push(toCollectionError(error, "invalid-data", cascadeId));
437
+ }
438
+ }
439
+ }
440
+ finally {
441
+ if (shouldCloseDb) {
442
+ try {
443
+ db.close();
444
+ }
445
+ catch {
446
+ // ignore close errors; if busy, count as skipped
447
+ }
448
+ }
449
+ }
450
+ if (fileHadRows && !fileHadError) {
451
+ mutable.sessionsScanned += 1;
452
+ }
453
+ else if (fileHadError) {
454
+ mutable.sessionsSkipped += 1;
455
+ }
456
+ else {
457
+ // No rows but successful query counts as scanned (empty db)
458
+ mutable.sessionsScanned += 1;
459
+ }
460
+ }
461
+ assertNotAborted(request.signal);
462
+ const records = reducer.records();
463
+ const totalsByWindow = Object.fromEntries(request.windows.map((w) => [w.kind, sumUsageRecords(records, w)]));
464
+ // Provider / model breakdowns per window (mirrors codex scanner)
465
+ const providersMutable = {};
466
+ const modelsMutable = {};
467
+ const projectsMutable = {};
468
+ for (const w of request.windows) {
469
+ const windowRecords = records.filter((r) => containsInstant(w, r.createdAt));
470
+ if (windowRecords.length === 0) {
471
+ continue;
472
+ }
473
+ const antigravityTotals = sumUsageRecords(windowRecords, w);
474
+ providersMutable[w.kind] = [{ name: "antigravity", provider: "antigravity", totals: antigravityTotals }];
475
+ const byModel = new Map();
476
+ for (const r of windowRecords) {
477
+ const key = r.model;
478
+ const arr = byModel.get(key);
479
+ if (arr === undefined)
480
+ byModel.set(key, [r]);
481
+ else
482
+ arr.push(r);
483
+ }
484
+ const modelBreakdowns = [];
485
+ for (const [modelName, recs] of byModel.entries()) {
486
+ const totals = sumUsageRecords(recs, w);
487
+ modelBreakdowns.push({ name: modelName, totals });
488
+ }
489
+ modelBreakdowns.sort((a, b) => b.totals.recorded_total - a.totals.recorded_total);
490
+ if (modelBreakdowns.length > 0) {
491
+ modelsMutable[w.kind] = modelBreakdowns;
492
+ }
493
+ const byProject = new Map();
494
+ for (const r of windowRecords) {
495
+ if (r.project === undefined || r.project.trim().length === 0)
496
+ continue;
497
+ const key = r.project;
498
+ const arr = byProject.get(key);
499
+ if (arr === undefined)
500
+ byProject.set(key, [r]);
501
+ else
502
+ arr.push(r);
503
+ }
504
+ if (byProject.size > 0) {
505
+ const projectBreakdowns = [];
506
+ for (const [projName, recs] of byProject.entries()) {
507
+ const totals = sumUsageRecords(recs, w);
508
+ projectBreakdowns.push({ name: projName, totals });
509
+ }
510
+ projectBreakdowns.sort((a, b) => b.totals.recorded_total - a.totals.recorded_total || a.name.localeCompare(b.name));
511
+ projectsMutable[w.kind] = projectBreakdowns;
512
+ }
513
+ }
514
+ const providersByWindow = providersMutable;
515
+ const modelsByWindow = modelsMutable;
516
+ const projectsByWindow = projectsMutable;
517
+ const finalCoverage = {
518
+ complete: mutable.errors.length === 0 && mutable.sessionsSkipped === 0,
519
+ sessionsDiscovered: mutable.sessionsDiscovered,
520
+ sessionsScanned: mutable.sessionsScanned,
521
+ sessionsSkipped: mutable.sessionsSkipped,
522
+ pagesRead: mutable.pagesRead,
523
+ jobsRetried: mutable.jobsRetried,
524
+ provisionalMessages: mutable.provisionalMessages,
525
+ errors: sortedErrors(mutable.errors),
526
+ };
527
+ const maybeModels = Object.keys(modelsByWindow).length > 0
528
+ ? { modelsByWindow, models: [...(modelsByWindow.week ?? modelsByWindow.day ?? modelsByWindow.hour ?? Object.values(modelsByWindow).flat())] }
529
+ : {};
530
+ const maybeProviders = Object.keys(providersByWindow).length > 0
531
+ ? { providersByWindow, providers: [...(providersByWindow.week ?? providersByWindow.day ?? providersByWindow.hour ?? Object.values(providersByWindow).flat())] }
532
+ : {};
533
+ const maybeProjects = Object.keys(projectsByWindow).length > 0
534
+ ? { projectsByWindow, projects: [...(projectsByWindow.week ?? projectsByWindow.day ?? projectsByWindow.hour ?? Object.values(projectsByWindow).flat())] }
535
+ : {};
536
+ return {
537
+ capturedAt: new Date(request.capturedAt.getTime()),
538
+ windows: request.windows.map((w) => ({
539
+ ...w,
540
+ from: new Date(w.from.getTime()),
541
+ to: new Date(w.to.getTime()),
542
+ })),
543
+ source: "antigravity",
544
+ records,
545
+ totalsByWindow,
546
+ ...maybeModels,
547
+ ...maybeProviders,
548
+ ...maybeProjects,
549
+ coverage: finalCoverage,
550
+ };
551
+ }
552
+ //# sourceMappingURL=scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../../src/antigravity/scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ import { type CollectionRequest, type CollectionResult, type UsageSource, type ProviderKind } from "./domain/index.js";
2
+ import { type CollectorOptions } from "./collector/index.js";
3
+ import { type NormalizedCacheStore } from "./cache/index.js";
4
+ import { type OpenCode2Adapter, type OpenCodeAdapterOptions } from "./opencode/index.js";
5
+ /** The default is intentionally explicit so a second CLI instance is safe. */
6
+ export declare function defaultCacheDirectory(): string;
7
+ /**
8
+ * Selects exactly one accounting source for a refresh. Stats is used only if
9
+ * every requested range is honored; a broader/ignored range switches the
10
+ * whole refresh to the message scan and never combines the two totals.
11
+ */
12
+ export declare class HybridUsageSource implements UsageSource {
13
+ readonly adapter: OpenCode2Adapter;
14
+ readonly collectorOptions: CollectorOptions;
15
+ private statsUnsupportedFingerprint;
16
+ constructor(adapter: OpenCode2Adapter, collectorOptions?: CollectorOptions);
17
+ private connectIfNeeded;
18
+ private fallback;
19
+ collect(request: CollectionRequest): Promise<CollectionResult>;
20
+ }
21
+ export declare class CodexFileSource implements UsageSource {
22
+ private readonly directory?;
23
+ constructor(directory?: string | undefined);
24
+ collect(request: CollectionRequest): Promise<CollectionResult>;
25
+ }
26
+ export declare class AntigravityFileSource implements UsageSource {
27
+ private readonly directory?;
28
+ constructor(directory?: string | undefined);
29
+ collect(request: CollectionRequest): Promise<CollectionResult>;
30
+ }
31
+ export interface UnifiedUsageSourceOptions {
32
+ readonly filterProviders?: Set<ProviderKind>;
33
+ }
34
+ export declare class UnifiedUsageSource implements UsageSource {
35
+ readonly opencode: UsageSource;
36
+ readonly codex: UsageSource;
37
+ readonly antigravity: UsageSource;
38
+ private filterProviders;
39
+ constructor(opencode: UsageSource, codex: UsageSource, antigravity: UsageSource, options?: UnifiedUsageSourceOptions);
40
+ getFilterProviders(): Set<ProviderKind> | undefined;
41
+ setFilterProviders(filter?: Set<ProviderKind>): void;
42
+ collect(request: CollectionRequest): Promise<CollectionResult>;
43
+ }
44
+ /** Persist successful normalized metadata without making the cache a source of truth. */
45
+ export declare class CachedUsageSource implements UsageSource {
46
+ readonly source: UsageSource;
47
+ readonly store: NormalizedCacheStore;
48
+ constructor(source: UsageSource, store: NormalizedCacheStore);
49
+ getFilterProviders(): Set<ProviderKind> | undefined;
50
+ setFilterProviders(filter?: Set<ProviderKind>): void;
51
+ get innerSource(): UsageSource;
52
+ collect(request: CollectionRequest): Promise<CollectionResult>;
53
+ }
54
+ export interface CachedSnapshotResult {
55
+ readonly snapshot: CollectionResult | undefined;
56
+ readonly store: NormalizedCacheStore;
57
+ }
58
+ export declare function readCachedSnapshot(directory?: string): Promise<CachedSnapshotResult>;
59
+ export declare function newCollectionRequest(now: Date, timezone: string, options?: Pick<CollectionRequest, "project" | "includeSubagents" | "includeProvisional" | "signal">): CollectionRequest;
60
+ export declare function emptyCollectionResult(now: Date, timezone: string): CollectionResult;
61
+ export interface ApplicationOptions extends OpenCodeAdapterOptions {
62
+ readonly cacheDirectory?: string;
63
+ readonly collectorOptions?: CollectorOptions;
64
+ readonly codexDirectory?: string;
65
+ readonly antigravityDirectory?: string;
66
+ readonly filterProviders?: Set<ProviderKind>;
67
+ }
68
+ export declare function createApplicationSource(options?: ApplicationOptions): {
69
+ readonly adapter: OpenCode2Adapter;
70
+ readonly unified: UnifiedUsageSource;
71
+ readonly source: CachedUsageSource;
72
+ readonly store: NormalizedCacheStore;
73
+ };