@c3-oss/prosa 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/bundle.ts","../src/core/db.ts","../src/core/schema/sql/001_init.ts","../src/core/schema/sql/002_search_index_status.ts","../src/core/schema/migrate.ts","../src/core/version.ts","../src/core/cas/index.ts","../src/core/cas/compress.ts","../src/core/cas/hash.ts","../src/core/domain/ids.ts","../src/core/ingest/batch.ts","../src/core/ingest/idempotency.ts","../src/services/sessions.ts","../src/services/search.ts","../src/services/indexing.ts","../src/services/export/markdown.ts","../src/services/export/parquet.ts","../src/importers/codex/index.ts","../src/importers/codex/discover.ts","../src/importers/claude/index.ts","../src/importers/claude/discover.ts","../src/importers/gemini/index.ts","../src/importers/gemini/discover.ts","../src/importers/cursor/index.ts","../src/importers/cursor/discover.ts"],"sourcesContent":["import { constants as fsConstants } from 'node:fs';\nimport { access, mkdir, readFile, stat, writeFile } from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { type Db, closeDb, openDb } from './db.js';\nimport { currentSchemaVersion, runMigrations } from './schema/migrate.js';\nimport { PROSA_PARSER_VERSION, PROSA_SCHEMA_VERSION } from './version.js';\n\nexport interface BundleManifest {\n version: 1;\n parser_version: string;\n schema_version: number;\n created_at: string;\n hash_alg: 'blake3';\n default_compression: 'zstd';\n}\n\nexport interface Bundle {\n path: string;\n db: Db;\n manifest: BundleManifest;\n paths: {\n db: string;\n manifest: string;\n objects: string;\n rawSources: string;\n search: string;\n tantivy: string;\n exports: string;\n parquet: string;\n lock: string;\n };\n}\n\nexport function defaultBundlePath(): string {\n const env = process.env.PROSA_STORE;\n if (env && env.length > 0) return path.resolve(env);\n return path.join(os.homedir(), '.prosa');\n}\n\nfunction bundlePaths(rootPath: string): Bundle['paths'] {\n return {\n db: path.join(rootPath, 'prosa.sqlite'),\n manifest: path.join(rootPath, 'manifest.json'),\n objects: path.join(rootPath, 'objects'),\n rawSources: path.join(rootPath, 'raw', 'sources'),\n search: path.join(rootPath, 'search'),\n tantivy: path.join(rootPath, 'search', 'tantivy'),\n exports: path.join(rootPath, 'exports'),\n parquet: path.join(rootPath, 'parquet'),\n lock: path.join(rootPath, 'prosa.lock'),\n };\n}\n\nasync function exists(p: string): Promise<boolean> {\n try {\n await access(p, fsConstants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Create a fresh bundle at `rootPath`. Fails if the directory already contains\n * a manifest (use openBundle for that case).\n */\nexport async function initBundle(rootPath: string): Promise<Bundle> {\n const resolved = path.resolve(rootPath);\n const paths = bundlePaths(resolved);\n\n await mkdir(resolved, { recursive: true });\n\n if (await exists(paths.manifest)) {\n throw new Error(\n `bundle already exists at ${resolved} (found manifest.json) — use openBundle instead`,\n );\n }\n\n await mkdir(paths.objects, { recursive: true });\n await mkdir(paths.rawSources, { recursive: true });\n await mkdir(paths.search, { recursive: true });\n await mkdir(paths.tantivy, { recursive: true });\n await mkdir(paths.exports, { recursive: true });\n await mkdir(paths.parquet, { recursive: true });\n\n const manifest: BundleManifest = {\n version: 1,\n parser_version: PROSA_PARSER_VERSION,\n schema_version: PROSA_SCHEMA_VERSION,\n created_at: new Date().toISOString(),\n hash_alg: 'blake3',\n default_compression: 'zstd',\n };\n\n await writeFile(paths.manifest, `${JSON.stringify(manifest, null, 2)}\\n`, 'utf8');\n\n const db = openDb(paths.db);\n runMigrations(db);\n\n return { path: resolved, db, manifest, paths };\n}\n\n/**\n * Open an existing bundle. Applies pending migrations if the schema is older\n * than the current code expects.\n */\nexport async function openBundle(rootPath: string): Promise<Bundle> {\n const resolved = path.resolve(rootPath);\n const paths = bundlePaths(resolved);\n\n const dirStat = await stat(resolved).catch(() => null);\n if (!dirStat?.isDirectory()) {\n throw new Error(`bundle path not found or not a directory: ${resolved}`);\n }\n if (!(await exists(paths.manifest))) {\n throw new Error(\n `no manifest.json in ${resolved} — initialize first with \\`prosa init --store ${resolved}\\``,\n );\n }\n\n const manifest = JSON.parse(await readFile(paths.manifest, 'utf8')) as BundleManifest;\n await mkdir(paths.search, { recursive: true });\n await mkdir(paths.tantivy, { recursive: true });\n const db = openDb(paths.db);\n runMigrations(db);\n\n const currentVersion = currentSchemaVersion(db);\n if (currentVersion !== PROSA_SCHEMA_VERSION) {\n closeDb(db);\n throw new Error(`schema version mismatch (db=${currentVersion}, code=${PROSA_SCHEMA_VERSION})`);\n }\n\n // Refresh manifest's parser_version stamp on every open; useful for telemetry.\n if (manifest.parser_version !== PROSA_PARSER_VERSION) {\n manifest.parser_version = PROSA_PARSER_VERSION;\n await writeFile(paths.manifest, `${JSON.stringify(manifest, null, 2)}\\n`, 'utf8');\n }\n\n return { path: resolved, db, manifest, paths };\n}\n\nexport function closeBundle(bundle: Bundle): void {\n closeDb(bundle.db);\n}\n","import Database, { type Database as DatabaseType, type Statement } from 'better-sqlite3';\n\nexport type Db = DatabaseType;\n\nexport function openDb(path: string): Db {\n const db = new Database(path);\n db.pragma('journal_mode = WAL');\n db.pragma('foreign_keys = ON');\n db.pragma('synchronous = NORMAL');\n // Reduce contention on long imports.\n db.pragma('busy_timeout = 5000');\n return db;\n}\n\nexport function closeDb(db: Db): void {\n db.close();\n}\n\nconst stmtCache = new WeakMap<Db, Map<string, Statement>>();\n\n/**\n * Cache prepared statements per database. Importers call the same INSERTs\n * thousands of times — preparing once cuts a lot of overhead and the cache\n * vanishes when the Db is garbage-collected.\n *\n * `TParams` defaults to `unknown[]` so callers don't have to type their\n * arguments. When precise typing matters, pass a tuple type as the first\n * generic argument and `Statement<TParams, TRow>` is returned directly.\n */\nexport function prepare<TParams extends unknown[] = unknown[], TRow = unknown>(\n db: Db,\n sql: string,\n): Statement<TParams, TRow> {\n let cache = stmtCache.get(db);\n if (!cache) {\n cache = new Map();\n stmtCache.set(db, cache);\n }\n let stmt = cache.get(sql);\n if (!stmt) {\n stmt = db.prepare(sql);\n cache.set(sql, stmt);\n }\n return stmt as Statement<TParams, TRow>;\n}\n\nexport function transactional<T>(db: Db, fn: () => T): T {\n const wrapped = db.transaction(fn);\n return wrapped();\n}\n","// Auto-generated from schema description. Edit the SQL here directly.\n// Loaded at runtime by core/schema/migrate.ts.\n\nexport const SQL_001_INIT = String.raw`\n-- Schema W v1\n--\n-- Three layers:\n-- 1. raw immutable : raw_records pointing at preserved bytes (objects)\n-- 2. canonical projection: sessions, turns, events, messages, blocks,\n-- tool_calls, tool_results, artifacts, edges\n-- 3. derived indexes : search_docs + FTS5\n--\n-- Projections are regenerable from raw_records. Raw is the source of truth.\n\nCREATE TABLE IF NOT EXISTS objects (\n object_id TEXT PRIMARY KEY,\n hash_alg TEXT NOT NULL,\n hash TEXT NOT NULL,\n size_bytes INTEGER NOT NULL,\n compressed_size_bytes INTEGER,\n compression TEXT NOT NULL DEFAULT 'zstd',\n mime_type TEXT,\n encoding TEXT,\n storage_path TEXT NOT NULL,\n created_at TEXT NOT NULL\n);\n\nCREATE INDEX IF NOT EXISTS objects_hash_idx ON objects(hash_alg, hash);\n\nCREATE TABLE IF NOT EXISTS source_files (\n source_file_id TEXT PRIMARY KEY,\n source_tool TEXT NOT NULL,\n path TEXT NOT NULL,\n file_kind TEXT NOT NULL,\n size_bytes INTEGER NOT NULL,\n mtime TEXT,\n content_hash TEXT NOT NULL,\n object_id TEXT REFERENCES objects(object_id),\n discovered_at TEXT NOT NULL,\n workspace_hint TEXT,\n UNIQUE(source_tool, path, size_bytes, mtime, content_hash)\n);\n\nCREATE INDEX IF NOT EXISTS source_files_tool_idx ON source_files(source_tool);\nCREATE INDEX IF NOT EXISTS source_files_hash_idx ON source_files(content_hash);\n\nCREATE TABLE IF NOT EXISTS import_batches (\n batch_id TEXT PRIMARY KEY,\n parser_version TEXT NOT NULL,\n source_tool TEXT,\n paths TEXT,\n started_at TEXT NOT NULL,\n finished_at TEXT,\n status TEXT NOT NULL DEFAULT 'running',\n counts_json TEXT\n);\n\nCREATE TABLE IF NOT EXISTS raw_records (\n raw_record_id TEXT PRIMARY KEY,\n source_file_id TEXT NOT NULL REFERENCES source_files(source_file_id),\n source_tool TEXT NOT NULL,\n record_kind TEXT NOT NULL,\n ordinal INTEGER,\n line_no INTEGER,\n json_pointer TEXT,\n native_id TEXT,\n raw_object_id TEXT NOT NULL REFERENCES objects(object_id),\n decoded_json_object_id TEXT REFERENCES objects(object_id),\n parser_status TEXT NOT NULL,\n confidence TEXT NOT NULL DEFAULT 'high',\n import_batch_id TEXT NOT NULL REFERENCES import_batches(batch_id),\n UNIQUE(source_file_id, ordinal, raw_object_id)\n);\n\nCREATE INDEX IF NOT EXISTS raw_records_file_idx ON raw_records(source_file_id);\nCREATE INDEX IF NOT EXISTS raw_records_native_idx ON raw_records(source_tool, native_id);\n\nCREATE TABLE IF NOT EXISTS import_errors (\n error_id INTEGER PRIMARY KEY AUTOINCREMENT,\n batch_id TEXT NOT NULL REFERENCES import_batches(batch_id),\n source_file_id TEXT,\n raw_record_id TEXT,\n kind TEXT NOT NULL,\n message TEXT NOT NULL,\n payload_object_id TEXT REFERENCES objects(object_id),\n occurred_at TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS uncertainties (\n uncertainty_id INTEGER PRIMARY KEY AUTOINCREMENT,\n entity_type TEXT NOT NULL,\n entity_id TEXT NOT NULL,\n reason TEXT NOT NULL,\n metadata_object_id TEXT REFERENCES objects(object_id)\n);\n\nCREATE TABLE IF NOT EXISTS projects (\n project_id TEXT PRIMARY KEY,\n canonical_path TEXT,\n path_hash TEXT,\n source_tool TEXT,\n source_project_id TEXT,\n display_name TEXT,\n created_at TEXT NOT NULL,\n UNIQUE(source_tool, source_project_id)\n);\n\nCREATE TABLE IF NOT EXISTS sessions (\n session_id TEXT PRIMARY KEY,\n source_tool TEXT NOT NULL,\n source_session_id TEXT NOT NULL,\n project_id TEXT REFERENCES projects(project_id),\n parent_session_id TEXT REFERENCES sessions(session_id),\n is_subagent INTEGER NOT NULL DEFAULT 0,\n agent_role TEXT,\n agent_nickname TEXT,\n title TEXT,\n summary TEXT,\n start_ts TEXT,\n end_ts TEXT,\n cwd_initial TEXT,\n git_branch_initial TEXT,\n model_first TEXT,\n model_last TEXT,\n status TEXT,\n timeline_confidence TEXT NOT NULL DEFAULT 'high'\n CHECK (timeline_confidence IN ('high','medium','low')),\n raw_record_id TEXT REFERENCES raw_records(raw_record_id),\n UNIQUE(source_tool, source_session_id)\n);\n\nCREATE INDEX IF NOT EXISTS sessions_source_idx ON sessions(source_tool);\nCREATE INDEX IF NOT EXISTS sessions_start_idx ON sessions(start_ts);\nCREATE INDEX IF NOT EXISTS sessions_project_idx ON sessions(project_id);\nCREATE INDEX IF NOT EXISTS sessions_parent_idx ON sessions(parent_session_id);\n\nCREATE TABLE IF NOT EXISTS turns (\n turn_id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL REFERENCES sessions(session_id),\n source_turn_id TEXT,\n ordinal INTEGER NOT NULL,\n start_ts TEXT,\n end_ts TEXT,\n model TEXT,\n cwd TEXT,\n git_branch TEXT,\n approval_policy TEXT,\n sandbox_policy TEXT,\n effort TEXT,\n raw_record_id TEXT REFERENCES raw_records(raw_record_id)\n);\n\nCREATE INDEX IF NOT EXISTS turns_session_idx ON turns(session_id, ordinal);\n\nCREATE TABLE IF NOT EXISTS events (\n event_id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL REFERENCES sessions(session_id),\n turn_id TEXT REFERENCES turns(turn_id),\n source_event_id TEXT,\n event_type TEXT NOT NULL,\n source_type TEXT,\n subtype TEXT,\n timestamp TEXT,\n ordinal INTEGER NOT NULL,\n actor TEXT,\n payload_object_id TEXT REFERENCES objects(object_id),\n raw_record_id TEXT NOT NULL REFERENCES raw_records(raw_record_id),\n confidence TEXT NOT NULL DEFAULT 'high',\n is_derived INTEGER NOT NULL DEFAULT 0\n);\n\nCREATE INDEX IF NOT EXISTS events_session_idx ON events(session_id, ordinal);\nCREATE INDEX IF NOT EXISTS events_type_idx ON events(event_type, subtype);\n\nCREATE TABLE IF NOT EXISTS messages (\n message_id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL REFERENCES sessions(session_id),\n turn_id TEXT REFERENCES turns(turn_id),\n event_id TEXT REFERENCES events(event_id),\n source_message_id TEXT,\n role TEXT NOT NULL CHECK (role IN (\n 'system_prompt','developer','user','assistant','tool','operational'\n )),\n author_name TEXT,\n model TEXT,\n timestamp TEXT,\n ordinal INTEGER NOT NULL,\n parent_message_id TEXT REFERENCES messages(message_id),\n request_id TEXT,\n status TEXT,\n raw_record_id TEXT NOT NULL REFERENCES raw_records(raw_record_id)\n);\n\nCREATE INDEX IF NOT EXISTS messages_session_idx ON messages(session_id, ordinal);\nCREATE INDEX IF NOT EXISTS messages_role_idx ON messages(role);\n\nCREATE TABLE IF NOT EXISTS content_blocks (\n block_id TEXT PRIMARY KEY,\n message_id TEXT REFERENCES messages(message_id),\n event_id TEXT REFERENCES events(event_id),\n session_id TEXT NOT NULL REFERENCES sessions(session_id),\n ordinal INTEGER NOT NULL,\n block_type TEXT NOT NULL,\n text_object_id TEXT REFERENCES objects(object_id),\n text_inline TEXT,\n mime_type TEXT,\n token_count INTEGER,\n is_error INTEGER NOT NULL DEFAULT 0,\n is_redacted INTEGER NOT NULL DEFAULT 0,\n visibility TEXT NOT NULL DEFAULT 'default'\n CHECK (visibility IN ('default','hidden_by_default','audit_only')),\n raw_record_id TEXT NOT NULL REFERENCES raw_records(raw_record_id)\n);\n\nCREATE INDEX IF NOT EXISTS blocks_session_idx ON content_blocks(session_id, ordinal);\nCREATE INDEX IF NOT EXISTS blocks_message_idx ON content_blocks(message_id);\n\nCREATE TABLE IF NOT EXISTS tool_calls (\n tool_call_id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL REFERENCES sessions(session_id),\n turn_id TEXT REFERENCES turns(turn_id),\n message_id TEXT REFERENCES messages(message_id),\n event_id TEXT REFERENCES events(event_id),\n source_call_id TEXT,\n tool_name TEXT NOT NULL,\n canonical_tool_type TEXT,\n args_object_id TEXT REFERENCES objects(object_id),\n command TEXT,\n cwd TEXT,\n path TEXT,\n query TEXT,\n timestamp_start TEXT,\n timestamp_end TEXT,\n status TEXT,\n raw_record_id TEXT NOT NULL REFERENCES raw_records(raw_record_id)\n);\n\nCREATE INDEX IF NOT EXISTS tool_calls_session_idx ON tool_calls(session_id, timestamp_start);\nCREATE INDEX IF NOT EXISTS tool_calls_name_idx ON tool_calls(tool_name);\nCREATE INDEX IF NOT EXISTS tool_calls_canon_idx ON tool_calls(canonical_tool_type);\nCREATE INDEX IF NOT EXISTS tool_calls_source_call_idx ON tool_calls(session_id, source_call_id);\n\nCREATE TABLE IF NOT EXISTS tool_results (\n tool_result_id TEXT PRIMARY KEY,\n tool_call_id TEXT REFERENCES tool_calls(tool_call_id),\n session_id TEXT NOT NULL REFERENCES sessions(session_id),\n message_id TEXT REFERENCES messages(message_id),\n event_id TEXT REFERENCES events(event_id),\n source_call_id TEXT,\n status TEXT,\n is_error INTEGER NOT NULL DEFAULT 0,\n exit_code INTEGER,\n duration_ms INTEGER,\n stdout_object_id TEXT REFERENCES objects(object_id),\n stderr_object_id TEXT REFERENCES objects(object_id),\n output_object_id TEXT REFERENCES objects(object_id),\n preview TEXT,\n raw_record_id TEXT NOT NULL REFERENCES raw_records(raw_record_id)\n);\n\nCREATE INDEX IF NOT EXISTS tool_results_session_idx ON tool_results(session_id);\nCREATE INDEX IF NOT EXISTS tool_results_call_idx ON tool_results(tool_call_id);\nCREATE INDEX IF NOT EXISTS tool_results_source_call_idx ON tool_results(session_id, source_call_id);\nCREATE INDEX IF NOT EXISTS tool_results_error_idx ON tool_results(is_error);\n\nCREATE TABLE IF NOT EXISTS artifacts (\n artifact_id TEXT PRIMARY KEY,\n session_id TEXT REFERENCES sessions(session_id),\n project_id TEXT REFERENCES projects(project_id),\n source_tool TEXT NOT NULL,\n kind TEXT NOT NULL,\n path TEXT,\n logical_path TEXT,\n object_id TEXT REFERENCES objects(object_id),\n text_object_id TEXT REFERENCES objects(object_id),\n mime_type TEXT,\n size_bytes INTEGER NOT NULL,\n created_ts TEXT,\n raw_record_id TEXT NOT NULL REFERENCES raw_records(raw_record_id)\n);\n\nCREATE INDEX IF NOT EXISTS artifacts_session_idx ON artifacts(session_id);\nCREATE INDEX IF NOT EXISTS artifacts_path_idx ON artifacts(path);\n\nCREATE TABLE IF NOT EXISTS edges (\n edge_id INTEGER PRIMARY KEY AUTOINCREMENT,\n src_type TEXT NOT NULL,\n src_id TEXT NOT NULL,\n dst_type TEXT NOT NULL,\n dst_id TEXT NOT NULL,\n edge_type TEXT NOT NULL,\n confidence TEXT NOT NULL DEFAULT 'high',\n source TEXT NOT NULL DEFAULT 'explicit',\n raw_record_id TEXT REFERENCES raw_records(raw_record_id),\n metadata_object_id TEXT REFERENCES objects(object_id),\n UNIQUE(src_type, src_id, dst_type, dst_id, edge_type)\n);\n\nCREATE INDEX IF NOT EXISTS edges_src_idx ON edges(src_type, src_id);\nCREATE INDEX IF NOT EXISTS edges_dst_idx ON edges(dst_type, dst_id);\nCREATE INDEX IF NOT EXISTS edges_type_idx ON edges(edge_type);\n\nCREATE TABLE IF NOT EXISTS search_docs (\n doc_id TEXT PRIMARY KEY,\n entity_type TEXT NOT NULL,\n entity_id TEXT NOT NULL,\n session_id TEXT,\n project_id TEXT,\n timestamp TEXT,\n role TEXT,\n tool_name TEXT,\n canonical_tool_type TEXT,\n field_kind TEXT NOT NULL,\n text TEXT NOT NULL\n);\n\nCREATE INDEX IF NOT EXISTS search_docs_session_idx ON search_docs(session_id);\nCREATE INDEX IF NOT EXISTS search_docs_entity_idx ON search_docs(entity_type, entity_id);\nCREATE INDEX IF NOT EXISTS search_docs_field_idx ON search_docs(field_kind);\n\nCREATE VIRTUAL TABLE IF NOT EXISTS search_docs_fts USING fts5(\n text,\n role UNINDEXED,\n tool_name UNINDEXED,\n field_kind UNINDEXED,\n content='search_docs',\n content_rowid='rowid',\n tokenize='unicode61 remove_diacritics 2'\n);\n\nCREATE TRIGGER IF NOT EXISTS search_docs_ai AFTER INSERT ON search_docs BEGIN\n INSERT INTO search_docs_fts(rowid, text, role, tool_name, field_kind)\n VALUES (new.rowid, new.text, new.role, new.tool_name, new.field_kind);\nEND;\n\nCREATE TRIGGER IF NOT EXISTS search_docs_ad AFTER DELETE ON search_docs BEGIN\n INSERT INTO search_docs_fts(search_docs_fts, rowid, text, role, tool_name, field_kind)\n VALUES('delete', old.rowid, old.text, old.role, old.tool_name, old.field_kind);\nEND;\n\nCREATE TRIGGER IF NOT EXISTS search_docs_au AFTER UPDATE ON search_docs BEGIN\n INSERT INTO search_docs_fts(search_docs_fts, rowid, text, role, tool_name, field_kind)\n VALUES('delete', old.rowid, old.text, old.role, old.tool_name, old.field_kind);\n INSERT INTO search_docs_fts(rowid, text, role, tool_name, field_kind)\n VALUES (new.rowid, new.text, new.role, new.tool_name, new.field_kind);\nEND;\n`;\n","export const SQL_002_SEARCH_INDEX_STATUS = String.raw`\nCREATE TABLE IF NOT EXISTS search_index_status (\n engine TEXT PRIMARY KEY,\n status TEXT NOT NULL CHECK (status IN ('missing','ready','stale','building','failed')),\n source_doc_count INTEGER NOT NULL DEFAULT 0,\n indexed_doc_count INTEGER NOT NULL DEFAULT 0,\n updated_at TEXT NOT NULL,\n error_message TEXT\n);\n\nINSERT OR IGNORE INTO search_index_status (\n engine, status, source_doc_count, indexed_doc_count, updated_at, error_message\n) VALUES\n ('fts5', 'ready', 0, 0, strftime('%Y-%m-%dT%H:%M:%fZ','now'), NULL),\n ('tantivy', 'missing', 0, 0, strftime('%Y-%m-%dT%H:%M:%fZ','now'), NULL);\n`;\n","import type { Db } from '../db.js';\nimport { SQL_001_INIT } from './sql/001_init.js';\nimport { SQL_002_SEARCH_INDEX_STATUS } from './sql/002_search_index_status.js';\n\ninterface Migration {\n version: number;\n name: string;\n sql: string;\n}\n\n// Order matters. Each entry is a self-contained set of DDL statements run\n// inside a single transaction together with its bookkeeping insert.\nconst MIGRATIONS: readonly Migration[] = [\n { version: 1, name: 'init', sql: SQL_001_INIT },\n { version: 2, name: 'search_index_status', sql: SQL_002_SEARCH_INDEX_STATUS },\n];\n\nexport function runMigrations(db: Db): { applied: number[] } {\n db.exec(`\n CREATE TABLE IF NOT EXISTS _prosa_migrations (\n version INTEGER PRIMARY KEY,\n name TEXT NOT NULL,\n applied_at TEXT NOT NULL\n );\n `);\n\n const applied = new Set<number>(\n db\n .prepare<[], { version: number }>(`SELECT version FROM _prosa_migrations`)\n .all()\n .map((row) => row.version),\n );\n\n const newlyApplied: number[] = [];\n\n for (const migration of MIGRATIONS) {\n if (applied.has(migration.version)) continue;\n const tx = db.transaction(() => {\n db.exec(migration.sql);\n db.prepare(`INSERT INTO _prosa_migrations(version, name, applied_at) VALUES (?, ?, ?)`).run(\n migration.version,\n migration.name,\n new Date().toISOString(),\n );\n });\n tx();\n newlyApplied.push(migration.version);\n }\n\n return { applied: newlyApplied };\n}\n\nexport function currentSchemaVersion(db: Db): number {\n try {\n const row = db\n .prepare<[], { version: number | null }>(\n `SELECT MAX(version) AS version FROM _prosa_migrations`,\n )\n .get();\n return row?.version ?? 0;\n } catch {\n return 0;\n }\n}\n","// Bumped every time the importer/normalizer makes a breaking change in how\n// raw records are projected into the canonical tables. Stored on every\n// import_batch row so we know which batches are stale and need re-projection.\nexport const PROSA_PARSER_VERSION = '0.1.0';\n\n// Schema version bumped per migration file in core/schema/.\nexport const PROSA_SCHEMA_VERSION = 2;\n","import { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport type { Bundle } from '../bundle.js';\nimport { prepare } from '../db.js';\nimport { type Compression, compressBytes, decompressBytes } from './compress.js';\nimport { blake3Hex, objectIdFromHash, objectStoragePath } from './hash.js';\n\nexport type ObjectId = string;\n\nexport interface ObjectMeta {\n object_id: ObjectId;\n hash_alg: 'blake3';\n hash: string;\n size_bytes: number;\n compressed_size_bytes: number | null;\n compression: Compression;\n mime_type: string | null;\n encoding: string | null;\n storage_path: string;\n created_at: string;\n}\n\ninterface PutOptions {\n mimeType?: string;\n encoding?: string;\n}\n\n/**\n * Store raw bytes in the CAS. Returns the object_id. Idempotent: if the same\n * content already exists, returns the existing object_id without rewriting.\n *\n * Bytes are compressed with zstd when worth it (see compress.ts threshold).\n * The on-disk path is `<bundle>/objects/blake3/ab/cd/<hash>.zst`.\n */\nexport async function putBytes(\n bundle: Bundle,\n bytes: Uint8Array,\n options: PutOptions = {},\n): Promise<ObjectId> {\n const hash = blake3Hex(bytes);\n const objectId = objectIdFromHash(hash);\n\n const existing = prepare<[string], ObjectMeta>(\n bundle.db,\n `SELECT object_id, hash_alg, hash, size_bytes, compressed_size_bytes,\n compression, mime_type, encoding, storage_path, created_at\n FROM objects WHERE object_id = ?`,\n ).get(objectId);\n\n if (existing) return objectId;\n\n const { bytes: stored, compression } = compressBytes(bytes);\n const storagePath = objectStoragePath(hash, compression);\n const absolutePath = path.join(bundle.path, storagePath);\n\n await mkdir(path.dirname(absolutePath), { recursive: true });\n await writeFile(absolutePath, stored);\n\n prepare(\n bundle.db,\n `INSERT INTO objects (\n object_id, hash_alg, hash, size_bytes, compressed_size_bytes,\n compression, mime_type, encoding, storage_path, created_at\n ) VALUES (?, 'blake3', ?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n objectId,\n hash,\n bytes.byteLength,\n compression === 'zstd' ? stored.byteLength : null,\n compression,\n options.mimeType ?? null,\n options.encoding ?? null,\n storagePath,\n new Date().toISOString(),\n );\n\n return objectId;\n}\n\nexport async function putText(\n bundle: Bundle,\n text: string,\n options: { mimeType?: string } = {},\n): Promise<ObjectId> {\n const buf = Buffer.from(text, 'utf8');\n return putBytes(bundle, buf, {\n mimeType: options.mimeType ?? 'text/plain; charset=utf-8',\n encoding: 'utf-8',\n });\n}\n\nexport async function putJson(bundle: Bundle, value: unknown): Promise<ObjectId> {\n // Compact serialization. Stable enough for the importer's own writes; we\n // don't promise canonical JSON across producers.\n const text = JSON.stringify(value);\n return putBytes(bundle, Buffer.from(text, 'utf8'), {\n mimeType: 'application/json',\n encoding: 'utf-8',\n });\n}\n\nexport async function getBytes(bundle: Bundle, objectId: ObjectId): Promise<Buffer> {\n const meta = prepare<[string], ObjectMeta>(\n bundle.db,\n `SELECT object_id, hash_alg, hash, size_bytes, compressed_size_bytes,\n compression, mime_type, encoding, storage_path, created_at\n FROM objects WHERE object_id = ?`,\n ).get(objectId);\n if (!meta) {\n throw new Error(`object not found: ${objectId}`);\n }\n const buf = await readFile(path.join(bundle.path, meta.storage_path));\n return decompressBytes(buf, meta.compression);\n}\n\nexport async function getText(bundle: Bundle, objectId: ObjectId): Promise<string> {\n const buf = await getBytes(bundle, objectId);\n return buf.toString('utf8');\n}\n\nexport async function getJson<T = unknown>(bundle: Bundle, objectId: ObjectId): Promise<T> {\n const text = await getText(bundle, objectId);\n return JSON.parse(text) as T;\n}\n\nexport function getObjectMeta(bundle: Bundle, objectId: ObjectId): ObjectMeta | null {\n return (\n prepare<[string], ObjectMeta>(\n bundle.db,\n `SELECT object_id, hash_alg, hash, size_bytes, compressed_size_bytes,\n compression, mime_type, encoding, storage_path, created_at\n FROM objects WHERE object_id = ?`,\n ).get(objectId) ?? null\n );\n}\n","import { compress as zstdCompress, decompress as zstdDecompress } from 'zstd-napi';\n\n// Below this size the overhead of zstd framing isn't worth it.\nconst COMPRESS_THRESHOLD_BYTES = 256;\nconst ZSTD_LEVEL = 3;\n\nexport type Compression = 'zstd' | 'none';\n\nexport interface CompressionResult {\n bytes: Buffer;\n compression: Compression;\n}\n\nexport function compressBytes(input: Uint8Array): CompressionResult {\n if (input.byteLength < COMPRESS_THRESHOLD_BYTES) {\n return { bytes: Buffer.from(input), compression: 'none' };\n }\n const out = zstdCompress(Buffer.from(input), { compressionLevel: ZSTD_LEVEL });\n return { bytes: out, compression: 'zstd' };\n}\n\nexport function decompressBytes(input: Buffer, compression: Compression): Buffer {\n if (compression === 'none') return input;\n return zstdDecompress(input);\n}\n","import { createHash } from 'node:crypto';\nimport { blake3 } from '@noble/hashes/blake3';\nimport { bytesToHex } from '@noble/hashes/utils';\n\nexport function blake3Hex(bytes: Uint8Array): string {\n return bytesToHex(blake3(bytes));\n}\n\nexport function sha256Hex(bytes: Uint8Array | string): string {\n return createHash('sha256').update(bytes).digest('hex');\n}\n\n/** \"blake3:<hex>\" — the canonical object_id format in the schema. */\nexport function objectIdFromHash(hashHex: string): string {\n return `blake3:${hashHex}`;\n}\n\n/**\n * Storage path under `objects/blake3/`: `ab/cd/<hash>.zst` to avoid one giant\n * directory. Uses the first 4 hex chars (2-level fanout).\n */\nexport function objectStoragePath(hashHex: string, compression: 'zstd' | 'none'): string {\n const ext = compression === 'zstd' ? '.zst' : '.bin';\n const a = hashHex.slice(0, 2);\n const b = hashHex.slice(2, 4);\n return `objects/blake3/${a}/${b}/${hashHex}${ext}`;\n}\n","import { sha256Hex } from '../cas/hash.js';\n\n// Deterministic IDs let reimports converge on the same row instead of\n// duplicating. The shape is sha256 of a tuple of natural keys, hex-truncated\n// to 32 chars (128 bits). 128 bits is overkill for collision but makes IDs\n// short enough to grep without losing essentially zero safety.\n\nconst ID_PREFIX_BYTES = 16; // 128 bits => 32 hex chars\n\nfunction tupleId(parts: readonly string[]): string {\n // The separator avoids ambiguity between (\"a:b\",\"c\") and (\"a\",\"b:c\").\n return sha256Hex(parts.join('\u0000')).slice(0, ID_PREFIX_BYTES * 2);\n}\n\nexport function sourceFileId(\n sourceTool: string,\n absolutePath: string,\n contentHash: string,\n): string {\n // Includes contentHash so that a modified version of the same file gets a\n // new row instead of clashing with the previous import (which we keep around\n // for history / re-projection).\n return tupleId(['source_file', sourceTool, absolutePath, contentHash]);\n}\n\nexport function rawRecordId(\n sourceFileId: string,\n ordinal: number | null,\n rawObjectId: string,\n): string {\n return tupleId(['raw_record', sourceFileId, String(ordinal ?? -1), rawObjectId]);\n}\n\nexport function sessionId(sourceTool: string, sourceSessionId: string): string {\n return tupleId(['session', sourceTool, sourceSessionId]);\n}\n\nexport function turnId(sessionId: string, ordinal: number, sourceTurnId?: string | null): string {\n return tupleId(['turn', sessionId, String(ordinal), sourceTurnId ?? '']);\n}\n\nexport function eventId(sessionId: string, ordinal: number, kind: string): string {\n return tupleId(['event', sessionId, String(ordinal), kind]);\n}\n\nexport function messageId(sessionId: string, ordinal: number, sourceMsgId?: string | null): string {\n return tupleId(['message', sessionId, String(ordinal), sourceMsgId ?? '']);\n}\n\nexport function blockId(messageOrEventId: string, ordinal: number): string {\n return tupleId(['block', messageOrEventId, String(ordinal)]);\n}\n\nexport function toolCallId(sessionId: string, sourceCallId: string): string {\n return tupleId(['tool_call', sessionId, sourceCallId]);\n}\n\nexport function toolResultId(sessionId: string, sourceCallId: string): string {\n return tupleId(['tool_result', sessionId, sourceCallId]);\n}\n\nexport function artifactId(sessionId: string | null, sourceTool: string, key: string): string {\n return tupleId(['artifact', sessionId ?? '', sourceTool, key]);\n}\n\nexport function projectId(sourceTool: string, sourceProjectId: string): string {\n return tupleId(['project', sourceTool, sourceProjectId]);\n}\n\nexport function importBatchId(sourceTool: string, startedAtIso: string): string {\n return tupleId(['import_batch', sourceTool, startedAtIso, String(Math.random())]);\n}\n","import type { Bundle } from '../bundle.js';\nimport { type ObjectId, putJson } from '../cas/index.js';\nimport { prepare } from '../db.js';\nimport { importBatchId } from '../domain/ids.js';\nimport type { SourceTool } from '../domain/types.js';\nimport { PROSA_PARSER_VERSION } from '../version.js';\n\nexport interface ImportBatch {\n batch_id: string;\n source_tool: SourceTool | null;\n parser_version: string;\n paths: string[];\n started_at: string;\n finished_at?: string;\n}\n\nexport interface ImportCounts {\n source_files_seen: number;\n source_files_imported: number;\n source_files_skipped: number;\n raw_records: number;\n sessions: number;\n turns: number;\n events: number;\n messages: number;\n content_blocks: number;\n tool_calls: number;\n tool_results: number;\n artifacts: number;\n edges: number;\n errors: number;\n}\n\nexport function emptyCounts(): ImportCounts {\n return {\n source_files_seen: 0,\n source_files_imported: 0,\n source_files_skipped: 0,\n raw_records: 0,\n sessions: 0,\n turns: 0,\n events: 0,\n messages: 0,\n content_blocks: 0,\n tool_calls: 0,\n tool_results: 0,\n artifacts: 0,\n edges: 0,\n errors: 0,\n };\n}\n\nexport function startBatch(\n bundle: Bundle,\n sourceTool: SourceTool | null,\n paths: string[],\n): ImportBatch {\n const startedAt = new Date().toISOString();\n const id = importBatchId(sourceTool ?? 'all', startedAt);\n prepare(\n bundle.db,\n `INSERT INTO import_batches (\n batch_id, parser_version, source_tool, paths, started_at, status\n ) VALUES (?, ?, ?, ?, ?, 'running')`,\n ).run(id, PROSA_PARSER_VERSION, sourceTool, JSON.stringify(paths), startedAt);\n\n return {\n batch_id: id,\n source_tool: sourceTool,\n parser_version: PROSA_PARSER_VERSION,\n paths,\n started_at: startedAt,\n };\n}\n\nexport function finishBatch(\n bundle: Bundle,\n batch: ImportBatch,\n counts: ImportCounts,\n status: 'completed' | 'failed',\n): void {\n prepare(\n bundle.db,\n `UPDATE import_batches\n SET finished_at = ?, status = ?, counts_json = ?\n WHERE batch_id = ?`,\n ).run(new Date().toISOString(), status, JSON.stringify(counts), batch.batch_id);\n}\n\nexport async function recordError(\n bundle: Bundle,\n batchId: string,\n args: {\n sourceFileId?: string | null;\n rawRecordId?: string | null;\n kind: string;\n message: string;\n payload?: unknown;\n },\n): Promise<void> {\n let payloadObjectId: ObjectId | null = null;\n if (args.payload !== undefined) {\n payloadObjectId = await putJson(bundle, args.payload);\n }\n prepare(\n bundle.db,\n `INSERT INTO import_errors (\n batch_id, source_file_id, raw_record_id, kind, message,\n payload_object_id, occurred_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n batchId,\n args.sourceFileId ?? null,\n args.rawRecordId ?? null,\n args.kind,\n args.message,\n payloadObjectId,\n new Date().toISOString(),\n );\n}\n","import { access, mkdir, readFile, stat, writeFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport type { Bundle } from '../bundle.js';\nimport { compressBytes } from '../cas/compress.js';\nimport { blake3Hex, objectIdFromHash, sha256Hex } from '../cas/hash.js';\nimport { prepare } from '../db.js';\nimport { sourceFileId } from '../domain/ids.js';\nimport type { SourceTool } from '../domain/types.js';\n\nexport interface SourceFileRow {\n source_file_id: string;\n source_tool: SourceTool;\n path: string;\n file_kind: string;\n size_bytes: number;\n mtime: string | null;\n content_hash: string;\n object_id: string | null;\n discovered_at: string;\n workspace_hint: string | null;\n}\n\nexport interface RegisterResult {\n row: SourceFileRow;\n alreadyKnown: boolean;\n}\n\n/**\n * Idempotent registration of a source file. The natural key is\n * (source_tool, path, size, mtime, content_hash). If a row with the same\n * tuple already exists we return it untouched and the caller can skip\n * re-importing. Otherwise we insert a new row.\n *\n * This is the cheapest form of idempotency: re-running `prosa compile` over\n * the same Codex tree is a no-op (no rehash unless the file changed).\n */\nexport async function registerSourceFile(\n bundle: Bundle,\n args: {\n sourceTool: SourceTool;\n absolutePath: string;\n fileKind: string;\n workspaceHint?: string | null;\n },\n): Promise<RegisterResult> {\n const st = await stat(args.absolutePath);\n const size = st.size;\n const mtime = st.mtime.toISOString();\n\n // Hash on demand. We could memoize per (path,size,mtime) but the cheap\n // pre-check below already covers the common case.\n const cheap = prepare<[SourceTool, string, number, string], SourceFileRow>(\n bundle.db,\n `SELECT source_file_id, source_tool, path, file_kind, size_bytes, mtime,\n content_hash, object_id, discovered_at, workspace_hint\n FROM source_files\n WHERE source_tool = ? AND path = ? AND size_bytes = ? AND mtime = ?\n LIMIT 1`,\n ).get(args.sourceTool, args.absolutePath, size, mtime);\n\n if (cheap) {\n return {\n row: await ensureSourceFilePreserved(bundle, cheap, args.absolutePath),\n alreadyKnown: true,\n };\n }\n\n const buf = await readFile(args.absolutePath);\n const contentHash = sha256Hex(buf);\n\n // Slow path: same content under same path was perhaps re-saved with new\n // mtime; honor the (tool,path,size,mtime,hash) UNIQUE constraint.\n const exact = prepare<[SourceTool, string, string], SourceFileRow>(\n bundle.db,\n `SELECT source_file_id, source_tool, path, file_kind, size_bytes, mtime,\n content_hash, object_id, discovered_at, workspace_hint\n FROM source_files\n WHERE source_tool = ? AND path = ? AND content_hash = ?\n LIMIT 1`,\n ).get(args.sourceTool, args.absolutePath, contentHash);\n\n if (exact) {\n return {\n row: await ensureSourceFilePreserved(bundle, exact, args.absolutePath, buf),\n alreadyKnown: true,\n };\n }\n\n const objectId = await preserveRawSourceBytes(bundle, buf);\n\n const id = sourceFileId(args.sourceTool, args.absolutePath, contentHash);\n const row: SourceFileRow = {\n source_file_id: id,\n source_tool: args.sourceTool,\n path: args.absolutePath,\n file_kind: args.fileKind,\n size_bytes: size,\n mtime,\n content_hash: contentHash,\n object_id: objectId,\n discovered_at: new Date().toISOString(),\n workspace_hint: args.workspaceHint ?? null,\n };\n\n prepare(\n bundle.db,\n `INSERT INTO source_files (\n source_file_id, source_tool, path, file_kind, size_bytes, mtime,\n content_hash, object_id, discovered_at, workspace_hint\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n row.source_file_id,\n row.source_tool,\n row.path,\n row.file_kind,\n row.size_bytes,\n row.mtime,\n row.content_hash,\n row.object_id,\n row.discovered_at,\n row.workspace_hint,\n );\n\n return { row, alreadyKnown: false };\n}\n\nasync function ensureSourceFilePreserved(\n bundle: Bundle,\n row: SourceFileRow,\n absolutePath: string,\n bytes?: Buffer,\n): Promise<SourceFileRow> {\n if (row.object_id) return row;\n\n const sourceBytes = bytes ?? (await readFile(absolutePath));\n const objectId = await preserveRawSourceBytes(bundle, sourceBytes);\n\n prepare<[string, string]>(\n bundle.db,\n `UPDATE source_files SET object_id = ? WHERE source_file_id = ?`,\n ).run(objectId, row.source_file_id);\n\n return { ...row, object_id: objectId };\n}\n\nasync function preserveRawSourceBytes(bundle: Bundle, bytes: Uint8Array): Promise<string> {\n const hash = blake3Hex(bytes);\n const objectId = objectIdFromHash(hash);\n const { bytes: stored, compression } = compressBytes(bytes);\n const storagePath = rawSourceStoragePath(hash, compression);\n const absolutePath = path.join(bundle.path, storagePath);\n\n await mkdir(path.dirname(absolutePath), { recursive: true });\n if (!(await fileExists(absolutePath))) {\n await writeFile(absolutePath, stored);\n }\n\n const existing = prepare<[string], { object_id: string }>(\n bundle.db,\n `SELECT object_id FROM objects WHERE object_id = ?`,\n ).get(objectId);\n\n if (!existing) {\n prepare(\n bundle.db,\n `INSERT INTO objects (\n object_id, hash_alg, hash, size_bytes, compressed_size_bytes,\n compression, mime_type, encoding, storage_path, created_at\n ) VALUES (?, 'blake3', ?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n objectId,\n hash,\n bytes.byteLength,\n compression === 'zstd' ? stored.byteLength : null,\n compression,\n 'application/octet-stream',\n null,\n storagePath,\n new Date().toISOString(),\n );\n }\n\n return objectId;\n}\n\nfunction rawSourceStoragePath(hashHex: string, compression: 'zstd' | 'none'): string {\n const ext = compression === 'zstd' ? '.zst' : '.bin';\n return `raw/sources/${hashHex}${ext}`;\n}\n\nasync function fileExists(filePath: string): Promise<boolean> {\n try {\n await access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n","import type { Bundle } from '../core/bundle.js';\nimport type { Confidence, SourceTool } from '../core/domain/types.js';\n\nexport interface SessionListFilters {\n sourceTool?: SourceTool;\n sinceIso?: string;\n untilIso?: string;\n limit?: number;\n}\n\nexport interface SessionRow {\n session_id: string;\n source_tool: SourceTool;\n source_session_id: string;\n parent_session_id: string | null;\n is_subagent: 0 | 1;\n title: string | null;\n start_ts: string | null;\n end_ts: string | null;\n cwd_initial: string | null;\n git_branch_initial: string | null;\n model_first: string | null;\n model_last: string | null;\n status: string | null;\n timeline_confidence: Confidence;\n message_count: number;\n tool_call_count: number;\n}\n\nfunction sessionFilterWhere(filters: SessionListFilters): { where: string; params: unknown[] } {\n const conds: string[] = [];\n const params: unknown[] = [];\n\n if (filters.sourceTool) {\n conds.push('s.source_tool = ?');\n params.push(filters.sourceTool);\n }\n if (filters.sinceIso) {\n conds.push('(s.start_ts IS NULL OR s.start_ts >= ?)');\n params.push(filters.sinceIso);\n }\n if (filters.untilIso) {\n conds.push('(s.start_ts IS NULL OR s.start_ts < ?)');\n params.push(filters.untilIso);\n }\n\n return {\n where: conds.length ? `WHERE ${conds.join(' AND ')}` : '',\n params,\n };\n}\n\nexport function listSessions(bundle: Bundle, filters: SessionListFilters = {}): SessionRow[] {\n const { where, params } = sessionFilterWhere(filters);\n const limit = Math.max(1, Math.min(1000, filters.limit ?? 50));\n\n const sql = `\n SELECT s.session_id,\n s.source_tool,\n s.source_session_id,\n s.parent_session_id,\n s.is_subagent,\n s.title,\n s.start_ts,\n s.end_ts,\n s.cwd_initial,\n s.git_branch_initial,\n s.model_first,\n s.model_last,\n s.status,\n s.timeline_confidence,\n (SELECT count(*) FROM messages m WHERE m.session_id = s.session_id) AS message_count,\n (SELECT count(*) FROM tool_calls tc WHERE tc.session_id = s.session_id) AS tool_call_count\n FROM sessions s\n ${where}\n ORDER BY s.start_ts DESC NULLS LAST\n LIMIT ${limit}\n `;\n\n return bundle.db.prepare(sql).all(...params) as SessionRow[];\n}\n\nexport function countSessions(bundle: Bundle, filters: SessionListFilters = {}): number {\n const { where, params } = sessionFilterWhere(filters);\n const row = bundle.db\n .prepare(\n `\n SELECT count(*) AS count\n FROM sessions s\n ${where}\n `,\n )\n .get(...params) as { count: number } | undefined;\n\n return row?.count ?? 0;\n}\n\nexport interface SessionDetailEvent {\n ordinal: number;\n timestamp: string | null;\n event_type: string;\n source_type: string | null;\n subtype: string | null;\n actor: string | null;\n message_id: string | null;\n role: string | null;\n tool_name: string | null;\n is_error: 0 | 1 | null;\n preview: string | null;\n}\n\nexport interface SessionDetail {\n session: SessionRow;\n events: SessionDetailEvent[];\n}\n\nexport function getSession(bundle: Bundle, sessionId: string): SessionDetail | null {\n const rows = listSessions(bundle); // small query reused for shape\n const row = bundle.db\n .prepare<[string], SessionRow>(\n `SELECT s.session_id, s.source_tool, s.source_session_id, s.parent_session_id,\n s.is_subagent, s.title, s.start_ts, s.end_ts, s.cwd_initial,\n s.git_branch_initial, s.model_first, s.model_last, s.status,\n s.timeline_confidence,\n (SELECT count(*) FROM messages m WHERE m.session_id = s.session_id) AS message_count,\n (SELECT count(*) FROM tool_calls tc WHERE tc.session_id = s.session_id) AS tool_call_count\n FROM sessions s\n WHERE s.session_id = ?`,\n )\n .get(sessionId);\n void rows;\n if (!row) return null;\n\n const events = bundle.db\n .prepare<[string], SessionDetailEvent>(\n `SELECT e.ordinal,\n e.timestamp,\n e.event_type,\n e.source_type,\n e.subtype,\n e.actor,\n m.message_id,\n m.role,\n tc.tool_name,\n tr.is_error,\n tr.preview\n FROM events e\n LEFT JOIN messages m ON m.event_id = e.event_id\n LEFT JOIN tool_calls tc ON tc.event_id = e.event_id\n LEFT JOIN tool_results tr ON tr.event_id = e.event_id\n WHERE e.session_id = ?\n ORDER BY e.ordinal`,\n )\n .all(sessionId);\n\n return { session: row, events };\n}\n","import { existsSync } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport type { Bundle } from '../core/bundle.js';\nimport { type SearchEngine, getSearchIndexStatus } from './indexing.js';\n\nconst require = createRequire(import.meta.url);\n\nexport interface SearchHit {\n doc_id: string;\n entity_type: string;\n entity_id: string;\n session_id: string | null;\n timestamp: string | null;\n role: string | null;\n tool_name: string | null;\n field_kind: string;\n snippet: string;\n}\n\nexport interface SearchOptions {\n query: string;\n limit?: number;\n engine?: SearchEngine;\n /**\n * When true, pass `query` straight to FTS5 (MATCH expression). When false\n * (default), each whitespace-delimited token is wrapped in double quotes so\n * punctuation like `package.json` doesn't trip the FTS5 parser. Set true if\n * you want to use FTS5 operators like `OR`, `NEAR`, prefixes, etc.\n */\n raw?: boolean;\n}\n\n/**\n * Wrap each whitespace-delimited token in double quotes so the FTS5 parser\n * treats them as phrases. This avoids syntax errors on punctuation that the\n * unicode61 tokenizer splits on (dots, slashes, hyphens, etc.) while still\n * AND-matching across tokens.\n */\nfunction escapeFtsQuery(q: string): string {\n return q\n .split(/\\s+/)\n .filter((t) => t.length > 0)\n .map((t) => `\"${t.replace(/\"/g, '\"\"')}\"`)\n .join(' ');\n}\n\n/**\n * FTS5 search over messages, tool calls and tool outputs. Caller passes a\n * raw FTS5 MATCH query. We project a snippet around the hit and join with\n * search_docs to recover entity metadata.\n */\nexport function searchFullText(bundle: Bundle, options: SearchOptions): SearchHit[] {\n if (options.engine === 'tantivy') {\n return searchTantivy(bundle, options);\n }\n\n const limit = Math.max(1, Math.min(500, options.limit ?? 50));\n const sql = `\n SELECT d.doc_id,\n d.entity_type,\n d.entity_id,\n d.session_id,\n d.timestamp,\n d.role,\n d.tool_name,\n d.field_kind,\n snippet(search_docs_fts, 0, '⟪', '⟫', '…', 12) AS snippet\n FROM search_docs_fts\n JOIN search_docs d ON d.rowid = search_docs_fts.rowid\n WHERE search_docs_fts MATCH ?\n ORDER BY bm25(search_docs_fts), d.timestamp DESC\n LIMIT ${limit}\n `;\n const ftsQuery = options.raw ? options.query : escapeFtsQuery(options.query);\n if (!ftsQuery) return [];\n return bundle.db.prepare(sql).all(ftsQuery) as SearchHit[];\n}\n\nfunction searchTantivy(bundle: Bundle, options: SearchOptions): SearchHit[] {\n if (!existsSync(bundle.paths.tantivy)) {\n throw new Error('tantivy index not found; run `prosa index tantivy` first');\n }\n\n const status = getSearchIndexStatus(bundle, 'tantivy');\n if (status?.status !== 'ready') {\n throw new Error(\n `tantivy index is ${status?.status ?? 'missing'}; run \\`prosa index tantivy\\` first`,\n );\n }\n\n const limit = Math.max(1, Math.min(500, options.limit ?? 50));\n const queryText = options.query.trim();\n if (!queryText) return [];\n\n const tantivy = requireTantivy();\n const index = tantivy.Index.open(bundle.paths.tantivy);\n const searcher = index.searcher();\n const [query] = options.raw\n ? [index.parseQuery(queryText, ['text'])]\n : index.parseQueryLenient(queryText, ['text'], undefined, {\n text: [true, 2, true],\n });\n const result = searcher.search(query, limit, true);\n const snippets = tantivy.SnippetGenerator.create(searcher, query, index.schema, 'text');\n snippets.setMaxNumChars(180);\n\n return result.hits.map((hit: TantivySearchHit) => {\n const doc = searcher.doc(hit.docAddress);\n const snippet = snippets.snippetFromDoc(doc);\n const text = getStoredText(doc, 'text');\n const renderedSnippet = snippet.fragment()\n ? highlightSnippet(snippet.fragment(), snippet.highlighted())\n : text.slice(0, 180);\n return {\n doc_id: getStoredText(doc, 'doc_id'),\n entity_type: getStoredText(doc, 'entity_type'),\n entity_id: getStoredText(doc, 'entity_id'),\n session_id: nullIfEmpty(getStoredText(doc, 'session_id')),\n timestamp: nullIfEmpty(getStoredText(doc, 'timestamp')),\n role: nullIfEmpty(getStoredText(doc, 'role')),\n tool_name: nullIfEmpty(getStoredText(doc, 'tool_name')),\n field_kind: getStoredText(doc, 'field_kind'),\n snippet: renderedSnippet,\n };\n });\n}\n\ntype TantivyModule = typeof import('@oxdev03/node-tantivy-binding');\ntype TantivyDocument = InstanceType<TantivyModule['Document']>;\ntype TantivySearchHit = import('@oxdev03/node-tantivy-binding').SearchHit;\n\nfunction requireTantivy(): TantivyModule {\n try {\n return require('@oxdev03/node-tantivy-binding') as TantivyModule;\n } catch (error) {\n throw new Error(\n `tantivy engine is unavailable: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\nfunction getStoredText(doc: TantivyDocument, field: string): string {\n const value = doc.getFirst(field);\n if (typeof value === 'string') return value;\n if (Array.isArray(value) && typeof value[0] === 'string') return value[0];\n if (value == null) return '';\n return String(value);\n}\n\nfunction nullIfEmpty(value: string): string | null {\n return value.length > 0 ? value : null;\n}\n\nfunction highlightSnippet(fragment: string, ranges: Array<{ start: number; end: number }>): string {\n if (ranges.length === 0) return fragment;\n\n let out = '';\n let cursor = 0;\n for (const range of ranges) {\n out += fragment.slice(cursor, range.start);\n out += `⟪${fragment.slice(range.start, range.end)}⟫`;\n cursor = range.end;\n }\n out += fragment.slice(cursor);\n return out;\n}\n","import { mkdir, rm, writeFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport type { Bundle } from '../core/bundle.js';\nimport { prepare, transactional } from '../core/db.js';\n\nexport type SearchEngine = 'fts5' | 'tantivy';\n\nexport interface SearchIndexStatus {\n engine: SearchEngine;\n status: 'missing' | 'ready' | 'stale' | 'building' | 'failed';\n source_doc_count: number;\n indexed_doc_count: number;\n updated_at: string;\n error_message: string | null;\n}\n\ninterface SearchDocRow {\n rowid: number;\n doc_id: string;\n entity_type: string;\n entity_id: string;\n session_id: string | null;\n project_id: string | null;\n timestamp: string | null;\n role: string | null;\n tool_name: string | null;\n canonical_tool_type: string | null;\n field_kind: string;\n text: string;\n}\n\nconst FTS5_TRIGGER_SQL = `\nCREATE TRIGGER IF NOT EXISTS search_docs_ai AFTER INSERT ON search_docs BEGIN\n INSERT INTO search_docs_fts(rowid, text, role, tool_name, field_kind)\n VALUES (new.rowid, new.text, new.role, new.tool_name, new.field_kind);\nEND;\n\nCREATE TRIGGER IF NOT EXISTS search_docs_ad AFTER DELETE ON search_docs BEGIN\n INSERT INTO search_docs_fts(search_docs_fts, rowid, text, role, tool_name, field_kind)\n VALUES('delete', old.rowid, old.text, old.role, old.tool_name, old.field_kind);\nEND;\n\nCREATE TRIGGER IF NOT EXISTS search_docs_au AFTER UPDATE ON search_docs BEGIN\n INSERT INTO search_docs_fts(search_docs_fts, rowid, text, role, tool_name, field_kind)\n VALUES('delete', old.rowid, old.text, old.role, old.tool_name, old.field_kind);\n INSERT INTO search_docs_fts(rowid, text, role, tool_name, field_kind)\n VALUES (new.rowid, new.text, new.role, new.tool_name, new.field_kind);\nEND;\n`;\n\nexport function enableFts5Triggers(bundle: Bundle): void {\n bundle.db.exec(FTS5_TRIGGER_SQL);\n}\n\nexport function disableFts5Triggers(bundle: Bundle): void {\n bundle.db.exec(`\n DROP TRIGGER IF EXISTS search_docs_ai;\n DROP TRIGGER IF EXISTS search_docs_ad;\n DROP TRIGGER IF EXISTS search_docs_au;\n `);\n}\n\nexport function getSearchIndexStatuses(bundle: Bundle): SearchIndexStatus[] {\n ensureSearchIndexStatusRows(bundle);\n return bundle.db\n .prepare<[], SearchIndexStatus>(\n `SELECT engine, status, source_doc_count, indexed_doc_count, updated_at, error_message\n FROM search_index_status\n ORDER BY engine`,\n )\n .all();\n}\n\nexport function getSearchIndexStatus(\n bundle: Bundle,\n engine: SearchEngine,\n): SearchIndexStatus | null {\n ensureSearchIndexStatusRows(bundle);\n return (\n bundle.db\n .prepare<[SearchEngine], SearchIndexStatus>(\n `SELECT engine, status, source_doc_count, indexed_doc_count, updated_at, error_message\n FROM search_index_status\n WHERE engine = ?`,\n )\n .get(engine) ?? null\n );\n}\n\nexport function markIndexesAfterImport(\n bundle: Bundle,\n options: { changed: boolean; fts5Deferred: boolean },\n): void {\n if (!options.changed) return;\n\n if (options.fts5Deferred) {\n updateSearchIndexStatus(bundle, 'fts5', {\n status: 'stale',\n sourceDocCount: countSearchDocs(bundle),\n indexedDocCount: countFts5Docs(bundle),\n errorMessage: null,\n });\n } else {\n updateSearchIndexStatus(bundle, 'fts5', {\n status: 'ready',\n sourceDocCount: countSearchDocs(bundle),\n indexedDocCount: countFts5Docs(bundle),\n errorMessage: null,\n });\n }\n\n const tantivy = getSearchIndexStatus(bundle, 'tantivy');\n if (tantivy?.status === 'ready' || tantivy?.status === 'stale' || tantivy?.status === 'failed') {\n updateSearchIndexStatus(bundle, 'tantivy', {\n status: 'stale',\n sourceDocCount: countSearchDocs(bundle),\n indexedDocCount: tantivy.indexed_doc_count,\n errorMessage: null,\n });\n }\n}\n\nexport function rebuildFts5Index(bundle: Bundle): SearchIndexStatus {\n ensureSearchIndexStatusRows(bundle);\n updateSearchIndexStatus(bundle, 'fts5', {\n status: 'building',\n sourceDocCount: countSearchDocs(bundle),\n indexedDocCount: countFts5Docs(bundle),\n errorMessage: null,\n });\n\n try {\n transactional(bundle.db, () => {\n enableFts5Triggers(bundle);\n bundle.db.exec(`INSERT INTO search_docs_fts(search_docs_fts) VALUES('rebuild')`);\n });\n updateSearchIndexStatus(bundle, 'fts5', {\n status: 'ready',\n sourceDocCount: countSearchDocs(bundle),\n indexedDocCount: countFts5Docs(bundle),\n errorMessage: null,\n });\n } catch (error) {\n updateSearchIndexStatus(bundle, 'fts5', {\n status: 'failed',\n sourceDocCount: countSearchDocs(bundle),\n indexedDocCount: countFts5Docs(bundle),\n errorMessage: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n\n return getSearchIndexStatus(bundle, 'fts5') as SearchIndexStatus;\n}\n\nexport async function rebuildTantivyIndex(bundle: Bundle): Promise<SearchIndexStatus> {\n ensureSearchIndexStatusRows(bundle);\n updateSearchIndexStatus(bundle, 'tantivy', {\n status: 'building',\n sourceDocCount: countSearchDocs(bundle),\n indexedDocCount: 0,\n errorMessage: null,\n });\n\n try {\n const tantivy = await import('@oxdev03/node-tantivy-binding');\n const schema = new tantivy.SchemaBuilder()\n .addTextField('doc_id', { stored: true, tokenizerName: 'raw' })\n .addTextField('entity_type', { stored: true, tokenizerName: 'raw' })\n .addTextField('entity_id', { stored: true, tokenizerName: 'raw' })\n .addTextField('session_id', { stored: true, tokenizerName: 'raw' })\n .addTextField('project_id', { stored: true, tokenizerName: 'raw' })\n .addTextField('timestamp', { stored: true, tokenizerName: 'raw' })\n .addTextField('role', { stored: true, tokenizerName: 'raw' })\n .addTextField('tool_name', { stored: true, tokenizerName: 'raw' })\n .addTextField('canonical_tool_type', { stored: true, tokenizerName: 'raw' })\n .addTextField('field_kind', { stored: true, tokenizerName: 'raw' })\n .addTextField('text', { stored: true })\n .build();\n\n await rm(bundle.paths.tantivy, { recursive: true, force: true });\n await mkdir(bundle.paths.tantivy, { recursive: true });\n\n const index = new tantivy.Index(schema, bundle.paths.tantivy, false);\n const writer = index.writer(50_000_000, 1);\n let indexedDocCount = 0;\n\n const rows = bundle.db\n .prepare<[], SearchDocRow>(\n `SELECT rowid, doc_id, entity_type, entity_id, session_id, project_id, timestamp,\n role, tool_name, canonical_tool_type, field_kind, text\n FROM search_docs\n ORDER BY rowid`,\n )\n .iterate();\n\n for (const row of rows) {\n const doc = new tantivy.Document();\n doc.addText('doc_id', row.doc_id);\n doc.addText('entity_type', row.entity_type);\n doc.addText('entity_id', row.entity_id);\n doc.addText('session_id', row.session_id ?? '');\n doc.addText('project_id', row.project_id ?? '');\n doc.addText('timestamp', row.timestamp ?? '');\n doc.addText('role', row.role ?? '');\n doc.addText('tool_name', row.tool_name ?? '');\n doc.addText('canonical_tool_type', row.canonical_tool_type ?? '');\n doc.addText('field_kind', row.field_kind);\n doc.addText('text', row.text);\n writer.addDocument(doc);\n indexedDocCount++;\n }\n\n writer.commit();\n index.reload();\n await writeFile(\n path.join(bundle.paths.tantivy, 'prosa-index.json'),\n `${JSON.stringify(\n {\n engine: 'tantivy',\n source: 'search_docs',\n built_at: new Date().toISOString(),\n source_doc_count: countSearchDocs(bundle),\n indexed_doc_count: indexedDocCount,\n },\n null,\n 2,\n )}\\n`,\n 'utf8',\n );\n\n updateSearchIndexStatus(bundle, 'tantivy', {\n status: 'ready',\n sourceDocCount: countSearchDocs(bundle),\n indexedDocCount,\n errorMessage: null,\n });\n } catch (error) {\n updateSearchIndexStatus(bundle, 'tantivy', {\n status: 'failed',\n sourceDocCount: countSearchDocs(bundle),\n indexedDocCount: 0,\n errorMessage: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n\n return getSearchIndexStatus(bundle, 'tantivy') as SearchIndexStatus;\n}\n\nfunction ensureSearchIndexStatusRows(bundle: Bundle): void {\n const now = new Date().toISOString();\n const stmt = prepare(\n bundle.db,\n `INSERT OR IGNORE INTO search_index_status (\n engine, status, source_doc_count, indexed_doc_count, updated_at, error_message\n ) VALUES (?, ?, 0, 0, ?, NULL)`,\n );\n stmt.run('fts5', 'ready', now);\n stmt.run('tantivy', 'missing', now);\n}\n\nfunction updateSearchIndexStatus(\n bundle: Bundle,\n engine: SearchEngine,\n values: {\n status: SearchIndexStatus['status'];\n sourceDocCount: number;\n indexedDocCount: number;\n errorMessage: string | null;\n },\n): void {\n ensureSearchIndexStatusRows(bundle);\n prepare(\n bundle.db,\n `UPDATE search_index_status\n SET status = ?,\n source_doc_count = ?,\n indexed_doc_count = ?,\n updated_at = ?,\n error_message = ?\n WHERE engine = ?`,\n ).run(\n values.status,\n values.sourceDocCount,\n values.indexedDocCount,\n new Date().toISOString(),\n values.errorMessage,\n engine,\n );\n}\n\nfunction countSearchDocs(bundle: Bundle): number {\n return (\n bundle.db.prepare<[], { n: number }>(`SELECT count(*) AS n FROM search_docs`).get()?.n ?? 0\n );\n}\n\nfunction countFts5Docs(bundle: Bundle): number {\n return (\n bundle.db.prepare<[], { n: number }>(`SELECT count(*) AS n FROM search_docs_fts`).get()?.n ?? 0\n );\n}\n","import type { Bundle } from '../../core/bundle.js';\nimport { getText } from '../../core/cas/index.js';\n\ninterface SessionMeta {\n session_id: string;\n source_tool: string;\n source_session_id: string;\n title: string | null;\n start_ts: string | null;\n end_ts: string | null;\n cwd_initial: string | null;\n git_branch_initial: string | null;\n model_first: string | null;\n model_last: string | null;\n timeline_confidence: 'high' | 'medium' | 'low';\n}\n\ninterface MessageRow {\n message_id: string;\n role: string;\n timestamp: string | null;\n ordinal: number;\n model: string | null;\n}\n\ninterface BlockRow {\n message_id: string | null;\n block_type: string;\n text_object_id: string | null;\n text_inline: string | null;\n ordinal: number;\n}\n\ninterface ToolCallRow {\n tool_call_id: string;\n message_id: string | null;\n tool_name: string;\n command: string | null;\n path: string | null;\n status: string | null;\n timestamp_start: string | null;\n is_error: 0 | 1 | null;\n preview: string | null;\n}\n\n/**\n * Render a session into Markdown. Big tool outputs aren't dumped inline:\n * we show a preview line plus a `[object: blake3:…]` reference, leaving the\n * raw bytes in the CAS for downstream tools.\n */\nexport async function exportSessionMarkdown(bundle: Bundle, sessionId: string): Promise<string> {\n const session = bundle.db\n .prepare<[string], SessionMeta>(\n `SELECT session_id, source_tool, source_session_id, title, start_ts, end_ts,\n cwd_initial, git_branch_initial, model_first, model_last, timeline_confidence\n FROM sessions WHERE session_id = ?`,\n )\n .get(sessionId);\n\n if (!session) {\n throw new Error(`session not found: ${sessionId}`);\n }\n\n const messages = bundle.db\n .prepare<[string], MessageRow>(\n `SELECT message_id, role, timestamp, ordinal, model\n FROM messages WHERE session_id = ? ORDER BY ordinal`,\n )\n .all(sessionId);\n\n const blocks = bundle.db\n .prepare<[string], BlockRow>(\n `SELECT message_id, block_type, text_object_id, text_inline, ordinal\n FROM content_blocks WHERE session_id = ? ORDER BY ordinal`,\n )\n .all(sessionId);\n\n const toolCalls = bundle.db\n .prepare<[string], ToolCallRow>(\n `SELECT tc.tool_call_id, tc.message_id, tc.tool_name, tc.command, tc.path,\n tc.status, tc.timestamp_start,\n tr.is_error, tr.preview\n FROM tool_calls tc\n LEFT JOIN tool_results tr ON tr.tool_call_id = tc.tool_call_id\n WHERE tc.session_id = ? ORDER BY tc.timestamp_start, tc.tool_call_id`,\n )\n .all(sessionId);\n\n const blocksByMessage = new Map<string, BlockRow[]>();\n for (const b of blocks) {\n if (!b.message_id) continue;\n const list = blocksByMessage.get(b.message_id) ?? [];\n list.push(b);\n blocksByMessage.set(b.message_id, list);\n }\n const callsByMessage = new Map<string, ToolCallRow[]>();\n for (const c of toolCalls) {\n const key = c.message_id ?? '__unattached__';\n const list = callsByMessage.get(key) ?? [];\n list.push(c);\n callsByMessage.set(key, list);\n }\n\n const lines: string[] = [];\n const title =\n session.title?.trim() || `${session.source_tool} session ${session.source_session_id}`;\n lines.push(`# ${title}`, '');\n lines.push(`- **source**: ${session.source_tool}`);\n lines.push(`- **session_id**: \\`${session.session_id}\\``);\n lines.push(`- **source_session_id**: \\`${session.source_session_id}\\``);\n if (session.start_ts) lines.push(`- **start**: ${session.start_ts}`);\n if (session.end_ts) lines.push(`- **end**: ${session.end_ts}`);\n if (session.cwd_initial) lines.push(`- **cwd**: \\`${session.cwd_initial}\\``);\n if (session.git_branch_initial) lines.push(`- **git branch**: ${session.git_branch_initial}`);\n if (session.model_first || session.model_last) {\n lines.push(\n `- **models**: ${session.model_first ?? '?'} → ${session.model_last ?? session.model_first ?? '?'}`,\n );\n }\n lines.push(`- **timeline confidence**: ${session.timeline_confidence}`);\n lines.push('');\n\n for (const m of messages) {\n const ts = m.timestamp ? ` · ${m.timestamp}` : '';\n const model = m.model ? ` · ${m.model}` : '';\n lines.push(`## ${m.role}${model}${ts}`, '');\n\n const mblocks = (blocksByMessage.get(m.message_id) ?? []).sort((a, b) => a.ordinal - b.ordinal);\n for (const b of mblocks) {\n const text = await renderBlockText(bundle, b);\n if (text == null) continue;\n lines.push(text, '');\n }\n\n const calls = callsByMessage.get(m.message_id) ?? [];\n for (const c of calls) {\n lines.push(renderToolCall(c), '');\n }\n }\n\n // Tool calls that didn't bind to any specific message (legacy / event-only).\n const unattached = callsByMessage.get('__unattached__') ?? [];\n if (unattached.length > 0) {\n lines.push('## tool calls (unattached)', '');\n for (const c of unattached) {\n lines.push(renderToolCall(c), '');\n }\n }\n\n return `${lines.join('\\n')}\\n`;\n}\n\nasync function renderBlockText(bundle: Bundle, block: BlockRow): Promise<string | null> {\n if (block.text_inline) return block.text_inline;\n if (block.text_object_id) {\n try {\n return await getText(bundle, block.text_object_id);\n } catch {\n return `_[content unavailable: ${block.text_object_id}]_`;\n }\n }\n return null;\n}\n\nfunction renderToolCall(c: ToolCallRow): string {\n const status = c.status ? ` · ${c.status}` : '';\n const errFlag = c.is_error === 1 ? ' · ERROR' : '';\n const lines: string[] = [];\n lines.push(`### tool: ${c.tool_name}${status}${errFlag}`);\n if (c.command) {\n lines.push('```sh', c.command, '```');\n }\n if (c.path) lines.push(`*path:* \\`${c.path}\\``);\n if (c.preview) {\n lines.push('```');\n lines.push(c.preview);\n lines.push('```');\n }\n return lines.join('\\n');\n}\n","import { mkdir, rm, writeFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { DuckDBConnection } from '@duckdb/node-api';\nimport { closeBundle, openBundle } from '../../core/bundle.js';\n\nexport const PARQUET_TABLES = [\n 'objects',\n 'source_files',\n 'import_batches',\n 'raw_records',\n 'import_errors',\n 'uncertainties',\n 'projects',\n 'sessions',\n 'turns',\n 'events',\n 'messages',\n 'content_blocks',\n 'tool_calls',\n 'tool_results',\n 'artifacts',\n 'edges',\n 'search_docs',\n] as const;\n\nexport type ParquetTable = (typeof PARQUET_TABLES)[number];\n\nexport interface ParquetExportOptions {\n bundlePath: string;\n outDir?: string;\n}\n\nexport interface ParquetExportResult {\n outDir: string;\n manifestPath: string;\n files: Record<ParquetTable, string>;\n counts: Record<ParquetTable, number>;\n}\n\nexport interface DuckDbQueryOptions {\n parquetDir: string;\n sql: string;\n}\n\nexport interface DuckDbQueryResult {\n columns: string[];\n rows: Record<string, unknown>[];\n}\n\ninterface BundleSnapshot {\n dbPath: string;\n schemaVersion: number;\n parserVersion: string;\n defaultOutDir: string;\n counts: Record<ParquetTable, number>;\n}\n\nexport async function exportBundleParquet(\n options: ParquetExportOptions,\n): Promise<ParquetExportResult> {\n const snapshot = await openBundleSnapshot(options.bundlePath);\n const outDir = path.resolve(options.outDir ?? snapshot.defaultOutDir);\n await mkdir(outDir, { recursive: true });\n\n const files = Object.fromEntries(\n PARQUET_TABLES.map((table) => [table, path.join(outDir, `${table}.parquet`)]),\n ) as Record<ParquetTable, string>;\n const manifestPath = path.join(outDir, 'manifest.json');\n\n for (const file of [...Object.values(files), manifestPath]) {\n await rm(file, { force: true });\n }\n\n const connection = await createDuckDbConnection();\n try {\n await attachSqlite(connection, snapshot.dbPath);\n for (const table of PARQUET_TABLES) {\n await connection.run(\n `COPY (SELECT * FROM prosa.${quoteIdentifier(table)}) TO ${sqlString(files[table])} (FORMAT parquet)`,\n );\n }\n } finally {\n connection.closeSync();\n }\n\n const manifest = {\n exported_at: new Date().toISOString(),\n source_db: snapshot.dbPath,\n schema_version: snapshot.schemaVersion,\n parser_version: snapshot.parserVersion,\n tables: Object.fromEntries(\n PARQUET_TABLES.map((table) => [\n table,\n {\n file: path.basename(files[table]),\n rows: snapshot.counts[table],\n },\n ]),\n ),\n };\n await writeFile(manifestPath, `${JSON.stringify(manifest, null, 2)}\\n`, 'utf8');\n\n return { outDir, manifestPath, files, counts: snapshot.counts };\n}\n\nexport async function queryDuckDbParquet(options: DuckDbQueryOptions): Promise<DuckDbQueryResult> {\n const parquetDir = path.resolve(options.parquetDir);\n const connection = await createDuckDbConnection();\n try {\n for (const table of PARQUET_TABLES) {\n await connection.run(\n `CREATE OR REPLACE VIEW ${quoteIdentifier(table)} AS SELECT * FROM read_parquet(${sqlString(\n path.join(parquetDir, `${table}.parquet`),\n )})`,\n );\n }\n\n const reader = await connection.runAndReadAll(options.sql);\n return {\n columns: reader.deduplicatedColumnNames(),\n rows: reader.getRowObjectsJson() as Record<string, unknown>[],\n };\n } catch (error) {\n if (isMissingParquetError(error)) {\n throw new Error(\n `Parquet export not found in ${parquetDir}; run \\`prosa export parquet --store <path>\\` first`,\n );\n }\n throw error;\n } finally {\n connection.closeSync();\n }\n}\n\nasync function createDuckDbConnection(): Promise<DuckDBConnection> {\n return DuckDBConnection.create();\n}\n\nasync function attachSqlite(connection: DuckDBConnection, dbPath: string): Promise<void> {\n try {\n await connection.run('INSTALL sqlite');\n await connection.run('LOAD sqlite');\n await connection.run(`ATTACH ${sqlString(dbPath)} AS prosa (TYPE sqlite)`);\n } catch (error) {\n throw new Error(\n `DuckDB could not attach prosa.sqlite via the sqlite extension: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n}\n\nasync function openBundleSnapshot(bundlePath: string): Promise<BundleSnapshot> {\n const bundle = await openBundle(bundlePath);\n try {\n const counts = Object.fromEntries(\n PARQUET_TABLES.map((table) => {\n const row = bundle.db\n .prepare<[], { n: number }>(`SELECT count(*) AS n FROM ${quoteIdentifier(table)}`)\n .get();\n return [table, row?.n ?? 0];\n }),\n ) as Record<ParquetTable, number>;\n\n return {\n dbPath: bundle.paths.db,\n schemaVersion: bundle.manifest.schema_version,\n parserVersion: bundle.manifest.parser_version,\n defaultOutDir: bundle.paths.parquet,\n counts,\n };\n } finally {\n closeBundle(bundle);\n }\n}\n\nfunction quoteIdentifier(value: string): string {\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n}\n\nfunction sqlString(value: string): string {\n return `'${value.replace(/'/g, \"''\")}'`;\n}\n\nfunction isMissingParquetError(error: unknown): boolean {\n const message = error instanceof Error ? error.message : String(error);\n return /No files found|does not exist|not found/i.test(message) && /\\.parquet/i.test(message);\n}\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport type { Bundle } from '../../core/bundle.js';\nimport { type ObjectId, putBytes, putJson, putText } from '../../core/cas/index.js';\nimport { prepare, transactional } from '../../core/db.js';\nimport {\n artifactId,\n blockId,\n eventId as makeEventId,\n messageId as makeMessageId,\n rawRecordId as makeRawRecordId,\n sessionId as makeSessionId,\n toolCallId as makeToolCallId,\n toolResultId as makeToolResultId,\n turnId as makeTurnId,\n} from '../../core/domain/ids.js';\nimport {\n type ImportBatch,\n type ImportCounts,\n emptyCounts,\n finishBatch,\n recordError,\n startBatch,\n} from '../../core/ingest/batch.js';\nimport { registerSourceFile } from '../../core/ingest/idempotency.js';\nimport { discoverCodexSessions } from './discover.js';\nimport type {\n CodexContentItem,\n CodexEnvelope,\n CodexEventMsgPayload,\n CodexResponseItemPayload,\n CodexSessionMetaPayload,\n CodexTurnContextPayload,\n} from './types.js';\n\nexport interface CompileResult {\n batch: ImportBatch;\n counts: ImportCounts;\n}\n\nconst PREVIEW_MAX = 4_000;\n\nexport async function compileCodex(bundle: Bundle, root: string): Promise<CompileResult> {\n const batch = startBatch(bundle, 'codex', [root]);\n const counts = emptyCounts();\n\n try {\n for await (const filePath of discoverCodexSessions(root)) {\n counts.source_files_seen++;\n try {\n const fileCounts = await compileCodexFile(bundle, batch, filePath);\n addCounts(counts, fileCounts);\n } catch (error) {\n counts.errors++;\n await recordError(bundle, batch.batch_id, {\n kind: 'codex_file_failed',\n message: error instanceof Error ? error.message : String(error),\n payload: { path: filePath },\n });\n }\n }\n linkSubagentParents(bundle);\n finishBatch(bundle, batch, counts, 'completed');\n } catch (error) {\n finishBatch(bundle, batch, counts, 'failed');\n throw error;\n }\n\n return { batch, counts };\n}\n\n/**\n * After every file is committed, fill `sessions.parent_session_id` from any\n * `edges(spawned)` whose target session now exists. We deliberately set\n * `parent_session_id=NULL` during per-file inserts because a subagent file may\n * be processed before the parent file; deferring the link to a single UPDATE\n * keeps every per-file transaction self-contained.\n */\nfunction linkSubagentParents(bundle: Bundle): void {\n bundle.db.exec(`\n UPDATE sessions\n SET parent_session_id = (\n SELECT e.src_id\n FROM edges e\n WHERE e.edge_type = 'spawned'\n AND e.dst_type = 'session'\n AND e.dst_id = sessions.session_id\n AND EXISTS (SELECT 1 FROM sessions p WHERE p.session_id = e.src_id)\n LIMIT 1\n )\n WHERE parent_session_id IS NULL\n AND is_subagent = 1\n `);\n}\n\ninterface FileCounts {\n source_files_imported: number;\n source_files_skipped: number;\n raw_records: number;\n sessions: number;\n turns: number;\n events: number;\n messages: number;\n content_blocks: number;\n tool_calls: number;\n tool_results: number;\n artifacts: number;\n edges: number;\n errors: number;\n}\n\nfunction emptyFileCounts(): FileCounts {\n return {\n source_files_imported: 0,\n source_files_skipped: 0,\n raw_records: 0,\n sessions: 0,\n turns: 0,\n events: 0,\n messages: 0,\n content_blocks: 0,\n tool_calls: 0,\n tool_results: 0,\n artifacts: 0,\n edges: 0,\n errors: 0,\n };\n}\n\nfunction addCounts(target: ImportCounts, source: FileCounts): void {\n target.source_files_imported += source.source_files_imported;\n target.source_files_skipped += source.source_files_skipped;\n target.raw_records += source.raw_records;\n target.sessions += source.sessions;\n target.turns += source.turns;\n target.events += source.events;\n target.messages += source.messages;\n target.content_blocks += source.content_blocks;\n target.tool_calls += source.tool_calls;\n target.tool_results += source.tool_results;\n target.artifacts += source.artifacts;\n target.edges += source.edges;\n target.errors += source.errors;\n}\n\n// ---- per-file pipeline ---------------------------------------------------\n\ninterface PendingRawRecord {\n raw_record_id: string;\n source_file_id: string;\n source_tool: 'codex';\n record_kind: 'jsonl_line';\n ordinal: number;\n line_no: number;\n json_pointer: null;\n native_id: string | null;\n raw_object_id: ObjectId;\n decoded_json_object_id: ObjectId | null;\n parser_status: 'ok' | 'partial' | 'failed';\n confidence: 'high' | 'medium' | 'low';\n import_batch_id: string;\n}\n\ninterface PendingSession {\n session_id: string;\n source_session_id: string;\n parent_session_id: string | null;\n is_subagent: 0 | 1;\n agent_role: string | null;\n agent_nickname: string | null;\n title: string | null;\n start_ts: string | null;\n cwd_initial: string | null;\n git_branch_initial: string | null;\n raw_record_id: string | null;\n}\n\ninterface PendingTurn {\n turn_id: string;\n ordinal: number;\n source_turn_id: string | null;\n start_ts: string | null;\n model: string | null;\n cwd: string | null;\n approval_policy: string | null;\n sandbox_policy: string | null;\n effort: string | null;\n raw_record_id: string;\n}\n\ninterface PendingEvent {\n event_id: string;\n ordinal: number;\n turn_id: string | null;\n source_event_id: string | null;\n event_type: string;\n source_type: string;\n subtype: string | null;\n timestamp: string | null;\n actor: string | null;\n payload_object_id: ObjectId | null;\n raw_record_id: string;\n confidence: 'high' | 'medium' | 'low';\n}\n\ninterface PendingMessage {\n message_id: string;\n turn_id: string | null;\n event_id: string | null;\n source_message_id: string | null;\n role: 'system_prompt' | 'developer' | 'user' | 'assistant' | 'tool' | 'operational';\n model: string | null;\n timestamp: string | null;\n ordinal: number;\n raw_record_id: string;\n}\n\ninterface PendingBlock {\n block_id: string;\n message_id: string | null;\n event_id: string | null;\n ordinal: number;\n block_type: string;\n text_object_id: ObjectId | null;\n text_inline: string | null;\n raw_record_id: string;\n}\n\ninterface PendingToolCall {\n tool_call_id: string;\n turn_id: string | null;\n message_id: string | null;\n event_id: string | null;\n source_call_id: string | null;\n tool_name: string;\n canonical_tool_type: string;\n args_object_id: ObjectId | null;\n command: string | null;\n cwd: string | null;\n path: string | null;\n query: string | null;\n timestamp_start: string | null;\n status: string | null;\n raw_record_id: string;\n}\n\ninterface PendingToolResult {\n tool_result_id: string;\n tool_call_id: string | null;\n source_call_id: string | null;\n message_id: string | null;\n event_id: string | null;\n status: string | null;\n is_error: 0 | 1;\n exit_code: number | null;\n duration_ms: number | null;\n stdout_object_id: ObjectId | null;\n stderr_object_id: ObjectId | null;\n output_object_id: ObjectId | null;\n preview: string | null;\n raw_record_id: string;\n}\n\ninterface PendingArtifact {\n artifact_id: string;\n kind: string;\n path: string | null;\n logical_path: string | null;\n object_id: ObjectId | null;\n text_object_id: ObjectId | null;\n mime_type: string | null;\n size_bytes: number;\n created_ts: string | null;\n raw_record_id: string;\n}\n\ninterface PendingEdge {\n src_type: string;\n src_id: string;\n dst_type: string;\n dst_id: string;\n edge_type: string;\n confidence: 'high' | 'medium' | 'low';\n source: string;\n raw_record_id: string | null;\n}\n\ninterface PendingSearchDoc {\n doc_id: string;\n entity_type: string;\n entity_id: string;\n timestamp: string | null;\n role: string | null;\n tool_name: string | null;\n canonical_tool_type: string | null;\n field_kind: string;\n text: string;\n}\n\nasync function compileCodexFile(\n bundle: Bundle,\n batch: ImportBatch,\n filePath: string,\n): Promise<FileCounts> {\n const counts = emptyFileCounts();\n\n const { row: sourceFileRow, alreadyKnown } = await registerSourceFile(bundle, {\n sourceTool: 'codex',\n absolutePath: path.resolve(filePath),\n fileKind: 'jsonl',\n });\n\n if (alreadyKnown) {\n // We've already imported this file (same path,size,mtime,hash). Skip.\n counts.source_files_skipped = 1;\n return counts;\n }\n\n counts.source_files_imported = 1;\n\n const text = await readFile(filePath, 'utf8');\n const rawLines = text.split('\\n');\n const lines = rawLines[rawLines.length - 1] === '' ? rawLines.slice(0, -1) : rawLines;\n\n const pending = {\n rawRecords: [] as PendingRawRecord[],\n session: null as PendingSession | null,\n turns: [] as PendingTurn[],\n events: [] as PendingEvent[],\n messages: [] as PendingMessage[],\n blocks: [] as PendingBlock[],\n toolCalls: new Map<string, PendingToolCall>(), // by source_call_id\n toolCallsList: [] as PendingToolCall[],\n toolResults: [] as PendingToolResult[],\n artifacts: [] as PendingArtifact[],\n edges: [] as PendingEdge[],\n searchDocs: [] as PendingSearchDoc[],\n };\n\n let sessionStartTs: string | null = null;\n let sessionEndTs: string | null = null;\n let modelFirst: string | null = null;\n let modelLast: string | null = null;\n let messageOrdinal = 0;\n let turnOrdinal = 0;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (!line || line.length === 0) continue;\n const lineNo = i + 1;\n const ordinal = i;\n\n const lineBytes = Buffer.from(line, 'utf8');\n const rawObjectId = await putBytes(bundle, lineBytes, {\n mimeType: 'application/jsonl-line',\n encoding: 'utf-8',\n });\n\n let parsed: CodexEnvelope | null = null;\n let parserStatus: 'ok' | 'partial' | 'failed' = 'ok';\n try {\n parsed = JSON.parse(line) as CodexEnvelope;\n } catch {\n parserStatus = 'failed';\n }\n\n const decodedObjectId =\n parsed != null && parserStatus === 'ok' ? await putJson(bundle, parsed) : null;\n\n const nativeId = parsed ? extractNativeId(parsed) : null;\n\n const rawRecordId = makeRawRecordId(sourceFileRow.source_file_id, ordinal, rawObjectId);\n\n pending.rawRecords.push({\n raw_record_id: rawRecordId,\n source_file_id: sourceFileRow.source_file_id,\n source_tool: 'codex',\n record_kind: 'jsonl_line',\n ordinal,\n line_no: lineNo,\n json_pointer: null,\n native_id: nativeId,\n raw_object_id: rawObjectId,\n decoded_json_object_id: decodedObjectId,\n parser_status: parserStatus,\n confidence: parserStatus === 'ok' ? 'high' : 'low',\n import_batch_id: batch.batch_id,\n });\n\n if (!parsed) continue;\n\n const ts = typeof parsed.timestamp === 'string' ? parsed.timestamp : null;\n if (ts) {\n if (!sessionStartTs || ts < sessionStartTs) sessionStartTs = ts;\n if (!sessionEndTs || ts > sessionEndTs) sessionEndTs = ts;\n }\n\n const type = typeof parsed.type === 'string' ? parsed.type : null;\n const payload = (parsed.payload ?? {}) as Record<string, unknown>;\n\n if (type === 'session_meta') {\n const meta = payload as CodexSessionMetaPayload;\n const sourceSessionId = meta.id ?? path.basename(filePath, '.jsonl');\n const sessionId = makeSessionId('codex', sourceSessionId);\n\n // First session_meta wins; later ones (rare) become operational events.\n if (!pending.session) {\n const sub = parseSubagent(meta.source);\n pending.session = {\n session_id: sessionId,\n source_session_id: sourceSessionId,\n parent_session_id: sub ? makeSessionId('codex', sub.parent_thread_id) : null,\n is_subagent: sub ? 1 : 0,\n agent_role: meta.agent_role ?? sub?.agent_role ?? null,\n agent_nickname: meta.agent_nickname ?? sub?.agent_nickname ?? null,\n title: null,\n start_ts: meta.timestamp ?? ts,\n cwd_initial: meta.cwd ?? null,\n git_branch_initial: meta.git?.branch ?? null,\n raw_record_id: rawRecordId,\n };\n if (sub) {\n pending.edges.push({\n src_type: 'session',\n src_id: pending.session.parent_session_id ?? '',\n dst_type: 'session',\n dst_id: sessionId,\n edge_type: 'spawned',\n confidence: 'high',\n source: 'explicit',\n raw_record_id: rawRecordId,\n });\n }\n }\n continue;\n }\n\n // From here on, we need a session_id. Ensure we have one (fallback if no\n // session_meta appeared yet).\n const sessionId =\n pending.session?.session_id ?? makeSessionId('codex', path.basename(filePath, '.jsonl'));\n if (!pending.session) {\n pending.session = {\n session_id: sessionId,\n source_session_id: path.basename(filePath, '.jsonl'),\n parent_session_id: null,\n is_subagent: 0,\n agent_role: null,\n agent_nickname: null,\n title: null,\n start_ts: ts,\n cwd_initial: null,\n git_branch_initial: null,\n raw_record_id: null,\n };\n }\n\n if (type === 'turn_context') {\n const tc = payload as CodexTurnContextPayload;\n const turnId = makeTurnId(sessionId, turnOrdinal, tc.turn_id ?? null);\n const turn: PendingTurn = {\n turn_id: turnId,\n ordinal: turnOrdinal++,\n source_turn_id: tc.turn_id ?? null,\n start_ts: ts,\n model: tc.model ?? null,\n cwd: tc.cwd ?? null,\n approval_policy: tc.approval_policy ?? null,\n sandbox_policy: stringifyOrNull(tc.sandbox_policy),\n effort: tc.effort ?? null,\n raw_record_id: rawRecordId,\n };\n pending.turns.push(turn);\n if (turn.model) {\n if (!modelFirst) modelFirst = turn.model;\n modelLast = turn.model;\n }\n continue;\n }\n\n const currentTurnId =\n pending.turns.length > 0 ? pending.turns[pending.turns.length - 1]!.turn_id : null;\n\n if (type === 'response_item') {\n const ri = payload as CodexResponseItemPayload;\n handleResponseItem(\n bundle,\n sessionId,\n currentTurnId,\n rawRecordId,\n ordinal,\n ts,\n ri,\n decodedObjectId,\n () => messageOrdinal++,\n modelLast,\n pending,\n );\n continue;\n }\n\n if (type === 'event_msg') {\n const em = payload as CodexEventMsgPayload;\n await handleEventMsg(\n bundle,\n sessionId,\n currentTurnId,\n rawRecordId,\n ordinal,\n ts,\n em,\n decodedObjectId,\n pending,\n );\n continue;\n }\n\n if (type === 'compacted') {\n pending.events.push({\n event_id: makeEventId(sessionId, ordinal, 'compaction'),\n ordinal,\n turn_id: currentTurnId,\n source_event_id: null,\n event_type: 'compaction',\n source_type: 'compacted',\n subtype: null,\n timestamp: ts,\n actor: 'system',\n payload_object_id: decodedObjectId,\n raw_record_id: rawRecordId,\n confidence: 'high',\n });\n continue;\n }\n\n // Legacy top-level message / function_call etc.\n if (type === 'message') {\n const ri = payload as CodexResponseItemPayload;\n // Treat as if it were wrapped in response_item.\n handleResponseItem(\n bundle,\n sessionId,\n currentTurnId,\n rawRecordId,\n ordinal,\n ts,\n { ...ri, type: 'message' },\n decodedObjectId,\n () => messageOrdinal++,\n modelLast,\n pending,\n );\n }\n // Anything else: keep as raw record, do not normalize. The presence in\n // raw_records is enough for re-processing later.\n }\n\n if (pending.session) {\n pending.session.start_ts ??= sessionStartTs;\n }\n\n // Build search_docs from messages and tool calls already accumulated.\n buildSearchDocs(pending);\n\n // Apply everything in one transaction. The whole file is atomic.\n transactional(bundle.db, () => {\n flushPending(bundle, pending, {\n sessionEndTs,\n modelFirst,\n modelLast,\n sourceTool: 'codex',\n });\n });\n\n counts.raw_records = pending.rawRecords.length;\n counts.sessions = pending.session ? 1 : 0;\n counts.turns = pending.turns.length;\n counts.events = pending.events.length;\n counts.messages = pending.messages.length;\n counts.content_blocks = pending.blocks.length;\n counts.tool_calls = pending.toolCallsList.length;\n counts.tool_results = pending.toolResults.length;\n counts.artifacts = pending.artifacts.length;\n counts.edges = pending.edges.length;\n\n return counts;\n}\n\ninterface PendingState {\n rawRecords: PendingRawRecord[];\n session: PendingSession | null;\n turns: PendingTurn[];\n events: PendingEvent[];\n messages: PendingMessage[];\n blocks: PendingBlock[];\n toolCalls: Map<string, PendingToolCall>;\n toolCallsList: PendingToolCall[];\n toolResults: PendingToolResult[];\n artifacts: PendingArtifact[];\n edges: PendingEdge[];\n searchDocs: PendingSearchDoc[];\n}\n\nfunction handleResponseItem(\n _bundle: Bundle,\n sessionId: string,\n currentTurnId: string | null,\n rawRecordId: string,\n ordinal: number,\n ts: string | null,\n ri: CodexResponseItemPayload,\n payloadObjectId: ObjectId | null,\n nextMsgOrdinal: () => number,\n currentModel: string | null,\n pending: PendingState,\n): void {\n const subtype = ri.type ?? null;\n\n if (subtype === 'message') {\n const role = mapMessageRole(ri.role);\n const msgOrdinal = nextMsgOrdinal();\n const messageId = makeMessageId(sessionId, msgOrdinal, null);\n\n const eventId = makeEventId(sessionId, ordinal, 'message');\n pending.events.push({\n event_id: eventId,\n ordinal,\n turn_id: currentTurnId,\n source_event_id: null,\n event_type: 'message',\n source_type: 'response_item.message',\n subtype: null,\n timestamp: ts,\n actor: ri.role ?? null,\n payload_object_id: payloadObjectId,\n raw_record_id: rawRecordId,\n confidence: 'high',\n });\n\n pending.messages.push({\n message_id: messageId,\n turn_id: currentTurnId,\n event_id: eventId,\n source_message_id: null,\n role,\n model: role === 'assistant' ? currentModel : null,\n timestamp: ts,\n ordinal: msgOrdinal,\n raw_record_id: rawRecordId,\n });\n\n const contentItems = Array.isArray(ri.content) ? (ri.content as CodexContentItem[]) : [];\n for (let bi = 0; bi < contentItems.length; bi++) {\n const item = contentItems[bi];\n if (!item) continue;\n const text = typeof item.text === 'string' ? item.text : null;\n const blockType = item.type ?? 'text';\n pending.blocks.push({\n block_id: blockId(messageId, bi),\n message_id: messageId,\n event_id: null,\n ordinal: bi,\n block_type: blockType,\n text_object_id: null,\n text_inline: text,\n raw_record_id: rawRecordId,\n });\n }\n return;\n }\n\n if (subtype === 'function_call') {\n const sourceCallId = typeof ri.call_id === 'string' ? ri.call_id : null;\n const toolName = typeof ri.name === 'string' ? ri.name : 'unknown';\n const toolCallId = makeToolCallId(sessionId, sourceCallId ?? `${ordinal}`);\n const argsObjectId = ri.arguments != null ? null : null; // keep small inline — see below\n const argsText = stringifyOrNull(ri.arguments);\n const command = inferCommandFromArgs(toolName, ri.arguments);\n\n const eventId = makeEventId(sessionId, ordinal, 'tool_call');\n pending.events.push({\n event_id: eventId,\n ordinal,\n turn_id: currentTurnId,\n source_event_id: null,\n event_type: 'tool_call',\n source_type: 'response_item.function_call',\n subtype: toolName,\n timestamp: ts,\n actor: 'assistant',\n payload_object_id: payloadObjectId,\n raw_record_id: rawRecordId,\n confidence: 'high',\n });\n\n const call: PendingToolCall = {\n tool_call_id: toolCallId,\n turn_id: currentTurnId,\n message_id: null,\n event_id: eventId,\n source_call_id: sourceCallId,\n tool_name: toolName,\n canonical_tool_type: canonicalToolType(toolName),\n args_object_id: argsObjectId,\n command,\n cwd: null,\n path: inferPathFromArgs(ri.arguments),\n query: null,\n timestamp_start: ts,\n status: 'started',\n raw_record_id: rawRecordId,\n };\n if (sourceCallId) pending.toolCalls.set(sourceCallId, call);\n pending.toolCallsList.push(call);\n void argsText;\n return;\n }\n\n if (subtype === 'function_call_output') {\n const sourceCallId = typeof ri.call_id === 'string' ? ri.call_id : null;\n const outputText = stringifyOrNull(ri.output) ?? '';\n const isError = looksLikeError(outputText) ? 1 : 0;\n\n const eventId = makeEventId(sessionId, ordinal, 'tool_result');\n pending.events.push({\n event_id: eventId,\n ordinal,\n turn_id: currentTurnId,\n source_event_id: null,\n event_type: 'tool_result',\n source_type: 'response_item.function_call_output',\n subtype: null,\n timestamp: ts,\n actor: 'tool',\n payload_object_id: payloadObjectId,\n raw_record_id: rawRecordId,\n confidence: 'high',\n });\n\n const matchedCall = sourceCallId ? pending.toolCalls.get(sourceCallId) : undefined;\n pending.toolResults.push({\n tool_result_id: makeToolResultId(sessionId, sourceCallId ?? `${ordinal}`),\n tool_call_id: matchedCall?.tool_call_id ?? null,\n source_call_id: sourceCallId,\n message_id: null,\n event_id: eventId,\n status: ri.status ?? null,\n is_error: isError,\n exit_code: null,\n duration_ms: null,\n stdout_object_id: null,\n stderr_object_id: null,\n output_object_id: null, // small previews only at this stage\n preview: outputText.slice(0, PREVIEW_MAX),\n raw_record_id: rawRecordId,\n });\n if (matchedCall) {\n matchedCall.status =\n matchedCall.status === 'started' ? (isError ? 'error' : 'success') : matchedCall.status;\n }\n return;\n }\n\n // reasoning, custom_tool_*, web_search_call, ghost_snapshot, etc.: keep as\n // operational events for now. Raw is preserved either way.\n const eventId = makeEventId(sessionId, ordinal, `response_item.${subtype ?? 'unknown'}`);\n pending.events.push({\n event_id: eventId,\n ordinal,\n turn_id: currentTurnId,\n source_event_id: null,\n event_type: subtype ?? 'response_item',\n source_type: `response_item.${subtype ?? 'unknown'}`,\n subtype,\n timestamp: ts,\n actor: 'assistant',\n payload_object_id: payloadObjectId,\n raw_record_id: rawRecordId,\n confidence: 'high',\n });\n}\n\nasync function handleEventMsg(\n bundle: Bundle,\n sessionId: string,\n currentTurnId: string | null,\n rawRecordId: string,\n ordinal: number,\n ts: string | null,\n em: CodexEventMsgPayload,\n payloadObjectId: ObjectId | null,\n pending: PendingState,\n): Promise<void> {\n const subtype = em.type ?? 'unknown';\n\n if (subtype === 'exec_command_end') {\n const sourceCallId = em.call_id ?? null;\n const stdoutId = em.stdout\n ? await putText(bundle, em.stdout, { mimeType: 'text/plain' })\n : null;\n const stderrId = em.stderr\n ? await putText(bundle, em.stderr, { mimeType: 'text/plain' })\n : null;\n const preview = (em.formatted_output ?? em.aggregated_output ?? em.stdout ?? '').slice(\n 0,\n PREVIEW_MAX,\n );\n const exitCode = typeof em.exit_code === 'number' ? em.exit_code : null;\n const isError = exitCode != null && exitCode !== 0 ? 1 : 0;\n\n const eventId = makeEventId(sessionId, ordinal, 'exec_command_end');\n pending.events.push({\n event_id: eventId,\n ordinal,\n turn_id: currentTurnId,\n source_event_id: null,\n event_type: 'tool_result',\n source_type: 'event_msg.exec_command_end',\n subtype: 'shell',\n timestamp: ts,\n actor: 'tool',\n payload_object_id: payloadObjectId,\n raw_record_id: rawRecordId,\n confidence: 'high',\n });\n\n const matchedCall = sourceCallId ? pending.toolCalls.get(sourceCallId) : undefined;\n pending.toolResults.push({\n tool_result_id: makeToolResultId(sessionId, `${sourceCallId ?? ordinal}::exec_command_end`),\n tool_call_id: matchedCall?.tool_call_id ?? null,\n source_call_id: sourceCallId,\n message_id: null,\n event_id: eventId,\n status: em.status ?? null,\n is_error: isError,\n exit_code: exitCode,\n duration_ms: durationMs(em.duration),\n stdout_object_id: stdoutId,\n stderr_object_id: stderrId,\n output_object_id: null,\n preview,\n raw_record_id: rawRecordId,\n });\n if (matchedCall) {\n matchedCall.status = isError ? 'error' : 'success';\n if (em.cwd && !matchedCall.cwd) matchedCall.cwd = em.cwd;\n }\n return;\n }\n\n if (subtype === 'patch_apply_end') {\n const eventId = makeEventId(sessionId, ordinal, 'patch_apply_end');\n pending.events.push({\n event_id: eventId,\n ordinal,\n turn_id: currentTurnId,\n source_event_id: null,\n event_type: 'patch',\n source_type: 'event_msg.patch_apply_end',\n subtype: null,\n timestamp: ts,\n actor: 'tool',\n payload_object_id: payloadObjectId,\n raw_record_id: rawRecordId,\n confidence: 'high',\n });\n if (em.changes && typeof em.changes === 'object') {\n for (const filePath of Object.keys(em.changes)) {\n pending.artifacts.push({\n artifact_id: artifactId(sessionId, 'codex', `${eventId}:${filePath}`),\n kind: 'diff',\n path: filePath,\n logical_path: filePath,\n object_id: null,\n text_object_id: null,\n mime_type: 'text/x-diff',\n size_bytes: 0,\n created_ts: ts,\n raw_record_id: rawRecordId,\n });\n }\n }\n return;\n }\n\n if (subtype === 'mcp_tool_call_end') {\n const sourceCallId = em.call_id ?? null;\n const eventId = makeEventId(sessionId, ordinal, 'mcp_tool_call_end');\n pending.events.push({\n event_id: eventId,\n ordinal,\n turn_id: currentTurnId,\n source_event_id: null,\n event_type: 'tool_result',\n source_type: 'event_msg.mcp_tool_call_end',\n subtype: 'mcp',\n timestamp: ts,\n actor: 'tool',\n payload_object_id: payloadObjectId,\n raw_record_id: rawRecordId,\n confidence: 'high',\n });\n const preview = stringifyOrNull(em.result)?.slice(0, PREVIEW_MAX) ?? null;\n const matchedCall = sourceCallId ? pending.toolCalls.get(sourceCallId) : undefined;\n pending.toolResults.push({\n tool_result_id: makeToolResultId(sessionId, `${sourceCallId ?? ordinal}::mcp_tool_call_end`),\n tool_call_id: matchedCall?.tool_call_id ?? null,\n source_call_id: sourceCallId,\n message_id: null,\n event_id: eventId,\n status: 'success',\n is_error: 0,\n exit_code: null,\n duration_ms: durationMs(em.duration),\n stdout_object_id: null,\n stderr_object_id: null,\n output_object_id: null,\n preview,\n raw_record_id: rawRecordId,\n });\n return;\n }\n\n if (subtype === 'context_compacted') {\n pending.events.push({\n event_id: makeEventId(sessionId, ordinal, 'compaction'),\n ordinal,\n turn_id: currentTurnId,\n source_event_id: null,\n event_type: 'compaction',\n source_type: 'event_msg.context_compacted',\n subtype: null,\n timestamp: ts,\n actor: 'system',\n payload_object_id: payloadObjectId,\n raw_record_id: rawRecordId,\n confidence: 'high',\n });\n return;\n }\n\n // user_message / agent_message / task_started / task_complete / turn_aborted /\n // token_count / others — keep as operational events.\n pending.events.push({\n event_id: makeEventId(sessionId, ordinal, `event_msg.${subtype}`),\n ordinal,\n turn_id: currentTurnId,\n source_event_id: null,\n event_type: 'system_operational',\n source_type: `event_msg.${subtype}`,\n subtype,\n timestamp: ts,\n actor: 'system',\n payload_object_id: payloadObjectId,\n raw_record_id: rawRecordId,\n confidence: 'high',\n });\n}\n\n// ---- helpers -------------------------------------------------------------\n\nfunction extractNativeId(env: CodexEnvelope): string | null {\n const p = env.payload as Record<string, unknown> | undefined;\n if (!p) return null;\n if (typeof p.id === 'string') return p.id;\n if (typeof p.call_id === 'string') return p.call_id;\n if (typeof p.turn_id === 'string') return p.turn_id;\n return null;\n}\n\nfunction mapMessageRole(role: unknown): PendingMessage['role'] {\n switch (role) {\n case 'user':\n return 'user';\n case 'assistant':\n return 'assistant';\n case 'tool':\n return 'tool';\n case 'developer':\n return 'developer';\n case 'system':\n // Codex 'system' content is real system instructions — map to system_prompt.\n return 'system_prompt';\n default:\n return 'operational';\n }\n}\n\nfunction canonicalToolType(toolName: string): string {\n const lower = toolName.toLowerCase();\n if (lower.startsWith('mcp__')) return 'mcp';\n if (\n lower === 'shell' ||\n lower === 'exec_command' ||\n lower === 'shell_command' ||\n lower === 'write_stdin' ||\n lower === 'unified_exec' ||\n lower === 'run_terminal_cmd'\n ) {\n return 'shell';\n }\n if (lower === 'read_file' || lower === 'readfile') return 'read_file';\n if (lower === 'write_file' || lower === 'writefile') return 'write_file';\n if (lower === 'apply_patch' || lower === 'applypatch' || lower === 'patch') return 'patch';\n if (lower === 'web_search' || lower === 'websearch' || lower === 'web_search_call') {\n return 'web_search';\n }\n if (lower === 'agent' || lower === 'subagent' || lower === 'collab_spawn') return 'subagent';\n return 'other';\n}\n\nfunction inferCommandFromArgs(toolName: string, args: unknown): string | null {\n if (!args || typeof args !== 'object') {\n if (typeof args === 'string') {\n try {\n const parsed = JSON.parse(args) as Record<string, unknown>;\n return inferCommandFromArgs(toolName, parsed);\n } catch {\n return null;\n }\n }\n return null;\n }\n const obj = args as Record<string, unknown>;\n if (typeof obj.command === 'string') return obj.command;\n if (Array.isArray(obj.command)) {\n return obj.command.map(String).join(' ');\n }\n return null;\n}\n\nfunction inferPathFromArgs(args: unknown): string | null {\n if (!args || typeof args !== 'object') {\n if (typeof args === 'string') {\n try {\n const parsed = JSON.parse(args) as Record<string, unknown>;\n return inferPathFromArgs(parsed);\n } catch {\n return null;\n }\n }\n return null;\n }\n const obj = args as Record<string, unknown>;\n if (typeof obj.file_path === 'string') return obj.file_path;\n if (typeof obj.path === 'string') return obj.path;\n if (typeof obj.absolute_path === 'string') return obj.absolute_path;\n return null;\n}\n\nfunction looksLikeError(text: string): boolean {\n return /\\b(error|exception|failed|stack trace)\\b/i.test(text);\n}\n\nfunction durationMs(d: CodexEventMsgPayload['duration']): number | null {\n if (!d || typeof d !== 'object') return null;\n const secs = typeof d.secs === 'number' ? d.secs : 0;\n const nanos = typeof d.nanos === 'number' ? d.nanos : 0;\n return secs * 1000 + Math.floor(nanos / 1e6);\n}\n\nfunction stringifyOrNull(value: unknown): string | null {\n if (value == null) return null;\n if (typeof value === 'string') return value;\n try {\n return JSON.stringify(value);\n } catch {\n return null;\n }\n}\n\nfunction parseSubagent(\n source: unknown,\n): { parent_thread_id: string; agent_role?: string; agent_nickname?: string } | null {\n if (!source || typeof source !== 'object') return null;\n const obj = source as Record<string, unknown>;\n const sub = obj.subagent;\n if (!sub || typeof sub !== 'object') return null;\n const ts = (sub as Record<string, unknown>).thread_spawn;\n if (!ts || typeof ts !== 'object') return null;\n const tso = ts as Record<string, unknown>;\n const parent = tso.parent_thread_id;\n if (typeof parent !== 'string') return null;\n return {\n parent_thread_id: parent,\n agent_role: typeof tso.agent_role === 'string' ? tso.agent_role : undefined,\n agent_nickname: typeof tso.agent_nickname === 'string' ? tso.agent_nickname : undefined,\n };\n}\n\nfunction buildSearchDocs(pending: PendingState): void {\n const sessionId = pending.session?.session_id ?? null;\n if (!sessionId) return;\n\n // Group blocks by message for indexing concatenated text.\n const blocksByMsg = new Map<string, PendingBlock[]>();\n for (const b of pending.blocks) {\n if (!b.message_id) continue;\n const list = blocksByMsg.get(b.message_id) ?? [];\n list.push(b);\n blocksByMsg.set(b.message_id, list);\n }\n\n for (const m of pending.messages) {\n const text = (blocksByMsg.get(m.message_id) ?? [])\n .filter(\n (b) =>\n b.text_inline &&\n (b.block_type === 'input_text' ||\n b.block_type === 'output_text' ||\n b.block_type === 'text'),\n )\n .map((b) => b.text_inline as string)\n .join('\\n');\n if (!text || text.length === 0) continue;\n pending.searchDocs.push({\n doc_id: `msg:${m.message_id}`,\n entity_type: 'message',\n entity_id: m.message_id,\n timestamp: m.timestamp,\n role: m.role,\n tool_name: null,\n canonical_tool_type: null,\n field_kind: m.role === 'user' ? 'user_prompt' : 'assistant_text',\n text,\n });\n }\n\n for (const c of pending.toolCallsList) {\n if (c.command) {\n pending.searchDocs.push({\n doc_id: `tc:cmd:${c.tool_call_id}`,\n entity_type: 'tool_call',\n entity_id: c.tool_call_id,\n timestamp: c.timestamp_start,\n role: null,\n tool_name: c.tool_name,\n canonical_tool_type: c.canonical_tool_type,\n field_kind: 'command',\n text: c.command,\n });\n }\n if (c.path) {\n pending.searchDocs.push({\n doc_id: `tc:path:${c.tool_call_id}`,\n entity_type: 'tool_call',\n entity_id: c.tool_call_id,\n timestamp: c.timestamp_start,\n role: null,\n tool_name: c.tool_name,\n canonical_tool_type: c.canonical_tool_type,\n field_kind: 'file_path',\n text: c.path,\n });\n }\n }\n\n for (const r of pending.toolResults) {\n if (r.preview) {\n pending.searchDocs.push({\n doc_id: `tr:preview:${r.tool_result_id}`,\n entity_type: 'tool_result',\n entity_id: r.tool_result_id,\n timestamp: null,\n role: null,\n tool_name: null,\n canonical_tool_type: null,\n field_kind: r.is_error ? 'error' : 'command_output_preview',\n text: r.preview,\n });\n }\n }\n}\n\nfunction flushPending(\n bundle: Bundle,\n pending: PendingState,\n meta: {\n sessionEndTs: string | null;\n modelFirst: string | null;\n modelLast: string | null;\n sourceTool: 'codex';\n },\n): void {\n if (!pending.session) return;\n\n // Order matters under SQLite's immediate FK checking: rows must be inserted\n // before any other row references them. raw_records → sessions →\n // turns/events → messages → blocks → tool_calls → tool_results.\n //\n // We also insert sessions with parent_session_id=NULL initially because the\n // parent session may live in a different file/batch. The cross-file linkage\n // happens in `linkParents` below, after every file is committed.\n\n const insertRaw = prepare(\n bundle.db,\n `INSERT OR IGNORE INTO raw_records (\n raw_record_id, source_file_id, source_tool, record_kind, ordinal,\n line_no, json_pointer, native_id, raw_object_id, decoded_json_object_id,\n parser_status, confidence, import_batch_id\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n );\n for (const r of pending.rawRecords) {\n insertRaw.run(\n r.raw_record_id,\n r.source_file_id,\n r.source_tool,\n r.record_kind,\n r.ordinal,\n r.line_no,\n r.json_pointer,\n r.native_id,\n r.raw_object_id,\n r.decoded_json_object_id,\n r.parser_status,\n r.confidence,\n r.import_batch_id,\n );\n }\n\n const insertSession = prepare(\n bundle.db,\n `INSERT OR REPLACE INTO sessions (\n session_id, source_tool, source_session_id, project_id, parent_session_id,\n is_subagent, agent_role, agent_nickname, title, summary,\n start_ts, end_ts, cwd_initial, git_branch_initial,\n model_first, model_last, status, timeline_confidence, raw_record_id\n ) VALUES (?, ?, ?, ?, NULL, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'high', ?)`,\n );\n insertSession.run(\n pending.session.session_id,\n meta.sourceTool,\n pending.session.source_session_id,\n null,\n pending.session.is_subagent,\n pending.session.agent_role,\n pending.session.agent_nickname,\n pending.session.title,\n null,\n pending.session.start_ts,\n meta.sessionEndTs,\n pending.session.cwd_initial,\n pending.session.git_branch_initial,\n meta.modelFirst,\n meta.modelLast,\n 'completed',\n pending.session.raw_record_id,\n );\n\n const insertTurn = prepare(\n bundle.db,\n `INSERT OR REPLACE INTO turns (\n turn_id, session_id, source_turn_id, ordinal, start_ts, end_ts,\n model, cwd, git_branch, approval_policy, sandbox_policy, effort, raw_record_id\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n );\n for (const t of pending.turns) {\n insertTurn.run(\n t.turn_id,\n pending.session.session_id,\n t.source_turn_id,\n t.ordinal,\n t.start_ts,\n null,\n t.model,\n t.cwd,\n null,\n t.approval_policy,\n t.sandbox_policy,\n t.effort,\n t.raw_record_id,\n );\n }\n\n const insertEvent = prepare(\n bundle.db,\n `INSERT OR REPLACE INTO events (\n event_id, session_id, turn_id, source_event_id, event_type, source_type,\n subtype, timestamp, ordinal, actor, payload_object_id, raw_record_id,\n confidence, is_derived\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0)`,\n );\n for (const e of pending.events) {\n insertEvent.run(\n e.event_id,\n pending.session.session_id,\n e.turn_id,\n e.source_event_id,\n e.event_type,\n e.source_type,\n e.subtype,\n e.timestamp,\n e.ordinal,\n e.actor,\n e.payload_object_id,\n e.raw_record_id,\n e.confidence,\n );\n }\n\n const insertMessage = prepare(\n bundle.db,\n `INSERT OR REPLACE INTO messages (\n message_id, session_id, turn_id, event_id, source_message_id, role,\n author_name, model, timestamp, ordinal, parent_message_id, request_id,\n status, raw_record_id\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n );\n for (const m of pending.messages) {\n insertMessage.run(\n m.message_id,\n pending.session.session_id,\n m.turn_id,\n m.event_id,\n m.source_message_id,\n m.role,\n null,\n m.model,\n m.timestamp,\n m.ordinal,\n null,\n null,\n null,\n m.raw_record_id,\n );\n }\n\n const insertBlock = prepare(\n bundle.db,\n `INSERT OR REPLACE INTO content_blocks (\n block_id, message_id, event_id, session_id, ordinal, block_type,\n text_object_id, text_inline, mime_type, token_count, is_error,\n is_redacted, visibility, raw_record_id\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'default', ?)`,\n );\n for (const b of pending.blocks) {\n insertBlock.run(\n b.block_id,\n b.message_id,\n b.event_id,\n pending.session.session_id,\n b.ordinal,\n b.block_type,\n b.text_object_id,\n b.text_inline,\n null,\n null,\n 0,\n 0,\n b.raw_record_id,\n );\n }\n\n const insertToolCall = prepare(\n bundle.db,\n `INSERT OR REPLACE INTO tool_calls (\n tool_call_id, session_id, turn_id, message_id, event_id,\n source_call_id, tool_name, canonical_tool_type, args_object_id,\n command, cwd, path, query, timestamp_start, timestamp_end, status,\n raw_record_id\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n );\n for (const c of pending.toolCallsList) {\n insertToolCall.run(\n c.tool_call_id,\n pending.session.session_id,\n c.turn_id,\n c.message_id,\n c.event_id,\n c.source_call_id,\n c.tool_name,\n c.canonical_tool_type,\n c.args_object_id,\n c.command,\n c.cwd,\n c.path,\n c.query,\n c.timestamp_start,\n null,\n c.status,\n c.raw_record_id,\n );\n }\n\n const insertToolResult = prepare(\n bundle.db,\n `INSERT OR REPLACE INTO tool_results (\n tool_result_id, tool_call_id, session_id, message_id, event_id,\n source_call_id, status, is_error, exit_code, duration_ms,\n stdout_object_id, stderr_object_id, output_object_id, preview, raw_record_id\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n );\n for (const r of pending.toolResults) {\n insertToolResult.run(\n r.tool_result_id,\n r.tool_call_id,\n pending.session.session_id,\n r.message_id,\n r.event_id,\n r.source_call_id,\n r.status,\n r.is_error,\n r.exit_code,\n r.duration_ms,\n r.stdout_object_id,\n r.stderr_object_id,\n r.output_object_id,\n r.preview,\n r.raw_record_id,\n );\n }\n\n const insertArtifact = prepare(\n bundle.db,\n `INSERT OR REPLACE INTO artifacts (\n artifact_id, session_id, project_id, source_tool, kind, path,\n logical_path, object_id, text_object_id, mime_type, size_bytes,\n created_ts, raw_record_id\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n );\n for (const a of pending.artifacts) {\n insertArtifact.run(\n a.artifact_id,\n pending.session.session_id,\n null,\n 'codex',\n a.kind,\n a.path,\n a.logical_path,\n a.object_id,\n a.text_object_id,\n a.mime_type,\n a.size_bytes,\n a.created_ts,\n a.raw_record_id,\n );\n }\n\n const insertEdge = prepare(\n bundle.db,\n `INSERT OR IGNORE INTO edges (\n src_type, src_id, dst_type, dst_id, edge_type, confidence, source,\n raw_record_id, metadata_object_id\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, NULL)`,\n );\n for (const e of pending.edges) {\n insertEdge.run(\n e.src_type,\n e.src_id,\n e.dst_type,\n e.dst_id,\n e.edge_type,\n e.confidence,\n e.source,\n e.raw_record_id,\n );\n }\n\n const insertSearch = prepare(\n bundle.db,\n `INSERT OR REPLACE INTO search_docs (\n doc_id, entity_type, entity_id, session_id, project_id, timestamp,\n role, tool_name, canonical_tool_type, field_kind, text\n ) VALUES (?, ?, ?, ?, NULL, ?, ?, ?, ?, ?, ?)`,\n );\n for (const d of pending.searchDocs) {\n insertSearch.run(\n d.doc_id,\n d.entity_type,\n d.entity_id,\n pending.session.session_id,\n d.timestamp,\n d.role,\n d.tool_name,\n d.canonical_tool_type,\n d.field_kind,\n d.text,\n );\n }\n}\n","import { readdir } from 'node:fs/promises';\nimport path from 'node:path';\n\n/**\n * Walk a Codex sessions root (default `~/.codex/sessions`) and yield every\n * `rollout-*.jsonl` file. The native layout is `YYYY/MM/DD/rollout-...jsonl`,\n * but we don't depend on that — anything ending in `.jsonl` under `root`\n * counts.\n */\nexport async function* discoverCodexSessions(root: string): AsyncGenerator<string, void, void> {\n yield* walk(root);\n}\n\nasync function* walk(dir: string): AsyncGenerator<string, void, void> {\n let entries: import('node:fs').Dirent[];\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n return;\n }\n\n for (const entry of entries) {\n const full = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n yield* walk(full);\n } else if (entry.isFile() && entry.name.endsWith('.jsonl')) {\n yield full;\n }\n }\n}\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport type { Bundle } from '../../core/bundle.js';\nimport { type ObjectId, putBytes, putJson, putText } from '../../core/cas/index.js';\nimport { prepare, transactional } from '../../core/db.js';\nimport {\n artifactId,\n blockId,\n eventId as makeEventId,\n messageId as makeMessageId,\n rawRecordId as makeRawRecordId,\n sessionId as makeSessionId,\n toolCallId as makeToolCallId,\n toolResultId as makeToolResultId,\n} from '../../core/domain/ids.js';\nimport {\n type ImportBatch,\n type ImportCounts,\n emptyCounts,\n finishBatch,\n recordError,\n startBatch,\n} from '../../core/ingest/batch.js';\nimport { registerSourceFile } from '../../core/ingest/idempotency.js';\nimport { type ClaudeFile, discoverClaudeFiles } from './discover.js';\nimport type { ClaudeContentBlock, ClaudeRecord, ClaudeSubagentMeta } from './types.js';\n\nexport interface CompileResult {\n batch: ImportBatch;\n counts: ImportCounts;\n}\n\nconst PREVIEW_MAX = 4_000;\n\nexport async function compileClaude(bundle: Bundle, root: string): Promise<CompileResult> {\n const batch = startBatch(bundle, 'claude', [root]);\n const counts = emptyCounts();\n\n try {\n for await (const file of discoverClaudeFiles(root)) {\n counts.source_files_seen++;\n try {\n const fc = await compileClaudeFile(bundle, batch, file);\n addCounts(counts, fc);\n } catch (error) {\n counts.errors++;\n await recordError(bundle, batch.batch_id, {\n kind: 'claude_file_failed',\n message: error instanceof Error ? error.message : String(error),\n payload: { path: file.filePath },\n });\n }\n }\n linkSubagentParents(bundle);\n finishBatch(bundle, batch, counts, 'completed');\n } catch (error) {\n finishBatch(bundle, batch, counts, 'failed');\n throw error;\n }\n\n return { batch, counts };\n}\n\nfunction linkSubagentParents(bundle: Bundle): void {\n bundle.db.exec(`\n UPDATE sessions\n SET parent_session_id = (\n SELECT e.src_id\n FROM edges e\n WHERE e.edge_type = 'spawned'\n AND e.dst_type = 'session'\n AND e.dst_id = sessions.session_id\n AND EXISTS (SELECT 1 FROM sessions p WHERE p.session_id = e.src_id)\n LIMIT 1\n )\n WHERE parent_session_id IS NULL\n AND is_subagent = 1\n AND source_tool = 'claude'\n `);\n}\n\ninterface FileCounts {\n source_files_imported: number;\n source_files_skipped: number;\n raw_records: number;\n sessions: number;\n turns: number;\n events: number;\n messages: number;\n content_blocks: number;\n tool_calls: number;\n tool_results: number;\n artifacts: number;\n edges: number;\n errors: number;\n}\n\nfunction emptyFileCounts(): FileCounts {\n return {\n source_files_imported: 0,\n source_files_skipped: 0,\n raw_records: 0,\n sessions: 0,\n turns: 0,\n events: 0,\n messages: 0,\n content_blocks: 0,\n tool_calls: 0,\n tool_results: 0,\n artifacts: 0,\n edges: 0,\n errors: 0,\n };\n}\n\nfunction addCounts(target: ImportCounts, source: FileCounts): void {\n target.source_files_imported += source.source_files_imported;\n target.source_files_skipped += source.source_files_skipped;\n target.raw_records += source.raw_records;\n target.sessions += source.sessions;\n target.turns += source.turns;\n target.events += source.events;\n target.messages += source.messages;\n target.content_blocks += source.content_blocks;\n target.tool_calls += source.tool_calls;\n target.tool_results += source.tool_results;\n target.artifacts += source.artifacts;\n target.edges += source.edges;\n target.errors += source.errors;\n}\n\n// -- per file --\n\ninterface PendingRawRecord {\n raw_record_id: string;\n source_file_id: string;\n ordinal: number;\n line_no: number;\n native_id: string | null;\n raw_object_id: ObjectId;\n decoded_json_object_id: ObjectId | null;\n parser_status: 'ok' | 'partial' | 'failed';\n confidence: 'high' | 'medium' | 'low';\n import_batch_id: string;\n}\n\ninterface PendingSession {\n session_id: string;\n source_session_id: string;\n is_subagent: 0 | 1;\n agent_role: string | null;\n agent_nickname: string | null;\n title: string | null;\n start_ts: string | null;\n end_ts: string | null;\n cwd_initial: string | null;\n git_branch_initial: string | null;\n raw_record_id: string | null;\n /** for subagent files; resolved cross-file in linkSubagentParents */\n parent_session_id_pending: string | null;\n}\n\ninterface PendingEvent {\n event_id: string;\n ordinal: number;\n source_event_id: string | null;\n event_type: string;\n source_type: string;\n subtype: string | null;\n timestamp: string | null;\n actor: string | null;\n payload_object_id: ObjectId | null;\n raw_record_id: string;\n confidence: 'high' | 'medium' | 'low';\n}\n\ninterface PendingMessage {\n message_id: string;\n event_id: string | null;\n source_message_id: string | null;\n role: 'system_prompt' | 'developer' | 'user' | 'assistant' | 'tool' | 'operational';\n model: string | null;\n timestamp: string | null;\n ordinal: number;\n parent_uuid: string | null; // for parent_of edge linking by uuid\n uuid: string | null;\n raw_record_id: string;\n}\n\ninterface PendingBlock {\n block_id: string;\n message_id: string | null;\n event_id: string | null;\n ordinal: number;\n block_type: string;\n text_object_id: ObjectId | null;\n text_inline: string | null;\n is_error: 0 | 1;\n visibility: 'default' | 'hidden_by_default' | 'audit_only';\n raw_record_id: string;\n}\n\ninterface PendingToolCall {\n tool_call_id: string;\n message_id: string | null;\n event_id: string | null;\n source_call_id: string;\n tool_name: string;\n canonical_tool_type: string;\n args_object_id: ObjectId | null;\n command: string | null;\n cwd: string | null;\n path: string | null;\n query: string | null;\n timestamp_start: string | null;\n status: string | null;\n raw_record_id: string;\n}\n\ninterface PendingToolResult {\n tool_result_id: string;\n tool_call_id: string | null;\n source_call_id: string | null;\n message_id: string | null;\n event_id: string | null;\n status: string | null;\n is_error: 0 | 1;\n exit_code: number | null;\n duration_ms: number | null;\n stdout_object_id: ObjectId | null;\n stderr_object_id: ObjectId | null;\n output_object_id: ObjectId | null;\n preview: string | null;\n raw_record_id: string;\n}\n\ninterface PendingArtifact {\n artifact_id: string;\n kind: string;\n path: string | null;\n logical_path: string | null;\n object_id: ObjectId | null;\n text_object_id: ObjectId | null;\n mime_type: string | null;\n size_bytes: number;\n created_ts: string | null;\n raw_record_id: string;\n}\n\ninterface PendingEdge {\n src_type: string;\n src_id: string;\n dst_type: string;\n dst_id: string;\n edge_type: string;\n confidence: 'high' | 'medium' | 'low';\n source: string;\n raw_record_id: string | null;\n}\n\ninterface PendingSearchDoc {\n doc_id: string;\n entity_type: string;\n entity_id: string;\n timestamp: string | null;\n role: string | null;\n tool_name: string | null;\n canonical_tool_type: string | null;\n field_kind: string;\n text: string;\n}\n\ninterface PendingState {\n rawRecords: PendingRawRecord[];\n session: PendingSession | null;\n events: PendingEvent[];\n messages: PendingMessage[];\n blocks: PendingBlock[];\n toolCalls: Map<string, PendingToolCall>;\n toolCallsList: PendingToolCall[];\n toolResults: PendingToolResult[];\n artifacts: PendingArtifact[];\n edges: PendingEdge[];\n searchDocs: PendingSearchDoc[];\n /** map uuid → message_id for parent_of edges resolved at flush time. */\n uuidToMessageId: Map<string, string>;\n}\n\nasync function compileClaudeFile(\n bundle: Bundle,\n batch: ImportBatch,\n file: ClaudeFile,\n): Promise<FileCounts> {\n const counts = emptyFileCounts();\n\n const { row: sourceFile, alreadyKnown } = await registerSourceFile(bundle, {\n sourceTool: 'claude',\n absolutePath: path.resolve(file.filePath),\n fileKind: 'jsonl',\n workspaceHint: file.projectSlug,\n });\n\n if (alreadyKnown) {\n counts.source_files_skipped = 1;\n return counts;\n }\n counts.source_files_imported = 1;\n\n const text = await readFile(file.filePath, 'utf8');\n const rawLines = text.split('\\n');\n const lines = rawLines[rawLines.length - 1] === '' ? rawLines.slice(0, -1) : rawLines;\n\n const meta = file.metaPath ? await readMeta(file.metaPath) : null;\n\n const pending: PendingState = {\n rawRecords: [],\n session: null,\n events: [],\n messages: [],\n blocks: [],\n toolCalls: new Map(),\n toolCallsList: [],\n toolResults: [],\n artifacts: [],\n edges: [],\n searchDocs: [],\n uuidToMessageId: new Map(),\n };\n\n let modelFirst: string | null = null;\n let modelLast: string | null = null;\n let messageOrdinal = 0;\n let sessionStartTs: string | null = null;\n let sessionEndTs: string | null = null;\n let cwdInitial: string | null = null;\n let branchInitial: string | null = null;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (!line || line.length === 0) continue;\n const lineNo = i + 1;\n const ordinal = i;\n\n const lineBytes = Buffer.from(line, 'utf8');\n const rawObjectId = await putBytes(bundle, lineBytes, {\n mimeType: 'application/jsonl-line',\n encoding: 'utf-8',\n });\n\n let parsed: ClaudeRecord | null = null;\n let parserStatus: 'ok' | 'partial' | 'failed' = 'ok';\n try {\n parsed = JSON.parse(line) as ClaudeRecord;\n } catch {\n parserStatus = 'failed';\n }\n\n const decodedObjectId =\n parsed != null && parserStatus === 'ok' ? await putJson(bundle, parsed) : null;\n\n const nativeId = parsed?.uuid ?? null;\n const rawRecordId = makeRawRecordId(sourceFile.source_file_id, ordinal, rawObjectId);\n\n pending.rawRecords.push({\n raw_record_id: rawRecordId,\n source_file_id: sourceFile.source_file_id,\n ordinal,\n line_no: lineNo,\n native_id: nativeId,\n raw_object_id: rawObjectId,\n decoded_json_object_id: decodedObjectId,\n parser_status: parserStatus,\n confidence: parserStatus === 'ok' ? 'high' : 'low',\n import_batch_id: batch.batch_id,\n });\n\n if (!parsed) continue;\n\n const ts = typeof parsed.timestamp === 'string' ? parsed.timestamp : null;\n if (ts) {\n if (!sessionStartTs || ts < sessionStartTs) sessionStartTs = ts;\n if (!sessionEndTs || ts > sessionEndTs) sessionEndTs = ts;\n }\n if (!cwdInitial && typeof parsed.cwd === 'string') cwdInitial = parsed.cwd;\n if (!branchInitial && typeof parsed.gitBranch === 'string') branchInitial = parsed.gitBranch;\n\n // Resolve session on first record that carries a sessionId.\n if (!pending.session && typeof parsed.sessionId === 'string') {\n pending.session = createSessionFromFirstRecord(file, parsed, meta, ts, rawRecordId);\n if (file.isSubagent && file.parentSessionId) {\n const parentSid = makeSessionId('claude', file.parentSessionId);\n pending.edges.push({\n src_type: 'session',\n src_id: parentSid,\n dst_type: 'session',\n dst_id: pending.session.session_id,\n edge_type: 'spawned',\n confidence: 'high',\n source: 'path_inferred',\n raw_record_id: rawRecordId,\n });\n pending.session.parent_session_id_pending = parentSid;\n }\n }\n\n const sessionId =\n pending.session?.session_id ??\n makeSessionId('claude', `unknown:${path.basename(file.filePath)}`);\n\n const type = typeof parsed.type === 'string' ? parsed.type : null;\n\n if (type === 'user' || type === 'assistant') {\n const msgRole: PendingMessage['role'] = type === 'user' ? 'user' : 'assistant';\n const role = inferRoleFromContent(parsed, msgRole);\n const msgOrdinal = messageOrdinal++;\n const messageId = makeMessageId(\n sessionId,\n msgOrdinal,\n parsed.message?.id ?? parsed.uuid ?? null,\n );\n const eventId = makeEventId(sessionId, ordinal, 'message');\n\n pending.events.push({\n event_id: eventId,\n ordinal,\n source_event_id: parsed.uuid ?? null,\n event_type: 'message',\n source_type: type,\n subtype: null,\n timestamp: ts,\n actor: msgRole,\n payload_object_id: decodedObjectId,\n raw_record_id: rawRecordId,\n confidence: 'high',\n });\n\n const model = parsed.message?.model ?? null;\n if (msgRole === 'assistant' && model) {\n if (!modelFirst) modelFirst = model;\n modelLast = model;\n }\n\n pending.messages.push({\n message_id: messageId,\n event_id: eventId,\n source_message_id: parsed.message?.id ?? null,\n role,\n model: msgRole === 'assistant' ? model : null,\n timestamp: ts,\n ordinal: msgOrdinal,\n parent_uuid: parsed.parentUuid ?? null,\n uuid: parsed.uuid ?? null,\n raw_record_id: rawRecordId,\n });\n if (parsed.uuid) pending.uuidToMessageId.set(parsed.uuid, messageId);\n\n const content = parsed.message?.content;\n if (typeof content === 'string') {\n pending.blocks.push({\n block_id: blockId(messageId, 0),\n message_id: messageId,\n event_id: null,\n ordinal: 0,\n block_type: 'text',\n text_object_id: null,\n text_inline: content.slice(0, PREVIEW_MAX),\n is_error: 0,\n visibility: 'default',\n raw_record_id: rawRecordId,\n });\n if (content.length > PREVIEW_MAX) {\n // Big text — also store full body in CAS for later retrieval.\n const fullId = await putText(bundle, content);\n const last = pending.blocks[pending.blocks.length - 1];\n if (last) last.text_object_id = fullId;\n }\n } else if (Array.isArray(content)) {\n for (let bi = 0; bi < content.length; bi++) {\n const block = content[bi] as ClaudeContentBlock | undefined;\n if (!block) continue;\n await processContentBlock(\n bundle,\n sessionId,\n messageId,\n eventId,\n bi,\n block,\n ts,\n rawRecordId,\n pending,\n );\n }\n }\n continue;\n }\n\n if (type === 'system') {\n // Critical: Claude's `type=system` is OPERATIONAL (hooks, turn duration,\n // local commands, api errors). It's not a system prompt.\n pending.events.push({\n event_id: makeEventId(sessionId, ordinal, 'system_operational'),\n ordinal,\n source_event_id: parsed.uuid ?? null,\n event_type: 'system_operational',\n source_type: 'system',\n subtype: parsed.subtype ?? null,\n timestamp: ts,\n actor: 'system',\n payload_object_id: decodedObjectId,\n raw_record_id: rawRecordId,\n confidence: 'high',\n });\n continue;\n }\n\n if (type === 'progress') {\n const progressType =\n typeof parsed.data?.type === 'string' ? (parsed.data.type as string) : null;\n pending.events.push({\n event_id: makeEventId(sessionId, ordinal, `progress.${progressType ?? 'unknown'}`),\n ordinal,\n source_event_id: parsed.uuid ?? null,\n event_type: 'progress',\n source_type: 'progress',\n subtype: progressType,\n timestamp: ts,\n actor: 'system',\n payload_object_id: decodedObjectId,\n raw_record_id: rawRecordId,\n confidence: 'high',\n });\n continue;\n }\n\n if (type === 'attachment') {\n pending.events.push({\n event_id: makeEventId(sessionId, ordinal, 'attachment'),\n ordinal,\n source_event_id: parsed.uuid ?? null,\n event_type: 'attachment',\n source_type: 'attachment',\n subtype: parsed.attachment?.type ?? null,\n timestamp: ts,\n actor: 'system',\n payload_object_id: decodedObjectId,\n raw_record_id: rawRecordId,\n confidence: 'high',\n });\n continue;\n }\n\n if (type === 'file-history-snapshot') {\n pending.events.push({\n event_id: makeEventId(sessionId, ordinal, 'file_history_snapshot'),\n ordinal,\n source_event_id: parsed.uuid ?? null,\n event_type: 'attachment',\n source_type: 'file-history-snapshot',\n subtype: parsed.isSnapshotUpdate ? 'update' : 'snapshot',\n timestamp: ts,\n actor: 'system',\n payload_object_id: decodedObjectId,\n raw_record_id: rawRecordId,\n confidence: 'high',\n });\n pending.artifacts.push({\n artifact_id: artifactId(\n sessionId,\n 'claude',\n `snapshot:${parsed.snapshot?.messageId ?? ordinal}`,\n ),\n kind: 'snapshot',\n path: null,\n logical_path: null,\n object_id: null,\n text_object_id: null,\n mime_type: 'application/json',\n size_bytes: line.length,\n created_ts: ts,\n raw_record_id: rawRecordId,\n });\n continue;\n }\n\n // permission-mode, last-prompt, queue-operation, agent-name, custom-title,\n // pr-link, etc. — keep as operational events.\n pending.events.push({\n event_id: makeEventId(sessionId, ordinal, `claude.${type ?? 'unknown'}`),\n ordinal,\n source_event_id: parsed.uuid ?? null,\n event_type: 'system_operational',\n source_type: type ?? 'unknown',\n subtype: null,\n timestamp: ts,\n actor: 'system',\n payload_object_id: decodedObjectId,\n raw_record_id: rawRecordId,\n confidence: 'high',\n });\n }\n\n // Resolve parent_of edges by uuid.\n for (const m of pending.messages) {\n if (m.parent_uuid && pending.uuidToMessageId.has(m.parent_uuid)) {\n const parentId = pending.uuidToMessageId.get(m.parent_uuid)!;\n pending.edges.push({\n src_type: 'message',\n src_id: parentId,\n dst_type: 'message',\n dst_id: m.message_id,\n edge_type: 'parent_of',\n confidence: 'high',\n source: 'explicit',\n raw_record_id: m.raw_record_id,\n });\n }\n }\n\n if (pending.session) {\n pending.session.start_ts ??= sessionStartTs;\n pending.session.end_ts ??= sessionEndTs;\n pending.session.cwd_initial ??= cwdInitial;\n pending.session.git_branch_initial ??= branchInitial;\n }\n\n buildSearchDocs(pending);\n\n transactional(bundle.db, () => {\n flushPending(bundle, pending, { modelFirst, modelLast });\n });\n\n counts.raw_records = pending.rawRecords.length;\n counts.sessions = pending.session ? 1 : 0;\n counts.events = pending.events.length;\n counts.messages = pending.messages.length;\n counts.content_blocks = pending.blocks.length;\n counts.tool_calls = pending.toolCallsList.length;\n counts.tool_results = pending.toolResults.length;\n counts.artifacts = pending.artifacts.length;\n counts.edges = pending.edges.length;\n\n return counts;\n}\n\nfunction createSessionFromFirstRecord(\n file: ClaudeFile,\n parsed: ClaudeRecord,\n meta: ClaudeSubagentMeta | null,\n ts: string | null,\n rawRecordId: string,\n): PendingSession {\n const sourceSid = parsed.sessionId as string;\n // Subagent and main share the same `sessionId` field. Differentiate by\n // appending the agentId for subagents to keep PKs stable.\n const composite = file.isSubagent && file.agentId ? `${sourceSid}:${file.agentId}` : sourceSid;\n return {\n session_id: makeSessionId('claude', composite),\n source_session_id: composite,\n is_subagent: file.isSubagent ? 1 : 0,\n agent_role: meta?.agentType ?? null,\n agent_nickname: parsed.agentName ?? null,\n title: meta?.description ?? null,\n start_ts: ts,\n end_ts: null,\n cwd_initial: parsed.cwd ?? null,\n git_branch_initial: parsed.gitBranch ?? null,\n raw_record_id: rawRecordId,\n parent_session_id_pending: null,\n };\n}\n\nasync function readMeta(metaPath: string): Promise<ClaudeSubagentMeta | null> {\n try {\n const text = await readFile(metaPath, 'utf8');\n return JSON.parse(text) as ClaudeSubagentMeta;\n } catch {\n return null;\n }\n}\n\nfunction inferRoleFromContent(\n parsed: ClaudeRecord,\n fallback: 'user' | 'assistant',\n): PendingMessage['role'] {\n // A user-typed message that contains only tool_result blocks is the agent\n // delivering tool output back to itself. Mark as 'tool' role for clarity in\n // search/filters; mixed messages stay as 'user'.\n if (fallback !== 'user') return 'assistant';\n const c = parsed.message?.content;\n if (!Array.isArray(c) || c.length === 0) return 'user';\n const allToolResult = c.every(\n (b) => b && typeof b === 'object' && (b as { type?: string }).type === 'tool_result',\n );\n return allToolResult ? 'tool' : 'user';\n}\n\nasync function processContentBlock(\n bundle: Bundle,\n sessionId: string,\n messageId: string,\n eventId: string,\n blockOrdinal: number,\n block: ClaudeContentBlock,\n ts: string | null,\n rawRecordId: string,\n pending: PendingState,\n): Promise<void> {\n const blkId = blockId(messageId, blockOrdinal);\n\n if (block.type === 'text') {\n const text = (block as { text?: string }).text ?? '';\n pending.blocks.push({\n block_id: blkId,\n message_id: messageId,\n event_id: null,\n ordinal: blockOrdinal,\n block_type: 'text',\n text_object_id: text.length > PREVIEW_MAX ? await putText(bundle, text) : null,\n text_inline: text.slice(0, PREVIEW_MAX),\n is_error: 0,\n visibility: 'default',\n raw_record_id: rawRecordId,\n });\n return;\n }\n\n if (block.type === 'thinking') {\n const text = (block as { thinking?: string }).thinking ?? '';\n pending.blocks.push({\n block_id: blkId,\n message_id: messageId,\n event_id: null,\n ordinal: blockOrdinal,\n block_type: 'thinking',\n text_object_id: text.length > PREVIEW_MAX ? await putText(bundle, text) : null,\n text_inline: text.slice(0, PREVIEW_MAX),\n is_error: 0,\n visibility: 'hidden_by_default',\n raw_record_id: rawRecordId,\n });\n return;\n }\n\n if (block.type === 'tool_use') {\n const tu = block as { id?: string; name?: string; input?: unknown };\n const sourceCallId = tu.id ?? `${blockOrdinal}`;\n const toolName = tu.name ?? 'unknown';\n const argsId = tu.input != null ? await putJson(bundle, tu.input) : null;\n const command = inferCommandFromArgs(toolName, tu.input);\n const filePath = inferPathFromArgs(tu.input);\n const tcId = makeToolCallId(sessionId, sourceCallId);\n\n pending.blocks.push({\n block_id: blkId,\n message_id: messageId,\n event_id: null,\n ordinal: blockOrdinal,\n block_type: 'tool_use',\n text_object_id: null,\n text_inline: null,\n is_error: 0,\n visibility: 'default',\n raw_record_id: rawRecordId,\n });\n\n const call: PendingToolCall = {\n tool_call_id: tcId,\n message_id: messageId,\n event_id: eventId,\n source_call_id: sourceCallId,\n tool_name: toolName,\n canonical_tool_type: canonicalToolType(toolName),\n args_object_id: argsId,\n command,\n cwd: null,\n path: filePath,\n query: null,\n timestamp_start: ts,\n status: 'started',\n raw_record_id: rawRecordId,\n };\n pending.toolCalls.set(sourceCallId, call);\n pending.toolCallsList.push(call);\n return;\n }\n\n if (block.type === 'tool_result') {\n const tr = block as { tool_use_id?: string; content?: unknown; is_error?: boolean };\n const sourceCallId = tr.tool_use_id ?? null;\n const isError = tr.is_error === true ? 1 : 0;\n const text = stringifyOrNull(tr.content) ?? '';\n pending.blocks.push({\n block_id: blkId,\n message_id: messageId,\n event_id: null,\n ordinal: blockOrdinal,\n block_type: 'tool_result',\n text_object_id: text.length > PREVIEW_MAX ? await putText(bundle, text) : null,\n text_inline: text.slice(0, PREVIEW_MAX),\n is_error: isError,\n visibility: 'default',\n raw_record_id: rawRecordId,\n });\n\n const matched = sourceCallId ? pending.toolCalls.get(sourceCallId) : undefined;\n pending.toolResults.push({\n tool_result_id: makeToolResultId(sessionId, sourceCallId ?? `${messageId}:${blockOrdinal}`),\n tool_call_id: matched?.tool_call_id ?? null,\n source_call_id: sourceCallId,\n message_id: messageId,\n event_id: eventId,\n status: matched ? (isError ? 'error' : 'success') : null,\n is_error: isError,\n exit_code: null,\n duration_ms: null,\n stdout_object_id: null,\n stderr_object_id: null,\n output_object_id: text.length > PREVIEW_MAX ? await putText(bundle, text) : null,\n preview: text.slice(0, PREVIEW_MAX),\n raw_record_id: rawRecordId,\n });\n if (matched) {\n matched.status = isError ? 'error' : 'success';\n }\n return;\n }\n\n if (block.type === 'image') {\n pending.blocks.push({\n block_id: blkId,\n message_id: messageId,\n event_id: null,\n ordinal: blockOrdinal,\n block_type: 'image',\n text_object_id: null,\n text_inline: null,\n is_error: 0,\n visibility: 'default',\n raw_record_id: rawRecordId,\n });\n return;\n }\n\n // Unknown block type — keep it as raw inline JSON for visibility.\n pending.blocks.push({\n block_id: blkId,\n message_id: messageId,\n event_id: null,\n ordinal: blockOrdinal,\n block_type: (block as { type?: string }).type ?? 'unknown',\n text_object_id: null,\n text_inline: stringifyOrNull(block)?.slice(0, PREVIEW_MAX) ?? null,\n is_error: 0,\n visibility: 'audit_only',\n raw_record_id: rawRecordId,\n });\n}\n\nfunction canonicalToolType(toolName: string): string {\n const lower = toolName.toLowerCase();\n if (lower.startsWith('mcp__')) return 'mcp';\n if (lower === 'bash' || lower === 'shell' || lower === 'run_terminal_cmd') return 'shell';\n if (lower === 'read' || lower === 'readfile' || lower === 'read_file') return 'read_file';\n if (lower === 'write' || lower === 'writefile' || lower === 'write_file') return 'write_file';\n if (\n lower === 'edit' ||\n lower === 'strreplace' ||\n lower === 'str_replace' ||\n lower === 'replace' ||\n lower === 'search_replace'\n ) {\n return 'edit_file';\n }\n if (lower === 'grep' || lower === 'glob' || lower === 'glob_file_search') return 'search_file';\n if (lower === 'websearch' || lower === 'google_web_search') return 'web_search';\n if (lower === 'webfetch') return 'other';\n if (lower === 'agent') return 'subagent';\n if (lower === 'applypatch' || lower === 'apply_patch') return 'patch';\n return 'other';\n}\n\nfunction inferCommandFromArgs(toolName: string, args: unknown): string | null {\n if (!args || typeof args !== 'object') return null;\n const obj = args as Record<string, unknown>;\n if (typeof obj.command === 'string') return obj.command;\n if (toolName.toLowerCase() === 'bash' && typeof obj.cmd === 'string') return obj.cmd;\n return null;\n}\n\nfunction inferPathFromArgs(args: unknown): string | null {\n if (!args || typeof args !== 'object') return null;\n const obj = args as Record<string, unknown>;\n if (typeof obj.file_path === 'string') return obj.file_path;\n if (typeof obj.path === 'string') return obj.path;\n if (typeof obj.absolute_path === 'string') return obj.absolute_path;\n return null;\n}\n\nfunction stringifyOrNull(value: unknown): string | null {\n if (value == null) return null;\n if (typeof value === 'string') return value;\n try {\n return JSON.stringify(value);\n } catch {\n return null;\n }\n}\n\nfunction buildSearchDocs(pending: PendingState): void {\n const sessionId = pending.session?.session_id ?? null;\n if (!sessionId) return;\n\n const blocksByMsg = new Map<string, PendingBlock[]>();\n for (const b of pending.blocks) {\n if (!b.message_id) continue;\n if (!b.text_inline) continue;\n if (b.block_type !== 'text' && b.block_type !== 'thinking' && b.block_type !== 'tool_result')\n continue;\n const list = blocksByMsg.get(b.message_id) ?? [];\n list.push(b);\n blocksByMsg.set(b.message_id, list);\n }\n\n for (const m of pending.messages) {\n const blks = blocksByMsg.get(m.message_id) ?? [];\n const text = blks\n .filter((b) => b.block_type !== 'thinking') // hide reasoning from default search\n .map((b) => b.text_inline ?? '')\n .join('\\n')\n .trim();\n if (!text) continue;\n pending.searchDocs.push({\n doc_id: `msg:${m.message_id}`,\n entity_type: 'message',\n entity_id: m.message_id,\n timestamp: m.timestamp,\n role: m.role,\n tool_name: null,\n canonical_tool_type: null,\n field_kind:\n m.role === 'user' ? 'user_prompt' : m.role === 'tool' ? 'tool_result' : 'assistant_text',\n text,\n });\n }\n\n for (const c of pending.toolCallsList) {\n if (c.command) {\n pending.searchDocs.push({\n doc_id: `tc:cmd:${c.tool_call_id}`,\n entity_type: 'tool_call',\n entity_id: c.tool_call_id,\n timestamp: c.timestamp_start,\n role: null,\n tool_name: c.tool_name,\n canonical_tool_type: c.canonical_tool_type,\n field_kind: 'command',\n text: c.command,\n });\n }\n if (c.path) {\n pending.searchDocs.push({\n doc_id: `tc:path:${c.tool_call_id}`,\n entity_type: 'tool_call',\n entity_id: c.tool_call_id,\n timestamp: c.timestamp_start,\n role: null,\n tool_name: c.tool_name,\n canonical_tool_type: c.canonical_tool_type,\n field_kind: 'file_path',\n text: c.path,\n });\n }\n }\n\n for (const r of pending.toolResults) {\n if (!r.preview) continue;\n pending.searchDocs.push({\n doc_id: `tr:preview:${r.tool_result_id}`,\n entity_type: 'tool_result',\n entity_id: r.tool_result_id,\n timestamp: null,\n role: null,\n tool_name: null,\n canonical_tool_type: null,\n field_kind: r.is_error ? 'error' : 'tool_result',\n text: r.preview,\n });\n }\n}\n\nfunction flushPending(\n bundle: Bundle,\n pending: PendingState,\n meta: { modelFirst: string | null; modelLast: string | null },\n): void {\n if (!pending.session) return;\n\n const insertRaw = prepare(\n bundle.db,\n `INSERT OR IGNORE INTO raw_records (\n raw_record_id, source_file_id, source_tool, record_kind, ordinal,\n line_no, json_pointer, native_id, raw_object_id, decoded_json_object_id,\n parser_status, confidence, import_batch_id\n ) VALUES (?, ?, 'claude', 'jsonl_line', ?, ?, NULL, ?, ?, ?, ?, ?, ?)`,\n );\n for (const r of pending.rawRecords) {\n insertRaw.run(\n r.raw_record_id,\n r.source_file_id,\n r.ordinal,\n r.line_no,\n r.native_id,\n r.raw_object_id,\n r.decoded_json_object_id,\n r.parser_status,\n r.confidence,\n r.import_batch_id,\n );\n }\n\n prepare(\n bundle.db,\n `INSERT OR REPLACE INTO sessions (\n session_id, source_tool, source_session_id, project_id, parent_session_id,\n is_subagent, agent_role, agent_nickname, title, summary,\n start_ts, end_ts, cwd_initial, git_branch_initial,\n model_first, model_last, status, timeline_confidence, raw_record_id\n ) VALUES (?, 'claude', ?, NULL, NULL, ?, ?, ?, ?, NULL, ?, ?, ?, ?, ?, ?, 'completed', 'high', ?)`,\n ).run(\n pending.session.session_id,\n pending.session.source_session_id,\n pending.session.is_subagent,\n pending.session.agent_role,\n pending.session.agent_nickname,\n pending.session.title,\n pending.session.start_ts,\n pending.session.end_ts,\n pending.session.cwd_initial,\n pending.session.git_branch_initial,\n meta.modelFirst,\n meta.modelLast,\n pending.session.raw_record_id,\n );\n\n const insertEvent = prepare(\n bundle.db,\n `INSERT OR REPLACE INTO events (\n event_id, session_id, turn_id, source_event_id, event_type, source_type,\n subtype, timestamp, ordinal, actor, payload_object_id, raw_record_id,\n confidence, is_derived\n ) VALUES (?, ?, NULL, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0)`,\n );\n for (const e of pending.events) {\n insertEvent.run(\n e.event_id,\n pending.session.session_id,\n e.source_event_id,\n e.event_type,\n e.source_type,\n e.subtype,\n e.timestamp,\n e.ordinal,\n e.actor,\n e.payload_object_id,\n e.raw_record_id,\n e.confidence,\n );\n }\n\n const insertMessage = prepare(\n bundle.db,\n `INSERT OR REPLACE INTO messages (\n message_id, session_id, turn_id, event_id, source_message_id, role,\n author_name, model, timestamp, ordinal, parent_message_id, request_id,\n status, raw_record_id\n ) VALUES (?, ?, NULL, ?, ?, ?, NULL, ?, ?, ?, NULL, NULL, NULL, ?)`,\n );\n for (const m of pending.messages) {\n insertMessage.run(\n m.message_id,\n pending.session.session_id,\n m.event_id,\n m.source_message_id,\n m.role,\n m.model,\n m.timestamp,\n m.ordinal,\n m.raw_record_id,\n );\n }\n\n const insertBlock = prepare(\n bundle.db,\n `INSERT OR REPLACE INTO content_blocks (\n block_id, message_id, event_id, session_id, ordinal, block_type,\n text_object_id, text_inline, mime_type, token_count, is_error,\n is_redacted, visibility, raw_record_id\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, NULL, NULL, ?, 0, ?, ?)`,\n );\n for (const b of pending.blocks) {\n insertBlock.run(\n b.block_id,\n b.message_id,\n b.event_id,\n pending.session.session_id,\n b.ordinal,\n b.block_type,\n b.text_object_id,\n b.text_inline,\n b.is_error,\n b.visibility,\n b.raw_record_id,\n );\n }\n\n const insertToolCall = prepare(\n bundle.db,\n `INSERT OR REPLACE INTO tool_calls (\n tool_call_id, session_id, turn_id, message_id, event_id,\n source_call_id, tool_name, canonical_tool_type, args_object_id,\n command, cwd, path, query, timestamp_start, timestamp_end, status,\n raw_record_id\n ) VALUES (?, ?, NULL, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, NULL, ?, ?)`,\n );\n for (const c of pending.toolCallsList) {\n insertToolCall.run(\n c.tool_call_id,\n pending.session.session_id,\n c.message_id,\n c.event_id,\n c.source_call_id,\n c.tool_name,\n c.canonical_tool_type,\n c.args_object_id,\n c.command,\n c.cwd,\n c.path,\n c.query,\n c.timestamp_start,\n c.status,\n c.raw_record_id,\n );\n }\n\n const insertToolResult = prepare(\n bundle.db,\n `INSERT OR REPLACE INTO tool_results (\n tool_result_id, tool_call_id, session_id, message_id, event_id,\n source_call_id, status, is_error, exit_code, duration_ms,\n stdout_object_id, stderr_object_id, output_object_id, preview, raw_record_id\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n );\n for (const r of pending.toolResults) {\n insertToolResult.run(\n r.tool_result_id,\n r.tool_call_id,\n pending.session.session_id,\n r.message_id,\n r.event_id,\n r.source_call_id,\n r.status,\n r.is_error,\n r.exit_code,\n r.duration_ms,\n r.stdout_object_id,\n r.stderr_object_id,\n r.output_object_id,\n r.preview,\n r.raw_record_id,\n );\n }\n\n const insertArtifact = prepare(\n bundle.db,\n `INSERT OR REPLACE INTO artifacts (\n artifact_id, session_id, project_id, source_tool, kind, path,\n logical_path, object_id, text_object_id, mime_type, size_bytes,\n created_ts, raw_record_id\n ) VALUES (?, ?, NULL, 'claude', ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n );\n for (const a of pending.artifacts) {\n insertArtifact.run(\n a.artifact_id,\n pending.session.session_id,\n a.kind,\n a.path,\n a.logical_path,\n a.object_id,\n a.text_object_id,\n a.mime_type,\n a.size_bytes,\n a.created_ts,\n a.raw_record_id,\n );\n }\n\n const insertEdge = prepare(\n bundle.db,\n `INSERT OR IGNORE INTO edges (\n src_type, src_id, dst_type, dst_id, edge_type, confidence, source,\n raw_record_id, metadata_object_id\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, NULL)`,\n );\n for (const e of pending.edges) {\n insertEdge.run(\n e.src_type,\n e.src_id,\n e.dst_type,\n e.dst_id,\n e.edge_type,\n e.confidence,\n e.source,\n e.raw_record_id,\n );\n }\n\n const insertSearch = prepare(\n bundle.db,\n `INSERT OR REPLACE INTO search_docs (\n doc_id, entity_type, entity_id, session_id, project_id, timestamp,\n role, tool_name, canonical_tool_type, field_kind, text\n ) VALUES (?, ?, ?, ?, NULL, ?, ?, ?, ?, ?, ?)`,\n );\n for (const d of pending.searchDocs) {\n insertSearch.run(\n d.doc_id,\n d.entity_type,\n d.entity_id,\n pending.session.session_id,\n d.timestamp,\n d.role,\n d.tool_name,\n d.canonical_tool_type,\n d.field_kind,\n d.text,\n );\n }\n}\n","import { readdir } from 'node:fs/promises';\nimport path from 'node:path';\n\nexport interface ClaudeFile {\n /** Absolute path to a JSONL session file. */\n filePath: string;\n /** Project slug (the dashed directory name under projects/). */\n projectSlug: string;\n /** Whether the file is a subagent rollout under `<session>/subagents/`. */\n isSubagent: boolean;\n /**\n * For main files: the session-id derived from the filename.\n * For subagent files: the session-id from the parent directory; the subagent\n * has the same `sessionId` field internally but a distinct `agentId`.\n */\n parentSessionId: string | null;\n /** For subagent files only: agent id parsed from `agent-<id>.jsonl`. */\n agentId: string | null;\n /** Path to the companion `.meta.json`, if any (subagents only). */\n metaPath: string | null;\n}\n\n/**\n * Walk `<root>` (typically `~/.claude/projects`) and yield every JSONL file\n * under it, classified as main session or subagent. We deliberately ignore\n * `sessions-index.json` (per the recovery report it's incomplete) and skip\n * `tool-results/` and `memory/` for the MVP.\n */\nexport async function* discoverClaudeFiles(root: string): AsyncGenerator<ClaudeFile, void, void> {\n const projectDirs = await readdirSafe(root);\n for (const project of projectDirs) {\n if (!project.isDirectory()) continue;\n const projectRoot = path.join(root, project.name);\n yield* walkProject(projectRoot, project.name);\n }\n}\n\nasync function* walkProject(\n projectRoot: string,\n projectSlug: string,\n): AsyncGenerator<ClaudeFile, void, void> {\n const entries = await readdirSafe(projectRoot);\n for (const entry of entries) {\n if (entry.isFile() && entry.name.endsWith('.jsonl')) {\n yield {\n filePath: path.join(projectRoot, entry.name),\n projectSlug,\n isSubagent: false,\n parentSessionId: null,\n agentId: null,\n metaPath: null,\n };\n continue;\n }\n if (entry.isDirectory()) {\n // Could be a session-id dir with subagents/ inside; or memory/; or other.\n const subagentsDir = path.join(projectRoot, entry.name, 'subagents');\n const subagentEntries = await readdirSafe(subagentsDir);\n for (const sub of subagentEntries) {\n if (!sub.isFile() || !sub.name.endsWith('.jsonl')) continue;\n if (!sub.name.startsWith('agent-')) continue;\n const agentId = sub.name.slice('agent-'.length, -'.jsonl'.length);\n const metaCandidate = path.join(subagentsDir, `agent-${agentId}.meta.json`);\n const metaExists = subagentEntries.some(\n (e) => e.isFile() && e.name === `agent-${agentId}.meta.json`,\n );\n yield {\n filePath: path.join(subagentsDir, sub.name),\n projectSlug,\n isSubagent: true,\n parentSessionId: entry.name,\n agentId,\n metaPath: metaExists ? metaCandidate : null,\n };\n }\n }\n }\n}\n\nasync function readdirSafe(dir: string): Promise<import('node:fs').Dirent[]> {\n try {\n return await readdir(dir, { withFileTypes: true });\n } catch {\n return [];\n }\n}\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport type { Bundle } from '../../core/bundle.js';\nimport { sha256Hex } from '../../core/cas/hash.js';\nimport { type ObjectId, putBytes, putJson, putText } from '../../core/cas/index.js';\nimport { prepare, transactional } from '../../core/db.js';\nimport {\n artifactId,\n blockId,\n eventId as makeEventId,\n messageId as makeMessageId,\n projectId as makeProjectId,\n rawRecordId as makeRawRecordId,\n sessionId as makeSessionId,\n toolCallId as makeToolCallId,\n toolResultId as makeToolResultId,\n} from '../../core/domain/ids.js';\nimport {\n type ImportBatch,\n type ImportCounts,\n emptyCounts,\n finishBatch,\n recordError,\n startBatch,\n} from '../../core/ingest/batch.js';\nimport { registerSourceFile } from '../../core/ingest/idempotency.js';\nimport { type GeminiChatFile, discoverGeminiChats } from './discover.js';\nimport type {\n GeminiContentItem,\n GeminiMessage,\n GeminiSessionFile,\n GeminiToolCall,\n GeminiToolResult,\n} from './types.js';\n\nexport interface CompileResult {\n batch: ImportBatch;\n counts: ImportCounts;\n}\n\nconst PREVIEW_MAX = 4_000;\n\nexport async function compileGemini(bundle: Bundle, root: string): Promise<CompileResult> {\n const batch = startBatch(bundle, 'gemini', [root]);\n const counts = emptyCounts();\n try {\n for await (const file of discoverGeminiChats(root)) {\n counts.source_files_seen++;\n try {\n const fc = await compileGeminiFile(bundle, batch, file);\n addCounts(counts, fc);\n } catch (error) {\n counts.errors++;\n await recordError(bundle, batch.batch_id, {\n kind: 'gemini_file_failed',\n message: error instanceof Error ? error.message : String(error),\n payload: { path: file.filePath },\n });\n }\n }\n finishBatch(bundle, batch, counts, 'completed');\n } catch (error) {\n finishBatch(bundle, batch, counts, 'failed');\n throw error;\n }\n return { batch, counts };\n}\n\ninterface FileCounts {\n source_files_imported: number;\n source_files_skipped: number;\n raw_records: number;\n sessions: number;\n events: number;\n messages: number;\n content_blocks: number;\n tool_calls: number;\n tool_results: number;\n artifacts: number;\n edges: number;\n errors: number;\n}\n\nfunction emptyFileCounts(): FileCounts {\n return {\n source_files_imported: 0,\n source_files_skipped: 0,\n raw_records: 0,\n sessions: 0,\n events: 0,\n messages: 0,\n content_blocks: 0,\n tool_calls: 0,\n tool_results: 0,\n artifacts: 0,\n edges: 0,\n errors: 0,\n };\n}\n\nfunction addCounts(target: ImportCounts, source: FileCounts): void {\n target.source_files_imported += source.source_files_imported;\n target.source_files_skipped += source.source_files_skipped;\n target.raw_records += source.raw_records;\n target.sessions += source.sessions;\n target.events += source.events;\n target.messages += source.messages;\n target.content_blocks += source.content_blocks;\n target.tool_calls += source.tool_calls;\n target.tool_results += source.tool_results;\n target.artifacts += source.artifacts;\n target.edges += source.edges;\n target.errors += source.errors;\n}\n\ninterface PendingState {\n rawRecords: PendingRawRecord[];\n session: PendingSession | null;\n events: PendingEvent[];\n messages: PendingMessage[];\n blocks: PendingBlock[];\n toolCallsList: PendingToolCall[];\n toolResults: PendingToolResult[];\n artifacts: PendingArtifact[];\n searchDocs: PendingSearchDoc[];\n project: PendingProject | null;\n}\n\ninterface PendingRawRecord {\n raw_record_id: string;\n source_file_id: string;\n ordinal: number | null;\n line_no: number | null;\n json_pointer: string | null;\n native_id: string | null;\n raw_object_id: ObjectId;\n decoded_json_object_id: ObjectId | null;\n parser_status: 'ok' | 'partial' | 'failed';\n confidence: 'high' | 'medium' | 'low';\n import_batch_id: string;\n record_kind: 'json_pointer' | 'jsonl_line';\n}\n\ninterface PendingSession {\n session_id: string;\n source_session_id: string;\n start_ts: string | null;\n end_ts: string | null;\n cwd_initial: string | null;\n title: string | null;\n raw_record_id: string | null;\n}\n\ninterface PendingProject {\n project_id: string;\n canonical_path: string | null;\n source_project_id: string;\n}\n\ninterface PendingEvent {\n event_id: string;\n ordinal: number;\n source_event_id: string | null;\n event_type: string;\n source_type: string;\n subtype: string | null;\n timestamp: string | null;\n actor: string | null;\n payload_object_id: ObjectId | null;\n raw_record_id: string;\n confidence: 'high' | 'medium' | 'low';\n}\n\ninterface PendingMessage {\n message_id: string;\n event_id: string | null;\n source_message_id: string | null;\n role: 'system_prompt' | 'developer' | 'user' | 'assistant' | 'tool' | 'operational';\n model: string | null;\n timestamp: string | null;\n ordinal: number;\n raw_record_id: string;\n}\n\ninterface PendingBlock {\n block_id: string;\n message_id: string | null;\n event_id: string | null;\n ordinal: number;\n block_type: string;\n text_object_id: ObjectId | null;\n text_inline: string | null;\n visibility: 'default' | 'hidden_by_default' | 'audit_only';\n raw_record_id: string;\n}\n\ninterface PendingToolCall {\n tool_call_id: string;\n message_id: string | null;\n event_id: string | null;\n source_call_id: string;\n tool_name: string;\n canonical_tool_type: string;\n args_object_id: ObjectId | null;\n command: string | null;\n cwd: string | null;\n path: string | null;\n query: string | null;\n timestamp_start: string | null;\n status: string | null;\n raw_record_id: string;\n}\n\ninterface PendingToolResult {\n tool_result_id: string;\n tool_call_id: string;\n source_call_id: string;\n message_id: string | null;\n event_id: string | null;\n status: string | null;\n is_error: 0 | 1;\n output_object_id: ObjectId | null;\n preview: string | null;\n raw_record_id: string;\n}\n\ninterface PendingArtifact {\n artifact_id: string;\n kind: string;\n path: string | null;\n logical_path: string | null;\n object_id: ObjectId | null;\n text_object_id: ObjectId | null;\n mime_type: string | null;\n size_bytes: number;\n created_ts: string | null;\n raw_record_id: string;\n}\n\ninterface PendingSearchDoc {\n doc_id: string;\n entity_type: string;\n entity_id: string;\n timestamp: string | null;\n role: string | null;\n tool_name: string | null;\n canonical_tool_type: string | null;\n field_kind: string;\n text: string;\n}\n\nasync function compileGeminiFile(\n bundle: Bundle,\n batch: ImportBatch,\n file: GeminiChatFile,\n): Promise<FileCounts> {\n const counts = emptyFileCounts();\n\n const { row: sourceFile, alreadyKnown } = await registerSourceFile(bundle, {\n sourceTool: 'gemini',\n absolutePath: path.resolve(file.filePath),\n fileKind: 'json',\n workspaceHint: file.projectDir,\n });\n if (alreadyKnown) {\n counts.source_files_skipped = 1;\n return counts;\n }\n counts.source_files_imported = 1;\n\n const text = await readFile(file.filePath, 'utf8');\n const parsed = JSON.parse(text) as GeminiSessionFile;\n const fileObjectId = await putBytes(bundle, Buffer.from(text, 'utf8'), {\n mimeType: 'application/json',\n encoding: 'utf-8',\n });\n\n const rootRawRecordId = makeRawRecordId(sourceFile.source_file_id, 0, fileObjectId);\n const pending: PendingState = {\n rawRecords: [\n {\n raw_record_id: rootRawRecordId,\n source_file_id: sourceFile.source_file_id,\n ordinal: 0,\n line_no: null,\n json_pointer: '',\n native_id: parsed.sessionId ?? null,\n raw_object_id: fileObjectId,\n decoded_json_object_id: fileObjectId,\n parser_status: 'ok',\n confidence: 'high',\n import_batch_id: batch.batch_id,\n record_kind: 'json_pointer',\n },\n ],\n session: null,\n events: [],\n messages: [],\n blocks: [],\n toolCallsList: [],\n toolResults: [],\n artifacts: [],\n searchDocs: [],\n project: null,\n };\n\n const sourceSid = parsed.sessionId ?? path.basename(file.filePath, '.json');\n const sessionPk = makeSessionId('gemini', sourceSid);\n\n // Project linkage from .project_root, when present.\n if (file.projectRoot) {\n pending.project = {\n project_id: makeProjectId('gemini', parsed.projectHash ?? file.projectDir),\n canonical_path: file.projectRoot,\n source_project_id: parsed.projectHash ?? file.projectDir,\n };\n }\n\n const start = parsed.startTime ?? null;\n const end = parsed.lastUpdated ?? null;\n pending.session = {\n session_id: sessionPk,\n source_session_id: sourceSid,\n start_ts: start,\n end_ts: end,\n cwd_initial: file.projectRoot,\n title: parsed.summary ?? null,\n raw_record_id: rootRawRecordId,\n };\n\n const messages = Array.isArray(parsed.messages) ? parsed.messages : [];\n\n for (let i = 0; i < messages.length; i++) {\n const msg = messages[i];\n if (!msg) continue;\n await processMessage(\n bundle,\n sessionPk,\n sourceFile.source_file_id,\n i,\n msg,\n batch.batch_id,\n pending,\n );\n }\n\n buildSearchDocs(pending);\n\n transactional(bundle.db, () => {\n flushPending(bundle, pending);\n });\n\n counts.raw_records = pending.rawRecords.length;\n counts.sessions = pending.session ? 1 : 0;\n counts.events = pending.events.length;\n counts.messages = pending.messages.length;\n counts.content_blocks = pending.blocks.length;\n counts.tool_calls = pending.toolCallsList.length;\n counts.tool_results = pending.toolResults.length;\n counts.artifacts = pending.artifacts.length;\n return counts;\n}\n\nasync function processMessage(\n bundle: Bundle,\n sessionId: string,\n sourceFileId: string,\n index: number,\n msg: GeminiMessage,\n batchId: string,\n pending: PendingState,\n): Promise<void> {\n const ordinal = index + 1;\n const ts = msg.timestamp ?? null;\n\n const payloadId = await putJson(bundle, msg);\n // Use the JSON pointer as a stable per-record locator inside the file.\n const pointer = `/messages/${index}`;\n // Hash includes pointer so two entries with identical content but different\n // positions get distinct raw_record_ids.\n const rawObjectIdInput = sha256Hex(`${pointer}\\n${JSON.stringify(msg)}`);\n const rawObjectId: ObjectId = `blake3:${rawObjectIdInput}`;\n void rawObjectId;\n const rawRecordId = makeRawRecordId(sourceFileId, ordinal, payloadId);\n\n pending.rawRecords.push({\n raw_record_id: rawRecordId,\n source_file_id: sourceFileId,\n ordinal,\n line_no: null,\n json_pointer: pointer,\n native_id: msg.id ?? null,\n raw_object_id: payloadId,\n decoded_json_object_id: payloadId,\n parser_status: 'ok',\n confidence: 'high',\n import_batch_id: batchId,\n record_kind: 'json_pointer',\n });\n\n const kind = msg.type ?? 'unknown';\n\n if (kind === 'user' || kind === 'gemini') {\n const role: PendingMessage['role'] = kind === 'user' ? 'user' : 'assistant';\n const messageId = makeMessageId(sessionId, ordinal, msg.id ?? null);\n const eventId = makeEventId(sessionId, ordinal, 'message');\n\n pending.events.push({\n event_id: eventId,\n ordinal,\n source_event_id: msg.id ?? null,\n event_type: 'message',\n source_type: kind,\n subtype: null,\n timestamp: ts,\n actor: role,\n payload_object_id: payloadId,\n raw_record_id: rawRecordId,\n confidence: 'high',\n });\n\n pending.messages.push({\n message_id: messageId,\n event_id: eventId,\n source_message_id: msg.id ?? null,\n role,\n model: role === 'assistant' ? (msg.model ?? null) : null,\n timestamp: ts,\n ordinal,\n raw_record_id: rawRecordId,\n });\n\n // Content blocks.\n const content = msg.content;\n if (typeof content === 'string') {\n await pushTextBlock(bundle, pending, messageId, 0, 'text', content, rawRecordId);\n } else if (Array.isArray(content)) {\n for (let i = 0; i < content.length; i++) {\n const item = content[i] as GeminiContentItem | undefined;\n if (!item) continue;\n const t = item.text ?? '';\n await pushTextBlock(bundle, pending, messageId, i, item.type ?? 'text', t, rawRecordId);\n }\n }\n\n // Thoughts → audit-only blocks (don't pollute search by default).\n const thoughts = Array.isArray(msg.thoughts) ? msg.thoughts : [];\n for (let i = 0; i < thoughts.length; i++) {\n const th = thoughts[i];\n if (!th) continue;\n const text = [th.subject, th.description].filter(Boolean).join('\\n\\n');\n await pushTextBlock(\n bundle,\n pending,\n messageId,\n 100 + i,\n 'thinking',\n text,\n rawRecordId,\n 'hidden_by_default',\n );\n }\n\n // Tool calls.\n const toolCalls = Array.isArray(msg.toolCalls) ? msg.toolCalls : [];\n for (let i = 0; i < toolCalls.length; i++) {\n const tc = toolCalls[i];\n if (!tc) continue;\n await processToolCall(bundle, sessionId, messageId, eventId, i, tc, rawRecordId, pending);\n }\n return;\n }\n\n if (kind === 'info' || kind === 'error') {\n const eventId = makeEventId(sessionId, ordinal, kind);\n pending.events.push({\n event_id: eventId,\n ordinal,\n source_event_id: msg.id ?? null,\n event_type: kind === 'error' ? 'error' : 'system_operational',\n source_type: kind,\n subtype: null,\n timestamp: ts,\n actor: 'system',\n payload_object_id: payloadId,\n raw_record_id: rawRecordId,\n confidence: 'high',\n });\n return;\n }\n\n // Unknown type — keep as operational event.\n pending.events.push({\n event_id: makeEventId(sessionId, ordinal, `unknown.${kind}`),\n ordinal,\n source_event_id: msg.id ?? null,\n event_type: 'system_operational',\n source_type: kind,\n subtype: null,\n timestamp: ts,\n actor: 'system',\n payload_object_id: payloadId,\n raw_record_id: rawRecordId,\n confidence: 'high',\n });\n}\n\nasync function pushTextBlock(\n bundle: Bundle,\n pending: PendingState,\n messageId: string,\n blockOrdinal: number,\n blockType: string,\n text: string,\n rawRecordId: string,\n visibility: 'default' | 'hidden_by_default' | 'audit_only' = 'default',\n): Promise<void> {\n if (!text) return;\n const overflowId = text.length > PREVIEW_MAX ? await putText(bundle, text) : null;\n pending.blocks.push({\n block_id: blockId(messageId, blockOrdinal),\n message_id: messageId,\n event_id: null,\n ordinal: blockOrdinal,\n block_type: blockType,\n text_object_id: overflowId,\n text_inline: text.slice(0, PREVIEW_MAX),\n visibility,\n raw_record_id: rawRecordId,\n });\n}\n\nasync function processToolCall(\n bundle: Bundle,\n sessionId: string,\n messageId: string,\n eventId: string,\n index: number,\n tc: GeminiToolCall,\n rawRecordId: string,\n pending: PendingState,\n): Promise<void> {\n const sourceCallId = tc.id ?? `${messageId}:${index}`;\n const toolName = tc.name ?? 'unknown';\n const toolCallId = makeToolCallId(sessionId, sourceCallId);\n const argsObjectId = tc.args ? await putJson(bundle, tc.args) : null;\n\n pending.toolCallsList.push({\n tool_call_id: toolCallId,\n message_id: messageId,\n event_id: eventId,\n source_call_id: sourceCallId,\n tool_name: toolName,\n canonical_tool_type: canonicalToolType(toolName),\n args_object_id: argsObjectId,\n command: typeof tc.args?.command === 'string' ? (tc.args.command as string) : null,\n cwd: typeof tc.args?.dir_path === 'string' ? (tc.args.dir_path as string) : null,\n path:\n typeof tc.args?.file_path === 'string'\n ? (tc.args.file_path as string)\n : typeof tc.args?.path === 'string'\n ? (tc.args.path as string)\n : null,\n query: typeof tc.args?.query === 'string' ? (tc.args.query as string) : null,\n timestamp_start: tc.timestamp ?? null,\n status: tc.status ?? null,\n raw_record_id: rawRecordId,\n });\n\n const isError = tc.status === 'error' ? 1 : 0;\n const resultText = renderToolResultText(tc.result);\n const overflowId = resultText.length > PREVIEW_MAX ? await putText(bundle, resultText) : null;\n\n pending.toolResults.push({\n tool_result_id: makeToolResultId(sessionId, sourceCallId),\n tool_call_id: toolCallId,\n source_call_id: sourceCallId,\n message_id: messageId,\n event_id: eventId,\n status: tc.status ?? null,\n is_error: isError,\n output_object_id: overflowId,\n preview: resultText.slice(0, PREVIEW_MAX) || null,\n raw_record_id: rawRecordId,\n });\n\n // resultDisplay diffs become artifacts.\n if (tc.resultDisplay && typeof tc.resultDisplay === 'object') {\n const rd = tc.resultDisplay;\n if (rd.fileDiff || rd.filePath) {\n const diffText = rd.fileDiff ?? '';\n const diffId = diffText ? await putText(bundle, diffText, { mimeType: 'text/x-diff' }) : null;\n pending.artifacts.push({\n artifact_id: artifactId(sessionId, 'gemini', `${toolCallId}:diff`),\n kind: 'diff',\n path: rd.filePath ?? null,\n logical_path: rd.fileName ?? rd.filePath ?? null,\n object_id: diffId,\n text_object_id: diffId,\n mime_type: 'text/x-diff',\n size_bytes: diffText.length,\n created_ts: tc.timestamp ?? null,\n raw_record_id: rawRecordId,\n });\n }\n }\n}\n\nfunction renderToolResultText(result: GeminiToolResult[] | undefined): string {\n if (!Array.isArray(result)) return '';\n const parts: string[] = [];\n for (const r of result) {\n if (r.text) {\n parts.push(r.text);\n continue;\n }\n if (r.functionResponse?.response) {\n const rr = r.functionResponse.response;\n if (rr.error != null)\n parts.push(typeof rr.error === 'string' ? rr.error : JSON.stringify(rr.error));\n else if (rr.output != null)\n parts.push(typeof rr.output === 'string' ? rr.output : JSON.stringify(rr.output));\n }\n }\n return parts.join('\\n');\n}\n\nfunction canonicalToolType(toolName: string): string {\n switch (toolName) {\n case 'run_shell_command':\n case 'shell':\n case 'shell_command':\n return 'shell';\n case 'read_file':\n case 'read_many_files':\n return 'read_file';\n case 'write_file':\n return 'write_file';\n case 'replace':\n case 'search_replace':\n return 'edit_file';\n case 'list_directory':\n case 'glob':\n case 'grep_search':\n case 'search_file_content':\n return 'search_file';\n case 'google_web_search':\n return 'web_search';\n case 'codebase_investigator':\n return 'subagent';\n default:\n return toolName.startsWith('mcp__') ? 'mcp' : 'other';\n }\n}\n\nfunction buildSearchDocs(pending: PendingState): void {\n const sessionId = pending.session?.session_id ?? null;\n if (!sessionId) return;\n const blocksByMsg = new Map<string, PendingBlock[]>();\n for (const b of pending.blocks) {\n if (!b.message_id) continue;\n if (b.visibility === 'hidden_by_default') continue;\n const list = blocksByMsg.get(b.message_id) ?? [];\n list.push(b);\n blocksByMsg.set(b.message_id, list);\n }\n for (const m of pending.messages) {\n const text = (blocksByMsg.get(m.message_id) ?? [])\n .map((b) => b.text_inline ?? '')\n .join('\\n')\n .trim();\n if (!text) continue;\n pending.searchDocs.push({\n doc_id: `msg:${m.message_id}`,\n entity_type: 'message',\n entity_id: m.message_id,\n timestamp: m.timestamp,\n role: m.role,\n tool_name: null,\n canonical_tool_type: null,\n field_kind: m.role === 'user' ? 'user_prompt' : 'assistant_text',\n text,\n });\n }\n for (const tc of pending.toolCallsList) {\n if (tc.command) {\n pending.searchDocs.push({\n doc_id: `tc:cmd:${tc.tool_call_id}`,\n entity_type: 'tool_call',\n entity_id: tc.tool_call_id,\n timestamp: tc.timestamp_start,\n role: null,\n tool_name: tc.tool_name,\n canonical_tool_type: tc.canonical_tool_type,\n field_kind: 'command',\n text: tc.command,\n });\n }\n if (tc.path) {\n pending.searchDocs.push({\n doc_id: `tc:path:${tc.tool_call_id}`,\n entity_type: 'tool_call',\n entity_id: tc.tool_call_id,\n timestamp: tc.timestamp_start,\n role: null,\n tool_name: tc.tool_name,\n canonical_tool_type: tc.canonical_tool_type,\n field_kind: 'file_path',\n text: tc.path,\n });\n }\n }\n for (const tr of pending.toolResults) {\n if (!tr.preview) continue;\n pending.searchDocs.push({\n doc_id: `tr:preview:${tr.tool_result_id}`,\n entity_type: 'tool_result',\n entity_id: tr.tool_result_id,\n timestamp: null,\n role: null,\n tool_name: null,\n canonical_tool_type: null,\n field_kind: tr.is_error ? 'error' : 'tool_result',\n text: tr.preview,\n });\n }\n}\n\nfunction flushPending(bundle: Bundle, pending: PendingState): void {\n if (!pending.session) return;\n\n const insertRaw = prepare(\n bundle.db,\n `INSERT OR IGNORE INTO raw_records (\n raw_record_id, source_file_id, source_tool, record_kind, ordinal,\n line_no, json_pointer, native_id, raw_object_id, decoded_json_object_id,\n parser_status, confidence, import_batch_id\n ) VALUES (?, ?, 'gemini', ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n );\n for (const r of pending.rawRecords) {\n insertRaw.run(\n r.raw_record_id,\n r.source_file_id,\n r.record_kind,\n r.ordinal,\n r.line_no,\n r.json_pointer,\n r.native_id,\n r.raw_object_id,\n r.decoded_json_object_id,\n r.parser_status,\n r.confidence,\n r.import_batch_id,\n );\n }\n\n if (pending.project) {\n prepare(\n bundle.db,\n `INSERT OR IGNORE INTO projects (\n project_id, canonical_path, path_hash, source_tool, source_project_id,\n display_name, created_at\n ) VALUES (?, ?, ?, 'gemini', ?, NULL, ?)`,\n ).run(\n pending.project.project_id,\n pending.project.canonical_path,\n pending.project.canonical_path\n ? sha256Hex(pending.project.canonical_path).slice(0, 32)\n : null,\n pending.project.source_project_id,\n new Date().toISOString(),\n );\n }\n\n prepare(\n bundle.db,\n `INSERT OR REPLACE INTO sessions (\n session_id, source_tool, source_session_id, project_id, parent_session_id,\n is_subagent, agent_role, agent_nickname, title, summary,\n start_ts, end_ts, cwd_initial, git_branch_initial,\n model_first, model_last, status, timeline_confidence, raw_record_id\n ) VALUES (?, 'gemini', ?, ?, NULL, 0, NULL, NULL, ?, NULL, ?, ?, ?, NULL, NULL, NULL, 'completed', 'high', ?)`,\n ).run(\n pending.session.session_id,\n pending.session.source_session_id,\n pending.project?.project_id ?? null,\n pending.session.title,\n pending.session.start_ts,\n pending.session.end_ts,\n pending.session.cwd_initial,\n pending.session.raw_record_id,\n );\n\n const insertEvent = prepare(\n bundle.db,\n `INSERT OR REPLACE INTO events (\n event_id, session_id, turn_id, source_event_id, event_type, source_type,\n subtype, timestamp, ordinal, actor, payload_object_id, raw_record_id,\n confidence, is_derived\n ) VALUES (?, ?, NULL, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0)`,\n );\n for (const e of pending.events) {\n insertEvent.run(\n e.event_id,\n pending.session.session_id,\n e.source_event_id,\n e.event_type,\n e.source_type,\n e.subtype,\n e.timestamp,\n e.ordinal,\n e.actor,\n e.payload_object_id,\n e.raw_record_id,\n e.confidence,\n );\n }\n\n const insertMsg = prepare(\n bundle.db,\n `INSERT OR REPLACE INTO messages (\n message_id, session_id, turn_id, event_id, source_message_id, role,\n author_name, model, timestamp, ordinal, parent_message_id, request_id,\n status, raw_record_id\n ) VALUES (?, ?, NULL, ?, ?, ?, NULL, ?, ?, ?, NULL, NULL, NULL, ?)`,\n );\n for (const m of pending.messages) {\n insertMsg.run(\n m.message_id,\n pending.session.session_id,\n m.event_id,\n m.source_message_id,\n m.role,\n m.model,\n m.timestamp,\n m.ordinal,\n m.raw_record_id,\n );\n }\n\n const insertBlock = prepare(\n bundle.db,\n `INSERT OR REPLACE INTO content_blocks (\n block_id, message_id, event_id, session_id, ordinal, block_type,\n text_object_id, text_inline, mime_type, token_count, is_error,\n is_redacted, visibility, raw_record_id\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, NULL, NULL, 0, 0, ?, ?)`,\n );\n for (const b of pending.blocks) {\n insertBlock.run(\n b.block_id,\n b.message_id,\n b.event_id,\n pending.session.session_id,\n b.ordinal,\n b.block_type,\n b.text_object_id,\n b.text_inline,\n b.visibility,\n b.raw_record_id,\n );\n }\n\n const insertCall = prepare(\n bundle.db,\n `INSERT OR REPLACE INTO tool_calls (\n tool_call_id, session_id, turn_id, message_id, event_id,\n source_call_id, tool_name, canonical_tool_type, args_object_id,\n command, cwd, path, query, timestamp_start, timestamp_end, status,\n raw_record_id\n ) VALUES (?, ?, NULL, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, NULL, ?, ?)`,\n );\n for (const c of pending.toolCallsList) {\n insertCall.run(\n c.tool_call_id,\n pending.session.session_id,\n c.message_id,\n c.event_id,\n c.source_call_id,\n c.tool_name,\n c.canonical_tool_type,\n c.args_object_id,\n c.command,\n c.cwd,\n c.path,\n c.query,\n c.timestamp_start,\n c.status,\n c.raw_record_id,\n );\n }\n\n const insertResult = prepare(\n bundle.db,\n `INSERT OR REPLACE INTO tool_results (\n tool_result_id, tool_call_id, session_id, message_id, event_id,\n source_call_id, status, is_error, exit_code, duration_ms,\n stdout_object_id, stderr_object_id, output_object_id, preview, raw_record_id\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, NULL, NULL, NULL, NULL, ?, ?, ?)`,\n );\n for (const r of pending.toolResults) {\n insertResult.run(\n r.tool_result_id,\n r.tool_call_id,\n pending.session.session_id,\n r.message_id,\n r.event_id,\n r.source_call_id,\n r.status,\n r.is_error,\n r.output_object_id,\n r.preview,\n r.raw_record_id,\n );\n }\n\n const insertArtifact = prepare(\n bundle.db,\n `INSERT OR REPLACE INTO artifacts (\n artifact_id, session_id, project_id, source_tool, kind, path,\n logical_path, object_id, text_object_id, mime_type, size_bytes,\n created_ts, raw_record_id\n ) VALUES (?, ?, ?, 'gemini', ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n );\n for (const a of pending.artifacts) {\n insertArtifact.run(\n a.artifact_id,\n pending.session.session_id,\n pending.project?.project_id ?? null,\n a.kind,\n a.path,\n a.logical_path,\n a.object_id,\n a.text_object_id,\n a.mime_type,\n a.size_bytes,\n a.created_ts,\n a.raw_record_id,\n );\n }\n\n const insertSearch = prepare(\n bundle.db,\n `INSERT OR REPLACE INTO search_docs (\n doc_id, entity_type, entity_id, session_id, project_id, timestamp,\n role, tool_name, canonical_tool_type, field_kind, text\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n );\n for (const d of pending.searchDocs) {\n insertSearch.run(\n d.doc_id,\n d.entity_type,\n d.entity_id,\n pending.session.session_id,\n pending.project?.project_id ?? null,\n d.timestamp,\n d.role,\n d.tool_name,\n d.canonical_tool_type,\n d.field_kind,\n d.text,\n );\n }\n}\n","import { readFile, readdir } from 'node:fs/promises';\nimport path from 'node:path';\n\nexport interface GeminiChatFile {\n filePath: string;\n /** Either a 64-hex hash or a project slug. */\n projectDir: string;\n /** Resolved from `.project_root` if it exists in the project dir. */\n projectRoot: string | null;\n}\n\n/**\n * Walk `<root>` (typically `~/.gemini/tmp`) and yield every\n * `chats/session-*.json` file together with the resolved `.project_root`.\n * Ignores `logs.json` and the `bin/` directory.\n */\nexport async function* discoverGeminiChats(\n root: string,\n): AsyncGenerator<GeminiChatFile, void, void> {\n const entries = await readdirSafe(root);\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n if (entry.name === 'bin') continue;\n const projectRoot = await readProjectRoot(path.join(root, entry.name));\n const chatsDir = path.join(root, entry.name, 'chats');\n const chatEntries = await readdirSafe(chatsDir);\n for (const c of chatEntries) {\n if (!c.isFile()) continue;\n if (!c.name.startsWith('session-') || !c.name.endsWith('.json')) continue;\n yield {\n filePath: path.join(chatsDir, c.name),\n projectDir: entry.name,\n projectRoot,\n };\n }\n }\n}\n\nasync function readProjectRoot(dir: string): Promise<string | null> {\n try {\n const text = await readFile(path.join(dir, '.project_root'), 'utf8');\n return text.replace(/\\n+$/, '').trim() || null;\n } catch {\n return null;\n }\n}\n\nasync function readdirSafe(dir: string): Promise<import('node:fs').Dirent[]> {\n try {\n return await readdir(dir, { withFileTypes: true });\n } catch {\n return [];\n }\n}\n","import path from 'node:path';\nimport Database from 'better-sqlite3';\nimport type { Bundle } from '../../core/bundle.js';\nimport { type ObjectId, putBytes, putJson, putText } from '../../core/cas/index.js';\nimport { prepare, transactional } from '../../core/db.js';\nimport {\n artifactId,\n blockId,\n eventId as makeEventId,\n messageId as makeMessageId,\n rawRecordId as makeRawRecordId,\n sessionId as makeSessionId,\n toolCallId as makeToolCallId,\n toolResultId as makeToolResultId,\n} from '../../core/domain/ids.js';\nimport {\n type ImportBatch,\n type ImportCounts,\n emptyCounts,\n finishBatch,\n recordError,\n startBatch,\n} from '../../core/ingest/batch.js';\nimport { registerSourceFile } from '../../core/ingest/idempotency.js';\nimport { type CursorStoreDb, discoverCursorStores } from './discover.js';\n\nexport interface CompileResult {\n batch: ImportBatch;\n counts: ImportCounts;\n}\n\nconst PREVIEW_MAX = 4_000;\n\ninterface CursorMeta {\n agentId?: string;\n latestRootBlobId?: string;\n name?: string;\n mode?: string;\n createdAt?: number;\n lastUsedModel?: string;\n}\n\ninterface CursorBlobJson {\n role?: string;\n id?: string;\n content?: string | CursorContentItem[];\n providerOptions?: Record<string, unknown>;\n}\n\ninterface CursorContentItem {\n type?: string;\n text?: string;\n toolCallId?: string;\n toolName?: string;\n args?: unknown;\n result?: unknown;\n experimental_content?: unknown;\n signature?: string;\n data?: unknown;\n}\n\nexport async function compileCursor(bundle: Bundle, root: string): Promise<CompileResult> {\n const batch = startBatch(bundle, 'cursor', [root]);\n const counts = emptyCounts();\n try {\n for await (const store of discoverCursorStores(root)) {\n counts.source_files_seen++;\n try {\n const fc = await compileCursorStore(bundle, batch, store);\n addCounts(counts, fc);\n } catch (error) {\n counts.errors++;\n await recordError(bundle, batch.batch_id, {\n kind: 'cursor_store_failed',\n message: error instanceof Error ? error.message : String(error),\n payload: { path: store.filePath },\n });\n }\n }\n finishBatch(bundle, batch, counts, 'completed');\n } catch (error) {\n finishBatch(bundle, batch, counts, 'failed');\n throw error;\n }\n return { batch, counts };\n}\n\ninterface FileCounts {\n source_files_imported: number;\n source_files_skipped: number;\n raw_records: number;\n sessions: number;\n events: number;\n messages: number;\n content_blocks: number;\n tool_calls: number;\n tool_results: number;\n artifacts: number;\n edges: number;\n errors: number;\n}\n\nfunction emptyFileCounts(): FileCounts {\n return {\n source_files_imported: 0,\n source_files_skipped: 0,\n raw_records: 0,\n sessions: 0,\n events: 0,\n messages: 0,\n content_blocks: 0,\n tool_calls: 0,\n tool_results: 0,\n artifacts: 0,\n edges: 0,\n errors: 0,\n };\n}\n\nfunction addCounts(target: ImportCounts, source: FileCounts): void {\n target.source_files_imported += source.source_files_imported;\n target.source_files_skipped += source.source_files_skipped;\n target.raw_records += source.raw_records;\n target.sessions += source.sessions;\n target.events += source.events;\n target.messages += source.messages;\n target.content_blocks += source.content_blocks;\n target.tool_calls += source.tool_calls;\n target.tool_results += source.tool_results;\n target.artifacts += source.artifacts;\n target.edges += source.edges;\n target.errors += source.errors;\n}\n\ninterface PendingState {\n rawRecords: PendingRaw[];\n session: PendingSession | null;\n events: PendingEvent[];\n messages: PendingMessage[];\n blocks: PendingBlock[];\n toolCalls: Map<string, PendingToolCall>;\n toolCallsList: PendingToolCall[];\n toolResults: PendingToolResult[];\n artifacts: PendingArtifact[];\n searchDocs: PendingSearchDoc[];\n}\n\ninterface PendingRaw {\n raw_record_id: string;\n source_file_id: string;\n ordinal: number;\n line_no: null;\n json_pointer: string | null;\n native_id: string | null;\n raw_object_id: ObjectId;\n decoded_json_object_id: ObjectId | null;\n parser_status: 'ok' | 'partial' | 'failed';\n confidence: 'high' | 'medium' | 'low';\n import_batch_id: string;\n record_kind: 'sqlite_meta' | 'sqlite_blob';\n}\n\ninterface PendingSession {\n session_id: string;\n source_session_id: string;\n agent_role: string | null;\n agent_nickname: string | null;\n title: string | null;\n start_ts: string | null;\n raw_record_id: string;\n model: string | null;\n}\n\ninterface PendingEvent {\n event_id: string;\n ordinal: number;\n source_event_id: string | null;\n event_type: string;\n source_type: string;\n subtype: string | null;\n timestamp: string | null;\n actor: string | null;\n payload_object_id: ObjectId | null;\n raw_record_id: string;\n confidence: 'high' | 'medium' | 'low';\n}\n\ninterface PendingMessage {\n message_id: string;\n event_id: string | null;\n source_message_id: string | null;\n role: 'system_prompt' | 'developer' | 'user' | 'assistant' | 'tool' | 'operational';\n model: string | null;\n timestamp: string | null;\n ordinal: number;\n raw_record_id: string;\n}\n\ninterface PendingBlock {\n block_id: string;\n message_id: string | null;\n event_id: string | null;\n ordinal: number;\n block_type: string;\n text_object_id: ObjectId | null;\n text_inline: string | null;\n is_error: 0 | 1;\n visibility: 'default' | 'hidden_by_default' | 'audit_only';\n raw_record_id: string;\n}\n\ninterface PendingToolCall {\n tool_call_id: string;\n message_id: string | null;\n event_id: string | null;\n source_call_id: string;\n tool_name: string;\n canonical_tool_type: string;\n args_object_id: ObjectId | null;\n command: string | null;\n cwd: string | null;\n path: string | null;\n query: string | null;\n timestamp_start: string | null;\n status: string | null;\n raw_record_id: string;\n}\n\ninterface PendingToolResult {\n tool_result_id: string;\n tool_call_id: string | null;\n source_call_id: string;\n message_id: string | null;\n event_id: string | null;\n status: string | null;\n is_error: 0 | 1;\n output_object_id: ObjectId | null;\n preview: string | null;\n raw_record_id: string;\n}\n\ninterface PendingArtifact {\n artifact_id: string;\n kind: string;\n path: string | null;\n logical_path: string | null;\n object_id: ObjectId | null;\n text_object_id: ObjectId | null;\n mime_type: string | null;\n size_bytes: number;\n created_ts: string | null;\n raw_record_id: string;\n}\n\ninterface PendingSearchDoc {\n doc_id: string;\n entity_type: string;\n entity_id: string;\n timestamp: string | null;\n role: string | null;\n tool_name: string | null;\n canonical_tool_type: string | null;\n field_kind: string;\n text: string;\n}\n\nasync function compileCursorStore(\n bundle: Bundle,\n batch: ImportBatch,\n store: CursorStoreDb,\n): Promise<FileCounts> {\n const counts = emptyFileCounts();\n\n const { row: sourceFile, alreadyKnown } = await registerSourceFile(bundle, {\n sourceTool: 'cursor',\n absolutePath: path.resolve(store.filePath),\n fileKind: 'sqlite',\n workspaceHint: store.workspaceId,\n });\n if (alreadyKnown) {\n counts.source_files_skipped = 1;\n return counts;\n }\n counts.source_files_imported = 1;\n\n // Open the Cursor store read-only. We don't lock or write to it, so multiple\n // imports can run while Cursor itself is using the database.\n const cdb = new Database(store.filePath, { readonly: true, fileMustExist: true });\n\n try {\n const pending: PendingState = {\n rawRecords: [],\n session: null,\n events: [],\n messages: [],\n blocks: [],\n toolCalls: new Map(),\n toolCallsList: [],\n toolResults: [],\n artifacts: [],\n searchDocs: [],\n };\n\n // ---- meta: hex-encoded JSON ----\n const metaRow = cdb\n .prepare<[], { value: string }>(`SELECT value FROM meta WHERE key='0'`)\n .get();\n let meta: CursorMeta = {};\n let metaRawId = '';\n if (metaRow) {\n const metaText = hexToUtf8(metaRow.value);\n try {\n meta = JSON.parse(metaText) as CursorMeta;\n } catch {\n meta = {};\n }\n const metaObjId = await putBytes(bundle, Buffer.from(metaText, 'utf8'), {\n mimeType: 'application/json',\n encoding: 'utf-8',\n });\n metaRawId = makeRawRecordId(sourceFile.source_file_id, 0, metaObjId);\n pending.rawRecords.push({\n raw_record_id: metaRawId,\n source_file_id: sourceFile.source_file_id,\n ordinal: 0,\n line_no: null,\n json_pointer: 'meta/0',\n native_id: meta.agentId ?? store.agentId,\n raw_object_id: metaObjId,\n decoded_json_object_id: metaObjId,\n parser_status: 'ok',\n confidence: 'high',\n import_batch_id: batch.batch_id,\n record_kind: 'sqlite_meta',\n });\n }\n\n const sourceSessionId = meta.agentId ?? store.agentId;\n const sessionPk = makeSessionId('cursor', sourceSessionId);\n const startTs = meta.createdAt ? new Date(meta.createdAt).toISOString() : null;\n pending.session = {\n session_id: sessionPk,\n source_session_id: sourceSessionId,\n agent_role: meta.mode ?? null,\n agent_nickname: meta.name ?? null,\n title: meta.name ?? null,\n start_ts: startTs,\n raw_record_id: metaRawId || makeRawRecordId(sourceFile.source_file_id, 0, 'blake3:none'),\n model: meta.lastUsedModel ?? null,\n };\n\n // ---- blobs ----\n const blobs = cdb\n .prepare<[], { id: string; data: Buffer }>(`SELECT id, data FROM blobs ORDER BY rowid`)\n .all();\n\n let messageOrdinal = 0;\n for (let i = 0; i < blobs.length; i++) {\n const blob = blobs[i];\n if (!blob) continue;\n const ordinal = i + 1;\n const blobObjectId = await putBytes(bundle, blob.data);\n const blobRawId = makeRawRecordId(sourceFile.source_file_id, ordinal, blobObjectId);\n\n // Try to parse JSON. Many blobs are protobuf state and won't parse.\n let parsed: CursorBlobJson | null = null;\n const firstByte = blob.data[0];\n const looksJson = firstByte === 0x7b /* '{' */ || firstByte === 0x5b /* '[' */;\n if (looksJson) {\n try {\n parsed = JSON.parse(blob.data.toString('utf8')) as CursorBlobJson;\n } catch {\n parsed = null;\n }\n }\n\n pending.rawRecords.push({\n raw_record_id: blobRawId,\n source_file_id: sourceFile.source_file_id,\n ordinal,\n line_no: null,\n json_pointer: `blobs/${blob.id}`,\n native_id: blob.id,\n raw_object_id: blobObjectId,\n decoded_json_object_id: parsed != null ? await putJson(bundle, parsed) : null,\n parser_status: parsed != null ? 'ok' : looksJson ? 'failed' : 'partial',\n confidence: 'low', // timeline order from blob list isn't canonical\n import_batch_id: batch.batch_id,\n record_kind: 'sqlite_blob',\n });\n\n if (!parsed || typeof parsed.role !== 'string') continue;\n\n // Normalize JSON blobs that look like chat messages.\n const role = mapRole(parsed.role);\n const messageId = makeMessageId(sessionPk, messageOrdinal++, parsed.id ?? blob.id);\n const eventId = makeEventId(sessionPk, ordinal, 'message');\n\n pending.events.push({\n event_id: eventId,\n ordinal,\n source_event_id: blob.id,\n event_type: 'message',\n source_type: `cursor.${parsed.role}`,\n subtype: null,\n timestamp: null,\n actor: parsed.role,\n payload_object_id:\n pending.rawRecords[pending.rawRecords.length - 1]?.decoded_json_object_id ?? null,\n raw_record_id: blobRawId,\n confidence: 'low',\n });\n\n pending.messages.push({\n message_id: messageId,\n event_id: eventId,\n source_message_id: parsed.id ?? blob.id,\n role,\n model: role === 'assistant' ? (meta.lastUsedModel ?? null) : null,\n timestamp: null,\n ordinal: messageOrdinal,\n raw_record_id: blobRawId,\n });\n\n const content = parsed.content;\n if (typeof content === 'string') {\n await pushTextBlock(bundle, pending, messageId, 0, 'text', content, blobRawId);\n } else if (Array.isArray(content)) {\n for (let bi = 0; bi < content.length; bi++) {\n const item = content[bi];\n if (!item) continue;\n await processContentItem(\n bundle,\n sessionPk,\n messageId,\n eventId,\n bi,\n item,\n blobRawId,\n pending,\n );\n }\n }\n }\n\n buildSearchDocs(pending);\n\n transactional(bundle.db, () => {\n flushPending(bundle, pending);\n });\n\n counts.raw_records = pending.rawRecords.length;\n counts.sessions = 1;\n counts.events = pending.events.length;\n counts.messages = pending.messages.length;\n counts.content_blocks = pending.blocks.length;\n counts.tool_calls = pending.toolCallsList.length;\n counts.tool_results = pending.toolResults.length;\n counts.artifacts = pending.artifacts.length;\n return counts;\n } finally {\n cdb.close();\n }\n}\n\nfunction hexToUtf8(hex: string): string {\n return Buffer.from(hex, 'hex').toString('utf8');\n}\n\nfunction mapRole(role: string): PendingMessage['role'] {\n switch (role) {\n case 'user':\n return 'user';\n case 'assistant':\n return 'assistant';\n case 'tool':\n return 'tool';\n case 'system':\n // In Cursor's chat blobs, role=system is actually the system prompt\n // (unlike Claude Code's `type:\"system\"` event_log usage).\n return 'system_prompt';\n default:\n return 'operational';\n }\n}\n\nasync function pushTextBlock(\n bundle: Bundle,\n pending: PendingState,\n messageId: string,\n ordinal: number,\n blockType: string,\n text: string,\n rawRecordId: string,\n visibility: 'default' | 'hidden_by_default' | 'audit_only' = 'default',\n): Promise<void> {\n if (!text) return;\n const overflow = text.length > PREVIEW_MAX ? await putText(bundle, text) : null;\n pending.blocks.push({\n block_id: blockId(messageId, ordinal),\n message_id: messageId,\n event_id: null,\n ordinal,\n block_type: blockType,\n text_object_id: overflow,\n text_inline: text.slice(0, PREVIEW_MAX),\n is_error: 0,\n visibility,\n raw_record_id: rawRecordId,\n });\n}\n\nasync function processContentItem(\n bundle: Bundle,\n sessionId: string,\n messageId: string,\n eventId: string,\n ordinal: number,\n item: CursorContentItem,\n rawRecordId: string,\n pending: PendingState,\n): Promise<void> {\n const t = item.type;\n if (t === 'text') {\n await pushTextBlock(bundle, pending, messageId, ordinal, 'text', item.text ?? '', rawRecordId);\n return;\n }\n if (t === 'reasoning') {\n await pushTextBlock(\n bundle,\n pending,\n messageId,\n ordinal,\n 'thinking',\n item.text ?? '',\n rawRecordId,\n 'hidden_by_default',\n );\n return;\n }\n if (t === 'redacted-reasoning') {\n pending.blocks.push({\n block_id: blockId(messageId, ordinal),\n message_id: messageId,\n event_id: null,\n ordinal,\n block_type: 'thinking',\n text_object_id: null,\n text_inline: '[redacted]',\n is_error: 0,\n visibility: 'audit_only',\n raw_record_id: rawRecordId,\n });\n return;\n }\n if (t === 'tool-call') {\n const sourceCallId = item.toolCallId ?? `${ordinal}`;\n const toolName = item.toolName ?? 'unknown';\n const argsObjectId = item.args != null ? await putJson(bundle, item.args) : null;\n const tcId = makeToolCallId(sessionId, sourceCallId);\n\n pending.blocks.push({\n block_id: blockId(messageId, ordinal),\n message_id: messageId,\n event_id: null,\n ordinal,\n block_type: 'tool_use',\n text_object_id: null,\n text_inline: null,\n is_error: 0,\n visibility: 'default',\n raw_record_id: rawRecordId,\n });\n\n const call: PendingToolCall = {\n tool_call_id: tcId,\n message_id: messageId,\n event_id: eventId,\n source_call_id: sourceCallId,\n tool_name: toolName,\n canonical_tool_type: canonicalToolType(toolName),\n args_object_id: argsObjectId,\n command:\n typeof (item.args as { command?: unknown })?.command === 'string'\n ? (item.args as { command: string }).command\n : null,\n cwd: null,\n path:\n typeof (item.args as { file_path?: unknown })?.file_path === 'string'\n ? (item.args as { file_path: string }).file_path\n : typeof (item.args as { path?: unknown })?.path === 'string'\n ? (item.args as { path: string }).path\n : null,\n query: null,\n timestamp_start: null,\n status: 'started',\n raw_record_id: rawRecordId,\n };\n pending.toolCalls.set(sourceCallId, call);\n pending.toolCallsList.push(call);\n return;\n }\n if (t === 'tool-result') {\n const sourceCallId = item.toolCallId ?? `${ordinal}`;\n const text = stringifyOrNull(item.result) ?? '';\n const overflow = text.length > PREVIEW_MAX ? await putText(bundle, text) : null;\n const isError = readIsError(item) ? 1 : 0;\n\n pending.blocks.push({\n block_id: blockId(messageId, ordinal),\n message_id: messageId,\n event_id: null,\n ordinal,\n block_type: 'tool_result',\n text_object_id: overflow,\n text_inline: text.slice(0, PREVIEW_MAX),\n is_error: isError,\n visibility: 'default',\n raw_record_id: rawRecordId,\n });\n\n const matched = pending.toolCalls.get(sourceCallId);\n pending.toolResults.push({\n tool_result_id: makeToolResultId(sessionId, sourceCallId),\n tool_call_id: matched?.tool_call_id ?? null,\n source_call_id: sourceCallId,\n message_id: messageId,\n event_id: eventId,\n status: matched ? (isError ? 'error' : 'success') : null,\n is_error: isError,\n output_object_id: overflow,\n preview: text.slice(0, PREVIEW_MAX) || null,\n raw_record_id: rawRecordId,\n });\n if (matched) matched.status = isError ? 'error' : 'success';\n return;\n }\n\n // Unknown content type — keep as audit-only block.\n pending.blocks.push({\n block_id: blockId(messageId, ordinal),\n message_id: messageId,\n event_id: null,\n ordinal,\n block_type: t ?? 'unknown',\n text_object_id: null,\n text_inline: stringifyOrNull(item)?.slice(0, PREVIEW_MAX) ?? null,\n is_error: 0,\n visibility: 'audit_only',\n raw_record_id: rawRecordId,\n });\n}\n\nfunction readIsError(item: CursorContentItem): boolean {\n // Cursor stores isError under providerOptions.cursor.highLevelToolCallResult.\n const exp = item.experimental_content as { isError?: boolean } | undefined;\n if (exp && typeof exp.isError === 'boolean') return exp.isError;\n return false;\n}\n\nfunction canonicalToolType(toolName: string): string {\n const lower = toolName.toLowerCase();\n if (lower.startsWith('mcp__')) return 'mcp';\n if (lower === 'shell' || lower === 'run_terminal_cmd' || lower === 'bash') return 'shell';\n if (lower === 'read' || lower === 'readfile' || lower === 'read_file') return 'read_file';\n if (lower === 'write' || lower === 'writefile' || lower === 'write_file') return 'write_file';\n if (\n lower === 'strreplace' ||\n lower === 'str_replace' ||\n lower === 'edit' ||\n lower === 'search_replace'\n ) {\n return 'edit_file';\n }\n if (\n lower === 'grep' ||\n lower === 'glob' ||\n lower === 'codebase_search' ||\n lower === 'glob_file_search'\n ) {\n return 'search_file';\n }\n if (lower === 'websearch') return 'web_search';\n if (lower === 'applypatch' || lower === 'apply_patch') return 'patch';\n return 'other';\n}\n\nfunction stringifyOrNull(value: unknown): string | null {\n if (value == null) return null;\n if (typeof value === 'string') return value;\n try {\n return JSON.stringify(value);\n } catch {\n return null;\n }\n}\n\nfunction buildSearchDocs(pending: PendingState): void {\n const sessionId = pending.session?.session_id ?? null;\n if (!sessionId) return;\n const blocksByMsg = new Map<string, PendingBlock[]>();\n for (const b of pending.blocks) {\n if (!b.message_id) continue;\n if (b.visibility === 'hidden_by_default' || b.visibility === 'audit_only') continue;\n if (!b.text_inline) continue;\n const list = blocksByMsg.get(b.message_id) ?? [];\n list.push(b);\n blocksByMsg.set(b.message_id, list);\n }\n for (const m of pending.messages) {\n const text = (blocksByMsg.get(m.message_id) ?? [])\n .map((b) => b.text_inline ?? '')\n .join('\\n')\n .trim();\n if (!text) continue;\n pending.searchDocs.push({\n doc_id: `msg:${m.message_id}`,\n entity_type: 'message',\n entity_id: m.message_id,\n timestamp: m.timestamp,\n role: m.role,\n tool_name: null,\n canonical_tool_type: null,\n field_kind:\n m.role === 'user' ? 'user_prompt' : m.role === 'tool' ? 'tool_result' : 'assistant_text',\n text,\n });\n }\n for (const tc of pending.toolCallsList) {\n if (tc.command) {\n pending.searchDocs.push({\n doc_id: `tc:cmd:${tc.tool_call_id}`,\n entity_type: 'tool_call',\n entity_id: tc.tool_call_id,\n timestamp: tc.timestamp_start,\n role: null,\n tool_name: tc.tool_name,\n canonical_tool_type: tc.canonical_tool_type,\n field_kind: 'command',\n text: tc.command,\n });\n }\n if (tc.path) {\n pending.searchDocs.push({\n doc_id: `tc:path:${tc.tool_call_id}`,\n entity_type: 'tool_call',\n entity_id: tc.tool_call_id,\n timestamp: tc.timestamp_start,\n role: null,\n tool_name: tc.tool_name,\n canonical_tool_type: tc.canonical_tool_type,\n field_kind: 'file_path',\n text: tc.path,\n });\n }\n }\n}\n\nfunction flushPending(bundle: Bundle, pending: PendingState): void {\n if (!pending.session) return;\n\n const insertRaw = prepare(\n bundle.db,\n `INSERT OR IGNORE INTO raw_records (\n raw_record_id, source_file_id, source_tool, record_kind, ordinal,\n line_no, json_pointer, native_id, raw_object_id, decoded_json_object_id,\n parser_status, confidence, import_batch_id\n ) VALUES (?, ?, 'cursor', ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n );\n for (const r of pending.rawRecords) {\n insertRaw.run(\n r.raw_record_id,\n r.source_file_id,\n r.record_kind,\n r.ordinal,\n r.line_no,\n r.json_pointer,\n r.native_id,\n r.raw_object_id,\n r.decoded_json_object_id,\n r.parser_status,\n r.confidence,\n r.import_batch_id,\n );\n }\n\n prepare(\n bundle.db,\n `INSERT OR REPLACE INTO sessions (\n session_id, source_tool, source_session_id, project_id, parent_session_id,\n is_subagent, agent_role, agent_nickname, title, summary,\n start_ts, end_ts, cwd_initial, git_branch_initial,\n model_first, model_last, status, timeline_confidence, raw_record_id\n ) VALUES (?, 'cursor', ?, NULL, NULL, 0, ?, ?, ?, NULL, ?, NULL, NULL, NULL, ?, ?, NULL, 'low', ?)`,\n ).run(\n pending.session.session_id,\n pending.session.source_session_id,\n pending.session.agent_role,\n pending.session.agent_nickname,\n pending.session.title,\n pending.session.start_ts,\n pending.session.model,\n pending.session.model,\n pending.session.raw_record_id,\n );\n\n const insertEvent = prepare(\n bundle.db,\n `INSERT OR REPLACE INTO events (\n event_id, session_id, turn_id, source_event_id, event_type, source_type,\n subtype, timestamp, ordinal, actor, payload_object_id, raw_record_id,\n confidence, is_derived\n ) VALUES (?, ?, NULL, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0)`,\n );\n for (const e of pending.events) {\n insertEvent.run(\n e.event_id,\n pending.session.session_id,\n e.source_event_id,\n e.event_type,\n e.source_type,\n e.subtype,\n e.timestamp,\n e.ordinal,\n e.actor,\n e.payload_object_id,\n e.raw_record_id,\n e.confidence,\n );\n }\n\n const insertMsg = prepare(\n bundle.db,\n `INSERT OR REPLACE INTO messages (\n message_id, session_id, turn_id, event_id, source_message_id, role,\n author_name, model, timestamp, ordinal, parent_message_id, request_id,\n status, raw_record_id\n ) VALUES (?, ?, NULL, ?, ?, ?, NULL, ?, ?, ?, NULL, NULL, NULL, ?)`,\n );\n for (const m of pending.messages) {\n insertMsg.run(\n m.message_id,\n pending.session.session_id,\n m.event_id,\n m.source_message_id,\n m.role,\n m.model,\n m.timestamp,\n m.ordinal,\n m.raw_record_id,\n );\n }\n\n const insertBlock = prepare(\n bundle.db,\n `INSERT OR REPLACE INTO content_blocks (\n block_id, message_id, event_id, session_id, ordinal, block_type,\n text_object_id, text_inline, mime_type, token_count, is_error,\n is_redacted, visibility, raw_record_id\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, NULL, NULL, ?, 0, ?, ?)`,\n );\n for (const b of pending.blocks) {\n insertBlock.run(\n b.block_id,\n b.message_id,\n b.event_id,\n pending.session.session_id,\n b.ordinal,\n b.block_type,\n b.text_object_id,\n b.text_inline,\n b.is_error,\n b.visibility,\n b.raw_record_id,\n );\n }\n\n const insertCall = prepare(\n bundle.db,\n `INSERT OR REPLACE INTO tool_calls (\n tool_call_id, session_id, turn_id, message_id, event_id,\n source_call_id, tool_name, canonical_tool_type, args_object_id,\n command, cwd, path, query, timestamp_start, timestamp_end, status,\n raw_record_id\n ) VALUES (?, ?, NULL, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, NULL, ?, ?)`,\n );\n for (const c of pending.toolCallsList) {\n insertCall.run(\n c.tool_call_id,\n pending.session.session_id,\n c.message_id,\n c.event_id,\n c.source_call_id,\n c.tool_name,\n c.canonical_tool_type,\n c.args_object_id,\n c.command,\n c.cwd,\n c.path,\n c.query,\n c.timestamp_start,\n c.status,\n c.raw_record_id,\n );\n }\n\n const insertResult = prepare(\n bundle.db,\n `INSERT OR REPLACE INTO tool_results (\n tool_result_id, tool_call_id, session_id, message_id, event_id,\n source_call_id, status, is_error, exit_code, duration_ms,\n stdout_object_id, stderr_object_id, output_object_id, preview, raw_record_id\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, NULL, NULL, NULL, NULL, ?, ?, ?)`,\n );\n for (const r of pending.toolResults) {\n insertResult.run(\n r.tool_result_id,\n r.tool_call_id,\n pending.session.session_id,\n r.message_id,\n r.event_id,\n r.source_call_id,\n r.status,\n r.is_error,\n r.output_object_id,\n r.preview,\n r.raw_record_id,\n );\n }\n\n const insertSearch = prepare(\n bundle.db,\n `INSERT OR REPLACE INTO search_docs (\n doc_id, entity_type, entity_id, session_id, project_id, timestamp,\n role, tool_name, canonical_tool_type, field_kind, text\n ) VALUES (?, ?, ?, ?, NULL, ?, ?, ?, ?, ?, ?)`,\n );\n for (const d of pending.searchDocs) {\n insertSearch.run(\n d.doc_id,\n d.entity_type,\n d.entity_id,\n pending.session.session_id,\n d.timestamp,\n d.role,\n d.tool_name,\n d.canonical_tool_type,\n d.field_kind,\n d.text,\n );\n }\n\n void artifactId; // referenced by other importers; kept here for symmetry\n}\n","import { readdir } from 'node:fs/promises';\nimport path from 'node:path';\n\nexport interface CursorStoreDb {\n filePath: string;\n workspaceId: string;\n agentId: string;\n}\n\n/**\n * Walk `<root>` (typically `~/.cursor/chats`) and yield every `store.db`\n * SQLite file together with the workspace/agent ids derived from the path.\n * Layout: `<root>/<workspace>/<agent>/store.db`.\n */\nexport async function* discoverCursorStores(\n root: string,\n): AsyncGenerator<CursorStoreDb, void, void> {\n const workspaces = await readdirSafe(root);\n for (const ws of workspaces) {\n if (!ws.isDirectory()) continue;\n const wsPath = path.join(root, ws.name);\n const agents = await readdirSafe(wsPath);\n for (const ag of agents) {\n if (!ag.isDirectory()) continue;\n const dbPath = path.join(wsPath, ag.name, 'store.db');\n const dbEntries = await readdirSafe(path.join(wsPath, ag.name));\n const hasStoreDb = dbEntries.some((e) => e.isFile() && e.name === 'store.db');\n if (!hasStoreDb) continue;\n yield {\n filePath: dbPath,\n workspaceId: ws.name,\n agentId: ag.name,\n };\n }\n }\n}\n\nasync function readdirSafe(dir: string): Promise<import('node:fs').Dirent[]> {\n try {\n return await readdir(dir, { withFileTypes: true });\n } catch {\n return [];\n }\n}\n"],"mappings":";;;AAAA,SAAS,aAAa,mBAAmB;AACzC,SAAS,QAAQ,OAAO,UAAU,MAAM,iBAAiB;AACzD,OAAO,QAAQ;AACf,OAAO,UAAU;;;ACHjB,OAAO,cAAiE;AAIjE,SAAS,OAAOA,QAAkB;AACvC,QAAM,KAAK,IAAI,SAASA,MAAI;AAC5B,KAAG,OAAO,oBAAoB;AAC9B,KAAG,OAAO,mBAAmB;AAC7B,KAAG,OAAO,sBAAsB;AAEhC,KAAG,OAAO,qBAAqB;AAC/B,SAAO;AACT;AAEO,SAAS,QAAQ,IAAc;AACpC,KAAG,MAAM;AACX;AAEA,IAAM,YAAY,oBAAI,QAAoC;AAWnD,SAAS,QACd,IACA,KAC0B;AAC1B,MAAI,QAAQ,UAAU,IAAI,EAAE;AAC5B,MAAI,CAAC,OAAO;AACV,YAAQ,oBAAI,IAAI;AAChB,cAAU,IAAI,IAAI,KAAK;AAAA,EACzB;AACA,MAAI,OAAO,MAAM,IAAI,GAAG;AACxB,MAAI,CAAC,MAAM;AACT,WAAO,GAAG,QAAQ,GAAG;AACrB,UAAM,IAAI,KAAK,IAAI;AAAA,EACrB;AACA,SAAO;AACT;AAEO,SAAS,cAAiB,IAAQ,IAAgB;AACvD,QAAM,UAAU,GAAG,YAAY,EAAE;AACjC,SAAO,QAAQ;AACjB;;;AC9CO,IAAM,eAAe,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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","names":["path","mkdir","readFile","writeFile","path","path","mkdir","writeFile","readFile","sourceFileId","sessionId","access","mkdir","readFile","stat","writeFile","path","stat","readFile","path","mkdir","writeFile","access","sessionId","mkdir","writeFile","path","mkdir","writeFile","path","require","sessionId","mkdir","rm","writeFile","path","path","mkdir","rm","writeFile","readFile","path","path","path","readFile","rawRecordId","sessionId","turnId","messageId","eventId","toolCallId","readFile","path","readdir","path","PREVIEW_MAX","addCounts","linkSubagentParents","emptyFileCounts","path","readFile","rawRecordId","sessionId","messageId","eventId","buildSearchDocs","flushPending","inferCommandFromArgs","inferPathFromArgs","canonicalToolType","stringifyOrNull","readFile","path","readFile","readdir","path","readdirSafe","PREVIEW_MAX","addCounts","emptyFileCounts","path","readFile","buildSearchDocs","flushPending","sessionId","sourceFileId","rawRecordId","messageId","eventId","toolCallId","canonicalToolType","path","Database","readdir","path","readdirSafe","PREVIEW_MAX","addCounts","emptyFileCounts","path","Database","messageId","eventId","pushTextBlock","buildSearchDocs","flushPending","rawRecordId","sessionId","canonicalToolType","stringifyOrNull"]}