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.
- package/LICENSE +21 -0
- package/README.md +399 -0
- package/dist/src/accounting/index.d.ts +1 -0
- package/dist/src/accounting/index.js +2 -0
- package/dist/src/accounting/index.js.map +1 -0
- package/dist/src/accounting/reducer.d.ts +21 -0
- package/dist/src/accounting/reducer.js +105 -0
- package/dist/src/accounting/reducer.js.map +1 -0
- package/dist/src/antigravity/discovery.d.ts +18 -0
- package/dist/src/antigravity/discovery.js +95 -0
- package/dist/src/antigravity/discovery.js.map +1 -0
- package/dist/src/antigravity/doctor.d.ts +6 -0
- package/dist/src/antigravity/doctor.js +78 -0
- package/dist/src/antigravity/doctor.js.map +1 -0
- package/dist/src/antigravity/index.d.ts +3 -0
- package/dist/src/antigravity/index.js +4 -0
- package/dist/src/antigravity/index.js.map +1 -0
- package/dist/src/antigravity/proto.d.ts +73 -0
- package/dist/src/antigravity/proto.js +259 -0
- package/dist/src/antigravity/proto.js.map +1 -0
- package/dist/src/antigravity/scanner.d.ts +8 -0
- package/dist/src/antigravity/scanner.js +552 -0
- package/dist/src/antigravity/scanner.js.map +1 -0
- package/dist/src/application.d.ts +73 -0
- package/dist/src/application.js +657 -0
- package/dist/src/application.js.map +1 -0
- package/dist/src/cache/filesystem.d.ts +8 -0
- package/dist/src/cache/filesystem.js +70 -0
- package/dist/src/cache/filesystem.js.map +1 -0
- package/dist/src/cache/index.d.ts +5 -0
- package/dist/src/cache/index.js +6 -0
- package/dist/src/cache/index.js.map +1 -0
- package/dist/src/cache/lock.d.ts +40 -0
- package/dist/src/cache/lock.js +227 -0
- package/dist/src/cache/lock.js.map +1 -0
- package/dist/src/cache/schema.d.ts +45 -0
- package/dist/src/cache/schema.js +308 -0
- package/dist/src/cache/schema.js.map +1 -0
- package/dist/src/cache/store.d.ts +46 -0
- package/dist/src/cache/store.js +396 -0
- package/dist/src/cache/store.js.map +1 -0
- package/dist/src/cache/types.d.ts +130 -0
- package/dist/src/cache/types.js +6 -0
- package/dist/src/cache/types.js.map +1 -0
- package/dist/src/cli.d.ts +8 -0
- package/dist/src/cli.js +874 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/codex/discovery.d.ts +6 -0
- package/dist/src/codex/discovery.js +88 -0
- package/dist/src/codex/discovery.js.map +1 -0
- package/dist/src/codex/doctor.d.ts +6 -0
- package/dist/src/codex/doctor.js +52 -0
- package/dist/src/codex/doctor.js.map +1 -0
- package/dist/src/codex/index.d.ts +3 -0
- package/dist/src/codex/index.js +3 -0
- package/dist/src/codex/index.js.map +1 -0
- package/dist/src/codex/scanner.d.ts +6 -0
- package/dist/src/codex/scanner.js +487 -0
- package/dist/src/codex/scanner.js.map +1 -0
- package/dist/src/codex/types.d.ts +31 -0
- package/dist/src/codex/types.js +5 -0
- package/dist/src/codex/types.js.map +1 -0
- package/dist/src/collector/collector.d.ts +15 -0
- package/dist/src/collector/collector.js +597 -0
- package/dist/src/collector/collector.js.map +1 -0
- package/dist/src/collector/index.d.ts +3 -0
- package/dist/src/collector/index.js +3 -0
- package/dist/src/collector/index.js.map +1 -0
- package/dist/src/collector/types.d.ts +55 -0
- package/dist/src/collector/types.js +18 -0
- package/dist/src/collector/types.js.map +1 -0
- package/dist/src/dashboard/render/ansi.d.ts +53 -0
- package/dist/src/dashboard/render/ansi.js +106 -0
- package/dist/src/dashboard/render/ansi.js.map +1 -0
- package/dist/src/dashboard/render/dashboard.d.ts +13 -0
- package/dist/src/dashboard/render/dashboard.js +750 -0
- package/dist/src/dashboard/render/dashboard.js.map +1 -0
- package/dist/src/dashboard/render/format.d.ts +23 -0
- package/dist/src/dashboard/render/format.js +169 -0
- package/dist/src/dashboard/render/format.js.map +1 -0
- package/dist/src/dashboard/render/redraw.d.ts +13 -0
- package/dist/src/dashboard/render/redraw.js +24 -0
- package/dist/src/dashboard/render/redraw.js.map +1 -0
- package/dist/src/dashboard/render/types.d.ts +83 -0
- package/dist/src/dashboard/render/types.js +528 -0
- package/dist/src/dashboard/render/types.js.map +1 -0
- package/dist/src/dashboard/scheduler/index.d.ts +1 -0
- package/dist/src/dashboard/scheduler/index.js +2 -0
- package/dist/src/dashboard/scheduler/index.js.map +1 -0
- package/dist/src/dashboard/scheduler/refresh-scheduler.d.ts +46 -0
- package/dist/src/dashboard/scheduler/refresh-scheduler.js +137 -0
- package/dist/src/dashboard/scheduler/refresh-scheduler.js.map +1 -0
- package/dist/src/dashboard/settings/index.d.ts +25 -0
- package/dist/src/dashboard/settings/index.js +162 -0
- package/dist/src/dashboard/settings/index.js.map +1 -0
- package/dist/src/dashboard/state/index.d.ts +2 -0
- package/dist/src/dashboard/state/index.js +3 -0
- package/dist/src/dashboard/state/index.js.map +1 -0
- package/dist/src/dashboard/state/refresh-coordinator.d.ts +72 -0
- package/dist/src/dashboard/state/refresh-coordinator.js +346 -0
- package/dist/src/dashboard/state/refresh-coordinator.js.map +1 -0
- package/dist/src/dashboard/state/types.d.ts +68 -0
- package/dist/src/dashboard/state/types.js +2 -0
- package/dist/src/dashboard/state/types.js.map +1 -0
- package/dist/src/domain/contracts.d.ts +219 -0
- package/dist/src/domain/contracts.js +2 -0
- package/dist/src/domain/contracts.js.map +1 -0
- package/dist/src/domain/errors.d.ts +25 -0
- package/dist/src/domain/errors.js +65 -0
- package/dist/src/domain/errors.js.map +1 -0
- package/dist/src/domain/index.d.ts +5 -0
- package/dist/src/domain/index.js +6 -0
- package/dist/src/domain/index.js.map +1 -0
- package/dist/src/domain/records.d.ts +59 -0
- package/dist/src/domain/records.js +141 -0
- package/dist/src/domain/records.js.map +1 -0
- package/dist/src/domain/tokens.d.ts +51 -0
- package/dist/src/domain/tokens.js +93 -0
- package/dist/src/domain/tokens.js.map +1 -0
- package/dist/src/domain/windows.d.ts +59 -0
- package/dist/src/domain/windows.js +272 -0
- package/dist/src/domain/windows.js.map +1 -0
- package/dist/src/index.d.ts +9 -0
- package/dist/src/index.js +9 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/opencode/adapter.d.ts +47 -0
- package/dist/src/opencode/adapter.js +118 -0
- package/dist/src/opencode/adapter.js.map +1 -0
- package/dist/src/opencode/client.d.ts +64 -0
- package/dist/src/opencode/client.js +118 -0
- package/dist/src/opencode/client.js.map +1 -0
- package/dist/src/opencode/doctor.d.ts +28 -0
- package/dist/src/opencode/doctor.js +82 -0
- package/dist/src/opencode/doctor.js.map +1 -0
- package/dist/src/opencode/index.d.ts +5 -0
- package/dist/src/opencode/index.js +6 -0
- package/dist/src/opencode/index.js.map +1 -0
- package/dist/src/opencode/stats.d.ts +8 -0
- package/dist/src/opencode/stats.js +174 -0
- package/dist/src/opencode/stats.js.map +1 -0
- package/dist/src/opencode/transport.d.ts +54 -0
- package/dist/src/opencode/transport.js +621 -0
- package/dist/src/opencode/transport.js.map +1 -0
- package/dist/src/output/index.d.ts +20 -0
- package/dist/src/output/index.js +46 -0
- package/dist/src/output/index.js.map +1 -0
- package/dist/src/output/json.d.ts +72 -0
- package/dist/src/output/json.js +133 -0
- package/dist/src/output/json.js.map +1 -0
- package/dist/src/output/table.d.ts +4 -0
- package/dist/src/output/table.js +81 -0
- package/dist/src/output/table.js.map +1 -0
- package/dist/src/pricing/index.d.ts +1 -0
- package/dist/src/pricing/index.js +2 -0
- package/dist/src/pricing/index.js.map +1 -0
- package/dist/src/pricing/pricing.d.ts +19 -0
- package/dist/src/pricing/pricing.js +441 -0
- package/dist/src/pricing/pricing.js.map +1 -0
- 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
|
+
};
|