@nola-lang/console 0.1.4

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.
@@ -0,0 +1,588 @@
1
+ import { rmSync } from "node:fs";
2
+ import { DatabaseSync } from "node:sqlite";
3
+ import { askLabel, invocationLabel } from "../core/labels.js";
4
+ /**
5
+ * Pre-release rule (tracing model spec §1): no migration chain — one schema
6
+ * stamped with SCHEMA_VERSION; a db carrying any other non-zero stamp is
7
+ * deleted and recreated. Bump the stamp on every pre-release schema rewrite;
8
+ * the migration-runner pattern returns at first release.
9
+ */
10
+ const SCHEMA_VERSION = 7;
11
+ const SCHEMA = `
12
+ CREATE TABLE projects (
13
+ name TEXT PRIMARY KEY,
14
+ first_seen_at INTEGER NOT NULL,
15
+ last_seen_at INTEGER NOT NULL
16
+ );
17
+ CREATE TABLE invocations (
18
+ invocation_id TEXT PRIMARY KEY,
19
+ trace_id TEXT NOT NULL,
20
+ parent_id TEXT,
21
+ depth INTEGER NOT NULL,
22
+ detached INTEGER NOT NULL DEFAULT 0,
23
+ project TEXT,
24
+ run_id TEXT NOT NULL,
25
+ pid INTEGER NOT NULL,
26
+ status TEXT NOT NULL,
27
+ fn TEXT,
28
+ file TEXT,
29
+ started_at INTEGER NOT NULL,
30
+ completed_at INTEGER,
31
+ duration_ms INTEGER,
32
+ trace_json TEXT
33
+ );
34
+ CREATE INDEX invocations_trace ON invocations (trace_id, started_at);
35
+ CREATE INDEX invocations_project ON invocations (project, started_at);
36
+ CREATE INDEX invocations_run ON invocations (run_id);
37
+ CREATE TABLE asks (
38
+ ask_id TEXT PRIMARY KEY,
39
+ trace_id TEXT NOT NULL,
40
+ invocation_id TEXT NOT NULL,
41
+ def TEXT,
42
+ kind TEXT,
43
+ site TEXT,
44
+ instruction TEXT,
45
+ callee TEXT,
46
+ hint TEXT,
47
+ type_text TEXT,
48
+ provider TEXT,
49
+ profile TEXT,
50
+ status TEXT NOT NULL,
51
+ started_at INTEGER NOT NULL,
52
+ duration_ms INTEGER,
53
+ attempts INTEGER,
54
+ outcome_error TEXT,
55
+ fingerprint TEXT,
56
+ receipt_json TEXT
57
+ );
58
+ CREATE INDEX asks_trace ON asks (trace_id, started_at);
59
+ CREATE INDEX asks_invocation ON asks (invocation_id, started_at);
60
+ CREATE INDEX asks_def ON asks (def, started_at);
61
+ CREATE TABLE definitions (
62
+ def TEXT PRIMARY KEY,
63
+ project TEXT,
64
+ kind TEXT,
65
+ file TEXT,
66
+ loc TEXT,
67
+ instruction TEXT,
68
+ first_seen_at INTEGER NOT NULL,
69
+ last_seen_at INTEGER NOT NULL
70
+ );
71
+ CREATE TABLE attempts (
72
+ ask_id TEXT NOT NULL,
73
+ attempt INTEGER NOT NULL,
74
+ provider TEXT,
75
+ at INTEGER NOT NULL,
76
+ duration_ms INTEGER,
77
+ validation TEXT,
78
+ PRIMARY KEY (ask_id, attempt)
79
+ );
80
+ CREATE TABLE events (
81
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
82
+ run_id TEXT NOT NULL,
83
+ seq INTEGER NOT NULL,
84
+ at INTEGER NOT NULL,
85
+ kind TEXT NOT NULL,
86
+ ask_id TEXT,
87
+ event_json TEXT NOT NULL,
88
+ UNIQUE (run_id, seq)
89
+ );
90
+ CREATE INDEX events_ask ON events (ask_id);
91
+ `;
92
+ function open(path) {
93
+ let db = new DatabaseSync(path);
94
+ const stamp = () => db.prepare("PRAGMA user_version").get().user_version;
95
+ if (stamp() !== 0 && stamp() !== SCHEMA_VERSION) {
96
+ db.close();
97
+ for (const f of [path, `${path}-wal`, `${path}-shm`])
98
+ rmSync(f, { force: true });
99
+ db = new DatabaseSync(path);
100
+ }
101
+ db.exec("PRAGMA journal_mode = WAL");
102
+ if (stamp() === 0) {
103
+ db.exec("BEGIN");
104
+ db.exec(SCHEMA);
105
+ db.exec(`PRAGMA user_version = ${SCHEMA_VERSION}`);
106
+ db.exec("COMMIT");
107
+ }
108
+ return db;
109
+ }
110
+ const siteText = (site) => (site?.file && site.loc ? `${site.file}:${site.loc}` : null);
111
+ const askKind = (raw) => (raw === "call" ? "call" : "extract");
112
+ /** Every invocation on a path, root first: `[id, parentId | null, depth]`. */
113
+ function pathRows(spanPath) {
114
+ return spanPath.map((id, i) => [id, i === 0 ? null : spanPath[i - 1], i]);
115
+ }
116
+ /** The subtree rooted at ?1 (inclusive) — every reader that aggregates over descendants starts here. */
117
+ const SUBTREE = `WITH RECURSIVE sub(id) AS (
118
+ SELECT ? UNION ALL SELECT i.invocation_id FROM invocations i JOIN sub ON i.parent_id = sub.id
119
+ )`;
120
+ /** Local trace store over node:sqlite. All reduction is SQL upserts, so event arrival order does not matter. */
121
+ export class SqliteConsoleStorage {
122
+ #db;
123
+ constructor(path) {
124
+ this.#db = open(path);
125
+ }
126
+ /**
127
+ * Upsert one invocation row WITHOUT touching status/completion — a placeholder
128
+ * for ids learned from an ask's spanPath (older runtime, foreign sender) and
129
+ * the started_at floor for every event that names the frame.
130
+ */
131
+ #touchInvocation(id, traceId, parentId, depth, envelope) {
132
+ this.#db
133
+ .prepare(`INSERT INTO invocations (invocation_id, trace_id, parent_id, depth, project, run_id, pid, status, started_at)
134
+ VALUES (?, ?, ?, ?, ?, ?, ?, 'running', ?)
135
+ ON CONFLICT (invocation_id) DO UPDATE SET
136
+ parent_id = COALESCE(invocations.parent_id, excluded.parent_id),
137
+ project = COALESCE(excluded.project, invocations.project),
138
+ started_at = MIN(invocations.started_at, excluded.started_at)`)
139
+ .run(id, traceId, parentId, depth, envelope.project ?? null, envelope.runId, envelope.pid, envelope.at);
140
+ }
141
+ /** Every frame on a spanPath gets a row; a spanPath-less ask lands under the synthetic `run:<runId>` root. */
142
+ #touchPath(spanPath, envelope) {
143
+ const path = spanPath && spanPath.length > 0 ? spanPath : [`run:${envelope.runId}`];
144
+ const traceId = path[0];
145
+ for (const [id, parent, depth] of pathRows(path))
146
+ this.#touchInvocation(id, traceId, parent, depth, envelope);
147
+ return { traceId, invocationId: path[path.length - 1] };
148
+ }
149
+ /** Mark every COMPLETED ancestor (inclusive) of an invocation as errored — the late-error flip. */
150
+ #flipAncestors(invocationId) {
151
+ this.#db
152
+ .prepare(`WITH RECURSIVE up(id) AS (
153
+ SELECT ? UNION ALL SELECT i.parent_id FROM invocations i JOIN up ON i.invocation_id = up.id WHERE i.parent_id IS NOT NULL
154
+ )
155
+ UPDATE invocations SET status = 'error' WHERE completed_at IS NOT NULL AND invocation_id IN (SELECT id FROM up)`)
156
+ .run(invocationId);
157
+ }
158
+ /** Whether any ask, or any invocation strictly inside the subtree, has errored. */
159
+ #subtreeErrored(invocationId) {
160
+ const row = this.#db
161
+ .prepare(`${SUBTREE}
162
+ SELECT EXISTS (SELECT 1 FROM asks WHERE invocation_id IN (SELECT id FROM sub) AND status = 'error')
163
+ OR EXISTS (SELECT 1 FROM invocations WHERE invocation_id IN (SELECT id FROM sub) AND invocation_id != ? AND status = 'error') AS errored`)
164
+ .get(invocationId, invocationId);
165
+ return row.errored === 1;
166
+ }
167
+ async ingest(envelope) {
168
+ if (envelope.project !== undefined) {
169
+ this.#db
170
+ .prepare(`INSERT INTO projects (name, first_seen_at, last_seen_at) VALUES (?, ?, ?)
171
+ ON CONFLICT (name) DO UPDATE SET
172
+ first_seen_at = MIN(projects.first_seen_at, excluded.first_seen_at),
173
+ last_seen_at = MAX(projects.last_seen_at, excluded.last_seen_at)`)
174
+ .run(envelope.project, envelope.at, envelope.at);
175
+ }
176
+ const askId = envelope.event?.askId ?? null;
177
+ const inserted = this.#db
178
+ .prepare("INSERT OR IGNORE INTO events (run_id, seq, at, kind, ask_id, event_json) VALUES (?, ?, ?, ?, ?, ?)")
179
+ .run(envelope.runId, envelope.seq, envelope.at, envelope.kind, askId, JSON.stringify(envelope.event ?? null));
180
+ if (inserted.changes === 0)
181
+ return; // duplicate delivery
182
+ if (envelope.kind === "invocationStart") {
183
+ const e = envelope.event;
184
+ if (typeof e.invocationId !== "string")
185
+ return;
186
+ const path = e.spanPath && e.spanPath.length > 0 ? e.spanPath : [e.invocationId];
187
+ const { traceId } = this.#touchPath(path, envelope);
188
+ this.#db
189
+ .prepare(`UPDATE invocations SET
190
+ parent_id = COALESCE(?, parent_id),
191
+ depth = ?,
192
+ detached = ?,
193
+ fn = COALESCE(?, fn),
194
+ file = COALESCE(?, file),
195
+ trace_id = ?
196
+ WHERE invocation_id = ?`)
197
+ .run(e.parentInvocationId ?? null, path.length - 1, e.detached ? 1 : 0, e.fn ?? null, e.file ?? null, traceId, e.invocationId);
198
+ }
199
+ else if (envelope.kind === "askStart" && askId) {
200
+ const e = envelope.event;
201
+ const { traceId, invocationId } = this.#touchPath(e.spanPath, envelope);
202
+ this.#db
203
+ .prepare(`INSERT INTO asks (ask_id, trace_id, invocation_id, def, kind, site, instruction, callee, hint, type_text, provider, status, started_at)
204
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'running', ?)
205
+ ON CONFLICT (ask_id) DO UPDATE SET
206
+ trace_id = excluded.trace_id,
207
+ invocation_id = excluded.invocation_id,
208
+ def = COALESCE(excluded.def, asks.def),
209
+ kind = COALESCE(excluded.kind, asks.kind),
210
+ site = COALESCE(excluded.site, asks.site),
211
+ instruction = COALESCE(excluded.instruction, asks.instruction),
212
+ callee = COALESCE(excluded.callee, asks.callee),
213
+ hint = COALESCE(excluded.hint, asks.hint),
214
+ type_text = COALESCE(excluded.type_text, asks.type_text),
215
+ provider = COALESCE(excluded.provider, asks.provider),
216
+ started_at = MIN(asks.started_at, excluded.started_at)`)
217
+ .run(askId, traceId, e.invocationId ?? invocationId, e.def ?? null, e.kind ?? null, siteText(e.site), e.instruction ?? null, e.callee ?? null, e.hint ?? null, e.typeText ?? null, e.provider ?? null, envelope.at);
218
+ if (e.def) {
219
+ this.#db
220
+ .prepare(`INSERT INTO definitions (def, project, kind, file, loc, instruction, first_seen_at, last_seen_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
221
+ ON CONFLICT (def) DO UPDATE SET
222
+ project = COALESCE(excluded.project, definitions.project),
223
+ kind = COALESCE(excluded.kind, definitions.kind),
224
+ file = COALESCE(excluded.file, definitions.file),
225
+ loc = COALESCE(excluded.loc, definitions.loc),
226
+ instruction = COALESCE(excluded.instruction, definitions.instruction),
227
+ first_seen_at = MIN(definitions.first_seen_at, excluded.first_seen_at),
228
+ last_seen_at = MAX(definitions.last_seen_at, excluded.last_seen_at)`)
229
+ .run(e.def, envelope.project ?? null, e.kind ?? null, e.site?.file ?? null, e.site?.loc ?? null, e.instruction ?? null, envelope.at, envelope.at);
230
+ }
231
+ }
232
+ else if (envelope.kind === "providerRequest" && askId) {
233
+ const e = envelope.event;
234
+ if (typeof e.attempt === "number") {
235
+ this.#db
236
+ .prepare(`INSERT INTO attempts (ask_id, attempt, provider, at) VALUES (?, ?, ?, ?)
237
+ ON CONFLICT (ask_id, attempt) DO UPDATE SET
238
+ provider = COALESCE(excluded.provider, attempts.provider),
239
+ at = MIN(attempts.at, excluded.at)`)
240
+ .run(askId, e.attempt, e.provider ?? null, envelope.at);
241
+ }
242
+ }
243
+ else if (envelope.kind === "providerResponse" && askId) {
244
+ const e = envelope.event;
245
+ if (typeof e.attempt === "number") {
246
+ this.#db
247
+ .prepare(`INSERT INTO attempts (ask_id, attempt, provider, at, duration_ms) VALUES (?, ?, ?, ?, ?)
248
+ ON CONFLICT (ask_id, attempt) DO UPDATE SET
249
+ provider = COALESCE(excluded.provider, attempts.provider),
250
+ duration_ms = COALESCE(excluded.duration_ms, attempts.duration_ms)`)
251
+ .run(askId, e.attempt, e.provider ?? null, envelope.at, e.durationMs ?? null);
252
+ }
253
+ }
254
+ else if (envelope.kind === "validationFailed" && askId) {
255
+ const e = envelope.event;
256
+ if (typeof e.attempt === "number") {
257
+ this.#db
258
+ .prepare(`INSERT INTO attempts (ask_id, attempt, at, validation) VALUES (?, ?, ?, 'failed')
259
+ ON CONFLICT (ask_id, attempt) DO UPDATE SET validation = 'failed'`)
260
+ .run(askId, e.attempt, envelope.at);
261
+ }
262
+ }
263
+ else if (envelope.kind === "askEnd" && askId) {
264
+ const r = envelope.event.receipt ?? {};
265
+ const { traceId, invocationId } = this.#touchPath(r.spanPath, envelope);
266
+ const owner = r.invocationId ?? invocationId;
267
+ const failed = r.outcome?.ok !== true;
268
+ this.#db
269
+ .prepare(`INSERT INTO asks (ask_id, trace_id, invocation_id, def, kind, site, provider, profile, status, started_at, duration_ms, attempts, outcome_error, fingerprint, receipt_json)
270
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
271
+ ON CONFLICT (ask_id) DO UPDATE SET
272
+ site = COALESCE(asks.site, excluded.site),
273
+ provider = COALESCE(excluded.provider, asks.provider),
274
+ profile = excluded.profile,
275
+ status = excluded.status,
276
+ duration_ms = excluded.duration_ms,
277
+ attempts = excluded.attempts,
278
+ outcome_error = excluded.outcome_error,
279
+ fingerprint = excluded.fingerprint,
280
+ invocation_id = COALESCE(asks.invocation_id, excluded.invocation_id),
281
+ def = COALESCE(excluded.def, asks.def),
282
+ kind = COALESCE(excluded.kind, asks.kind),
283
+ receipt_json = excluded.receipt_json`)
284
+ .run(askId, traceId, owner, r.def ?? null, r.kind ?? null, siteText(r.site), r.servedBy ?? null, r.profile ?? null, failed ? "error" : "ok", envelope.at, r.durationMs ?? null, r.attempts ?? null, failed ? (r.outcome?.error ?? "unknown error") : null, r.fingerprint ?? null, JSON.stringify(envelope.event.receipt ?? null));
285
+ if (failed)
286
+ this.#flipAncestors(owner);
287
+ }
288
+ else if (envelope.kind === "invocationEnd") {
289
+ const e = envelope.event;
290
+ if (typeof e.invocationId !== "string")
291
+ return;
292
+ const known = this.#db.prepare("SELECT 1 FROM invocations WHERE invocation_id = ?").get(e.invocationId);
293
+ if (!known) {
294
+ // No start and no ask named it: a root unless the event says otherwise.
295
+ const parent = e.parentInvocationId ?? null;
296
+ this.#touchInvocation(e.invocationId, parent ?? e.invocationId, parent, parent ? 1 : 0, envelope);
297
+ }
298
+ const status = e.status === "error" || this.#subtreeErrored(e.invocationId) ? "error" : "ok";
299
+ this.#db
300
+ .prepare(`UPDATE invocations SET
301
+ completed_at = ?,
302
+ duration_ms = COALESCE(?, ? - started_at),
303
+ fn = COALESCE(?, fn),
304
+ file = COALESCE(?, file),
305
+ trace_json = CASE WHEN parent_id IS NULL THEN ? ELSE trace_json END,
306
+ status = ?
307
+ WHERE invocation_id = ?`)
308
+ .run(envelope.at, e.durationMs ?? null, envelope.at, e.trace?.fn ?? null, e.trace?.file ?? null, JSON.stringify(e.trace ?? null), status, e.invocationId);
309
+ if (status === "error")
310
+ this.#flipAncestors(e.invocationId);
311
+ }
312
+ }
313
+ async listProjects() {
314
+ const named = this.#db
315
+ .prepare(`SELECT p.name, p.first_seen_at, p.last_seen_at, COUNT(t.invocation_id) AS trace_count
316
+ FROM projects p LEFT JOIN invocations t ON t.project = p.name AND t.parent_id IS NULL
317
+ GROUP BY p.name ORDER BY p.last_seen_at DESC`)
318
+ .all();
319
+ const projects = named.map((r) => ({
320
+ name: r.name,
321
+ firstSeenAt: r.first_seen_at,
322
+ lastSeenAt: r.last_seen_at,
323
+ traceCount: r.trace_count,
324
+ }));
325
+ const bucket = this.#db
326
+ .prepare("SELECT COUNT(*) AS trace_count, MIN(started_at) AS first_seen, MAX(started_at) AS last_seen FROM invocations WHERE project IS NULL AND parent_id IS NULL")
327
+ .get();
328
+ if (bucket.trace_count > 0)
329
+ projects.push({
330
+ name: null,
331
+ firstSeenAt: bucket.first_seen ?? 0,
332
+ lastSeenAt: bucket.last_seen ?? 0,
333
+ traceCount: bucket.trace_count,
334
+ });
335
+ return projects;
336
+ }
337
+ /** The flattened subtree of one invocation: the node, then children (invocations and asks interleaved by start) depth-first. */
338
+ #subtree(invocationId) {
339
+ const invocations = this.#db
340
+ .prepare(`${SUBTREE} SELECT * FROM invocations WHERE invocation_id IN (SELECT id FROM sub) ORDER BY started_at, invocation_id`)
341
+ .all(invocationId);
342
+ const asks = this.#db
343
+ .prepare(`${SUBTREE} SELECT a.*, i.depth AS depth FROM asks a JOIN invocations i ON i.invocation_id = a.invocation_id
344
+ WHERE a.invocation_id IN (SELECT id FROM sub) ORDER BY a.started_at, a.ask_id`)
345
+ .all(invocationId);
346
+ const root = invocations.find((i) => i.invocation_id === invocationId);
347
+ if (!root)
348
+ return [];
349
+ const byParent = new Map();
350
+ const push = (parent, row) => {
351
+ if (parent === null)
352
+ return;
353
+ const list = byParent.get(parent) ?? [];
354
+ list.push(row);
355
+ byParent.set(parent, list);
356
+ };
357
+ for (const i of invocations)
358
+ if (i.invocation_id !== invocationId)
359
+ push(i.parent_id, i);
360
+ for (const a of asks)
361
+ push(a.invocation_id, a);
362
+ const out = [];
363
+ const visit = (row) => {
364
+ const record = toInvocationRecord(row);
365
+ const at = out.length;
366
+ out.push(record);
367
+ const children = [...(byParent.get(row.invocation_id) ?? [])].sort((x, y) => x.started_at - y.started_at || rowId(x).localeCompare(rowId(y)));
368
+ let askCount = 0;
369
+ let errorCount = 0;
370
+ for (const item of children) {
371
+ if ("ask_id" in item) {
372
+ out.push(toAskRecord(item));
373
+ askCount += 1;
374
+ if (item.status === "error")
375
+ errorCount += 1;
376
+ }
377
+ else {
378
+ const sub = visit(item);
379
+ askCount += sub.asks;
380
+ errorCount += sub.errors;
381
+ }
382
+ }
383
+ out[at] = { ...record, askCount, errorCount };
384
+ return { asks: askCount, errors: errorCount };
385
+ };
386
+ visit(root);
387
+ return out;
388
+ }
389
+ async listRecords(query = {}) {
390
+ const clauses = ["parent_id IS NULL"];
391
+ const params = [];
392
+ if (query.project !== undefined) {
393
+ clauses.push("project = ?");
394
+ params.push(query.project);
395
+ }
396
+ if (query.noProject)
397
+ clauses.push("project IS NULL");
398
+ if (query.runId !== undefined) {
399
+ clauses.push("run_id = ?");
400
+ params.push(query.runId);
401
+ }
402
+ const roots = this.#db
403
+ .prepare(`SELECT invocation_id FROM invocations WHERE ${clauses.join(" AND ")} ORDER BY started_at DESC, invocation_id DESC LIMIT ?`)
404
+ .all(...params, query.limit ?? 100);
405
+ return roots.flatMap((r) => this.#subtree(r.invocation_id));
406
+ }
407
+ async getTrace(invocationId) {
408
+ const records = this.#subtree(invocationId);
409
+ const node = records[0];
410
+ if (node?.kind !== "invocation")
411
+ return undefined;
412
+ const row = this.#db.prepare("SELECT trace_json FROM invocations WHERE invocation_id = ?").get(invocationId);
413
+ return { node, records, ...(row.trace_json ? { trace: JSON.parse(row.trace_json) } : {}) };
414
+ }
415
+ #invocationChain(invocationId) {
416
+ const chain = [];
417
+ const stmt = this.#db.prepare("SELECT invocation_id, parent_id, fn, depth FROM invocations WHERE invocation_id = ?");
418
+ for (let id = invocationId; id !== null;) {
419
+ const row = stmt.get(id);
420
+ if (!row)
421
+ break;
422
+ chain.unshift({ invocationId: row.invocation_id, ...(row.fn !== null ? { fn: row.fn } : {}), depth: row.depth });
423
+ id = row.parent_id;
424
+ }
425
+ return chain;
426
+ }
427
+ async getAsk(askId) {
428
+ const row = this.#db.prepare(`${ASK_SELECT} WHERE a.ask_id = ?`).get(askId);
429
+ if (!row)
430
+ return undefined;
431
+ const events = this.#db.prepare("SELECT seq, at, kind, event_json FROM events WHERE ask_id = ? ORDER BY seq").all(askId).map((e) => ({ seq: e.seq, at: e.at, kind: e.kind, event: JSON.parse(e.event_json) }));
432
+ const attemptRows = this.#db.prepare("SELECT * FROM attempts WHERE ask_id = ? ORDER BY attempt").all(askId).map(toAttemptSummary);
433
+ return {
434
+ ...toAskSummary(row),
435
+ attemptRows,
436
+ ...(row.receipt_json ? { receipt: JSON.parse(row.receipt_json) } : {}),
437
+ events,
438
+ invocationChain: this.#invocationChain(row.invocation_id),
439
+ };
440
+ }
441
+ #definitionStats(def) {
442
+ const agg = this.#db
443
+ .prepare(`SELECT COUNT(*) AS executions,
444
+ COALESCE(SUM(status = 'ok'), 0) AS ok_count,
445
+ COALESCE(SUM(status = 'error'), 0) AS error_count,
446
+ AVG(duration_ms) AS avg_ms,
447
+ AVG(attempts) AS avg_att
448
+ FROM asks WHERE def = ?`)
449
+ .get(def);
450
+ const durations = this.#db
451
+ .prepare("SELECT duration_ms AS d FROM asks WHERE def = ? AND duration_ms IS NOT NULL ORDER BY duration_ms")
452
+ .all(def).map((r) => r.d);
453
+ const p95 = durations.length > 0 ? durations[Math.ceil(0.95 * durations.length) - 1] : undefined;
454
+ const providers = this.#db
455
+ .prepare("SELECT DISTINCT provider AS p FROM asks WHERE def = ? AND provider IS NOT NULL ORDER BY provider")
456
+ .all(def).map((r) => r.p);
457
+ return {
458
+ executions: agg.executions,
459
+ okCount: agg.ok_count,
460
+ errorCount: agg.error_count,
461
+ ...(agg.avg_ms !== null ? { avgDurationMs: agg.avg_ms } : {}),
462
+ ...(p95 !== undefined ? { p95DurationMs: p95 } : {}),
463
+ ...(agg.avg_att !== null ? { avgAttempts: agg.avg_att } : {}),
464
+ providers,
465
+ };
466
+ }
467
+ async listDefinitions(query = {}) {
468
+ const clauses = [];
469
+ const params = [];
470
+ if (query.project !== undefined) {
471
+ clauses.push("project = ?");
472
+ params.push(query.project);
473
+ }
474
+ if (query.noProject)
475
+ clauses.push("project IS NULL");
476
+ const where = clauses.length > 0 ? `WHERE ${clauses.join(" AND ")}` : "";
477
+ const rows = this.#db
478
+ .prepare(`SELECT * FROM definitions ${where} ORDER BY last_seen_at DESC, def DESC`)
479
+ .all(...params);
480
+ return rows.map((row) => ({ ...toDefinitionBase(row), ...this.#definitionStats(row.def) }));
481
+ }
482
+ async getDefinition(def) {
483
+ const row = this.#db.prepare("SELECT * FROM definitions WHERE def = ?").get(def);
484
+ if (!row)
485
+ return undefined;
486
+ const asks = this.#db
487
+ .prepare(`${ASK_SELECT} WHERE a.def = ? ORDER BY a.started_at DESC, a.ask_id DESC LIMIT 50`)
488
+ .all(def).map(toAskSummary);
489
+ return { ...toDefinitionBase(row), ...this.#definitionStats(row.def), asks };
490
+ }
491
+ async clear() {
492
+ this.#db.exec("BEGIN");
493
+ for (const table of ["events", "attempts", "asks", "definitions", "invocations", "projects"])
494
+ this.#db.exec(`DELETE FROM ${table}`);
495
+ this.#db.exec("COMMIT");
496
+ }
497
+ async close() {
498
+ this.#db.close();
499
+ }
500
+ }
501
+ function toDefinitionBase(row) {
502
+ return {
503
+ def: row.def,
504
+ ...(row.project !== null ? { project: row.project } : {}),
505
+ ...(row.kind !== null ? { kind: askKind(row.kind) } : {}),
506
+ ...(row.file !== null ? { file: row.file } : {}),
507
+ ...(row.loc !== null ? { loc: row.loc } : {}),
508
+ ...(row.instruction !== null ? { instruction: row.instruction } : {}),
509
+ firstSeenAt: row.first_seen_at,
510
+ lastSeenAt: row.last_seen_at,
511
+ };
512
+ }
513
+ const rowId = (row) => ("ask_id" in row ? row.ask_id : row.invocation_id);
514
+ /** Every ask row carries its trace's pid — the process is a filter attribute of the execution. */
515
+ const ASK_SELECT = "SELECT a.*, t.pid AS pid FROM asks a LEFT JOIN invocations t ON t.invocation_id = a.trace_id";
516
+ function toInvocationRecord(row) {
517
+ return {
518
+ id: row.invocation_id,
519
+ kind: "invocation",
520
+ traceId: row.trace_id,
521
+ ...(row.parent_id !== null ? { parentId: row.parent_id } : {}),
522
+ depth: row.depth,
523
+ label: invocationLabel(row.fn ?? undefined),
524
+ status: row.status,
525
+ startedAt: row.started_at,
526
+ ...(row.duration_ms !== null ? { durationMs: row.duration_ms } : {}),
527
+ ...(row.fn !== null ? { fn: row.fn } : {}),
528
+ ...(row.file !== null ? { file: row.file } : {}),
529
+ detached: row.detached === 1,
530
+ ...(row.project !== null ? { project: row.project } : {}),
531
+ runId: row.run_id,
532
+ pid: row.pid,
533
+ ...(row.completed_at !== null ? { completedAt: row.completed_at } : {}),
534
+ askCount: 0,
535
+ errorCount: 0,
536
+ };
537
+ }
538
+ function askFields(row) {
539
+ return {
540
+ kind: askKind(row.kind),
541
+ ...(row.def !== null ? { def: row.def } : {}),
542
+ ...(row.site !== null ? { site: row.site } : {}),
543
+ ...(row.instruction !== null ? { instruction: row.instruction } : {}),
544
+ ...(row.callee !== null ? { callee: row.callee } : {}),
545
+ ...(row.hint !== null ? { hint: row.hint } : {}),
546
+ ...(row.type_text !== null ? { typeText: row.type_text } : {}),
547
+ ...(row.provider !== null ? { provider: row.provider } : {}),
548
+ ...(row.profile !== null ? { profile: row.profile } : {}),
549
+ ...(row.attempts !== null ? { attempts: row.attempts } : {}),
550
+ ...(row.outcome_error !== null ? { error: row.outcome_error } : {}),
551
+ };
552
+ }
553
+ function toAskRecord(row) {
554
+ const fields = askFields(row);
555
+ return {
556
+ id: row.ask_id,
557
+ traceId: row.trace_id,
558
+ parentId: row.invocation_id,
559
+ // one below the owning invocation
560
+ depth: 1 + (row.depth ?? 0),
561
+ label: askLabel(fields),
562
+ status: row.status,
563
+ startedAt: row.started_at,
564
+ ...(row.duration_ms !== null ? { durationMs: row.duration_ms } : {}),
565
+ ...fields,
566
+ };
567
+ }
568
+ function toAskSummary(row) {
569
+ return {
570
+ askId: row.ask_id,
571
+ traceId: row.trace_id,
572
+ ...(row.pid !== null ? { pid: row.pid } : {}),
573
+ ...askFields(row),
574
+ status: row.status,
575
+ startedAt: row.started_at,
576
+ ...(row.duration_ms !== null ? { durationMs: row.duration_ms } : {}),
577
+ };
578
+ }
579
+ function toAttemptSummary(row) {
580
+ return {
581
+ attempt: row.attempt,
582
+ ...(row.provider !== null ? { provider: row.provider } : {}),
583
+ at: row.at,
584
+ ...(row.duration_ms !== null ? { durationMs: row.duration_ms } : {}),
585
+ ...(row.validation === "failed" ? { validation: "failed" } : {}),
586
+ };
587
+ }
588
+ //# sourceMappingURL=sqlite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../src/storage/sqlite.ts"],"names":[],"mappings":"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"}