{"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-KFOBXFPN.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"]}