agent-inspect 6.12.0 → 6.12.2

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 (38) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +27 -6
  3. package/docs/ADOPTION.md +1 -1
  4. package/docs/DEMO-SCRIPT.md +30 -25
  5. package/docs/DESIGN-PARTNER-GUIDE.md +23 -10
  6. package/docs/FIRST-TRACE-IN-5-MINUTES.md +5 -2
  7. package/docs/GOLDEN-PATH.md +2 -2
  8. package/docs/KNOWN-ISSUES.md +1 -0
  9. package/docs/PRE-V7-PILOT-KIT.md +41 -15
  10. package/docs/SUPPORT-LEVELS.md +1 -1
  11. package/docs/TEAM-WORKFLOWS.md +1 -1
  12. package/docs/TECHNICAL-GUIDE.md +2 -2
  13. package/docs/USE-CASES.md +34 -10
  14. package/package.json +2 -2
  15. package/packages/cli/dist/{chunk-XTAA733P.mjs → chunk-4WA7DQCM.mjs} +316 -55
  16. package/packages/cli/dist/chunk-4WA7DQCM.mjs.map +1 -0
  17. package/packages/cli/dist/index.cjs +337 -70
  18. package/packages/cli/dist/index.cjs.map +1 -1
  19. package/packages/cli/dist/index.mjs +4 -4
  20. package/packages/cli/dist/index.mjs.map +1 -1
  21. package/packages/cli/dist/{src-G7PM24W2.mjs → src-YAASTXGE.mjs} +3 -3
  22. package/packages/cli/dist/{src-G7PM24W2.mjs.map → src-YAASTXGE.mjs.map} +1 -1
  23. package/packages/core/dist/advanced.cjs +290 -30
  24. package/packages/core/dist/advanced.cjs.map +1 -1
  25. package/packages/core/dist/advanced.d.cts +1 -1
  26. package/packages/core/dist/advanced.d.ts +1 -1
  27. package/packages/core/dist/advanced.mjs +1 -1
  28. package/packages/core/dist/checks.cjs +295 -30
  29. package/packages/core/dist/checks.cjs.map +1 -1
  30. package/packages/core/dist/checks.d.cts +2 -2
  31. package/packages/core/dist/checks.d.ts +2 -2
  32. package/packages/core/dist/checks.mjs +1 -1
  33. package/packages/core/dist/{chunk-QT6CQ2XA.mjs → chunk-KJICERSD.mjs} +296 -33
  34. package/packages/core/dist/chunk-KJICERSD.mjs.map +1 -0
  35. package/packages/core/dist/{index-mdFcxSOR.d.cts → index-BOP33T4O.d.cts} +72 -1
  36. package/packages/core/dist/{index-BO7l0iAe.d.ts → index-CgCH8NE9.d.ts} +72 -1
  37. package/packages/cli/dist/chunk-XTAA733P.mjs.map +0 -1
  38. package/packages/core/dist/chunk-QT6CQ2XA.mjs.map +0 -1
@@ -1,4 +1,4 @@
1
- import { resolveTraceDir, TraceDirectory, parseTraceJsonl, validateEvent } from './chunk-XTAA733P.mjs';
1
+ import { resolveTraceDir, TraceDirectory, parseTraceJsonl, validateEvent } from './chunk-4WA7DQCM.mjs';
2
2
  import { readFile, mkdir, rm } from 'fs/promises';
3
3
  import path from 'path';
4
4
  import { createRequire } from 'module';
@@ -415,5 +415,5 @@ function queryRuns(dbPath, query = {}) {
415
415
  }
416
416
 
417
417
  export { INDEX_DB_FILENAME, INDEX_SCHEMA_VERSION, buildIndex, cleanIndex, indexStatus, isIndexStale, queryRuns, rebuildIndex, resolveIndexDbPath };
418
- //# sourceMappingURL=src-G7PM24W2.mjs.map
419
- //# sourceMappingURL=src-G7PM24W2.mjs.map
418
+ //# sourceMappingURL=src-YAASTXGE.mjs.map
419
+ //# sourceMappingURL=src-YAASTXGE.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../index-sqlite/src/types.ts","../../index-sqlite/src/schema.ts","../../index-sqlite/src/load-sqlite.ts","../../index-sqlite/src/builder.ts","../../index-sqlite/src/query.ts"],"names":["require","meta"],"mappings":"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","file":"src-G7PM24W2.mjs","sourcesContent":["/**\n * Public types for the optional local SQLite trace index (v4.1, experimental).\n *\n * @remarks\n * Local-only. The index is derived from JSONL traces and is always safe to\n * delete. Trace files are never mutated. No network access.\n */\n\n/** Current index schema version. Bumped when table layout changes. */\nexport const INDEX_SCHEMA_VERSION = \"1\" as const;\n\n/** Default index database filename. */\nexport const INDEX_DB_FILENAME = \"trace-index.sqlite\";\n\n/** A derived run row in the index. */\nexport interface IndexedRun {\n runId: string;\n file: string;\n mtimeMs: number;\n name: string | null;\n status: string | null;\n startedAt: number | null;\n endedAt: number | null;\n durationMs: number | null;\n sessionId: string | null;\n groupId: string | null;\n correlationId: string | null;\n}\n\n/** A derived step row in the index. */\nexport interface IndexedStep {\n runId: string;\n stepId: string;\n kind: string | null;\n name: string | null;\n status: string | null;\n durationMs: number | null;\n toolName: string | null;\n model: string | null;\n parentId: string | null;\n}\n\n/** Options for building/rebuilding the index. */\nexport interface BuildIndexOptions {\n /** Trace directory to index. Resolved via core `resolveTraceDir` when omitted. */\n traceDir?: string;\n /** Index database path. Defaults to `<traceDir>/<INDEX_DB_FILENAME>`. */\n dbPath?: string;\n /** Cap on the number of trace files indexed (default 10000). */\n maxRuns?: number;\n}\n\n/** Result of a build/rebuild. */\nexport interface BuildIndexResult {\n dbPath: string;\n traceDir: string;\n runs: number;\n steps: number;\n errors: number;\n builtAt: string;\n warnings: string[];\n}\n\n/** Status of an existing index. */\nexport interface IndexStatus {\n dbPath: string;\n exists: boolean;\n healthy: boolean;\n builtAt: string | null;\n sourceDir: string | null;\n schemaVersion: string | null;\n runs: number;\n steps: number;\n /** Derived lifecycle: complete, partial, stale, or fallback-scan */\n refreshStatus?: \"complete\" | \"partial\" | \"stale\" | \"fallback-scan\";\n}\n\n/** Filter for querying indexed runs. */\nexport interface RunQuery {\n status?: string;\n sessionId?: string;\n /** Case-insensitive substring match on run name. */\n name?: string;\n /** Match runs that contain a step of this kind. */\n kind?: string;\n /** Match runs that contain a step with this tool name (substring). */\n tool?: string;\n limit?: number;\n}\n","import { INDEX_SCHEMA_VERSION } from \"./types.js\";\n\n/**\n * Idempotent DDL for the local trace index. A full rebuild drops and recreates\n * all tables, so building twice from the same inputs yields identical contents.\n */\nexport const INDEX_SCHEMA_SQL = `\nDROP TABLE IF EXISTS meta;\nDROP TABLE IF EXISTS errors;\nDROP TABLE IF EXISTS steps;\nDROP TABLE IF EXISTS sessions;\nDROP TABLE IF EXISTS runs;\n\nCREATE TABLE meta (\n key TEXT PRIMARY KEY,\n value TEXT\n);\n\nCREATE TABLE runs (\n run_id TEXT PRIMARY KEY,\n file TEXT NOT NULL,\n mtime_ms REAL NOT NULL,\n name TEXT,\n status TEXT,\n started_at REAL,\n ended_at REAL,\n duration_ms REAL,\n session_id TEXT,\n group_id TEXT,\n correlation_id TEXT\n);\n\nCREATE TABLE steps (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n run_id TEXT NOT NULL,\n step_id TEXT NOT NULL,\n kind TEXT,\n name TEXT,\n status TEXT,\n duration_ms REAL,\n tool_name TEXT,\n model TEXT,\n parent_id TEXT\n);\n\nCREATE TABLE errors (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n run_id TEXT NOT NULL,\n step_id TEXT,\n message TEXT,\n code TEXT\n);\n\nCREATE TABLE sessions (\n session_id TEXT PRIMARY KEY,\n run_count INTEGER NOT NULL,\n first_started_at REAL,\n last_ended_at REAL\n);\n\nCREATE INDEX idx_runs_status ON runs(status);\nCREATE INDEX idx_runs_session ON runs(session_id);\nCREATE INDEX idx_runs_started ON runs(started_at);\nCREATE INDEX idx_steps_run ON steps(run_id);\nCREATE INDEX idx_steps_kind ON steps(kind);\nCREATE INDEX idx_steps_tool ON steps(tool_name);\n`;\n\n/** SQL to derive the sessions table from indexed runs. */\nexport const DERIVE_SESSIONS_SQL = `\nINSERT INTO sessions (session_id, run_count, first_started_at, last_ended_at)\nSELECT session_id, COUNT(*), MIN(started_at), MAX(ended_at)\nFROM runs\nWHERE session_id IS NOT NULL\nGROUP BY session_id;\n`;\n\nexport const META_KEYS = {\n schemaVersion: \"schemaVersion\",\n builtAt: \"builtAt\",\n sourceDir: \"sourceDir\",\n fileCount: \"fileCount\",\n driver: \"driver\",\n} as const;\n\nexport function metaDefaults(sourceDir: string, fileCount: number) {\n return {\n [META_KEYS.schemaVersion]: INDEX_SCHEMA_VERSION,\n [META_KEYS.builtAt]: new Date().toISOString(),\n [META_KEYS.sourceDir]: sourceDir,\n [META_KEYS.fileCount]: String(fileCount),\n [META_KEYS.driver]: \"better-sqlite3\",\n } as Record<string, string>;\n}\n","import { createRequire } from \"node:module\";\n\nimport type BetterSqlite3 from \"better-sqlite3\";\n\nexport type SqliteDatabase = BetterSqlite3.Database;\nexport type SqliteConstructor = typeof BetterSqlite3;\n\nlet cached: SqliteConstructor | undefined;\n\n/**\n * Lazily load better-sqlite3 when index build/query starts.\n * Importing `@agent-inspect/index-sqlite` must not require the native driver.\n */\nexport function loadBetterSqlite3(): SqliteConstructor {\n if (cached !== undefined) return cached;\n try {\n const require = createRequire(import.meta.url);\n cached = require(\"better-sqlite3\") as SqliteConstructor;\n return cached;\n } catch (error) {\n const detail = error instanceof Error ? error.message : String(error);\n throw new Error(\n `better-sqlite3 native driver is unavailable (${detail}). ` +\n `Install a prebuild for your Node/OS (see better-sqlite3 docs) or fall back to JSONL directory scans without the SQLite index. ` +\n `Core agent-inspect remains usable without this optional package.`,\n );\n }\n}\n\n/** Test helper — clear the cached constructor between cases. */\nexport function resetBetterSqlite3CacheForTests(): void {\n cached = undefined;\n}\n","import { mkdir, readFile, rm } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport {\n TraceDirectory,\n parseTraceJsonl,\n resolveTraceDir,\n validateEvent,\n} from \"agent-inspect/advanced\";\nimport type { TraceEvent } from \"agent-inspect/advanced\";\n\nimport {\n DERIVE_SESSIONS_SQL,\n INDEX_SCHEMA_SQL,\n META_KEYS,\n metaDefaults,\n} from \"./schema.js\";\nimport { loadBetterSqlite3 } from \"./load-sqlite.js\";\nimport {\n INDEX_DB_FILENAME,\n type BuildIndexOptions,\n type BuildIndexResult,\n type IndexedRun,\n type IndexedStep,\n} from \"./types.js\";\n\nconst DEFAULT_MAX_RUNS = 10_000;\n\n/** Resolves the index database path for a trace directory. */\nexport function resolveIndexDbPath(traceDir: string, dbPath?: string): string {\n if (dbPath && dbPath.trim() !== \"\") return path.resolve(dbPath);\n return path.join(path.resolve(traceDir), INDEX_DB_FILENAME);\n}\n\nfunction str(value: unknown): string | null {\n return typeof value === \"string\" && value !== \"\" ? value : null;\n}\n\nfunction num(value: unknown): number | null {\n return typeof value === \"number\" && Number.isFinite(value) ? value : null;\n}\n\ninterface DerivedRun {\n run: IndexedRun;\n steps: IndexedStep[];\n errors: Array<{ stepId: string | null; message: string | null; code: string | null }>;\n}\n\nfunction deriveRun(file: string, mtimeMs: number, events: TraceEvent[]): DerivedRun | null {\n const started = events.find((e) => e.event === \"run_started\");\n if (!started || started.event !== \"run_started\") return null;\n\n const completed = events.find((e) => e.event === \"run_completed\");\n const metadata = (started.metadata ?? {}) as Record<string, unknown>;\n\n const run: IndexedRun = {\n runId: started.runId,\n file,\n mtimeMs,\n name: str(started.name),\n status: completed && completed.event === \"run_completed\" ? completed.status : null,\n startedAt: num(started.startTime),\n endedAt: completed && completed.event === \"run_completed\" ? num(completed.endTime) : null,\n durationMs:\n completed && completed.event === \"run_completed\" ? num(completed.durationMs) : null,\n sessionId: str(metadata.sessionId),\n groupId: str(metadata.groupId),\n correlationId: str(metadata.correlationId),\n };\n\n const stepStarts = new Map<string, Extract<TraceEvent, { event: \"step_started\" }>>();\n const steps: IndexedStep[] = [];\n const errors: DerivedRun[\"errors\"] = [];\n\n if (completed && completed.event === \"run_completed\" && completed.error) {\n errors.push({\n stepId: null,\n message: str(completed.error.message),\n code: str((completed.error as { code?: unknown }).code),\n });\n }\n\n for (const event of events) {\n if (event.event === \"step_started\") {\n stepStarts.set(event.stepId, event);\n }\n }\n\n for (const event of events) {\n if (event.event !== \"step_completed\") continue;\n const start = stepStarts.get(event.stepId);\n const meta = (start?.metadata ?? {}) as Record<string, unknown>;\n steps.push({\n runId: run.runId,\n stepId: event.stepId,\n kind: start ? str(start.type) : null,\n name: start ? str(start.name) : null,\n status: event.status,\n durationMs: num(event.durationMs),\n toolName: str(meta.toolName),\n model: str(meta.model),\n parentId: start ? str(start.parentId) : null,\n });\n if (event.error) {\n errors.push({\n stepId: event.stepId,\n message: str(event.error.message),\n code: str((event.error as { code?: unknown }).code),\n });\n }\n }\n\n return { run, steps, errors };\n}\n\n/**\n * Builds (or fully rebuilds) the local SQLite index from a trace directory.\n * Idempotent: rebuilding from identical inputs yields identical contents.\n * Never mutates trace files.\n */\nexport async function buildIndex(\n options: BuildIndexOptions = {},\n): Promise<BuildIndexResult> {\n const traceDir = resolveTraceDir({ dir: options.traceDir });\n const dbPath = resolveIndexDbPath(traceDir, options.dbPath);\n const maxRuns = options.maxRuns ?? DEFAULT_MAX_RUNS;\n const warnings: string[] = [];\n\n const td = new TraceDirectory({ dir: traceDir });\n const files = await td.list();\n if (files.length > maxRuns) {\n warnings.push(\n `index.truncated: ${files.length} trace files present; indexing first ${maxRuns}`,\n );\n }\n const slice = files.slice(0, maxRuns);\n\n const derived: DerivedRun[] = [];\n for (const file of slice) {\n try {\n const raw = await readFile(td.getPath(file), \"utf-8\");\n const parsed = parseTraceJsonl(raw, { validate: validateEvent });\n const stats = await td.getFileStats(file);\n const one = deriveRun(file, stats.mtimeMs, parsed.events);\n if (one) derived.push(one);\n else warnings.push(`index.skipped: ${file} has no run_started event`);\n } catch {\n warnings.push(`index.unreadable: ${file}`);\n }\n }\n\n await mkdir(path.dirname(dbPath), { recursive: true });\n // Remove any prior (possibly corrupt) file so the rebuild is deterministic.\n await rm(dbPath, { force: true });\n\n const Sqlite = loadBetterSqlite3();\n const db = new Sqlite(dbPath);\n let runCount = 0;\n let stepCount = 0;\n let errorCount = 0;\n try {\n db.pragma(\"journal_mode = WAL\");\n db.exec(INDEX_SCHEMA_SQL);\n\n const insertRun = db.prepare(\n `INSERT INTO runs (run_id, file, mtime_ms, name, status, started_at, ended_at, duration_ms, session_id, group_id, correlation_id)\n VALUES (@runId, @file, @mtimeMs, @name, @status, @startedAt, @endedAt, @durationMs, @sessionId, @groupId, @correlationId)`,\n );\n const insertStep = db.prepare(\n `INSERT INTO steps (run_id, step_id, kind, name, status, duration_ms, tool_name, model, parent_id)\n VALUES (@runId, @stepId, @kind, @name, @status, @durationMs, @toolName, @model, @parentId)`,\n );\n const insertError = db.prepare(\n `INSERT INTO errors (run_id, step_id, message, code) VALUES (@runId, @stepId, @message, @code)`,\n );\n const insertMeta = db.prepare(`INSERT INTO meta (key, value) VALUES (?, ?)`);\n\n const write = db.transaction((items: DerivedRun[]) => {\n const seen = new Set<string>();\n for (const item of items) {\n if (seen.has(item.run.runId)) continue;\n seen.add(item.run.runId);\n insertRun.run(item.run);\n runCount += 1;\n for (const step of item.steps) {\n insertStep.run(step);\n stepCount += 1;\n }\n for (const err of item.errors) {\n insertError.run({ runId: item.run.runId, ...err });\n errorCount += 1;\n }\n }\n db.exec(DERIVE_SESSIONS_SQL);\n for (const [key, value] of Object.entries(metaDefaults(traceDir, slice.length))) {\n insertMeta.run(key, value);\n }\n });\n write(derived);\n } finally {\n db.close();\n }\n\n const builtAtRow = readMetaValue(dbPath, META_KEYS.builtAt);\n\n return {\n dbPath,\n traceDir,\n runs: runCount,\n steps: stepCount,\n errors: errorCount,\n builtAt: builtAtRow ?? new Date().toISOString(),\n warnings,\n };\n}\n\n/** Alias for {@link buildIndex}; a rebuild is a full, idempotent build. */\nexport const rebuildIndex = buildIndex;\n\nfunction readMetaValue(dbPath: string, key: string): string | null {\n try {\n const Sqlite = loadBetterSqlite3();\n const db = new Sqlite(dbPath, { readonly: true, fileMustExist: true });\n try {\n const row = db.prepare(`SELECT value FROM meta WHERE key = ?`).get(key) as\n | { value: string }\n | undefined;\n return row?.value ?? null;\n } finally {\n db.close();\n }\n } catch {\n return null;\n }\n}\n\n/** Deletes the index database file. Always safe; traces are unaffected. */\nexport async function cleanIndex(dbPath: string): Promise<void> {\n await rm(dbPath, { force: true });\n await rm(`${dbPath}-wal`, { force: true });\n await rm(`${dbPath}-shm`, { force: true });\n}\n","import { existsSync } from \"node:fs\";\n\nimport type Database from \"better-sqlite3\";\n\nimport { loadBetterSqlite3 } from \"./load-sqlite.js\";\nimport { META_KEYS } from \"./schema.js\";\nimport type { IndexStatus, IndexedRun, RunQuery } from \"./types.js\";\n\ninterface OpenResult {\n db: Database.Database;\n healthy: boolean;\n}\n\n/**\n * Opens the index read-only and verifies integrity. Returns `null` when the\n * file is missing, the native driver is unavailable, or integrity fails, so\n * callers can fall back to a full rebuild or a directory scan.\n */\nfunction openHealthy(dbPath: string): OpenResult | null {\n if (!existsSync(dbPath)) return null;\n let Sqlite: ReturnType<typeof loadBetterSqlite3>;\n try {\n Sqlite = loadBetterSqlite3();\n } catch {\n return null;\n }\n try {\n const db = new Sqlite(dbPath, { readonly: true, fileMustExist: true });\n try {\n const result = db.pragma(\"integrity_check\", { simple: true });\n if (result !== \"ok\") {\n db.close();\n return null;\n }\n // Confirm the expected schema is present.\n db.prepare(`SELECT 1 FROM meta LIMIT 1`).get();\n db.prepare(`SELECT 1 FROM runs LIMIT 1`).get();\n return { db, healthy: true };\n } catch {\n db.close();\n return null;\n }\n } catch {\n return null;\n }\n}\n\nfunction meta(db: Database.Database, key: string): string | null {\n const row = db.prepare(`SELECT value FROM meta WHERE key = ?`).get(key) as\n | { value: string }\n | undefined;\n return row?.value ?? null;\n}\n\n/** Reports index presence, health, and basic counts. Never throws. */\nexport function indexStatus(dbPath: string): IndexStatus {\n const opened = openHealthy(dbPath);\n if (!opened) {\n return {\n dbPath,\n exists: existsSync(dbPath),\n healthy: false,\n builtAt: null,\n sourceDir: null,\n schemaVersion: null,\n runs: 0,\n steps: 0,\n };\n }\n const { db } = opened;\n try {\n const runs = (db.prepare(`SELECT COUNT(*) AS c FROM runs`).get() as { c: number }).c;\n const steps = (db.prepare(`SELECT COUNT(*) AS c FROM steps`).get() as { c: number }).c;\n const builtAt = meta(db, META_KEYS.builtAt);\n const refreshStatus: IndexStatus[\"refreshStatus\"] =\n runs === 0 ? \"fallback-scan\" : builtAt ? \"complete\" : \"partial\";\n return {\n dbPath,\n exists: true,\n healthy: true,\n builtAt,\n sourceDir: meta(db, META_KEYS.sourceDir),\n schemaVersion: meta(db, META_KEYS.schemaVersion),\n runs,\n steps,\n refreshStatus,\n };\n } finally {\n db.close();\n }\n}\n\n/** Returns true when the index is missing, corrupt, or older than any trace. */\nexport function isIndexStale(dbPath: string, newestTraceMtimeMs: number): boolean {\n const opened = openHealthy(dbPath);\n if (!opened) return true;\n try {\n const builtAt = meta(opened.db, META_KEYS.builtAt);\n if (!builtAt) return true;\n const builtMs = Date.parse(builtAt);\n if (Number.isNaN(builtMs)) return true;\n return newestTraceMtimeMs > builtMs;\n } finally {\n opened.db.close();\n }\n}\n\nfunction mapRow(row: Record<string, unknown>): IndexedRun {\n return {\n runId: row.run_id as string,\n file: row.file as string,\n mtimeMs: row.mtime_ms as number,\n name: (row.name as string | null) ?? null,\n status: (row.status as string | null) ?? null,\n startedAt: (row.started_at as number | null) ?? null,\n endedAt: (row.ended_at as number | null) ?? null,\n durationMs: (row.duration_ms as number | null) ?? null,\n sessionId: (row.session_id as string | null) ?? null,\n groupId: (row.group_id as string | null) ?? null,\n correlationId: (row.correlation_id as string | null) ?? null,\n };\n}\n\n/**\n * Queries indexed runs. Returns an empty array when the index is missing or\n * corrupt (the caller should fall back to a directory scan).\n */\nexport function queryRuns(dbPath: string, query: RunQuery = {}): IndexedRun[] {\n const opened = openHealthy(dbPath);\n if (!opened) return [];\n const { db } = opened;\n try {\n const where: string[] = [];\n const params: Record<string, unknown> = {};\n\n if (query.status) {\n where.push(`r.status = @status`);\n params.status = query.status;\n }\n if (query.sessionId) {\n where.push(`r.session_id = @sessionId`);\n params.sessionId = query.sessionId;\n }\n if (query.name) {\n where.push(`LOWER(r.name) LIKE @name`);\n params.name = `%${query.name.toLowerCase()}%`;\n }\n if (query.kind) {\n where.push(`EXISTS (SELECT 1 FROM steps s WHERE s.run_id = r.run_id AND s.kind = @kind)`);\n params.kind = query.kind;\n }\n if (query.tool) {\n where.push(\n `EXISTS (SELECT 1 FROM steps s WHERE s.run_id = r.run_id AND LOWER(s.tool_name) LIKE @tool)`,\n );\n params.tool = `%${query.tool.toLowerCase()}%`;\n }\n\n const limit = Number.isInteger(query.limit) && query.limit! > 0 ? query.limit! : 100;\n const sql = `SELECT r.* FROM runs r ${\n where.length ? `WHERE ${where.join(\" AND \")}` : \"\"\n } ORDER BY r.started_at DESC LIMIT ${limit}`;\n\n const rows = db.prepare(sql).all(params) as Array<Record<string, unknown>>;\n return rows.map(mapRow);\n } finally {\n db.close();\n }\n}\n"]}
1
+ {"version":3,"sources":["../../index-sqlite/src/types.ts","../../index-sqlite/src/schema.ts","../../index-sqlite/src/load-sqlite.ts","../../index-sqlite/src/builder.ts","../../index-sqlite/src/query.ts"],"names":["require","meta"],"mappings":"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","file":"src-YAASTXGE.mjs","sourcesContent":["/**\n * Public types for the optional local SQLite trace index (v4.1, experimental).\n *\n * @remarks\n * Local-only. The index is derived from JSONL traces and is always safe to\n * delete. Trace files are never mutated. No network access.\n */\n\n/** Current index schema version. Bumped when table layout changes. */\nexport const INDEX_SCHEMA_VERSION = \"1\" as const;\n\n/** Default index database filename. */\nexport const INDEX_DB_FILENAME = \"trace-index.sqlite\";\n\n/** A derived run row in the index. */\nexport interface IndexedRun {\n runId: string;\n file: string;\n mtimeMs: number;\n name: string | null;\n status: string | null;\n startedAt: number | null;\n endedAt: number | null;\n durationMs: number | null;\n sessionId: string | null;\n groupId: string | null;\n correlationId: string | null;\n}\n\n/** A derived step row in the index. */\nexport interface IndexedStep {\n runId: string;\n stepId: string;\n kind: string | null;\n name: string | null;\n status: string | null;\n durationMs: number | null;\n toolName: string | null;\n model: string | null;\n parentId: string | null;\n}\n\n/** Options for building/rebuilding the index. */\nexport interface BuildIndexOptions {\n /** Trace directory to index. Resolved via core `resolveTraceDir` when omitted. */\n traceDir?: string;\n /** Index database path. Defaults to `<traceDir>/<INDEX_DB_FILENAME>`. */\n dbPath?: string;\n /** Cap on the number of trace files indexed (default 10000). */\n maxRuns?: number;\n}\n\n/** Result of a build/rebuild. */\nexport interface BuildIndexResult {\n dbPath: string;\n traceDir: string;\n runs: number;\n steps: number;\n errors: number;\n builtAt: string;\n warnings: string[];\n}\n\n/** Status of an existing index. */\nexport interface IndexStatus {\n dbPath: string;\n exists: boolean;\n healthy: boolean;\n builtAt: string | null;\n sourceDir: string | null;\n schemaVersion: string | null;\n runs: number;\n steps: number;\n /** Derived lifecycle: complete, partial, stale, or fallback-scan */\n refreshStatus?: \"complete\" | \"partial\" | \"stale\" | \"fallback-scan\";\n}\n\n/** Filter for querying indexed runs. */\nexport interface RunQuery {\n status?: string;\n sessionId?: string;\n /** Case-insensitive substring match on run name. */\n name?: string;\n /** Match runs that contain a step of this kind. */\n kind?: string;\n /** Match runs that contain a step with this tool name (substring). */\n tool?: string;\n limit?: number;\n}\n","import { INDEX_SCHEMA_VERSION } from \"./types.js\";\n\n/**\n * Idempotent DDL for the local trace index. A full rebuild drops and recreates\n * all tables, so building twice from the same inputs yields identical contents.\n */\nexport const INDEX_SCHEMA_SQL = `\nDROP TABLE IF EXISTS meta;\nDROP TABLE IF EXISTS errors;\nDROP TABLE IF EXISTS steps;\nDROP TABLE IF EXISTS sessions;\nDROP TABLE IF EXISTS runs;\n\nCREATE TABLE meta (\n key TEXT PRIMARY KEY,\n value TEXT\n);\n\nCREATE TABLE runs (\n run_id TEXT PRIMARY KEY,\n file TEXT NOT NULL,\n mtime_ms REAL NOT NULL,\n name TEXT,\n status TEXT,\n started_at REAL,\n ended_at REAL,\n duration_ms REAL,\n session_id TEXT,\n group_id TEXT,\n correlation_id TEXT\n);\n\nCREATE TABLE steps (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n run_id TEXT NOT NULL,\n step_id TEXT NOT NULL,\n kind TEXT,\n name TEXT,\n status TEXT,\n duration_ms REAL,\n tool_name TEXT,\n model TEXT,\n parent_id TEXT\n);\n\nCREATE TABLE errors (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n run_id TEXT NOT NULL,\n step_id TEXT,\n message TEXT,\n code TEXT\n);\n\nCREATE TABLE sessions (\n session_id TEXT PRIMARY KEY,\n run_count INTEGER NOT NULL,\n first_started_at REAL,\n last_ended_at REAL\n);\n\nCREATE INDEX idx_runs_status ON runs(status);\nCREATE INDEX idx_runs_session ON runs(session_id);\nCREATE INDEX idx_runs_started ON runs(started_at);\nCREATE INDEX idx_steps_run ON steps(run_id);\nCREATE INDEX idx_steps_kind ON steps(kind);\nCREATE INDEX idx_steps_tool ON steps(tool_name);\n`;\n\n/** SQL to derive the sessions table from indexed runs. */\nexport const DERIVE_SESSIONS_SQL = `\nINSERT INTO sessions (session_id, run_count, first_started_at, last_ended_at)\nSELECT session_id, COUNT(*), MIN(started_at), MAX(ended_at)\nFROM runs\nWHERE session_id IS NOT NULL\nGROUP BY session_id;\n`;\n\nexport const META_KEYS = {\n schemaVersion: \"schemaVersion\",\n builtAt: \"builtAt\",\n sourceDir: \"sourceDir\",\n fileCount: \"fileCount\",\n driver: \"driver\",\n} as const;\n\nexport function metaDefaults(sourceDir: string, fileCount: number) {\n return {\n [META_KEYS.schemaVersion]: INDEX_SCHEMA_VERSION,\n [META_KEYS.builtAt]: new Date().toISOString(),\n [META_KEYS.sourceDir]: sourceDir,\n [META_KEYS.fileCount]: String(fileCount),\n [META_KEYS.driver]: \"better-sqlite3\",\n } as Record<string, string>;\n}\n","import { createRequire } from \"node:module\";\n\nimport type BetterSqlite3 from \"better-sqlite3\";\n\nexport type SqliteDatabase = BetterSqlite3.Database;\nexport type SqliteConstructor = typeof BetterSqlite3;\n\nlet cached: SqliteConstructor | undefined;\n\n/**\n * Lazily load better-sqlite3 when index build/query starts.\n * Importing `@agent-inspect/index-sqlite` must not require the native driver.\n */\nexport function loadBetterSqlite3(): SqliteConstructor {\n if (cached !== undefined) return cached;\n try {\n const require = createRequire(import.meta.url);\n cached = require(\"better-sqlite3\") as SqliteConstructor;\n return cached;\n } catch (error) {\n const detail = error instanceof Error ? error.message : String(error);\n throw new Error(\n `better-sqlite3 native driver is unavailable (${detail}). ` +\n `Install a prebuild for your Node/OS (see better-sqlite3 docs) or fall back to JSONL directory scans without the SQLite index. ` +\n `Core agent-inspect remains usable without this optional package.`,\n );\n }\n}\n\n/** Test helper — clear the cached constructor between cases. */\nexport function resetBetterSqlite3CacheForTests(): void {\n cached = undefined;\n}\n","import { mkdir, readFile, rm } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport {\n TraceDirectory,\n parseTraceJsonl,\n resolveTraceDir,\n validateEvent,\n} from \"agent-inspect/advanced\";\nimport type { TraceEvent } from \"agent-inspect/advanced\";\n\nimport {\n DERIVE_SESSIONS_SQL,\n INDEX_SCHEMA_SQL,\n META_KEYS,\n metaDefaults,\n} from \"./schema.js\";\nimport { loadBetterSqlite3 } from \"./load-sqlite.js\";\nimport {\n INDEX_DB_FILENAME,\n type BuildIndexOptions,\n type BuildIndexResult,\n type IndexedRun,\n type IndexedStep,\n} from \"./types.js\";\n\nconst DEFAULT_MAX_RUNS = 10_000;\n\n/** Resolves the index database path for a trace directory. */\nexport function resolveIndexDbPath(traceDir: string, dbPath?: string): string {\n if (dbPath && dbPath.trim() !== \"\") return path.resolve(dbPath);\n return path.join(path.resolve(traceDir), INDEX_DB_FILENAME);\n}\n\nfunction str(value: unknown): string | null {\n return typeof value === \"string\" && value !== \"\" ? value : null;\n}\n\nfunction num(value: unknown): number | null {\n return typeof value === \"number\" && Number.isFinite(value) ? value : null;\n}\n\ninterface DerivedRun {\n run: IndexedRun;\n steps: IndexedStep[];\n errors: Array<{ stepId: string | null; message: string | null; code: string | null }>;\n}\n\nfunction deriveRun(file: string, mtimeMs: number, events: TraceEvent[]): DerivedRun | null {\n const started = events.find((e) => e.event === \"run_started\");\n if (!started || started.event !== \"run_started\") return null;\n\n const completed = events.find((e) => e.event === \"run_completed\");\n const metadata = (started.metadata ?? {}) as Record<string, unknown>;\n\n const run: IndexedRun = {\n runId: started.runId,\n file,\n mtimeMs,\n name: str(started.name),\n status: completed && completed.event === \"run_completed\" ? completed.status : null,\n startedAt: num(started.startTime),\n endedAt: completed && completed.event === \"run_completed\" ? num(completed.endTime) : null,\n durationMs:\n completed && completed.event === \"run_completed\" ? num(completed.durationMs) : null,\n sessionId: str(metadata.sessionId),\n groupId: str(metadata.groupId),\n correlationId: str(metadata.correlationId),\n };\n\n const stepStarts = new Map<string, Extract<TraceEvent, { event: \"step_started\" }>>();\n const steps: IndexedStep[] = [];\n const errors: DerivedRun[\"errors\"] = [];\n\n if (completed && completed.event === \"run_completed\" && completed.error) {\n errors.push({\n stepId: null,\n message: str(completed.error.message),\n code: str((completed.error as { code?: unknown }).code),\n });\n }\n\n for (const event of events) {\n if (event.event === \"step_started\") {\n stepStarts.set(event.stepId, event);\n }\n }\n\n for (const event of events) {\n if (event.event !== \"step_completed\") continue;\n const start = stepStarts.get(event.stepId);\n const meta = (start?.metadata ?? {}) as Record<string, unknown>;\n steps.push({\n runId: run.runId,\n stepId: event.stepId,\n kind: start ? str(start.type) : null,\n name: start ? str(start.name) : null,\n status: event.status,\n durationMs: num(event.durationMs),\n toolName: str(meta.toolName),\n model: str(meta.model),\n parentId: start ? str(start.parentId) : null,\n });\n if (event.error) {\n errors.push({\n stepId: event.stepId,\n message: str(event.error.message),\n code: str((event.error as { code?: unknown }).code),\n });\n }\n }\n\n return { run, steps, errors };\n}\n\n/**\n * Builds (or fully rebuilds) the local SQLite index from a trace directory.\n * Idempotent: rebuilding from identical inputs yields identical contents.\n * Never mutates trace files.\n */\nexport async function buildIndex(\n options: BuildIndexOptions = {},\n): Promise<BuildIndexResult> {\n const traceDir = resolveTraceDir({ dir: options.traceDir });\n const dbPath = resolveIndexDbPath(traceDir, options.dbPath);\n const maxRuns = options.maxRuns ?? DEFAULT_MAX_RUNS;\n const warnings: string[] = [];\n\n const td = new TraceDirectory({ dir: traceDir });\n const files = await td.list();\n if (files.length > maxRuns) {\n warnings.push(\n `index.truncated: ${files.length} trace files present; indexing first ${maxRuns}`,\n );\n }\n const slice = files.slice(0, maxRuns);\n\n const derived: DerivedRun[] = [];\n for (const file of slice) {\n try {\n const raw = await readFile(td.getPath(file), \"utf-8\");\n const parsed = parseTraceJsonl(raw, { validate: validateEvent });\n const stats = await td.getFileStats(file);\n const one = deriveRun(file, stats.mtimeMs, parsed.events);\n if (one) derived.push(one);\n else warnings.push(`index.skipped: ${file} has no run_started event`);\n } catch {\n warnings.push(`index.unreadable: ${file}`);\n }\n }\n\n await mkdir(path.dirname(dbPath), { recursive: true });\n // Remove any prior (possibly corrupt) file so the rebuild is deterministic.\n await rm(dbPath, { force: true });\n\n const Sqlite = loadBetterSqlite3();\n const db = new Sqlite(dbPath);\n let runCount = 0;\n let stepCount = 0;\n let errorCount = 0;\n try {\n db.pragma(\"journal_mode = WAL\");\n db.exec(INDEX_SCHEMA_SQL);\n\n const insertRun = db.prepare(\n `INSERT INTO runs (run_id, file, mtime_ms, name, status, started_at, ended_at, duration_ms, session_id, group_id, correlation_id)\n VALUES (@runId, @file, @mtimeMs, @name, @status, @startedAt, @endedAt, @durationMs, @sessionId, @groupId, @correlationId)`,\n );\n const insertStep = db.prepare(\n `INSERT INTO steps (run_id, step_id, kind, name, status, duration_ms, tool_name, model, parent_id)\n VALUES (@runId, @stepId, @kind, @name, @status, @durationMs, @toolName, @model, @parentId)`,\n );\n const insertError = db.prepare(\n `INSERT INTO errors (run_id, step_id, message, code) VALUES (@runId, @stepId, @message, @code)`,\n );\n const insertMeta = db.prepare(`INSERT INTO meta (key, value) VALUES (?, ?)`);\n\n const write = db.transaction((items: DerivedRun[]) => {\n const seen = new Set<string>();\n for (const item of items) {\n if (seen.has(item.run.runId)) continue;\n seen.add(item.run.runId);\n insertRun.run(item.run);\n runCount += 1;\n for (const step of item.steps) {\n insertStep.run(step);\n stepCount += 1;\n }\n for (const err of item.errors) {\n insertError.run({ runId: item.run.runId, ...err });\n errorCount += 1;\n }\n }\n db.exec(DERIVE_SESSIONS_SQL);\n for (const [key, value] of Object.entries(metaDefaults(traceDir, slice.length))) {\n insertMeta.run(key, value);\n }\n });\n write(derived);\n } finally {\n db.close();\n }\n\n const builtAtRow = readMetaValue(dbPath, META_KEYS.builtAt);\n\n return {\n dbPath,\n traceDir,\n runs: runCount,\n steps: stepCount,\n errors: errorCount,\n builtAt: builtAtRow ?? new Date().toISOString(),\n warnings,\n };\n}\n\n/** Alias for {@link buildIndex}; a rebuild is a full, idempotent build. */\nexport const rebuildIndex = buildIndex;\n\nfunction readMetaValue(dbPath: string, key: string): string | null {\n try {\n const Sqlite = loadBetterSqlite3();\n const db = new Sqlite(dbPath, { readonly: true, fileMustExist: true });\n try {\n const row = db.prepare(`SELECT value FROM meta WHERE key = ?`).get(key) as\n | { value: string }\n | undefined;\n return row?.value ?? null;\n } finally {\n db.close();\n }\n } catch {\n return null;\n }\n}\n\n/** Deletes the index database file. Always safe; traces are unaffected. */\nexport async function cleanIndex(dbPath: string): Promise<void> {\n await rm(dbPath, { force: true });\n await rm(`${dbPath}-wal`, { force: true });\n await rm(`${dbPath}-shm`, { force: true });\n}\n","import { existsSync } from \"node:fs\";\n\nimport type Database from \"better-sqlite3\";\n\nimport { loadBetterSqlite3 } from \"./load-sqlite.js\";\nimport { META_KEYS } from \"./schema.js\";\nimport type { IndexStatus, IndexedRun, RunQuery } from \"./types.js\";\n\ninterface OpenResult {\n db: Database.Database;\n healthy: boolean;\n}\n\n/**\n * Opens the index read-only and verifies integrity. Returns `null` when the\n * file is missing, the native driver is unavailable, or integrity fails, so\n * callers can fall back to a full rebuild or a directory scan.\n */\nfunction openHealthy(dbPath: string): OpenResult | null {\n if (!existsSync(dbPath)) return null;\n let Sqlite: ReturnType<typeof loadBetterSqlite3>;\n try {\n Sqlite = loadBetterSqlite3();\n } catch {\n return null;\n }\n try {\n const db = new Sqlite(dbPath, { readonly: true, fileMustExist: true });\n try {\n const result = db.pragma(\"integrity_check\", { simple: true });\n if (result !== \"ok\") {\n db.close();\n return null;\n }\n // Confirm the expected schema is present.\n db.prepare(`SELECT 1 FROM meta LIMIT 1`).get();\n db.prepare(`SELECT 1 FROM runs LIMIT 1`).get();\n return { db, healthy: true };\n } catch {\n db.close();\n return null;\n }\n } catch {\n return null;\n }\n}\n\nfunction meta(db: Database.Database, key: string): string | null {\n const row = db.prepare(`SELECT value FROM meta WHERE key = ?`).get(key) as\n | { value: string }\n | undefined;\n return row?.value ?? null;\n}\n\n/** Reports index presence, health, and basic counts. Never throws. */\nexport function indexStatus(dbPath: string): IndexStatus {\n const opened = openHealthy(dbPath);\n if (!opened) {\n return {\n dbPath,\n exists: existsSync(dbPath),\n healthy: false,\n builtAt: null,\n sourceDir: null,\n schemaVersion: null,\n runs: 0,\n steps: 0,\n };\n }\n const { db } = opened;\n try {\n const runs = (db.prepare(`SELECT COUNT(*) AS c FROM runs`).get() as { c: number }).c;\n const steps = (db.prepare(`SELECT COUNT(*) AS c FROM steps`).get() as { c: number }).c;\n const builtAt = meta(db, META_KEYS.builtAt);\n const refreshStatus: IndexStatus[\"refreshStatus\"] =\n runs === 0 ? \"fallback-scan\" : builtAt ? \"complete\" : \"partial\";\n return {\n dbPath,\n exists: true,\n healthy: true,\n builtAt,\n sourceDir: meta(db, META_KEYS.sourceDir),\n schemaVersion: meta(db, META_KEYS.schemaVersion),\n runs,\n steps,\n refreshStatus,\n };\n } finally {\n db.close();\n }\n}\n\n/** Returns true when the index is missing, corrupt, or older than any trace. */\nexport function isIndexStale(dbPath: string, newestTraceMtimeMs: number): boolean {\n const opened = openHealthy(dbPath);\n if (!opened) return true;\n try {\n const builtAt = meta(opened.db, META_KEYS.builtAt);\n if (!builtAt) return true;\n const builtMs = Date.parse(builtAt);\n if (Number.isNaN(builtMs)) return true;\n return newestTraceMtimeMs > builtMs;\n } finally {\n opened.db.close();\n }\n}\n\nfunction mapRow(row: Record<string, unknown>): IndexedRun {\n return {\n runId: row.run_id as string,\n file: row.file as string,\n mtimeMs: row.mtime_ms as number,\n name: (row.name as string | null) ?? null,\n status: (row.status as string | null) ?? null,\n startedAt: (row.started_at as number | null) ?? null,\n endedAt: (row.ended_at as number | null) ?? null,\n durationMs: (row.duration_ms as number | null) ?? null,\n sessionId: (row.session_id as string | null) ?? null,\n groupId: (row.group_id as string | null) ?? null,\n correlationId: (row.correlation_id as string | null) ?? null,\n };\n}\n\n/**\n * Queries indexed runs. Returns an empty array when the index is missing or\n * corrupt (the caller should fall back to a directory scan).\n */\nexport function queryRuns(dbPath: string, query: RunQuery = {}): IndexedRun[] {\n const opened = openHealthy(dbPath);\n if (!opened) return [];\n const { db } = opened;\n try {\n const where: string[] = [];\n const params: Record<string, unknown> = {};\n\n if (query.status) {\n where.push(`r.status = @status`);\n params.status = query.status;\n }\n if (query.sessionId) {\n where.push(`r.session_id = @sessionId`);\n params.sessionId = query.sessionId;\n }\n if (query.name) {\n where.push(`LOWER(r.name) LIKE @name`);\n params.name = `%${query.name.toLowerCase()}%`;\n }\n if (query.kind) {\n where.push(`EXISTS (SELECT 1 FROM steps s WHERE s.run_id = r.run_id AND s.kind = @kind)`);\n params.kind = query.kind;\n }\n if (query.tool) {\n where.push(\n `EXISTS (SELECT 1 FROM steps s WHERE s.run_id = r.run_id AND LOWER(s.tool_name) LIKE @tool)`,\n );\n params.tool = `%${query.tool.toLowerCase()}%`;\n }\n\n const limit = Number.isInteger(query.limit) && query.limit! > 0 ? query.limit! : 100;\n const sql = `SELECT r.* FROM runs r ${\n where.length ? `WHERE ${where.join(\" AND \")}` : \"\"\n } ORDER BY r.started_at DESC LIMIT ${limit}`;\n\n const rows = db.prepare(sql).all(params) as Array<Record<string, unknown>>;\n return rows.map(mapRow);\n } finally {\n db.close();\n }\n}\n"]}
@@ -697,12 +697,12 @@ function persistedInspectEventToTraceEvents(event) {
697
697
  if (!isPersistedInspectEvent(event)) {
698
698
  throw new Error("Invalid PersistedInspectEvent: failed isPersistedInspectEvent");
699
699
  }
700
- const legacyEvent = event.attributes?.legacyEvent;
701
- if (legacyEvent === "run_started") return [fromLegacyRunStarted(event)];
702
- if (legacyEvent === "run_completed") return [fromLegacyRunCompleted(event)];
703
- if (legacyEvent === "step_started") return [fromLegacyStepStarted(event)];
704
- if (legacyEvent === "step_completed") return [fromLegacyStepCompleted(event)];
705
- if (legacyEvent === "outcome_observed") return [fromLegacyOutcomeObserved(event)];
700
+ const legacyEvent2 = event.attributes?.legacyEvent;
701
+ if (legacyEvent2 === "run_started") return [fromLegacyRunStarted(event)];
702
+ if (legacyEvent2 === "run_completed") return [fromLegacyRunCompleted(event)];
703
+ if (legacyEvent2 === "step_started") return [fromLegacyStepStarted(event)];
704
+ if (legacyEvent2 === "step_completed") return [fromLegacyStepCompleted(event)];
705
+ if (legacyEvent2 === "outcome_observed") return [fromLegacyOutcomeObserved(event)];
706
706
  if (event.kind === "RUN") {
707
707
  return fromNativeRun(event);
708
708
  }
@@ -7458,6 +7458,260 @@ async function resolveSuiteCaseTrace(suiteCase, options) {
7458
7458
  };
7459
7459
  }
7460
7460
 
7461
+ // packages/core/src/checks/logical-events.ts
7462
+ function isRecord8(value) {
7463
+ return typeof value === "object" && value !== null && !Array.isArray(value);
7464
+ }
7465
+ function legacyEvent(event) {
7466
+ const value = event.attributes?.legacyEvent;
7467
+ return typeof value === "string" ? value : void 0;
7468
+ }
7469
+ function stepIdOf(event) {
7470
+ const value = event.attributes?.stepId;
7471
+ if (typeof value === "string" && value.trim() !== "") return value;
7472
+ return void 0;
7473
+ }
7474
+ function cloneEvent(event) {
7475
+ return {
7476
+ ...event,
7477
+ ...event.attributes !== void 0 ? { attributes: { ...event.attributes } } : {},
7478
+ ...event.error !== void 0 ? { error: { ...event.error } } : {},
7479
+ ...event.tokenUsage !== void 0 ? { tokenUsage: { ...event.tokenUsage } } : {},
7480
+ ...event.source !== void 0 ? { source: { ...event.source } } : {}
7481
+ };
7482
+ }
7483
+ function mergeAttributes(start, complete) {
7484
+ const merged = {
7485
+ ...isRecord8(complete.attributes) ? complete.attributes : {},
7486
+ ...isRecord8(start.attributes) ? start.attributes : {}
7487
+ };
7488
+ merged.legacyEvent = start.attributes?.legacyEvent ?? complete.attributes?.legacyEvent;
7489
+ merged.legacyCompleteEvent = complete.attributes?.legacyEvent;
7490
+ if (complete.attributes?.errorStack !== void 0) {
7491
+ merged.errorStack = complete.attributes.errorStack;
7492
+ }
7493
+ return Object.keys(merged).length > 0 ? merged : void 0;
7494
+ }
7495
+ function pairStartComplete(start, complete) {
7496
+ const attributes = mergeAttributes(start, complete);
7497
+ const paired = {
7498
+ ...cloneEvent(start),
7499
+ status: complete.status,
7500
+ timestamp: complete.timestamp ?? start.timestamp,
7501
+ ...complete.endedAt !== void 0 ? { endedAt: complete.endedAt } : {},
7502
+ ...complete.durationMs !== void 0 ? { durationMs: complete.durationMs } : {},
7503
+ ...complete.error !== void 0 ? { error: { ...complete.error } } : {},
7504
+ ...complete.tokenUsage !== void 0 && start.tokenUsage === void 0 ? { tokenUsage: { ...complete.tokenUsage } } : {},
7505
+ ...attributes !== void 0 ? { attributes } : {}
7506
+ };
7507
+ return {
7508
+ ...paired,
7509
+ sourceEventIds: Object.freeze([start.eventId, complete.eventId]),
7510
+ projection: {
7511
+ paired: true,
7512
+ absorbedEventIds: Object.freeze([complete.eventId]),
7513
+ parentNormalized: false,
7514
+ ...start.parentId !== void 0 ? { originalParentId: start.parentId } : {}
7515
+ }
7516
+ };
7517
+ }
7518
+ function asLogical(event, extras) {
7519
+ return {
7520
+ ...cloneEvent(event),
7521
+ sourceEventIds: Object.freeze([event.eventId]),
7522
+ projection: {
7523
+ paired: false,
7524
+ absorbedEventIds: Object.freeze([]),
7525
+ parentNormalized: extras?.parentNormalized === true,
7526
+ ...{}
7527
+ }
7528
+ };
7529
+ }
7530
+ function projectLogicalEvents(events) {
7531
+ const diagnostics = [];
7532
+ const byRun = /* @__PURE__ */ new Map();
7533
+ for (const event of events) {
7534
+ const list = byRun.get(event.runId) ?? [];
7535
+ list.push(event);
7536
+ byRun.set(event.runId, list);
7537
+ }
7538
+ const absorbedIds = /* @__PURE__ */ new Set();
7539
+ const logicalByRawId = /* @__PURE__ */ new Map();
7540
+ const stepIdToLogicalId = /* @__PURE__ */ new Map();
7541
+ const logical = [];
7542
+ const orderedRuns = [...byRun.keys()].sort((a, b) => a.localeCompare(b));
7543
+ for (const runId of orderedRuns) {
7544
+ const runEvents = byRun.get(runId) ?? [];
7545
+ const starts = [];
7546
+ const completes = [];
7547
+ const others = [];
7548
+ for (const event of runEvents) {
7549
+ const legacy = legacyEvent(event);
7550
+ if (legacy === "step_started" || legacy === "run_started" && event.status === "running") {
7551
+ starts.push(event);
7552
+ } else if (legacy === "step_completed" || legacy === "run_completed") {
7553
+ completes.push(event);
7554
+ } else {
7555
+ others.push(event);
7556
+ }
7557
+ }
7558
+ const usedCompletes = /* @__PURE__ */ new Set();
7559
+ for (const start of starts) {
7560
+ const stepId = stepIdOf(start);
7561
+ let match;
7562
+ if (legacyEvent(start) === "run_started") {
7563
+ const candidates = completes.filter(
7564
+ (c) => !usedCompletes.has(c.eventId) && legacyEvent(c) === "run_completed"
7565
+ );
7566
+ if (candidates.length > 1) {
7567
+ diagnostics.push({
7568
+ code: "AI_LOGICAL_PAIR_AMBIGUOUS",
7569
+ message: `Multiple run_completed rows for run ${runId}; using first by eventId.`,
7570
+ eventIds: candidates.map((c) => c.eventId)
7571
+ });
7572
+ candidates.sort((a, b) => a.eventId.localeCompare(b.eventId));
7573
+ }
7574
+ match = candidates[0];
7575
+ } else if (stepId) {
7576
+ const candidates = completes.filter(
7577
+ (c) => !usedCompletes.has(c.eventId) && legacyEvent(c) === "step_completed" && stepIdOf(c) === stepId
7578
+ );
7579
+ if (candidates.length > 1) {
7580
+ diagnostics.push({
7581
+ code: "AI_LOGICAL_PAIR_AMBIGUOUS",
7582
+ message: `Multiple step_completed rows for stepId ${stepId}; using first by eventId.`,
7583
+ eventIds: candidates.map((c) => c.eventId)
7584
+ });
7585
+ candidates.sort((a, b) => a.eventId.localeCompare(b.eventId));
7586
+ }
7587
+ match = candidates[0];
7588
+ }
7589
+ if (match) {
7590
+ usedCompletes.add(match.eventId);
7591
+ absorbedIds.add(match.eventId);
7592
+ const paired = pairStartComplete(start, match);
7593
+ logical.push(paired);
7594
+ logicalByRawId.set(start.eventId, paired);
7595
+ logicalByRawId.set(match.eventId, paired);
7596
+ if (stepId) stepIdToLogicalId.set(`${runId}:${stepId}`, paired.eventId);
7597
+ } else {
7598
+ diagnostics.push({
7599
+ code: "AI_LOGICAL_PAIR_UNMATCHED_START",
7600
+ message: `No matching complete for start ${start.eventId}.`,
7601
+ eventIds: [start.eventId]
7602
+ });
7603
+ const alone = asLogical(start);
7604
+ logical.push(alone);
7605
+ logicalByRawId.set(start.eventId, alone);
7606
+ if (stepId) stepIdToLogicalId.set(`${runId}:${stepId}`, alone.eventId);
7607
+ }
7608
+ }
7609
+ for (const complete of completes) {
7610
+ if (usedCompletes.has(complete.eventId)) continue;
7611
+ diagnostics.push({
7612
+ code: "AI_LOGICAL_PAIR_UNMATCHED_COMPLETE",
7613
+ message: `No matching start for complete ${complete.eventId}.`,
7614
+ eventIds: [complete.eventId]
7615
+ });
7616
+ const alone = asLogical(complete);
7617
+ logical.push(alone);
7618
+ logicalByRawId.set(complete.eventId, alone);
7619
+ const stepId = stepIdOf(complete);
7620
+ if (stepId && !stepIdToLogicalId.has(`${runId}:${stepId}`)) {
7621
+ stepIdToLogicalId.set(`${runId}:${stepId}`, alone.eventId);
7622
+ }
7623
+ }
7624
+ for (const event of others) {
7625
+ const alone = asLogical(event);
7626
+ logical.push(alone);
7627
+ logicalByRawId.set(event.eventId, alone);
7628
+ const stepId = stepIdOf(event);
7629
+ if (stepId && !stepIdToLogicalId.has(`${runId}:${stepId}`)) {
7630
+ stepIdToLogicalId.set(`${runId}:${stepId}`, alone.eventId);
7631
+ }
7632
+ }
7633
+ }
7634
+ const logicalById = new Map(logical.map((e) => [e.eventId, e]));
7635
+ const normalized = [];
7636
+ for (const event of logical) {
7637
+ const originalParentId = event.parentId;
7638
+ if (!originalParentId) {
7639
+ normalized.push(event);
7640
+ continue;
7641
+ }
7642
+ let nextParent = originalParentId;
7643
+ let remapped = false;
7644
+ const viaAbsorbed = logicalByRawId.get(originalParentId);
7645
+ if (viaAbsorbed && viaAbsorbed.eventId !== originalParentId) {
7646
+ nextParent = viaAbsorbed.eventId;
7647
+ remapped = true;
7648
+ } else if (!logicalById.has(originalParentId)) {
7649
+ const viaStep = stepIdToLogicalId.get(`${event.runId}:${originalParentId}`);
7650
+ if (viaStep) {
7651
+ nextParent = viaStep;
7652
+ remapped = true;
7653
+ }
7654
+ }
7655
+ if (!remapped) {
7656
+ if (!logicalById.has(originalParentId) && !logicalByRawId.has(originalParentId)) {
7657
+ diagnostics.push({
7658
+ code: "AI_LOGICAL_PARENT_UNRESOLVED",
7659
+ message: `Parent ${originalParentId} unresolved for ${event.eventId}.`,
7660
+ eventIds: [event.eventId]
7661
+ });
7662
+ }
7663
+ normalized.push(event);
7664
+ continue;
7665
+ }
7666
+ diagnostics.push({
7667
+ code: "AI_LOGICAL_PARENT_REMAPPED",
7668
+ message: `Remapped parent ${originalParentId} \u2192 ${nextParent} for ${event.eventId}.`,
7669
+ eventIds: [event.eventId]
7670
+ });
7671
+ normalized.push({
7672
+ ...event,
7673
+ parentId: nextParent,
7674
+ projection: {
7675
+ ...event.projection,
7676
+ parentNormalized: true,
7677
+ originalParentId
7678
+ }
7679
+ });
7680
+ }
7681
+ const rawIndex = new Map(events.map((e, i) => [e.eventId, i]));
7682
+ normalized.sort((a, b) => {
7683
+ const ai = rawIndex.get(a.sourceEventIds[0]) ?? 0;
7684
+ const bi = rawIndex.get(b.sourceEventIds[0]) ?? 0;
7685
+ return ai - bi || a.eventId.localeCompare(b.eventId);
7686
+ });
7687
+ return {
7688
+ logicalEvents: Object.freeze(normalized),
7689
+ diagnostics: Object.freeze(diagnostics)
7690
+ };
7691
+ }
7692
+ function resolveCanonicalToolName(event) {
7693
+ const attrs = event.attributes;
7694
+ const direct = pickString(attrs, ["toolName", "tool"]);
7695
+ if (direct) return direct;
7696
+ const metadata = attrs?.metadata;
7697
+ if (isRecord8(metadata)) {
7698
+ const nested = pickString(metadata, ["toolName", "tool"]);
7699
+ if (nested) return nested;
7700
+ }
7701
+ for (const prefix of ["tool:", "function:", "mcp-tools:"]) {
7702
+ if (event.name.startsWith(prefix)) return event.name.slice(prefix.length);
7703
+ }
7704
+ return event.name;
7705
+ }
7706
+ function pickString(record, keys) {
7707
+ if (!record) return void 0;
7708
+ for (const key of keys) {
7709
+ const value = record[key];
7710
+ if (typeof value === "string" && value.trim() !== "") return value.trim();
7711
+ }
7712
+ return void 0;
7713
+ }
7714
+
7461
7715
  // packages/core/src/checks/index.ts
7462
7716
  var SEVERITY_RANK = {
7463
7717
  error: 0,
@@ -7521,10 +7775,13 @@ function buildFacts2(input, selectedRun) {
7521
7775
  childrenByParentId.set(parentId, children);
7522
7776
  }
7523
7777
  }
7778
+ const projection = projectLogicalEvents(scopedEvents);
7524
7779
  return {
7525
7780
  format: input.read.format,
7526
7781
  runs: Object.freeze([...input.read.runs]),
7527
7782
  events: Object.freeze([...scopedEvents]),
7783
+ logicalEvents: projection.logicalEvents,
7784
+ logicalProjectionDiagnostics: projection.diagnostics,
7528
7785
  readerWarnings: Object.freeze([...input.read.warnings]),
7529
7786
  unsupportedFields: Object.freeze([...input.read.unsupportedFields]),
7530
7787
  sourceFiles: Object.freeze([...input.read.sourceFiles]),
@@ -7703,7 +7960,10 @@ function failFinding(ruleId, message, evidence, expected, actual, meta) {
7703
7960
  };
7704
7961
  }
7705
7962
  function toolName(event) {
7706
- return stringAttr(event, ["toolName", "tool"]) ?? stripPrefix(event.name, ["tool:", "function:", "mcp-tools:"]);
7963
+ return resolveCanonicalToolName(event);
7964
+ }
7965
+ function semanticEvents(context) {
7966
+ return context.logicalEvents ?? context.events;
7707
7967
  }
7708
7968
  function llmModel(event) {
7709
7969
  return stringAttr(event, ["model", "modelId", "responseModelId", "modelName", "model_name"]) ?? stripPrefix(event.name, ["llm:", "generation:", "transcription:", "speech:"]);
@@ -7715,7 +7975,7 @@ function llmFinishReason(event) {
7715
7975
  return stringAttr(event, ["finishReason", "rawFinishReason", "finish_reason"]);
7716
7976
  }
7717
7977
  function finishedEvents(context, kind) {
7718
- return context.events.filter(
7978
+ return semanticEvents(context).filter(
7719
7979
  (event) => (kind === void 0 || event.kind === kind) && event.status !== "running"
7720
7980
  );
7721
7981
  }
@@ -7741,7 +8001,7 @@ function createRunStatusRule(options = {}) {
7741
8001
  );
7742
8002
  }
7743
8003
  if (!allowIncomplete) {
7744
- const running = context.events.filter((event) => event.status === "running");
8004
+ const running = semanticEvents(context).filter((event) => event.status === "running");
7745
8005
  if (running.length > 0) {
7746
8006
  findings.push(
7747
8007
  failFinding(
@@ -7978,14 +8238,14 @@ function runTraceChecks(input, options = {}) {
7978
8238
  }
7979
8239
 
7980
8240
  // packages/core/src/persisted/token-usage.ts
7981
- function isRecord8(value) {
8241
+ function isRecord9(value) {
7982
8242
  return typeof value === "object" && value !== null && !Array.isArray(value);
7983
8243
  }
7984
8244
  function nonNegativeFinite(value) {
7985
8245
  return typeof value === "number" && Number.isFinite(value) && value >= 0 ? value : void 0;
7986
8246
  }
7987
8247
  function normalizeTokenUsage(value) {
7988
- if (!isRecord8(value)) return void 0;
8248
+ if (!isRecord9(value)) return void 0;
7989
8249
  const input = nonNegativeFinite(value.input);
7990
8250
  const output = nonNegativeFinite(value.output);
7991
8251
  const suppliedTotal = nonNegativeFinite(value.total);
@@ -8754,7 +9014,7 @@ function persistedEventsForParsedTrace(parsed) {
8754
9014
  sourceName: "agent-inspect-jsonl-reader"
8755
9015
  });
8756
9016
  }
8757
- function isRecord9(value) {
9017
+ function isRecord10(value) {
8758
9018
  return typeof value === "object" && value !== null && !Array.isArray(value);
8759
9019
  }
8760
9020
  function isNonEmptyString4(value) {
@@ -8769,13 +9029,13 @@ function readStringField(record, keys) {
8769
9029
  }
8770
9030
  function readRecordField(record, key) {
8771
9031
  const value = record[key];
8772
- return isRecord9(value) ? value : void 0;
9032
+ return isRecord10(value) ? value : void 0;
8773
9033
  }
8774
9034
  function parseJsonDocument(content) {
8775
9035
  return JSON.parse(content);
8776
9036
  }
8777
9037
  function looksLikeOpenInferenceSpan(value) {
8778
- if (!isRecord9(value)) return false;
9038
+ if (!isRecord10(value)) return false;
8779
9039
  const attributes = readRecordField(value, "attributes");
8780
9040
  return readStringField(value, ["trace_id", "traceId"]) !== void 0 && readStringField(value, ["span_id", "spanId"]) !== void 0 && (readStringField(value, ["name"]) !== void 0 || attributes?.["openinference.span.kind"] !== void 0);
8781
9041
  }
@@ -8800,7 +9060,7 @@ function extractOpenInferenceDocument(root) {
8800
9060
  unsupportedFields
8801
9061
  };
8802
9062
  }
8803
- if (!isRecord9(root)) return void 0;
9063
+ if (!isRecord10(root)) return void 0;
8804
9064
  const rootFormat = root.format;
8805
9065
  const rootCompatibility = root.compatibility;
8806
9066
  const version = typeof root.version === "string" && root.version.trim() !== "" ? root.version : void 0;
@@ -8940,7 +9200,7 @@ function summarizeAttributeValue(value) {
8940
9200
  if (Array.isArray(value)) {
8941
9201
  return { type: "array", length: value.length };
8942
9202
  }
8943
- if (isRecord9(value)) {
9203
+ if (isRecord10(value)) {
8944
9204
  return { type: "object", keyCount: Object.keys(value).length };
8945
9205
  }
8946
9206
  if (value === null) {
@@ -9027,7 +9287,7 @@ function mapOpenInferenceKind(span, attributes, pathPrefix) {
9027
9287
  }
9028
9288
  }
9029
9289
  function mapOpenInferenceStatus(status) {
9030
- if (!isRecord9(status)) return void 0;
9290
+ if (!isRecord10(status)) return void 0;
9031
9291
  const rawCode = status.code;
9032
9292
  if (typeof rawCode !== "string") return void 0;
9033
9293
  switch (rawCode.toUpperCase()) {
@@ -9127,7 +9387,7 @@ function mapOpenInferenceSpan(span, index, version) {
9127
9387
  warnings.push(...kindWarnings);
9128
9388
  const status = mapOpenInferenceStatus(span.status);
9129
9389
  const tokenUsage = readOpenInferenceTokenUsage(rawAttributes);
9130
- const errorMessage = isRecord9(span.status) && typeof span.status.message === "string" ? span.status.message : void 0;
9390
+ const errorMessage = isRecord10(span.status) && typeof span.status.message === "string" ? span.status.message : void 0;
9131
9391
  const event = {
9132
9392
  schemaVersion: "0.2",
9133
9393
  eventId: typeof rawAttributes["agent_inspect.event_id"] === "string" ? rawAttributes["agent_inspect.event_id"] : spanId,
@@ -9273,7 +9533,7 @@ var openInferenceJsonReader = {
9273
9533
  }
9274
9534
  };
9275
9535
  function parseOtlpAnyValue(value, field, warnings, unsupportedFields) {
9276
- if (!isRecord9(value)) {
9536
+ if (!isRecord10(value)) {
9277
9537
  unsupportedFields.push(field);
9278
9538
  warnings.push({
9279
9539
  code: "otlp_attribute_value_invalid",
@@ -9295,15 +9555,15 @@ function parseOtlpAnyValue(value, field, warnings, unsupportedFields) {
9295
9555
  if (typeof value.doubleValue === "number" && Number.isFinite(value.doubleValue)) {
9296
9556
  return value.doubleValue;
9297
9557
  }
9298
- if (isRecord9(value.arrayValue) && Array.isArray(value.arrayValue.values)) {
9558
+ if (isRecord10(value.arrayValue) && Array.isArray(value.arrayValue.values)) {
9299
9559
  return value.arrayValue.values.map(
9300
9560
  (item, index) => parseOtlpAnyValue(item, `${field}.arrayValue.values[${index}]`, warnings, unsupportedFields)
9301
9561
  );
9302
9562
  }
9303
- if (isRecord9(value.kvlistValue) && Array.isArray(value.kvlistValue.values)) {
9563
+ if (isRecord10(value.kvlistValue) && Array.isArray(value.kvlistValue.values)) {
9304
9564
  const out = {};
9305
9565
  for (const [index, item] of value.kvlistValue.values.entries()) {
9306
- if (!isRecord9(item) || typeof item.key !== "string") {
9566
+ if (!isRecord10(item) || typeof item.key !== "string") {
9307
9567
  unsupportedFields.push(`${field}.kvlistValue.values[${index}]`);
9308
9568
  continue;
9309
9569
  }
@@ -9354,7 +9614,7 @@ function parseOtlpAttributes(value, pathPrefix) {
9354
9614
  }
9355
9615
  for (const [index, item] of value.entries()) {
9356
9616
  const field = `${pathPrefix}[${index}]`;
9357
- if (!isRecord9(item) || typeof item.key !== "string") {
9617
+ if (!isRecord10(item) || typeof item.key !== "string") {
9358
9618
  unsupportedFields.push(field);
9359
9619
  warnings.push({
9360
9620
  code: "otlp_attribute_invalid",
@@ -9377,16 +9637,16 @@ function parseOtlpAttributes(value, pathPrefix) {
9377
9637
  return { attributes, warnings, unsupportedFields };
9378
9638
  }
9379
9639
  function looksLikeOtlpSpan(value) {
9380
- return isRecord9(value) && readStringField(value, ["traceId"]) !== void 0 && readStringField(value, ["spanId"]) !== void 0 && readStringField(value, ["name"]) !== void 0;
9640
+ return isRecord10(value) && readStringField(value, ["traceId"]) !== void 0 && readStringField(value, ["spanId"]) !== void 0 && readStringField(value, ["name"]) !== void 0;
9381
9641
  }
9382
9642
  function extractOtlpDocument(root) {
9383
- if (!isRecord9(root) || !Array.isArray(root.resourceSpans)) return void 0;
9643
+ if (!isRecord10(root) || !Array.isArray(root.resourceSpans)) return void 0;
9384
9644
  const spans = [];
9385
9645
  const warnings = [];
9386
9646
  const unsupportedFields = [];
9387
9647
  for (const [resourceIndex, resourceSpan] of root.resourceSpans.entries()) {
9388
9648
  const resourcePath = `resourceSpans[${resourceIndex}]`;
9389
- if (!isRecord9(resourceSpan)) {
9649
+ if (!isRecord10(resourceSpan)) {
9390
9650
  unsupportedFields.push(resourcePath);
9391
9651
  continue;
9392
9652
  }
@@ -9409,7 +9669,7 @@ function extractOtlpDocument(root) {
9409
9669
  }
9410
9670
  for (const [scopeIndex, scopeSpan] of resourceSpan.scopeSpans.entries()) {
9411
9671
  const scopePath = `${resourcePath}.scopeSpans[${scopeIndex}]`;
9412
- if (!isRecord9(scopeSpan)) {
9672
+ if (!isRecord10(scopeSpan)) {
9413
9673
  unsupportedFields.push(scopePath);
9414
9674
  continue;
9415
9675
  }
@@ -9476,7 +9736,7 @@ function extractOtlpDocument(root) {
9476
9736
  };
9477
9737
  }
9478
9738
  function mapOtlpStatus(status) {
9479
- if (!isRecord9(status)) return void 0;
9739
+ if (!isRecord10(status)) return void 0;
9480
9740
  const rawCode = status.code;
9481
9741
  if (typeof rawCode !== "string") return void 0;
9482
9742
  switch (rawCode.toUpperCase()) {
@@ -9576,7 +9836,7 @@ function mapOtlpEvents(value, pathPrefix) {
9576
9836
  const events = [];
9577
9837
  for (const [index, event] of value.entries()) {
9578
9838
  const eventPath = `${pathPrefix}[${index}]`;
9579
- if (!isRecord9(event)) {
9839
+ if (!isRecord10(event)) {
9580
9840
  unsupportedFields.push(eventPath);
9581
9841
  continue;
9582
9842
  }
@@ -9714,7 +9974,7 @@ function mapOtlpSpan(context) {
9714
9974
  warnings.push(...kindWarnings);
9715
9975
  const status = mapOtlpStatus(span.status);
9716
9976
  const tokenUsage = readOtlpTokenUsage(parsedSpanAttributes.attributes);
9717
- const errorMessage = isRecord9(span.status) && typeof span.status.message === "string" ? span.status.message : void 0;
9977
+ const errorMessage = isRecord10(span.status) && typeof span.status.message === "string" ? span.status.message : void 0;
9718
9978
  const event = {
9719
9979
  schemaVersion: "0.2",
9720
9980
  eventId: typeof parsedSpanAttributes.attributes["agent_inspect.event_id"] === "string" ? parsedSpanAttributes.attributes["agent_inspect.event_id"] : spanId,