agent-inspect 6.31.8 → 6.31.9
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/CHANGELOG.md +6 -0
- package/README.md +1 -1
- package/package.json +1 -1
- package/packages/cli/dist/{chunk-6FE47XSF.mjs → chunk-SWUZRRDT.mjs} +136 -12
- package/packages/cli/dist/chunk-SWUZRRDT.mjs.map +1 -0
- package/packages/cli/dist/index.cjs +137 -11
- package/packages/cli/dist/index.cjs.map +1 -1
- package/packages/cli/dist/index.mjs +4 -4
- package/packages/cli/dist/index.mjs.map +1 -1
- package/packages/cli/dist/{src-NXAYHG34.mjs → src-XFIPYODW.mjs} +3 -3
- package/packages/cli/dist/{src-NXAYHG34.mjs.map → src-XFIPYODW.mjs.map} +1 -1
- package/packages/core/dist/advanced.cjs +178 -15
- package/packages/core/dist/advanced.cjs.map +1 -1
- package/packages/core/dist/advanced.d.cts +1 -1
- package/packages/core/dist/advanced.d.ts +1 -1
- package/packages/core/dist/advanced.mjs +85 -11
- package/packages/core/dist/advanced.mjs.map +1 -1
- package/packages/core/dist/{chunk-VQUB3WRI.mjs → chunk-3SPBELJB.mjs} +14 -3
- package/packages/core/dist/chunk-3SPBELJB.mjs.map +1 -0
- package/packages/core/dist/index.cjs +12 -1
- package/packages/core/dist/index.cjs.map +1 -1
- package/packages/core/dist/index.mjs +2 -2
- package/packages/cli/dist/chunk-6FE47XSF.mjs.map +0 -1
- package/packages/core/dist/chunk-VQUB3WRI.mjs.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { resolveTraceDir, TraceDirectory, parseTraceJsonl, validateEvent } from './chunk-
|
|
1
|
+
import { resolveTraceDir, TraceDirectory, parseTraceJsonl, validateEvent } from './chunk-SWUZRRDT.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-
|
|
419
|
-
//# sourceMappingURL=src-
|
|
418
|
+
//# sourceMappingURL=src-XFIPYODW.mjs.map
|
|
419
|
+
//# sourceMappingURL=src-XFIPYODW.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-NXAYHG34.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-XFIPYODW.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"]}
|
|
@@ -1865,7 +1865,18 @@ function preparePersistedInspectEventForWrite(value, opts = resolveTraceSafetyOp
|
|
|
1865
1865
|
}
|
|
1866
1866
|
|
|
1867
1867
|
// packages/core/src/context.ts
|
|
1868
|
-
var
|
|
1868
|
+
var GLOBAL_CONTEXT_ALS_KEY = "agent-inspect:execution-context-als:v1";
|
|
1869
|
+
function getSharedContextStorage() {
|
|
1870
|
+
const host = globalThis;
|
|
1871
|
+
const existing = host[GLOBAL_CONTEXT_ALS_KEY];
|
|
1872
|
+
if (existing instanceof async_hooks.AsyncLocalStorage) {
|
|
1873
|
+
return existing;
|
|
1874
|
+
}
|
|
1875
|
+
const created = new async_hooks.AsyncLocalStorage();
|
|
1876
|
+
host[GLOBAL_CONTEXT_ALS_KEY] = created;
|
|
1877
|
+
return created;
|
|
1878
|
+
}
|
|
1879
|
+
var storage = getSharedContextStorage();
|
|
1869
1880
|
function toPublicContext(ctx) {
|
|
1870
1881
|
return {
|
|
1871
1882
|
runId: ctx.runId,
|
|
@@ -5141,7 +5152,7 @@ function enrichSessionSummary(summary, runs, options = {}) {
|
|
|
5141
5152
|
}
|
|
5142
5153
|
const lastMs = latestActivityMs(sessionRuns);
|
|
5143
5154
|
const lastActivity = lastMs > 0 ? new Date(lastMs).toISOString() : (/* @__PURE__ */ new Date(0)).toISOString();
|
|
5144
|
-
const
|
|
5155
|
+
const retryCount2 = summary.retries.filter(
|
|
5145
5156
|
(retry) => retry.retryOf !== void 0 || (retry.attempt ?? 0) > 1
|
|
5146
5157
|
).length;
|
|
5147
5158
|
return {
|
|
@@ -5155,7 +5166,7 @@ function enrichSessionSummary(summary, runs, options = {}) {
|
|
|
5155
5166
|
workflowId,
|
|
5156
5167
|
lastError: deriveLastError(sessionRuns),
|
|
5157
5168
|
lastActivity,
|
|
5158
|
-
retryCount,
|
|
5169
|
+
retryCount: retryCount2,
|
|
5159
5170
|
observationSummary: deriveObservationSummary(sessionRuns),
|
|
5160
5171
|
checkSummary: deriveCheckSummary(sessionRuns)
|
|
5161
5172
|
};
|
|
@@ -6863,6 +6874,13 @@ function metadataStringAttr(event, keys) {
|
|
|
6863
6874
|
}
|
|
6864
6875
|
return void 0;
|
|
6865
6876
|
}
|
|
6877
|
+
function numericAttr(event, keys) {
|
|
6878
|
+
for (const key of keys) {
|
|
6879
|
+
const value = event.attributes?.[key];
|
|
6880
|
+
if (typeof value === "number" && Number.isFinite(value)) return value;
|
|
6881
|
+
}
|
|
6882
|
+
return void 0;
|
|
6883
|
+
}
|
|
6866
6884
|
function stripPrefix(name, prefixes) {
|
|
6867
6885
|
for (const prefix of prefixes) {
|
|
6868
6886
|
if (name.startsWith(prefix)) return name.slice(prefix.length);
|
|
@@ -6918,9 +6936,12 @@ function llmFinishReason(event) {
|
|
|
6918
6936
|
const keys = ["finishReason", "rawFinishReason", "finish_reason"];
|
|
6919
6937
|
return stringAttr(event, keys) ?? metadataStringAttr(event, keys);
|
|
6920
6938
|
}
|
|
6939
|
+
function retryCount(event) {
|
|
6940
|
+
return numericAttr(event, ["retryCount", "retryAttempt", "retry_attempt", "attempt"]);
|
|
6941
|
+
}
|
|
6921
6942
|
function finishedEvents(context, kind) {
|
|
6922
6943
|
return semanticEvents(context).filter(
|
|
6923
|
-
(event) => (event.kind === kind) && event.status !== "running"
|
|
6944
|
+
(event) => (kind === void 0 || event.kind === kind) && event.status !== "running"
|
|
6924
6945
|
);
|
|
6925
6946
|
}
|
|
6926
6947
|
function toolInvocationEvents(context) {
|
|
@@ -6985,6 +7006,35 @@ function createRunDurationRule(options) {
|
|
|
6985
7006
|
}
|
|
6986
7007
|
};
|
|
6987
7008
|
}
|
|
7009
|
+
function createRunDepthRule(options) {
|
|
7010
|
+
return {
|
|
7011
|
+
id: "run.depth",
|
|
7012
|
+
category: "run",
|
|
7013
|
+
defaultSeverity: "error",
|
|
7014
|
+
evaluate(context) {
|
|
7015
|
+
const nodes = [...context.nodesByEventId.values()];
|
|
7016
|
+
const maxDepth = nodes.reduce((max, node) => Math.max(max, node.depth), 0);
|
|
7017
|
+
if (maxDepth <= options.maxDepth) return [];
|
|
7018
|
+
const deepest = nodes.filter((node) => node.depth === maxDepth);
|
|
7019
|
+
return [
|
|
7020
|
+
failFinding(
|
|
7021
|
+
"run.depth",
|
|
7022
|
+
`Run depth ${maxDepth} exceeded ${options.maxDepth}.`,
|
|
7023
|
+
deepest.map((node) => ({
|
|
7024
|
+
runId: node.event.runId,
|
|
7025
|
+
eventId: node.event.eventId,
|
|
7026
|
+
parentId: node.event.parentId,
|
|
7027
|
+
kind: node.event.kind,
|
|
7028
|
+
name: node.event.name,
|
|
7029
|
+
status: node.event.status
|
|
7030
|
+
})),
|
|
7031
|
+
{ maxDepth: options.maxDepth },
|
|
7032
|
+
maxDepth
|
|
7033
|
+
)
|
|
7034
|
+
];
|
|
7035
|
+
}
|
|
7036
|
+
};
|
|
7037
|
+
}
|
|
6988
7038
|
function createToolUsageRule(options) {
|
|
6989
7039
|
return {
|
|
6990
7040
|
id: "tool.usage",
|
|
@@ -7049,6 +7099,45 @@ function createToolUsageRule(options) {
|
|
|
7049
7099
|
}
|
|
7050
7100
|
};
|
|
7051
7101
|
}
|
|
7102
|
+
function createToolFailureRule(options) {
|
|
7103
|
+
return {
|
|
7104
|
+
id: "tool.failures",
|
|
7105
|
+
category: "tool",
|
|
7106
|
+
defaultSeverity: "error",
|
|
7107
|
+
evaluate(context) {
|
|
7108
|
+
const tools = finishedEvents(context, "TOOL");
|
|
7109
|
+
const failures = tools.filter((event) => event.status === "error");
|
|
7110
|
+
const retries = tools.map((event) => ({ event, count: retryCount(event) })).filter((item) => item.count !== void 0);
|
|
7111
|
+
const findings = [];
|
|
7112
|
+
if (options.maxFailures !== void 0 && failures.length > options.maxFailures) {
|
|
7113
|
+
findings.push(
|
|
7114
|
+
failFinding(
|
|
7115
|
+
"tool.failures",
|
|
7116
|
+
`Tool failure count ${failures.length} exceeded ${options.maxFailures}.`,
|
|
7117
|
+
failures.map((event) => eventEvidence(event)),
|
|
7118
|
+
{ maxFailures: options.maxFailures },
|
|
7119
|
+
failures.length
|
|
7120
|
+
)
|
|
7121
|
+
);
|
|
7122
|
+
}
|
|
7123
|
+
if (options.maxRetries !== void 0) {
|
|
7124
|
+
const excessiveRetries = retries.filter((item) => item.count > options.maxRetries);
|
|
7125
|
+
if (excessiveRetries.length > 0) {
|
|
7126
|
+
findings.push(
|
|
7127
|
+
failFinding(
|
|
7128
|
+
"tool.failures",
|
|
7129
|
+
`Tool retry count exceeded ${options.maxRetries}.`,
|
|
7130
|
+
excessiveRetries.map((item) => eventEvidence(item.event, "attributes.retryCount")),
|
|
7131
|
+
{ maxRetries: options.maxRetries },
|
|
7132
|
+
excessiveRetries.map((item) => ({ tool: toolName(item.event), retries: item.count }))
|
|
7133
|
+
)
|
|
7134
|
+
);
|
|
7135
|
+
}
|
|
7136
|
+
}
|
|
7137
|
+
return findings;
|
|
7138
|
+
}
|
|
7139
|
+
};
|
|
7140
|
+
}
|
|
7052
7141
|
function createLlmUsageRule(options) {
|
|
7053
7142
|
return {
|
|
7054
7143
|
id: "llm.usage",
|
|
@@ -11841,21 +11930,48 @@ function openTrace(input, options = {}) {
|
|
|
11841
11930
|
}
|
|
11842
11931
|
|
|
11843
11932
|
// packages/core/src/suite/run.ts
|
|
11933
|
+
var KNOWN_SUITE_SELECT_IDS = /* @__PURE__ */ new Set([
|
|
11934
|
+
"run.status",
|
|
11935
|
+
"run.duration",
|
|
11936
|
+
"run.depth",
|
|
11937
|
+
"outcome.status",
|
|
11938
|
+
"tool.usage",
|
|
11939
|
+
"tool.failures",
|
|
11940
|
+
"llm.usage"
|
|
11941
|
+
]);
|
|
11844
11942
|
function diagnostic4(code, message, severity = "error", caseId) {
|
|
11845
11943
|
return { code, message, severity, ...caseId !== void 0 ? { caseId } : {} };
|
|
11846
11944
|
}
|
|
11847
|
-
function
|
|
11945
|
+
function buildCaseAssertions(suiteCase, config) {
|
|
11848
11946
|
const rules = [];
|
|
11849
11947
|
const select = new Set(config.checks?.select ?? []);
|
|
11850
|
-
|
|
11948
|
+
const configDiagnostics = [];
|
|
11949
|
+
const evalConfig = config.eval;
|
|
11950
|
+
const declaredSelect = [...select];
|
|
11951
|
+
for (const id of declaredSelect) {
|
|
11952
|
+
if (!KNOWN_SUITE_SELECT_IDS.has(id)) {
|
|
11953
|
+
configDiagnostics.push(
|
|
11954
|
+
diagnostic4(
|
|
11955
|
+
"AI_SUITE_UNKNOWN_SELECTOR",
|
|
11956
|
+
`Unknown or unsupported suite check selector "${id}".`,
|
|
11957
|
+
"error",
|
|
11958
|
+
suiteCase.id
|
|
11959
|
+
)
|
|
11960
|
+
);
|
|
11961
|
+
}
|
|
11962
|
+
}
|
|
11963
|
+
if (select.has("run.status") || evalConfig?.requireSuccess === true) {
|
|
11851
11964
|
rules.push(createRunStatusRule());
|
|
11965
|
+
select.add("run.status");
|
|
11852
11966
|
}
|
|
11853
11967
|
const requiredTools = [
|
|
11854
11968
|
...config.checks?.tool?.required ?? [],
|
|
11969
|
+
...evalConfig?.requiredTools ?? [],
|
|
11855
11970
|
...suiteCase.requireTools ?? []
|
|
11856
11971
|
];
|
|
11857
11972
|
const forbiddenTools = [
|
|
11858
11973
|
...config.checks?.tool?.forbidden ?? [],
|
|
11974
|
+
...evalConfig?.forbiddenTools ?? [],
|
|
11859
11975
|
...suiteCase.forbidTools ?? []
|
|
11860
11976
|
];
|
|
11861
11977
|
if (requiredTools.length > 0 || forbiddenTools.length > 0) {
|
|
@@ -11867,20 +11983,51 @@ function buildCaseRules(suiteCase, config) {
|
|
|
11867
11983
|
);
|
|
11868
11984
|
select.add("tool.usage");
|
|
11869
11985
|
}
|
|
11870
|
-
const maxDurationMs = suiteCase.maxDurationMs ?? config.checks?.run?.maxDurationMs ??
|
|
11986
|
+
const maxDurationMs = suiteCase.maxDurationMs ?? config.checks?.run?.maxDurationMs ?? evalConfig?.maxDurationMs;
|
|
11871
11987
|
if (maxDurationMs !== void 0) {
|
|
11872
11988
|
rules.push(createRunDurationRule({ maxDurationMs }));
|
|
11873
11989
|
select.add("run.duration");
|
|
11874
11990
|
}
|
|
11875
|
-
const
|
|
11876
|
-
if (
|
|
11877
|
-
rules.push(
|
|
11991
|
+
const maxDepth = config.checks?.run?.maxDepth ?? evalConfig?.maxDepth;
|
|
11992
|
+
if (maxDepth !== void 0) {
|
|
11993
|
+
rules.push(createRunDepthRule({ maxDepth }));
|
|
11994
|
+
select.add("run.depth");
|
|
11995
|
+
}
|
|
11996
|
+
if (evalConfig?.maxRetries !== void 0) {
|
|
11997
|
+
rules.push(createToolFailureRule({ maxRetries: evalConfig.maxRetries }));
|
|
11998
|
+
select.add("tool.failures");
|
|
11999
|
+
}
|
|
12000
|
+
const allowedModels = config.checks?.llm?.allowedModels;
|
|
12001
|
+
const maxTotalTokens = config.checks?.llm?.maxTotalTokens ?? evalConfig?.maxTotalTokens;
|
|
12002
|
+
if (allowedModels !== void 0 || maxTotalTokens !== void 0) {
|
|
12003
|
+
rules.push(
|
|
12004
|
+
createLlmUsageRule({
|
|
12005
|
+
...allowedModels !== void 0 ? { allowedModels } : {},
|
|
12006
|
+
...maxTotalTokens !== void 0 ? { maxTotalTokens } : {}
|
|
12007
|
+
})
|
|
12008
|
+
);
|
|
11878
12009
|
select.add("llm.usage");
|
|
11879
12010
|
}
|
|
11880
12011
|
if (select.has("outcome.status")) {
|
|
11881
12012
|
rules.push(createObservedOutcomeRule({ failOn: ["failed"] }));
|
|
11882
12013
|
}
|
|
11883
|
-
|
|
12014
|
+
const observationCount = suiteCase.expectedObservations?.length ?? 0;
|
|
12015
|
+
if (rules.length === 0 && observationCount === 0 && configDiagnostics.length === 0) {
|
|
12016
|
+
configDiagnostics.push(
|
|
12017
|
+
diagnostic4(
|
|
12018
|
+
"AI_SUITE_NO_ASSERTIONS",
|
|
12019
|
+
`Suite case "${suiteCase.id}" declares no effective checks, eval controls, or expected observations.`,
|
|
12020
|
+
"error",
|
|
12021
|
+
suiteCase.id
|
|
12022
|
+
)
|
|
12023
|
+
);
|
|
12024
|
+
}
|
|
12025
|
+
return {
|
|
12026
|
+
rules,
|
|
12027
|
+
select: [...select],
|
|
12028
|
+
observationCount,
|
|
12029
|
+
configDiagnostics
|
|
12030
|
+
};
|
|
11884
12031
|
}
|
|
11885
12032
|
function outcomesFromRead(read) {
|
|
11886
12033
|
const persistedOutcomes = extractOutcomesFromPersistedEvents(
|
|
@@ -11961,8 +12108,20 @@ async function runSuiteCase(suiteCase, config, options) {
|
|
|
11961
12108
|
]
|
|
11962
12109
|
};
|
|
11963
12110
|
}
|
|
11964
|
-
const
|
|
11965
|
-
|
|
12111
|
+
const compiled = buildCaseAssertions(suiteCase, config);
|
|
12112
|
+
if (compiled.configDiagnostics.length > 0) {
|
|
12113
|
+
return {
|
|
12114
|
+
id: suiteCase.id,
|
|
12115
|
+
status: "error",
|
|
12116
|
+
tracePath: resolved.tracePath,
|
|
12117
|
+
...resolved.runId !== void 0 ? { runId: resolved.runId } : {},
|
|
12118
|
+
checkOk: false,
|
|
12119
|
+
...config.eval?.requireSuccess === true ? { evalOk: false } : {},
|
|
12120
|
+
message: compiled.configDiagnostics.map((item) => item.message).join("; "),
|
|
12121
|
+
diagnostics: compiled.configDiagnostics
|
|
12122
|
+
};
|
|
12123
|
+
}
|
|
12124
|
+
const checkResult = compiled.rules.length > 0 ? runTraceChecks({ read }, { rules: compiled.rules, select: compiled.select }) : {
|
|
11966
12125
|
ok: true,
|
|
11967
12126
|
status: "pass",
|
|
11968
12127
|
format: read.format,
|
|
@@ -11990,6 +12149,9 @@ async function runSuiteCase(suiteCase, config, options) {
|
|
|
11990
12149
|
];
|
|
11991
12150
|
const checkOk = checkResult.ok;
|
|
11992
12151
|
const observationsOk = observationResult.ok;
|
|
12152
|
+
const evalOk = config.eval?.requireSuccess === true ? checkResult.findings.every(
|
|
12153
|
+
(finding) => finding.ruleId !== "run.status" || finding.status !== "fail"
|
|
12154
|
+
) && checkResult.diagnostics.every((item) => item.severity !== "error") : void 0;
|
|
11993
12155
|
const ok = checkOk && observationsOk;
|
|
11994
12156
|
const status = ok ? "pass" : checkResult.status === "error" ? "error" : "fail";
|
|
11995
12157
|
return {
|
|
@@ -11998,6 +12160,7 @@ async function runSuiteCase(suiteCase, config, options) {
|
|
|
11998
12160
|
tracePath: resolved.tracePath,
|
|
11999
12161
|
...resolved.runId !== void 0 ? { runId: resolved.runId } : {},
|
|
12000
12162
|
checkOk,
|
|
12163
|
+
...evalOk !== void 0 ? { evalOk } : {},
|
|
12001
12164
|
observationsOk,
|
|
12002
12165
|
diagnostics,
|
|
12003
12166
|
...ok ? {} : {
|
|
@@ -12479,7 +12642,7 @@ async function computeCohortRunMetrics(input) {
|
|
|
12479
12642
|
const outcomes = extractOutcomesFromTraceEvents(events);
|
|
12480
12643
|
const observationFailures = outcomes.filter((item) => item.status === "failed").length;
|
|
12481
12644
|
const metadata = input.metadata ?? {};
|
|
12482
|
-
const
|
|
12645
|
+
const retryCount2 = asNumber(metadata.attempt) !== void 0 && asNumber(metadata.attempt) > 1 ? asNumber(metadata.attempt) - 1 : typeof metadata.retryOf === "string" ? 1 : 0;
|
|
12483
12646
|
return {
|
|
12484
12647
|
runId: input.runId,
|
|
12485
12648
|
...input.cohortLabel !== void 0 ? { cohortLabel: input.cohortLabel } : {},
|
|
@@ -12489,7 +12652,7 @@ async function computeCohortRunMetrics(input) {
|
|
|
12489
12652
|
durationMs: summary.durationMs ?? input.durationMs,
|
|
12490
12653
|
llmCallCount: summary.llmSteps,
|
|
12491
12654
|
tokenUsageTotal: summary.totalTokens?.total,
|
|
12492
|
-
retryCount,
|
|
12655
|
+
retryCount: retryCount2,
|
|
12493
12656
|
observationFailures,
|
|
12494
12657
|
guardrailFailures: asNumber(metadata.guardrailFailures) ?? 0,
|
|
12495
12658
|
circuitViolations: asNumber(metadata.circuitViolations) ?? 0,
|