@c3-oss/prosa 0.3.2 → 0.5.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.
- package/README.md +68 -20
- package/dist/bin/prosa.js +2033 -1082
- package/dist/bin/prosa.js.map +1 -1
- package/dist/cli/main.js +2033 -1082
- package/dist/cli/main.js.map +1 -1
- package/dist/index.d.ts +88 -12
- package/dist/index.js +988 -97
- package/dist/index.js.map +1 -1
- package/package.json +2 -1
package/dist/bin/prosa.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/db.ts","../../src/core/errors.ts","../../src/core/cas/compress.ts","../../src/core/cas/hash.ts","../../src/core/cas/index.ts","../../src/services/indexing.ts","../../src/core/limits.ts","../../src/services/search.ts","../../src/services/sessions.ts","../../src/tui/use-visible-window.ts","../../src/tui/App.tsx","../../src/cli/main.ts","../../src/core/version.ts","../../src/cli/commands/compile.ts","../../src/core/bundle.ts","../../src/core/schema/sql/001_init.ts","../../src/core/schema/sql/002_search_index_status.ts","../../src/core/schema/migrate.ts","../../src/services/compile.ts","../../src/importers/claude/index.ts","../../src/core/domain/ids.ts","../../src/core/ingest/batch.ts","../../src/core/ingest/idempotency.ts","../../src/importers/claude/discover.ts","../../src/importers/codex/index.ts","../../src/importers/codex/discover.ts","../../src/importers/cursor/index.ts","../../src/importers/cursor/discover.ts","../../src/importers/gemini/index.ts","../../src/importers/gemini/discover.ts","../../src/services/export/parquet.ts","../../src/cli/logger.ts","../../src/cli/commands/export.ts","../../src/services/export/markdown.ts","../../src/cli/bundle.ts","../../src/cli/commands/index.ts","../../src/cli/output.ts","../../src/cli/commands/init.ts","../../src/cli/commands/mcp.ts","../../src/mcp/server.ts","../../src/mcp/guidance.ts","../../src/mcp/tools.ts","../../src/core/domain/types.ts","../../src/cli/parsers.ts","../../src/cli/commands/query.ts","../../src/cli/commands/search.ts","../../src/cli/commands/sessions.ts","../../src/cli/commands/tui.ts","../../src/bin/prosa.ts"],"sourcesContent":["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","export const getErrorMessage = (err: unknown): string =>\n err instanceof Error ? err.message : String(err);\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 { 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 * Per-process cache of directories we've already mkdir'd. The CAS fanout\n * creates `objects/blake3/ab/cd/` for 65k possible leaves; calling\n * `mkdir(... { recursive: true })` for every staged object during a large\n * import was a measurable cost. Cache by absolute path.\n */\nconst ensuredDirs = new Set<string>();\n\nexport async function ensureDir(absoluteDir: string): Promise<void> {\n if (ensuredDirs.has(absoluteDir)) return;\n await mkdir(absoluteDir, { recursive: true });\n ensuredDirs.add(absoluteDir);\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 ensureDir(path.dirname(absolutePath));\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\n// -- Staging API for high-volume importers ---------------------------------\n//\n// Importers parse thousands of records per file and call putBytes/putJson per\n// record. Doing each as its own SQLite auto-commit + mkdir + writeFile is the\n// dominant cost on a fresh import. The staging API splits CAS work into:\n//\n// 1. stageBytes/stageJson/stageText — synchronous; computes the blake3 hash,\n// builds the ObjectId, and accumulates pending bytes in a per-batch Map\n// deduped by ObjectId. Returns the ObjectId immediately so the rest of\n// the importer can reference it.\n// 2. flushPendingObjects — async; runs once per batch. Bulk-checks which\n// ObjectIds already exist, writes the missing files in parallel, then\n// bulk-inserts the new `objects` rows in a single transaction.\n//\n// The shape lets importers keep their existing\n// `transactional(bundle.db, () => flushPending(...))` block as the only\n// SQLite write boundary for the file, with `flushPendingObjects` running just\n// before that (FS writes can't run inside a sync transaction).\n\nexport interface StagedObject {\n objectId: ObjectId;\n hash: string;\n bytes: Buffer;\n mimeType: string | null;\n encoding: string | null;\n}\n\nexport interface PendingObjects {\n byId: Map<ObjectId, StagedObject>;\n}\n\nexport function createPendingObjects(): PendingObjects {\n return { byId: new Map() };\n}\n\nexport function stageBytes(\n pending: PendingObjects,\n bytes: Uint8Array,\n options: PutOptions = {},\n): ObjectId {\n const buf = Buffer.isBuffer(bytes) ? bytes : Buffer.from(bytes);\n const hash = blake3Hex(buf);\n const objectId = objectIdFromHash(hash);\n if (!pending.byId.has(objectId)) {\n pending.byId.set(objectId, {\n objectId,\n hash,\n bytes: buf,\n mimeType: options.mimeType ?? null,\n encoding: options.encoding ?? null,\n });\n }\n return objectId;\n}\n\nexport function stageText(\n pending: PendingObjects,\n text: string,\n options: { mimeType?: string } = {},\n): ObjectId {\n return stageBytes(pending, Buffer.from(text, 'utf8'), {\n mimeType: options.mimeType ?? 'text/plain; charset=utf-8',\n encoding: 'utf-8',\n });\n}\n\nexport function stageJson(pending: PendingObjects, value: unknown): ObjectId {\n return stageBytes(pending, Buffer.from(JSON.stringify(value), 'utf8'), {\n mimeType: 'application/json',\n encoding: 'utf-8',\n });\n}\n\n/**\n * Flush every staged object to disk and to the `objects` table.\n *\n * Writes happen before the caller's domain transaction starts because\n * better-sqlite3 transactions are synchronous and we want to overlap the\n * filesystem writes with each other. The `objects` rows are inserted with\n * INSERT OR IGNORE, so any rows another writer added between our existence\n * check and our insert are tolerated.\n */\nexport async function flushPendingObjects(bundle: Bundle, pending: PendingObjects): Promise<void> {\n if (pending.byId.size === 0) return;\n\n const ids = [...pending.byId.keys()];\n const existingIds = queryExistingObjectIds(bundle, ids);\n\n // Compress once. The same buffer + path are reused for the FS write and\n // the `objects` row.\n interface PreparedObject {\n staged: StagedObject;\n compression: Compression;\n compressedBytes: Buffer;\n storagePath: string;\n absolutePath: string;\n }\n const toWrite: PreparedObject[] = [];\n for (const obj of pending.byId.values()) {\n if (existingIds.has(obj.objectId)) continue;\n const { bytes: compressedBytes, compression } = compressBytes(obj.bytes);\n const storagePath = objectStoragePath(obj.hash, compression);\n toWrite.push({\n staged: obj,\n compression,\n compressedBytes,\n storagePath,\n absolutePath: path.join(bundle.path, storagePath),\n });\n }\n\n if (toWrite.length > 0) {\n await writeFilesParallel(toWrite);\n }\n\n const insertObject = prepare(\n bundle.db,\n `INSERT OR IGNORE 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 );\n const now = new Date().toISOString();\n for (const p of toWrite) {\n insertObject.run(\n p.staged.objectId,\n p.staged.hash,\n p.staged.bytes.byteLength,\n p.compression === 'zstd' ? p.compressedBytes.byteLength : null,\n p.compression,\n p.staged.mimeType,\n p.staged.encoding,\n p.storagePath,\n now,\n );\n }\n}\n\nfunction queryExistingObjectIds(bundle: Bundle, ids: ObjectId[]): Set<ObjectId> {\n const found = new Set<ObjectId>();\n if (ids.length === 0) return found;\n // SQLite's default SQLITE_LIMIT_VARIABLE_NUMBER is 32766; chunk well under\n // that for safety.\n const CHUNK = 500;\n for (let start = 0; start < ids.length; start += CHUNK) {\n const slice = ids.slice(start, start + CHUNK);\n const placeholders = slice.map(() => '?').join(',');\n const rows = bundle.db\n .prepare<ObjectId[], { object_id: ObjectId }>(\n `SELECT object_id FROM objects WHERE object_id IN (${placeholders})`,\n )\n .all(...slice);\n for (const row of rows) found.add(row.object_id);\n }\n return found;\n}\n\nconst FS_WRITE_CONCURRENCY = 16;\n\nasync function writeFilesParallel(\n tasks: { absolutePath: string; compressedBytes: Buffer }[],\n): Promise<void> {\n let cursor = 0;\n const workers: Promise<void>[] = [];\n const limit = Math.min(FS_WRITE_CONCURRENCY, tasks.length);\n for (let w = 0; w < limit; w++) {\n workers.push(\n (async () => {\n while (true) {\n const i = cursor++;\n if (i >= tasks.length) return;\n const task = tasks[i]!;\n await ensureDir(path.dirname(task.absolutePath));\n await writeFile(task.absolutePath, task.compressedBytes);\n }\n })(),\n );\n }\n await Promise.all(workers);\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';\nimport { getErrorMessage } from '../core/errors.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: getErrorMessage(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: getErrorMessage(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","export interface ClampLimitOptions {\n min?: number;\n max: number;\n fallback: number;\n}\n\nexport function clampLimit(value: number | undefined, opts: ClampLimitOptions): number {\n return Math.max(opts.min ?? 1, Math.min(opts.max, value ?? opts.fallback));\n}\n","import { existsSync } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport type { Bundle } from '../core/bundle.js';\nimport { getErrorMessage } from '../core/errors.js';\nimport { clampLimit } from '../core/limits.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 = clampLimit(options.limit, { max: 500, fallback: 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 = clampLimit(options.limit, { max: 500, fallback: 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(`tantivy engine is unavailable: ${getErrorMessage(error)}`);\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 type { Bundle } from '../core/bundle.js';\nimport type { Confidence, SourceTool } from '../core/domain/types.js';\nimport { clampLimit } from '../core/limits.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 = clampLimit(filters.limit, { max: 1000, fallback: 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","/**\n * Compute a window of visible items centered on `selectedIndex` so the\n * selection stays in view as the user scrolls. Mirrors the helper from\n * `mzi-tfplan-explorer/components/visible-window.ts`.\n */\nexport function visibleWindow(args: {\n total: number;\n selectedIndex: number;\n height: number;\n}): { startIndex: number; endIndex: number } {\n const { total, selectedIndex, height } = args;\n if (total === 0 || height <= 0) return { startIndex: 0, endIndex: 0 };\n const safeHeight = Math.min(height, total);\n let startIndex = Math.max(0, selectedIndex - Math.floor(safeHeight / 2));\n if (startIndex + safeHeight > total) startIndex = total - safeHeight;\n if (startIndex < 0) startIndex = 0;\n const endIndex = Math.min(total, startIndex + safeHeight);\n return { startIndex, endIndex };\n}\n\nexport function clamp(value: number, min: number, max: number): number {\n if (value < min) return min;\n if (value > max) return max;\n return value;\n}\n","import { Box, Text, useApp, useInput, useStdout } from 'ink';\nimport { useEffect, useMemo, useState } from 'react';\nimport type { Bundle } from '../core/bundle.js';\nimport type { SourceTool } from '../core/domain/types.js';\nimport { type SearchHit, searchFullText } from '../services/search.js';\nimport {\n type SessionDetail,\n type SessionRow,\n getSession,\n listSessions,\n} from '../services/sessions.js';\nimport { clamp, visibleWindow } from './use-visible-window.js';\n\ntype Screen = 'sessions' | 'detail' | 'search';\ntype InputMode = 'normal' | 'search';\n\ninterface Props {\n bundle: Bundle;\n}\n\nconst TOOL_FILTERS: (SourceTool | 'all')[] = ['all', 'codex', 'claude', 'gemini', 'cursor'];\n\nexport function App({ bundle }: Props): React.JSX.Element {\n const { exit } = useApp();\n const { stdout } = useStdout();\n const [rows, setRows] = useState<SessionRow[]>([]);\n const [selected, setSelected] = useState(0);\n const [screen, setScreen] = useState<Screen>('sessions');\n const [detail, setDetail] = useState<SessionDetail | null>(null);\n const [detailScroll, setDetailScroll] = useState(0);\n const [toolFilterIdx, setToolFilterIdx] = useState(0);\n const [inputMode, setInputMode] = useState<InputMode>('normal');\n const [searchBuffer, setSearchBuffer] = useState('');\n const [searchHits, setSearchHits] = useState<SearchHit[]>([]);\n const [pendingG, setPendingG] = useState(false);\n const [statusMessage, setStatusMessage] = useState<string | null>(null);\n\n const termHeight = stdout?.rows ?? 24;\n const listHeight = Math.max(5, termHeight - 6);\n const detailHeight = Math.max(5, termHeight - 4);\n\n const toolFilter = TOOL_FILTERS[toolFilterIdx];\n\n // Reload sessions whenever the active filter changes.\n useEffect(() => {\n const filtered = listSessions(bundle, {\n sourceTool: toolFilter === 'all' ? undefined : (toolFilter as SourceTool),\n limit: 500,\n });\n setRows(filtered);\n setSelected(0);\n }, [bundle, toolFilter]);\n\n const visible = useMemo(\n () => visibleWindow({ total: rows.length, selectedIndex: selected, height: listHeight }),\n [rows.length, selected, listHeight],\n );\n\n useInput((input, key) => {\n if (inputMode === 'search') {\n if (key.escape) {\n setInputMode('normal');\n setSearchBuffer('');\n return;\n }\n if (key.return) {\n if (searchBuffer.trim().length > 0) {\n const hits = searchFullText(bundle, { query: searchBuffer.trim(), limit: 200 });\n setSearchHits(hits);\n setScreen('search');\n setSelected(0);\n }\n setInputMode('normal');\n return;\n }\n if (key.backspace || key.delete) {\n setSearchBuffer((b) => b.slice(0, -1));\n return;\n }\n if (input && !key.ctrl && !key.meta) {\n setSearchBuffer((b) => b + input);\n }\n return;\n }\n\n // ---- normal mode ----\n if (input === 'q' && screen === 'sessions') {\n exit();\n return;\n }\n\n if (key.escape) {\n if (screen === 'detail' || screen === 'search') {\n setScreen('sessions');\n setDetail(null);\n setDetailScroll(0);\n setSelected(0);\n }\n return;\n }\n\n if (input === '/') {\n setInputMode('search');\n setSearchBuffer('');\n return;\n }\n\n if (input === 's' && screen === 'sessions') {\n setToolFilterIdx((i) => (i + 1) % TOOL_FILTERS.length);\n return;\n }\n\n if (input === 'R') {\n // Reload current view.\n if (screen === 'sessions' || screen === 'search') {\n const reloaded = listSessions(bundle, {\n sourceTool: toolFilter === 'all' ? undefined : (toolFilter as SourceTool),\n limit: 500,\n });\n setRows(reloaded);\n setStatusMessage(`reloaded ${reloaded.length} sessions`);\n }\n return;\n }\n\n // Navigation works in any list-like screen.\n const length =\n screen === 'sessions' ? rows.length : screen === 'search' ? searchHits.length : 0;\n\n if (screen === 'detail') {\n const totalLines = (detail?.events.length ?? 0) + 8; // rough header height\n if (input === 'j' || key.downArrow) {\n setDetailScroll((s) => clamp(s + 1, 0, Math.max(0, totalLines - detailHeight)));\n return;\n }\n if (input === 'k' || key.upArrow) {\n setDetailScroll((s) => clamp(s - 1, 0, Math.max(0, totalLines - detailHeight)));\n return;\n }\n if (input === 'G') {\n setDetailScroll(Math.max(0, totalLines - detailHeight));\n return;\n }\n if (input === 'g') {\n if (pendingG) {\n setDetailScroll(0);\n setPendingG(false);\n } else {\n setPendingG(true);\n setTimeout(() => setPendingG(false), 500);\n }\n return;\n }\n if (key.ctrl && input === 'd') {\n setDetailScroll((s) => clamp(s + Math.floor(detailHeight / 2), 0, totalLines));\n return;\n }\n if (key.ctrl && input === 'u') {\n setDetailScroll((s) => clamp(s - Math.floor(detailHeight / 2), 0, totalLines));\n return;\n }\n return;\n }\n\n if (length === 0) return;\n\n if (input === 'j' || key.downArrow) {\n setSelected((i) => clamp(i + 1, 0, length - 1));\n return;\n }\n if (input === 'k' || key.upArrow) {\n setSelected((i) => clamp(i - 1, 0, length - 1));\n return;\n }\n if (input === 'G') {\n setSelected(length - 1);\n return;\n }\n if (input === 'g') {\n if (pendingG) {\n setSelected(0);\n setPendingG(false);\n } else {\n setPendingG(true);\n setTimeout(() => setPendingG(false), 500);\n }\n return;\n }\n if (key.ctrl && input === 'd') {\n setSelected((i) => clamp(i + Math.floor(listHeight / 2), 0, length - 1));\n return;\n }\n if (key.ctrl && input === 'u') {\n setSelected((i) => clamp(i - Math.floor(listHeight / 2), 0, length - 1));\n return;\n }\n if (key.return) {\n const sid =\n screen === 'sessions' ? rows[selected]?.session_id : searchHits[selected]?.session_id;\n if (sid) {\n const d = getSession(bundle, sid);\n if (d) {\n setDetail(d);\n setScreen('detail');\n setDetailScroll(0);\n }\n }\n }\n });\n\n useEffect(() => {\n if (!statusMessage) return;\n const t = setTimeout(() => setStatusMessage(null), 2000);\n return () => clearTimeout(t);\n }, [statusMessage]);\n\n if (screen === 'detail' && detail) {\n return <DetailView detail={detail} scroll={detailScroll} height={detailHeight} />;\n }\n\n if (screen === 'search') {\n return (\n <Box flexDirection=\"column\">\n <Box>\n <Text color=\"cyan\" bold>\n search:{' '}\n </Text>\n <Text>{searchHits.length} hits</Text>\n </Box>\n <SearchList hits={searchHits} selected={selected} height={listHeight} />\n <HelpBar\n mode=\"search\"\n inputMode={inputMode}\n searchBuffer={searchBuffer}\n status={statusMessage}\n />\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\">\n <FilterBar toolFilter={toolFilter} count={rows.length} />\n <SessionList rows={rows} selected={selected} window={visible} height={listHeight} />\n <HelpBar\n mode=\"sessions\"\n inputMode={inputMode}\n searchBuffer={searchBuffer}\n status={statusMessage}\n />\n </Box>\n );\n}\n\nfunction FilterBar({\n toolFilter,\n count,\n}: {\n toolFilter: SourceTool | 'all' | undefined;\n count: number;\n}): React.JSX.Element {\n return (\n <Box>\n <Text color=\"cyan\" bold>\n prosa\n </Text>\n <Text> · sessions</Text>\n <Text dimColor> · </Text>\n <Text>source: </Text>\n <Text color=\"yellow\">{toolFilter}</Text>\n <Text dimColor> · </Text>\n <Text>count: </Text>\n <Text color=\"green\">{count}</Text>\n </Box>\n );\n}\n\nfunction SessionList({\n rows,\n selected,\n window,\n height,\n}: {\n rows: SessionRow[];\n selected: number;\n window: { startIndex: number; endIndex: number };\n height: number;\n}): React.JSX.Element {\n const slice = rows.slice(window.startIndex, window.endIndex);\n return (\n <Box flexDirection=\"column\" height={height}>\n {slice.map((row, i) => {\n const realIndex = window.startIndex + i;\n const isSelected = realIndex === selected;\n return (\n <Box key={row.session_id}>\n <Text\n color={isSelected ? 'black' : undefined}\n backgroundColor={isSelected ? 'cyan' : undefined}\n >\n {`${isSelected ? '› ' : ' '}${pad(row.start_ts ?? '—', 24)} ${pad(row.source_tool, 7)} ${pad(row.message_count.toString(), 5)} ${pad(row.tool_call_count.toString(), 5)} ${trim(row.cwd_initial ?? '—', 32)} ${trim(row.title ?? row.source_session_id, 30)}`}\n </Text>\n </Box>\n );\n })}\n </Box>\n );\n}\n\nfunction SearchList({\n hits,\n selected,\n height,\n}: {\n hits: SearchHit[];\n selected: number;\n height: number;\n}): React.JSX.Element {\n const window = visibleWindow({ total: hits.length, selectedIndex: selected, height });\n const slice = hits.slice(window.startIndex, window.endIndex);\n return (\n <Box flexDirection=\"column\" height={height}>\n {slice.map((hit, i) => {\n const realIndex = window.startIndex + i;\n const isSelected = realIndex === selected;\n return (\n <Box key={hit.doc_id}>\n <Text\n color={isSelected ? 'black' : undefined}\n backgroundColor={isSelected ? 'cyan' : undefined}\n >\n {`${isSelected ? '› ' : ' '}${pad(hit.timestamp ?? '—', 24)} ${pad(hit.role ?? '—', 10)} ${trim(hit.session_id ?? '—', 16)} ${trim(hit.snippet.replace(/\\s+/g, ' '), 80)}`}\n </Text>\n </Box>\n );\n })}\n </Box>\n );\n}\n\nfunction DetailView({\n detail,\n scroll,\n height,\n}: {\n detail: SessionDetail;\n scroll: number;\n height: number;\n}): React.JSX.Element {\n const headerLines = [\n `# session ${detail.session.session_id}`,\n `source: ${detail.session.source_tool} · start: ${detail.session.start_ts ?? '—'}`,\n `cwd: ${detail.session.cwd_initial ?? '—'} · branch: ${detail.session.git_branch_initial ?? '—'}`,\n `models: ${detail.session.model_first ?? '?'} → ${detail.session.model_last ?? '?'}`,\n `messages: ${detail.session.message_count} · tool_calls: ${detail.session.tool_call_count} · confidence: ${detail.session.timeline_confidence}`,\n '',\n ];\n const eventLines = detail.events.map((e) => {\n const role = e.role ? `[${e.role}] ` : '';\n const tool = e.tool_name ? ` tool=${e.tool_name}` : '';\n const err = e.is_error === 1 ? ' ERROR' : '';\n const ts = e.timestamp ?? '';\n return `${pad(ts, 24)} ${pad(e.event_type, 18)} ${role}${tool}${err}`;\n });\n const allLines = [...headerLines, ...eventLines];\n const slice = allLines.slice(scroll, scroll + height);\n return (\n <Box flexDirection=\"column\" height={height}>\n {slice.map((line, idx) => {\n // Detail lines are content-derived; the (scroll, idx) pair is unique\n // within a render and we don't reorder them, so it's safe as a key.\n const key = `l${scroll + idx}-${line.length}`;\n return <Text key={key}>{line}</Text>;\n })}\n <Box marginTop={1}>\n <Text dimColor>j/k scroll · gg/G top/bottom · Esc back · q quits from sessions</Text>\n </Box>\n </Box>\n );\n}\n\nfunction HelpBar({\n mode,\n inputMode,\n searchBuffer,\n status,\n}: {\n mode: 'sessions' | 'search';\n inputMode: InputMode;\n searchBuffer: string;\n status: string | null;\n}): React.JSX.Element {\n if (inputMode === 'search') {\n return (\n <Box>\n <Text color=\"yellow\">/ </Text>\n <Text>{searchBuffer}</Text>\n <Text inverse>_</Text>\n <Text dimColor> · Enter to run · Esc to cancel</Text>\n </Box>\n );\n }\n return (\n <Box>\n {status ? (\n <Text color=\"green\">{status}</Text>\n ) : (\n <Text dimColor>\n j/k nav · Enter open · / search · s cycle source · R reload · Esc back · q quit\n {mode === 'search' ? '' : ''}\n </Text>\n )}\n </Box>\n );\n}\n\nfunction pad(s: string, n: number): string {\n if (s.length >= n) return s.slice(0, n);\n return s + ' '.repeat(n - s.length);\n}\n\nfunction trim(s: string, n: number): string {\n if (s.length <= n) return pad(s, n);\n return `${s.slice(0, n - 1)}…`;\n}\n","#!/usr/bin/env node\nimport { Command } from 'commander';\nimport { PROSA_PARSER_VERSION } from '../core/version.js';\nimport { compileAllCommand, compileCommand } from './commands/compile.js';\nimport { exportCommand } from './commands/export.js';\nimport { indexCommand } from './commands/index.js';\nimport { initCommand } from './commands/init.js';\nimport { mcpCommand } from './commands/mcp.js';\nimport { queryCommand } from './commands/query.js';\nimport { searchCommand } from './commands/search.js';\nimport { sessionsCommand } from './commands/sessions.js';\nimport { tuiCommand } from './commands/tui.js';\n\nexport async function runCli(argv: readonly string[]): Promise<void> {\n const program = new Command()\n .name('prosa')\n .enablePositionalOptions()\n .description(\n 'Compile, search and export local agent session histories\\n' +\n '(Cursor, Codex CLI, Claude Code, Gemini CLI) into one canonical store.',\n )\n .version(PROSA_PARSER_VERSION, '-v, --version');\n\n program.addCommand(initCommand());\n program.addCommand(compileCommand());\n program.addCommand(compileAllCommand());\n program.addCommand(indexCommand());\n program.addCommand(sessionsCommand());\n program.addCommand(searchCommand());\n program.addCommand(exportCommand());\n program.addCommand(queryCommand());\n program.addCommand(mcpCommand());\n program.addCommand(tuiCommand());\n\n await program.parseAsync([...argv]);\n}\n\n// Auto-execute when invoked as the entry point (`node dist/cli/main.js …` or\n// via the `prosa` bin shim). Importing this file as a library still gives\n// `runCli` without side effects.\nconst isEntry = import.meta.url === `file://${process.argv[1]}`;\nif (isEntry) {\n runCli(process.argv).catch((error: unknown) => {\n process.stderr.write(\n `${error instanceof Error ? (error.stack ?? error.message) : String(error)}\\n`,\n );\n process.exit(1);\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 { Command } from 'commander';\nimport { closeBundle, defaultBundlePath, openBundle } from '../../core/bundle.js';\nimport {\n COMPILE_PROVIDERS,\n type CompileProviderConfig,\n type ProviderCompileSummary,\n exportCompileParquet,\n resolveCompilePath,\n runCompileImports,\n} from '../../services/compile.js';\nimport { type CliLoggerOptions, createCliLogger } from '../logger.js';\n\nexport function compileCommand(): Command {\n const command = addCompileLogOptions(\n new Command('compile').description(\n 'Import session histories from one agent CLI into the bundle.',\n ),\n );\n\n for (const provider of COMPILE_PROVIDERS) {\n command.addCommand(providerCompileCommand(provider));\n }\n\n command.action(() => {\n command.help({ error: true });\n });\n\n return command;\n}\n\nexport function compileAllCommand(): Command {\n return addCompileLogOptions(new Command('compile-all'))\n .description('Import all agent CLI session histories using default source paths.')\n .option('--defer-index', 'skip immediate FTS5 updates; run `prosa index fts5` later')\n .action(async (options: CliLoggerOptions & { deferIndex?: boolean }) => {\n await runCompiles({\n providers: COMPILE_PROVIDERS,\n storePath: defaultBundlePath(),\n deferIndex: options.deferIndex ?? false,\n logOptions: options,\n });\n });\n}\n\nfunction providerCompileCommand(provider: CompileProviderConfig): Command {\n return addCompileLogOptions(new Command(provider.name))\n .description(provider.description)\n .option(\n '--sessions-path <path>',\n `${provider.pathHelp} (default: ${provider.defaultSessionsPath()})`,\n provider.defaultSessionsPath(),\n )\n .option('--store <path>', 'bundle directory', defaultBundlePath())\n .option('--defer-index', 'skip immediate FTS5 updates; run `prosa index fts5` later')\n .action(\n async (\n options: {\n sessionsPath: string;\n store: string;\n deferIndex?: boolean;\n },\n command: Command,\n ) => {\n await runCompiles({\n providers: [provider],\n storePath: options.store,\n deferIndex: options.deferIndex ?? false,\n sessionsPath: options.sessionsPath,\n logOptions: command.optsWithGlobals() as CliLoggerOptions,\n });\n },\n );\n}\n\nfunction addCompileLogOptions(command: Command): Command {\n return command\n .option('--verbose', 'emit debug logs during compilation')\n .option('--json-logs', 'emit raw newline-delimited JSON logs instead of pretty logs');\n}\n\nasync function runCompiles(options: {\n providers: CompileProviderConfig[];\n storePath: string;\n deferIndex: boolean;\n sessionsPath?: string;\n logOptions: CliLoggerOptions;\n}): Promise<void> {\n const logger = createCliLogger(options.logOptions);\n const storePath = resolveCompilePath(options.storePath);\n logger.info({ store_path: storePath }, 'opening bundle');\n const bundle = await openBundle(storePath);\n let importedAny = false;\n try {\n const result = await runCompileImports({\n bundle,\n providers: options.providers,\n deferIndex: options.deferIndex,\n sessionsPath: options.sessionsPath,\n logger,\n onProviderComplete: printCounts,\n onTantivyComplete: (status) => {\n process.stdout.write(`tantivy: indexed ${status.indexedDocCount} docs\\n`);\n },\n });\n importedAny = result.importedAny;\n } finally {\n closeBundle(bundle);\n logger.info({ store_path: storePath }, 'bundle closed');\n }\n\n // Parquet rebuild runs after the bundle is closed: exportBundleParquet\n // opens its own bundle handle and DuckDB attaches the SQLite file\n // directly, so we avoid any contention. As with Tantivy, failures are\n // logged but don't fail the compile — the user can re-run with\n // `prosa export parquet`.\n if (importedAny) {\n try {\n const result = await exportCompileParquet({ storePath, logger });\n process.stdout.write(`parquet: wrote ${result.tableCount} tables to ${result.outDir}\\n`);\n } catch (error) {\n logger.error({ err: error }, 'parquet export failed; SQLite data is intact');\n }\n }\n}\n\nfunction printCounts(summary: ProviderCompileSummary): void {\n const c = summary.counts;\n process.stdout.write(\n `${summary.source} import: batch=${summary.batchId}\\n` +\n ` source_files seen=${c.source_files_seen} imported=${c.source_files_imported} skipped=${c.source_files_skipped}\\n` +\n ` sessions=${c.sessions} turns=${c.turns} messages=${c.messages} blocks=${c.content_blocks}\\n` +\n ` events=${c.events} tool_calls=${c.tool_calls} tool_results=${c.tool_results}\\n` +\n ` artifacts=${c.artifacts} edges=${c.edges} errors=${c.errors}\\n`,\n );\n}\n","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\n/**\n * Open an existing bundle or transparently initialize one if the store path is\n * missing or has not been initialized yet.\n */\nexport async function openOrInitBundle(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 && !dirStat.isDirectory()) {\n throw new Error(`bundle path not found or not a directory: ${resolved}`);\n }\n\n if (!dirStat || !(await exists(paths.manifest))) {\n return await initBundle(resolved);\n }\n\n return await openBundle(resolved);\n}\n\nexport function closeBundle(bundle: Bundle): void {\n closeDb(bundle.db);\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","import os from 'node:os';\nimport path from 'node:path';\nimport type { Bundle } from '../core/bundle.js';\nimport type { SourceTool } from '../core/domain/types.js';\nimport { getErrorMessage } from '../core/errors.js';\nimport type { ImportBatch, ImportCounts } from '../core/ingest/batch.js';\nimport { compileClaude } from '../importers/claude/index.js';\nimport { compileCodex } from '../importers/codex/index.js';\nimport type { CompileLogger, CompileOptions } from '../importers/compile-options.js';\nimport { compileCursor } from '../importers/cursor/index.js';\nimport { compileGemini } from '../importers/gemini/index.js';\nimport { exportBundleParquet } from './export/parquet.js';\nimport {\n disableFts5Triggers,\n enableFts5Triggers,\n markIndexesAfterImport,\n rebuildTantivyIndex,\n} from './indexing.js';\n\ninterface CompileResult {\n batch: ImportBatch;\n counts: ImportCounts;\n}\n\nexport interface CompileProviderConfig {\n name: SourceTool;\n description: string;\n pathHelp: string;\n defaultSessionsPath: () => string;\n compile: (bundle: Bundle, root: string, options?: CompileOptions) => Promise<CompileResult>;\n}\n\nexport interface ProviderCompileSummary {\n source: SourceTool;\n sourcePath: string;\n batchId: string;\n batch: ImportBatch;\n counts: ImportCounts;\n}\n\nexport interface TantivyCompileSummary {\n indexedDocCount: number;\n}\n\nexport interface CompileImportSummary {\n providers: ProviderCompileSummary[];\n importedAny: boolean;\n tantivy: TantivyCompileSummary | null;\n tantivyError: string | null;\n}\n\nexport interface ParquetCompileSummary {\n outDir: string;\n manifestPath: string;\n tableCount: number;\n files: Record<string, string>;\n counts: Record<string, number>;\n}\n\nexport const COMPILE_PROVIDERS: CompileProviderConfig[] = [\n {\n name: 'codex',\n description: 'Import Codex CLI session histories into the bundle.',\n pathHelp: 'root of Codex CLI sessions',\n defaultSessionsPath: () => path.join(os.homedir(), '.codex', 'sessions'),\n compile: compileCodex,\n },\n {\n name: 'claude',\n description: 'Import Claude Code project histories into the bundle.',\n pathHelp: 'root of Claude Code projects',\n defaultSessionsPath: () => path.join(os.homedir(), '.claude', 'projects'),\n compile: compileClaude,\n },\n {\n name: 'gemini',\n description: 'Import Gemini CLI session histories into the bundle.',\n pathHelp: 'root of Gemini CLI tmp dir',\n defaultSessionsPath: () => path.join(os.homedir(), '.gemini', 'tmp'),\n compile: compileGemini,\n },\n {\n name: 'cursor',\n description: 'Import Cursor agent stores into the bundle.',\n pathHelp: 'root of Cursor agent stores',\n defaultSessionsPath: () => path.join(os.homedir(), '.cursor', 'chats'),\n compile: compileCursor,\n },\n];\n\nexport function getCompileProvider(source: SourceTool): CompileProviderConfig {\n const provider = COMPILE_PROVIDERS.find((p) => p.name === source);\n if (!provider) {\n throw new Error(`unknown compile source: ${source}`);\n }\n return provider;\n}\n\nexport function resolveCompilePath(p: string): string {\n if (p === '~') return os.homedir();\n if (p.startsWith('~/')) return path.join(os.homedir(), p.slice(2));\n return path.resolve(p);\n}\n\nexport async function runCompileImports(options: {\n bundle: Bundle;\n providers: CompileProviderConfig[];\n deferIndex: boolean;\n sessionsPath?: string;\n logger?: CompileLogger;\n onProviderComplete?: (summary: ProviderCompileSummary) => void;\n onTantivyComplete?: (summary: TantivyCompileSummary) => void;\n}): Promise<CompileImportSummary> {\n const { bundle, providers, deferIndex, logger } = options;\n let importedAny = false;\n const summaries: ProviderCompileSummary[] = [];\n let tantivy: TantivyCompileSummary | null = null;\n let tantivyError: string | null = null;\n\n try {\n if (deferIndex) {\n logger?.info('disabling FTS5 triggers for deferred indexing');\n disableFts5Triggers(bundle);\n }\n\n for (const provider of providers) {\n const sourcePath = resolveCompilePath(options.sessionsPath ?? provider.defaultSessionsPath());\n const providerLogger = logger?.child({\n source_tool: provider.name,\n source_path: sourcePath,\n });\n providerLogger?.info('starting compile');\n const r = await provider.compile(bundle, sourcePath, { logger: providerLogger });\n importedAny ||= r.counts.source_files_imported > 0;\n providerLogger?.info(\n {\n batch_id: r.batch.batch_id,\n counts: r.counts,\n },\n 'compile finished',\n );\n\n const summary = {\n source: provider.name,\n sourcePath,\n batchId: r.batch.batch_id,\n batch: r.batch,\n counts: r.counts,\n };\n summaries.push(summary);\n options.onProviderComplete?.(summary);\n }\n\n logger?.info({ changed: importedAny, fts5_deferred: deferIndex }, 'marking indexes');\n markIndexesAfterImport(bundle, {\n changed: importedAny,\n fts5Deferred: deferIndex,\n });\n\n if (importedAny) {\n try {\n logger?.info('rebuilding tantivy index');\n const status = await rebuildTantivyIndex(bundle);\n tantivy = { indexedDocCount: status.indexed_doc_count };\n options.onTantivyComplete?.(tantivy);\n } catch (error) {\n tantivyError = getErrorMessage(error);\n logger?.error({ err: error }, 'tantivy rebuild failed; SQLite data is intact');\n }\n }\n } finally {\n if (deferIndex) {\n logger?.info('re-enabling FTS5 triggers');\n enableFts5Triggers(bundle);\n }\n }\n\n return {\n providers: summaries,\n importedAny,\n tantivy,\n tantivyError,\n };\n}\n\nexport async function exportCompileParquet(options: {\n storePath: string;\n logger?: CompileLogger;\n}): Promise<ParquetCompileSummary> {\n const storePath = resolveCompilePath(options.storePath);\n options.logger?.info({ store_path: storePath }, 'exporting parquet');\n const result = await exportBundleParquet({ bundlePath: storePath });\n return {\n outDir: result.outDir,\n manifestPath: result.manifestPath,\n tableCount: Object.keys(result.files).length,\n files: result.files,\n counts: result.counts,\n };\n}\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport type { Bundle } from '../../core/bundle.js';\nimport {\n type ObjectId,\n type PendingObjects,\n createPendingObjects,\n flushPendingObjects,\n stageBytes,\n stageJson,\n stageText,\n} 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 { getErrorMessage } from '../../core/errors.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 { CompileLogger, CompileOptions } from '../compile-options.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(\n bundle: Bundle,\n root: string,\n options: CompileOptions = {},\n): Promise<CompileResult> {\n const logger = options.logger;\n const batch = startBatch(bundle, 'claude', [root]);\n const counts = emptyCounts();\n logger?.info({ batch_id: batch.batch_id, root }, 'claude batch started');\n\n try {\n for await (const file of discoverClaudeFiles(root)) {\n counts.source_files_seen++;\n logger?.debug(\n {\n path: file.filePath,\n project_slug: file.projectSlug,\n is_subagent: file.isSubagent,\n },\n 'claude source file discovered',\n );\n try {\n const fc = await compileClaudeFile(bundle, batch, file, logger);\n addCounts(counts, fc);\n } catch (error) {\n counts.errors++;\n logger?.warn(\n {\n err: error,\n path: file.filePath,\n },\n 'claude source file failed',\n );\n await recordError(bundle, batch.batch_id, {\n kind: 'claude_file_failed',\n message: getErrorMessage(error),\n payload: { path: file.filePath },\n });\n }\n }\n linkSubagentParents(bundle);\n logger?.debug({ batch_id: batch.batch_id }, 'claude subagent parent links refreshed');\n finishBatch(bundle, batch, counts, 'completed');\n logger?.info({ batch_id: batch.batch_id, counts }, 'claude batch completed');\n } catch (error) {\n finishBatch(bundle, batch, counts, 'failed');\n logger?.error({ err: error, batch_id: batch.batch_id, counts }, 'claude batch 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 objects: PendingObjects;\n}\n\nasync function compileClaudeFile(\n bundle: Bundle,\n batch: ImportBatch,\n file: ClaudeFile,\n logger?: CompileLogger,\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 logger?.debug(\n { path: file.filePath, source_file_id: sourceFile.source_file_id },\n 'claude source file skipped',\n );\n return counts;\n }\n counts.source_files_imported = 1;\n logger?.debug(\n { path: file.filePath, source_file_id: sourceFile.source_file_id },\n 'claude source file registered',\n );\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 objects: createPendingObjects(),\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 = stageBytes(pending.objects, 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 // The raw line already IS the JSON for `parserStatus === 'ok'`, so we\n // skip storing a re-serialized copy as `decoded_json_object_id`. Saves\n // ~half the CAS writes per file. Nothing reads it back later.\n const decodedObjectId: ObjectId | null = 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 = stageText(pending.objects, 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 // Persist staged CAS objects (FS + objects rows) before the domain\n // transaction. better-sqlite3 transactions are sync, so we can't await\n // file writes inside them.\n await flushPendingObjects(bundle, pending.objects);\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 logger?.debug(\n { path: file.filePath, source_file_id: sourceFile.source_file_id, counts },\n 'claude source file imported',\n );\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 ? stageText(pending.objects, 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 ? stageText(pending.objects, 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 ? stageJson(pending.objects, 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 const overflowId = text.length > PREVIEW_MAX ? stageText(pending.objects, text) : null;\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: overflowId,\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: overflowId,\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 { 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, 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 { ensureDir } from '../cas/index.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 ensureDir(path.dirname(absolutePath));\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 { 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 {\n type ObjectId,\n type PendingObjects,\n createPendingObjects,\n flushPendingObjects,\n stageBytes,\n stageJson,\n stageText,\n} 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 { getErrorMessage } from '../../core/errors.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 { CompileLogger, CompileOptions } from '../compile-options.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(\n bundle: Bundle,\n root: string,\n options: CompileOptions = {},\n): Promise<CompileResult> {\n const logger = options.logger;\n const batch = startBatch(bundle, 'codex', [root]);\n const counts = emptyCounts();\n logger?.info({ batch_id: batch.batch_id, root }, 'codex batch started');\n\n try {\n for await (const filePath of discoverCodexSessions(root)) {\n counts.source_files_seen++;\n logger?.debug({ path: filePath }, 'codex source file discovered');\n try {\n const fileCounts = await compileCodexFile(bundle, batch, filePath, logger);\n addCounts(counts, fileCounts);\n } catch (error) {\n counts.errors++;\n logger?.warn(\n {\n err: error,\n path: filePath,\n },\n 'codex source file failed',\n );\n await recordError(bundle, batch.batch_id, {\n kind: 'codex_file_failed',\n message: getErrorMessage(error),\n payload: { path: filePath },\n });\n }\n }\n linkSubagentParents(bundle);\n logger?.debug({ batch_id: batch.batch_id }, 'codex subagent parent links refreshed');\n finishBatch(bundle, batch, counts, 'completed');\n logger?.info({ batch_id: batch.batch_id, counts }, 'codex batch completed');\n } catch (error) {\n finishBatch(bundle, batch, counts, 'failed');\n logger?.error({ err: error, batch_id: batch.batch_id, counts }, 'codex batch 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 logger?: CompileLogger,\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 logger?.debug(\n { path: filePath, source_file_id: sourceFileRow.source_file_id },\n 'codex source file skipped',\n );\n return counts;\n }\n\n counts.source_files_imported = 1;\n logger?.debug(\n { path: filePath, source_file_id: sourceFileRow.source_file_id },\n 'codex source file registered',\n );\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 objects: createPendingObjects(),\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 = stageBytes(pending.objects, 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 // The raw line already IS the JSON for `parserStatus === 'ok'`, so we\n // skip storing a re-serialized copy as `decoded_json_object_id`. Saves\n // ~half the CAS writes per file. Nothing reads it back later.\n const decodedObjectId: ObjectId | null = 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 // Persist the staged CAS objects to disk + the `objects` table BEFORE the\n // domain transaction. We do filesystem writes in parallel (better-sqlite3\n // transactions are synchronous, so this can't run inside `transactional`).\n await flushPendingObjects(bundle, pending.objects);\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 logger?.debug(\n { path: filePath, source_file_id: sourceFileRow.source_file_id, counts },\n 'codex source file imported',\n );\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 objects: PendingObjects;\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 ? stageText(pending.objects, em.stdout, { mimeType: 'text/plain' })\n : null;\n const stderrId = em.stderr\n ? stageText(pending.objects, 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 path from 'node:path';\nimport Database from 'better-sqlite3';\nimport type { Bundle } from '../../core/bundle.js';\nimport {\n type ObjectId,\n type PendingObjects,\n createPendingObjects,\n flushPendingObjects,\n stageBytes,\n stageJson,\n stageText,\n} 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 { getErrorMessage } from '../../core/errors.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 { CompileLogger, CompileOptions } from '../compile-options.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(\n bundle: Bundle,\n root: string,\n options: CompileOptions = {},\n): Promise<CompileResult> {\n const logger = options.logger;\n const batch = startBatch(bundle, 'cursor', [root]);\n const counts = emptyCounts();\n logger?.info({ batch_id: batch.batch_id, root }, 'cursor batch started');\n try {\n for await (const store of discoverCursorStores(root)) {\n counts.source_files_seen++;\n logger?.debug(\n {\n path: store.filePath,\n workspace_id: store.workspaceId,\n agent_id: store.agentId,\n },\n 'cursor store discovered',\n );\n try {\n const fc = await compileCursorStore(bundle, batch, store, logger);\n addCounts(counts, fc);\n } catch (error) {\n counts.errors++;\n logger?.warn(\n {\n err: error,\n path: store.filePath,\n },\n 'cursor store failed',\n );\n await recordError(bundle, batch.batch_id, {\n kind: 'cursor_store_failed',\n message: getErrorMessage(error),\n payload: { path: store.filePath },\n });\n }\n }\n finishBatch(bundle, batch, counts, 'completed');\n logger?.info({ batch_id: batch.batch_id, counts }, 'cursor batch completed');\n } catch (error) {\n finishBatch(bundle, batch, counts, 'failed');\n logger?.error({ err: error, batch_id: batch.batch_id, counts }, 'cursor batch 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 objects: PendingObjects;\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 logger?: CompileLogger,\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 logger?.debug(\n { path: store.filePath, source_file_id: sourceFile.source_file_id },\n 'cursor store skipped',\n );\n return counts;\n }\n counts.source_files_imported = 1;\n logger?.debug(\n { path: store.filePath, source_file_id: sourceFile.source_file_id },\n 'cursor store registered',\n );\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 objects: createPendingObjects(),\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 = stageBytes(pending.objects, 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 = stageBytes(pending.objects, 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 ? stageJson(pending.objects, 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 // Persist staged CAS objects (FS + objects rows) before the domain\n // transaction. better-sqlite3 transactions are sync.\n await flushPendingObjects(bundle, pending.objects);\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 logger?.debug(\n { path: store.filePath, source_file_id: sourceFile.source_file_id, counts },\n 'cursor store imported',\n );\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 ? stageText(pending.objects, 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 ? stageJson(pending.objects, 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 ? stageText(pending.objects, 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","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 {\n type ObjectId,\n type PendingObjects,\n createPendingObjects,\n flushPendingObjects,\n stageBytes,\n stageJson,\n stageText,\n} 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 { getErrorMessage } from '../../core/errors.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 { CompileLogger, CompileOptions } from '../compile-options.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(\n bundle: Bundle,\n root: string,\n options: CompileOptions = {},\n): Promise<CompileResult> {\n const logger = options.logger;\n const batch = startBatch(bundle, 'gemini', [root]);\n const counts = emptyCounts();\n logger?.info({ batch_id: batch.batch_id, root }, 'gemini batch started');\n try {\n for await (const file of discoverGeminiChats(root)) {\n counts.source_files_seen++;\n logger?.debug(\n {\n path: file.filePath,\n project_dir: file.projectDir,\n project_root: file.projectRoot,\n },\n 'gemini source file discovered',\n );\n try {\n const fc = await compileGeminiFile(bundle, batch, file, logger);\n addCounts(counts, fc);\n } catch (error) {\n counts.errors++;\n logger?.warn(\n {\n err: error,\n path: file.filePath,\n },\n 'gemini source file failed',\n );\n await recordError(bundle, batch.batch_id, {\n kind: 'gemini_file_failed',\n message: getErrorMessage(error),\n payload: { path: file.filePath },\n });\n }\n }\n finishBatch(bundle, batch, counts, 'completed');\n logger?.info({ batch_id: batch.batch_id, counts }, 'gemini batch completed');\n } catch (error) {\n finishBatch(bundle, batch, counts, 'failed');\n logger?.error({ err: error, batch_id: batch.batch_id, counts }, 'gemini batch 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 objects: PendingObjects;\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 logger?: CompileLogger,\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 logger?.debug(\n { path: file.filePath, source_file_id: sourceFile.source_file_id },\n 'gemini source file skipped',\n );\n return counts;\n }\n counts.source_files_imported = 1;\n logger?.debug(\n { path: file.filePath, source_file_id: sourceFile.source_file_id },\n 'gemini source file registered',\n );\n\n const text = await readFile(file.filePath, 'utf8');\n const parsed = JSON.parse(text) as GeminiSessionFile;\n const objects = createPendingObjects();\n const fileObjectId = stageBytes(objects, 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 objects,\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 // Persist staged CAS objects (FS + objects rows) before the domain\n // transaction. better-sqlite3 transactions are sync.\n await flushPendingObjects(bundle, pending.objects);\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 logger?.debug(\n { path: file.filePath, source_file_id: sourceFile.source_file_id, counts },\n 'gemini source file imported',\n );\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 = stageJson(pending.objects, 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 ? stageText(pending.objects, 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 ? stageJson(pending.objects, 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 =\n resultText.length > PREVIEW_MAX ? stageText(pending.objects, 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\n ? stageText(pending.objects, diffText, { mimeType: 'text/x-diff' })\n : 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 { 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';\nimport { getErrorMessage } from '../../core/errors.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: ${getErrorMessage(error)}`,\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 = getErrorMessage(error);\n return /No files found|does not exist|not found/i.test(message) && /\\.parquet/i.test(message);\n}\n","import pino, { type Logger } from 'pino';\nimport pretty from 'pino-pretty';\n\nexport interface CliLoggerOptions {\n verbose?: boolean;\n jsonLogs?: boolean;\n}\n\nexport function createCliLogger(options: CliLoggerOptions): Logger {\n const loggerOptions = {\n base: undefined,\n level: options.verbose ? 'debug' : 'info',\n };\n\n if (options.jsonLogs) {\n return pino(loggerOptions, pino.destination({ dest: 2, sync: true }));\n }\n\n return pino(\n loggerOptions,\n pretty({\n colorize: process.stderr.isTTY,\n destination: 2,\n ignore: 'pid,hostname',\n singleLine: true,\n sync: true,\n translateTime: 'SYS:yyyy-mm-dd HH:MM:ss.l',\n }),\n );\n}\n","import { writeFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { Command } from 'commander';\nimport { defaultBundlePath } from '../../core/bundle.js';\nimport { exportSessionMarkdown } from '../../services/export/markdown.js';\nimport { exportBundleParquet } from '../../services/export/parquet.js';\nimport { withBundle } from '../bundle.js';\n\nexport function exportCommand(): Command {\n const session = new Command('session')\n .description('Export a single session to a human-readable format.')\n .argument('<session-id>', 'prosa session_id')\n .requiredOption('--format <fmt>', 'currently only \"markdown\" is supported')\n .option('--out <path>', 'write to file instead of stdout')\n .option('--store <path>', 'bundle directory', defaultBundlePath())\n .action(async (sessionId: string, options: { format: string; out?: string; store: string }) => {\n if (options.format !== 'markdown') {\n throw new Error(`unsupported format: ${options.format} (try --format markdown)`);\n }\n await withBundle(options.store, async (bundle) => {\n const markdown = await exportSessionMarkdown(bundle, sessionId);\n if (options.out) {\n await writeFile(path.resolve(options.out), markdown, 'utf8');\n process.stdout.write(`wrote ${path.resolve(options.out)}\\n`);\n } else {\n process.stdout.write(markdown);\n }\n });\n });\n\n const parquet = new Command('parquet')\n .description('Export canonical tables to derived Parquet files for analytics.')\n .option('--store <path>', 'bundle directory', defaultBundlePath())\n .option('--out <path>', 'output directory (default: <store>/parquet)')\n .action(async (options: { store: string; out?: string }) => {\n const result = await exportBundleParquet({\n bundlePath: path.resolve(options.store),\n outDir: options.out ? path.resolve(options.out) : undefined,\n });\n process.stdout.write(`wrote parquet export to ${result.outDir}\\n`);\n process.stdout.write(`manifest=${result.manifestPath}\\n`);\n });\n\n return new Command('export')\n .description('Export sessions / search excerpts to readable formats.')\n .addCommand(session)\n .addCommand(parquet);\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 path from 'node:path';\nimport { type Bundle, closeBundle, openBundle } from '../core/bundle.js';\n\nexport async function withBundle<T>(\n storePath: string,\n fn: (bundle: Bundle) => Promise<T> | T,\n): Promise<T> {\n const bundle = await openBundle(path.resolve(storePath));\n try {\n return await fn(bundle);\n } finally {\n closeBundle(bundle);\n }\n}\n","import { Command } from 'commander';\nimport { defaultBundlePath } from '../../core/bundle.js';\nimport {\n getSearchIndexStatuses,\n rebuildFts5Index,\n rebuildTantivyIndex,\n} from '../../services/indexing.js';\nimport { withBundle } from '../bundle.js';\nimport { parseOutputFormat, printRows } from '../output.js';\n\nexport function indexCommand(): Command {\n const fts5 = new Command('fts5')\n .description('Rebuild the SQLite FTS5 index from search_docs.')\n .option('--store <path>', 'bundle directory', defaultBundlePath())\n .action(async (options: { store: string }) => {\n await withBundle(options.store, (bundle) => {\n printIndexStatus(rebuildFts5Index(bundle));\n });\n });\n\n const tantivy = new Command('tantivy')\n .description('Rebuild the Tantivy sidecar index from search_docs.')\n .option('--store <path>', 'bundle directory', defaultBundlePath())\n .action(async (options: { store: string }) => {\n await withBundle(options.store, async (bundle) => {\n printIndexStatus(await rebuildTantivyIndex(bundle));\n });\n });\n\n const status = new Command('status')\n .description('Show derived search index status.')\n .option('--store <path>', 'bundle directory', defaultBundlePath())\n .option('--output-format <fmt>', 'interactive|table|json|csv', 'table')\n .action(async (options: { store: string; outputFormat: string }) => {\n const format = parseOutputFormat(options.outputFormat, 'table');\n await withBundle(options.store, (bundle) => {\n const rows = getSearchIndexStatuses(bundle);\n printRows(rows, {\n format,\n columns: [\n 'engine',\n 'status',\n 'source_doc_count',\n 'indexed_doc_count',\n 'updated_at',\n 'error_message',\n ],\n });\n });\n });\n\n return new Command('index')\n .description('Build or inspect derived search indexes.')\n .addCommand(fts5)\n .addCommand(tantivy)\n .addCommand(status);\n}\n\nfunction printIndexStatus(status: {\n engine: string;\n status: string;\n source_doc_count: number;\n indexed_doc_count: number;\n}): void {\n process.stdout.write(\n `${status.engine} index: ${status.status}\\n` +\n ` source_docs=${status.source_doc_count} indexed_docs=${status.indexed_doc_count}\\n`,\n );\n}\n","export const OUTPUT_FORMATS = ['interactive', 'table', 'json', 'csv'] as const;\nexport type OutputFormat = (typeof OUTPUT_FORMATS)[number];\n\nconst COL_SEPARATOR = ' ';\nconst RULE_CHAR = '-';\n\nexport function parseOutputFormat(value: string | undefined, fallback: OutputFormat): OutputFormat {\n if (value === undefined) return fallback;\n if ((OUTPUT_FORMATS as readonly string[]).includes(value)) return value as OutputFormat;\n throw new Error(\n `invalid --output-format: ${value} (expected one of ${OUTPUT_FORMATS.join(', ')})`,\n );\n}\n\nexport interface PrintOptions {\n format: OutputFormat;\n columns: readonly string[];\n /** Optional metadata for json output (query applied, total matched, etc.). */\n meta?: Record<string, unknown>;\n}\n\nexport function printRows(rows: readonly object[], opts: PrintOptions): void {\n switch (opts.format) {\n case 'json':\n printJson(rows, opts);\n return;\n case 'csv':\n printCsv(rows, opts);\n return;\n case 'table':\n case 'interactive':\n printTable(rows, opts);\n return;\n }\n}\n\nfunction printJson(rows: readonly object[], opts: PrintOptions): void {\n const out = opts.meta ? { ...opts.meta, rows } : rows;\n process.stdout.write(`${JSON.stringify(out, null, 2)}\\n`);\n}\n\nfunction printCsv(rows: readonly object[], opts: PrintOptions): void {\n const columns = opts.columns;\n process.stdout.write(`${columns.map(csvField).join(',')}\\n`);\n for (const row of rows) {\n const record = row as Record<string, unknown>;\n const line = columns.map((column) => csvField(formatCell(record[column]))).join(',');\n process.stdout.write(`${line}\\n`);\n }\n}\n\nfunction csvField(value: string): string {\n if (/[\",\\n]/.test(value)) return `\"${value.replace(/\"/g, '\"\"')}\"`;\n return value;\n}\n\nfunction printTable(rows: readonly object[], opts: PrintOptions): void {\n const columns = opts.columns;\n const widths = columns.map((column) => column.length);\n const cells = rows.map((row) => {\n const record = row as Record<string, unknown>;\n return columns.map((column, index) => {\n const text = formatCell(record[column]);\n const width = widths[index] ?? 0;\n if (text.length > width) widths[index] = text.length;\n return text;\n });\n });\n\n const header = columns\n .map((column, index) => column.padEnd(widths[index] ?? 0))\n .join(COL_SEPARATOR);\n const rule = columns.map((_, index) => RULE_CHAR.repeat(widths[index] ?? 0)).join(COL_SEPARATOR);\n process.stdout.write(`${header}\\n${rule}\\n`);\n for (const cellRow of cells) {\n const line = cellRow.map((cell, index) => cell.padEnd(widths[index] ?? 0)).join(COL_SEPARATOR);\n process.stdout.write(`${line}\\n`);\n }\n}\n\nfunction formatCell(value: unknown): string {\n if (value == null) return '';\n if (typeof value === 'string') return value;\n if (typeof value === 'number' || typeof value === 'boolean') return String(value);\n return JSON.stringify(value);\n}\n","import { stat } from 'node:fs/promises';\nimport path from 'node:path';\nimport { Command } from 'commander';\nimport { closeBundle, defaultBundlePath, initBundle, openBundle } from '../../core/bundle.js';\n\nexport function initCommand(): Command {\n return new Command('init')\n .description('Initialize a new prosa bundle (SQLite + manifest + objects/).')\n .option('--store <path>', 'bundle directory', defaultBundlePath())\n .option('--force-existing', 'open instead of failing if a manifest exists', false)\n .action(async (options: { store: string; forceExisting: boolean }) => {\n const resolved = path.resolve(options.store);\n const exists = await stat(`${resolved}/manifest.json`)\n .then(() => true)\n .catch(() => false);\n\n if (exists) {\n if (!options.forceExisting) {\n process.stderr.write(\n `bundle already initialized at ${resolved}\\nuse --force-existing to skip without erroring\\n`,\n );\n process.exit(2);\n }\n const bundle = await openBundle(resolved);\n closeBundle(bundle);\n process.stdout.write(`bundle already exists at ${resolved}\\n`);\n return;\n }\n\n const bundle = await initBundle(resolved);\n closeBundle(bundle);\n process.stdout.write(`initialized prosa bundle at ${resolved}\\n`);\n });\n}\n","import path from 'node:path';\nimport { Command } from 'commander';\nimport {\n type Bundle,\n closeBundle,\n defaultBundlePath,\n openOrInitBundle,\n} from '../../core/bundle.js';\nimport { listenMcpServer, listenMcpStdioServer } from '../../mcp/server.js';\nimport { parseMcpTransport, parseSearchEngine } from '../parsers.js';\n\nexport function mcpCommand(): Command {\n const serve = new Command('serve')\n .description('Start a local MCP server over the prosa bundle.')\n .option('--store <path>', 'bundle directory', defaultBundlePath())\n .option('--transport <transport>', 'MCP transport: stdio|http', 'stdio')\n .option('--host <host>', 'bind host', '127.0.0.1')\n .option('--port <port>', 'bind port', '7331')\n .option('--path <path>', 'HTTP path', '/mcp')\n .option('--search-engine <engine>', 'search engine: fts5|tantivy', 'fts5')\n .action(\n async (options: {\n store: string;\n host: string;\n port: string;\n path: string;\n searchEngine: string;\n transport: string;\n }) => {\n const storePath = path.resolve(options.store);\n const bundle = await openOrInitBundle(storePath);\n try {\n const transport = parseMcpTransport(options.transport);\n const searchEngine = parseSearchEngine(options.searchEngine);\n if (transport === 'http') {\n const port = Number.parseInt(options.port, 10);\n if (!Number.isFinite(port) || port <= 0) {\n throw new Error(`invalid port: ${options.port}`);\n }\n const server = await listenMcpServer(bundle, {\n host: options.host,\n port,\n path: options.path,\n searchEngine,\n storePath,\n });\n\n process.stdout.write(`prosa mcp server listening at ${server.url}\\n`);\n process.stdout.write('press Ctrl+C to stop\\n');\n registerShutdown(server.close, bundle);\n return;\n }\n\n const server = await listenMcpStdioServer(bundle, { searchEngine, storePath });\n registerShutdown(server.close, bundle);\n } catch (error) {\n closeBundle(bundle);\n throw error;\n }\n },\n );\n\n return new Command('mcp').description('MCP server commands.').addCommand(serve);\n}\n\nfunction registerShutdown(closeServer: () => Promise<void>, bundle: Bundle): void {\n const shutdown = async (): Promise<void> => {\n await closeServer();\n closeBundle(bundle);\n process.exit(0);\n };\n process.once('SIGINT', () => {\n void shutdown();\n });\n process.once('SIGTERM', () => {\n void shutdown();\n });\n}\n","import { randomUUID } from 'node:crypto';\nimport http from 'node:http';\nimport type { IncomingMessage, ServerResponse } from 'node:http';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';\nimport type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';\nimport type { Bundle } from '../core/bundle.js';\nimport { getErrorMessage } from '../core/errors.js';\nimport { PROSA_PARSER_VERSION } from '../core/version.js';\nimport type { SearchEngine } from '../services/indexing.js';\nimport { PROSA_MCP_INSTRUCTIONS } from './guidance.js';\nimport { registerProsaTools } from './tools.js';\n\ninterface SessionEntry {\n server: McpServer;\n transport: StreamableHTTPServerTransport;\n}\n\nexport interface McpServerOptions {\n host: string;\n port: number;\n path?: string;\n searchEngine?: SearchEngine;\n storePath?: string;\n}\n\nexport interface RunningServer {\n url: string;\n close(): Promise<void>;\n}\n\nexport interface RunningStdioServer {\n close(): Promise<void>;\n}\n\nexport interface McpStdioServerOptions {\n searchEngine?: SearchEngine;\n storePath?: string;\n}\n\nexport async function listenMcpStdioServer(\n bundle: Bundle,\n options: McpStdioServerOptions = {},\n): Promise<RunningStdioServer> {\n const server = createMcpServer(bundle, options.searchEngine ?? 'fts5', options.storePath);\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n return {\n close: async () => {\n await safeClose(server);\n await safeClose(transport);\n },\n };\n}\n\n/**\n * Bind an HTTP MCP server on `host:port` backed by `bundle`. Implements the\n * Streamable HTTP transport with stateful sessions (one McpServer per\n * `MCP-Session-Id`).\n *\n * - POST /mcp — JSON-RPC requests; opens a session if `MCP-Session-Id` is missing\n * - DELETE /mcp — close an existing session by header\n * - GET /mcp — 405 (we don't expose server-initiated SSE streams)\n */\nexport async function listenMcpServer(\n bundle: Bundle,\n options: McpServerOptions,\n): Promise<RunningServer> {\n const mcpPath = options.path ?? '/mcp';\n const sessions = new Map<string, SessionEntry>();\n\n const searchEngine = options.searchEngine ?? 'fts5';\n const storePath = options.storePath ?? bundle.path;\n\n const httpServer = http.createServer((req, res) => {\n handleRequest(req, res, mcpPath, sessions, bundle, searchEngine, storePath).catch(\n (error: unknown) => {\n writeError(res, error);\n },\n );\n });\n\n await new Promise<void>((resolve, reject) => {\n httpServer.once('error', reject);\n httpServer.listen(options.port, options.host, () => {\n httpServer.removeListener('error', reject);\n resolve();\n });\n });\n\n return {\n url: `http://${options.host}:${options.port}${mcpPath}`,\n close: async () => {\n await new Promise<void>((resolve, reject) => {\n httpServer.close((err) => (err ? reject(err) : resolve()));\n });\n for (const entry of sessions.values()) {\n await safeClose(entry.server);\n await safeClose(entry.transport);\n }\n sessions.clear();\n },\n };\n}\n\nasync function handleRequest(\n req: IncomingMessage,\n res: ServerResponse,\n mcpPath: string,\n sessions: Map<string, SessionEntry>,\n bundle: Bundle,\n searchEngine: SearchEngine,\n storePath: string,\n): Promise<void> {\n if (!req.url || !req.url.startsWith(mcpPath)) {\n res.writeHead(404).end();\n return;\n }\n const method = req.method ?? 'GET';\n\n if (method === 'GET') {\n // Match the Sourcebot reference: we don't initiate SSE streams from the\n // server side, so GET is rejected per the MCP Streamable HTTP spec.\n res.writeHead(405, { Allow: 'POST, DELETE' }).end();\n return;\n }\n if (method !== 'POST' && method !== 'DELETE') {\n res.writeHead(405, { Allow: 'POST, DELETE' }).end();\n return;\n }\n\n const headerSessionId = req.headers['mcp-session-id'];\n const sessionId =\n typeof headerSessionId === 'string'\n ? headerSessionId\n : Array.isArray(headerSessionId)\n ? headerSessionId[0]\n : undefined;\n\n let entry: SessionEntry | undefined = sessionId ? sessions.get(sessionId) : undefined;\n\n if (!entry) {\n if (method === 'DELETE') {\n res.writeHead(404).end();\n return;\n }\n entry = await openSession(bundle, sessions, searchEngine, storePath);\n }\n\n const bodyText = await readBody(req);\n const body = bodyText.length > 0 ? safeJsonParse(bodyText) : undefined;\n await entry.transport.handleRequest(req, res, body);\n}\n\nasync function openSession(\n bundle: Bundle,\n store: Map<string, SessionEntry>,\n searchEngine: SearchEngine,\n storePath: string,\n): Promise<SessionEntry> {\n // We need to assemble server + transport together because the transport's\n // `onsessioninitialized` callback wants to register both into the map.\n const server = createMcpServer(bundle, searchEngine, storePath);\n const transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: () => randomUUID(),\n onsessioninitialized: (id: string) => {\n store.set(id, { server, transport });\n },\n onsessionclosed: async (id: string) => {\n const e = store.get(id);\n if (e) {\n await safeClose(e.server);\n await safeClose(e.transport);\n store.delete(id);\n }\n },\n });\n\n await server.connect(transport);\n return { server, transport };\n}\n\nfunction createMcpServer(\n bundle: Bundle,\n searchEngine: SearchEngine,\n storePath?: string,\n): McpServer {\n const server = new McpServer(\n {\n name: 'prosa',\n version: PROSA_PARSER_VERSION,\n },\n { instructions: PROSA_MCP_INSTRUCTIONS },\n );\n registerProsaTools(server, bundle, { ensureStore: true, searchEngine, storePath });\n return server;\n}\n\nasync function readBody(req: IncomingMessage): Promise<string> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on('data', (chunk: Buffer) => chunks.push(chunk));\n req.on('end', () => resolve(Buffer.concat(chunks).toString('utf8')));\n req.on('error', reject);\n });\n}\n\nfunction safeJsonParse(text: string): unknown {\n try {\n return JSON.parse(text);\n } catch {\n return undefined;\n }\n}\n\nasync function safeClose(o: { close: () => Promise<void> | void } | Transport): Promise<void> {\n try {\n await o.close();\n } catch {\n /* ignore */\n }\n}\n\nfunction writeError(res: ServerResponse, error: unknown): void {\n if (!res.headersSent) {\n res.writeHead(500, { 'Content-Type': 'application/json' });\n }\n res.end(\n JSON.stringify({\n jsonrpc: '2.0',\n error: { code: -32603, message: getErrorMessage(error) },\n id: null,\n }),\n );\n}\n","export const PROSA_MCP_INSTRUCTIONS = `\nprosa is a local memory over local agent session histories. Use it to import recent sessions,\nfind prior work, commands, decisions, file touches, and full transcripts before answering from\nmemory.\n\nRecommended workflow:\n- Use compile to refresh the bundle when recent local sessions may not be indexed yet. With no\n input it imports all supported providers from default paths.\n- For open-ended questions, start with search_sessions using 2-5 concrete terms.\n- For questions about a file or path, start with find_touched_files, then inspect the returned sessions.\n- After search results, call get_session for the most relevant session_ids before drawing conclusions.\n- Use export_session_markdown only after selecting a likely session; it can return a large transcript.\n- Use list_tool_calls for command history, failed tools, patches, and operational audit trails.\n- Use get_artifact only when a returned artifact_id is needed for full output or diff content.\n- Use index_status if search results look stale or unexpectedly empty.\n\nWhen answering, cite concrete evidence: session_id, timestamp, tool/file path, and the relevant snippet\nor event. Do not treat search snippets as the whole truth; open the session when accuracy matters.\n`.trim();\n\nexport const INVESTIGATE_PRIOR_WORK_PROMPT = `\nInvestigate prior work in prosa for the topic: {{topic}}\n\nUse this workflow:\n1. Call search_sessions with a short query built from the topic.\n2. If results are broad, search again with narrower terms from the best snippets.\n3. Open the most relevant session_ids with get_session.\n4. Use export_session_markdown only for sessions that appear directly relevant.\n5. Answer with evidence: session_id, timestamp, and the decisive snippet or event.\n`.trim();\n\nexport const FIND_FILE_HISTORY_PROMPT = `\nInvestigate history for file/path: {{path}}\n\nUse this workflow:\n1. Call find_touched_files with the path or the most distinctive path suffix.\n2. Open returned session_ids with get_session.\n3. Use list_tool_calls with session_id when you need command-level detail.\n4. Use export_session_markdown only for the most relevant session.\n5. Summarize what changed, who/what tool touched it, and cite session_id plus timestamp.\n`.trim();\n\nexport const AUDIT_TOOL_FAILURES_PROMPT = `\nAudit tool failures in prosa{{query_clause}}.\n\nUse this workflow:\n1. Call list_tool_calls with errors_only=true.\n2. If a query is provided, also call search_sessions for that query to find related context.\n3. Open relevant session_ids with get_session.\n4. Group failures by tool_name, command/path, and likely cause.\n5. Answer with evidence: session_id, timestamp, command/path, exit code, and preview.\n`.trim();\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { type Bundle, closeBundle, openOrInitBundle } from '../core/bundle.js';\nimport { SOURCE_TOOLS } from '../core/domain/types.js';\nimport { getErrorMessage } from '../core/errors.js';\nimport { clampLimit } from '../core/limits.js';\nimport {\n COMPILE_PROVIDERS,\n exportCompileParquet,\n getCompileProvider,\n runCompileImports,\n} from '../services/compile.js';\nimport { exportSessionMarkdown } from '../services/export/markdown.js';\nimport { type SearchEngine, getSearchIndexStatuses } from '../services/indexing.js';\nimport { searchFullText } from '../services/search.js';\nimport { getSession, listSessions } from '../services/sessions.js';\nimport {\n AUDIT_TOOL_FAILURES_PROMPT,\n FIND_FILE_HISTORY_PROMPT,\n INVESTIGATE_PRIOR_WORK_PROMPT,\n} from './guidance.js';\n\nexport interface ProsaToolOptions {\n searchEngine?: SearchEngine;\n storePath?: string;\n ensureStore?: boolean;\n}\n\n/**\n * Register every prosa MCP tool on `server`. Most tools are read-only; compile\n * is intentionally mutating and reuses the same import services as the CLI.\n */\nexport function registerProsaTools(\n server: McpServer,\n bundle: Bundle,\n options: ProsaToolOptions = {},\n): void {\n const searchEngine = options.searchEngine ?? 'fts5';\n const storePath = options.storePath ?? bundle.path;\n const ensureStore = options.ensureStore ?? false;\n registerProsaPrompts(server);\n\n server.registerTool(\n 'compile',\n {\n title: 'Compile sessions',\n description:\n 'Import local agent session histories into the active prosa bundle. With no input, compiles all providers from default paths. With source, compiles that provider; sessions_path may override that provider path.',\n inputSchema: {\n source: z.enum(SOURCE_TOOLS).optional(),\n sessions_path: z.string().min(1).optional(),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true },\n },\n async ({ source, sessions_path }) =>\n withToolBundle(bundle, storePath, ensureStore, async (activeBundle) => {\n if (sessions_path && !source) {\n return {\n content: [\n {\n type: 'text',\n text: 'sessions_path requires source because providers use incompatible source layouts',\n },\n ],\n isError: true,\n };\n }\n\n try {\n const result = await runCompileImports({\n bundle: activeBundle,\n providers: source ? [getCompileProvider(source)] : COMPILE_PROVIDERS,\n deferIndex: false,\n sessionsPath: sessions_path,\n });\n const parquet = result.importedAny ? await exportCompileParquet({ storePath }) : null;\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(\n {\n providers: result.providers.map((provider) => ({\n source: provider.source,\n source_path: provider.sourcePath,\n batch_id: provider.batchId,\n counts: provider.counts,\n })),\n imported_any: result.importedAny,\n tantivy: result.tantivy\n ? { indexed_doc_count: result.tantivy.indexedDocCount }\n : null,\n tantivy_error: result.tantivyError,\n parquet: parquet\n ? {\n out_dir: parquet.outDir,\n manifest_path: parquet.manifestPath,\n table_count: parquet.tableCount,\n files: parquet.files,\n counts: parquet.counts,\n }\n : null,\n },\n null,\n 2,\n ),\n },\n ],\n };\n } catch (error) {\n return {\n content: [{ type: 'text', text: getErrorMessage(error) }],\n isError: true,\n };\n }\n }),\n );\n\n server.registerTool(\n 'list_sessions',\n {\n title: 'List sessions',\n description:\n 'List recent sessions when you need candidates by source/date before deeper inspection. Next step: call get_session for relevant session_id values.',\n inputSchema: {\n source: z.enum(SOURCE_TOOLS).optional(),\n since: z.string().optional().describe('ISO timestamp lower bound (inclusive)'),\n until: z.string().optional().describe('ISO timestamp upper bound (exclusive)'),\n limit: z.number().int().min(1).max(500).optional().default(50),\n },\n annotations: { readOnlyHint: true, idempotentHint: true },\n },\n async (input) =>\n withToolBundle(bundle, storePath, ensureStore, (activeBundle) => {\n const rows = listSessions(activeBundle, {\n sourceTool: input.source,\n sinceIso: input.since,\n untilIso: input.until,\n limit: input.limit ?? 50,\n });\n return {\n content: [{ type: 'text', text: JSON.stringify(rows, null, 2) }],\n };\n }),\n );\n\n server.registerTool(\n 'get_session',\n {\n title: 'Get session detail',\n description:\n 'Open one session and return metadata plus timeline events. Use this after search_sessions, list_sessions, find_touched_files, or list_tool_calls before making evidence-backed claims.',\n inputSchema: {\n session_id: z.string().min(1),\n },\n annotations: { readOnlyHint: true, idempotentHint: true },\n },\n async ({ session_id }) =>\n withToolBundle(bundle, storePath, ensureStore, (activeBundle) => {\n const detail = getSession(activeBundle, session_id);\n if (!detail) {\n return {\n content: [{ type: 'text', text: `session not found: ${session_id}` }],\n isError: true,\n };\n }\n return {\n content: [{ type: 'text', text: JSON.stringify(detail, null, 2) }],\n };\n }),\n );\n\n server.registerTool(\n 'search_sessions',\n {\n title: 'Full-text search',\n description: `Search messages, commands, paths, and result previews using the server-selected ${searchEngine} engine. Start here for open-ended questions with 2-5 concrete terms, then call get_session for relevant hits.`,\n inputSchema: {\n query: z.string().min(1),\n limit: z.number().int().min(1).max(500).optional().default(50),\n raw: z.boolean().optional().default(false),\n },\n annotations: { readOnlyHint: true, idempotentHint: true },\n },\n async ({ query, limit, raw }) =>\n withToolBundle(bundle, storePath, ensureStore, (activeBundle) => {\n const hits = searchFullText(activeBundle, {\n query,\n limit: limit ?? 50,\n raw,\n engine: searchEngine,\n });\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(\n { query, engine: searchEngine, count: hits.length, hits },\n null,\n 2,\n ),\n },\n ],\n };\n }),\n );\n\n server.registerTool(\n 'export_session_markdown',\n {\n title: 'Export session as Markdown',\n description:\n 'Render a selected session into a readable transcript. Use only after get_session confirms relevance; this can return much more context than snippets.',\n inputSchema: {\n session_id: z.string().min(1),\n },\n annotations: { readOnlyHint: true, idempotentHint: true },\n },\n async ({ session_id }) =>\n withToolBundle(bundle, storePath, ensureStore, async (activeBundle) => {\n try {\n const md = await exportSessionMarkdown(activeBundle, session_id);\n return { content: [{ type: 'text', text: md }] };\n } catch (error) {\n return {\n content: [{ type: 'text', text: getErrorMessage(error) }],\n isError: true,\n };\n }\n }),\n );\n\n server.registerTool(\n 'list_tool_calls',\n {\n title: 'List tool calls',\n description:\n 'Audit commands and tool usage by tool name, canonical type, error status, or session. Use this for failed commands, shell history, patches, and operational evidence; then open relevant sessions with get_session.',\n inputSchema: {\n tool_name: z.string().optional(),\n canonical_type: z\n .enum([\n 'shell',\n 'read_file',\n 'write_file',\n 'edit_file',\n 'search_file',\n 'web_search',\n 'mcp',\n 'subagent',\n 'patch',\n 'other',\n ])\n .optional(),\n session_id: z.string().optional(),\n errors_only: z.boolean().optional().default(false),\n limit: z.number().int().min(1).max(500).optional().default(100),\n },\n annotations: { readOnlyHint: true, idempotentHint: true },\n },\n async ({ tool_name, canonical_type, session_id, errors_only, limit }) =>\n withToolBundle(bundle, storePath, ensureStore, (activeBundle) => {\n const conds: string[] = [];\n const params: unknown[] = [];\n if (tool_name) {\n conds.push('tc.tool_name = ?');\n params.push(tool_name);\n }\n if (canonical_type) {\n conds.push('tc.canonical_tool_type = ?');\n params.push(canonical_type);\n }\n if (session_id) {\n conds.push('tc.session_id = ?');\n params.push(session_id);\n }\n if (errors_only) {\n conds.push('(tr.is_error = 1 OR tc.status = ?)');\n params.push('error');\n }\n const where = conds.length ? `WHERE ${conds.join(' AND ')}` : '';\n const sql = `\n SELECT tc.tool_call_id, tc.session_id, tc.tool_name, tc.canonical_tool_type,\n tc.command, tc.path, tc.status, tc.timestamp_start,\n tr.is_error, tr.exit_code, tr.preview\n FROM tool_calls tc\n LEFT JOIN tool_results tr ON tr.tool_call_id = tc.tool_call_id\n ${where}\n ORDER BY tc.timestamp_start DESC\n LIMIT ${clampLimit(limit, { max: 500, fallback: 100 })}\n `;\n const rows = activeBundle.db.prepare(sql).all(...params);\n return {\n content: [{ type: 'text', text: JSON.stringify(rows, null, 2) }],\n };\n }),\n );\n\n server.registerTool(\n 'find_touched_files',\n {\n title: 'Find sessions that touched a file',\n description:\n 'Find sessions with tool calls or artifacts whose path contains `path_substring`. Start here for file-history questions, then open returned sessions with get_session.',\n inputSchema: {\n path_substring: z.string().min(1),\n limit: z.number().int().min(1).max(500).optional().default(100),\n },\n annotations: { readOnlyHint: true, idempotentHint: true },\n },\n async ({ path_substring, limit }) =>\n withToolBundle(bundle, storePath, ensureStore, (activeBundle) => {\n const sql = `\n SELECT tc.session_id, tc.tool_name, tc.canonical_tool_type, tc.path,\n tc.timestamp_start, tc.command\n FROM tool_calls tc\n WHERE tc.path IS NOT NULL AND tc.path LIKE ?\n UNION ALL\n SELECT a.session_id AS session_id, NULL AS tool_name, NULL AS canonical_tool_type,\n a.path, a.created_ts AS timestamp_start, NULL AS command\n FROM artifacts a\n WHERE a.path IS NOT NULL AND a.path LIKE ?\n ORDER BY timestamp_start DESC\n LIMIT ${clampLimit(limit, { max: 500, fallback: 100 })}\n `;\n const like = `%${path_substring}%`;\n const rows = activeBundle.db.prepare(sql).all(like, like);\n return {\n content: [{ type: 'text', text: JSON.stringify(rows, null, 2) }],\n };\n }),\n );\n\n server.registerTool(\n 'get_artifact',\n {\n title: 'Get artifact bytes/text',\n description:\n 'Retrieve full text for an artifact_id found in a session or export. Use this for detailed diffs or large tool outputs after identifying the artifact; binary artifacts return a placeholder.',\n inputSchema: {\n artifact_id: z.string().min(1),\n },\n annotations: { readOnlyHint: true, idempotentHint: true },\n },\n async ({ artifact_id }) =>\n withToolBundle(bundle, storePath, ensureStore, async (activeBundle) => {\n const row = activeBundle.db\n .prepare<\n [string],\n { text_object_id: string | null; object_id: string | null; mime_type: string | null }\n >(`SELECT text_object_id, object_id, mime_type FROM artifacts WHERE artifact_id = ?`)\n .get(artifact_id);\n if (!row) {\n return {\n content: [{ type: 'text', text: `artifact not found: ${artifact_id}` }],\n isError: true,\n };\n }\n const objectId = row.text_object_id ?? row.object_id;\n if (!objectId) {\n return { content: [{ type: 'text', text: '[no content stored]' }] };\n }\n try {\n const { getText } = await import('../core/cas/index.js');\n const text = await getText(activeBundle, objectId);\n return { content: [{ type: 'text', text }] };\n } catch {\n return { content: [{ type: 'text', text: `[binary artifact: ${objectId}]` }] };\n }\n }),\n );\n\n server.registerTool(\n 'index_status',\n {\n title: 'Search index status',\n description:\n 'Show whether derived search indexes are ready, stale, missing, building, or failed. Use when search results are unexpectedly empty or when choosing between FTS5 and Tantivy.',\n inputSchema: {},\n annotations: { readOnlyHint: true, idempotentHint: true },\n },\n async () =>\n withToolBundle(bundle, storePath, ensureStore, (activeBundle) => {\n const rows = getSearchIndexStatuses(activeBundle);\n return {\n content: [{ type: 'text', text: JSON.stringify(rows, null, 2) }],\n };\n }),\n );\n}\n\nasync function withToolBundle<T>(\n fallbackBundle: Bundle,\n storePath: string,\n ensureStore: boolean,\n fn: (bundle: Bundle) => Promise<T> | T,\n): Promise<T> {\n if (!ensureStore) {\n return await fn(fallbackBundle);\n }\n\n const bundle = await openOrInitBundle(storePath);\n try {\n return await fn(bundle);\n } finally {\n closeBundle(bundle);\n }\n}\n\nfunction registerProsaPrompts(server: McpServer): void {\n server.registerPrompt(\n 'investigate_prior_work',\n {\n title: 'Investigate prior work',\n description:\n 'Guide an agent through searching prosa for prior work on a topic, opening relevant sessions, and citing evidence.',\n argsSchema: {\n topic: z\n .string()\n .min(1)\n .describe('Topic, feature, error, command, or decision to investigate'),\n },\n },\n ({ topic }) => ({\n description: 'Search prosa for relevant prior work and answer with session evidence.',\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: INVESTIGATE_PRIOR_WORK_PROMPT.replace('{{topic}}', topic),\n },\n },\n ],\n }),\n );\n\n server.registerPrompt(\n 'find_file_history',\n {\n title: 'Find file history',\n description:\n 'Guide an agent through finding sessions that touched a file/path and summarizing the relevant history.',\n argsSchema: {\n path: z.string().min(1).describe('File path, directory, or distinctive path suffix'),\n },\n },\n ({ path }) => ({\n description: 'Find sessions that touched a path and summarize the evidence.',\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: FIND_FILE_HISTORY_PROMPT.replace('{{path}}', path),\n },\n },\n ],\n }),\n );\n\n server.registerPrompt(\n 'audit_tool_failures',\n {\n title: 'Audit tool failures',\n description:\n 'Guide an agent through finding failed tool calls and grouping them by likely cause.',\n argsSchema: {\n query: z\n .string()\n .optional()\n .describe('Optional topic, file, command, or error to narrow audit'),\n },\n },\n ({ query }) => ({\n description: 'Audit failed tool calls and cite operational evidence.',\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: AUDIT_TOOL_FAILURES_PROMPT.replace(\n '{{query_clause}}',\n query ? ` related to: ${query}` : '',\n ),\n },\n },\n ],\n }),\n );\n}\n","// Row-shaped TypeScript types matching the SQLite schema. These are the\n// boundary contract between importers and the catalog. Optional fields use\n// `null` (not `undefined`) to mirror SQLite NULL semantics directly.\n\nexport const SOURCE_TOOLS = ['cursor', 'codex', 'claude', 'gemini'] as const;\nexport type SourceTool = (typeof SOURCE_TOOLS)[number];\n\nexport type Confidence = 'high' | 'medium' | 'low';\n\nexport type MessageRole =\n | 'system_prompt'\n | 'developer'\n | 'user'\n | 'assistant'\n | 'tool'\n | 'operational';\n\nexport type CanonicalToolType =\n | 'shell'\n | 'read_file'\n | 'write_file'\n | 'edit_file'\n | 'search_file'\n | 'web_search'\n | 'mcp'\n | 'subagent'\n | 'patch'\n | 'other';\n\nexport type EdgeType =\n | 'parent_of'\n | 'calls'\n | 'returns'\n | 'spawned'\n | 'contains'\n | 'produced'\n | 'consumed'\n | 'derived_from'\n | 'summarizes'\n | 'compacts'\n | 'same_as'\n | 'refers_to';\n\nexport type ToolCallStatus = 'started' | 'success' | 'error' | 'cancelled' | 'unknown';\n\nexport interface SessionRowFull {\n session_id: string;\n source_tool: SourceTool;\n source_session_id: string;\n project_id: string | null;\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 summary: 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 raw_record_id: string | null;\n}\n","import { SOURCE_TOOLS, type SourceTool } from '../core/domain/types.js';\nimport type { SearchEngine } from '../services/indexing.js';\n\nexport { parseOutputFormat } from './output.js';\n\nexport type McpTransport = 'stdio' | 'http';\n\nexport function parseSearchEngine(value: string): SearchEngine {\n if (value === 'fts5' || value === 'tantivy') return value;\n throw new Error(`invalid search engine: ${value} (expected fts5 or tantivy)`);\n}\n\nexport function parseMcpTransport(value: string): McpTransport {\n if (value === 'stdio' || value === 'http') return value;\n throw new Error(`invalid transport: ${value} (expected stdio or http)`);\n}\n\nexport function parseSourceTool(value: string | undefined): SourceTool | undefined {\n if (value === undefined) return undefined;\n if ((SOURCE_TOOLS as readonly string[]).includes(value)) return value as SourceTool;\n throw new Error(`invalid source tool: ${value} (expected one of ${SOURCE_TOOLS.join(', ')})`);\n}\n","import path from 'node:path';\nimport { Command } from 'commander';\nimport { defaultBundlePath } from '../../core/bundle.js';\nimport { queryDuckDbParquet } from '../../services/export/parquet.js';\nimport { withBundle } from '../bundle.js';\nimport { parseOutputFormat, printRows } from '../output.js';\n\nexport function queryCommand(): Command {\n const duckdb = new Command('duckdb')\n .description('Run a DuckDB SQL query over exported Parquet tables.')\n .argument('<sql>', 'DuckDB SQL query')\n .option('--store <path>', 'bundle directory', defaultBundlePath())\n .option('--parquet-dir <path>', 'Parquet directory (default: <store>/parquet)')\n .option('--output-format <fmt>', 'interactive|table|json|csv', 'table')\n .action(\n async (\n sql: string,\n options: { store: string; parquetDir?: string; outputFormat: string },\n ) => {\n const format = parseOutputFormat(options.outputFormat, 'table');\n const parquetDir = options.parquetDir\n ? path.resolve(options.parquetDir)\n : await withBundle(options.store, (bundle) => bundle.paths.parquet);\n\n const result = await queryDuckDbParquet({ parquetDir, sql });\n printRows(result.rows, {\n format,\n columns: result.columns,\n meta: { query: sql, count: result.rows.length },\n });\n },\n );\n\n return new Command('query').description('Run derived analytical queries.').addCommand(duckdb);\n}\n","import { Command } from 'commander';\nimport { defaultBundlePath } from '../../core/bundle.js';\nimport { searchFullText } from '../../services/search.js';\nimport { withBundle } from '../bundle.js';\nimport { printRows } from '../output.js';\nimport { parseOutputFormat, parseSearchEngine } from '../parsers.js';\n\nexport function searchCommand(): Command {\n return new Command('search')\n .description('Full-text search across messages, tool calls and tool outputs.')\n .argument('<query>', 'FTS5 query string (supports MATCH syntax)')\n .option('--store <path>', 'bundle directory', defaultBundlePath())\n .option('--limit <n>', 'maximum hits', '50')\n .option('--engine <engine>', 'search engine: fts5|tantivy', 'fts5')\n .option('--output-format <fmt>', 'interactive|table|json|csv', 'table')\n .action(\n async (\n query: string,\n options: { store: string; limit: string; engine: string; outputFormat: string },\n ) => {\n const engine = parseSearchEngine(options.engine);\n const format = parseOutputFormat(options.outputFormat, 'table');\n await withBundle(options.store, (bundle) => {\n const hits = searchFullText(bundle, {\n query,\n limit: Number.parseInt(options.limit, 10),\n engine,\n });\n printRows(hits, {\n format,\n columns: ['timestamp', 'role', 'tool_name', 'session_id', 'snippet'],\n meta: { query, engine, count: hits.length },\n });\n });\n },\n );\n}\n","import { Command } from 'commander';\nimport { defaultBundlePath } from '../../core/bundle.js';\nimport { countSessions, listSessions } from '../../services/sessions.js';\nimport { withBundle } from '../bundle.js';\nimport { printRows } from '../output.js';\nimport { parseOutputFormat, parseSourceTool } from '../parsers.js';\n\nexport function sessionsCommand(): Command {\n const command = new Command('sessions')\n .description('List sessions in the bundle, with filters.')\n .enablePositionalOptions()\n .option('--store <path>', 'bundle directory', defaultBundlePath())\n .option('--source <tool>', 'filter by source tool: cursor|codex|claude|gemini')\n .option('--since <iso>', 'sessions starting on/after this ISO timestamp')\n .option('--until <iso>', 'sessions starting before this ISO timestamp')\n .option('--limit <n>', 'maximum rows', '50')\n .option('--output-format <fmt>', 'interactive|table|json|csv', 'table')\n .action(\n async (options: {\n store: string;\n source?: string;\n since?: string;\n until?: string;\n limit: string;\n outputFormat: string;\n }) => {\n const format = parseOutputFormat(options.outputFormat, 'table');\n await withBundle(options.store, (bundle) => {\n const rows = listSessions(bundle, {\n sourceTool: parseSourceTool(options.source),\n sinceIso: options.since,\n untilIso: options.until,\n limit: Number.parseInt(options.limit, 10),\n });\n\n printRows(rows, {\n format,\n columns: [\n 'start_ts',\n 'source_tool',\n 'session_id',\n 'model_last',\n 'message_count',\n 'tool_call_count',\n 'cwd_initial',\n 'title',\n ],\n });\n });\n },\n );\n\n command.addCommand(\n new Command('count')\n .description('Count sessions in the bundle, with filters.')\n .option('--store <path>', 'bundle directory', defaultBundlePath())\n .option('--source <tool>', 'filter by source tool: cursor|codex|claude|gemini')\n .option('--since <iso>', 'sessions starting on/after this ISO timestamp')\n .option('--until <iso>', 'sessions starting before this ISO timestamp')\n .action(\n async (options: {\n store: string;\n source?: string;\n since?: string;\n until?: string;\n }) => {\n await withBundle(options.store, (bundle) => {\n const count = countSessions(bundle, {\n sourceTool: parseSourceTool(options.source),\n sinceIso: options.since,\n untilIso: options.until,\n });\n process.stdout.write(`${count}\\n`);\n });\n },\n ),\n );\n\n return command;\n}\n","import { Command } from 'commander';\nimport { defaultBundlePath } from '../../core/bundle.js';\nimport { withBundle } from '../bundle.js';\n\nexport function tuiCommand(): Command {\n return new Command('tui')\n .description('Open the interactive Ink-based explorer.')\n .option('--store <path>', 'bundle directory', defaultBundlePath())\n .action(async (options: { store: string }) => {\n // Lazy-load Ink/React/App to keep `prosa --help` startup fast.\n const [{ render }, React, { App }] = await Promise.all([\n import('ink'),\n import('react'),\n import('../../tui/App.js'),\n ]);\n await withBundle(options.store, async (bundle) => {\n // eslint-disable-next-line no-console\n console.clear();\n const app = render(React.createElement(App, { bundle }));\n await app.waitUntilExit();\n });\n });\n}\n","#!/usr/bin/env node\nimport { runCli } from '../cli/main.js';\n\nrunCli(process.argv).catch((error: unknown) => {\n // eslint-disable-next-line no-console\n console.error(error instanceof Error ? (error.stack ?? error.message) : error);\n process.exit(1);\n});\n"],"mappings":"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","names":["path","mkdir","readFile","writeFile","path","mkdir","rm","writeFile","path","require","sessionId","Command","os","path","readFile","path","sourceFileId","sessionId","access","readFile","stat","writeFile","path","stat","readFile","path","writeFile","access","path","path","readFile","rawRecordId","sessionId","messageId","eventId","readFile","path","readdir","path","PREVIEW_MAX","addCounts","linkSubagentParents","emptyFileCounts","path","readFile","rawRecordId","sessionId","turnId","stringifyOrNull","buildSearchDocs","flushPending","messageId","eventId","toolCallId","inferCommandFromArgs","canonicalToolType","inferPathFromArgs","path","Database","readdir","path","readdirSafe","PREVIEW_MAX","addCounts","emptyFileCounts","path","Database","messageId","eventId","buildSearchDocs","flushPending","rawRecordId","sessionId","canonicalToolType","stringifyOrNull","readFile","path","readFile","readdir","path","readdirSafe","PREVIEW_MAX","addCounts","emptyFileCounts","path","readFile","buildSearchDocs","flushPending","sessionId","sourceFileId","rawRecordId","messageId","eventId","pushTextBlock","toolCallId","canonicalToolType","mkdir","writeFile","path","path","mkdir","writeFile","path","os","writeFile","path","Command","sessionId","path","path","Command","sessionId","writeFile","path","Command","Command","stat","path","Command","Command","path","exists","stat","bundle","path","Command","getText","path","sessionId","Command","path","server","path","Command","Command","path","Command","Command","Command","Command","Command","Command","App","Command"]}
|
|
1
|
+
{"version":3,"sources":["../../src/core/db.ts","../../src/core/limits.ts","../../src/core/errors.ts","../../src/services/indexing.ts","../../src/services/search.ts","../../src/services/sessions.ts","../../src/tui/use-visible-window.ts","../../src/tui/App.tsx","../../src/cli/main.ts","../../src/core/version.ts","../../src/cli/commands/analytics.ts","../../src/core/bundle.ts","../../src/core/schema/sql/001_init.ts","../../src/core/schema/sql/002_search_index_status.ts","../../src/core/schema/sql/003_analytics_views.ts","../../src/core/schema/sql/004_tantivy_checkpoint.ts","../../src/core/schema/migrate.ts","../../src/services/analytics.ts","../../src/services/export/parquet.ts","../../src/cli/bundle.ts","../../src/cli/output.ts","../../src/core/domain/types.ts","../../src/cli/parsers.ts","../../src/cli/commands/compile.ts","../../src/services/compile.ts","../../src/importers/claude/index.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/importers/claude/discover.ts","../../src/importers/codex/index.ts","../../src/importers/codex/discover.ts","../../src/importers/cursor/index.ts","../../src/importers/cursor/discover.ts","../../src/importers/gemini/index.ts","../../src/importers/gemini/discover.ts","../../src/cli/logger.ts","../../src/cli/commands/export.ts","../../src/services/export/markdown.ts","../../src/cli/commands/index.ts","../../src/cli/commands/init.ts","../../src/cli/commands/mcp.ts","../../src/mcp/server.ts","../../src/mcp/guidance.ts","../../src/mcp/tools.ts","../../src/services/tool_calls.ts","../../src/cli/commands/query.ts","../../src/cli/commands/search.ts","../../src/cli/commands/sessions.ts","../../src/cli/commands/tui.ts","../../src/bin/prosa.ts"],"sourcesContent":["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","export interface ClampLimitOptions {\n min?: number;\n max: number;\n fallback: number;\n}\n\nexport function clampLimit(value: number | undefined, opts: ClampLimitOptions): number {\n return Math.max(opts.min ?? 1, Math.min(opts.max, value ?? opts.fallback));\n}\n","export const getErrorMessage = (err: unknown): string =>\n err instanceof Error ? err.message : String(err);\n","import { createHash } from 'node:crypto';\nimport { existsSync } from 'node:fs';\nimport { 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';\nimport { getErrorMessage } from '../core/errors.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 last_indexed_rowid: number | null;\n schema_fingerprint: 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 SEARCH_INDEX_STATUS_COLUMNS = `\n engine, status, source_doc_count, indexed_doc_count, updated_at,\n error_message, last_indexed_rowid, schema_fingerprint\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 ${SEARCH_INDEX_STATUS_COLUMNS}\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 ${SEARCH_INDEX_STATUS_COLUMNS}\n FROM search_index_status\n WHERE engine = ?`,\n )\n .get(engine) ?? null\n );\n}\n\nexport function markIndexesAfterImport(bundle: Bundle, options: { changed: boolean }): void {\n if (!options.changed) return;\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: getErrorMessage(error),\n });\n throw error;\n }\n\n return getSearchIndexStatus(bundle, 'fts5') as SearchIndexStatus;\n}\n\nexport interface RebuildTantivyOptions {\n /**\n * Force a full re-index even when an incremental run would be valid.\n * Surfaced by the `--overwrite` flag on `prosa index tantivy` and on\n * `prosa compile`.\n */\n overwrite?: boolean;\n}\n\ntype TantivyModule = typeof import('@oxdev03/node-tantivy-binding');\n\ninterface TantivySchemaField {\n name: string;\n tokenizer: string;\n}\n\n// Ordered list of fields we put on every tantivy doc. The order is\n// load-bearing: the schema fingerprint hashes this list verbatim, so\n// changing the order forces a full rebuild on existing bundles.\nconst TANTIVY_SCHEMA_FIELDS: readonly TantivySchemaField[] = [\n { name: 'doc_id', tokenizer: 'raw' },\n { name: 'entity_type', tokenizer: 'raw' },\n { name: 'entity_id', tokenizer: 'raw' },\n { name: 'session_id', tokenizer: 'raw' },\n { name: 'project_id', tokenizer: 'raw' },\n { name: 'timestamp', tokenizer: 'raw' },\n { name: 'role', tokenizer: 'raw' },\n { name: 'tool_name', tokenizer: 'raw' },\n { name: 'canonical_tool_type', tokenizer: 'raw' },\n { name: 'field_kind', tokenizer: 'raw' },\n // The text field uses tantivy's default tokenizer (en_stem in the binding).\n { name: 'text', tokenizer: 'default' },\n];\n\nfunction buildTantivySchema(tantivy: TantivyModule): InstanceType<TantivyModule['Schema']> {\n const builder = new tantivy.SchemaBuilder();\n for (const field of TANTIVY_SCHEMA_FIELDS) {\n if (field.tokenizer === 'default') {\n builder.addTextField(field.name, { stored: true });\n } else {\n builder.addTextField(field.name, { stored: true, tokenizerName: field.tokenizer });\n }\n }\n return builder.build();\n}\n\nfunction computeSchemaFingerprint(): string {\n const canonical = TANTIVY_SCHEMA_FIELDS.map((f) => `${f.name}:${f.tokenizer}:stored`).join('|');\n return createHash('sha256').update(canonical).digest('hex');\n}\n\nfunction tantivyIndexLooksValid(dir: string): boolean {\n return existsSync(path.join(dir, 'meta.json'));\n}\n\nfunction makeTantivyDoc(\n tantivy: TantivyModule,\n row: SearchDocRow,\n): InstanceType<TantivyModule['Document']> {\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 return doc;\n}\n\nconst SEARCH_DOCS_SELECT = `\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`;\n\nexport async function rebuildTantivyIndex(\n bundle: Bundle,\n options: RebuildTantivyOptions = {},\n): Promise<SearchIndexStatus> {\n ensureSearchIndexStatusRows(bundle);\n const sourceDocCount = countSearchDocs(bundle);\n\n // Read the *previous* status before we mark it 'building' — we rely on it\n // to decide between full and incremental, and on the prior indexed count\n // to project the post-incremental total.\n const prev = getSearchIndexStatus(bundle, 'tantivy');\n const fingerprint = computeSchemaFingerprint();\n const indexDirValid = tantivyIndexLooksValid(bundle.paths.tantivy);\n const fingerprintMatches = prev?.schema_fingerprint === fingerprint;\n const lastIndexedRowid =\n typeof prev?.last_indexed_rowid === 'number' ? prev.last_indexed_rowid : 0;\n const wantFullRebuild =\n options.overwrite === true || !indexDirValid || !fingerprintMatches || lastIndexedRowid <= 0;\n\n updateSearchIndexStatus(bundle, 'tantivy', {\n status: 'building',\n sourceDocCount,\n indexedDocCount: 0,\n errorMessage: null,\n });\n\n try {\n const tantivy = await import('@oxdev03/node-tantivy-binding');\n const schema = buildTantivySchema(tantivy);\n\n let index: InstanceType<TantivyModule['Index']>;\n if (wantFullRebuild) {\n await rm(bundle.paths.tantivy, { recursive: true, force: true });\n await mkdir(bundle.paths.tantivy, { recursive: true });\n index = new tantivy.Index(schema, bundle.paths.tantivy, false);\n } else {\n index = tantivy.Index.open(bundle.paths.tantivy);\n }\n\n const writer = index.writer(300_000_000, 4);\n const select = wantFullRebuild\n ? `${SEARCH_DOCS_SELECT} ORDER BY rowid`\n : `${SEARCH_DOCS_SELECT} WHERE rowid > ${lastIndexedRowid} ORDER BY rowid`;\n\n let addedDocCount = 0;\n let maxRowid = wantFullRebuild ? 0 : lastIndexedRowid;\n for (const row of bundle.db.prepare<[], SearchDocRow>(select).iterate()) {\n if (!wantFullRebuild) {\n // Defensive: lets re-imported docs replace the prior copy. The\n // tokenizer for `doc_id` is `raw`, so the stored value maps 1:1\n // to a single deletable term.\n writer.deleteDocumentsByTerm('doc_id', row.doc_id);\n }\n writer.addDocument(makeTantivyDoc(tantivy, row));\n addedDocCount++;\n if (row.rowid > maxRowid) maxRowid = row.rowid;\n }\n\n writer.commit();\n index.reload();\n // Drop the writer deterministically so the directory lock is released\n // before the next rebuildTantivyIndex call (e.g. consecutive runs in\n // the same process).\n writer.waitMergingThreads();\n\n const indexedDocCount = wantFullRebuild\n ? addedDocCount\n : countTantivyDocsBest(prev, addedDocCount);\n\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 mode: wantFullRebuild ? 'full' : 'incremental',\n source_doc_count: sourceDocCount,\n indexed_doc_count: indexedDocCount,\n last_indexed_rowid: maxRowid,\n schema_fingerprint: fingerprint,\n },\n null,\n 2,\n )}\\n`,\n 'utf8',\n );\n\n updateSearchIndexStatus(bundle, 'tantivy', {\n status: 'ready',\n sourceDocCount,\n indexedDocCount,\n errorMessage: null,\n lastIndexedRowid: maxRowid,\n schemaFingerprint: fingerprint,\n });\n } catch (error) {\n updateSearchIndexStatus(bundle, 'tantivy', {\n status: 'failed',\n sourceDocCount,\n indexedDocCount: 0,\n errorMessage: getErrorMessage(error),\n });\n throw error;\n }\n\n return getSearchIndexStatus(bundle, 'tantivy') as SearchIndexStatus;\n}\n\n// On an incremental run we know how many docs we added, but we want the\n// status row to reflect the index's true size. Fall back to the prior\n// `indexed_doc_count` when present and accumulate; if there is no prior\n// (shouldn't happen in the incremental path because last_indexed_rowid > 0\n// gates entry, but be defensive), just report what we wrote.\nfunction countTantivyDocsBest(prev: SearchIndexStatus | null, added: number): number {\n if (prev && typeof prev.indexed_doc_count === 'number') {\n return prev.indexed_doc_count + added;\n }\n return added;\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,\n error_message, last_indexed_rowid, schema_fingerprint\n ) VALUES (?, ?, 0, 0, ?, NULL, NULL, NULL)`,\n );\n stmt.run('fts5', 'ready', now);\n stmt.run('tantivy', 'missing', now);\n}\n\ninterface UpdateSearchIndexValues {\n status: SearchIndexStatus['status'];\n sourceDocCount: number;\n indexedDocCount: number;\n errorMessage: string | null;\n /** undefined leaves the column untouched; null clears it. */\n lastIndexedRowid?: number | null;\n /** undefined leaves the column untouched; null clears it. */\n schemaFingerprint?: string | null;\n}\n\nfunction updateSearchIndexStatus(\n bundle: Bundle,\n engine: SearchEngine,\n values: UpdateSearchIndexValues,\n): void {\n ensureSearchIndexStatusRows(bundle);\n const setClauses = [\n 'status = ?',\n 'source_doc_count = ?',\n 'indexed_doc_count = ?',\n 'updated_at = ?',\n 'error_message = ?',\n ];\n const params: unknown[] = [\n values.status,\n values.sourceDocCount,\n values.indexedDocCount,\n new Date().toISOString(),\n values.errorMessage,\n ];\n if (values.lastIndexedRowid !== undefined) {\n setClauses.push('last_indexed_rowid = ?');\n params.push(values.lastIndexedRowid);\n }\n if (values.schemaFingerprint !== undefined) {\n setClauses.push('schema_fingerprint = ?');\n params.push(values.schemaFingerprint);\n }\n params.push(engine);\n prepare(\n bundle.db,\n `UPDATE search_index_status SET ${setClauses.join(', ')} WHERE engine = ?`,\n ).run(...params);\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 { existsSync } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport type { Bundle } from '../core/bundle.js';\nimport { getErrorMessage } from '../core/errors.js';\nimport { clampLimit } from '../core/limits.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 = clampLimit(options.limit, { max: 500, fallback: 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 = clampLimit(options.limit, { max: 500, fallback: 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(`tantivy engine is unavailable: ${getErrorMessage(error)}`);\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 type { Bundle } from '../core/bundle.js';\nimport type { Confidence, SourceTool } from '../core/domain/types.js';\nimport { clampLimit } from '../core/limits.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 = clampLimit(filters.limit, { max: 1000, fallback: 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","/**\n * Compute a window of visible items centered on `selectedIndex` so the\n * selection stays in view as the user scrolls. Mirrors the helper from\n * `mzi-tfplan-explorer/components/visible-window.ts`.\n */\nexport function visibleWindow(args: {\n total: number;\n selectedIndex: number;\n height: number;\n}): { startIndex: number; endIndex: number } {\n const { total, selectedIndex, height } = args;\n if (total === 0 || height <= 0) return { startIndex: 0, endIndex: 0 };\n const safeHeight = Math.min(height, total);\n let startIndex = Math.max(0, selectedIndex - Math.floor(safeHeight / 2));\n if (startIndex + safeHeight > total) startIndex = total - safeHeight;\n if (startIndex < 0) startIndex = 0;\n const endIndex = Math.min(total, startIndex + safeHeight);\n return { startIndex, endIndex };\n}\n\nexport function clamp(value: number, min: number, max: number): number {\n if (value < min) return min;\n if (value > max) return max;\n return value;\n}\n","import { Box, Text, useApp, useInput, useStdout } from 'ink';\nimport { useEffect, useMemo, useState } from 'react';\nimport type { Bundle } from '../core/bundle.js';\nimport type { SourceTool } from '../core/domain/types.js';\nimport { type SearchHit, searchFullText } from '../services/search.js';\nimport {\n type SessionDetail,\n type SessionRow,\n getSession,\n listSessions,\n} from '../services/sessions.js';\nimport { clamp, visibleWindow } from './use-visible-window.js';\n\ntype Screen = 'sessions' | 'detail' | 'search';\ntype InputMode = 'normal' | 'search';\n\ninterface Props {\n bundle: Bundle;\n}\n\nconst TOOL_FILTERS: (SourceTool | 'all')[] = ['all', 'codex', 'claude', 'gemini', 'cursor'];\n\nexport function App({ bundle }: Props): React.JSX.Element {\n const { exit } = useApp();\n const { stdout } = useStdout();\n const [rows, setRows] = useState<SessionRow[]>([]);\n const [selected, setSelected] = useState(0);\n const [screen, setScreen] = useState<Screen>('sessions');\n const [detail, setDetail] = useState<SessionDetail | null>(null);\n const [detailScroll, setDetailScroll] = useState(0);\n const [toolFilterIdx, setToolFilterIdx] = useState(0);\n const [inputMode, setInputMode] = useState<InputMode>('normal');\n const [searchBuffer, setSearchBuffer] = useState('');\n const [searchHits, setSearchHits] = useState<SearchHit[]>([]);\n const [pendingG, setPendingG] = useState(false);\n const [statusMessage, setStatusMessage] = useState<string | null>(null);\n\n const termHeight = stdout?.rows ?? 24;\n const listHeight = Math.max(5, termHeight - 6);\n const detailHeight = Math.max(5, termHeight - 4);\n\n const toolFilter = TOOL_FILTERS[toolFilterIdx];\n\n // Reload sessions whenever the active filter changes.\n useEffect(() => {\n const filtered = listSessions(bundle, {\n sourceTool: toolFilter === 'all' ? undefined : (toolFilter as SourceTool),\n limit: 500,\n });\n setRows(filtered);\n setSelected(0);\n }, [bundle, toolFilter]);\n\n const visible = useMemo(\n () => visibleWindow({ total: rows.length, selectedIndex: selected, height: listHeight }),\n [rows.length, selected, listHeight],\n );\n\n useInput((input, key) => {\n if (inputMode === 'search') {\n if (key.escape) {\n setInputMode('normal');\n setSearchBuffer('');\n return;\n }\n if (key.return) {\n if (searchBuffer.trim().length > 0) {\n const hits = searchFullText(bundle, { query: searchBuffer.trim(), limit: 200 });\n setSearchHits(hits);\n setScreen('search');\n setSelected(0);\n }\n setInputMode('normal');\n return;\n }\n if (key.backspace || key.delete) {\n setSearchBuffer((b) => b.slice(0, -1));\n return;\n }\n if (input && !key.ctrl && !key.meta) {\n setSearchBuffer((b) => b + input);\n }\n return;\n }\n\n // ---- normal mode ----\n if (input === 'q' && screen === 'sessions') {\n exit();\n return;\n }\n\n if (key.escape) {\n if (screen === 'detail' || screen === 'search') {\n setScreen('sessions');\n setDetail(null);\n setDetailScroll(0);\n setSelected(0);\n }\n return;\n }\n\n if (input === '/') {\n setInputMode('search');\n setSearchBuffer('');\n return;\n }\n\n if (input === 's' && screen === 'sessions') {\n setToolFilterIdx((i) => (i + 1) % TOOL_FILTERS.length);\n return;\n }\n\n if (input === 'R') {\n // Reload current view.\n if (screen === 'sessions' || screen === 'search') {\n const reloaded = listSessions(bundle, {\n sourceTool: toolFilter === 'all' ? undefined : (toolFilter as SourceTool),\n limit: 500,\n });\n setRows(reloaded);\n setStatusMessage(`reloaded ${reloaded.length} sessions`);\n }\n return;\n }\n\n // Navigation works in any list-like screen.\n const length =\n screen === 'sessions' ? rows.length : screen === 'search' ? searchHits.length : 0;\n\n if (screen === 'detail') {\n const totalLines = (detail?.events.length ?? 0) + 8; // rough header height\n if (input === 'j' || key.downArrow) {\n setDetailScroll((s) => clamp(s + 1, 0, Math.max(0, totalLines - detailHeight)));\n return;\n }\n if (input === 'k' || key.upArrow) {\n setDetailScroll((s) => clamp(s - 1, 0, Math.max(0, totalLines - detailHeight)));\n return;\n }\n if (input === 'G') {\n setDetailScroll(Math.max(0, totalLines - detailHeight));\n return;\n }\n if (input === 'g') {\n if (pendingG) {\n setDetailScroll(0);\n setPendingG(false);\n } else {\n setPendingG(true);\n setTimeout(() => setPendingG(false), 500);\n }\n return;\n }\n if (key.ctrl && input === 'd') {\n setDetailScroll((s) => clamp(s + Math.floor(detailHeight / 2), 0, totalLines));\n return;\n }\n if (key.ctrl && input === 'u') {\n setDetailScroll((s) => clamp(s - Math.floor(detailHeight / 2), 0, totalLines));\n return;\n }\n return;\n }\n\n if (length === 0) return;\n\n if (input === 'j' || key.downArrow) {\n setSelected((i) => clamp(i + 1, 0, length - 1));\n return;\n }\n if (input === 'k' || key.upArrow) {\n setSelected((i) => clamp(i - 1, 0, length - 1));\n return;\n }\n if (input === 'G') {\n setSelected(length - 1);\n return;\n }\n if (input === 'g') {\n if (pendingG) {\n setSelected(0);\n setPendingG(false);\n } else {\n setPendingG(true);\n setTimeout(() => setPendingG(false), 500);\n }\n return;\n }\n if (key.ctrl && input === 'd') {\n setSelected((i) => clamp(i + Math.floor(listHeight / 2), 0, length - 1));\n return;\n }\n if (key.ctrl && input === 'u') {\n setSelected((i) => clamp(i - Math.floor(listHeight / 2), 0, length - 1));\n return;\n }\n if (key.return) {\n const sid =\n screen === 'sessions' ? rows[selected]?.session_id : searchHits[selected]?.session_id;\n if (sid) {\n const d = getSession(bundle, sid);\n if (d) {\n setDetail(d);\n setScreen('detail');\n setDetailScroll(0);\n }\n }\n }\n });\n\n useEffect(() => {\n if (!statusMessage) return;\n const t = setTimeout(() => setStatusMessage(null), 2000);\n return () => clearTimeout(t);\n }, [statusMessage]);\n\n if (screen === 'detail' && detail) {\n return <DetailView detail={detail} scroll={detailScroll} height={detailHeight} />;\n }\n\n if (screen === 'search') {\n return (\n <Box flexDirection=\"column\">\n <Box>\n <Text color=\"cyan\" bold>\n search:{' '}\n </Text>\n <Text>{searchHits.length} hits</Text>\n </Box>\n <SearchList hits={searchHits} selected={selected} height={listHeight} />\n <HelpBar\n mode=\"search\"\n inputMode={inputMode}\n searchBuffer={searchBuffer}\n status={statusMessage}\n />\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\">\n <FilterBar toolFilter={toolFilter} count={rows.length} />\n <SessionList rows={rows} selected={selected} window={visible} height={listHeight} />\n <HelpBar\n mode=\"sessions\"\n inputMode={inputMode}\n searchBuffer={searchBuffer}\n status={statusMessage}\n />\n </Box>\n );\n}\n\nfunction FilterBar({\n toolFilter,\n count,\n}: {\n toolFilter: SourceTool | 'all' | undefined;\n count: number;\n}): React.JSX.Element {\n return (\n <Box>\n <Text color=\"cyan\" bold>\n prosa\n </Text>\n <Text> · sessions</Text>\n <Text dimColor> · </Text>\n <Text>source: </Text>\n <Text color=\"yellow\">{toolFilter}</Text>\n <Text dimColor> · </Text>\n <Text>count: </Text>\n <Text color=\"green\">{count}</Text>\n </Box>\n );\n}\n\nfunction SessionList({\n rows,\n selected,\n window,\n height,\n}: {\n rows: SessionRow[];\n selected: number;\n window: { startIndex: number; endIndex: number };\n height: number;\n}): React.JSX.Element {\n const slice = rows.slice(window.startIndex, window.endIndex);\n return (\n <Box flexDirection=\"column\" height={height}>\n {slice.map((row, i) => {\n const realIndex = window.startIndex + i;\n const isSelected = realIndex === selected;\n return (\n <Box key={row.session_id}>\n <Text\n color={isSelected ? 'black' : undefined}\n backgroundColor={isSelected ? 'cyan' : undefined}\n >\n {`${isSelected ? '› ' : ' '}${pad(row.start_ts ?? '—', 24)} ${pad(row.source_tool, 7)} ${pad(row.message_count.toString(), 5)} ${pad(row.tool_call_count.toString(), 5)} ${trim(row.cwd_initial ?? '—', 32)} ${trim(row.title ?? row.source_session_id, 30)}`}\n </Text>\n </Box>\n );\n })}\n </Box>\n );\n}\n\nfunction SearchList({\n hits,\n selected,\n height,\n}: {\n hits: SearchHit[];\n selected: number;\n height: number;\n}): React.JSX.Element {\n const window = visibleWindow({ total: hits.length, selectedIndex: selected, height });\n const slice = hits.slice(window.startIndex, window.endIndex);\n return (\n <Box flexDirection=\"column\" height={height}>\n {slice.map((hit, i) => {\n const realIndex = window.startIndex + i;\n const isSelected = realIndex === selected;\n return (\n <Box key={hit.doc_id}>\n <Text\n color={isSelected ? 'black' : undefined}\n backgroundColor={isSelected ? 'cyan' : undefined}\n >\n {`${isSelected ? '› ' : ' '}${pad(hit.timestamp ?? '—', 24)} ${pad(hit.role ?? '—', 10)} ${trim(hit.session_id ?? '—', 16)} ${trim(hit.snippet.replace(/\\s+/g, ' '), 80)}`}\n </Text>\n </Box>\n );\n })}\n </Box>\n );\n}\n\nfunction DetailView({\n detail,\n scroll,\n height,\n}: {\n detail: SessionDetail;\n scroll: number;\n height: number;\n}): React.JSX.Element {\n const headerLines = [\n `# session ${detail.session.session_id}`,\n `source: ${detail.session.source_tool} · start: ${detail.session.start_ts ?? '—'}`,\n `cwd: ${detail.session.cwd_initial ?? '—'} · branch: ${detail.session.git_branch_initial ?? '—'}`,\n `models: ${detail.session.model_first ?? '?'} → ${detail.session.model_last ?? '?'}`,\n `messages: ${detail.session.message_count} · tool_calls: ${detail.session.tool_call_count} · confidence: ${detail.session.timeline_confidence}`,\n '',\n ];\n const eventLines = detail.events.map((e) => {\n const role = e.role ? `[${e.role}] ` : '';\n const tool = e.tool_name ? ` tool=${e.tool_name}` : '';\n const err = e.is_error === 1 ? ' ERROR' : '';\n const ts = e.timestamp ?? '';\n return `${pad(ts, 24)} ${pad(e.event_type, 18)} ${role}${tool}${err}`;\n });\n const allLines = [...headerLines, ...eventLines];\n const slice = allLines.slice(scroll, scroll + height);\n return (\n <Box flexDirection=\"column\" height={height}>\n {slice.map((line, idx) => {\n // Detail lines are content-derived; the (scroll, idx) pair is unique\n // within a render and we don't reorder them, so it's safe as a key.\n const key = `l${scroll + idx}-${line.length}`;\n return <Text key={key}>{line}</Text>;\n })}\n <Box marginTop={1}>\n <Text dimColor>j/k scroll · gg/G top/bottom · Esc back · q quits from sessions</Text>\n </Box>\n </Box>\n );\n}\n\nfunction HelpBar({\n mode,\n inputMode,\n searchBuffer,\n status,\n}: {\n mode: 'sessions' | 'search';\n inputMode: InputMode;\n searchBuffer: string;\n status: string | null;\n}): React.JSX.Element {\n if (inputMode === 'search') {\n return (\n <Box>\n <Text color=\"yellow\">/ </Text>\n <Text>{searchBuffer}</Text>\n <Text inverse>_</Text>\n <Text dimColor> · Enter to run · Esc to cancel</Text>\n </Box>\n );\n }\n return (\n <Box>\n {status ? (\n <Text color=\"green\">{status}</Text>\n ) : (\n <Text dimColor>\n j/k nav · Enter open · / search · s cycle source · R reload · Esc back · q quit\n {mode === 'search' ? '' : ''}\n </Text>\n )}\n </Box>\n );\n}\n\nfunction pad(s: string, n: number): string {\n if (s.length >= n) return s.slice(0, n);\n return s + ' '.repeat(n - s.length);\n}\n\nfunction trim(s: string, n: number): string {\n if (s.length <= n) return pad(s, n);\n return `${s.slice(0, n - 1)}…`;\n}\n","#!/usr/bin/env node\nimport { Command } from 'commander';\nimport { PROSA_PARSER_VERSION } from '../core/version.js';\nimport { analyticsCommand } from './commands/analytics.js';\nimport { compileAllCommand, compileCommand } from './commands/compile.js';\nimport { exportCommand } from './commands/export.js';\nimport { indexCommand } from './commands/index.js';\nimport { initCommand } from './commands/init.js';\nimport { mcpCommand } from './commands/mcp.js';\nimport { queryCommand } from './commands/query.js';\nimport { searchCommand } from './commands/search.js';\nimport { sessionsCommand } from './commands/sessions.js';\nimport { tuiCommand } from './commands/tui.js';\n\n/**\n * Drop a leading literal `--` token from the user-args portion of argv.\n *\n * `pnpm dev -- compile codex --overwrite` expands the script invocation to\n * `node prosa.ts -- compile codex --overwrite` — pnpm passes the `--`\n * through verbatim. Combined with Commander's `enablePositionalOptions()`,\n * Commander treats the `--` as the option terminator and silently ignores\n * every flag that follows. Stripping it once at the entrypoint lets both\n * `pnpm dev -- compile …` and the direct `node prosa.ts compile …` form\n * accept flags identically.\n */\nfunction stripLeadingDoubleDash(argv: readonly string[]): string[] {\n if (argv.length >= 3 && argv[2] === '--') {\n return [argv[0]!, argv[1]!, ...argv.slice(3)];\n }\n return [...argv];\n}\n\nexport async function runCli(argv: readonly string[]): Promise<void> {\n const program = new Command()\n .name('prosa')\n .enablePositionalOptions()\n .description(\n 'Compile, search and export local agent session histories\\n' +\n '(Cursor, Codex CLI, Claude Code, Gemini CLI) into one canonical store.',\n )\n .version(PROSA_PARSER_VERSION, '-v, --version');\n\n program.addCommand(initCommand());\n program.addCommand(compileCommand());\n program.addCommand(compileAllCommand());\n program.addCommand(indexCommand());\n program.addCommand(sessionsCommand());\n program.addCommand(searchCommand());\n program.addCommand(exportCommand());\n program.addCommand(queryCommand());\n program.addCommand(analyticsCommand());\n program.addCommand(mcpCommand());\n program.addCommand(tuiCommand());\n\n await program.parseAsync(stripLeadingDoubleDash(argv));\n}\n\n// Auto-execute when invoked as the entry point (`node dist/cli/main.js …` or\n// via the `prosa` bin shim). Importing this file as a library still gives\n// `runCli` without side effects.\nconst isEntry = import.meta.url === `file://${process.argv[1]}`;\nif (isEntry) {\n runCli(process.argv).catch((error: unknown) => {\n process.stderr.write(\n `${error instanceof Error ? (error.stack ?? error.message) : String(error)}\\n`,\n );\n process.exit(1);\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 = 4;\n","import path from 'node:path';\nimport { Command } from 'commander';\nimport { defaultBundlePath } from '../../core/bundle.js';\nimport {\n type AnalyticsReport,\n type AnalyticsReportFilters,\n runAnalyticsReport,\n} from '../../services/analytics.js';\nimport { exportBundleParquet } from '../../services/export/parquet.js';\nimport { withBundle } from '../bundle.js';\nimport { printRows } from '../output.js';\nimport { parseOutputFormat, parseSourceTool } from '../parsers.js';\n\ninterface AnalyticsCliOptions {\n store: string;\n parquetDir?: string;\n refresh?: boolean;\n source?: string;\n since?: string;\n until?: string;\n limit: string;\n outputFormat: string;\n toolName?: string;\n canonicalType?: string;\n errorsOnly?: boolean;\n category?: string;\n model?: string;\n project?: string;\n}\n\nexport function analyticsCommand(): Command {\n const command = new Command('analytics').description(\n 'Run high-level analytics reports over exported Parquet files.',\n );\n\n command.addCommand(reportCommand('sessions', 'Summarize sessions by source, project and model.'));\n command.addCommand(reportCommand('tools', 'Summarize tool usage, status, duration and errors.'));\n command.addCommand(\n reportCommand('errors', 'List import errors, failed tool results and uncertainties.'),\n );\n command.addCommand(reportCommand('models', 'Summarize model usage by source, project and time.'));\n command.addCommand(\n reportCommand('projects', 'Summarize project activity and operational counts.'),\n );\n\n return command;\n}\n\nfunction reportCommand(report: AnalyticsReport, description: string): Command {\n const command = addCommonOptions(new Command(report).description(description));\n\n if (report === 'tools') {\n command\n .option('--tool-name <name>', 'filter by exact tool name')\n .option('--canonical-type <type>', 'filter by canonical tool type')\n .option('--errors-only', 'only include tool calls with errors');\n }\n if (report === 'errors') {\n command\n .option('--tool-name <name>', 'filter by exact tool name')\n .option('--category <category>', 'filter by error category');\n }\n if (report === 'models') {\n command.option('--model <model>', 'filter by exact model name');\n }\n if (report === 'projects') {\n command.option('--project <text>', 'filter by project id, name, or path substring');\n }\n if (report === 'sessions') {\n command.option('--project <text>', 'filter by project id, name, or path substring');\n }\n\n return command.action(async (options: AnalyticsCliOptions) => {\n const format = parseOutputFormat(options.outputFormat, 'table');\n const parquetDir = await resolveParquetDir(options);\n const filters = buildFilters(options);\n const result = await runAnalyticsReport({ parquetDir, report, filters });\n\n printRows(result.rows, {\n format,\n columns: result.columns,\n meta: { report, count: result.rows.length },\n });\n });\n}\n\nfunction addCommonOptions(command: Command): Command {\n return command\n .option('--store <path>', 'bundle directory', defaultBundlePath())\n .option('--parquet-dir <path>', 'Parquet directory (default: <store>/parquet)')\n .option('--refresh', 'export Parquet before running the report')\n .option('--source <tool>', 'filter by source tool: cursor|codex|claude|gemini')\n .option('--since <iso>', 'lower timestamp bound (inclusive)')\n .option('--until <iso>', 'upper timestamp bound (exclusive)')\n .option('--limit <n>', 'maximum rows', '50')\n .option('--output-format <fmt>', 'interactive|table|json|csv', 'table');\n}\n\nasync function resolveParquetDir(options: AnalyticsCliOptions): Promise<string> {\n const storePath = path.resolve(options.store);\n const outDir = options.parquetDir ? path.resolve(options.parquetDir) : undefined;\n if (options.refresh) {\n const result = await exportBundleParquet({ bundlePath: storePath, outDir });\n return result.outDir;\n }\n\n return outDir ?? (await withBundle(storePath, (bundle) => bundle.paths.parquet));\n}\n\nfunction buildFilters(options: AnalyticsCliOptions): AnalyticsReportFilters {\n return {\n source: parseSourceTool(options.source),\n since: options.since,\n until: options.until,\n limit: Number.parseInt(options.limit, 10),\n toolName: options.toolName,\n canonicalType: options.canonicalType,\n errorsOnly: options.errorsOnly,\n category: options.category,\n model: options.model,\n project: options.project,\n };\n}\n","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\n/**\n * Open an existing bundle or transparently initialize one if the store path is\n * missing or has not been initialized yet.\n */\nexport async function openOrInitBundle(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 && !dirStat.isDirectory()) {\n throw new Error(`bundle path not found or not a directory: ${resolved}`);\n }\n\n if (!dirStat || !(await exists(paths.manifest))) {\n return await initBundle(resolved);\n }\n\n return await openBundle(resolved);\n}\n\nexport function closeBundle(bundle: Bundle): void {\n closeDb(bundle.db);\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","export const SQL_003_ANALYTICS_VIEWS = String.raw`\nCREATE VIEW IF NOT EXISTS session_facts AS\nWITH turn_counts AS (\n SELECT session_id, count(*) AS turn_count\n FROM turns\n GROUP BY session_id\n),\nmessage_counts AS (\n SELECT session_id,\n count(*) AS message_count,\n sum(CASE WHEN role = 'user' THEN 1 ELSE 0 END) AS user_message_count,\n sum(CASE WHEN role = 'assistant' THEN 1 ELSE 0 END) AS assistant_message_count\n FROM messages\n GROUP BY session_id\n),\ntool_call_counts AS (\n SELECT session_id,\n count(*) AS tool_call_count,\n sum(CASE WHEN status = 'error' THEN 1 ELSE 0 END) AS tool_call_error_count\n FROM tool_calls\n GROUP BY session_id\n),\ntool_result_counts AS (\n SELECT session_id,\n count(*) AS tool_result_count,\n sum(CASE WHEN is_error = 1 OR (exit_code IS NOT NULL AND exit_code <> 0)\n THEN 1 ELSE 0 END) AS tool_result_error_count,\n sum(COALESCE(duration_ms, 0)) AS tool_duration_ms\n FROM tool_results\n GROUP BY session_id\n),\nsearch_doc_counts AS (\n SELECT session_id, count(*) AS search_doc_count\n FROM search_docs\n WHERE session_id IS NOT NULL\n GROUP BY session_id\n)\nSELECT s.session_id,\n s.source_tool,\n s.source_session_id,\n s.project_id,\n p.display_name AS project_name,\n p.canonical_path AS project_path,\n s.parent_session_id,\n s.is_subagent,\n s.agent_role,\n s.agent_nickname,\n s.title,\n s.start_ts,\n s.end_ts,\n CASE\n WHEN s.start_ts IS NOT NULL AND s.end_ts IS NOT NULL\n THEN ROUND((julianday(s.end_ts) - julianday(s.start_ts)) * 86400, 3)\n ELSE NULL\n END AS duration_seconds,\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 sf.path AS source_file_path,\n COALESCE(tc.turn_count, 0) AS turn_count,\n COALESCE(mc.message_count, 0) AS message_count,\n COALESCE(mc.user_message_count, 0) AS user_message_count,\n COALESCE(mc.assistant_message_count, 0) AS assistant_message_count,\n COALESCE(tcc.tool_call_count, 0) AS tool_call_count,\n COALESCE(trc.tool_result_count, 0) AS tool_result_count,\n COALESCE(tcc.tool_call_error_count, 0)\n + COALESCE(trc.tool_result_error_count, 0) AS tool_error_count,\n COALESCE(trc.tool_duration_ms, 0) AS tool_duration_ms,\n COALESCE(sdc.search_doc_count, 0) AS search_doc_count\n FROM sessions s\n LEFT JOIN projects p ON p.project_id = s.project_id\n LEFT JOIN raw_records rr ON rr.raw_record_id = s.raw_record_id\n LEFT JOIN source_files sf ON sf.source_file_id = rr.source_file_id\n LEFT JOIN turn_counts tc ON tc.session_id = s.session_id\n LEFT JOIN message_counts mc ON mc.session_id = s.session_id\n LEFT JOIN tool_call_counts tcc ON tcc.session_id = s.session_id\n LEFT JOIN tool_result_counts trc ON trc.session_id = s.session_id\n LEFT JOIN search_doc_counts sdc ON sdc.session_id = s.session_id;\n\nCREATE VIEW IF NOT EXISTS tool_usage_facts AS\nWITH result_rollup AS (\n SELECT tool_call_id,\n session_id,\n count(*) AS tool_result_count,\n max(status) AS result_status,\n max(is_error) AS is_error,\n min(exit_code) AS exit_code,\n sum(COALESCE(duration_ms, 0)) AS duration_ms,\n max(preview) AS preview\n FROM tool_results\n GROUP BY tool_call_id, session_id\n)\nSELECT tc.tool_call_id,\n tc.session_id,\n s.source_tool,\n s.source_session_id,\n s.project_id,\n p.display_name AS project_name,\n p.canonical_path AS project_path,\n tc.turn_id,\n tc.message_id,\n tc.event_id,\n tc.source_call_id,\n tc.tool_name,\n tc.canonical_tool_type,\n tc.command,\n tc.cwd,\n tc.path,\n tc.query,\n tc.timestamp_start,\n tc.timestamp_end,\n CASE\n WHEN tc.timestamp_start IS NOT NULL AND tc.timestamp_end IS NOT NULL\n THEN ROUND((julianday(tc.timestamp_end) - julianday(tc.timestamp_start)) * 86400, 3)\n ELSE NULL\n END AS call_duration_seconds,\n tc.status AS call_status,\n rr.result_status,\n COALESCE(rr.is_error, 0) AS is_error,\n rr.exit_code,\n rr.duration_ms AS result_duration_ms,\n COALESCE(rr.tool_result_count, 0) AS tool_result_count,\n rr.preview,\n tc.raw_record_id\n FROM tool_calls tc\n LEFT JOIN sessions s ON s.session_id = tc.session_id\n LEFT JOIN projects p ON p.project_id = s.project_id\n LEFT JOIN result_rollup rr ON rr.tool_call_id = tc.tool_call_id;\n\nCREATE VIEW IF NOT EXISTS error_facts AS\nSELECT 'tool_result:' || tr.tool_result_id AS error_id,\n 'tool_result' AS error_category,\n s.source_tool,\n s.project_id,\n p.display_name AS project_name,\n tr.session_id,\n COALESCE(tc.timestamp_end, tc.timestamp_start) AS timestamp,\n tc.tool_name,\n tc.canonical_tool_type,\n COALESCE(tr.status, tc.status) AS status,\n tr.exit_code,\n NULL AS message,\n tr.preview,\n NULL AS entity_type,\n NULL AS entity_id,\n tr.raw_record_id\n FROM tool_results tr\n LEFT JOIN tool_calls tc ON tc.tool_call_id = tr.tool_call_id\n LEFT JOIN sessions s ON s.session_id = tr.session_id\n LEFT JOIN projects p ON p.project_id = s.project_id\n WHERE tr.is_error = 1 OR (tr.exit_code IS NOT NULL AND tr.exit_code <> 0)\nUNION ALL\nSELECT 'import_error:' || CAST(ie.error_id AS TEXT) AS error_id,\n 'import_error' AS error_category,\n COALESCE(rr.source_tool, ib.source_tool) AS source_tool,\n NULL AS project_id,\n NULL AS project_name,\n NULL AS session_id,\n ie.occurred_at AS timestamp,\n NULL AS tool_name,\n NULL AS canonical_tool_type,\n ie.kind AS status,\n NULL AS exit_code,\n ie.message,\n NULL AS preview,\n NULL AS entity_type,\n NULL AS entity_id,\n ie.raw_record_id\n FROM import_errors ie\n LEFT JOIN import_batches ib ON ib.batch_id = ie.batch_id\n LEFT JOIN raw_records rr ON rr.raw_record_id = ie.raw_record_id\nUNION ALL\nSELECT 'uncertainty:' || CAST(u.uncertainty_id AS TEXT) AS error_id,\n 'uncertainty' AS error_category,\n NULL AS source_tool,\n NULL AS project_id,\n NULL AS project_name,\n CASE WHEN u.entity_type = 'session' THEN u.entity_id ELSE NULL END AS session_id,\n NULL AS timestamp,\n NULL AS tool_name,\n NULL AS canonical_tool_type,\n u.reason AS status,\n NULL AS exit_code,\n u.reason AS message,\n NULL AS preview,\n u.entity_type,\n u.entity_id,\n NULL AS raw_record_id\n FROM uncertainties u;\n\nCREATE VIEW IF NOT EXISTS model_usage AS\nWITH model_events AS (\n SELECT s.source_tool,\n s.project_id,\n p.display_name AS project_name,\n p.canonical_path AS project_path,\n s.session_id,\n NULL AS turn_id,\n s.model_first AS model,\n s.start_ts AS timestamp,\n 'session_first' AS observation_type\n FROM sessions s\n LEFT JOIN projects p ON p.project_id = s.project_id\n WHERE s.model_first IS NOT NULL\n UNION ALL\n SELECT s.source_tool, s.project_id, p.display_name, p.canonical_path,\n s.session_id, NULL AS turn_id, s.model_last AS model, s.end_ts AS timestamp,\n 'session_last' AS observation_type\n FROM sessions s\n LEFT JOIN projects p ON p.project_id = s.project_id\n WHERE s.model_last IS NOT NULL\n UNION ALL\n SELECT s.source_tool, s.project_id, p.display_name, p.canonical_path,\n t.session_id, t.turn_id, t.model, t.start_ts AS timestamp, 'turn' AS observation_type\n FROM turns t\n LEFT JOIN sessions s ON s.session_id = t.session_id\n LEFT JOIN projects p ON p.project_id = s.project_id\n WHERE t.model IS NOT NULL\n UNION ALL\n SELECT s.source_tool, s.project_id, p.display_name, p.canonical_path,\n m.session_id, m.turn_id, m.model, m.timestamp, 'message' AS observation_type\n FROM messages m\n LEFT JOIN sessions s ON s.session_id = m.session_id\n LEFT JOIN projects p ON p.project_id = s.project_id\n WHERE m.model IS NOT NULL\n)\nSELECT source_tool,\n project_id,\n project_name,\n project_path,\n model,\n count(DISTINCT session_id) AS session_count,\n count(DISTINCT turn_id) AS turn_count,\n count(*) AS observation_count,\n sum(CASE WHEN observation_type = 'message' THEN 1 ELSE 0 END) AS message_count,\n min(timestamp) AS first_seen_ts,\n max(timestamp) AS last_seen_ts\n FROM model_events\n GROUP BY source_tool, project_id, project_name, project_path, model;\n\nCREATE VIEW IF NOT EXISTS project_activity AS\nSELECT s.source_tool,\n s.project_id,\n COALESCE(p.display_name, s.cwd_initial, '(unknown)') AS project_name,\n p.canonical_path AS project_path,\n min(s.start_ts) AS first_session_ts,\n max(COALESCE(s.end_ts, s.start_ts)) AS latest_session_ts,\n count(DISTINCT s.session_id) AS session_count,\n count(DISTINCT CASE WHEN s.timeline_confidence = 'low' THEN s.session_id END)\n AS low_confidence_session_count,\n count(DISTINCT t.turn_id) AS turn_count,\n count(DISTINCT m.message_id) AS message_count,\n count(DISTINCT tc.tool_call_id) AS tool_call_count,\n count(DISTINCT tr.tool_result_id) AS tool_result_count,\n count(DISTINCT CASE\n WHEN tr.is_error = 1 OR (tr.exit_code IS NOT NULL AND tr.exit_code <> 0)\n THEN tr.tool_result_id\n END) AS tool_error_count,\n count(DISTINCT sd.doc_id) AS search_doc_count\n FROM sessions s\n LEFT JOIN projects p ON p.project_id = s.project_id\n LEFT JOIN turns t ON t.session_id = s.session_id\n LEFT JOIN messages m ON m.session_id = s.session_id\n LEFT JOIN tool_calls tc ON tc.session_id = s.session_id\n LEFT JOIN tool_results tr ON tr.session_id = s.session_id\n LEFT JOIN search_docs sd ON sd.session_id = s.session_id\n GROUP BY s.source_tool, s.project_id, p.display_name, s.cwd_initial, p.canonical_path;\n`;\n","// Adds the checkpoint columns that let `rebuildTantivyIndex` run\n// incrementally instead of dropping the on-disk index every compile.\n//\n// - `last_indexed_rowid` is the highest `search_docs.rowid` already in the\n// Tantivy segments. The rebuild path SELECTs `WHERE rowid > last_indexed_rowid`\n// on incremental runs.\n// - `schema_fingerprint` is a deterministic hash of the schema definition.\n// When the code-time fingerprint and the persisted fingerprint disagree\n// the next rebuild falls back to a full re-index.\n//\n// Both columns are nullable. Bundles upgraded from v3 inherit NULL, which\n// the rebuild path treats as \"force full rebuild\" — the safe default.\n\nexport const SQL_004_TANTIVY_CHECKPOINT = String.raw`\nALTER TABLE search_index_status ADD COLUMN last_indexed_rowid INTEGER;\nALTER TABLE search_index_status ADD COLUMN schema_fingerprint TEXT;\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';\nimport { SQL_003_ANALYTICS_VIEWS } from './sql/003_analytics_views.js';\nimport { SQL_004_TANTIVY_CHECKPOINT } from './sql/004_tantivy_checkpoint.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 { version: 3, name: 'analytics_views', sql: SQL_003_ANALYTICS_VIEWS },\n { version: 4, name: 'tantivy_checkpoint', sql: SQL_004_TANTIVY_CHECKPOINT },\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","import type { Bundle } from '../core/bundle.js';\nimport { clampLimit } from '../core/limits.js';\nimport { type DuckDbQueryResult, queryDuckDbParquet } from './export/parquet.js';\n\nexport const ANALYTICS_REPORTS = ['sessions', 'tools', 'errors', 'models', 'projects'] as const;\nexport type AnalyticsReport = (typeof ANALYTICS_REPORTS)[number];\n\nexport type AnalyticsDialect = 'sqlite' | 'duckdb';\n\nexport interface AnalyticsReportFilters {\n source?: string;\n since?: string;\n until?: string;\n limit?: number;\n toolName?: string;\n canonicalType?: string;\n errorsOnly?: boolean;\n category?: string;\n model?: string;\n project?: string;\n sessionId?: string;\n sourcePathSubstring?: string;\n}\n\nexport interface AnalyticsReportOptions {\n parquetDir: string;\n report: AnalyticsReport;\n filters?: AnalyticsReportFilters;\n}\n\nexport interface AnalyticsBundleReportOptions {\n bundle: Bundle;\n report: AnalyticsReport;\n filters?: AnalyticsReportFilters;\n}\n\nexport async function runAnalyticsReport(\n options: AnalyticsReportOptions,\n): Promise<DuckDbQueryResult> {\n return queryDuckDbParquet({\n parquetDir: options.parquetDir,\n sql: buildAnalyticsSql(options.report, options.filters ?? {}, 'duckdb'),\n });\n}\n\nexport function runAnalyticsReportFromBundle(\n options: AnalyticsBundleReportOptions,\n): DuckDbQueryResult {\n const sql = buildAnalyticsSql(options.report, options.filters ?? {}, 'sqlite');\n const stmt = options.bundle.db.prepare<unknown[], Record<string, unknown>>(sql);\n const rows = stmt.all();\n const columns = stmt.columns().map((column) => column.name);\n return { columns, rows };\n}\n\nfunction buildAnalyticsSql(\n report: AnalyticsReport,\n filters: AnalyticsReportFilters,\n dialect: AnalyticsDialect,\n): string {\n switch (report) {\n case 'sessions':\n return buildSessionsSql(filters, dialect);\n case 'tools':\n return buildToolsSql(filters, dialect);\n case 'errors':\n return buildErrorsSql(filters, dialect);\n case 'models':\n return buildModelsSql(filters, dialect);\n case 'projects':\n return buildProjectsSql(filters, dialect);\n }\n}\n\nfunction buildSessionsSql(filters: AnalyticsReportFilters, dialect: AnalyticsDialect): string {\n const where = buildWhere([\n sourceFilter(filters),\n timeFilter('start_ts', filters),\n projectFilter(filters, dialect),\n filters.sessionId ? `session_id = ${sqlString(filters.sessionId)}` : null,\n filters.sourcePathSubstring\n ? `source_file_path LIKE ${sqlString(`%${escapeLike(filters.sourcePathSubstring)}%`)} ESCAPE '\\\\'`\n : null,\n ]);\n return `\n SELECT start_ts, source_tool, project_name, source_file_path, session_id,\n source_session_id, model_last, duration_seconds,\n message_count, tool_call_count, tool_result_count, tool_error_count,\n tool_duration_ms, timeline_confidence, title\n FROM session_facts\n ${where}\n ORDER BY start_ts DESC NULLS LAST\n LIMIT ${limit(filters)}\n `;\n}\n\nfunction buildToolsSql(filters: AnalyticsReportFilters, dialect: AnalyticsDialect): string {\n const where = buildWhere([\n sourceFilter(filters),\n timeFilter('timestamp_start', filters),\n projectFilter(filters, dialect),\n filters.toolName ? `tool_name = ${sqlString(filters.toolName)}` : null,\n filters.canonicalType ? `canonical_tool_type = ${sqlString(filters.canonicalType)}` : null,\n filters.errorsOnly ? `(is_error = 1 OR call_status = 'error')` : null,\n ]);\n return `\n SELECT tool_name, canonical_tool_type, source_tool, project_name,\n count(*) AS call_count,\n sum(CASE WHEN is_error = 1 OR call_status = 'error' THEN 1 ELSE 0 END) AS error_count,\n round(avg(result_duration_ms), 3) AS avg_result_duration_ms,\n max(timestamp_start) AS latest_ts\n FROM tool_usage_facts\n ${where}\n GROUP BY tool_name, canonical_tool_type, source_tool, project_name\n ORDER BY call_count DESC, error_count DESC, tool_name ASC\n LIMIT ${limit(filters)}\n `;\n}\n\nfunction buildErrorsSql(filters: AnalyticsReportFilters, dialect: AnalyticsDialect): string {\n const where = buildWhere([\n sourceFilter(filters),\n timeFilter('timestamp', filters),\n projectFilter(filters, dialect),\n filters.toolName ? `tool_name = ${sqlString(filters.toolName)}` : null,\n filters.category ? `error_category = ${sqlString(filters.category)}` : null,\n ]);\n return `\n SELECT timestamp, error_category, source_tool, project_name, session_id,\n tool_name, status, exit_code, message, preview\n FROM error_facts\n ${where}\n ORDER BY timestamp DESC NULLS LAST, error_id DESC\n LIMIT ${limit(filters)}\n `;\n}\n\nfunction buildModelsSql(filters: AnalyticsReportFilters, dialect: AnalyticsDialect): string {\n const where = buildWhere([\n sourceFilter(filters),\n rangeOverlapFilter('first_seen_ts', 'last_seen_ts', filters),\n projectFilter(filters, dialect),\n filters.model ? `model = ${sqlString(filters.model)}` : null,\n ]);\n return `\n SELECT model, source_tool, project_name, session_count, turn_count,\n message_count, observation_count, first_seen_ts, last_seen_ts\n FROM model_usage\n ${where}\n ORDER BY session_count DESC, observation_count DESC, model ASC\n LIMIT ${limit(filters)}\n `;\n}\n\nfunction buildProjectsSql(filters: AnalyticsReportFilters, dialect: AnalyticsDialect): string {\n const where = buildWhere([\n sourceFilter(filters),\n rangeOverlapFilter('first_session_ts', 'latest_session_ts', filters),\n projectFilter(filters, dialect),\n ]);\n return `\n SELECT latest_session_ts, source_tool, project_name, project_path,\n session_count, message_count, tool_call_count, tool_error_count,\n low_confidence_session_count\n FROM project_activity\n ${where}\n ORDER BY latest_session_ts DESC NULLS LAST, session_count DESC, project_name ASC\n LIMIT ${limit(filters)}\n `;\n}\n\nfunction sourceFilter(filters: AnalyticsReportFilters): string | null {\n return filters.source ? `source_tool = ${sqlString(filters.source)}` : null;\n}\n\nfunction timeFilter(column: string, filters: AnalyticsReportFilters): string | null {\n const filtersSql: string[] = [];\n if (filters.since)\n filtersSql.push(`(${column} IS NULL OR ${column} >= ${sqlString(filters.since)})`);\n if (filters.until)\n filtersSql.push(`(${column} IS NULL OR ${column} < ${sqlString(filters.until)})`);\n return filtersSql.length ? filtersSql.join(' AND ') : null;\n}\n\nfunction rangeOverlapFilter(\n firstColumn: string,\n lastColumn: string,\n filters: AnalyticsReportFilters,\n): string | null {\n const filtersSql: string[] = [];\n if (filters.since) {\n filtersSql.push(`(${lastColumn} IS NULL OR ${lastColumn} >= ${sqlString(filters.since)})`);\n }\n if (filters.until) {\n filtersSql.push(`(${firstColumn} IS NULL OR ${firstColumn} < ${sqlString(filters.until)})`);\n }\n return filtersSql.length ? filtersSql.join(' AND ') : null;\n}\n\nfunction projectFilter(filters: AnalyticsReportFilters, dialect: AnalyticsDialect): string | null {\n if (!filters.project) return null;\n const exact = sqlString(filters.project);\n const like = sqlString(`%${escapeLike(filters.project)}%`);\n // DuckDB's LIKE is case-sensitive, ILIKE is case-insensitive. SQLite's LIKE\n // is case-insensitive for ASCII by default, so we use LIKE there.\n const op = dialect === 'duckdb' ? 'ILIKE' : 'LIKE';\n return `(project_id = ${exact} OR project_name ${op} ${like} ESCAPE '\\\\' OR project_path ${op} ${like} ESCAPE '\\\\')`;\n}\n\nfunction buildWhere(filters: Array<string | null>): string {\n const active = filters.filter((filter): filter is string => Boolean(filter));\n return active.length ? `WHERE ${active.join(' AND ')}` : '';\n}\n\nfunction limit(filters: AnalyticsReportFilters): number {\n const value = Number.isFinite(filters.limit) ? filters.limit : undefined;\n return clampLimit(value, { max: 500, fallback: 50 });\n}\n\nfunction sqlString(value: string): string {\n return `'${value.replace(/'/g, \"''\")}'`;\n}\n\nfunction escapeLike(value: string): string {\n return value.replace(/[\\\\%_]/g, (match) => `\\\\${match}`);\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';\nimport { getErrorMessage } from '../../core/errors.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 const ANALYTICS_VIEWS = [\n 'session_facts',\n 'tool_usage_facts',\n 'error_facts',\n 'model_usage',\n 'project_activity',\n] as const;\n\nexport type ParquetTable = (typeof PARQUET_TABLES)[number];\nexport type AnalyticsView = (typeof ANALYTICS_VIEWS)[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 // Tuned via bench/bench-parquet.ts: zstd-1 matches snappy on write\n // time but halves file size, and ROW_GROUP_SIZE=100k cuts ~20% off\n // total export time for prosa's table widths. See\n // docs/roadmap/parquet-export-perf.md.\n await connection.run(\n `COPY (SELECT * FROM prosa.${quoteIdentifier(table)}) TO ${sqlString(files[table])} (FORMAT parquet, COMPRESSION zstd, COMPRESSION_LEVEL 1, ROW_GROUP_SIZE 100000)`,\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 await createAnalyticsViews(connection);\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: ${getErrorMessage(error)}`,\n );\n }\n}\n\nasync function createAnalyticsViews(connection: DuckDBConnection): Promise<void> {\n await connection.run(`\n CREATE OR REPLACE VIEW session_facts AS\n WITH turn_counts AS (\n SELECT session_id, count(*) AS turn_count\n FROM turns\n GROUP BY session_id\n ),\n message_counts AS (\n SELECT session_id,\n count(*) AS message_count,\n sum(CASE WHEN role = 'user' THEN 1 ELSE 0 END) AS user_message_count,\n sum(CASE WHEN role = 'assistant' THEN 1 ELSE 0 END) AS assistant_message_count\n FROM messages\n GROUP BY session_id\n ),\n tool_call_counts AS (\n SELECT session_id,\n count(*) AS tool_call_count,\n sum(CASE WHEN status = 'error' THEN 1 ELSE 0 END) AS tool_call_error_count\n FROM tool_calls\n GROUP BY session_id\n ),\n tool_result_counts AS (\n SELECT session_id,\n count(*) AS tool_result_count,\n sum(CASE WHEN is_error = 1 OR (exit_code IS NOT NULL AND exit_code <> 0)\n THEN 1 ELSE 0 END) AS tool_result_error_count,\n sum(COALESCE(duration_ms, 0)) AS tool_duration_ms\n FROM tool_results\n GROUP BY session_id\n ),\n search_doc_counts AS (\n SELECT session_id, count(*) AS search_doc_count\n FROM search_docs\n WHERE session_id IS NOT NULL\n GROUP BY session_id\n )\n SELECT s.session_id,\n s.source_tool,\n s.source_session_id,\n s.project_id,\n p.display_name AS project_name,\n p.canonical_path AS project_path,\n s.parent_session_id,\n s.is_subagent,\n s.agent_role,\n s.agent_nickname,\n s.title,\n s.start_ts,\n s.end_ts,\n CASE\n WHEN s.start_ts IS NOT NULL AND s.end_ts IS NOT NULL\n THEN date_diff('millisecond', TRY_CAST(s.start_ts AS TIMESTAMP),\n TRY_CAST(s.end_ts AS TIMESTAMP)) / 1000.0\n ELSE NULL\n END AS duration_seconds,\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 sf.path AS source_file_path,\n COALESCE(tc.turn_count, 0) AS turn_count,\n COALESCE(mc.message_count, 0) AS message_count,\n COALESCE(mc.user_message_count, 0) AS user_message_count,\n COALESCE(mc.assistant_message_count, 0) AS assistant_message_count,\n COALESCE(tcc.tool_call_count, 0) AS tool_call_count,\n COALESCE(trc.tool_result_count, 0) AS tool_result_count,\n COALESCE(tcc.tool_call_error_count, 0)\n + COALESCE(trc.tool_result_error_count, 0) AS tool_error_count,\n COALESCE(trc.tool_duration_ms, 0) AS tool_duration_ms,\n COALESCE(sdc.search_doc_count, 0) AS search_doc_count\n FROM sessions s\n LEFT JOIN projects p ON p.project_id = s.project_id\n LEFT JOIN raw_records rr ON rr.raw_record_id = s.raw_record_id\n LEFT JOIN source_files sf ON sf.source_file_id = rr.source_file_id\n LEFT JOIN turn_counts tc ON tc.session_id = s.session_id\n LEFT JOIN message_counts mc ON mc.session_id = s.session_id\n LEFT JOIN tool_call_counts tcc ON tcc.session_id = s.session_id\n LEFT JOIN tool_result_counts trc ON trc.session_id = s.session_id\n LEFT JOIN search_doc_counts sdc ON sdc.session_id = s.session_id\n `);\n\n await connection.run(`\n CREATE OR REPLACE VIEW tool_usage_facts AS\n WITH result_rollup AS (\n SELECT tool_call_id,\n session_id,\n count(*) AS tool_result_count,\n max(status) AS result_status,\n max(is_error) AS is_error,\n min(exit_code) AS exit_code,\n sum(COALESCE(duration_ms, 0)) AS duration_ms,\n max(preview) AS preview\n FROM tool_results\n GROUP BY tool_call_id, session_id\n )\n SELECT tc.tool_call_id,\n tc.session_id,\n s.source_tool,\n s.source_session_id,\n s.project_id,\n p.display_name AS project_name,\n p.canonical_path AS project_path,\n tc.turn_id,\n tc.message_id,\n tc.event_id,\n tc.source_call_id,\n tc.tool_name,\n tc.canonical_tool_type,\n tc.command,\n tc.cwd,\n tc.path,\n tc.query,\n tc.timestamp_start,\n tc.timestamp_end,\n CASE\n WHEN tc.timestamp_start IS NOT NULL AND tc.timestamp_end IS NOT NULL\n THEN date_diff('millisecond', TRY_CAST(tc.timestamp_start AS TIMESTAMP),\n TRY_CAST(tc.timestamp_end AS TIMESTAMP)) / 1000.0\n ELSE NULL\n END AS call_duration_seconds,\n tc.status AS call_status,\n rr.result_status,\n COALESCE(rr.is_error, 0) AS is_error,\n rr.exit_code,\n rr.duration_ms AS result_duration_ms,\n COALESCE(rr.tool_result_count, 0) AS tool_result_count,\n rr.preview,\n tc.raw_record_id\n FROM tool_calls tc\n LEFT JOIN sessions s ON s.session_id = tc.session_id\n LEFT JOIN projects p ON p.project_id = s.project_id\n LEFT JOIN result_rollup rr ON rr.tool_call_id = tc.tool_call_id\n `);\n\n await connection.run(`\n CREATE OR REPLACE VIEW error_facts AS\n SELECT 'tool_result:' || tr.tool_result_id AS error_id,\n 'tool_result' AS error_category,\n s.source_tool,\n s.project_id,\n p.display_name AS project_name,\n tr.session_id,\n COALESCE(tc.timestamp_end, tc.timestamp_start) AS timestamp,\n tc.tool_name,\n tc.canonical_tool_type,\n COALESCE(tr.status, tc.status) AS status,\n tr.exit_code,\n NULL AS message,\n tr.preview,\n NULL AS entity_type,\n NULL AS entity_id,\n tr.raw_record_id\n FROM tool_results tr\n LEFT JOIN tool_calls tc ON tc.tool_call_id = tr.tool_call_id\n LEFT JOIN sessions s ON s.session_id = tr.session_id\n LEFT JOIN projects p ON p.project_id = s.project_id\n WHERE tr.is_error = 1 OR (tr.exit_code IS NOT NULL AND tr.exit_code <> 0)\n UNION ALL\n SELECT 'import_error:' || CAST(ie.error_id AS VARCHAR) AS error_id,\n 'import_error' AS error_category,\n COALESCE(rr.source_tool, ib.source_tool) AS source_tool,\n NULL AS project_id,\n NULL AS project_name,\n NULL AS session_id,\n ie.occurred_at AS timestamp,\n NULL AS tool_name,\n NULL AS canonical_tool_type,\n ie.kind AS status,\n NULL AS exit_code,\n ie.message,\n NULL AS preview,\n NULL AS entity_type,\n NULL AS entity_id,\n ie.raw_record_id\n FROM import_errors ie\n LEFT JOIN import_batches ib ON ib.batch_id = ie.batch_id\n LEFT JOIN raw_records rr ON rr.raw_record_id = ie.raw_record_id\n UNION ALL\n SELECT 'uncertainty:' || CAST(u.uncertainty_id AS VARCHAR) AS error_id,\n 'uncertainty' AS error_category,\n NULL AS source_tool,\n NULL AS project_id,\n NULL AS project_name,\n CASE WHEN u.entity_type = 'session' THEN u.entity_id ELSE NULL END AS session_id,\n NULL AS timestamp,\n NULL AS tool_name,\n NULL AS canonical_tool_type,\n u.reason AS status,\n NULL AS exit_code,\n u.reason AS message,\n NULL AS preview,\n u.entity_type,\n u.entity_id,\n NULL AS raw_record_id\n FROM uncertainties u\n `);\n\n await connection.run(`\n CREATE OR REPLACE VIEW model_usage AS\n WITH model_events AS (\n SELECT s.source_tool,\n s.project_id,\n p.display_name AS project_name,\n p.canonical_path AS project_path,\n s.session_id,\n NULL AS turn_id,\n s.model_first AS model,\n s.start_ts AS timestamp,\n 'session_first' AS observation_type\n FROM sessions s\n LEFT JOIN projects p ON p.project_id = s.project_id\n WHERE s.model_first IS NOT NULL\n UNION ALL\n SELECT s.source_tool, s.project_id, p.display_name, p.canonical_path,\n s.session_id, NULL AS turn_id, s.model_last AS model, s.end_ts AS timestamp,\n 'session_last' AS observation_type\n FROM sessions s\n LEFT JOIN projects p ON p.project_id = s.project_id\n WHERE s.model_last IS NOT NULL\n UNION ALL\n SELECT s.source_tool, s.project_id, p.display_name, p.canonical_path,\n t.session_id, t.turn_id, t.model, t.start_ts AS timestamp, 'turn' AS observation_type\n FROM turns t\n LEFT JOIN sessions s ON s.session_id = t.session_id\n LEFT JOIN projects p ON p.project_id = s.project_id\n WHERE t.model IS NOT NULL\n UNION ALL\n SELECT s.source_tool, s.project_id, p.display_name, p.canonical_path,\n m.session_id, m.turn_id, m.model, m.timestamp, 'message' AS observation_type\n FROM messages m\n LEFT JOIN sessions s ON s.session_id = m.session_id\n LEFT JOIN projects p ON p.project_id = s.project_id\n WHERE m.model IS NOT NULL\n )\n SELECT source_tool,\n project_id,\n project_name,\n project_path,\n model,\n count(DISTINCT session_id) AS session_count,\n count(DISTINCT turn_id) AS turn_count,\n count(*) AS observation_count,\n sum(CASE WHEN observation_type = 'message' THEN 1 ELSE 0 END) AS message_count,\n min(timestamp) AS first_seen_ts,\n max(timestamp) AS last_seen_ts\n FROM model_events\n GROUP BY source_tool, project_id, project_name, project_path, model\n `);\n\n await connection.run(`\n CREATE OR REPLACE VIEW project_activity AS\n SELECT s.source_tool,\n s.project_id,\n COALESCE(p.display_name, s.cwd_initial, '(unknown)') AS project_name,\n p.canonical_path AS project_path,\n min(s.start_ts) AS first_session_ts,\n max(COALESCE(s.end_ts, s.start_ts)) AS latest_session_ts,\n count(DISTINCT s.session_id) AS session_count,\n count(DISTINCT CASE WHEN s.timeline_confidence = 'low' THEN s.session_id END)\n AS low_confidence_session_count,\n count(DISTINCT t.turn_id) AS turn_count,\n count(DISTINCT m.message_id) AS message_count,\n count(DISTINCT tc.tool_call_id) AS tool_call_count,\n count(DISTINCT tr.tool_result_id) AS tool_result_count,\n count(DISTINCT CASE\n WHEN tr.is_error = 1 OR (tr.exit_code IS NOT NULL AND tr.exit_code <> 0)\n THEN tr.tool_result_id\n END) AS tool_error_count,\n count(DISTINCT sd.doc_id) AS search_doc_count\n FROM sessions s\n LEFT JOIN projects p ON p.project_id = s.project_id\n LEFT JOIN turns t ON t.session_id = s.session_id\n LEFT JOIN messages m ON m.session_id = s.session_id\n LEFT JOIN tool_calls tc ON tc.session_id = s.session_id\n LEFT JOIN tool_results tr ON tr.session_id = s.session_id\n LEFT JOIN search_docs sd ON sd.session_id = s.session_id\n GROUP BY s.source_tool, s.project_id, p.display_name, s.cwd_initial, p.canonical_path\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 = getErrorMessage(error);\n return /No files found|does not exist|not found/i.test(message) && /\\.parquet/i.test(message);\n}\n","import path from 'node:path';\nimport { type Bundle, closeBundle, openBundle } from '../core/bundle.js';\n\nexport async function withBundle<T>(\n storePath: string,\n fn: (bundle: Bundle) => Promise<T> | T,\n): Promise<T> {\n const bundle = await openBundle(path.resolve(storePath));\n try {\n return await fn(bundle);\n } finally {\n closeBundle(bundle);\n }\n}\n","export const OUTPUT_FORMATS = ['interactive', 'table', 'json', 'csv'] as const;\nexport type OutputFormat = (typeof OUTPUT_FORMATS)[number];\n\nconst COL_SEPARATOR = ' ';\nconst RULE_CHAR = '-';\n\nexport function parseOutputFormat(value: string | undefined, fallback: OutputFormat): OutputFormat {\n if (value === undefined) return fallback;\n if ((OUTPUT_FORMATS as readonly string[]).includes(value)) return value as OutputFormat;\n throw new Error(\n `invalid --output-format: ${value} (expected one of ${OUTPUT_FORMATS.join(', ')})`,\n );\n}\n\nexport interface PrintOptions {\n format: OutputFormat;\n columns: readonly string[];\n /** Optional metadata for json output (query applied, total matched, etc.). */\n meta?: Record<string, unknown>;\n}\n\nexport function printRows(rows: readonly object[], opts: PrintOptions): void {\n switch (opts.format) {\n case 'json':\n printJson(rows, opts);\n return;\n case 'csv':\n printCsv(rows, opts);\n return;\n case 'table':\n case 'interactive':\n printTable(rows, opts);\n return;\n }\n}\n\nfunction printJson(rows: readonly object[], opts: PrintOptions): void {\n const out = opts.meta ? { ...opts.meta, rows } : rows;\n process.stdout.write(`${JSON.stringify(out, null, 2)}\\n`);\n}\n\nfunction printCsv(rows: readonly object[], opts: PrintOptions): void {\n const columns = opts.columns;\n process.stdout.write(`${columns.map(csvField).join(',')}\\n`);\n for (const row of rows) {\n const record = row as Record<string, unknown>;\n const line = columns.map((column) => csvField(formatCell(record[column]))).join(',');\n process.stdout.write(`${line}\\n`);\n }\n}\n\nfunction csvField(value: string): string {\n if (/[\",\\n]/.test(value)) return `\"${value.replace(/\"/g, '\"\"')}\"`;\n return value;\n}\n\nfunction printTable(rows: readonly object[], opts: PrintOptions): void {\n const columns = opts.columns;\n const widths = columns.map((column) => column.length);\n const cells = rows.map((row) => {\n const record = row as Record<string, unknown>;\n return columns.map((column, index) => {\n const text = formatCell(record[column]);\n const width = widths[index] ?? 0;\n if (text.length > width) widths[index] = text.length;\n return text;\n });\n });\n\n const header = columns\n .map((column, index) => column.padEnd(widths[index] ?? 0))\n .join(COL_SEPARATOR);\n const rule = columns.map((_, index) => RULE_CHAR.repeat(widths[index] ?? 0)).join(COL_SEPARATOR);\n process.stdout.write(`${header}\\n${rule}\\n`);\n for (const cellRow of cells) {\n const line = cellRow.map((cell, index) => cell.padEnd(widths[index] ?? 0)).join(COL_SEPARATOR);\n process.stdout.write(`${line}\\n`);\n }\n}\n\nfunction formatCell(value: unknown): string {\n if (value == null) return '';\n if (typeof value === 'string') return value;\n if (typeof value === 'number' || typeof value === 'boolean') return String(value);\n return JSON.stringify(value);\n}\n","// Row-shaped TypeScript types matching the SQLite schema. These are the\n// boundary contract between importers and the catalog. Optional fields use\n// `null` (not `undefined`) to mirror SQLite NULL semantics directly.\n\nexport const SOURCE_TOOLS = ['cursor', 'codex', 'claude', 'gemini'] as const;\nexport type SourceTool = (typeof SOURCE_TOOLS)[number];\n\nexport type Confidence = 'high' | 'medium' | 'low';\n\nexport type MessageRole =\n | 'system_prompt'\n | 'developer'\n | 'user'\n | 'assistant'\n | 'tool'\n | 'operational';\n\nexport type CanonicalToolType =\n | 'shell'\n | 'read_file'\n | 'write_file'\n | 'edit_file'\n | 'search_file'\n | 'web_search'\n | 'mcp'\n | 'subagent'\n | 'patch'\n | 'other';\n\nexport type EdgeType =\n | 'parent_of'\n | 'calls'\n | 'returns'\n | 'spawned'\n | 'contains'\n | 'produced'\n | 'consumed'\n | 'derived_from'\n | 'summarizes'\n | 'compacts'\n | 'same_as'\n | 'refers_to';\n\nexport type ToolCallStatus = 'started' | 'success' | 'error' | 'cancelled' | 'unknown';\n\nexport interface SessionRowFull {\n session_id: string;\n source_tool: SourceTool;\n source_session_id: string;\n project_id: string | null;\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 summary: 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 raw_record_id: string | null;\n}\n","import { SOURCE_TOOLS, type SourceTool } from '../core/domain/types.js';\nimport type { SearchEngine } from '../services/indexing.js';\n\nexport { parseOutputFormat } from './output.js';\n\nexport type McpTransport = 'stdio' | 'http';\n\nexport function parseSearchEngine(value: string): SearchEngine {\n if (value === 'fts5' || value === 'tantivy') return value;\n throw new Error(`invalid search engine: ${value} (expected fts5 or tantivy)`);\n}\n\nexport function parseMcpTransport(value: string): McpTransport {\n if (value === 'stdio' || value === 'http') return value;\n throw new Error(`invalid transport: ${value} (expected stdio or http)`);\n}\n\nexport function parseSourceTool(value: string | undefined): SourceTool | undefined {\n if (value === undefined) return undefined;\n if ((SOURCE_TOOLS as readonly string[]).includes(value)) return value as SourceTool;\n throw new Error(`invalid source tool: ${value} (expected one of ${SOURCE_TOOLS.join(', ')})`);\n}\n","import { Command } from 'commander';\nimport { closeBundle, defaultBundlePath, openBundle } from '../../core/bundle.js';\nimport {\n COMPILE_PROVIDERS,\n type CompileProviderConfig,\n type ProviderCompileSummary,\n exportCompileParquet,\n resolveCompilePath,\n runCompileImports,\n} from '../../services/compile.js';\nimport { type CliLoggerOptions, createCliLogger } from '../logger.js';\n\nexport function compileCommand(): Command {\n const command = addCompileLogOptions(\n new Command('compile').description(\n 'Import session histories from one agent CLI into the bundle.',\n ),\n );\n\n for (const provider of COMPILE_PROVIDERS) {\n command.addCommand(providerCompileCommand(provider));\n }\n\n command.action(() => {\n command.help({ error: true });\n });\n\n return command;\n}\n\nexport function compileAllCommand(): Command {\n return addCompileLogOptions(new Command('compile-all'))\n .description('Import all agent CLI session histories using default source paths.')\n .option(\n '--overwrite',\n 'force a full rebuild of derived indexes after import (Tantivy from scratch; FTS5 and Parquet are always full)',\n false,\n )\n .action(async (options: CliLoggerOptions & { overwrite: boolean }) => {\n await runCompiles({\n providers: COMPILE_PROVIDERS,\n storePath: defaultBundlePath(),\n overwrite: options.overwrite,\n logOptions: options,\n });\n });\n}\n\nfunction providerCompileCommand(provider: CompileProviderConfig): Command {\n return addCompileLogOptions(new Command(provider.name))\n .description(provider.description)\n .option(\n '--sessions-path <path>',\n `${provider.pathHelp} (default: ${provider.defaultSessionsPath()})`,\n provider.defaultSessionsPath(),\n )\n .option('--store <path>', 'bundle directory', defaultBundlePath())\n .option(\n '--overwrite',\n 'force a full rebuild of derived indexes after import (Tantivy from scratch; FTS5 and Parquet are always full)',\n false,\n )\n .action(\n async (\n options: {\n sessionsPath: string;\n store: string;\n overwrite: boolean;\n },\n command: Command,\n ) => {\n await runCompiles({\n providers: [provider],\n storePath: options.store,\n sessionsPath: options.sessionsPath,\n overwrite: options.overwrite,\n logOptions: command.optsWithGlobals() as CliLoggerOptions,\n });\n },\n );\n}\n\nfunction addCompileLogOptions(command: Command): Command {\n return command\n .option('--verbose', 'emit debug logs during compilation')\n .option('--json-logs', 'emit raw newline-delimited JSON logs instead of pretty logs');\n}\n\nasync function runCompiles(options: {\n providers: CompileProviderConfig[];\n storePath: string;\n sessionsPath?: string;\n overwrite?: boolean;\n logOptions: CliLoggerOptions;\n}): Promise<void> {\n const logger = createCliLogger(options.logOptions);\n const storePath = resolveCompilePath(options.storePath);\n logger.info({ store_path: storePath }, 'opening bundle');\n const bundle = await openBundle(storePath);\n let importedAny = false;\n try {\n const result = await runCompileImports({\n bundle,\n providers: options.providers,\n sessionsPath: options.sessionsPath,\n overwrite: options.overwrite,\n logger,\n onProviderComplete: printCounts,\n onTantivyComplete: (status) => {\n process.stdout.write(`tantivy: indexed ${status.indexedDocCount} docs\\n`);\n },\n });\n importedAny = result.importedAny;\n } finally {\n closeBundle(bundle);\n logger.info({ store_path: storePath }, 'bundle closed');\n }\n\n // Parquet rebuild runs after the bundle is closed: exportBundleParquet\n // opens its own bundle handle and DuckDB attaches the SQLite file\n // directly, so we avoid any contention. As with Tantivy, failures are\n // logged but don't fail the compile — the user can re-run with\n // `prosa export parquet`.\n const shouldExportParquet = importedAny || options.overwrite === true;\n if (shouldExportParquet) {\n try {\n const result = await exportCompileParquet({ storePath, logger });\n process.stdout.write(`parquet: wrote ${result.tableCount} tables to ${result.outDir}\\n`);\n } catch (error) {\n logger.error({ err: error }, 'parquet export failed; SQLite data is intact');\n }\n }\n}\n\nfunction printCounts(summary: ProviderCompileSummary): void {\n const c = summary.counts;\n process.stdout.write(\n `${summary.source} import: batch=${summary.batchId}\\n` +\n ` source_files seen=${c.source_files_seen} imported=${c.source_files_imported} skipped=${c.source_files_skipped}\\n` +\n ` sessions=${c.sessions} turns=${c.turns} messages=${c.messages} blocks=${c.content_blocks}\\n` +\n ` events=${c.events} tool_calls=${c.tool_calls} tool_results=${c.tool_results}\\n` +\n ` artifacts=${c.artifacts} edges=${c.edges} errors=${c.errors}\\n`,\n );\n}\n","import os from 'node:os';\nimport path from 'node:path';\nimport type { Bundle } from '../core/bundle.js';\nimport type { SourceTool } from '../core/domain/types.js';\nimport { getErrorMessage } from '../core/errors.js';\nimport type { ImportBatch, ImportCounts } from '../core/ingest/batch.js';\nimport { compileClaude } from '../importers/claude/index.js';\nimport { compileCodex } from '../importers/codex/index.js';\nimport type { CompileLogger, CompileOptions } from '../importers/compile-options.js';\nimport { compileCursor } from '../importers/cursor/index.js';\nimport { compileGemini } from '../importers/gemini/index.js';\nimport { exportBundleParquet } from './export/parquet.js';\nimport {\n disableFts5Triggers,\n enableFts5Triggers,\n markIndexesAfterImport,\n rebuildFts5Index,\n rebuildTantivyIndex,\n} from './indexing.js';\n\ninterface CompileResult {\n batch: ImportBatch;\n counts: ImportCounts;\n}\n\nexport interface CompileProviderConfig {\n name: SourceTool;\n description: string;\n pathHelp: string;\n defaultSessionsPath: () => string;\n compile: (bundle: Bundle, root: string, options?: CompileOptions) => Promise<CompileResult>;\n}\n\nexport interface ProviderCompileSummary {\n source: SourceTool;\n sourcePath: string;\n batchId: string;\n batch: ImportBatch;\n counts: ImportCounts;\n}\n\nexport interface TantivyCompileSummary {\n indexedDocCount: number;\n}\n\nexport interface CompileImportSummary {\n providers: ProviderCompileSummary[];\n importedAny: boolean;\n tantivy: TantivyCompileSummary | null;\n tantivyError: string | null;\n fts5Error: string | null;\n}\n\nexport interface ParquetCompileSummary {\n outDir: string;\n manifestPath: string;\n tableCount: number;\n files: Record<string, string>;\n counts: Record<string, number>;\n}\n\nexport const COMPILE_PROVIDERS: CompileProviderConfig[] = [\n {\n name: 'codex',\n description: 'Import Codex CLI session histories into the bundle.',\n pathHelp: 'root of Codex CLI sessions',\n defaultSessionsPath: () => path.join(os.homedir(), '.codex', 'sessions'),\n compile: compileCodex,\n },\n {\n name: 'claude',\n description: 'Import Claude Code project histories into the bundle.',\n pathHelp: 'root of Claude Code projects',\n defaultSessionsPath: () => path.join(os.homedir(), '.claude', 'projects'),\n compile: compileClaude,\n },\n {\n name: 'gemini',\n description: 'Import Gemini CLI session histories into the bundle.',\n pathHelp: 'root of Gemini CLI tmp dir',\n defaultSessionsPath: () => path.join(os.homedir(), '.gemini', 'tmp'),\n compile: compileGemini,\n },\n {\n name: 'cursor',\n description: 'Import Cursor agent stores into the bundle.',\n pathHelp: 'root of Cursor agent stores',\n defaultSessionsPath: () => path.join(os.homedir(), '.cursor', 'chats'),\n compile: compileCursor,\n },\n];\n\nexport function getCompileProvider(source: SourceTool): CompileProviderConfig {\n const provider = COMPILE_PROVIDERS.find((p) => p.name === source);\n if (!provider) {\n throw new Error(`unknown compile source: ${source}`);\n }\n return provider;\n}\n\nexport function resolveCompilePath(p: string): string {\n if (p === '~') return os.homedir();\n if (p.startsWith('~/')) return path.join(os.homedir(), p.slice(2));\n return path.resolve(p);\n}\n\nexport async function runCompileImports(options: {\n bundle: Bundle;\n providers: CompileProviderConfig[];\n sessionsPath?: string;\n /**\n * Force a full rebuild of derived indexes after import. Tantivy is the\n * only sidecar with an incremental path today, so this currently flips\n * Tantivy to a from-scratch rebuild; FTS5 and Parquet are always\n * full-rewrite. Surfaced by `prosa compile … --overwrite`.\n */\n overwrite?: boolean;\n logger?: CompileLogger;\n onProviderComplete?: (summary: ProviderCompileSummary) => void;\n onTantivyComplete?: (summary: TantivyCompileSummary) => void;\n}): Promise<CompileImportSummary> {\n const { bundle, providers, logger } = options;\n const overwrite = options.overwrite === true;\n let importedAny = false;\n const summaries: ProviderCompileSummary[] = [];\n let tantivy: TantivyCompileSummary | null = null;\n let tantivyError: string | null = null;\n let fts5Error: string | null = null;\n\n try {\n logger?.info('disabling FTS5 triggers for bulk rebuild');\n disableFts5Triggers(bundle);\n\n for (const provider of providers) {\n const sourcePath = resolveCompilePath(options.sessionsPath ?? provider.defaultSessionsPath());\n const providerLogger = logger?.child({\n source_tool: provider.name,\n source_path: sourcePath,\n });\n providerLogger?.info('starting compile');\n const r = await provider.compile(bundle, sourcePath, { logger: providerLogger });\n importedAny ||= r.counts.source_files_imported > 0;\n providerLogger?.info(\n {\n batch_id: r.batch.batch_id,\n counts: r.counts,\n },\n 'compile finished',\n );\n\n const summary = {\n source: provider.name,\n sourcePath,\n batchId: r.batch.batch_id,\n batch: r.batch,\n counts: r.counts,\n };\n summaries.push(summary);\n options.onProviderComplete?.(summary);\n }\n\n const shouldRebuildIndexes = importedAny || overwrite;\n if (shouldRebuildIndexes) {\n logger?.info(\n { changed: importedAny, overwrite },\n importedAny ? 'marking indexes' : 'overwrite forces rebuild despite no new imports',\n );\n markIndexesAfterImport(bundle, { changed: true });\n\n try {\n logger?.info('rebuilding fts5 index');\n rebuildFts5Index(bundle);\n } catch (error) {\n fts5Error = getErrorMessage(error);\n logger?.error({ err: error }, 'fts5 rebuild failed; SQLite data is intact');\n }\n\n try {\n logger?.info({ overwrite }, 'rebuilding tantivy index');\n const status = await rebuildTantivyIndex(bundle, { overwrite });\n tantivy = { indexedDocCount: status.indexed_doc_count };\n options.onTantivyComplete?.(tantivy);\n } catch (error) {\n tantivyError = getErrorMessage(error);\n logger?.error({ err: error }, 'tantivy rebuild failed; SQLite data is intact');\n }\n }\n } finally {\n enableFts5Triggers(bundle);\n }\n\n return {\n providers: summaries,\n importedAny,\n tantivy,\n tantivyError,\n fts5Error,\n };\n}\n\nexport async function exportCompileParquet(options: {\n storePath: string;\n logger?: CompileLogger;\n}): Promise<ParquetCompileSummary> {\n const storePath = resolveCompilePath(options.storePath);\n options.logger?.info({ store_path: storePath }, 'exporting parquet');\n const result = await exportBundleParquet({ bundlePath: storePath });\n return {\n outDir: result.outDir,\n manifestPath: result.manifestPath,\n tableCount: Object.keys(result.files).length,\n files: result.files,\n counts: result.counts,\n };\n}\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport type { Bundle } from '../../core/bundle.js';\nimport {\n type ObjectId,\n type PendingObjects,\n createPendingObjects,\n flushPendingObjects,\n stageBytes,\n stageJson,\n stageText,\n} 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 { getErrorMessage } from '../../core/errors.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 { CompileLogger, CompileOptions } from '../compile-options.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(\n bundle: Bundle,\n root: string,\n options: CompileOptions = {},\n): Promise<CompileResult> {\n const logger = options.logger;\n const batch = startBatch(bundle, 'claude', [root]);\n const counts = emptyCounts();\n logger?.info({ batch_id: batch.batch_id, root }, 'claude batch started');\n\n try {\n for await (const file of discoverClaudeFiles(root)) {\n counts.source_files_seen++;\n logger?.debug(\n {\n path: file.filePath,\n project_slug: file.projectSlug,\n is_subagent: file.isSubagent,\n },\n 'claude source file discovered',\n );\n try {\n const fc = await compileClaudeFile(bundle, batch, file, logger);\n addCounts(counts, fc);\n } catch (error) {\n counts.errors++;\n logger?.warn(\n {\n err: error,\n path: file.filePath,\n },\n 'claude source file failed',\n );\n await recordError(bundle, batch.batch_id, {\n kind: 'claude_file_failed',\n message: getErrorMessage(error),\n payload: { path: file.filePath },\n });\n }\n }\n linkSubagentParents(bundle);\n logger?.debug({ batch_id: batch.batch_id }, 'claude subagent parent links refreshed');\n finishBatch(bundle, batch, counts, 'completed');\n logger?.info({ batch_id: batch.batch_id, counts }, 'claude batch completed');\n } catch (error) {\n finishBatch(bundle, batch, counts, 'failed');\n logger?.error({ err: error, batch_id: batch.batch_id, counts }, 'claude batch 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 objects: PendingObjects;\n}\n\nasync function compileClaudeFile(\n bundle: Bundle,\n batch: ImportBatch,\n file: ClaudeFile,\n logger?: CompileLogger,\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 logger?.debug(\n { path: file.filePath, source_file_id: sourceFile.source_file_id },\n 'claude source file skipped',\n );\n return counts;\n }\n counts.source_files_imported = 1;\n logger?.debug(\n { path: file.filePath, source_file_id: sourceFile.source_file_id },\n 'claude source file registered',\n );\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 objects: createPendingObjects(),\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 = stageBytes(pending.objects, 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 // The raw line already IS the JSON for `parserStatus === 'ok'`, so we\n // skip storing a re-serialized copy as `decoded_json_object_id`. Saves\n // ~half the CAS writes per file. Nothing reads it back later.\n const decodedObjectId: ObjectId | null = 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 = stageText(pending.objects, 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 // Persist staged CAS objects (FS + objects rows) before the domain\n // transaction. better-sqlite3 transactions are sync, so we can't await\n // file writes inside them.\n await flushPendingObjects(bundle, pending.objects);\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 logger?.debug(\n { path: file.filePath, source_file_id: sourceFile.source_file_id, counts },\n 'claude source file imported',\n );\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 ? stageText(pending.objects, 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 ? stageText(pending.objects, 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 ? stageJson(pending.objects, 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 const overflowId = text.length > PREVIEW_MAX ? stageText(pending.objects, text) : null;\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: overflowId,\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: overflowId,\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 { 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 * Per-process cache of directories we've already mkdir'd. The CAS fanout\n * creates `objects/blake3/ab/cd/` for 65k possible leaves; calling\n * `mkdir(... { recursive: true })` for every staged object during a large\n * import was a measurable cost. Cache by absolute path.\n */\nconst ensuredDirs = new Set<string>();\n\nexport async function ensureDir(absoluteDir: string): Promise<void> {\n if (ensuredDirs.has(absoluteDir)) return;\n await mkdir(absoluteDir, { recursive: true });\n ensuredDirs.add(absoluteDir);\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 ensureDir(path.dirname(absolutePath));\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\n// -- Staging API for high-volume importers ---------------------------------\n//\n// Importers parse thousands of records per file and call putBytes/putJson per\n// record. Doing each as its own SQLite auto-commit + mkdir + writeFile is the\n// dominant cost on a fresh import. The staging API splits CAS work into:\n//\n// 1. stageBytes/stageJson/stageText — synchronous; computes the blake3 hash,\n// builds the ObjectId, and accumulates pending bytes in a per-batch Map\n// deduped by ObjectId. Returns the ObjectId immediately so the rest of\n// the importer can reference it.\n// 2. flushPendingObjects — async; runs once per batch. Bulk-checks which\n// ObjectIds already exist, writes the missing files in parallel, then\n// bulk-inserts the new `objects` rows in a single transaction.\n//\n// The shape lets importers keep their existing\n// `transactional(bundle.db, () => flushPending(...))` block as the only\n// SQLite write boundary for the file, with `flushPendingObjects` running just\n// before that (FS writes can't run inside a sync transaction).\n\nexport interface StagedObject {\n objectId: ObjectId;\n hash: string;\n bytes: Buffer;\n mimeType: string | null;\n encoding: string | null;\n}\n\nexport interface PendingObjects {\n byId: Map<ObjectId, StagedObject>;\n}\n\nexport function createPendingObjects(): PendingObjects {\n return { byId: new Map() };\n}\n\nexport function stageBytes(\n pending: PendingObjects,\n bytes: Uint8Array,\n options: PutOptions = {},\n): ObjectId {\n const buf = Buffer.isBuffer(bytes) ? bytes : Buffer.from(bytes);\n const hash = blake3Hex(buf);\n const objectId = objectIdFromHash(hash);\n if (!pending.byId.has(objectId)) {\n pending.byId.set(objectId, {\n objectId,\n hash,\n bytes: buf,\n mimeType: options.mimeType ?? null,\n encoding: options.encoding ?? null,\n });\n }\n return objectId;\n}\n\nexport function stageText(\n pending: PendingObjects,\n text: string,\n options: { mimeType?: string } = {},\n): ObjectId {\n return stageBytes(pending, Buffer.from(text, 'utf8'), {\n mimeType: options.mimeType ?? 'text/plain; charset=utf-8',\n encoding: 'utf-8',\n });\n}\n\nexport function stageJson(pending: PendingObjects, value: unknown): ObjectId {\n return stageBytes(pending, Buffer.from(JSON.stringify(value), 'utf8'), {\n mimeType: 'application/json',\n encoding: 'utf-8',\n });\n}\n\n/**\n * Flush every staged object to disk and to the `objects` table.\n *\n * Writes happen before the caller's domain transaction starts because\n * better-sqlite3 transactions are synchronous and we want to overlap the\n * filesystem writes with each other. The `objects` rows are inserted with\n * INSERT OR IGNORE, so any rows another writer added between our existence\n * check and our insert are tolerated.\n */\nexport async function flushPendingObjects(bundle: Bundle, pending: PendingObjects): Promise<void> {\n if (pending.byId.size === 0) return;\n\n const ids = [...pending.byId.keys()];\n const existingIds = queryExistingObjectIds(bundle, ids);\n\n // Compress once. The same buffer + path are reused for the FS write and\n // the `objects` row.\n interface PreparedObject {\n staged: StagedObject;\n compression: Compression;\n compressedBytes: Buffer;\n storagePath: string;\n absolutePath: string;\n }\n const toWrite: PreparedObject[] = [];\n for (const obj of pending.byId.values()) {\n if (existingIds.has(obj.objectId)) continue;\n const { bytes: compressedBytes, compression } = compressBytes(obj.bytes);\n const storagePath = objectStoragePath(obj.hash, compression);\n toWrite.push({\n staged: obj,\n compression,\n compressedBytes,\n storagePath,\n absolutePath: path.join(bundle.path, storagePath),\n });\n }\n\n if (toWrite.length > 0) {\n await writeFilesParallel(toWrite);\n }\n\n const insertObject = prepare(\n bundle.db,\n `INSERT OR IGNORE 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 );\n const now = new Date().toISOString();\n for (const p of toWrite) {\n insertObject.run(\n p.staged.objectId,\n p.staged.hash,\n p.staged.bytes.byteLength,\n p.compression === 'zstd' ? p.compressedBytes.byteLength : null,\n p.compression,\n p.staged.mimeType,\n p.staged.encoding,\n p.storagePath,\n now,\n );\n }\n}\n\nfunction queryExistingObjectIds(bundle: Bundle, ids: ObjectId[]): Set<ObjectId> {\n const found = new Set<ObjectId>();\n if (ids.length === 0) return found;\n // SQLite's default SQLITE_LIMIT_VARIABLE_NUMBER is 32766; chunk well under\n // that for safety.\n const CHUNK = 500;\n for (let start = 0; start < ids.length; start += CHUNK) {\n const slice = ids.slice(start, start + CHUNK);\n const placeholders = slice.map(() => '?').join(',');\n const rows = bundle.db\n .prepare<ObjectId[], { object_id: ObjectId }>(\n `SELECT object_id FROM objects WHERE object_id IN (${placeholders})`,\n )\n .all(...slice);\n for (const row of rows) found.add(row.object_id);\n }\n return found;\n}\n\nconst FS_WRITE_CONCURRENCY = 16;\n\nasync function writeFilesParallel(\n tasks: { absolutePath: string; compressedBytes: Buffer }[],\n): Promise<void> {\n let cursor = 0;\n const workers: Promise<void>[] = [];\n const limit = Math.min(FS_WRITE_CONCURRENCY, tasks.length);\n for (let w = 0; w < limit; w++) {\n workers.push(\n (async () => {\n while (true) {\n const i = cursor++;\n if (i >= tasks.length) return;\n const task = tasks[i]!;\n await ensureDir(path.dirname(task.absolutePath));\n await writeFile(task.absolutePath, task.compressedBytes);\n }\n })(),\n );\n }\n await Promise.all(workers);\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, 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 { ensureDir } from '../cas/index.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 ensureDir(path.dirname(absolutePath));\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 { 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 {\n type ObjectId,\n type PendingObjects,\n createPendingObjects,\n flushPendingObjects,\n stageBytes,\n stageJson,\n stageText,\n} 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 { getErrorMessage } from '../../core/errors.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 { CompileLogger, CompileOptions } from '../compile-options.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(\n bundle: Bundle,\n root: string,\n options: CompileOptions = {},\n): Promise<CompileResult> {\n const logger = options.logger;\n const batch = startBatch(bundle, 'codex', [root]);\n const counts = emptyCounts();\n logger?.info({ batch_id: batch.batch_id, root }, 'codex batch started');\n\n try {\n for await (const filePath of discoverCodexSessions(root)) {\n counts.source_files_seen++;\n logger?.debug({ path: filePath }, 'codex source file discovered');\n try {\n const fileCounts = await compileCodexFile(bundle, batch, filePath, logger);\n addCounts(counts, fileCounts);\n } catch (error) {\n counts.errors++;\n logger?.warn(\n {\n err: error,\n path: filePath,\n },\n 'codex source file failed',\n );\n await recordError(bundle, batch.batch_id, {\n kind: 'codex_file_failed',\n message: getErrorMessage(error),\n payload: { path: filePath },\n });\n }\n }\n linkSubagentParents(bundle);\n logger?.debug({ batch_id: batch.batch_id }, 'codex subagent parent links refreshed');\n finishBatch(bundle, batch, counts, 'completed');\n logger?.info({ batch_id: batch.batch_id, counts }, 'codex batch completed');\n } catch (error) {\n finishBatch(bundle, batch, counts, 'failed');\n logger?.error({ err: error, batch_id: batch.batch_id, counts }, 'codex batch 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 logger?: CompileLogger,\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 logger?.debug(\n { path: filePath, source_file_id: sourceFileRow.source_file_id },\n 'codex source file skipped',\n );\n return counts;\n }\n\n counts.source_files_imported = 1;\n logger?.debug(\n { path: filePath, source_file_id: sourceFileRow.source_file_id },\n 'codex source file registered',\n );\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 objects: createPendingObjects(),\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 = stageBytes(pending.objects, 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 // The raw line already IS the JSON for `parserStatus === 'ok'`, so we\n // skip storing a re-serialized copy as `decoded_json_object_id`. Saves\n // ~half the CAS writes per file. Nothing reads it back later.\n const decodedObjectId: ObjectId | null = 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 // Persist the staged CAS objects to disk + the `objects` table BEFORE the\n // domain transaction. We do filesystem writes in parallel (better-sqlite3\n // transactions are synchronous, so this can't run inside `transactional`).\n await flushPendingObjects(bundle, pending.objects);\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 logger?.debug(\n { path: filePath, source_file_id: sourceFileRow.source_file_id, counts },\n 'codex source file imported',\n );\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 objects: PendingObjects;\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 ? stageText(pending.objects, em.stdout, { mimeType: 'text/plain' })\n : null;\n const stderrId = em.stderr\n ? stageText(pending.objects, 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 path from 'node:path';\nimport Database from 'better-sqlite3';\nimport type { Bundle } from '../../core/bundle.js';\nimport {\n type ObjectId,\n type PendingObjects,\n createPendingObjects,\n flushPendingObjects,\n stageBytes,\n stageJson,\n stageText,\n} 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 { getErrorMessage } from '../../core/errors.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 { CompileLogger, CompileOptions } from '../compile-options.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(\n bundle: Bundle,\n root: string,\n options: CompileOptions = {},\n): Promise<CompileResult> {\n const logger = options.logger;\n const batch = startBatch(bundle, 'cursor', [root]);\n const counts = emptyCounts();\n logger?.info({ batch_id: batch.batch_id, root }, 'cursor batch started');\n try {\n for await (const store of discoverCursorStores(root)) {\n counts.source_files_seen++;\n logger?.debug(\n {\n path: store.filePath,\n workspace_id: store.workspaceId,\n agent_id: store.agentId,\n },\n 'cursor store discovered',\n );\n try {\n const fc = await compileCursorStore(bundle, batch, store, logger);\n addCounts(counts, fc);\n } catch (error) {\n counts.errors++;\n logger?.warn(\n {\n err: error,\n path: store.filePath,\n },\n 'cursor store failed',\n );\n await recordError(bundle, batch.batch_id, {\n kind: 'cursor_store_failed',\n message: getErrorMessage(error),\n payload: { path: store.filePath },\n });\n }\n }\n finishBatch(bundle, batch, counts, 'completed');\n logger?.info({ batch_id: batch.batch_id, counts }, 'cursor batch completed');\n } catch (error) {\n finishBatch(bundle, batch, counts, 'failed');\n logger?.error({ err: error, batch_id: batch.batch_id, counts }, 'cursor batch 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 objects: PendingObjects;\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 logger?: CompileLogger,\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 logger?.debug(\n { path: store.filePath, source_file_id: sourceFile.source_file_id },\n 'cursor store skipped',\n );\n return counts;\n }\n counts.source_files_imported = 1;\n logger?.debug(\n { path: store.filePath, source_file_id: sourceFile.source_file_id },\n 'cursor store registered',\n );\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 objects: createPendingObjects(),\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 = stageBytes(pending.objects, 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 = stageBytes(pending.objects, 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 ? stageJson(pending.objects, 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 // Persist staged CAS objects (FS + objects rows) before the domain\n // transaction. better-sqlite3 transactions are sync.\n await flushPendingObjects(bundle, pending.objects);\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 logger?.debug(\n { path: store.filePath, source_file_id: sourceFile.source_file_id, counts },\n 'cursor store imported',\n );\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 ? stageText(pending.objects, 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 ? stageJson(pending.objects, 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 ? stageText(pending.objects, 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","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 {\n type ObjectId,\n type PendingObjects,\n createPendingObjects,\n flushPendingObjects,\n stageBytes,\n stageJson,\n stageText,\n} 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 { getErrorMessage } from '../../core/errors.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 { CompileLogger, CompileOptions } from '../compile-options.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(\n bundle: Bundle,\n root: string,\n options: CompileOptions = {},\n): Promise<CompileResult> {\n const logger = options.logger;\n const batch = startBatch(bundle, 'gemini', [root]);\n const counts = emptyCounts();\n logger?.info({ batch_id: batch.batch_id, root }, 'gemini batch started');\n try {\n for await (const file of discoverGeminiChats(root)) {\n counts.source_files_seen++;\n logger?.debug(\n {\n path: file.filePath,\n project_dir: file.projectDir,\n project_root: file.projectRoot,\n },\n 'gemini source file discovered',\n );\n try {\n const fc = await compileGeminiFile(bundle, batch, file, logger);\n addCounts(counts, fc);\n } catch (error) {\n counts.errors++;\n logger?.warn(\n {\n err: error,\n path: file.filePath,\n },\n 'gemini source file failed',\n );\n await recordError(bundle, batch.batch_id, {\n kind: 'gemini_file_failed',\n message: getErrorMessage(error),\n payload: { path: file.filePath },\n });\n }\n }\n finishBatch(bundle, batch, counts, 'completed');\n logger?.info({ batch_id: batch.batch_id, counts }, 'gemini batch completed');\n } catch (error) {\n finishBatch(bundle, batch, counts, 'failed');\n logger?.error({ err: error, batch_id: batch.batch_id, counts }, 'gemini batch 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 objects: PendingObjects;\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 logger?: CompileLogger,\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 logger?.debug(\n { path: file.filePath, source_file_id: sourceFile.source_file_id },\n 'gemini source file skipped',\n );\n return counts;\n }\n counts.source_files_imported = 1;\n logger?.debug(\n { path: file.filePath, source_file_id: sourceFile.source_file_id },\n 'gemini source file registered',\n );\n\n const text = await readFile(file.filePath, 'utf8');\n const parsed = JSON.parse(text) as GeminiSessionFile;\n const objects = createPendingObjects();\n const fileObjectId = stageBytes(objects, 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 objects,\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 // Persist staged CAS objects (FS + objects rows) before the domain\n // transaction. better-sqlite3 transactions are sync.\n await flushPendingObjects(bundle, pending.objects);\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 logger?.debug(\n { path: file.filePath, source_file_id: sourceFile.source_file_id, counts },\n 'gemini source file imported',\n );\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 = stageJson(pending.objects, 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 ? stageText(pending.objects, 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 ? stageJson(pending.objects, 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 =\n resultText.length > PREVIEW_MAX ? stageText(pending.objects, 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\n ? stageText(pending.objects, diffText, { mimeType: 'text/x-diff' })\n : 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 pino, { type Logger } from 'pino';\nimport pretty from 'pino-pretty';\n\nexport interface CliLoggerOptions {\n verbose?: boolean;\n jsonLogs?: boolean;\n}\n\nexport function createCliLogger(options: CliLoggerOptions): Logger {\n const loggerOptions = {\n base: undefined,\n level: options.verbose ? 'debug' : 'info',\n };\n\n if (options.jsonLogs) {\n return pino(loggerOptions, pino.destination({ dest: 2, sync: true }));\n }\n\n return pino(\n loggerOptions,\n pretty({\n colorize: process.stderr.isTTY,\n destination: 2,\n ignore: 'pid,hostname',\n singleLine: true,\n sync: true,\n translateTime: 'SYS:yyyy-mm-dd HH:MM:ss.l',\n }),\n );\n}\n","import { writeFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { Command } from 'commander';\nimport { defaultBundlePath } from '../../core/bundle.js';\nimport { exportSessionMarkdown } from '../../services/export/markdown.js';\nimport { exportBundleParquet } from '../../services/export/parquet.js';\nimport { withBundle } from '../bundle.js';\n\nexport function exportCommand(): Command {\n const session = new Command('session')\n .description('Export a single session to a human-readable format.')\n .argument('<session-id>', 'prosa session_id')\n .requiredOption('--format <fmt>', 'currently only \"markdown\" is supported')\n .option('--out <path>', 'write to file instead of stdout')\n .option('--store <path>', 'bundle directory', defaultBundlePath())\n .action(async (sessionId: string, options: { format: string; out?: string; store: string }) => {\n if (options.format !== 'markdown') {\n throw new Error(`unsupported format: ${options.format} (try --format markdown)`);\n }\n await withBundle(options.store, async (bundle) => {\n const markdown = await exportSessionMarkdown(bundle, sessionId);\n if (options.out) {\n await writeFile(path.resolve(options.out), markdown, 'utf8');\n process.stdout.write(`wrote ${path.resolve(options.out)}\\n`);\n } else {\n process.stdout.write(markdown);\n }\n });\n });\n\n const parquet = new Command('parquet')\n .description('Export canonical tables to derived Parquet files for analytics.')\n .option('--store <path>', 'bundle directory', defaultBundlePath())\n .option('--out <path>', 'output directory (default: <store>/parquet)')\n .action(async (options: { store: string; out?: string }) => {\n const result = await exportBundleParquet({\n bundlePath: path.resolve(options.store),\n outDir: options.out ? path.resolve(options.out) : undefined,\n });\n process.stdout.write(`wrote parquet export to ${result.outDir}\\n`);\n process.stdout.write(`manifest=${result.manifestPath}\\n`);\n });\n\n return new Command('export')\n .description('Export sessions / search excerpts to readable formats.')\n .addCommand(session)\n .addCommand(parquet);\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 { Command } from 'commander';\nimport { defaultBundlePath } from '../../core/bundle.js';\nimport {\n getSearchIndexStatuses,\n rebuildFts5Index,\n rebuildTantivyIndex,\n} from '../../services/indexing.js';\nimport { withBundle } from '../bundle.js';\nimport { parseOutputFormat, printRows } from '../output.js';\n\nexport function indexCommand(): Command {\n const fts5 = new Command('fts5')\n .description('Rebuild the SQLite FTS5 index from search_docs.')\n .option('--store <path>', 'bundle directory', defaultBundlePath())\n .option(\n '--overwrite',\n 'rebuild from scratch (FTS5 always overwrites; flag accepted for parity with other index commands)',\n false,\n )\n .action(async (options: { store: string; overwrite: boolean }) => {\n await withBundle(options.store, (bundle) => {\n // FTS5 rebuild already wipes and re-tokenizes every doc via the\n // `INSERT INTO search_docs_fts(search_docs_fts) VALUES('rebuild')`\n // FTS5 directive, so --overwrite is a no-op today.\n void options.overwrite;\n printIndexStatus(rebuildFts5Index(bundle));\n });\n });\n\n const tantivy = new Command('tantivy')\n .description('Rebuild the Tantivy sidecar index from search_docs.')\n .option('--store <path>', 'bundle directory', defaultBundlePath())\n .option(\n '--overwrite',\n 'force a full re-index instead of the default incremental rebuild',\n false,\n )\n .action(async (options: { store: string; overwrite: boolean }) => {\n await withBundle(options.store, async (bundle) => {\n printIndexStatus(await rebuildTantivyIndex(bundle, { overwrite: options.overwrite }));\n });\n });\n\n const status = new Command('status')\n .description('Show derived search index status.')\n .option('--store <path>', 'bundle directory', defaultBundlePath())\n .option('--output-format <fmt>', 'interactive|table|json|csv', 'table')\n .action(async (options: { store: string; outputFormat: string }) => {\n const format = parseOutputFormat(options.outputFormat, 'table');\n await withBundle(options.store, (bundle) => {\n const rows = getSearchIndexStatuses(bundle);\n printRows(rows, {\n format,\n columns: [\n 'engine',\n 'status',\n 'source_doc_count',\n 'indexed_doc_count',\n 'updated_at',\n 'error_message',\n ],\n });\n });\n });\n\n return new Command('index')\n .description('Build or inspect derived search indexes.')\n .addCommand(fts5)\n .addCommand(tantivy)\n .addCommand(status);\n}\n\nfunction printIndexStatus(status: {\n engine: string;\n status: string;\n source_doc_count: number;\n indexed_doc_count: number;\n}): void {\n process.stdout.write(\n `${status.engine} index: ${status.status}\\n` +\n ` source_docs=${status.source_doc_count} indexed_docs=${status.indexed_doc_count}\\n`,\n );\n}\n","import { stat } from 'node:fs/promises';\nimport path from 'node:path';\nimport { Command } from 'commander';\nimport { closeBundle, defaultBundlePath, initBundle, openBundle } from '../../core/bundle.js';\n\nexport function initCommand(): Command {\n return new Command('init')\n .description('Initialize a new prosa bundle (SQLite + manifest + objects/).')\n .option('--store <path>', 'bundle directory', defaultBundlePath())\n .option('--force-existing', 'open instead of failing if a manifest exists', false)\n .action(async (options: { store: string; forceExisting: boolean }) => {\n const resolved = path.resolve(options.store);\n const exists = await stat(`${resolved}/manifest.json`)\n .then(() => true)\n .catch(() => false);\n\n if (exists) {\n if (!options.forceExisting) {\n process.stderr.write(\n `bundle already initialized at ${resolved}\\nuse --force-existing to skip without erroring\\n`,\n );\n process.exit(2);\n }\n const bundle = await openBundle(resolved);\n closeBundle(bundle);\n process.stdout.write(`bundle already exists at ${resolved}\\n`);\n return;\n }\n\n const bundle = await initBundle(resolved);\n closeBundle(bundle);\n process.stdout.write(`initialized prosa bundle at ${resolved}\\n`);\n });\n}\n","import path from 'node:path';\nimport { Command } from 'commander';\nimport {\n type Bundle,\n closeBundle,\n defaultBundlePath,\n openOrInitBundle,\n} from '../../core/bundle.js';\nimport { listenMcpServer, listenMcpStdioServer } from '../../mcp/server.js';\nimport { parseMcpTransport, parseSearchEngine } from '../parsers.js';\n\nexport function mcpCommand(): Command {\n const serve = new Command('serve')\n .description('Start a local MCP server over the prosa bundle.')\n .option('--store <path>', 'bundle directory', defaultBundlePath())\n .option('--transport <transport>', 'MCP transport: stdio|http', 'stdio')\n .option('--host <host>', 'bind host', '127.0.0.1')\n .option('--port <port>', 'bind port', '7331')\n .option('--path <path>', 'HTTP path', '/mcp')\n .option('--search-engine <engine>', 'search engine: fts5|tantivy', 'fts5')\n .action(\n async (options: {\n store: string;\n host: string;\n port: string;\n path: string;\n searchEngine: string;\n transport: string;\n }) => {\n const storePath = path.resolve(options.store);\n const bundle = await openOrInitBundle(storePath);\n try {\n const transport = parseMcpTransport(options.transport);\n const searchEngine = parseSearchEngine(options.searchEngine);\n if (transport === 'http') {\n const port = Number.parseInt(options.port, 10);\n if (!Number.isFinite(port) || port <= 0) {\n throw new Error(`invalid port: ${options.port}`);\n }\n const server = await listenMcpServer(bundle, {\n host: options.host,\n port,\n path: options.path,\n searchEngine,\n storePath,\n });\n\n process.stdout.write(`prosa mcp server listening at ${server.url}\\n`);\n process.stdout.write('press Ctrl+C to stop\\n');\n registerShutdown(server.close, bundle);\n return;\n }\n\n const server = await listenMcpStdioServer(bundle, { searchEngine, storePath });\n registerShutdown(server.close, bundle);\n } catch (error) {\n closeBundle(bundle);\n throw error;\n }\n },\n );\n\n return new Command('mcp').description('MCP server commands.').addCommand(serve);\n}\n\nfunction registerShutdown(closeServer: () => Promise<void>, bundle: Bundle): void {\n const shutdown = async (): Promise<void> => {\n await closeServer();\n closeBundle(bundle);\n process.exit(0);\n };\n process.once('SIGINT', () => {\n void shutdown();\n });\n process.once('SIGTERM', () => {\n void shutdown();\n });\n}\n","import { randomUUID } from 'node:crypto';\nimport http from 'node:http';\nimport type { IncomingMessage, ServerResponse } from 'node:http';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';\nimport type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';\nimport type { Bundle } from '../core/bundle.js';\nimport { getErrorMessage } from '../core/errors.js';\nimport { PROSA_PARSER_VERSION } from '../core/version.js';\nimport type { SearchEngine } from '../services/indexing.js';\nimport { PROSA_MCP_INSTRUCTIONS } from './guidance.js';\nimport { registerProsaTools } from './tools.js';\n\ninterface SessionEntry {\n server: McpServer;\n transport: StreamableHTTPServerTransport;\n}\n\nexport interface McpServerOptions {\n host: string;\n port: number;\n path?: string;\n searchEngine?: SearchEngine;\n storePath?: string;\n}\n\nexport interface RunningServer {\n url: string;\n close(): Promise<void>;\n}\n\nexport interface RunningStdioServer {\n close(): Promise<void>;\n}\n\nexport interface McpStdioServerOptions {\n searchEngine?: SearchEngine;\n storePath?: string;\n}\n\nexport async function listenMcpStdioServer(\n bundle: Bundle,\n options: McpStdioServerOptions = {},\n): Promise<RunningStdioServer> {\n const server = createMcpServer(bundle, options.searchEngine ?? 'fts5', options.storePath);\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n return {\n close: async () => {\n await safeClose(server);\n await safeClose(transport);\n },\n };\n}\n\n/**\n * Bind an HTTP MCP server on `host:port` backed by `bundle`. Implements the\n * Streamable HTTP transport with stateful sessions (one McpServer per\n * `MCP-Session-Id`).\n *\n * - POST /mcp — JSON-RPC requests; opens a session if `MCP-Session-Id` is missing\n * - DELETE /mcp — close an existing session by header\n * - GET /mcp — 405 (we don't expose server-initiated SSE streams)\n */\nexport async function listenMcpServer(\n bundle: Bundle,\n options: McpServerOptions,\n): Promise<RunningServer> {\n const mcpPath = options.path ?? '/mcp';\n const sessions = new Map<string, SessionEntry>();\n\n const searchEngine = options.searchEngine ?? 'fts5';\n const storePath = options.storePath ?? bundle.path;\n\n const httpServer = http.createServer((req, res) => {\n handleRequest(req, res, mcpPath, sessions, bundle, searchEngine, storePath).catch(\n (error: unknown) => {\n writeError(res, error);\n },\n );\n });\n\n await new Promise<void>((resolve, reject) => {\n httpServer.once('error', reject);\n httpServer.listen(options.port, options.host, () => {\n httpServer.removeListener('error', reject);\n resolve();\n });\n });\n\n return {\n url: `http://${options.host}:${options.port}${mcpPath}`,\n close: async () => {\n await new Promise<void>((resolve, reject) => {\n httpServer.close((err) => (err ? reject(err) : resolve()));\n });\n for (const entry of sessions.values()) {\n await safeClose(entry.server);\n await safeClose(entry.transport);\n }\n sessions.clear();\n },\n };\n}\n\nasync function handleRequest(\n req: IncomingMessage,\n res: ServerResponse,\n mcpPath: string,\n sessions: Map<string, SessionEntry>,\n bundle: Bundle,\n searchEngine: SearchEngine,\n storePath: string,\n): Promise<void> {\n if (!req.url || !req.url.startsWith(mcpPath)) {\n res.writeHead(404).end();\n return;\n }\n const method = req.method ?? 'GET';\n\n if (method === 'GET') {\n // Match the Sourcebot reference: we don't initiate SSE streams from the\n // server side, so GET is rejected per the MCP Streamable HTTP spec.\n res.writeHead(405, { Allow: 'POST, DELETE' }).end();\n return;\n }\n if (method !== 'POST' && method !== 'DELETE') {\n res.writeHead(405, { Allow: 'POST, DELETE' }).end();\n return;\n }\n\n const headerSessionId = req.headers['mcp-session-id'];\n const sessionId =\n typeof headerSessionId === 'string'\n ? headerSessionId\n : Array.isArray(headerSessionId)\n ? headerSessionId[0]\n : undefined;\n\n let entry: SessionEntry | undefined = sessionId ? sessions.get(sessionId) : undefined;\n\n if (!entry) {\n if (method === 'DELETE') {\n res.writeHead(404).end();\n return;\n }\n entry = await openSession(bundle, sessions, searchEngine, storePath);\n }\n\n const bodyText = await readBody(req);\n const body = bodyText.length > 0 ? safeJsonParse(bodyText) : undefined;\n await entry.transport.handleRequest(req, res, body);\n}\n\nasync function openSession(\n bundle: Bundle,\n store: Map<string, SessionEntry>,\n searchEngine: SearchEngine,\n storePath: string,\n): Promise<SessionEntry> {\n // We need to assemble server + transport together because the transport's\n // `onsessioninitialized` callback wants to register both into the map.\n const server = createMcpServer(bundle, searchEngine, storePath);\n const transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: () => randomUUID(),\n onsessioninitialized: (id: string) => {\n store.set(id, { server, transport });\n },\n onsessionclosed: async (id: string) => {\n const e = store.get(id);\n if (e) {\n await safeClose(e.server);\n await safeClose(e.transport);\n store.delete(id);\n }\n },\n });\n\n await server.connect(transport);\n return { server, transport };\n}\n\nfunction createMcpServer(\n bundle: Bundle,\n searchEngine: SearchEngine,\n storePath?: string,\n): McpServer {\n const server = new McpServer(\n {\n name: 'prosa',\n version: PROSA_PARSER_VERSION,\n },\n { instructions: PROSA_MCP_INSTRUCTIONS },\n );\n registerProsaTools(server, bundle, { ensureStore: true, searchEngine, storePath });\n return server;\n}\n\nasync function readBody(req: IncomingMessage): Promise<string> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on('data', (chunk: Buffer) => chunks.push(chunk));\n req.on('end', () => resolve(Buffer.concat(chunks).toString('utf8')));\n req.on('error', reject);\n });\n}\n\nfunction safeJsonParse(text: string): unknown {\n try {\n return JSON.parse(text);\n } catch {\n return undefined;\n }\n}\n\nasync function safeClose(o: { close: () => Promise<void> | void } | Transport): Promise<void> {\n try {\n await o.close();\n } catch {\n /* ignore */\n }\n}\n\nfunction writeError(res: ServerResponse, error: unknown): void {\n if (!res.headersSent) {\n res.writeHead(500, { 'Content-Type': 'application/json' });\n }\n res.end(\n JSON.stringify({\n jsonrpc: '2.0',\n error: { code: -32603, message: getErrorMessage(error) },\n id: null,\n }),\n );\n}\n","export const PROSA_MCP_INSTRUCTIONS = `\nprosa is a local memory over local agent session histories. Use it to find prior work, commands,\ndecisions, file touches, transcripts, and analytical rollups before answering from memory.\n\nThere are six tools:\n- search: full-text over messages, commands, paths, diffs, and previews. Start here for open-ended\n questions with 2-5 concrete terms. Optional engine, field_kind, raw, since/until filters.\n- sessions: without session_id, lists candidates filtered by source/time/limit. With session_id,\n opens the session: format=detail (default) returns metadata + timeline, format=summary returns\n only the session row, format=markdown renders the full transcript.\n- tool_calls: audit commands and tool usage. Filters by tool_name, canonical_type, session_id,\n errors_only. When path_substring is set, also returns artifacts touching that path — use this for\n file-history questions.\n- analytics: built-in aggregate reports backed by SQLite views. Pick report=sessions|tools|errors|\n models|projects with the matching filters. Use report=sessions with session_id or\n source_path_substring for per-session metrics.\n- artifact: fetch full text for an artifact_id when previews are not enough. Binary artifacts return\n a placeholder.\n- compile: with no input, returns a status snapshot (search index health). With source (and\n optionally sessions_path), imports that provider into the bundle. Use status mode when search\n results look stale; use import mode when local sessions may not be indexed yet.\n\nWhen answering, cite concrete evidence: session_id, timestamp, tool/file path, and the relevant\nsnippet or event. Do not treat search snippets as the whole truth; open the session with\n\\`sessions session_id=… format=detail\\` when accuracy matters.\n`.trim();\n\nexport const INVESTIGATE_PRIOR_WORK_PROMPT = `\nInvestigate prior work in prosa for the topic: {{topic}}\n\nUse this workflow:\n1. Call \\`search\\` with a short query built from the topic.\n2. If results are broad, search again with narrower terms from the best snippets.\n3. Open the most relevant session_ids with \\`sessions session_id=… format=detail\\`.\n4. Use \\`sessions session_id=… format=markdown\\` only for sessions that appear directly relevant.\n5. Answer with evidence: session_id, timestamp, and the decisive snippet or event.\n`.trim();\n\nexport const FIND_FILE_HISTORY_PROMPT = `\nInvestigate history for file/path: {{path}}\n\nUse this workflow:\n1. Call \\`tool_calls\\` with path_substring set to the path or its most distinctive suffix.\n2. Open returned session_ids with \\`sessions session_id=… format=detail\\`.\n3. Call \\`tool_calls\\` with session_id when you need command-level detail inside one session.\n4. Use \\`sessions session_id=… format=markdown\\` only for the most relevant session.\n5. Summarize what changed, who/what tool touched it, and cite session_id plus timestamp.\n`.trim();\n\nexport const AUDIT_TOOL_FAILURES_PROMPT = `\nAudit tool failures in prosa{{query_clause}}.\n\nUse this workflow:\n1. For an aggregate report, call \\`analytics report=errors\\` (filter by source/since/until/tool_name\n as needed).\n2. For per-call evidence, call \\`tool_calls\\` with errors_only=true.\n3. If a query is provided, also call \\`search\\` for that query to find related context.\n4. Open relevant session_ids with \\`sessions session_id=… format=detail\\`.\n5. Group failures by tool_name, command/path, and likely cause.\n6. Answer with evidence: session_id, timestamp, command/path, exit code, and preview.\n`.trim();\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { type Bundle, closeBundle, openOrInitBundle } from '../core/bundle.js';\nimport { getText } from '../core/cas/index.js';\nimport { SOURCE_TOOLS } from '../core/domain/types.js';\nimport { getErrorMessage } from '../core/errors.js';\nimport {\n ANALYTICS_REPORTS,\n type AnalyticsReportFilters,\n runAnalyticsReportFromBundle,\n} from '../services/analytics.js';\nimport {\n COMPILE_PROVIDERS,\n exportCompileParquet,\n getCompileProvider,\n runCompileImports,\n} from '../services/compile.js';\nimport { exportSessionMarkdown } from '../services/export/markdown.js';\nimport { type SearchEngine, getSearchIndexStatuses } from '../services/indexing.js';\nimport { searchFullText } from '../services/search.js';\nimport { getSession, listSessions } from '../services/sessions.js';\nimport { listToolCalls } from '../services/tool_calls.js';\nimport {\n AUDIT_TOOL_FAILURES_PROMPT,\n FIND_FILE_HISTORY_PROMPT,\n INVESTIGATE_PRIOR_WORK_PROMPT,\n} from './guidance.js';\n\nexport interface ProsaToolOptions {\n searchEngine?: SearchEngine;\n storePath?: string;\n ensureStore?: boolean;\n}\n\nconst CANONICAL_TOOL_TYPES = [\n 'shell',\n 'read_file',\n 'write_file',\n 'edit_file',\n 'search_file',\n 'web_search',\n 'mcp',\n 'subagent',\n 'patch',\n 'other',\n] as const;\n\nconst FIELD_KINDS = [\n 'message_text',\n 'user_prompt',\n 'assistant_text',\n 'command',\n 'command_output_preview',\n 'error',\n 'file_path',\n 'diff',\n 'summary',\n 'artifact_text',\n 'tool_args',\n 'tool_result',\n] as const;\n\n/**\n * Register the six prosa MCP tools on `server`. Five are read-only; `compile`\n * is dual-mode (no args = bundle status snapshot, with args = mutating import).\n */\nexport function registerProsaTools(\n server: McpServer,\n bundle: Bundle,\n options: ProsaToolOptions = {},\n): void {\n const searchEngine = options.searchEngine ?? 'fts5';\n const storePath = options.storePath ?? bundle.path;\n const ensureStore = options.ensureStore ?? false;\n registerProsaPrompts(server);\n\n server.registerTool(\n 'search',\n {\n title: 'Full-text search',\n description: `Search messages, commands, paths, diffs, and result previews using the server-selected ${searchEngine} engine. Start here for open-ended questions with 2-5 concrete terms; then call \\`sessions\\` for relevant hits.`,\n inputSchema: {\n query: z.string().min(1),\n engine: z.enum(['fts5', 'tantivy']).optional(),\n field_kind: z.enum(FIELD_KINDS).optional(),\n limit: z.number().int().min(1).max(500).optional().default(50),\n raw: z\n .boolean()\n .optional()\n .default(false)\n .describe('Pass query straight to FTS5 MATCH (allows OR/NEAR/prefixes).'),\n },\n annotations: { readOnlyHint: true, idempotentHint: true },\n },\n async ({ query, engine, field_kind, limit, raw }) =>\n withToolBundle(bundle, storePath, ensureStore, (activeBundle) => {\n const selectedEngine = engine ?? searchEngine;\n const hits = searchFullText(activeBundle, {\n query,\n limit: limit ?? 50,\n raw,\n engine: selectedEngine,\n });\n const filtered = field_kind ? hits.filter((hit) => hit.field_kind === field_kind) : hits;\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(\n {\n query,\n engine: selectedEngine,\n field_kind: field_kind ?? null,\n count: filtered.length,\n hits: filtered,\n },\n null,\n 2,\n ),\n },\n ],\n };\n }),\n );\n\n server.registerTool(\n 'sessions',\n {\n title: 'List or open sessions',\n description:\n 'Without `session_id`, lists sessions filtered by source/time/limit. With `session_id`, opens that session: `format=detail` (default) returns metadata plus timeline events; `format=summary` returns only the session row; `format=markdown` renders the readable transcript. Call after `search` to get evidence behind a hit.',\n inputSchema: {\n session_id: z.string().min(1).optional(),\n format: z.enum(['summary', 'detail', 'markdown']).optional().default('detail'),\n source: z.enum(SOURCE_TOOLS).optional(),\n since: z.string().optional().describe('ISO timestamp lower bound (inclusive)'),\n until: z.string().optional().describe('ISO timestamp upper bound (exclusive)'),\n limit: z.number().int().min(1).max(500).optional().default(50),\n },\n annotations: { readOnlyHint: true, idempotentHint: true },\n },\n async ({ session_id, format, source, since, until, limit }) =>\n withToolBundle(bundle, storePath, ensureStore, async (activeBundle) => {\n if (!session_id) {\n const rows = listSessions(activeBundle, {\n sourceTool: source,\n sinceIso: since,\n untilIso: until,\n limit: limit ?? 50,\n });\n return {\n content: [{ type: 'text', text: JSON.stringify(rows, null, 2) }],\n };\n }\n\n if (format === 'markdown') {\n try {\n const md = await exportSessionMarkdown(activeBundle, session_id);\n return { content: [{ type: 'text', text: md }] };\n } catch (error) {\n return {\n content: [{ type: 'text', text: getErrorMessage(error) }],\n isError: true,\n };\n }\n }\n\n const detail = getSession(activeBundle, session_id);\n if (!detail) {\n return {\n content: [{ type: 'text', text: `session not found: ${session_id}` }],\n isError: true,\n };\n }\n const payload = format === 'summary' ? { session: detail.session } : detail;\n return {\n content: [{ type: 'text', text: JSON.stringify(payload, null, 2) }],\n };\n }),\n );\n\n server.registerTool(\n 'tool_calls',\n {\n title: 'Audit tool calls and file touches',\n description:\n 'Audit commands and tool usage. Filter by tool_name, canonical_type, session_id, errors_only, or path_substring. When `path_substring` is set, also surfaces matching artifacts so file-history questions return both invocations and produced files.',\n inputSchema: {\n session_id: z.string().min(1).optional(),\n tool_name: z.string().optional(),\n canonical_type: z.enum(CANONICAL_TOOL_TYPES).optional(),\n path_substring: z\n .string()\n .min(1)\n .optional()\n .describe('Filter rows where tool_calls.path or artifacts.path contains this substring.'),\n errors_only: z.boolean().optional().default(false),\n since: z.string().optional().describe('ISO timestamp lower bound (inclusive)'),\n until: z.string().optional().describe('ISO timestamp upper bound (exclusive)'),\n limit: z.number().int().min(1).max(500).optional().default(100),\n },\n annotations: { readOnlyHint: true, idempotentHint: true },\n },\n async (input) =>\n withToolBundle(bundle, storePath, ensureStore, (activeBundle) => {\n const rows = listToolCalls(activeBundle, {\n sessionId: input.session_id,\n toolName: input.tool_name,\n canonicalType: input.canonical_type,\n pathSubstring: input.path_substring,\n errorsOnly: input.errors_only,\n sinceIso: input.since,\n untilIso: input.until,\n limit: input.limit ?? 100,\n });\n return {\n content: [{ type: 'text', text: JSON.stringify(rows, null, 2) }],\n };\n }),\n );\n\n server.registerTool(\n 'analytics',\n {\n title: 'Aggregate analytics reports',\n description:\n 'Run a built-in aggregation over the bundle: per-session metrics (`sessions`), tool usage rollup (`tools`), error timeline (`errors`), model usage (`models`), or project activity (`projects`). Backed by SQLite views; mirrors the `prosa analytics` CLI.',\n inputSchema: {\n report: z.enum(ANALYTICS_REPORTS),\n source: z.enum(SOURCE_TOOLS).optional(),\n since: z.string().optional().describe('ISO timestamp lower bound (inclusive)'),\n until: z.string().optional().describe('ISO timestamp upper bound (exclusive)'),\n limit: z.number().int().min(1).max(500).optional().default(50),\n session_id: z\n .string()\n .min(1)\n .optional()\n .describe('Drill-down filter (applies to `sessions` report).'),\n source_path_substring: z\n .string()\n .min(1)\n .optional()\n .describe('Filter `sessions` rows by imported source file path substring.'),\n project: z\n .string()\n .min(1)\n .optional()\n .describe('Filter by project id, name, or path substring.'),\n tool_name: z\n .string()\n .min(1)\n .optional()\n .describe('Filter `tools`/`errors` rows by exact tool name.'),\n canonical_type: z\n .enum(CANONICAL_TOOL_TYPES)\n .optional()\n .describe('Filter `tools` rows by canonical tool type.'),\n errors_only: z.boolean().optional().describe('`tools` report: only error rows.'),\n category: z\n .string()\n .min(1)\n .optional()\n .describe('Filter `errors` by category: tool_result|import_error|uncertainty.'),\n model: z.string().min(1).optional().describe('Filter `models` rows by exact model name.'),\n },\n annotations: { readOnlyHint: true, idempotentHint: true },\n },\n async (input) =>\n withToolBundle(bundle, storePath, ensureStore, (activeBundle) => {\n const filters: AnalyticsReportFilters = {\n source: input.source,\n since: input.since,\n until: input.until,\n limit: input.limit,\n sessionId: input.session_id,\n sourcePathSubstring: input.source_path_substring,\n project: input.project,\n toolName: input.tool_name,\n canonicalType: input.canonical_type,\n errorsOnly: input.errors_only,\n category: input.category,\n model: input.model,\n };\n try {\n const result = runAnalyticsReportFromBundle({\n bundle: activeBundle,\n report: input.report,\n filters,\n });\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(\n { report: input.report, count: result.rows.length, rows: result.rows },\n null,\n 2,\n ),\n },\n ],\n };\n } catch (error) {\n return {\n content: [{ type: 'text', text: getErrorMessage(error) }],\n isError: true,\n };\n }\n }),\n );\n\n server.registerTool(\n 'artifact',\n {\n title: 'Get artifact bytes/text',\n description:\n 'Retrieve full text for an `artifact_id` referenced in a session, search hit, or tool_calls row. Use this when previews are not enough; binary artifacts return a placeholder.',\n inputSchema: {\n artifact_id: z.string().min(1),\n },\n annotations: { readOnlyHint: true, idempotentHint: true },\n },\n async ({ artifact_id }) =>\n withToolBundle(bundle, storePath, ensureStore, async (activeBundle) => {\n const row = activeBundle.db\n .prepare<\n [string],\n { text_object_id: string | null; object_id: string | null; mime_type: string | null }\n >(`SELECT text_object_id, object_id, mime_type FROM artifacts WHERE artifact_id = ?`)\n .get(artifact_id);\n if (!row) {\n return {\n content: [{ type: 'text', text: `artifact not found: ${artifact_id}` }],\n isError: true,\n };\n }\n const objectId = row.text_object_id ?? row.object_id;\n if (!objectId) {\n return { content: [{ type: 'text', text: '[no content stored]' }] };\n }\n try {\n const text = await getText(activeBundle, objectId);\n return { content: [{ type: 'text', text }] };\n } catch {\n return { content: [{ type: 'text', text: `[binary artifact: ${objectId}]` }] };\n }\n }),\n );\n\n server.registerTool(\n 'compile',\n {\n title: 'Compile sessions or report bundle status',\n description:\n 'Without input, returns a status snapshot (search index health, last batch, schema version) without mutating anything. With `source`, imports that provider; `sessions_path` may override its default. Pass `overwrite: true` to force a full rebuild of derived indexes (Tantivy from scratch). With neither `source` nor `sessions_path`, only status is returned.',\n inputSchema: {\n source: z.enum(SOURCE_TOOLS).optional(),\n sessions_path: z.string().min(1).optional(),\n overwrite: z.boolean().optional(),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true },\n },\n async ({ source, sessions_path, overwrite }) =>\n withToolBundle(bundle, storePath, ensureStore, async (activeBundle) => {\n if (sessions_path && !source) {\n return {\n content: [\n {\n type: 'text',\n text: 'sessions_path requires source because providers use incompatible source layouts',\n },\n ],\n isError: true,\n };\n }\n\n if (!source && !sessions_path) {\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(\n { mode: 'status', search_index: getSearchIndexStatuses(activeBundle) },\n null,\n 2,\n ),\n },\n ],\n };\n }\n\n try {\n const result = await runCompileImports({\n bundle: activeBundle,\n providers: source ? [getCompileProvider(source)] : COMPILE_PROVIDERS,\n sessionsPath: sessions_path,\n overwrite,\n });\n const parquet = result.importedAny ? await exportCompileParquet({ storePath }) : null;\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(\n {\n mode: 'import',\n providers: result.providers.map((provider) => ({\n source: provider.source,\n source_path: provider.sourcePath,\n batch_id: provider.batchId,\n counts: provider.counts,\n })),\n imported_any: result.importedAny,\n tantivy: result.tantivy\n ? { indexed_doc_count: result.tantivy.indexedDocCount }\n : null,\n tantivy_error: result.tantivyError,\n fts5_error: result.fts5Error,\n parquet: parquet\n ? {\n out_dir: parquet.outDir,\n manifest_path: parquet.manifestPath,\n table_count: parquet.tableCount,\n files: parquet.files,\n counts: parquet.counts,\n }\n : null,\n search_index: getSearchIndexStatuses(activeBundle),\n },\n null,\n 2,\n ),\n },\n ],\n };\n } catch (error) {\n return {\n content: [{ type: 'text', text: getErrorMessage(error) }],\n isError: true,\n };\n }\n }),\n );\n}\n\nasync function withToolBundle<T>(\n fallbackBundle: Bundle,\n storePath: string,\n ensureStore: boolean,\n fn: (bundle: Bundle) => Promise<T> | T,\n): Promise<T> {\n if (!ensureStore) {\n return await fn(fallbackBundle);\n }\n\n const bundle = await openOrInitBundle(storePath);\n try {\n return await fn(bundle);\n } finally {\n closeBundle(bundle);\n }\n}\n\nfunction registerProsaPrompts(server: McpServer): void {\n server.registerPrompt(\n 'investigate_prior_work',\n {\n title: 'Investigate prior work',\n description:\n 'Guide an agent through searching prosa for prior work on a topic, opening relevant sessions, and citing evidence.',\n argsSchema: {\n topic: z\n .string()\n .min(1)\n .describe('Topic, feature, error, command, or decision to investigate'),\n },\n },\n ({ topic }) => ({\n description: 'Search prosa for relevant prior work and answer with session evidence.',\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: INVESTIGATE_PRIOR_WORK_PROMPT.replace('{{topic}}', topic),\n },\n },\n ],\n }),\n );\n\n server.registerPrompt(\n 'find_file_history',\n {\n title: 'Find file history',\n description:\n 'Guide an agent through finding sessions that touched a file/path and summarizing the relevant history.',\n argsSchema: {\n path: z.string().min(1).describe('File path, directory, or distinctive path suffix'),\n },\n },\n ({ path }) => ({\n description: 'Find sessions that touched a path and summarize the evidence.',\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: FIND_FILE_HISTORY_PROMPT.replace('{{path}}', path),\n },\n },\n ],\n }),\n );\n\n server.registerPrompt(\n 'audit_tool_failures',\n {\n title: 'Audit tool failures',\n description:\n 'Guide an agent through finding failed tool calls and grouping them by likely cause.',\n argsSchema: {\n query: z\n .string()\n .optional()\n .describe('Optional topic, file, command, or error to narrow audit'),\n },\n },\n ({ query }) => ({\n description: 'Audit failed tool calls and cite operational evidence.',\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: AUDIT_TOOL_FAILURES_PROMPT.replace(\n '{{query_clause}}',\n query ? ` related to: ${query}` : '',\n ),\n },\n },\n ],\n }),\n );\n}\n","import type { Bundle } from '../core/bundle.js';\nimport { clampLimit } from '../core/limits.js';\n\nexport type ToolCallEntity = 'tool_call' | 'artifact';\n\nexport interface ToolCallEvidence {\n entity_type: ToolCallEntity;\n session_id: string | null;\n tool_call_id: string | null;\n artifact_id: string | null;\n tool_name: string | null;\n canonical_tool_type: string | null;\n command: string | null;\n path: string | null;\n status: string | null;\n timestamp_start: string | null;\n is_error: 0 | 1 | null;\n exit_code: number | null;\n preview: string | null;\n}\n\nexport interface ToolCallFilters {\n sessionId?: string;\n toolName?: string;\n canonicalType?: string;\n pathSubstring?: string;\n errorsOnly?: boolean;\n sinceIso?: string;\n untilIso?: string;\n limit?: number;\n}\n\nexport function listToolCalls(bundle: Bundle, filters: ToolCallFilters = {}): ToolCallEvidence[] {\n const conds: string[] = [];\n const params: unknown[] = [];\n\n if (filters.toolName) {\n conds.push('tc.tool_name = ?');\n params.push(filters.toolName);\n }\n if (filters.canonicalType) {\n conds.push('tc.canonical_tool_type = ?');\n params.push(filters.canonicalType);\n }\n if (filters.sessionId) {\n conds.push('tc.session_id = ?');\n params.push(filters.sessionId);\n }\n if (filters.errorsOnly) {\n conds.push('(tr.is_error = 1 OR tc.status = ?)');\n params.push('error');\n }\n if (filters.pathSubstring) {\n conds.push('tc.path IS NOT NULL AND tc.path LIKE ?');\n params.push(`%${filters.pathSubstring}%`);\n }\n if (filters.sinceIso) {\n conds.push('(tc.timestamp_start IS NULL OR tc.timestamp_start >= ?)');\n params.push(filters.sinceIso);\n }\n if (filters.untilIso) {\n conds.push('(tc.timestamp_start IS NULL OR tc.timestamp_start < ?)');\n params.push(filters.untilIso);\n }\n\n const where = conds.length ? `WHERE ${conds.join(' AND ')}` : '';\n const limit = clampLimit(filters.limit, { max: 500, fallback: 100 });\n\n const toolCallSql = `\n SELECT 'tool_call' AS entity_type,\n tc.session_id,\n tc.tool_call_id,\n NULL AS artifact_id,\n tc.tool_name,\n tc.canonical_tool_type,\n tc.command,\n tc.path,\n tc.status,\n tc.timestamp_start,\n tr.is_error,\n tr.exit_code,\n tr.preview\n FROM tool_calls tc\n LEFT JOIN tool_results tr ON tr.tool_call_id = tc.tool_call_id\n ${where}\n `;\n\n if (!filters.pathSubstring) {\n const sql = `${toolCallSql} ORDER BY tc.timestamp_start DESC LIMIT ${limit}`;\n return bundle.db.prepare(sql).all(...params) as ToolCallEvidence[];\n }\n\n // path_substring is set: also surface artifacts with matching paths so\n // file-history queries return both tool_calls that touched a path and\n // artifacts produced for that path.\n const artifactSql = `\n SELECT 'artifact' AS entity_type,\n a.session_id,\n NULL AS tool_call_id,\n a.artifact_id,\n NULL AS tool_name,\n NULL AS canonical_tool_type,\n NULL AS command,\n a.path,\n NULL AS status,\n a.created_ts AS timestamp_start,\n NULL AS is_error,\n NULL AS exit_code,\n NULL AS preview\n FROM artifacts a\n WHERE a.path IS NOT NULL AND a.path LIKE ?\n `;\n const sql = `\n ${toolCallSql}\n UNION ALL\n ${artifactSql}\n ORDER BY timestamp_start DESC\n LIMIT ${limit}\n `;\n return bundle.db.prepare(sql).all(...params, `%${filters.pathSubstring}%`) as ToolCallEvidence[];\n}\n","import path from 'node:path';\nimport { Command } from 'commander';\nimport { defaultBundlePath } from '../../core/bundle.js';\nimport { queryDuckDbParquet } from '../../services/export/parquet.js';\nimport { withBundle } from '../bundle.js';\nimport { parseOutputFormat, printRows } from '../output.js';\n\nexport function queryCommand(): Command {\n const duckdb = new Command('duckdb')\n .description('Run a DuckDB SQL query over exported Parquet tables.')\n .argument('<sql>', 'DuckDB SQL query')\n .option('--store <path>', 'bundle directory', defaultBundlePath())\n .option('--parquet-dir <path>', 'Parquet directory (default: <store>/parquet)')\n .option('--output-format <fmt>', 'interactive|table|json|csv', 'table')\n .action(\n async (\n sql: string,\n options: { store: string; parquetDir?: string; outputFormat: string },\n ) => {\n const format = parseOutputFormat(options.outputFormat, 'table');\n const parquetDir = options.parquetDir\n ? path.resolve(options.parquetDir)\n : await withBundle(options.store, (bundle) => bundle.paths.parquet);\n\n const result = await queryDuckDbParquet({ parquetDir, sql });\n printRows(result.rows, {\n format,\n columns: result.columns,\n meta: { query: sql, count: result.rows.length },\n });\n },\n );\n\n return new Command('query').description('Run derived analytical queries.').addCommand(duckdb);\n}\n","import { Command } from 'commander';\nimport { defaultBundlePath } from '../../core/bundle.js';\nimport { searchFullText } from '../../services/search.js';\nimport { withBundle } from '../bundle.js';\nimport { printRows } from '../output.js';\nimport { parseOutputFormat, parseSearchEngine } from '../parsers.js';\n\nexport function searchCommand(): Command {\n return new Command('search')\n .description('Full-text search across messages, tool calls and tool outputs.')\n .argument('<query>', 'FTS5 query string (supports MATCH syntax)')\n .option('--store <path>', 'bundle directory', defaultBundlePath())\n .option('--limit <n>', 'maximum hits', '50')\n .option('--engine <engine>', 'search engine: fts5|tantivy', 'fts5')\n .option('--output-format <fmt>', 'interactive|table|json|csv', 'table')\n .action(\n async (\n query: string,\n options: { store: string; limit: string; engine: string; outputFormat: string },\n ) => {\n const engine = parseSearchEngine(options.engine);\n const format = parseOutputFormat(options.outputFormat, 'table');\n await withBundle(options.store, (bundle) => {\n const hits = searchFullText(bundle, {\n query,\n limit: Number.parseInt(options.limit, 10),\n engine,\n });\n printRows(hits, {\n format,\n columns: ['timestamp', 'role', 'tool_name', 'session_id', 'snippet'],\n meta: { query, engine, count: hits.length },\n });\n });\n },\n );\n}\n","import { Command } from 'commander';\nimport { defaultBundlePath } from '../../core/bundle.js';\nimport { countSessions, listSessions } from '../../services/sessions.js';\nimport { withBundle } from '../bundle.js';\nimport { printRows } from '../output.js';\nimport { parseOutputFormat, parseSourceTool } from '../parsers.js';\n\nexport function sessionsCommand(): Command {\n const command = new Command('sessions')\n .description('List sessions in the bundle, with filters.')\n .enablePositionalOptions()\n .option('--store <path>', 'bundle directory', defaultBundlePath())\n .option('--source <tool>', 'filter by source tool: cursor|codex|claude|gemini')\n .option('--since <iso>', 'sessions starting on/after this ISO timestamp')\n .option('--until <iso>', 'sessions starting before this ISO timestamp')\n .option('--limit <n>', 'maximum rows', '50')\n .option('--output-format <fmt>', 'interactive|table|json|csv', 'table')\n .action(\n async (options: {\n store: string;\n source?: string;\n since?: string;\n until?: string;\n limit: string;\n outputFormat: string;\n }) => {\n const format = parseOutputFormat(options.outputFormat, 'table');\n await withBundle(options.store, (bundle) => {\n const rows = listSessions(bundle, {\n sourceTool: parseSourceTool(options.source),\n sinceIso: options.since,\n untilIso: options.until,\n limit: Number.parseInt(options.limit, 10),\n });\n\n printRows(rows, {\n format,\n columns: [\n 'start_ts',\n 'source_tool',\n 'session_id',\n 'model_last',\n 'message_count',\n 'tool_call_count',\n 'cwd_initial',\n 'title',\n ],\n });\n });\n },\n );\n\n command.addCommand(\n new Command('count')\n .description('Count sessions in the bundle, with filters.')\n .option('--store <path>', 'bundle directory', defaultBundlePath())\n .option('--source <tool>', 'filter by source tool: cursor|codex|claude|gemini')\n .option('--since <iso>', 'sessions starting on/after this ISO timestamp')\n .option('--until <iso>', 'sessions starting before this ISO timestamp')\n .action(\n async (options: {\n store: string;\n source?: string;\n since?: string;\n until?: string;\n }) => {\n await withBundle(options.store, (bundle) => {\n const count = countSessions(bundle, {\n sourceTool: parseSourceTool(options.source),\n sinceIso: options.since,\n untilIso: options.until,\n });\n process.stdout.write(`${count}\\n`);\n });\n },\n ),\n );\n\n return command;\n}\n","import { Command } from 'commander';\nimport { defaultBundlePath } from '../../core/bundle.js';\nimport { withBundle } from '../bundle.js';\n\nexport function tuiCommand(): Command {\n return new Command('tui')\n .description('Open the interactive Ink-based explorer.')\n .option('--store <path>', 'bundle directory', defaultBundlePath())\n .action(async (options: { store: string }) => {\n // Lazy-load Ink/React/App to keep `prosa --help` startup fast.\n const [{ render }, React, { App }] = await Promise.all([\n import('ink'),\n import('react'),\n import('../../tui/App.js'),\n ]);\n await withBundle(options.store, async (bundle) => {\n // eslint-disable-next-line no-console\n console.clear();\n const app = render(React.createElement(App, { bundle }));\n await app.waitUntilExit();\n });\n });\n}\n","#!/usr/bin/env node\nimport { runCli } from '../cli/main.js';\n\nrunCli(process.argv).catch((error: unknown) => {\n // eslint-disable-next-line no-console\n console.error(error instanceof Error ? (error.stack ?? error.message) : error);\n process.exit(1);\n});\n"],"mappings":"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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACH5B,IAAM,8BAA8B,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACA3C,IAAM,0BAA0B,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;;;ACavC,IAAM,6BAA6B,OAAO;AAAA;AAAA;AAAA;;;ACCjD,IAAM,aAAmC;AAAA,EACvC,EAAE,SAAS,GAAG,MAAM,QAAQ,KAAK,aAAa;AAAA,EAC9C,EAAE,SAAS,GAAG,MAAM,uBAAuB,KAAK,4BAA4B;AAAA,EAC5E,EAAE,SAAS,GAAG,MAAM,mBAAmB,KAAK,wBAAwB;AAAA,EACpE,EAAE,SAAS,GAAG,MAAM,sBAAsB,KAAK,2BAA2B;AAC5E;AAEO,SAAS,cAAc,IAA+B;AAC3D,KAAG,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAMP;AAED,QAAM,UAAU,IAAI;AAAA,IAClB,GACG,QAAiC,uCAAuC,EACxE,IAAI,EACJ,IAAI,CAAC,QAAQ,IAAI,OAAO;AAAA,EAC7B;AAEA,QAAM,eAAyB,CAAC;AAEhC,aAAW,aAAa,YAAY;AAClC,QAAI,QAAQ,IAAI,UAAU,OAAO,EAAG;AACpC,UAAM,KAAK,GAAG,YAAY,MAAM;AAC9B,SAAG,KAAK,UAAU,GAAG;AACrB,SAAG,QAAQ,2EAA2E,EAAE;AAAA,QACtF,UAAU;AAAA,QACV,UAAU;AAAA,SACV,oBAAI,KAAK,GAAE,YAAY;AAAA,MACzB;AAAA,IACF,CAAC;AACD,OAAG;AACH,iBAAa,KAAK,UAAU,OAAO;AAAA,EACrC;AAEA,SAAO,EAAE,SAAS,aAAa;AACjC;AAEO,SAAS,qBAAqB,IAAgB;AACnD,MAAI;AACF,UAAM,MAAM,GACT;AAAA,MACC;AAAA,IACF,EACC,IAAI;AACP,WAAO,KAAK,WAAW;AAAA,EACzB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ALjCO,SAAS,oBAA4B;AAC1C,QAAM,MAAM,QAAQ,IAAI;AACxB,MAAI,OAAO,IAAI,SAAS,EAAG,QAAO,KAAK,QAAQ,GAAG;AAClD,SAAO,KAAK,KAAK,GAAG,QAAQ,GAAG,QAAQ;AACzC;AAEA,SAAS,YAAY,UAAmC;AACtD,SAAO;AAAA,IACL,IAAI,KAAK,KAAK,UAAU,cAAc;AAAA,IACtC,UAAU,KAAK,KAAK,UAAU,eAAe;AAAA,IAC7C,SAAS,KAAK,KAAK,UAAU,SAAS;AAAA,IACtC,YAAY,KAAK,KAAK,UAAU,OAAO,SAAS;AAAA,IAChD,QAAQ,KAAK,KAAK,UAAU,QAAQ;AAAA,IACpC,SAAS,KAAK,KAAK,UAAU,UAAU,SAAS;AAAA,IAChD,SAAS,KAAK,KAAK,UAAU,SAAS;AAAA,IACtC,SAAS,KAAK,KAAK,UAAU,SAAS;AAAA,IACtC,MAAM,KAAK,KAAK,UAAU,YAAY;AAAA,EACxC;AACF;AAEA,eAAe,OAAO,GAA6B;AACjD,MAAI;AACF,UAAM,OAAO,GAAG,YAAY,IAAI;AAChC,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAMA,eAAsB,WAAW,UAAmC;AAClE,QAAM,WAAW,KAAK,QAAQ,QAAQ;AACtC,QAAM,QAAQ,YAAY,QAAQ;AAElC,QAAM,MAAM,UAAU,EAAE,WAAW,KAAK,CAAC;AAEzC,MAAI,MAAM,OAAO,MAAM,QAAQ,GAAG;AAChC,UAAM,IAAI;AAAA,MACR,4BAA4B,QAAQ;AAAA,IACtC;AAAA,EACF;AAEA,QAAM,MAAM,MAAM,SAAS,EAAE,WAAW,KAAK,CAAC;AAC9C,QAAM,MAAM,MAAM,YAAY,EAAE,WAAW,KAAK,CAAC;AACjD,QAAM,MAAM,MAAM,QAAQ,EAAE,WAAW,KAAK,CAAC;AAC7C,QAAM,MAAM,MAAM,SAAS,EAAE,WAAW,KAAK,CAAC;AAC9C,QAAM,MAAM,MAAM,SAAS,EAAE,WAAW,KAAK,CAAC;AAC9C,QAAM,MAAM,MAAM,SAAS,EAAE,WAAW,KAAK,CAAC;AAE9C,QAAM,WAA2B;AAAA,IAC/B,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,IACnC,UAAU;AAAA,IACV,qBAAqB;AAAA,EACvB;AAEA,QAAM,UAAU,MAAM,UAAU,GAAG,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AAEhF,QAAM,KAAK,OAAO,MAAM,EAAE;AAC1B,gBAAc,EAAE;AAEhB,SAAO,EAAE,MAAM,UAAU,IAAI,UAAU,MAAM;AAC/C;AAMA,eAAsB,WAAW,UAAmC;AAClE,QAAM,WAAW,KAAK,QAAQ,QAAQ;AACtC,QAAM,QAAQ,YAAY,QAAQ;AAElC,QAAM,UAAU,MAAM,KAAK,QAAQ,EAAE,MAAM,MAAM,IAAI;AACrD,MAAI,CAAC,SAAS,YAAY,GAAG;AAC3B,UAAM,IAAI,MAAM,6CAA6C,QAAQ,EAAE;AAAA,EACzE;AACA,MAAI,CAAE,MAAM,OAAO,MAAM,QAAQ,GAAI;AACnC,UAAM,IAAI;AAAA,MACR,uBAAuB,QAAQ,sDAAiD,QAAQ;AAAA,IAC1F;AAAA,EACF;AAEA,QAAM,WAAW,KAAK,MAAM,MAAM,SAAS,MAAM,UAAU,MAAM,CAAC;AAClE,QAAM,MAAM,MAAM,QAAQ,EAAE,WAAW,KAAK,CAAC;AAC7C,QAAM,MAAM,MAAM,SAAS,EAAE,WAAW,KAAK,CAAC;AAC9C,QAAM,KAAK,OAAO,MAAM,EAAE;AAC1B,gBAAc,EAAE;AAEhB,QAAM,iBAAiB,qBAAqB,EAAE;AAC9C,MAAI,mBAAmB,sBAAsB;AAC3C,YAAQ,EAAE;AACV,UAAM,IAAI,MAAM,+BAA+B,cAAc,UAAU,oBAAoB,GAAG;AAAA,EAChG;AAGA,MAAI,SAAS,mBAAmB,sBAAsB;AACpD,aAAS,iBAAiB;AAC1B,UAAM,UAAU,MAAM,UAAU,GAAG,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AAAA,EAClF;AAEA,SAAO,EAAE,MAAM,UAAU,IAAI,UAAU,MAAM;AAC/C;AAMA,eAAsB,iBAAiB,UAAmC;AACxE,QAAM,WAAW,KAAK,QAAQ,QAAQ;AACtC,QAAM,QAAQ,YAAY,QAAQ;AAElC,QAAM,UAAU,MAAM,KAAK,QAAQ,EAAE,MAAM,MAAM,IAAI;AACrD,MAAI,WAAW,CAAC,QAAQ,YAAY,GAAG;AACrC,UAAM,IAAI,MAAM,6CAA6C,QAAQ,EAAE;AAAA,EACzE;AAEA,MAAI,CAAC,WAAW,CAAE,MAAM,OAAO,MAAM,QAAQ,GAAI;AAC/C,WAAO,MAAM,WAAW,QAAQ;AAAA,EAClC;AAEA,SAAO,MAAM,WAAW,QAAQ;AAClC;AAEO,SAAS,YAAY,QAAsB;AAChD,UAAQ,OAAO,EAAE;AACnB;;;AMnKA;;;ACDA,SAAS,SAAAC,QAAO,IAAI,aAAAC,kBAAiB;AACrC,OAAOC,WAAU;AACjB,SAAS,wBAAwB;AAEjC;AAEO,IAAM,iBAAiB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AA2CA,eAAsB,oBACpB,SAC8B;AAC9B,QAAM,WAAW,MAAM,mBAAmB,QAAQ,UAAU;AAC5D,QAAM,SAASC,MAAK,QAAQ,QAAQ,UAAU,SAAS,aAAa;AACpE,QAAMC,OAAM,QAAQ,EAAE,WAAW,KAAK,CAAC;AAEvC,QAAM,QAAQ,OAAO;AAAA,IACnB,eAAe,IAAI,CAAC,UAAU,CAAC,OAAOD,MAAK,KAAK,QAAQ,GAAG,KAAK,UAAU,CAAC,CAAC;AAAA,EAC9E;AACA,QAAM,eAAeA,MAAK,KAAK,QAAQ,eAAe;AAEtD,aAAW,QAAQ,CAAC,GAAG,OAAO,OAAO,KAAK,GAAG,YAAY,GAAG;AAC1D,UAAM,GAAG,MAAM,EAAE,OAAO,KAAK,CAAC;AAAA,EAChC;AAEA,QAAM,aAAa,MAAM,uBAAuB;AAChD,MAAI;AACF,UAAM,aAAa,YAAY,SAAS,MAAM;AAC9C,eAAW,SAAS,gBAAgB;AAKlC,YAAM,WAAW;AAAA,QACf,6BAA6B,gBAAgB,KAAK,CAAC,QAAQ,UAAU,MAAM,KAAK,CAAC,CAAC;AAAA,MACpF;AAAA,IACF;AAAA,EACF,UAAE;AACA,eAAW,UAAU;AAAA,EACvB;AAEA,QAAM,WAAW;AAAA,IACf,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,WAAW,SAAS;AAAA,IACpB,gBAAgB,SAAS;AAAA,IACzB,gBAAgB,SAAS;AAAA,IACzB,QAAQ,OAAO;AAAA,MACb,eAAe,IAAI,CAAC,UAAU;AAAA,QAC5B;AAAA,QACA;AAAA,UACE,MAAMA,MAAK,SAAS,MAAM,KAAK,CAAC;AAAA,UAChC,MAAM,SAAS,OAAO,KAAK;AAAA,QAC7B;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACA,QAAME,WAAU,cAAc,GAAG,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AAE9E,SAAO,EAAE,QAAQ,cAAc,OAAO,QAAQ,SAAS,OAAO;AAChE;AAEA,eAAsB,mBAAmB,SAAyD;AAChG,QAAM,aAAaF,MAAK,QAAQ,QAAQ,UAAU;AAClD,QAAM,aAAa,MAAM,uBAAuB;AAChD,MAAI;AACF,eAAW,SAAS,gBAAgB;AAClC,YAAM,WAAW;AAAA,QACf,0BAA0B,gBAAgB,KAAK,CAAC,kCAAkC;AAAA,UAChFA,MAAK,KAAK,YAAY,GAAG,KAAK,UAAU;AAAA,QAC1C,CAAC;AAAA,MACH;AAAA,IACF;AACA,UAAM,qBAAqB,UAAU;AAErC,UAAM,SAAS,MAAM,WAAW,cAAc,QAAQ,GAAG;AACzD,WAAO;AAAA,MACL,SAAS,OAAO,wBAAwB;AAAA,MACxC,MAAM,OAAO,kBAAkB;AAAA,IACjC;AAAA,EACF,SAAS,OAAO;AACd,QAAI,sBAAsB,KAAK,GAAG;AAChC,YAAM,IAAI;AAAA,QACR,+BAA+B,UAAU;AAAA,MAC3C;AAAA,IACF;AACA,UAAM;AAAA,EACR,UAAE;AACA,eAAW,UAAU;AAAA,EACvB;AACF;AAEA,eAAe,yBAAoD;AACjE,SAAO,iBAAiB,OAAO;AACjC;AAEA,eAAe,aAAa,YAA8B,QAA+B;AACvF,MAAI;AACF,UAAM,WAAW,IAAI,gBAAgB;AACrC,UAAM,WAAW,IAAI,aAAa;AAClC,UAAM,WAAW,IAAI,UAAU,UAAU,MAAM,CAAC,yBAAyB;AAAA,EAC3E,SAAS,OAAO;AACd,UAAM,IAAI;AAAA,MACR,kEAAkE,gBAAgB,KAAK,CAAC;AAAA,IAC1F;AAAA,EACF;AACF;AAEA,eAAe,qBAAqB,YAA6C;AAC/E,QAAM,WAAW,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAkFpB;AAED,QAAM,WAAW,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAmDpB;AAED,QAAM,WAAW,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GA6DpB;AAED,QAAM,WAAW,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAkDpB;AAED,QAAM,WAAW,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GA4BpB;AACH;AAEA,eAAe,mBAAmB,YAA6C;AAC7E,QAAM,SAAS,MAAM,WAAW,UAAU;AAC1C,MAAI;AACF,UAAM,SAAS,OAAO;AAAA,MACpB,eAAe,IAAI,CAAC,UAAU;AAC5B,cAAM,MAAM,OAAO,GAChB,QAA2B,6BAA6B,gBAAgB,KAAK,CAAC,EAAE,EAChF,IAAI;AACP,eAAO,CAAC,OAAO,KAAK,KAAK,CAAC;AAAA,MAC5B,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,MACL,QAAQ,OAAO,MAAM;AAAA,MACrB,eAAe,OAAO,SAAS;AAAA,MAC/B,eAAe,OAAO,SAAS;AAAA,MAC/B,eAAe,OAAO,MAAM;AAAA,MAC5B;AAAA,IACF;AAAA,EACF,UAAE;AACA,gBAAY,MAAM;AAAA,EACpB;AACF;AAEA,SAAS,gBAAgB,OAAuB;AAC9C,SAAO,IAAI,MAAM,QAAQ,MAAM,IAAI,CAAC;AACtC;AAEA,SAAS,UAAU,OAAuB;AACxC,SAAO,IAAI,MAAM,QAAQ,MAAM,IAAI,CAAC;AACtC;AAEA,SAAS,sBAAsB,OAAyB;AACtD,QAAM,UAAU,gBAAgB,KAAK;AACrC,SAAO,2CAA2C,KAAK,OAAO,KAAK,aAAa,KAAK,OAAO;AAC9F;;;ADheO,IAAM,oBAAoB,CAAC,YAAY,SAAS,UAAU,UAAU,UAAU;AAgCrF,eAAsB,mBACpB,SAC4B;AAC5B,SAAO,mBAAmB;AAAA,IACxB,YAAY,QAAQ;AAAA,IACpB,KAAK,kBAAkB,QAAQ,QAAQ,QAAQ,WAAW,CAAC,GAAG,QAAQ;AAAA,EACxE,CAAC;AACH;AAEO,SAAS,6BACd,SACmB;AACnB,QAAM,MAAM,kBAAkB,QAAQ,QAAQ,QAAQ,WAAW,CAAC,GAAG,QAAQ;AAC7E,QAAM,OAAO,QAAQ,OAAO,GAAG,QAA4C,GAAG;AAC9E,QAAM,OAAO,KAAK,IAAI;AACtB,QAAM,UAAU,KAAK,QAAQ,EAAE,IAAI,CAAC,WAAW,OAAO,IAAI;AAC1D,SAAO,EAAE,SAAS,KAAK;AACzB;AAEA,SAAS,kBACP,QACA,SACA,SACQ;AACR,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO,iBAAiB,SAAS,OAAO;AAAA,IAC1C,KAAK;AACH,aAAO,cAAc,SAAS,OAAO;AAAA,IACvC,KAAK;AACH,aAAO,eAAe,SAAS,OAAO;AAAA,IACxC,KAAK;AACH,aAAO,eAAe,SAAS,OAAO;AAAA,IACxC,KAAK;AACH,aAAO,iBAAiB,SAAS,OAAO;AAAA,EAC5C;AACF;AAEA,SAAS,iBAAiB,SAAiC,SAAmC;AAC5F,QAAM,QAAQ,WAAW;AAAA,IACvB,aAAa,OAAO;AAAA,IACpB,WAAW,YAAY,OAAO;AAAA,IAC9B,cAAc,SAAS,OAAO;AAAA,IAC9B,QAAQ,YAAY,gBAAgBG,WAAU,QAAQ,SAAS,CAAC,KAAK;AAAA,IACrE,QAAQ,sBACJ,yBAAyBA,WAAU,IAAI,WAAW,QAAQ,mBAAmB,CAAC,GAAG,CAAC,iBAClF;AAAA,EACN,CAAC;AACD,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAMD,KAAK;AAAA;AAAA,aAEA,MAAM,OAAO,CAAC;AAAA;AAE3B;AAEA,SAAS,cAAc,SAAiC,SAAmC;AACzF,QAAM,QAAQ,WAAW;AAAA,IACvB,aAAa,OAAO;AAAA,IACpB,WAAW,mBAAmB,OAAO;AAAA,IACrC,cAAc,SAAS,OAAO;AAAA,IAC9B,QAAQ,WAAW,eAAeA,WAAU,QAAQ,QAAQ,CAAC,KAAK;AAAA,IAClE,QAAQ,gBAAgB,yBAAyBA,WAAU,QAAQ,aAAa,CAAC,KAAK;AAAA,IACtF,QAAQ,aAAa,4CAA4C;AAAA,EACnE,CAAC;AACD,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAOD,KAAK;AAAA;AAAA;AAAA,aAGA,MAAM,OAAO,CAAC;AAAA;AAE3B;AAEA,SAAS,eAAe,SAAiC,SAAmC;AAC1F,QAAM,QAAQ,WAAW;AAAA,IACvB,aAAa,OAAO;AAAA,IACpB,WAAW,aAAa,OAAO;AAAA,IAC/B,cAAc,SAAS,OAAO;AAAA,IAC9B,QAAQ,WAAW,eAAeA,WAAU,QAAQ,QAAQ,CAAC,KAAK;AAAA,IAClE,QAAQ,WAAW,oBAAoBA,WAAU,QAAQ,QAAQ,CAAC,KAAK;AAAA,EACzE,CAAC;AACD,SAAO;AAAA;AAAA;AAAA;AAAA,QAID,KAAK;AAAA;AAAA,aAEA,MAAM,OAAO,CAAC;AAAA;AAE3B;AAEA,SAAS,eAAe,SAAiC,SAAmC;AAC1F,QAAM,QAAQ,WAAW;AAAA,IACvB,aAAa,OAAO;AAAA,IACpB,mBAAmB,iBAAiB,gBAAgB,OAAO;AAAA,IAC3D,cAAc,SAAS,OAAO;AAAA,IAC9B,QAAQ,QAAQ,WAAWA,WAAU,QAAQ,KAAK,CAAC,KAAK;AAAA,EAC1D,CAAC;AACD,SAAO;AAAA;AAAA;AAAA;AAAA,QAID,KAAK;AAAA;AAAA,aAEA,MAAM,OAAO,CAAC;AAAA;AAE3B;AAEA,SAAS,iBAAiB,SAAiC,SAAmC;AAC5F,QAAM,QAAQ,WAAW;AAAA,IACvB,aAAa,OAAO;AAAA,IACpB,mBAAmB,oBAAoB,qBAAqB,OAAO;AAAA,IACnE,cAAc,SAAS,OAAO;AAAA,EAChC,CAAC;AACD,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA,QAKD,KAAK;AAAA;AAAA,aAEA,MAAM,OAAO,CAAC;AAAA;AAE3B;AAEA,SAAS,aAAa,SAAgD;AACpE,SAAO,QAAQ,SAAS,iBAAiBA,WAAU,QAAQ,MAAM,CAAC,KAAK;AACzE;AAEA,SAAS,WAAW,QAAgB,SAAgD;AAClF,QAAM,aAAuB,CAAC;AAC9B,MAAI,QAAQ;AACV,eAAW,KAAK,IAAI,MAAM,eAAe,MAAM,OAAOA,WAAU,QAAQ,KAAK,CAAC,GAAG;AACnF,MAAI,QAAQ;AACV,eAAW,KAAK,IAAI,MAAM,eAAe,MAAM,MAAMA,WAAU,QAAQ,KAAK,CAAC,GAAG;AAClF,SAAO,WAAW,SAAS,WAAW,KAAK,OAAO,IAAI;AACxD;AAEA,SAAS,mBACP,aACA,YACA,SACe;AACf,QAAM,aAAuB,CAAC;AAC9B,MAAI,QAAQ,OAAO;AACjB,eAAW,KAAK,IAAI,UAAU,eAAe,UAAU,OAAOA,WAAU,QAAQ,KAAK,CAAC,GAAG;AAAA,EAC3F;AACA,MAAI,QAAQ,OAAO;AACjB,eAAW,KAAK,IAAI,WAAW,eAAe,WAAW,MAAMA,WAAU,QAAQ,KAAK,CAAC,GAAG;AAAA,EAC5F;AACA,SAAO,WAAW,SAAS,WAAW,KAAK,OAAO,IAAI;AACxD;AAEA,SAAS,cAAc,SAAiC,SAA0C;AAChG,MAAI,CAAC,QAAQ,QAAS,QAAO;AAC7B,QAAM,QAAQA,WAAU,QAAQ,OAAO;AACvC,QAAM,OAAOA,WAAU,IAAI,WAAW,QAAQ,OAAO,CAAC,GAAG;AAGzD,QAAM,KAAK,YAAY,WAAW,UAAU;AAC5C,SAAO,iBAAiB,KAAK,oBAAoB,EAAE,IAAI,IAAI,gCAAgC,EAAE,IAAI,IAAI;AACvG;AAEA,SAAS,WAAW,SAAuC;AACzD,QAAM,SAAS,QAAQ,OAAO,CAAC,WAA6B,QAAQ,MAAM,CAAC;AAC3E,SAAO,OAAO,SAAS,SAAS,OAAO,KAAK,OAAO,CAAC,KAAK;AAC3D;AAEA,SAAS,MAAM,SAAyC;AACtD,QAAM,QAAQ,OAAO,SAAS,QAAQ,KAAK,IAAI,QAAQ,QAAQ;AAC/D,SAAO,WAAW,OAAO,EAAE,KAAK,KAAK,UAAU,GAAG,CAAC;AACrD;AAEA,SAASA,WAAU,OAAuB;AACxC,SAAO,IAAI,MAAM,QAAQ,MAAM,IAAI,CAAC;AACtC;AAEA,SAAS,WAAW,OAAuB;AACzC,SAAO,MAAM,QAAQ,WAAW,CAAC,UAAU,KAAK,KAAK,EAAE;AACzD;;;AEjOA,OAAOC,WAAU;AAGjB,eAAsB,WACpB,WACA,IACY;AACZ,QAAM,SAAS,MAAM,WAAWC,MAAK,QAAQ,SAAS,CAAC;AACvD,MAAI;AACF,WAAO,MAAM,GAAG,MAAM;AAAA,EACxB,UAAE;AACA,gBAAY,MAAM;AAAA,EACpB;AACF;;;ACbO,IAAM,iBAAiB,CAAC,eAAe,SAAS,QAAQ,KAAK;AAGpE,IAAM,gBAAgB;AACtB,IAAM,YAAY;AAEX,SAAS,kBAAkB,OAA2B,UAAsC;AACjG,MAAI,UAAU,OAAW,QAAO;AAChC,MAAK,eAAqC,SAAS,KAAK,EAAG,QAAO;AAClE,QAAM,IAAI;AAAA,IACR,4BAA4B,KAAK,qBAAqB,eAAe,KAAK,IAAI,CAAC;AAAA,EACjF;AACF;AASO,SAAS,UAAU,MAAyB,MAA0B;AAC3E,UAAQ,KAAK,QAAQ;AAAA,IACnB,KAAK;AACH,gBAAU,MAAM,IAAI;AACpB;AAAA,IACF,KAAK;AACH,eAAS,MAAM,IAAI;AACnB;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AACH,iBAAW,MAAM,IAAI;AACrB;AAAA,EACJ;AACF;AAEA,SAAS,UAAU,MAAyB,MAA0B;AACpE,QAAM,MAAM,KAAK,OAAO,EAAE,GAAG,KAAK,MAAM,KAAK,IAAI;AACjD,UAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,KAAK,MAAM,CAAC,CAAC;AAAA,CAAI;AAC1D;AAEA,SAAS,SAAS,MAAyB,MAA0B;AACnE,QAAM,UAAU,KAAK;AACrB,UAAQ,OAAO,MAAM,GAAG,QAAQ,IAAI,QAAQ,EAAE,KAAK,GAAG,CAAC;AAAA,CAAI;AAC3D,aAAW,OAAO,MAAM;AACtB,UAAM,SAAS;AACf,UAAM,OAAO,QAAQ,IAAI,CAAC,WAAW,SAAS,WAAW,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG;AACnF,YAAQ,OAAO,MAAM,GAAG,IAAI;AAAA,CAAI;AAAA,EAClC;AACF;AAEA,SAAS,SAAS,OAAuB;AACvC,MAAI,SAAS,KAAK,KAAK,EAAG,QAAO,IAAI,MAAM,QAAQ,MAAM,IAAI,CAAC;AAC9D,SAAO;AACT;AAEA,SAAS,WAAW,MAAyB,MAA0B;AACrE,QAAM,UAAU,KAAK;AACrB,QAAM,SAAS,QAAQ,IAAI,CAAC,WAAW,OAAO,MAAM;AACpD,QAAM,QAAQ,KAAK,IAAI,CAAC,QAAQ;AAC9B,UAAM,SAAS;AACf,WAAO,QAAQ,IAAI,CAAC,QAAQ,UAAU;AACpC,YAAM,OAAO,WAAW,OAAO,MAAM,CAAC;AACtC,YAAM,QAAQ,OAAO,KAAK,KAAK;AAC/B,UAAI,KAAK,SAAS,MAAO,QAAO,KAAK,IAAI,KAAK;AAC9C,aAAO;AAAA,IACT,CAAC;AAAA,EACH,CAAC;AAED,QAAM,SAAS,QACZ,IAAI,CAAC,QAAQ,UAAU,OAAO,OAAO,OAAO,KAAK,KAAK,CAAC,CAAC,EACxD,KAAK,aAAa;AACrB,QAAM,OAAO,QAAQ,IAAI,CAAC,GAAG,UAAU,UAAU,OAAO,OAAO,KAAK,KAAK,CAAC,CAAC,EAAE,KAAK,aAAa;AAC/F,UAAQ,OAAO,MAAM,GAAG,MAAM;AAAA,EAAK,IAAI;AAAA,CAAI;AAC3C,aAAW,WAAW,OAAO;AAC3B,UAAM,OAAO,QAAQ,IAAI,CAAC,MAAM,UAAU,KAAK,OAAO,OAAO,KAAK,KAAK,CAAC,CAAC,EAAE,KAAK,aAAa;AAC7F,YAAQ,OAAO,MAAM,GAAG,IAAI;AAAA,CAAI;AAAA,EAClC;AACF;AAEA,SAAS,WAAW,OAAwB;AAC1C,MAAI,SAAS,KAAM,QAAO;AAC1B,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,MAAI,OAAO,UAAU,YAAY,OAAO,UAAU,UAAW,QAAO,OAAO,KAAK;AAChF,SAAO,KAAK,UAAU,KAAK;AAC7B;;;ACjFO,IAAM,eAAe,CAAC,UAAU,SAAS,UAAU,QAAQ;;;ACG3D,SAAS,kBAAkB,OAA6B;AAC7D,MAAI,UAAU,UAAU,UAAU,UAAW,QAAO;AACpD,QAAM,IAAI,MAAM,0BAA0B,KAAK,6BAA6B;AAC9E;AAEO,SAAS,kBAAkB,OAA6B;AAC7D,MAAI,UAAU,WAAW,UAAU,OAAQ,QAAO;AAClD,QAAM,IAAI,MAAM,sBAAsB,KAAK,2BAA2B;AACxE;AAEO,SAAS,gBAAgB,OAAmD;AACjF,MAAI,UAAU,OAAW,QAAO;AAChC,MAAK,aAAmC,SAAS,KAAK,EAAG,QAAO;AAChE,QAAM,IAAI,MAAM,wBAAwB,KAAK,qBAAqB,aAAa,KAAK,IAAI,CAAC,GAAG;AAC9F;;;AZSO,SAAS,mBAA4B;AAC1C,QAAM,UAAU,IAAI,QAAQ,WAAW,EAAE;AAAA,IACvC;AAAA,EACF;AAEA,UAAQ,WAAW,cAAc,YAAY,kDAAkD,CAAC;AAChG,UAAQ,WAAW,cAAc,SAAS,oDAAoD,CAAC;AAC/F,UAAQ;AAAA,IACN,cAAc,UAAU,4DAA4D;AAAA,EACtF;AACA,UAAQ,WAAW,cAAc,UAAU,oDAAoD,CAAC;AAChG,UAAQ;AAAA,IACN,cAAc,YAAY,oDAAoD;AAAA,EAChF;AAEA,SAAO;AACT;AAEA,SAAS,cAAc,QAAyB,aAA8B;AAC5E,QAAM,UAAU,iBAAiB,IAAI,QAAQ,MAAM,EAAE,YAAY,WAAW,CAAC;AAE7E,MAAI,WAAW,SAAS;AACtB,YACG,OAAO,sBAAsB,2BAA2B,EACxD,OAAO,2BAA2B,+BAA+B,EACjE,OAAO,iBAAiB,qCAAqC;AAAA,EAClE;AACA,MAAI,WAAW,UAAU;AACvB,YACG,OAAO,sBAAsB,2BAA2B,EACxD,OAAO,yBAAyB,0BAA0B;AAAA,EAC/D;AACA,MAAI,WAAW,UAAU;AACvB,YAAQ,OAAO,mBAAmB,4BAA4B;AAAA,EAChE;AACA,MAAI,WAAW,YAAY;AACzB,YAAQ,OAAO,oBAAoB,+CAA+C;AAAA,EACpF;AACA,MAAI,WAAW,YAAY;AACzB,YAAQ,OAAO,oBAAoB,+CAA+C;AAAA,EACpF;AAEA,SAAO,QAAQ,OAAO,OAAO,YAAiC;AAC5D,UAAM,SAAS,kBAAkB,QAAQ,cAAc,OAAO;AAC9D,UAAM,aAAa,MAAM,kBAAkB,OAAO;AAClD,UAAM,UAAU,aAAa,OAAO;AACpC,UAAM,SAAS,MAAM,mBAAmB,EAAE,YAAY,QAAQ,QAAQ,CAAC;AAEvE,cAAU,OAAO,MAAM;AAAA,MACrB;AAAA,MACA,SAAS,OAAO;AAAA,MAChB,MAAM,EAAE,QAAQ,OAAO,OAAO,KAAK,OAAO;AAAA,IAC5C,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,iBAAiB,SAA2B;AACnD,SAAO,QACJ,OAAO,kBAAkB,oBAAoB,kBAAkB,CAAC,EAChE,OAAO,wBAAwB,8CAA8C,EAC7E,OAAO,aAAa,0CAA0C,EAC9D,OAAO,mBAAmB,mDAAmD,EAC7E,OAAO,iBAAiB,mCAAmC,EAC3D,OAAO,iBAAiB,mCAAmC,EAC3D,OAAO,eAAe,gBAAgB,IAAI,EAC1C,OAAO,yBAAyB,8BAA8B,OAAO;AAC1E;AAEA,eAAe,kBAAkB,SAA+C;AAC9E,QAAM,YAAYC,MAAK,QAAQ,QAAQ,KAAK;AAC5C,QAAM,SAAS,QAAQ,aAAaA,MAAK,QAAQ,QAAQ,UAAU,IAAI;AACvE,MAAI,QAAQ,SAAS;AACnB,UAAM,SAAS,MAAM,oBAAoB,EAAE,YAAY,WAAW,OAAO,CAAC;AAC1E,WAAO,OAAO;AAAA,EAChB;AAEA,SAAO,UAAW,MAAM,WAAW,WAAW,CAAC,WAAW,OAAO,MAAM,OAAO;AAChF;AAEA,SAAS,aAAa,SAAsD;AAC1E,SAAO;AAAA,IACL,QAAQ,gBAAgB,QAAQ,MAAM;AAAA,IACtC,OAAO,QAAQ;AAAA,IACf,OAAO,QAAQ;AAAA,IACf,OAAO,OAAO,SAAS,QAAQ,OAAO,EAAE;AAAA,IACxC,UAAU,QAAQ;AAAA,IAClB,eAAe,QAAQ;AAAA,IACvB,YAAY,QAAQ;AAAA,IACpB,UAAU,QAAQ;AAAA,IAClB,OAAO,QAAQ;AAAA,IACf,SAAS,QAAQ;AAAA,EACnB;AACF;;;Aa1HA,SAAS,WAAAC,gBAAe;;;ACIxB;AAJA,OAAOC,SAAQ;AACf,OAAOC,YAAU;;;ACDjB,SAAS,YAAAC,iBAAgB;AACzB,OAAOC,WAAU;;;ACEjB;AAHA,SAAS,SAAAC,QAAO,YAAAC,WAAU,aAAAC,kBAAiB;AAC3C,OAAOC,WAAU;;;ACDjB,SAAS,YAAY,cAAc,cAAc,sBAAsB;AAGvE,IAAM,2BAA2B;AACjC,IAAM,aAAa;AASZ,SAAS,cAAc,OAAsC;AAClE,MAAI,MAAM,aAAa,0BAA0B;AAC/C,WAAO,EAAE,OAAO,OAAO,KAAK,KAAK,GAAG,aAAa,OAAO;AAAA,EAC1D;AACA,QAAM,MAAM,aAAa,OAAO,KAAK,KAAK,GAAG,EAAE,kBAAkB,WAAW,CAAC;AAC7E,SAAO,EAAE,OAAO,KAAK,aAAa,OAAO;AAC3C;AAEO,SAAS,gBAAgB,OAAe,aAAkC;AAC/E,MAAI,gBAAgB,OAAQ,QAAO;AACnC,SAAO,eAAe,KAAK;AAC7B;;;ACxBA,SAAS,kBAAkB;AAC3B,SAAS,cAAc;AACvB,SAAS,kBAAkB;AAEpB,SAAS,UAAU,OAA2B;AACnD,SAAO,WAAW,OAAO,KAAK,CAAC;AACjC;AAEO,SAAS,UAAU,OAAoC;AAC5D,SAAO,WAAW,QAAQ,EAAE,OAAO,KAAK,EAAE,OAAO,KAAK;AACxD;AAGO,SAAS,iBAAiB,SAAyB;AACxD,SAAO,UAAU,OAAO;AAC1B;AAMO,SAAS,kBAAkB,SAAiB,aAAsC;AACvF,QAAM,MAAM,gBAAgB,SAAS,SAAS;AAC9C,QAAM,IAAI,QAAQ,MAAM,GAAG,CAAC;AAC5B,QAAM,IAAI,QAAQ,MAAM,GAAG,CAAC;AAC5B,SAAO,kBAAkB,CAAC,IAAI,CAAC,IAAI,OAAO,GAAG,GAAG;AAClD;;;AFOA,IAAM,cAAc,oBAAI,IAAY;AAEpC,eAAsB,UAAU,aAAoC;AAClE,MAAI,YAAY,IAAI,WAAW,EAAG;AAClC,QAAMC,OAAM,aAAa,EAAE,WAAW,KAAK,CAAC;AAC5C,cAAY,IAAI,WAAW;AAC7B;AASA,eAAsB,SACpB,QACA,OACA,UAAsB,CAAC,GACJ;AACnB,QAAM,OAAO,UAAU,KAAK;AAC5B,QAAM,WAAW,iBAAiB,IAAI;AAEtC,QAAM,WAAW;AAAA,IACf,OAAO;AAAA,IACP;AAAA;AAAA;AAAA,EAGF,EAAE,IAAI,QAAQ;AAEd,MAAI,SAAU,QAAO;AAErB,QAAM,EAAE,OAAO,QAAQ,YAAY,IAAI,cAAc,KAAK;AAC1D,QAAM,cAAc,kBAAkB,MAAM,WAAW;AACvD,QAAM,eAAeC,MAAK,KAAK,OAAO,MAAM,WAAW;AAEvD,QAAM,UAAUA,MAAK,QAAQ,YAAY,CAAC;AAC1C,QAAMC,WAAU,cAAc,MAAM;AAEpC;AAAA,IACE,OAAO;AAAA,IACP;AAAA;AAAA;AAAA;AAAA,EAIF,EAAE;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN,gBAAgB,SAAS,OAAO,aAAa;AAAA,IAC7C;AAAA,IACA,QAAQ,YAAY;AAAA,IACpB,QAAQ,YAAY;AAAA,IACpB;AAAA,KACA,oBAAI,KAAK,GAAE,YAAY;AAAA,EACzB;AAEA,SAAO;AACT;AAcA,eAAsB,QAAQ,QAAgB,OAAmC;AAG/E,QAAM,OAAO,KAAK,UAAU,KAAK;AACjC,SAAO,SAAS,QAAQ,OAAO,KAAK,MAAM,MAAM,GAAG;AAAA,IACjD,UAAU;AAAA,IACV,UAAU;AAAA,EACZ,CAAC;AACH;AAEA,eAAsB,SAAS,QAAgB,UAAqC;AAClF,QAAM,OAAO;AAAA,IACX,OAAO;AAAA,IACP;AAAA;AAAA;AAAA,EAGF,EAAE,IAAI,QAAQ;AACd,MAAI,CAAC,MAAM;AACT,UAAM,IAAI,MAAM,qBAAqB,QAAQ,EAAE;AAAA,EACjD;AACA,QAAM,MAAM,MAAMC,UAASC,MAAK,KAAK,OAAO,MAAM,KAAK,YAAY,CAAC;AACpE,SAAO,gBAAgB,KAAK,KAAK,WAAW;AAC9C;AAEA,eAAsB,QAAQ,QAAgB,UAAqC;AACjF,QAAM,MAAM,MAAM,SAAS,QAAQ,QAAQ;AAC3C,SAAO,IAAI,SAAS,MAAM;AAC5B;AAiDO,SAAS,uBAAuC;AACrD,SAAO,EAAE,MAAM,oBAAI,IAAI,EAAE;AAC3B;AAEO,SAAS,WACd,SACA,OACA,UAAsB,CAAC,GACb;AACV,QAAM,MAAM,OAAO,SAAS,KAAK,IAAI,QAAQ,OAAO,KAAK,KAAK;AAC9D,QAAM,OAAO,UAAU,GAAG;AAC1B,QAAM,WAAW,iBAAiB,IAAI;AACtC,MAAI,CAAC,QAAQ,KAAK,IAAI,QAAQ,GAAG;AAC/B,YAAQ,KAAK,IAAI,UAAU;AAAA,MACzB;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP,UAAU,QAAQ,YAAY;AAAA,MAC9B,UAAU,QAAQ,YAAY;AAAA,IAChC,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEO,SAAS,UACd,SACA,MACA,UAAiC,CAAC,GACxB;AACV,SAAO,WAAW,SAAS,OAAO,KAAK,MAAM,MAAM,GAAG;AAAA,IACpD,UAAU,QAAQ,YAAY;AAAA,IAC9B,UAAU;AAAA,EACZ,CAAC;AACH;AAEO,SAAS,UAAU,SAAyB,OAA0B;AAC3E,SAAO,WAAW,SAAS,OAAO,KAAK,KAAK,UAAU,KAAK,GAAG,MAAM,GAAG;AAAA,IACrE,UAAU;AAAA,IACV,UAAU;AAAA,EACZ,CAAC;AACH;AAWA,eAAsB,oBAAoB,QAAgB,SAAwC;AAChG,MAAI,QAAQ,KAAK,SAAS,EAAG;AAE7B,QAAM,MAAM,CAAC,GAAG,QAAQ,KAAK,KAAK,CAAC;AACnC,QAAM,cAAc,uBAAuB,QAAQ,GAAG;AAWtD,QAAM,UAA4B,CAAC;AACnC,aAAW,OAAO,QAAQ,KAAK,OAAO,GAAG;AACvC,QAAI,YAAY,IAAI,IAAI,QAAQ,EAAG;AACnC,UAAM,EAAE,OAAO,iBAAiB,YAAY,IAAI,cAAc,IAAI,KAAK;AACvE,UAAM,cAAc,kBAAkB,IAAI,MAAM,WAAW;AAC3D,YAAQ,KAAK;AAAA,MACX,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAcC,MAAK,KAAK,OAAO,MAAM,WAAW;AAAA,IAClD,CAAC;AAAA,EACH;AAEA,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAM,mBAAmB,OAAO;AAAA,EAClC;AAEA,QAAM,eAAe;AAAA,IACnB,OAAO;AAAA,IACP;AAAA;AAAA;AAAA;AAAA,EAIF;AACA,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,aAAW,KAAK,SAAS;AACvB,iBAAa;AAAA,MACX,EAAE,OAAO;AAAA,MACT,EAAE,OAAO;AAAA,MACT,EAAE,OAAO,MAAM;AAAA,MACf,EAAE,gBAAgB,SAAS,EAAE,gBAAgB,aAAa;AAAA,MAC1D,EAAE;AAAA,MACF,EAAE,OAAO;AAAA,MACT,EAAE,OAAO;AAAA,MACT,EAAE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,uBAAuB,QAAgB,KAAgC;AAC9E,QAAM,QAAQ,oBAAI,IAAc;AAChC,MAAI,IAAI,WAAW,EAAG,QAAO;AAG7B,QAAM,QAAQ;AACd,WAAS,QAAQ,GAAG,QAAQ,IAAI,QAAQ,SAAS,OAAO;AACtD,UAAM,QAAQ,IAAI,MAAM,OAAO,QAAQ,KAAK;AAC5C,UAAM,eAAe,MAAM,IAAI,MAAM,GAAG,EAAE,KAAK,GAAG;AAClD,UAAM,OAAO,OAAO,GACjB;AAAA,MACC,qDAAqD,YAAY;AAAA,IACnE,EACC,IAAI,GAAG,KAAK;AACf,eAAW,OAAO,KAAM,OAAM,IAAI,IAAI,SAAS;AAAA,EACjD;AACA,SAAO;AACT;AAEA,IAAM,uBAAuB;AAE7B,eAAe,mBACb,OACe;AACf,MAAI,SAAS;AACb,QAAM,UAA2B,CAAC;AAClC,QAAMC,SAAQ,KAAK,IAAI,sBAAsB,MAAM,MAAM;AACzD,WAAS,IAAI,GAAG,IAAIA,QAAO,KAAK;AAC9B,YAAQ;AAAA,OACL,YAAY;AACX,eAAO,MAAM;AACX,gBAAM,IAAI;AACV,cAAI,KAAK,MAAM,OAAQ;AACvB,gBAAM,OAAO,MAAM,CAAC;AACpB,gBAAM,UAAUD,MAAK,QAAQ,KAAK,YAAY,CAAC;AAC/C,gBAAME,WAAU,KAAK,cAAc,KAAK,eAAe;AAAA,QACzD;AAAA,MACF,GAAG;AAAA,IACL;AAAA,EACF;AACA,QAAM,QAAQ,IAAI,OAAO;AAC3B;;;AD7TA;;;AILA,IAAM,kBAAkB;AAExB,SAAS,QAAQ,OAAkC;AAEjD,SAAO,UAAU,MAAM,KAAK,IAAG,CAAC,EAAE,MAAM,GAAG,kBAAkB,CAAC;AAChE;AAEO,SAAS,aACd,YACA,cACA,aACQ;AAIR,SAAO,QAAQ,CAAC,eAAe,YAAY,cAAc,WAAW,CAAC;AACvE;AAEO,SAAS,YACdC,eACA,SACA,aACQ;AACR,SAAO,QAAQ,CAAC,cAAcA,eAAc,OAAO,WAAW,EAAE,GAAG,WAAW,CAAC;AACjF;AAEO,SAAS,UAAU,YAAoB,iBAAiC;AAC7E,SAAO,QAAQ,CAAC,WAAW,YAAY,eAAe,CAAC;AACzD;AAEO,SAAS,OAAOC,YAAmB,SAAiB,cAAsC;AAC/F,SAAO,QAAQ,CAAC,QAAQA,YAAW,OAAO,OAAO,GAAG,gBAAgB,EAAE,CAAC;AACzE;AAEO,SAAS,QAAQA,YAAmB,SAAiB,MAAsB;AAChF,SAAO,QAAQ,CAAC,SAASA,YAAW,OAAO,OAAO,GAAG,IAAI,CAAC;AAC5D;AAEO,SAAS,UAAUA,YAAmB,SAAiB,aAAqC;AACjG,SAAO,QAAQ,CAAC,WAAWA,YAAW,OAAO,OAAO,GAAG,eAAe,EAAE,CAAC;AAC3E;AAEO,SAAS,QAAQ,kBAA0B,SAAyB;AACzE,SAAO,QAAQ,CAAC,SAAS,kBAAkB,OAAO,OAAO,CAAC,CAAC;AAC7D;AAEO,SAAS,WAAWA,YAAmB,cAA8B;AAC1E,SAAO,QAAQ,CAAC,aAAaA,YAAW,YAAY,CAAC;AACvD;AAEO,SAAS,aAAaA,YAAmB,cAA8B;AAC5E,SAAO,QAAQ,CAAC,eAAeA,YAAW,YAAY,CAAC;AACzD;AAEO,SAAS,WAAWA,YAA0B,YAAoB,KAAqB;AAC5F,SAAO,QAAQ,CAAC,YAAYA,cAAa,IAAI,YAAY,GAAG,CAAC;AAC/D;AAEO,SAAS,UAAU,YAAoB,iBAAiC;AAC7E,SAAO,QAAQ,CAAC,WAAW,YAAY,eAAe,CAAC;AACzD;AAEO,SAAS,cAAc,YAAoB,cAA8B;AAC9E,SAAO,QAAQ,CAAC,gBAAgB,YAAY,cAAc,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC;AAClF;;;AJhDA;;;AKrBA;AA+BO,SAAS,cAA4B;AAC1C,SAAO;AAAA,IACL,mBAAmB;AAAA,IACnB,uBAAuB;AAAA,IACvB,sBAAsB;AAAA,IACtB,aAAa;AAAA,IACb,UAAU;AAAA,IACV,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,WAAW;AAAA,IACX,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AACF;AAEO,SAAS,WACd,QACA,YACA,OACa;AACb,QAAM,aAAY,oBAAI,KAAK,GAAE,YAAY;AACzC,QAAM,KAAK,cAAc,cAAc,OAAO,SAAS;AACvD;AAAA,IACE,OAAO;AAAA,IACP;AAAA;AAAA;AAAA,EAGF,EAAE,IAAI,IAAI,sBAAsB,YAAY,KAAK,UAAU,KAAK,GAAG,SAAS;AAE5E,SAAO;AAAA,IACL,UAAU;AAAA,IACV,aAAa;AAAA,IACb,gBAAgB;AAAA,IAChB;AAAA,IACA,YAAY;AAAA,EACd;AACF;AAEO,SAAS,YACd,QACA,OACA,QACA,QACM;AACN;AAAA,IACE,OAAO;AAAA,IACP;AAAA;AAAA;AAAA,EAGF,EAAE,KAAI,oBAAI,KAAK,GAAE,YAAY,GAAG,QAAQ,KAAK,UAAU,MAAM,GAAG,MAAM,QAAQ;AAChF;AAEA,eAAsB,YACpB,QACA,SACA,MAOe;AACf,MAAI,kBAAmC;AACvC,MAAI,KAAK,YAAY,QAAW;AAC9B,sBAAkB,MAAM,QAAQ,QAAQ,KAAK,OAAO;AAAA,EACtD;AACA;AAAA,IACE,OAAO;AAAA,IACP;AAAA;AAAA;AAAA;AAAA,EAIF,EAAE;AAAA,IACA;AAAA,IACA,KAAK,gBAAgB;AAAA,IACrB,KAAK,eAAe;AAAA,IACpB,KAAK;AAAA,IACL,KAAK;AAAA,IACL;AAAA,KACA,oBAAI,KAAK,GAAE,YAAY;AAAA,EACzB;AACF;;;ACvHA,SAAS,UAAAC,SAAQ,YAAAC,WAAU,QAAAC,OAAM,aAAAC,kBAAiB;AAClD,OAAOC,WAAU;AAKjB;AA+BA,eAAsB,mBACpB,QACA,MAMyB;AACzB,QAAM,KAAK,MAAMC,MAAK,KAAK,YAAY;AACvC,QAAM,OAAO,GAAG;AAChB,QAAM,QAAQ,GAAG,MAAM,YAAY;AAInC,QAAM,QAAQ;AAAA,IACZ,OAAO;AAAA,IACP;AAAA;AAAA;AAAA;AAAA;AAAA,EAKF,EAAE,IAAI,KAAK,YAAY,KAAK,cAAc,MAAM,KAAK;AAErD,MAAI,OAAO;AACT,WAAO;AAAA,MACL,KAAK,MAAM,0BAA0B,QAAQ,OAAO,KAAK,YAAY;AAAA,MACrE,cAAc;AAAA,IAChB;AAAA,EACF;AAEA,QAAM,MAAM,MAAMC,UAAS,KAAK,YAAY;AAC5C,QAAM,cAAc,UAAU,GAAG;AAIjC,QAAM,QAAQ;AAAA,IACZ,OAAO;AAAA,IACP;AAAA;AAAA;AAAA;AAAA;AAAA,EAKF,EAAE,IAAI,KAAK,YAAY,KAAK,cAAc,WAAW;AAErD,MAAI,OAAO;AACT,WAAO;AAAA,MACL,KAAK,MAAM,0BAA0B,QAAQ,OAAO,KAAK,cAAc,GAAG;AAAA,MAC1E,cAAc;AAAA,IAChB;AAAA,EACF;AAEA,QAAM,WAAW,MAAM,uBAAuB,QAAQ,GAAG;AAEzD,QAAM,KAAK,aAAa,KAAK,YAAY,KAAK,cAAc,WAAW;AACvE,QAAM,MAAqB;AAAA,IACzB,gBAAgB;AAAA,IAChB,aAAa,KAAK;AAAA,IAClB,MAAM,KAAK;AAAA,IACX,WAAW,KAAK;AAAA,IAChB,YAAY;AAAA,IACZ;AAAA,IACA,cAAc;AAAA,IACd,WAAW;AAAA,IACX,gBAAe,oBAAI,KAAK,GAAE,YAAY;AAAA,IACtC,gBAAgB,KAAK,iBAAiB;AAAA,EACxC;AAEA;AAAA,IACE,OAAO;AAAA,IACP;AAAA;AAAA;AAAA;AAAA,EAIF,EAAE;AAAA,IACA,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AAEA,SAAO,EAAE,KAAK,cAAc,MAAM;AACpC;AAEA,eAAe,0BACb,QACA,KACA,cACA,OACwB;AACxB,MAAI,IAAI,UAAW,QAAO;AAE1B,QAAM,cAAc,SAAU,MAAMA,UAAS,YAAY;AACzD,QAAM,WAAW,MAAM,uBAAuB,QAAQ,WAAW;AAEjE;AAAA,IACE,OAAO;AAAA,IACP;AAAA,EACF,EAAE,IAAI,UAAU,IAAI,cAAc;AAElC,SAAO,EAAE,GAAG,KAAK,WAAW,SAAS;AACvC;AAEA,eAAe,uBAAuB,QAAgB,OAAoC;AACxF,QAAM,OAAO,UAAU,KAAK;AAC5B,QAAM,WAAW,iBAAiB,IAAI;AACtC,QAAM,EAAE,OAAO,QAAQ,YAAY,IAAI,cAAc,KAAK;AAC1D,QAAM,cAAc,qBAAqB,MAAM,WAAW;AAC1D,QAAM,eAAeC,MAAK,KAAK,OAAO,MAAM,WAAW;AAEvD,QAAM,UAAUA,MAAK,QAAQ,YAAY,CAAC;AAC1C,MAAI,CAAE,MAAM,WAAW,YAAY,GAAI;AACrC,UAAMC,WAAU,cAAc,MAAM;AAAA,EACtC;AAEA,QAAM,WAAW;AAAA,IACf,OAAO;AAAA,IACP;AAAA,EACF,EAAE,IAAI,QAAQ;AAEd,MAAI,CAAC,UAAU;AACb;AAAA,MACE,OAAO;AAAA,MACP;AAAA;AAAA;AAAA;AAAA,IAIF,EAAE;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,gBAAgB,SAAS,OAAO,aAAa;AAAA,MAC7C;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,OACA,oBAAI,KAAK,GAAE,YAAY;AAAA,IACzB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,qBAAqB,SAAiB,aAAsC;AACnF,QAAM,MAAM,gBAAgB,SAAS,SAAS;AAC9C,SAAO,eAAe,OAAO,GAAG,GAAG;AACrC;AAEA,eAAe,WAAW,UAAoC;AAC5D,MAAI;AACF,UAAMC,QAAO,QAAQ;AACrB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ACtMA,SAAS,eAAe;AACxB,OAAOC,WAAU;AA2BjB,gBAAuB,oBAAoB,MAAsD;AAC/F,QAAM,cAAc,MAAM,YAAY,IAAI;AAC1C,aAAW,WAAW,aAAa;AACjC,QAAI,CAAC,QAAQ,YAAY,EAAG;AAC5B,UAAM,cAAcA,MAAK,KAAK,MAAM,QAAQ,IAAI;AAChD,WAAO,YAAY,aAAa,QAAQ,IAAI;AAAA,EAC9C;AACF;AAEA,gBAAgB,YACd,aACA,aACwC;AACxC,QAAM,UAAU,MAAM,YAAY,WAAW;AAC7C,aAAW,SAAS,SAAS;AAC3B,QAAI,MAAM,OAAO,KAAK,MAAM,KAAK,SAAS,QAAQ,GAAG;AACnD,YAAM;AAAA,QACJ,UAAUA,MAAK,KAAK,aAAa,MAAM,IAAI;AAAA,QAC3C;AAAA,QACA,YAAY;AAAA,QACZ,iBAAiB;AAAA,QACjB,SAAS;AAAA,QACT,UAAU;AAAA,MACZ;AACA;AAAA,IACF;AACA,QAAI,MAAM,YAAY,GAAG;AAEvB,YAAM,eAAeA,MAAK,KAAK,aAAa,MAAM,MAAM,WAAW;AACnE,YAAM,kBAAkB,MAAM,YAAY,YAAY;AACtD,iBAAW,OAAO,iBAAiB;AACjC,YAAI,CAAC,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,SAAS,QAAQ,EAAG;AACnD,YAAI,CAAC,IAAI,KAAK,WAAW,QAAQ,EAAG;AACpC,cAAM,UAAU,IAAI,KAAK,MAAM,SAAS,QAAQ,CAAC,SAAS,MAAM;AAChE,cAAM,gBAAgBA,MAAK,KAAK,cAAc,SAAS,OAAO,YAAY;AAC1E,cAAM,aAAa,gBAAgB;AAAA,UACjC,CAAC,MAAM,EAAE,OAAO,KAAK,EAAE,SAAS,SAAS,OAAO;AAAA,QAClD;AACA,cAAM;AAAA,UACJ,UAAUA,MAAK,KAAK,cAAc,IAAI,IAAI;AAAA,UAC1C;AAAA,UACA,YAAY;AAAA,UACZ,iBAAiB,MAAM;AAAA,UACvB;AAAA,UACA,UAAU,aAAa,gBAAgB;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAe,YAAY,KAAkD;AAC3E,MAAI;AACF,WAAO,MAAM,QAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAAA,EACnD,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;;;AP3CA,IAAM,cAAc;AAEpB,eAAsB,cACpB,QACA,MACA,UAA0B,CAAC,GACH;AACxB,QAAM,SAAS,QAAQ;AACvB,QAAM,QAAQ,WAAW,QAAQ,UAAU,CAAC,IAAI,CAAC;AACjD,QAAM,SAAS,YAAY;AAC3B,UAAQ,KAAK,EAAE,UAAU,MAAM,UAAU,KAAK,GAAG,sBAAsB;AAEvE,MAAI;AACF,qBAAiB,QAAQ,oBAAoB,IAAI,GAAG;AAClD,aAAO;AACP,cAAQ;AAAA,QACN;AAAA,UACE,MAAM,KAAK;AAAA,UACX,cAAc,KAAK;AAAA,UACnB,aAAa,KAAK;AAAA,QACpB;AAAA,QACA;AAAA,MACF;AACA,UAAI;AACF,cAAM,KAAK,MAAM,kBAAkB,QAAQ,OAAO,MAAM,MAAM;AAC9D,kBAAU,QAAQ,EAAE;AAAA,MACtB,SAAS,OAAO;AACd,eAAO;AACP,gBAAQ;AAAA,UACN;AAAA,YACE,KAAK;AAAA,YACL,MAAM,KAAK;AAAA,UACb;AAAA,UACA;AAAA,QACF;AACA,cAAM,YAAY,QAAQ,MAAM,UAAU;AAAA,UACxC,MAAM;AAAA,UACN,SAAS,gBAAgB,KAAK;AAAA,UAC9B,SAAS,EAAE,MAAM,KAAK,SAAS;AAAA,QACjC,CAAC;AAAA,MACH;AAAA,IACF;AACA,wBAAoB,MAAM;AAC1B,YAAQ,MAAM,EAAE,UAAU,MAAM,SAAS,GAAG,wCAAwC;AACpF,gBAAY,QAAQ,OAAO,QAAQ,WAAW;AAC9C,YAAQ,KAAK,EAAE,UAAU,MAAM,UAAU,OAAO,GAAG,wBAAwB;AAAA,EAC7E,SAAS,OAAO;AACd,gBAAY,QAAQ,OAAO,QAAQ,QAAQ;AAC3C,YAAQ,MAAM,EAAE,KAAK,OAAO,UAAU,MAAM,UAAU,OAAO,GAAG,qBAAqB;AACrF,UAAM;AAAA,EACR;AAEA,SAAO,EAAE,OAAO,OAAO;AACzB;AAEA,SAAS,oBAAoB,QAAsB;AACjD,SAAO,GAAG,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAcd;AACH;AAkBA,SAAS,kBAA8B;AACrC,SAAO;AAAA,IACL,uBAAuB;AAAA,IACvB,sBAAsB;AAAA,IACtB,aAAa;AAAA,IACb,UAAU;AAAA,IACV,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,WAAW;AAAA,IACX,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AACF;AAEA,SAAS,UAAU,QAAsB,QAA0B;AACjE,SAAO,yBAAyB,OAAO;AACvC,SAAO,wBAAwB,OAAO;AACtC,SAAO,eAAe,OAAO;AAC7B,SAAO,YAAY,OAAO;AAC1B,SAAO,SAAS,OAAO;AACvB,SAAO,UAAU,OAAO;AACxB,SAAO,YAAY,OAAO;AAC1B,SAAO,kBAAkB,OAAO;AAChC,SAAO,cAAc,OAAO;AAC5B,SAAO,gBAAgB,OAAO;AAC9B,SAAO,aAAa,OAAO;AAC3B,SAAO,SAAS,OAAO;AACvB,SAAO,UAAU,OAAO;AAC1B;AAgKA,eAAe,kBACb,QACA,OACA,MACA,QACqB;AACrB,QAAM,SAAS,gBAAgB;AAE/B,QAAM,EAAE,KAAK,YAAY,aAAa,IAAI,MAAM,mBAAmB,QAAQ;AAAA,IACzE,YAAY;AAAA,IACZ,cAAcC,MAAK,QAAQ,KAAK,QAAQ;AAAA,IACxC,UAAU;AAAA,IACV,eAAe,KAAK;AAAA,EACtB,CAAC;AAED,MAAI,cAAc;AAChB,WAAO,uBAAuB;AAC9B,YAAQ;AAAA,MACN,EAAE,MAAM,KAAK,UAAU,gBAAgB,WAAW,eAAe;AAAA,MACjE;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACA,SAAO,wBAAwB;AAC/B,UAAQ;AAAA,IACN,EAAE,MAAM,KAAK,UAAU,gBAAgB,WAAW,eAAe;AAAA,IACjE;AAAA,EACF;AAEA,QAAM,OAAO,MAAMC,UAAS,KAAK,UAAU,MAAM;AACjD,QAAM,WAAW,KAAK,MAAM,IAAI;AAChC,QAAM,QAAQ,SAAS,SAAS,SAAS,CAAC,MAAM,KAAK,SAAS,MAAM,GAAG,EAAE,IAAI;AAE7E,QAAM,OAAO,KAAK,WAAW,MAAM,SAAS,KAAK,QAAQ,IAAI;AAE7D,QAAM,UAAwB;AAAA,IAC5B,YAAY,CAAC;AAAA,IACb,SAAS;AAAA,IACT,QAAQ,CAAC;AAAA,IACT,UAAU,CAAC;AAAA,IACX,QAAQ,CAAC;AAAA,IACT,WAAW,oBAAI,IAAI;AAAA,IACnB,eAAe,CAAC;AAAA,IAChB,aAAa,CAAC;AAAA,IACd,WAAW,CAAC;AAAA,IACZ,OAAO,CAAC;AAAA,IACR,YAAY,CAAC;AAAA,IACb,iBAAiB,oBAAI,IAAI;AAAA,IACzB,SAAS,qBAAqB;AAAA,EAChC;AAEA,MAAI,aAA4B;AAChC,MAAI,YAA2B;AAC/B,MAAI,iBAAiB;AACrB,MAAI,iBAAgC;AACpC,MAAI,eAA8B;AAClC,MAAI,aAA4B;AAChC,MAAI,gBAA+B;AAEnC,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,OAAO,MAAM,CAAC;AACpB,QAAI,CAAC,QAAQ,KAAK,WAAW,EAAG;AAChC,UAAM,SAAS,IAAI;AACnB,UAAM,UAAU;AAEhB,UAAM,YAAY,OAAO,KAAK,MAAM,MAAM;AAC1C,UAAM,cAAc,WAAW,QAAQ,SAAS,WAAW;AAAA,MACzD,UAAU;AAAA,MACV,UAAU;AAAA,IACZ,CAAC;AAED,QAAI,SAA8B;AAClC,QAAI,eAA4C;AAChD,QAAI;AACF,eAAS,KAAK,MAAM,IAAI;AAAA,IAC1B,QAAQ;AACN,qBAAe;AAAA,IACjB;AAKA,UAAM,kBAAmC;AAEzC,UAAM,WAAW,QAAQ,QAAQ;AACjC,UAAMC,eAAc,YAAgB,WAAW,gBAAgB,SAAS,WAAW;AAEnF,YAAQ,WAAW,KAAK;AAAA,MACtB,eAAeA;AAAA,MACf,gBAAgB,WAAW;AAAA,MAC3B;AAAA,MACA,SAAS;AAAA,MACT,WAAW;AAAA,MACX,eAAe;AAAA,MACf,wBAAwB;AAAA,MACxB,eAAe;AAAA,MACf,YAAY,iBAAiB,OAAO,SAAS;AAAA,MAC7C,iBAAiB,MAAM;AAAA,IACzB,CAAC;AAED,QAAI,CAAC,OAAQ;AAEb,UAAM,KAAK,OAAO,OAAO,cAAc,WAAW,OAAO,YAAY;AACrE,QAAI,IAAI;AACN,UAAI,CAAC,kBAAkB,KAAK,eAAgB,kBAAiB;AAC7D,UAAI,CAAC,gBAAgB,KAAK,aAAc,gBAAe;AAAA,IACzD;AACA,QAAI,CAAC,cAAc,OAAO,OAAO,QAAQ,SAAU,cAAa,OAAO;AACvE,QAAI,CAAC,iBAAiB,OAAO,OAAO,cAAc,SAAU,iBAAgB,OAAO;AAGnF,QAAI,CAAC,QAAQ,WAAW,OAAO,OAAO,cAAc,UAAU;AAC5D,cAAQ,UAAU,6BAA6B,MAAM,QAAQ,MAAM,IAAIA,YAAW;AAClF,UAAI,KAAK,cAAc,KAAK,iBAAiB;AAC3C,cAAM,YAAY,UAAc,UAAU,KAAK,eAAe;AAC9D,gBAAQ,MAAM,KAAK;AAAA,UACjB,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,QAAQ,QAAQ,QAAQ;AAAA,UACxB,WAAW;AAAA,UACX,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,eAAeA;AAAA,QACjB,CAAC;AACD,gBAAQ,QAAQ,4BAA4B;AAAA,MAC9C;AAAA,IACF;AAEA,UAAMC,aACJ,QAAQ,SAAS,cACjB,UAAc,UAAU,WAAWH,MAAK,SAAS,KAAK,QAAQ,CAAC,EAAE;AAEnE,UAAM,OAAO,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO;AAE7D,QAAI,SAAS,UAAU,SAAS,aAAa;AAC3C,YAAM,UAAkC,SAAS,SAAS,SAAS;AACnE,YAAM,OAAO,qBAAqB,QAAQ,OAAO;AACjD,YAAM,aAAa;AACnB,YAAMI,aAAY;AAAA,QAChBD;AAAA,QACA;AAAA,QACA,OAAO,SAAS,MAAM,OAAO,QAAQ;AAAA,MACvC;AACA,YAAME,WAAU,QAAYF,YAAW,SAAS,SAAS;AAEzD,cAAQ,OAAO,KAAK;AAAA,QAClB,UAAUE;AAAA,QACV;AAAA,QACA,iBAAiB,OAAO,QAAQ;AAAA,QAChC,YAAY;AAAA,QACZ,aAAa;AAAA,QACb,SAAS;AAAA,QACT,WAAW;AAAA,QACX,OAAO;AAAA,QACP,mBAAmB;AAAA,QACnB,eAAeH;AAAA,QACf,YAAY;AAAA,MACd,CAAC;AAED,YAAM,QAAQ,OAAO,SAAS,SAAS;AACvC,UAAI,YAAY,eAAe,OAAO;AACpC,YAAI,CAAC,WAAY,cAAa;AAC9B,oBAAY;AAAA,MACd;AAEA,cAAQ,SAAS,KAAK;AAAA,QACpB,YAAYE;AAAA,QACZ,UAAUC;AAAA,QACV,mBAAmB,OAAO,SAAS,MAAM;AAAA,QACzC;AAAA,QACA,OAAO,YAAY,cAAc,QAAQ;AAAA,QACzC,WAAW;AAAA,QACX,SAAS;AAAA,QACT,aAAa,OAAO,cAAc;AAAA,QAClC,MAAM,OAAO,QAAQ;AAAA,QACrB,eAAeH;AAAA,MACjB,CAAC;AACD,UAAI,OAAO,KAAM,SAAQ,gBAAgB,IAAI,OAAO,MAAME,UAAS;AAEnE,YAAM,UAAU,OAAO,SAAS;AAChC,UAAI,OAAO,YAAY,UAAU;AAC/B,gBAAQ,OAAO,KAAK;AAAA,UAClB,UAAU,QAAQA,YAAW,CAAC;AAAA,UAC9B,YAAYA;AAAA,UACZ,UAAU;AAAA,UACV,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,gBAAgB;AAAA,UAChB,aAAa,QAAQ,MAAM,GAAG,WAAW;AAAA,UACzC,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,eAAeF;AAAA,QACjB,CAAC;AACD,YAAI,QAAQ,SAAS,aAAa;AAEhC,gBAAM,SAAS,UAAU,QAAQ,SAAS,OAAO;AACjD,gBAAM,OAAO,QAAQ,OAAO,QAAQ,OAAO,SAAS,CAAC;AACrD,cAAI,KAAM,MAAK,iBAAiB;AAAA,QAClC;AAAA,MACF,WAAW,MAAM,QAAQ,OAAO,GAAG;AACjC,iBAAS,KAAK,GAAG,KAAK,QAAQ,QAAQ,MAAM;AAC1C,gBAAM,QAAQ,QAAQ,EAAE;AACxB,cAAI,CAAC,MAAO;AACZ,gBAAM;AAAA,YACJ;AAAA,YACAC;AAAA,YACAC;AAAA,YACAC;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACAH;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA;AAAA,IACF;AAEA,QAAI,SAAS,UAAU;AAGrB,cAAQ,OAAO,KAAK;AAAA,QAClB,UAAU,QAAYC,YAAW,SAAS,oBAAoB;AAAA,QAC9D;AAAA,QACA,iBAAiB,OAAO,QAAQ;AAAA,QAChC,YAAY;AAAA,QACZ,aAAa;AAAA,QACb,SAAS,OAAO,WAAW;AAAA,QAC3B,WAAW;AAAA,QACX,OAAO;AAAA,QACP,mBAAmB;AAAA,QACnB,eAAeD;AAAA,QACf,YAAY;AAAA,MACd,CAAC;AACD;AAAA,IACF;AAEA,QAAI,SAAS,YAAY;AACvB,YAAM,eACJ,OAAO,OAAO,MAAM,SAAS,WAAY,OAAO,KAAK,OAAkB;AACzE,cAAQ,OAAO,KAAK;AAAA,QAClB,UAAU,QAAYC,YAAW,SAAS,YAAY,gBAAgB,SAAS,EAAE;AAAA,QACjF;AAAA,QACA,iBAAiB,OAAO,QAAQ;AAAA,QAChC,YAAY;AAAA,QACZ,aAAa;AAAA,QACb,SAAS;AAAA,QACT,WAAW;AAAA,QACX,OAAO;AAAA,QACP,mBAAmB;AAAA,QACnB,eAAeD;AAAA,QACf,YAAY;AAAA,MACd,CAAC;AACD;AAAA,IACF;AAEA,QAAI,SAAS,cAAc;AACzB,cAAQ,OAAO,KAAK;AAAA,QAClB,UAAU,QAAYC,YAAW,SAAS,YAAY;AAAA,QACtD;AAAA,QACA,iBAAiB,OAAO,QAAQ;AAAA,QAChC,YAAY;AAAA,QACZ,aAAa;AAAA,QACb,SAAS,OAAO,YAAY,QAAQ;AAAA,QACpC,WAAW;AAAA,QACX,OAAO;AAAA,QACP,mBAAmB;AAAA,QACnB,eAAeD;AAAA,QACf,YAAY;AAAA,MACd,CAAC;AACD;AAAA,IACF;AAEA,QAAI,SAAS,yBAAyB;AACpC,cAAQ,OAAO,KAAK;AAAA,QAClB,UAAU,QAAYC,YAAW,SAAS,uBAAuB;AAAA,QACjE;AAAA,QACA,iBAAiB,OAAO,QAAQ;AAAA,QAChC,YAAY;AAAA,QACZ,aAAa;AAAA,QACb,SAAS,OAAO,mBAAmB,WAAW;AAAA,QAC9C,WAAW;AAAA,QACX,OAAO;AAAA,QACP,mBAAmB;AAAA,QACnB,eAAeD;AAAA,QACf,YAAY;AAAA,MACd,CAAC;AACD,cAAQ,UAAU,KAAK;AAAA,QACrB,aAAa;AAAA,UACXC;AAAA,UACA;AAAA,UACA,YAAY,OAAO,UAAU,aAAa,OAAO;AAAA,QACnD;AAAA,QACA,MAAM;AAAA,QACN,MAAM;AAAA,QACN,cAAc;AAAA,QACd,WAAW;AAAA,QACX,gBAAgB;AAAA,QAChB,WAAW;AAAA,QACX,YAAY,KAAK;AAAA,QACjB,YAAY;AAAA,QACZ,eAAeD;AAAA,MACjB,CAAC;AACD;AAAA,IACF;AAIA,YAAQ,OAAO,KAAK;AAAA,MAClB,UAAU,QAAYC,YAAW,SAAS,UAAU,QAAQ,SAAS,EAAE;AAAA,MACvE;AAAA,MACA,iBAAiB,OAAO,QAAQ;AAAA,MAChC,YAAY;AAAA,MACZ,aAAa,QAAQ;AAAA,MACrB,SAAS;AAAA,MACT,WAAW;AAAA,MACX,OAAO;AAAA,MACP,mBAAmB;AAAA,MACnB,eAAeD;AAAA,MACf,YAAY;AAAA,IACd,CAAC;AAAA,EACH;AAGA,aAAW,KAAK,QAAQ,UAAU;AAChC,QAAI,EAAE,eAAe,QAAQ,gBAAgB,IAAI,EAAE,WAAW,GAAG;AAC/D,YAAM,WAAW,QAAQ,gBAAgB,IAAI,EAAE,WAAW;AAC1D,cAAQ,MAAM,KAAK;AAAA,QACjB,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,QAAQ,EAAE;AAAA,QACV,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,eAAe,EAAE;AAAA,MACnB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,QAAQ,SAAS;AACnB,YAAQ,QAAQ,aAAa;AAC7B,YAAQ,QAAQ,WAAW;AAC3B,YAAQ,QAAQ,gBAAgB;AAChC,YAAQ,QAAQ,uBAAuB;AAAA,EACzC;AAEA,kBAAgB,OAAO;AAKvB,QAAM,oBAAoB,QAAQ,QAAQ,OAAO;AAEjD,gBAAc,OAAO,IAAI,MAAM;AAC7B,iBAAa,QAAQ,SAAS,EAAE,YAAY,UAAU,CAAC;AAAA,EACzD,CAAC;AAED,SAAO,cAAc,QAAQ,WAAW;AACxC,SAAO,WAAW,QAAQ,UAAU,IAAI;AACxC,SAAO,SAAS,QAAQ,OAAO;AAC/B,SAAO,WAAW,QAAQ,SAAS;AACnC,SAAO,iBAAiB,QAAQ,OAAO;AACvC,SAAO,aAAa,QAAQ,cAAc;AAC1C,SAAO,eAAe,QAAQ,YAAY;AAC1C,SAAO,YAAY,QAAQ,UAAU;AACrC,SAAO,QAAQ,QAAQ,MAAM;AAC7B,UAAQ;AAAA,IACN,EAAE,MAAM,KAAK,UAAU,gBAAgB,WAAW,gBAAgB,OAAO;AAAA,IACzE;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,6BACP,MACA,QACA,MACA,IACAA,cACgB;AAChB,QAAM,YAAY,OAAO;AAGzB,QAAM,YAAY,KAAK,cAAc,KAAK,UAAU,GAAG,SAAS,IAAI,KAAK,OAAO,KAAK;AACrF,SAAO;AAAA,IACL,YAAY,UAAc,UAAU,SAAS;AAAA,IAC7C,mBAAmB;AAAA,IACnB,aAAa,KAAK,aAAa,IAAI;AAAA,IACnC,YAAY,MAAM,aAAa;AAAA,IAC/B,gBAAgB,OAAO,aAAa;AAAA,IACpC,OAAO,MAAM,eAAe;AAAA,IAC5B,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,aAAa,OAAO,OAAO;AAAA,IAC3B,oBAAoB,OAAO,aAAa;AAAA,IACxC,eAAeA;AAAA,IACf,2BAA2B;AAAA,EAC7B;AACF;AAEA,eAAe,SAAS,UAAsD;AAC5E,MAAI;AACF,UAAM,OAAO,MAAMD,UAAS,UAAU,MAAM;AAC5C,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,qBACP,QACA,UACwB;AAIxB,MAAI,aAAa,OAAQ,QAAO;AAChC,QAAM,IAAI,OAAO,SAAS;AAC1B,MAAI,CAAC,MAAM,QAAQ,CAAC,KAAK,EAAE,WAAW,EAAG,QAAO;AAChD,QAAM,gBAAgB,EAAE;AAAA,IACtB,CAAC,MAAM,KAAK,OAAO,MAAM,YAAa,EAAwB,SAAS;AAAA,EACzE;AACA,SAAO,gBAAgB,SAAS;AAClC;AAEA,eAAe,oBACb,QACAE,YACAC,YACAC,UACA,cACA,OACA,IACAH,cACA,SACe;AACf,QAAM,QAAQ,QAAQE,YAAW,YAAY;AAE7C,MAAI,MAAM,SAAS,QAAQ;AACzB,UAAM,OAAQ,MAA4B,QAAQ;AAClD,YAAQ,OAAO,KAAK;AAAA,MAClB,UAAU;AAAA,MACV,YAAYA;AAAA,MACZ,UAAU;AAAA,MACV,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,gBAAgB,KAAK,SAAS,cAAc,UAAU,QAAQ,SAAS,IAAI,IAAI;AAAA,MAC/E,aAAa,KAAK,MAAM,GAAG,WAAW;AAAA,MACtC,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,eAAeF;AAAA,IACjB,CAAC;AACD;AAAA,EACF;AAEA,MAAI,MAAM,SAAS,YAAY;AAC7B,UAAM,OAAQ,MAAgC,YAAY;AAC1D,YAAQ,OAAO,KAAK;AAAA,MAClB,UAAU;AAAA,MACV,YAAYE;AAAA,MACZ,UAAU;AAAA,MACV,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,gBAAgB,KAAK,SAAS,cAAc,UAAU,QAAQ,SAAS,IAAI,IAAI;AAAA,MAC/E,aAAa,KAAK,MAAM,GAAG,WAAW;AAAA,MACtC,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,eAAeF;AAAA,IACjB,CAAC;AACD;AAAA,EACF;AAEA,MAAI,MAAM,SAAS,YAAY;AAC7B,UAAM,KAAK;AACX,UAAM,eAAe,GAAG,MAAM,GAAG,YAAY;AAC7C,UAAM,WAAW,GAAG,QAAQ;AAC5B,UAAM,SAAS,GAAG,SAAS,OAAO,UAAU,QAAQ,SAAS,GAAG,KAAK,IAAI;AACzE,UAAM,UAAU,qBAAqB,UAAU,GAAG,KAAK;AACvD,UAAM,WAAW,kBAAkB,GAAG,KAAK;AAC3C,UAAM,OAAO,WAAeC,YAAW,YAAY;AAEnD,YAAQ,OAAO,KAAK;AAAA,MAClB,UAAU;AAAA,MACV,YAAYC;AAAA,MACZ,UAAU;AAAA,MACV,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,eAAeF;AAAA,IACjB,CAAC;AAED,UAAM,OAAwB;AAAA,MAC5B,cAAc;AAAA,MACd,YAAYE;AAAA,MACZ,UAAUC;AAAA,MACV,gBAAgB;AAAA,MAChB,WAAW;AAAA,MACX,qBAAqB,kBAAkB,QAAQ;AAAA,MAC/C,gBAAgB;AAAA,MAChB;AAAA,MACA,KAAK;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP,iBAAiB;AAAA,MACjB,QAAQ;AAAA,MACR,eAAeH;AAAA,IACjB;AACA,YAAQ,UAAU,IAAI,cAAc,IAAI;AACxC,YAAQ,cAAc,KAAK,IAAI;AAC/B;AAAA,EACF;AAEA,MAAI,MAAM,SAAS,eAAe;AAChC,UAAM,KAAK;AACX,UAAM,eAAe,GAAG,eAAe;AACvC,UAAM,UAAU,GAAG,aAAa,OAAO,IAAI;AAC3C,UAAM,OAAO,gBAAgB,GAAG,OAAO,KAAK;AAC5C,UAAM,aAAa,KAAK,SAAS,cAAc,UAAU,QAAQ,SAAS,IAAI,IAAI;AAClF,YAAQ,OAAO,KAAK;AAAA,MAClB,UAAU;AAAA,MACV,YAAYE;AAAA,MACZ,UAAU;AAAA,MACV,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,aAAa,KAAK,MAAM,GAAG,WAAW;AAAA,MACtC,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,eAAeF;AAAA,IACjB,CAAC;AAED,UAAM,UAAU,eAAe,QAAQ,UAAU,IAAI,YAAY,IAAI;AACrE,YAAQ,YAAY,KAAK;AAAA,MACvB,gBAAgB,aAAiBC,YAAW,gBAAgB,GAAGC,UAAS,IAAI,YAAY,EAAE;AAAA,MAC1F,cAAc,SAAS,gBAAgB;AAAA,MACvC,gBAAgB;AAAA,MAChB,YAAYA;AAAA,MACZ,UAAUC;AAAA,MACV,QAAQ,UAAW,UAAU,UAAU,YAAa;AAAA,MACpD,UAAU;AAAA,MACV,WAAW;AAAA,MACX,aAAa;AAAA,MACb,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,SAAS,KAAK,MAAM,GAAG,WAAW;AAAA,MAClC,eAAeH;AAAA,IACjB,CAAC;AACD,QAAI,SAAS;AACX,cAAQ,SAAS,UAAU,UAAU;AAAA,IACvC;AACA;AAAA,EACF;AAEA,MAAI,MAAM,SAAS,SAAS;AAC1B,YAAQ,OAAO,KAAK;AAAA,MAClB,UAAU;AAAA,MACV,YAAYE;AAAA,MACZ,UAAU;AAAA,MACV,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,eAAeF;AAAA,IACjB,CAAC;AACD;AAAA,EACF;AAGA,UAAQ,OAAO,KAAK;AAAA,IAClB,UAAU;AAAA,IACV,YAAYE;AAAA,IACZ,UAAU;AAAA,IACV,SAAS;AAAA,IACT,YAAa,MAA4B,QAAQ;AAAA,IACjD,gBAAgB;AAAA,IAChB,aAAa,gBAAgB,KAAK,GAAG,MAAM,GAAG,WAAW,KAAK;AAAA,IAC9D,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,eAAeF;AAAA,EACjB,CAAC;AACH;AAEA,SAAS,kBAAkB,UAA0B;AACnD,QAAM,QAAQ,SAAS,YAAY;AACnC,MAAI,MAAM,WAAW,OAAO,EAAG,QAAO;AACtC,MAAI,UAAU,UAAU,UAAU,WAAW,UAAU,mBAAoB,QAAO;AAClF,MAAI,UAAU,UAAU,UAAU,cAAc,UAAU,YAAa,QAAO;AAC9E,MAAI,UAAU,WAAW,UAAU,eAAe,UAAU,aAAc,QAAO;AACjF,MACE,UAAU,UACV,UAAU,gBACV,UAAU,iBACV,UAAU,aACV,UAAU,kBACV;AACA,WAAO;AAAA,EACT;AACA,MAAI,UAAU,UAAU,UAAU,UAAU,UAAU,mBAAoB,QAAO;AACjF,MAAI,UAAU,eAAe,UAAU,oBAAqB,QAAO;AACnE,MAAI,UAAU,WAAY,QAAO;AACjC,MAAI,UAAU,QAAS,QAAO;AAC9B,MAAI,UAAU,gBAAgB,UAAU,cAAe,QAAO;AAC9D,SAAO;AACT;AAEA,SAAS,qBAAqB,UAAkB,MAA8B;AAC5E,MAAI,CAAC,QAAQ,OAAO,SAAS,SAAU,QAAO;AAC9C,QAAM,MAAM;AACZ,MAAI,OAAO,IAAI,YAAY,SAAU,QAAO,IAAI;AAChD,MAAI,SAAS,YAAY,MAAM,UAAU,OAAO,IAAI,QAAQ,SAAU,QAAO,IAAI;AACjF,SAAO;AACT;AAEA,SAAS,kBAAkB,MAA8B;AACvD,MAAI,CAAC,QAAQ,OAAO,SAAS,SAAU,QAAO;AAC9C,QAAM,MAAM;AACZ,MAAI,OAAO,IAAI,cAAc,SAAU,QAAO,IAAI;AAClD,MAAI,OAAO,IAAI,SAAS,SAAU,QAAO,IAAI;AAC7C,MAAI,OAAO,IAAI,kBAAkB,SAAU,QAAO,IAAI;AACtD,SAAO;AACT;AAEA,SAAS,gBAAgB,OAA+B;AACtD,MAAI,SAAS,KAAM,QAAO;AAC1B,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,MAAI;AACF,WAAO,KAAK,UAAU,KAAK;AAAA,EAC7B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,gBAAgB,SAA6B;AACpD,QAAMC,aAAY,QAAQ,SAAS,cAAc;AACjD,MAAI,CAACA,WAAW;AAEhB,QAAM,cAAc,oBAAI,IAA4B;AACpD,aAAW,KAAK,QAAQ,QAAQ;AAC9B,QAAI,CAAC,EAAE,WAAY;AACnB,QAAI,CAAC,EAAE,YAAa;AACpB,QAAI,EAAE,eAAe,UAAU,EAAE,eAAe,cAAc,EAAE,eAAe;AAC7E;AACF,UAAM,OAAO,YAAY,IAAI,EAAE,UAAU,KAAK,CAAC;AAC/C,SAAK,KAAK,CAAC;AACX,gBAAY,IAAI,EAAE,YAAY,IAAI;AAAA,EACpC;AAEA,aAAW,KAAK,QAAQ,UAAU;AAChC,UAAM,OAAO,YAAY,IAAI,EAAE,UAAU,KAAK,CAAC;AAC/C,UAAM,OAAO,KACV,OAAO,CAAC,MAAM,EAAE,eAAe,UAAU,EACzC,IAAI,CAAC,MAAM,EAAE,eAAe,EAAE,EAC9B,KAAK,IAAI,EACT,KAAK;AACR,QAAI,CAAC,KAAM;AACX,YAAQ,WAAW,KAAK;AAAA,MACtB,QAAQ,OAAO,EAAE,UAAU;AAAA,MAC3B,aAAa;AAAA,MACb,WAAW,EAAE;AAAA,MACb,WAAW,EAAE;AAAA,MACb,MAAM,EAAE;AAAA,MACR,WAAW;AAAA,MACX,qBAAqB;AAAA,MACrB,YACE,EAAE,SAAS,SAAS,gBAAgB,EAAE,SAAS,SAAS,gBAAgB;AAAA,MAC1E;AAAA,IACF,CAAC;AAAA,EACH;AAEA,aAAW,KAAK,QAAQ,eAAe;AACrC,QAAI,EAAE,SAAS;AACb,cAAQ,WAAW,KAAK;AAAA,QACtB,QAAQ,UAAU,EAAE,YAAY;AAAA,QAChC,aAAa;AAAA,QACb,WAAW,EAAE;AAAA,QACb,WAAW,EAAE;AAAA,QACb,MAAM;AAAA,QACN,WAAW,EAAE;AAAA,QACb,qBAAqB,EAAE;AAAA,QACvB,YAAY;AAAA,QACZ,MAAM,EAAE;AAAA,MACV,CAAC;AAAA,IACH;AACA,QAAI,EAAE,MAAM;AACV,cAAQ,WAAW,KAAK;AAAA,QACtB,QAAQ,WAAW,EAAE,YAAY;AAAA,QACjC,aAAa;AAAA,QACb,WAAW,EAAE;AAAA,QACb,WAAW,EAAE;AAAA,QACb,MAAM;AAAA,QACN,WAAW,EAAE;AAAA,QACb,qBAAqB,EAAE;AAAA,QACvB,YAAY;AAAA,QACZ,MAAM,EAAE;AAAA,MACV,CAAC;AAAA,IACH;AAAA,EACF;AAEA,aAAW,KAAK,QAAQ,aAAa;AACnC,QAAI,CAAC,EAAE,QAAS;AAChB,YAAQ,WAAW,KAAK;AAAA,MACtB,QAAQ,cAAc,EAAE,cAAc;AAAA,MACtC,aAAa;AAAA,MACb,WAAW,EAAE;AAAA,MACb,WAAW;AAAA,MACX,MAAM;AAAA,MACN,WAAW;AAAA,MACX,qBAAqB;AAAA,MACrB,YAAY,EAAE,WAAW,UAAU;AAAA,MACnC,MAAM,EAAE;AAAA,IACV,CAAC;AAAA,EACH;AACF;AAEA,SAAS,aACP,QACA,SACA,MACM;AACN,MAAI,CAAC,QAAQ,QAAS;AAEtB,QAAM,YAAY;AAAA,IAChB,OAAO;AAAA,IACP;AAAA;AAAA;AAAA;AAAA;AAAA,EAKF;AACA,aAAW,KAAK,QAAQ,YAAY;AAClC,cAAU;AAAA,MACR,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,EACF;AAEA;AAAA,IACE,OAAO;AAAA,IACP;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMF,EAAE;AAAA,IACA,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,IAChB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,QAAQ,QAAQ;AAAA,EAClB;AAEA,QAAM,cAAc;AAAA,IAClB,OAAO;AAAA,IACP;AAAA;AAAA;AAAA;AAAA;AAAA,EAKF;AACA,aAAW,KAAK,QAAQ,QAAQ;AAC9B,gBAAY;AAAA,MACV,EAAE;AAAA,MACF,QAAQ,QAAQ;AAAA,MAChB,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,gBAAgB;AAAA,IACpB,OAAO;AAAA,IACP;AAAA;AAAA;AAAA;AAAA;AAAA,EAKF;AACA,aAAW,KAAK,QAAQ,UAAU;AAChC,kBAAc;AAAA,MACZ,EAAE;AAAA,MACF,QAAQ,QAAQ;AAAA,MAChB,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,cAAc;AAAA,IAClB,OAAO;AAAA,IACP;AAAA;AAAA;AAAA;AAAA;AAAA,EAKF;AACA,aAAW,KAAK,QAAQ,QAAQ;AAC9B,gBAAY;AAAA,MACV,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,QAAQ,QAAQ;AAAA,MAChB,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,iBAAiB;AAAA,IACrB,OAAO;AAAA,IACP;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMF;AACA,aAAW,KAAK,QAAQ,eAAe;AACrC,mBAAe;AAAA,MACb,EAAE;AAAA,MACF,QAAQ,QAAQ;AAAA,MAChB,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,mBAAmB;AAAA,IACvB,OAAO;AAAA,IACP;AAAA;AAAA;AAAA;AAAA;AAAA,EAKF;AACA,aAAW,KAAK,QAAQ,aAAa;AACnC,qBAAiB;AAAA,MACf,EAAE;AAAA,MACF,EAAE;AAAA,MACF,QAAQ,QAAQ;AAAA,MAChB,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,iBAAiB;AAAA,IACrB,OAAO;AAAA,IACP;AAAA;AAAA;AAAA;AAAA;AAAA,EAKF;AACA,aAAW,KAAK,QAAQ,WAAW;AACjC,mBAAe;AAAA,MACb,EAAE;AAAA,MACF,QAAQ,QAAQ;AAAA,MAChB,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,aAAa;AAAA,IACjB,OAAO;AAAA,IACP;AAAA;AAAA;AAAA;AAAA,EAIF;AACA,aAAW,KAAK,QAAQ,OAAO;AAC7B,eAAW;AAAA,MACT,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,eAAe;AAAA,IACnB,OAAO;AAAA,IACP;AAAA;AAAA;AAAA;AAAA,EAIF;AACA,aAAW,KAAK,QAAQ,YAAY;AAClC,iBAAa;AAAA,MACX,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,QAAQ,QAAQ;AAAA,MAChB,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,EACF;AACF;;;AQ9wCA,SAAS,YAAAG,iBAAgB;AACzB,OAAOC,YAAU;AAWjB;AAYA;;;ACxBA,SAAS,WAAAC,gBAAe;AACxB,OAAOC,WAAU;AAQjB,gBAAuB,sBAAsB,MAAkD;AAC7F,SAAO,KAAK,IAAI;AAClB;AAEA,gBAAgB,KAAK,KAAiD;AACpE,MAAI;AACJ,MAAI;AACF,cAAU,MAAMD,SAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAAA,EACtD,QAAQ;AACN;AAAA,EACF;AAEA,aAAW,SAAS,SAAS;AAC3B,UAAM,OAAOC,MAAK,KAAK,KAAK,MAAM,IAAI;AACtC,QAAI,MAAM,YAAY,GAAG;AACvB,aAAO,KAAK,IAAI;AAAA,IAClB,WAAW,MAAM,OAAO,KAAK,MAAM,KAAK,SAAS,QAAQ,GAAG;AAC1D,YAAM;AAAA,IACR;AAAA,EACF;AACF;;;ADqBA,IAAMC,eAAc;AAEpB,eAAsB,aACpB,QACA,MACA,UAA0B,CAAC,GACH;AACxB,QAAM,SAAS,QAAQ;AACvB,QAAM,QAAQ,WAAW,QAAQ,SAAS,CAAC,IAAI,CAAC;AAChD,QAAM,SAAS,YAAY;AAC3B,UAAQ,KAAK,EAAE,UAAU,MAAM,UAAU,KAAK,GAAG,qBAAqB;AAEtE,MAAI;AACF,qBAAiB,YAAY,sBAAsB,IAAI,GAAG;AACxD,aAAO;AACP,cAAQ,MAAM,EAAE,MAAM,SAAS,GAAG,8BAA8B;AAChE,UAAI;AACF,cAAM,aAAa,MAAM,iBAAiB,QAAQ,OAAO,UAAU,MAAM;AACzE,QAAAC,WAAU,QAAQ,UAAU;AAAA,MAC9B,SAAS,OAAO;AACd,eAAO;AACP,gBAAQ;AAAA,UACN;AAAA,YACE,KAAK;AAAA,YACL,MAAM;AAAA,UACR;AAAA,UACA;AAAA,QACF;AACA,cAAM,YAAY,QAAQ,MAAM,UAAU;AAAA,UACxC,MAAM;AAAA,UACN,SAAS,gBAAgB,KAAK;AAAA,UAC9B,SAAS,EAAE,MAAM,SAAS;AAAA,QAC5B,CAAC;AAAA,MACH;AAAA,IACF;AACA,IAAAC,qBAAoB,MAAM;AAC1B,YAAQ,MAAM,EAAE,UAAU,MAAM,SAAS,GAAG,uCAAuC;AACnF,gBAAY,QAAQ,OAAO,QAAQ,WAAW;AAC9C,YAAQ,KAAK,EAAE,UAAU,MAAM,UAAU,OAAO,GAAG,uBAAuB;AAAA,EAC5E,SAAS,OAAO;AACd,gBAAY,QAAQ,OAAO,QAAQ,QAAQ;AAC3C,YAAQ,MAAM,EAAE,KAAK,OAAO,UAAU,MAAM,UAAU,OAAO,GAAG,oBAAoB;AACpF,UAAM;AAAA,EACR;AAEA,SAAO,EAAE,OAAO,OAAO;AACzB;AASA,SAASA,qBAAoB,QAAsB;AACjD,SAAO,GAAG,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAad;AACH;AAkBA,SAASC,mBAA8B;AACrC,SAAO;AAAA,IACL,uBAAuB;AAAA,IACvB,sBAAsB;AAAA,IACtB,aAAa;AAAA,IACb,UAAU;AAAA,IACV,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,WAAW;AAAA,IACX,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AACF;AAEA,SAASF,WAAU,QAAsB,QAA0B;AACjE,SAAO,yBAAyB,OAAO;AACvC,SAAO,wBAAwB,OAAO;AACtC,SAAO,eAAe,OAAO;AAC7B,SAAO,YAAY,OAAO;AAC1B,SAAO,SAAS,OAAO;AACvB,SAAO,UAAU,OAAO;AACxB,SAAO,YAAY,OAAO;AAC1B,SAAO,kBAAkB,OAAO;AAChC,SAAO,cAAc,OAAO;AAC5B,SAAO,gBAAgB,OAAO;AAC9B,SAAO,aAAa,OAAO;AAC3B,SAAO,SAAS,OAAO;AACvB,SAAO,UAAU,OAAO;AAC1B;AA4JA,eAAe,iBACb,QACA,OACA,UACA,QACqB;AACrB,QAAM,SAASE,iBAAgB;AAE/B,QAAM,EAAE,KAAK,eAAe,aAAa,IAAI,MAAM,mBAAmB,QAAQ;AAAA,IAC5E,YAAY;AAAA,IACZ,cAAcC,OAAK,QAAQ,QAAQ;AAAA,IACnC,UAAU;AAAA,EACZ,CAAC;AAED,MAAI,cAAc;AAEhB,WAAO,uBAAuB;AAC9B,YAAQ;AAAA,MACN,EAAE,MAAM,UAAU,gBAAgB,cAAc,eAAe;AAAA,MAC/D;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,SAAO,wBAAwB;AAC/B,UAAQ;AAAA,IACN,EAAE,MAAM,UAAU,gBAAgB,cAAc,eAAe;AAAA,IAC/D;AAAA,EACF;AAEA,QAAM,OAAO,MAAMC,UAAS,UAAU,MAAM;AAC5C,QAAM,WAAW,KAAK,MAAM,IAAI;AAChC,QAAM,QAAQ,SAAS,SAAS,SAAS,CAAC,MAAM,KAAK,SAAS,MAAM,GAAG,EAAE,IAAI;AAE7E,QAAM,UAAU;AAAA,IACd,YAAY,CAAC;AAAA,IACb,SAAS;AAAA,IACT,OAAO,CAAC;AAAA,IACR,QAAQ,CAAC;AAAA,IACT,UAAU,CAAC;AAAA,IACX,QAAQ,CAAC;AAAA,IACT,WAAW,oBAAI,IAA6B;AAAA;AAAA,IAC5C,eAAe,CAAC;AAAA,IAChB,aAAa,CAAC;AAAA,IACd,WAAW,CAAC;AAAA,IACZ,OAAO,CAAC;AAAA,IACR,YAAY,CAAC;AAAA,IACb,SAAS,qBAAqB;AAAA,EAChC;AAEA,MAAI,iBAAgC;AACpC,MAAI,eAA8B;AAClC,MAAI,aAA4B;AAChC,MAAI,YAA2B;AAC/B,MAAI,iBAAiB;AACrB,MAAI,cAAc;AAElB,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,OAAO,MAAM,CAAC;AACpB,QAAI,CAAC,QAAQ,KAAK,WAAW,EAAG;AAChC,UAAM,SAAS,IAAI;AACnB,UAAM,UAAU;AAEhB,UAAM,YAAY,OAAO,KAAK,MAAM,MAAM;AAC1C,UAAM,cAAc,WAAW,QAAQ,SAAS,WAAW;AAAA,MACzD,UAAU;AAAA,MACV,UAAU;AAAA,IACZ,CAAC;AAED,QAAI,SAA+B;AACnC,QAAI,eAA4C;AAChD,QAAI;AACF,eAAS,KAAK,MAAM,IAAI;AAAA,IAC1B,QAAQ;AACN,qBAAe;AAAA,IACjB;AAKA,UAAM,kBAAmC;AAEzC,UAAM,WAAW,SAAS,gBAAgB,MAAM,IAAI;AAEpD,UAAMC,eAAc,YAAgB,cAAc,gBAAgB,SAAS,WAAW;AAEtF,YAAQ,WAAW,KAAK;AAAA,MACtB,eAAeA;AAAA,MACf,gBAAgB,cAAc;AAAA,MAC9B,aAAa;AAAA,MACb,aAAa;AAAA,MACb;AAAA,MACA,SAAS;AAAA,MACT,cAAc;AAAA,MACd,WAAW;AAAA,MACX,eAAe;AAAA,MACf,wBAAwB;AAAA,MACxB,eAAe;AAAA,MACf,YAAY,iBAAiB,OAAO,SAAS;AAAA,MAC7C,iBAAiB,MAAM;AAAA,IACzB,CAAC;AAED,QAAI,CAAC,OAAQ;AAEb,UAAM,KAAK,OAAO,OAAO,cAAc,WAAW,OAAO,YAAY;AACrE,QAAI,IAAI;AACN,UAAI,CAAC,kBAAkB,KAAK,eAAgB,kBAAiB;AAC7D,UAAI,CAAC,gBAAgB,KAAK,aAAc,gBAAe;AAAA,IACzD;AAEA,UAAM,OAAO,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO;AAC7D,UAAM,UAAW,OAAO,WAAW,CAAC;AAEpC,QAAI,SAAS,gBAAgB;AAC3B,YAAM,OAAO;AACb,YAAM,kBAAkB,KAAK,MAAMF,OAAK,SAAS,UAAU,QAAQ;AACnE,YAAMG,aAAY,UAAc,SAAS,eAAe;AAGxD,UAAI,CAAC,QAAQ,SAAS;AACpB,cAAM,MAAM,cAAc,KAAK,MAAM;AACrC,gBAAQ,UAAU;AAAA,UAChB,YAAYA;AAAA,UACZ,mBAAmB;AAAA,UACnB,mBAAmB,MAAM,UAAc,SAAS,IAAI,gBAAgB,IAAI;AAAA,UACxE,aAAa,MAAM,IAAI;AAAA,UACvB,YAAY,KAAK,cAAc,KAAK,cAAc;AAAA,UAClD,gBAAgB,KAAK,kBAAkB,KAAK,kBAAkB;AAAA,UAC9D,OAAO;AAAA,UACP,UAAU,KAAK,aAAa;AAAA,UAC5B,aAAa,KAAK,OAAO;AAAA,UACzB,oBAAoB,KAAK,KAAK,UAAU;AAAA,UACxC,eAAeD;AAAA,QACjB;AACA,YAAI,KAAK;AACP,kBAAQ,MAAM,KAAK;AAAA,YACjB,UAAU;AAAA,YACV,QAAQ,QAAQ,QAAQ,qBAAqB;AAAA,YAC7C,UAAU;AAAA,YACV,QAAQC;AAAA,YACR,WAAW;AAAA,YACX,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,eAAeD;AAAA,UACjB,CAAC;AAAA,QACH;AAAA,MACF;AACA;AAAA,IACF;AAIA,UAAMC,aACJ,QAAQ,SAAS,cAAc,UAAc,SAASH,OAAK,SAAS,UAAU,QAAQ,CAAC;AACzF,QAAI,CAAC,QAAQ,SAAS;AACpB,cAAQ,UAAU;AAAA,QAChB,YAAYG;AAAA,QACZ,mBAAmBH,OAAK,SAAS,UAAU,QAAQ;AAAA,QACnD,mBAAmB;AAAA,QACnB,aAAa;AAAA,QACb,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,OAAO;AAAA,QACP,UAAU;AAAA,QACV,aAAa;AAAA,QACb,oBAAoB;AAAA,QACpB,eAAe;AAAA,MACjB;AAAA,IACF;AAEA,QAAI,SAAS,gBAAgB;AAC3B,YAAM,KAAK;AACX,YAAMI,UAAS,OAAWD,YAAW,aAAa,GAAG,WAAW,IAAI;AACpE,YAAM,OAAoB;AAAA,QACxB,SAASC;AAAA,QACT,SAAS;AAAA,QACT,gBAAgB,GAAG,WAAW;AAAA,QAC9B,UAAU;AAAA,QACV,OAAO,GAAG,SAAS;AAAA,QACnB,KAAK,GAAG,OAAO;AAAA,QACf,iBAAiB,GAAG,mBAAmB;AAAA,QACvC,gBAAgBC,iBAAgB,GAAG,cAAc;AAAA,QACjD,QAAQ,GAAG,UAAU;AAAA,QACrB,eAAeH;AAAA,MACjB;AACA,cAAQ,MAAM,KAAK,IAAI;AACvB,UAAI,KAAK,OAAO;AACd,YAAI,CAAC,WAAY,cAAa,KAAK;AACnC,oBAAY,KAAK;AAAA,MACnB;AACA;AAAA,IACF;AAEA,UAAM,gBACJ,QAAQ,MAAM,SAAS,IAAI,QAAQ,MAAM,QAAQ,MAAM,SAAS,CAAC,EAAG,UAAU;AAEhF,QAAI,SAAS,iBAAiB;AAC5B,YAAM,KAAK;AACX;AAAA,QACE;AAAA,QACAC;AAAA,QACA;AAAA,QACAD;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,MAAM;AAAA,QACN;AAAA,QACA;AAAA,MACF;AACA;AAAA,IACF;AAEA,QAAI,SAAS,aAAa;AACxB,YAAM,KAAK;AACX,YAAM;AAAA,QACJ;AAAA,QACAC;AAAA,QACA;AAAA,QACAD;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA;AAAA,IACF;AAEA,QAAI,SAAS,aAAa;AACxB,cAAQ,OAAO,KAAK;AAAA,QAClB,UAAU,QAAYC,YAAW,SAAS,YAAY;AAAA,QACtD;AAAA,QACA,SAAS;AAAA,QACT,iBAAiB;AAAA,QACjB,YAAY;AAAA,QACZ,aAAa;AAAA,QACb,SAAS;AAAA,QACT,WAAW;AAAA,QACX,OAAO;AAAA,QACP,mBAAmB;AAAA,QACnB,eAAeD;AAAA,QACf,YAAY;AAAA,MACd,CAAC;AACD;AAAA,IACF;AAGA,QAAI,SAAS,WAAW;AACtB,YAAM,KAAK;AAEX;AAAA,QACE;AAAA,QACAC;AAAA,QACA;AAAA,QACAD;AAAA,QACA;AAAA,QACA;AAAA,QACA,EAAE,GAAG,IAAI,MAAM,UAAU;AAAA,QACzB;AAAA,QACA,MAAM;AAAA,QACN;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EAGF;AAEA,MAAI,QAAQ,SAAS;AACnB,YAAQ,QAAQ,aAAa;AAAA,EAC/B;AAGA,EAAAI,iBAAgB,OAAO;AAKvB,QAAM,oBAAoB,QAAQ,QAAQ,OAAO;AAGjD,gBAAc,OAAO,IAAI,MAAM;AAC7B,IAAAC,cAAa,QAAQ,SAAS;AAAA,MAC5B;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAY;AAAA,IACd,CAAC;AAAA,EACH,CAAC;AAED,SAAO,cAAc,QAAQ,WAAW;AACxC,SAAO,WAAW,QAAQ,UAAU,IAAI;AACxC,SAAO,QAAQ,QAAQ,MAAM;AAC7B,SAAO,SAAS,QAAQ,OAAO;AAC/B,SAAO,WAAW,QAAQ,SAAS;AACnC,SAAO,iBAAiB,QAAQ,OAAO;AACvC,SAAO,aAAa,QAAQ,cAAc;AAC1C,SAAO,eAAe,QAAQ,YAAY;AAC1C,SAAO,YAAY,QAAQ,UAAU;AACrC,SAAO,QAAQ,QAAQ,MAAM;AAC7B,UAAQ;AAAA,IACN,EAAE,MAAM,UAAU,gBAAgB,cAAc,gBAAgB,OAAO;AAAA,IACvE;AAAA,EACF;AAEA,SAAO;AACT;AAkBA,SAAS,mBACP,SACAJ,YACA,eACAD,cACA,SACA,IACA,IACA,iBACA,gBACA,cACA,SACM;AACN,QAAM,UAAU,GAAG,QAAQ;AAE3B,MAAI,YAAY,WAAW;AACzB,UAAM,OAAO,eAAe,GAAG,IAAI;AACnC,UAAM,aAAa,eAAe;AAClC,UAAMM,aAAY,UAAcL,YAAW,YAAY,IAAI;AAE3D,UAAMM,WAAU,QAAYN,YAAW,SAAS,SAAS;AACzD,YAAQ,OAAO,KAAK;AAAA,MAClB,UAAUM;AAAA,MACV;AAAA,MACA,SAAS;AAAA,MACT,iBAAiB;AAAA,MACjB,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,SAAS;AAAA,MACT,WAAW;AAAA,MACX,OAAO,GAAG,QAAQ;AAAA,MAClB,mBAAmB;AAAA,MACnB,eAAeP;AAAA,MACf,YAAY;AAAA,IACd,CAAC;AAED,YAAQ,SAAS,KAAK;AAAA,MACpB,YAAYM;AAAA,MACZ,SAAS;AAAA,MACT,UAAUC;AAAA,MACV,mBAAmB;AAAA,MACnB;AAAA,MACA,OAAO,SAAS,cAAc,eAAe;AAAA,MAC7C,WAAW;AAAA,MACX,SAAS;AAAA,MACT,eAAeP;AAAA,IACjB,CAAC;AAED,UAAM,eAAe,MAAM,QAAQ,GAAG,OAAO,IAAK,GAAG,UAAiC,CAAC;AACvF,aAAS,KAAK,GAAG,KAAK,aAAa,QAAQ,MAAM;AAC/C,YAAM,OAAO,aAAa,EAAE;AAC5B,UAAI,CAAC,KAAM;AACX,YAAM,OAAO,OAAO,KAAK,SAAS,WAAW,KAAK,OAAO;AACzD,YAAM,YAAY,KAAK,QAAQ;AAC/B,cAAQ,OAAO,KAAK;AAAA,QAClB,UAAU,QAAQM,YAAW,EAAE;AAAA,QAC/B,YAAYA;AAAA,QACZ,UAAU;AAAA,QACV,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,aAAa;AAAA,QACb,eAAeN;AAAA,MACjB,CAAC;AAAA,IACH;AACA;AAAA,EACF;AAEA,MAAI,YAAY,iBAAiB;AAC/B,UAAM,eAAe,OAAO,GAAG,YAAY,WAAW,GAAG,UAAU;AACnE,UAAM,WAAW,OAAO,GAAG,SAAS,WAAW,GAAG,OAAO;AACzD,UAAMQ,cAAa,WAAeP,YAAW,gBAAgB,GAAG,OAAO,EAAE;AACzE,UAAM,eAAe,GAAG,aAAa,OAAO,OAAO;AACnD,UAAM,WAAWE,iBAAgB,GAAG,SAAS;AAC7C,UAAM,UAAUM,sBAAqB,UAAU,GAAG,SAAS;AAE3D,UAAMF,WAAU,QAAYN,YAAW,SAAS,WAAW;AAC3D,YAAQ,OAAO,KAAK;AAAA,MAClB,UAAUM;AAAA,MACV;AAAA,MACA,SAAS;AAAA,MACT,iBAAiB;AAAA,MACjB,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,SAAS;AAAA,MACT,WAAW;AAAA,MACX,OAAO;AAAA,MACP,mBAAmB;AAAA,MACnB,eAAeP;AAAA,MACf,YAAY;AAAA,IACd,CAAC;AAED,UAAM,OAAwB;AAAA,MAC5B,cAAcQ;AAAA,MACd,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,UAAUD;AAAA,MACV,gBAAgB;AAAA,MAChB,WAAW;AAAA,MACX,qBAAqBG,mBAAkB,QAAQ;AAAA,MAC/C,gBAAgB;AAAA,MAChB;AAAA,MACA,KAAK;AAAA,MACL,MAAMC,mBAAkB,GAAG,SAAS;AAAA,MACpC,OAAO;AAAA,MACP,iBAAiB;AAAA,MACjB,QAAQ;AAAA,MACR,eAAeX;AAAA,IACjB;AACA,QAAI,aAAc,SAAQ,UAAU,IAAI,cAAc,IAAI;AAC1D,YAAQ,cAAc,KAAK,IAAI;AAC/B,SAAK;AACL;AAAA,EACF;AAEA,MAAI,YAAY,wBAAwB;AACtC,UAAM,eAAe,OAAO,GAAG,YAAY,WAAW,GAAG,UAAU;AACnE,UAAM,aAAaG,iBAAgB,GAAG,MAAM,KAAK;AACjD,UAAM,UAAU,eAAe,UAAU,IAAI,IAAI;AAEjD,UAAMI,WAAU,QAAYN,YAAW,SAAS,aAAa;AAC7D,YAAQ,OAAO,KAAK;AAAA,MAClB,UAAUM;AAAA,MACV;AAAA,MACA,SAAS;AAAA,MACT,iBAAiB;AAAA,MACjB,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,SAAS;AAAA,MACT,WAAW;AAAA,MACX,OAAO;AAAA,MACP,mBAAmB;AAAA,MACnB,eAAeP;AAAA,MACf,YAAY;AAAA,IACd,CAAC;AAED,UAAM,cAAc,eAAe,QAAQ,UAAU,IAAI,YAAY,IAAI;AACzE,YAAQ,YAAY,KAAK;AAAA,MACvB,gBAAgB,aAAiBC,YAAW,gBAAgB,GAAG,OAAO,EAAE;AAAA,MACxE,cAAc,aAAa,gBAAgB;AAAA,MAC3C,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,UAAUM;AAAA,MACV,QAAQ,GAAG,UAAU;AAAA,MACrB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,aAAa;AAAA,MACb,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,kBAAkB;AAAA;AAAA,MAClB,SAAS,WAAW,MAAM,GAAGb,YAAW;AAAA,MACxC,eAAeM;AAAA,IACjB,CAAC;AACD,QAAI,aAAa;AACf,kBAAY,SACV,YAAY,WAAW,YAAa,UAAU,UAAU,YAAa,YAAY;AAAA,IACrF;AACA;AAAA,EACF;AAIA,QAAMO,WAAU,QAAYN,YAAW,SAAS,iBAAiB,WAAW,SAAS,EAAE;AACvF,UAAQ,OAAO,KAAK;AAAA,IAClB,UAAUM;AAAA,IACV;AAAA,IACA,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,YAAY,WAAW;AAAA,IACvB,aAAa,iBAAiB,WAAW,SAAS;AAAA,IAClD;AAAA,IACA,WAAW;AAAA,IACX,OAAO;AAAA,IACP,mBAAmB;AAAA,IACnB,eAAeP;AAAA,IACf,YAAY;AAAA,EACd,CAAC;AACH;AAEA,eAAe,eACb,QACAC,YACA,eACAD,cACA,SACA,IACA,IACA,iBACA,SACe;AACf,QAAM,UAAU,GAAG,QAAQ;AAE3B,MAAI,YAAY,oBAAoB;AAClC,UAAM,eAAe,GAAG,WAAW;AACnC,UAAM,WAAW,GAAG,SAChB,UAAU,QAAQ,SAAS,GAAG,QAAQ,EAAE,UAAU,aAAa,CAAC,IAChE;AACJ,UAAM,WAAW,GAAG,SAChB,UAAU,QAAQ,SAAS,GAAG,QAAQ,EAAE,UAAU,aAAa,CAAC,IAChE;AACJ,UAAM,WAAW,GAAG,oBAAoB,GAAG,qBAAqB,GAAG,UAAU,IAAI;AAAA,MAC/E;AAAA,MACAN;AAAA,IACF;AACA,UAAM,WAAW,OAAO,GAAG,cAAc,WAAW,GAAG,YAAY;AACnE,UAAM,UAAU,YAAY,QAAQ,aAAa,IAAI,IAAI;AAEzD,UAAMa,WAAU,QAAYN,YAAW,SAAS,kBAAkB;AAClE,YAAQ,OAAO,KAAK;AAAA,MAClB,UAAUM;AAAA,MACV;AAAA,MACA,SAAS;AAAA,MACT,iBAAiB;AAAA,MACjB,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,SAAS;AAAA,MACT,WAAW;AAAA,MACX,OAAO;AAAA,MACP,mBAAmB;AAAA,MACnB,eAAeP;AAAA,MACf,YAAY;AAAA,IACd,CAAC;AAED,UAAM,cAAc,eAAe,QAAQ,UAAU,IAAI,YAAY,IAAI;AACzE,YAAQ,YAAY,KAAK;AAAA,MACvB,gBAAgB,aAAiBC,YAAW,GAAG,gBAAgB,OAAO,oBAAoB;AAAA,MAC1F,cAAc,aAAa,gBAAgB;AAAA,MAC3C,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,UAAUM;AAAA,MACV,QAAQ,GAAG,UAAU;AAAA,MACrB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,aAAa,WAAW,GAAG,QAAQ;AAAA,MACnC,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB;AAAA,MACA,eAAeP;AAAA,IACjB,CAAC;AACD,QAAI,aAAa;AACf,kBAAY,SAAS,UAAU,UAAU;AACzC,UAAI,GAAG,OAAO,CAAC,YAAY,IAAK,aAAY,MAAM,GAAG;AAAA,IACvD;AACA;AAAA,EACF;AAEA,MAAI,YAAY,mBAAmB;AACjC,UAAMO,WAAU,QAAYN,YAAW,SAAS,iBAAiB;AACjE,YAAQ,OAAO,KAAK;AAAA,MAClB,UAAUM;AAAA,MACV;AAAA,MACA,SAAS;AAAA,MACT,iBAAiB;AAAA,MACjB,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,SAAS;AAAA,MACT,WAAW;AAAA,MACX,OAAO;AAAA,MACP,mBAAmB;AAAA,MACnB,eAAeP;AAAA,MACf,YAAY;AAAA,IACd,CAAC;AACD,QAAI,GAAG,WAAW,OAAO,GAAG,YAAY,UAAU;AAChD,iBAAW,YAAY,OAAO,KAAK,GAAG,OAAO,GAAG;AAC9C,gBAAQ,UAAU,KAAK;AAAA,UACrB,aAAa,WAAWC,YAAW,SAAS,GAAGM,QAAO,IAAI,QAAQ,EAAE;AAAA,UACpE,MAAM;AAAA,UACN,MAAM;AAAA,UACN,cAAc;AAAA,UACd,WAAW;AAAA,UACX,gBAAgB;AAAA,UAChB,WAAW;AAAA,UACX,YAAY;AAAA,UACZ,YAAY;AAAA,UACZ,eAAeP;AAAA,QACjB,CAAC;AAAA,MACH;AAAA,IACF;AACA;AAAA,EACF;AAEA,MAAI,YAAY,qBAAqB;AACnC,UAAM,eAAe,GAAG,WAAW;AACnC,UAAMO,WAAU,QAAYN,YAAW,SAAS,mBAAmB;AACnE,YAAQ,OAAO,KAAK;AAAA,MAClB,UAAUM;AAAA,MACV;AAAA,MACA,SAAS;AAAA,MACT,iBAAiB;AAAA,MACjB,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,SAAS;AAAA,MACT,WAAW;AAAA,MACX,OAAO;AAAA,MACP,mBAAmB;AAAA,MACnB,eAAeP;AAAA,MACf,YAAY;AAAA,IACd,CAAC;AACD,UAAM,UAAUG,iBAAgB,GAAG,MAAM,GAAG,MAAM,GAAGT,YAAW,KAAK;AACrE,UAAM,cAAc,eAAe,QAAQ,UAAU,IAAI,YAAY,IAAI;AACzE,YAAQ,YAAY,KAAK;AAAA,MACvB,gBAAgB,aAAiBO,YAAW,GAAG,gBAAgB,OAAO,qBAAqB;AAAA,MAC3F,cAAc,aAAa,gBAAgB;AAAA,MAC3C,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,UAAUM;AAAA,MACV,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,WAAW;AAAA,MACX,aAAa,WAAW,GAAG,QAAQ;AAAA,MACnC,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB;AAAA,MACA,eAAeP;AAAA,IACjB,CAAC;AACD;AAAA,EACF;AAEA,MAAI,YAAY,qBAAqB;AACnC,YAAQ,OAAO,KAAK;AAAA,MAClB,UAAU,QAAYC,YAAW,SAAS,YAAY;AAAA,MACtD;AAAA,MACA,SAAS;AAAA,MACT,iBAAiB;AAAA,MACjB,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,SAAS;AAAA,MACT,WAAW;AAAA,MACX,OAAO;AAAA,MACP,mBAAmB;AAAA,MACnB,eAAeD;AAAA,MACf,YAAY;AAAA,IACd,CAAC;AACD;AAAA,EACF;AAIA,UAAQ,OAAO,KAAK;AAAA,IAClB,UAAU,QAAYC,YAAW,SAAS,aAAa,OAAO,EAAE;AAAA,IAChE;AAAA,IACA,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,YAAY;AAAA,IACZ,aAAa,aAAa,OAAO;AAAA,IACjC;AAAA,IACA,WAAW;AAAA,IACX,OAAO;AAAA,IACP,mBAAmB;AAAA,IACnB,eAAeD;AAAA,IACf,YAAY;AAAA,EACd,CAAC;AACH;AAIA,SAAS,gBAAgB,KAAmC;AAC1D,QAAM,IAAI,IAAI;AACd,MAAI,CAAC,EAAG,QAAO;AACf,MAAI,OAAO,EAAE,OAAO,SAAU,QAAO,EAAE;AACvC,MAAI,OAAO,EAAE,YAAY,SAAU,QAAO,EAAE;AAC5C,MAAI,OAAO,EAAE,YAAY,SAAU,QAAO,EAAE;AAC5C,SAAO;AACT;AAEA,SAAS,eAAe,MAAuC;AAC7D,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAEH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAASU,mBAAkB,UAA0B;AACnD,QAAM,QAAQ,SAAS,YAAY;AACnC,MAAI,MAAM,WAAW,OAAO,EAAG,QAAO;AACtC,MACE,UAAU,WACV,UAAU,kBACV,UAAU,mBACV,UAAU,iBACV,UAAU,kBACV,UAAU,oBACV;AACA,WAAO;AAAA,EACT;AACA,MAAI,UAAU,eAAe,UAAU,WAAY,QAAO;AAC1D,MAAI,UAAU,gBAAgB,UAAU,YAAa,QAAO;AAC5D,MAAI,UAAU,iBAAiB,UAAU,gBAAgB,UAAU,QAAS,QAAO;AACnF,MAAI,UAAU,gBAAgB,UAAU,eAAe,UAAU,mBAAmB;AAClF,WAAO;AAAA,EACT;AACA,MAAI,UAAU,WAAW,UAAU,cAAc,UAAU,eAAgB,QAAO;AAClF,SAAO;AACT;AAEA,SAASD,sBAAqB,UAAkB,MAA8B;AAC5E,MAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AACrC,QAAI,OAAO,SAAS,UAAU;AAC5B,UAAI;AACF,cAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,eAAOA,sBAAqB,UAAU,MAAM;AAAA,MAC9C,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACA,QAAM,MAAM;AACZ,MAAI,OAAO,IAAI,YAAY,SAAU,QAAO,IAAI;AAChD,MAAI,MAAM,QAAQ,IAAI,OAAO,GAAG;AAC9B,WAAO,IAAI,QAAQ,IAAI,MAAM,EAAE,KAAK,GAAG;AAAA,EACzC;AACA,SAAO;AACT;AAEA,SAASE,mBAAkB,MAA8B;AACvD,MAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AACrC,QAAI,OAAO,SAAS,UAAU;AAC5B,UAAI;AACF,cAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,eAAOA,mBAAkB,MAAM;AAAA,MACjC,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACA,QAAM,MAAM;AACZ,MAAI,OAAO,IAAI,cAAc,SAAU,QAAO,IAAI;AAClD,MAAI,OAAO,IAAI,SAAS,SAAU,QAAO,IAAI;AAC7C,MAAI,OAAO,IAAI,kBAAkB,SAAU,QAAO,IAAI;AACtD,SAAO;AACT;AAEA,SAAS,eAAe,MAAuB;AAC7C,SAAO,4CAA4C,KAAK,IAAI;AAC9D;AAEA,SAAS,WAAW,GAAoD;AACtE,MAAI,CAAC,KAAK,OAAO,MAAM,SAAU,QAAO;AACxC,QAAM,OAAO,OAAO,EAAE,SAAS,WAAW,EAAE,OAAO;AACnD,QAAM,QAAQ,OAAO,EAAE,UAAU,WAAW,EAAE,QAAQ;AACtD,SAAO,OAAO,MAAO,KAAK,MAAM,QAAQ,GAAG;AAC7C;AAEA,SAASR,iBAAgB,OAA+B;AACtD,MAAI,SAAS,KAAM,QAAO;AAC1B,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,MAAI;AACF,WAAO,KAAK,UAAU,KAAK;AAAA,EAC7B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,cACP,QACmF;AACnF,MAAI,CAAC,UAAU,OAAO,WAAW,SAAU,QAAO;AAClD,QAAM,MAAM;AACZ,QAAM,MAAM,IAAI;AAChB,MAAI,CAAC,OAAO,OAAO,QAAQ,SAAU,QAAO;AAC5C,QAAM,KAAM,IAAgC;AAC5C,MAAI,CAAC,MAAM,OAAO,OAAO,SAAU,QAAO;AAC1C,QAAM,MAAM;AACZ,QAAM,SAAS,IAAI;AACnB,MAAI,OAAO,WAAW,SAAU,QAAO;AACvC,SAAO;AAAA,IACL,kBAAkB;AAAA,IAClB,YAAY,OAAO,IAAI,eAAe,WAAW,IAAI,aAAa;AAAA,IAClE,gBAAgB,OAAO,IAAI,mBAAmB,WAAW,IAAI,iBAAiB;AAAA,EAChF;AACF;AAEA,SAASC,iBAAgB,SAA6B;AACpD,QAAMH,aAAY,QAAQ,SAAS,cAAc;AACjD,MAAI,CAACA,WAAW;AAGhB,QAAM,cAAc,oBAAI,IAA4B;AACpD,aAAW,KAAK,QAAQ,QAAQ;AAC9B,QAAI,CAAC,EAAE,WAAY;AACnB,UAAM,OAAO,YAAY,IAAI,EAAE,UAAU,KAAK,CAAC;AAC/C,SAAK,KAAK,CAAC;AACX,gBAAY,IAAI,EAAE,YAAY,IAAI;AAAA,EACpC;AAEA,aAAW,KAAK,QAAQ,UAAU;AAChC,UAAM,QAAQ,YAAY,IAAI,EAAE,UAAU,KAAK,CAAC,GAC7C;AAAA,MACC,CAAC,MACC,EAAE,gBACD,EAAE,eAAe,gBAChB,EAAE,eAAe,iBACjB,EAAE,eAAe;AAAA,IACvB,EACC,IAAI,CAAC,MAAM,EAAE,WAAqB,EAClC,KAAK,IAAI;AACZ,QAAI,CAAC,QAAQ,KAAK,WAAW,EAAG;AAChC,YAAQ,WAAW,KAAK;AAAA,MACtB,QAAQ,OAAO,EAAE,UAAU;AAAA,MAC3B,aAAa;AAAA,MACb,WAAW,EAAE;AAAA,MACb,WAAW,EAAE;AAAA,MACb,MAAM,EAAE;AAAA,MACR,WAAW;AAAA,MACX,qBAAqB;AAAA,MACrB,YAAY,EAAE,SAAS,SAAS,gBAAgB;AAAA,MAChD;AAAA,IACF,CAAC;AAAA,EACH;AAEA,aAAW,KAAK,QAAQ,eAAe;AACrC,QAAI,EAAE,SAAS;AACb,cAAQ,WAAW,KAAK;AAAA,QACtB,QAAQ,UAAU,EAAE,YAAY;AAAA,QAChC,aAAa;AAAA,QACb,WAAW,EAAE;AAAA,QACb,WAAW,EAAE;AAAA,QACb,MAAM;AAAA,QACN,WAAW,EAAE;AAAA,QACb,qBAAqB,EAAE;AAAA,QACvB,YAAY;AAAA,QACZ,MAAM,EAAE;AAAA,MACV,CAAC;AAAA,IACH;AACA,QAAI,EAAE,MAAM;AACV,cAAQ,WAAW,KAAK;AAAA,QACtB,QAAQ,WAAW,EAAE,YAAY;AAAA,QACjC,aAAa;AAAA,QACb,WAAW,EAAE;AAAA,QACb,WAAW,EAAE;AAAA,QACb,MAAM;AAAA,QACN,WAAW,EAAE;AAAA,QACb,qBAAqB,EAAE;AAAA,QACvB,YAAY;AAAA,QACZ,MAAM,EAAE;AAAA,MACV,CAAC;AAAA,IACH;AAAA,EACF;AAEA,aAAW,KAAK,QAAQ,aAAa;AACnC,QAAI,EAAE,SAAS;AACb,cAAQ,WAAW,KAAK;AAAA,QACtB,QAAQ,cAAc,EAAE,cAAc;AAAA,QACtC,aAAa;AAAA,QACb,WAAW,EAAE;AAAA,QACb,WAAW;AAAA,QACX,MAAM;AAAA,QACN,WAAW;AAAA,QACX,qBAAqB;AAAA,QACrB,YAAY,EAAE,WAAW,UAAU;AAAA,QACnC,MAAM,EAAE;AAAA,MACV,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,SAASI,cACP,QACA,SACA,MAMM;AACN,MAAI,CAAC,QAAQ,QAAS;AAUtB,QAAM,YAAY;AAAA,IAChB,OAAO;AAAA,IACP;AAAA;AAAA;AAAA;AAAA;AAAA,EAKF;AACA,aAAW,KAAK,QAAQ,YAAY;AAClC,cAAU;AAAA,MACR,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,gBAAgB;AAAA,IACpB,OAAO;AAAA,IACP;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMF;AACA,gBAAc;AAAA,IACZ,QAAQ,QAAQ;AAAA,IAChB,KAAK;AAAA,IACL,QAAQ,QAAQ;AAAA,IAChB;AAAA,IACA,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,IAChB;AAAA,IACA,QAAQ,QAAQ;AAAA,IAChB,KAAK;AAAA,IACL,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,IAChB,KAAK;AAAA,IACL,KAAK;AAAA,IACL;AAAA,IACA,QAAQ,QAAQ;AAAA,EAClB;AAEA,QAAM,aAAa;AAAA,IACjB,OAAO;AAAA,IACP;AAAA;AAAA;AAAA;AAAA,EAIF;AACA,aAAW,KAAK,QAAQ,OAAO;AAC7B,eAAW;AAAA,MACT,EAAE;AAAA,MACF,QAAQ,QAAQ;AAAA,MAChB,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF;AAAA,MACA,EAAE;AAAA,MACF,EAAE;AAAA,MACF;AAAA,MACA,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,cAAc;AAAA,IAClB,OAAO;AAAA,IACP;AAAA;AAAA;AAAA;AAAA;AAAA,EAKF;AACA,aAAW,KAAK,QAAQ,QAAQ;AAC9B,gBAAY;AAAA,MACV,EAAE;AAAA,MACF,QAAQ,QAAQ;AAAA,MAChB,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,gBAAgB;AAAA,IACpB,OAAO;AAAA,IACP;AAAA;AAAA;AAAA;AAAA;AAAA,EAKF;AACA,aAAW,KAAK,QAAQ,UAAU;AAChC,kBAAc;AAAA,MACZ,EAAE;AAAA,MACF,QAAQ,QAAQ;AAAA,MAChB,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF;AAAA,MACA,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF;AAAA,MACA;AAAA,MACA;AAAA,MACA,EAAE;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,cAAc;AAAA,IAClB,OAAO;AAAA,IACP;AAAA;AAAA;AAAA;AAAA;AAAA,EAKF;AACA,aAAW,KAAK,QAAQ,QAAQ;AAC9B,gBAAY;AAAA,MACV,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,QAAQ,QAAQ;AAAA,MAChB,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,EAAE;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,iBAAiB;AAAA,IACrB,OAAO;AAAA,IACP;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMF;AACA,aAAW,KAAK,QAAQ,eAAe;AACrC,mBAAe;AAAA,MACb,EAAE;AAAA,MACF,QAAQ,QAAQ;AAAA,MAChB,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF;AAAA,MACA,EAAE;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,mBAAmB;AAAA,IACvB,OAAO;AAAA,IACP;AAAA;AAAA;AAAA;AAAA;AAAA,EAKF;AACA,aAAW,KAAK,QAAQ,aAAa;AACnC,qBAAiB;AAAA,MACf,EAAE;AAAA,MACF,EAAE;AAAA,MACF,QAAQ,QAAQ;AAAA,MAChB,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,iBAAiB;AAAA,IACrB,OAAO;AAAA,IACP;AAAA;AAAA;AAAA;AAAA;AAAA,EAKF;AACA,aAAW,KAAK,QAAQ,WAAW;AACjC,mBAAe;AAAA,MACb,EAAE;AAAA,MACF,QAAQ,QAAQ;AAAA,MAChB;AAAA,MACA;AAAA,MACA,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,aAAa;AAAA,IACjB,OAAO;AAAA,IACP;AAAA;AAAA;AAAA;AAAA,EAIF;AACA,aAAW,KAAK,QAAQ,OAAO;AAC7B,eAAW;AAAA,MACT,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,eAAe;AAAA,IACnB,OAAO;AAAA,IACP;AAAA;AAAA;AAAA;AAAA,EAIF;AACA,aAAW,KAAK,QAAQ,YAAY;AAClC,iBAAa;AAAA,MACX,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,QAAQ,QAAQ;AAAA,MAChB,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,EACF;AACF;;;AEx/CA,OAAOO,YAAU;AACjB,OAAOC,eAAc;AAWrB;AAWA;;;ACvBA,SAAS,WAAAC,gBAAe;AACxB,OAAOC,YAAU;AAajB,gBAAuB,qBACrB,MAC2C;AAC3C,QAAM,aAAa,MAAMC,aAAY,IAAI;AACzC,aAAW,MAAM,YAAY;AAC3B,QAAI,CAAC,GAAG,YAAY,EAAG;AACvB,UAAM,SAASD,OAAK,KAAK,MAAM,GAAG,IAAI;AACtC,UAAM,SAAS,MAAMC,aAAY,MAAM;AACvC,eAAW,MAAM,QAAQ;AACvB,UAAI,CAAC,GAAG,YAAY,EAAG;AACvB,YAAM,SAASD,OAAK,KAAK,QAAQ,GAAG,MAAM,UAAU;AACpD,YAAM,YAAY,MAAMC,aAAYD,OAAK,KAAK,QAAQ,GAAG,IAAI,CAAC;AAC9D,YAAM,aAAa,UAAU,KAAK,CAAC,MAAM,EAAE,OAAO,KAAK,EAAE,SAAS,UAAU;AAC5E,UAAI,CAAC,WAAY;AACjB,YAAM;AAAA,QACJ,UAAU;AAAA,QACV,aAAa,GAAG;AAAA,QAChB,SAAS,GAAG;AAAA,MACd;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAeC,aAAY,KAAkD;AAC3E,MAAI;AACF,WAAO,MAAMF,SAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAAA,EACnD,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;;;ADFA,IAAMG,eAAc;AA8BpB,eAAsB,cACpB,QACA,MACA,UAA0B,CAAC,GACH;AACxB,QAAM,SAAS,QAAQ;AACvB,QAAM,QAAQ,WAAW,QAAQ,UAAU,CAAC,IAAI,CAAC;AACjD,QAAM,SAAS,YAAY;AAC3B,UAAQ,KAAK,EAAE,UAAU,MAAM,UAAU,KAAK,GAAG,sBAAsB;AACvE,MAAI;AACF,qBAAiB,SAAS,qBAAqB,IAAI,GAAG;AACpD,aAAO;AACP,cAAQ;AAAA,QACN;AAAA,UACE,MAAM,MAAM;AAAA,UACZ,cAAc,MAAM;AAAA,UACpB,UAAU,MAAM;AAAA,QAClB;AAAA,QACA;AAAA,MACF;AACA,UAAI;AACF,cAAM,KAAK,MAAM,mBAAmB,QAAQ,OAAO,OAAO,MAAM;AAChE,QAAAC,WAAU,QAAQ,EAAE;AAAA,MACtB,SAAS,OAAO;AACd,eAAO;AACP,gBAAQ;AAAA,UACN;AAAA,YACE,KAAK;AAAA,YACL,MAAM,MAAM;AAAA,UACd;AAAA,UACA;AAAA,QACF;AACA,cAAM,YAAY,QAAQ,MAAM,UAAU;AAAA,UACxC,MAAM;AAAA,UACN,SAAS,gBAAgB,KAAK;AAAA,UAC9B,SAAS,EAAE,MAAM,MAAM,SAAS;AAAA,QAClC,CAAC;AAAA,MACH;AAAA,IACF;AACA,gBAAY,QAAQ,OAAO,QAAQ,WAAW;AAC9C,YAAQ,KAAK,EAAE,UAAU,MAAM,UAAU,OAAO,GAAG,wBAAwB;AAAA,EAC7E,SAAS,OAAO;AACd,gBAAY,QAAQ,OAAO,QAAQ,QAAQ;AAC3C,YAAQ,MAAM,EAAE,KAAK,OAAO,UAAU,MAAM,UAAU,OAAO,GAAG,qBAAqB;AACrF,UAAM;AAAA,EACR;AACA,SAAO,EAAE,OAAO,OAAO;AACzB;AAiBA,SAASC,mBAA8B;AACrC,SAAO;AAAA,IACL,uBAAuB;AAAA,IACvB,sBAAsB;AAAA,IACtB,aAAa;AAAA,IACb,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,WAAW;AAAA,IACX,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AACF;AAEA,SAASD,WAAU,QAAsB,QAA0B;AACjE,SAAO,yBAAyB,OAAO;AACvC,SAAO,wBAAwB,OAAO;AACtC,SAAO,eAAe,OAAO;AAC7B,SAAO,YAAY,OAAO;AAC1B,SAAO,UAAU,OAAO;AACxB,SAAO,YAAY,OAAO;AAC1B,SAAO,kBAAkB,OAAO;AAChC,SAAO,cAAc,OAAO;AAC5B,SAAO,gBAAgB,OAAO;AAC9B,SAAO,aAAa,OAAO;AAC3B,SAAO,SAAS,OAAO;AACvB,SAAO,UAAU,OAAO;AAC1B;AAuIA,eAAe,mBACb,QACA,OACA,OACA,QACqB;AACrB,QAAM,SAASC,iBAAgB;AAE/B,QAAM,EAAE,KAAK,YAAY,aAAa,IAAI,MAAM,mBAAmB,QAAQ;AAAA,IACzE,YAAY;AAAA,IACZ,cAAcC,OAAK,QAAQ,MAAM,QAAQ;AAAA,IACzC,UAAU;AAAA,IACV,eAAe,MAAM;AAAA,EACvB,CAAC;AACD,MAAI,cAAc;AAChB,WAAO,uBAAuB;AAC9B,YAAQ;AAAA,MACN,EAAE,MAAM,MAAM,UAAU,gBAAgB,WAAW,eAAe;AAAA,MAClE;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACA,SAAO,wBAAwB;AAC/B,UAAQ;AAAA,IACN,EAAE,MAAM,MAAM,UAAU,gBAAgB,WAAW,eAAe;AAAA,IAClE;AAAA,EACF;AAIA,QAAM,MAAM,IAAIC,UAAS,MAAM,UAAU,EAAE,UAAU,MAAM,eAAe,KAAK,CAAC;AAEhF,MAAI;AACF,UAAM,UAAwB;AAAA,MAC5B,YAAY,CAAC;AAAA,MACb,SAAS;AAAA,MACT,QAAQ,CAAC;AAAA,MACT,UAAU,CAAC;AAAA,MACX,QAAQ,CAAC;AAAA,MACT,WAAW,oBAAI,IAAI;AAAA,MACnB,eAAe,CAAC;AAAA,MAChB,aAAa,CAAC;AAAA,MACd,WAAW,CAAC;AAAA,MACZ,YAAY,CAAC;AAAA,MACb,SAAS,qBAAqB;AAAA,IAChC;AAGA,UAAM,UAAU,IACb,QAA+B,sCAAsC,EACrE,IAAI;AACP,QAAI,OAAmB,CAAC;AACxB,QAAI,YAAY;AAChB,QAAI,SAAS;AACX,YAAM,WAAW,UAAU,QAAQ,KAAK;AACxC,UAAI;AACF,eAAO,KAAK,MAAM,QAAQ;AAAA,MAC5B,QAAQ;AACN,eAAO,CAAC;AAAA,MACV;AACA,YAAM,YAAY,WAAW,QAAQ,SAAS,OAAO,KAAK,UAAU,MAAM,GAAG;AAAA,QAC3E,UAAU;AAAA,QACV,UAAU;AAAA,MACZ,CAAC;AACD,kBAAY,YAAgB,WAAW,gBAAgB,GAAG,SAAS;AACnE,cAAQ,WAAW,KAAK;AAAA,QACtB,eAAe;AAAA,QACf,gBAAgB,WAAW;AAAA,QAC3B,SAAS;AAAA,QACT,SAAS;AAAA,QACT,cAAc;AAAA,QACd,WAAW,KAAK,WAAW,MAAM;AAAA,QACjC,eAAe;AAAA,QACf,wBAAwB;AAAA,QACxB,eAAe;AAAA,QACf,YAAY;AAAA,QACZ,iBAAiB,MAAM;AAAA,QACvB,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AAEA,UAAM,kBAAkB,KAAK,WAAW,MAAM;AAC9C,UAAM,YAAY,UAAc,UAAU,eAAe;AACzD,UAAM,UAAU,KAAK,YAAY,IAAI,KAAK,KAAK,SAAS,EAAE,YAAY,IAAI;AAC1E,YAAQ,UAAU;AAAA,MAChB,YAAY;AAAA,MACZ,mBAAmB;AAAA,MACnB,YAAY,KAAK,QAAQ;AAAA,MACzB,gBAAgB,KAAK,QAAQ;AAAA,MAC7B,OAAO,KAAK,QAAQ;AAAA,MACpB,UAAU;AAAA,MACV,eAAe,aAAa,YAAgB,WAAW,gBAAgB,GAAG,aAAa;AAAA,MACvF,OAAO,KAAK,iBAAiB;AAAA,IAC/B;AAGA,UAAM,QAAQ,IACX,QAA0C,2CAA2C,EACrF,IAAI;AAEP,QAAI,iBAAiB;AACrB,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,YAAM,OAAO,MAAM,CAAC;AACpB,UAAI,CAAC,KAAM;AACX,YAAM,UAAU,IAAI;AACpB,YAAM,eAAe,WAAW,QAAQ,SAAS,KAAK,IAAI;AAC1D,YAAM,YAAY,YAAgB,WAAW,gBAAgB,SAAS,YAAY;AAGlF,UAAI,SAAgC;AACpC,YAAM,YAAY,KAAK,KAAK,CAAC;AAC7B,YAAM,YAAY,cAAc,OAAkB,cAAc;AAChE,UAAI,WAAW;AACb,YAAI;AACF,mBAAS,KAAK,MAAM,KAAK,KAAK,SAAS,MAAM,CAAC;AAAA,QAChD,QAAQ;AACN,mBAAS;AAAA,QACX;AAAA,MACF;AAEA,cAAQ,WAAW,KAAK;AAAA,QACtB,eAAe;AAAA,QACf,gBAAgB,WAAW;AAAA,QAC3B;AAAA,QACA,SAAS;AAAA,QACT,cAAc,SAAS,KAAK,EAAE;AAAA,QAC9B,WAAW,KAAK;AAAA,QAChB,eAAe;AAAA,QACf,wBAAwB,UAAU,OAAO,UAAU,QAAQ,SAAS,MAAM,IAAI;AAAA,QAC9E,eAAe,UAAU,OAAO,OAAO,YAAY,WAAW;AAAA,QAC9D,YAAY;AAAA;AAAA,QACZ,iBAAiB,MAAM;AAAA,QACvB,aAAa;AAAA,MACf,CAAC;AAED,UAAI,CAAC,UAAU,OAAO,OAAO,SAAS,SAAU;AAGhD,YAAM,OAAO,QAAQ,OAAO,IAAI;AAChC,YAAMC,aAAY,UAAc,WAAW,kBAAkB,OAAO,MAAM,KAAK,EAAE;AACjF,YAAMC,WAAU,QAAY,WAAW,SAAS,SAAS;AAEzD,cAAQ,OAAO,KAAK;AAAA,QAClB,UAAUA;AAAA,QACV;AAAA,QACA,iBAAiB,KAAK;AAAA,QACtB,YAAY;AAAA,QACZ,aAAa,UAAU,OAAO,IAAI;AAAA,QAClC,SAAS;AAAA,QACT,WAAW;AAAA,QACX,OAAO,OAAO;AAAA,QACd,mBACE,QAAQ,WAAW,QAAQ,WAAW,SAAS,CAAC,GAAG,0BAA0B;AAAA,QAC/E,eAAe;AAAA,QACf,YAAY;AAAA,MACd,CAAC;AAED,cAAQ,SAAS,KAAK;AAAA,QACpB,YAAYD;AAAA,QACZ,UAAUC;AAAA,QACV,mBAAmB,OAAO,MAAM,KAAK;AAAA,QACrC;AAAA,QACA,OAAO,SAAS,cAAe,KAAK,iBAAiB,OAAQ;AAAA,QAC7D,WAAW;AAAA,QACX,SAAS;AAAA,QACT,eAAe;AAAA,MACjB,CAAC;AAED,YAAM,UAAU,OAAO;AACvB,UAAI,OAAO,YAAY,UAAU;AAC/B,cAAM,cAAc,QAAQ,SAASD,YAAW,GAAG,QAAQ,SAAS,SAAS;AAAA,MAC/E,WAAW,MAAM,QAAQ,OAAO,GAAG;AACjC,iBAAS,KAAK,GAAG,KAAK,QAAQ,QAAQ,MAAM;AAC1C,gBAAM,OAAO,QAAQ,EAAE;AACvB,cAAI,CAAC,KAAM;AACX,gBAAM;AAAA,YACJ;AAAA,YACA;AAAA,YACAA;AAAA,YACAC;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAAC,iBAAgB,OAAO;AAIvB,UAAM,oBAAoB,QAAQ,QAAQ,OAAO;AAEjD,kBAAc,OAAO,IAAI,MAAM;AAC7B,MAAAC,cAAa,QAAQ,OAAO;AAAA,IAC9B,CAAC;AAED,WAAO,cAAc,QAAQ,WAAW;AACxC,WAAO,WAAW;AAClB,WAAO,SAAS,QAAQ,OAAO;AAC/B,WAAO,WAAW,QAAQ,SAAS;AACnC,WAAO,iBAAiB,QAAQ,OAAO;AACvC,WAAO,aAAa,QAAQ,cAAc;AAC1C,WAAO,eAAe,QAAQ,YAAY;AAC1C,WAAO,YAAY,QAAQ,UAAU;AACrC,YAAQ;AAAA,MACN,EAAE,MAAM,MAAM,UAAU,gBAAgB,WAAW,gBAAgB,OAAO;AAAA,MAC1E;AAAA,IACF;AACA,WAAO;AAAA,EACT,UAAE;AACA,QAAI,MAAM;AAAA,EACZ;AACF;AAEA,SAAS,UAAU,KAAqB;AACtC,SAAO,OAAO,KAAK,KAAK,KAAK,EAAE,SAAS,MAAM;AAChD;AAEA,SAAS,QAAQ,MAAsC;AACrD,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAGH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,eAAe,cACb,QACA,SACAH,YACA,SACA,WACA,MACAI,cACA,aAA6D,WAC9C;AACf,MAAI,CAAC,KAAM;AACX,QAAM,WAAW,KAAK,SAAST,eAAc,UAAU,QAAQ,SAAS,IAAI,IAAI;AAChF,UAAQ,OAAO,KAAK;AAAA,IAClB,UAAU,QAAQK,YAAW,OAAO;AAAA,IACpC,YAAYA;AAAA,IACZ,UAAU;AAAA,IACV;AAAA,IACA,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,aAAa,KAAK,MAAM,GAAGL,YAAW;AAAA,IACtC,UAAU;AAAA,IACV;AAAA,IACA,eAAeS;AAAA,EACjB,CAAC;AACH;AAEA,eAAe,mBACb,QACAC,YACAL,YACAC,UACA,SACA,MACAG,cACA,SACe;AACf,QAAM,IAAI,KAAK;AACf,MAAI,MAAM,QAAQ;AAChB,UAAM,cAAc,QAAQ,SAASJ,YAAW,SAAS,QAAQ,KAAK,QAAQ,IAAII,YAAW;AAC7F;AAAA,EACF;AACA,MAAI,MAAM,aAAa;AACrB,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACAJ;AAAA,MACA;AAAA,MACA;AAAA,MACA,KAAK,QAAQ;AAAA,MACbI;AAAA,MACA;AAAA,IACF;AACA;AAAA,EACF;AACA,MAAI,MAAM,sBAAsB;AAC9B,YAAQ,OAAO,KAAK;AAAA,MAClB,UAAU,QAAQJ,YAAW,OAAO;AAAA,MACpC,YAAYA;AAAA,MACZ,UAAU;AAAA,MACV;AAAA,MACA,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,eAAeI;AAAA,IACjB,CAAC;AACD;AAAA,EACF;AACA,MAAI,MAAM,aAAa;AACrB,UAAM,eAAe,KAAK,cAAc,GAAG,OAAO;AAClD,UAAM,WAAW,KAAK,YAAY;AAClC,UAAM,eAAe,KAAK,QAAQ,OAAO,UAAU,QAAQ,SAAS,KAAK,IAAI,IAAI;AACjF,UAAM,OAAO,WAAeC,YAAW,YAAY;AAEnD,YAAQ,OAAO,KAAK;AAAA,MAClB,UAAU,QAAQL,YAAW,OAAO;AAAA,MACpC,YAAYA;AAAA,MACZ,UAAU;AAAA,MACV;AAAA,MACA,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,eAAeI;AAAA,IACjB,CAAC;AAED,UAAM,OAAwB;AAAA,MAC5B,cAAc;AAAA,MACd,YAAYJ;AAAA,MACZ,UAAUC;AAAA,MACV,gBAAgB;AAAA,MAChB,WAAW;AAAA,MACX,qBAAqBK,mBAAkB,QAAQ;AAAA,MAC/C,gBAAgB;AAAA,MAChB,SACE,OAAQ,KAAK,MAAgC,YAAY,WACpD,KAAK,KAA6B,UACnC;AAAA,MACN,KAAK;AAAA,MACL,MACE,OAAQ,KAAK,MAAkC,cAAc,WACxD,KAAK,KAA+B,YACrC,OAAQ,KAAK,MAA6B,SAAS,WAChD,KAAK,KAA0B,OAChC;AAAA,MACR,OAAO;AAAA,MACP,iBAAiB;AAAA,MACjB,QAAQ;AAAA,MACR,eAAeF;AAAA,IACjB;AACA,YAAQ,UAAU,IAAI,cAAc,IAAI;AACxC,YAAQ,cAAc,KAAK,IAAI;AAC/B;AAAA,EACF;AACA,MAAI,MAAM,eAAe;AACvB,UAAM,eAAe,KAAK,cAAc,GAAG,OAAO;AAClD,UAAM,OAAOG,iBAAgB,KAAK,MAAM,KAAK;AAC7C,UAAM,WAAW,KAAK,SAASZ,eAAc,UAAU,QAAQ,SAAS,IAAI,IAAI;AAChF,UAAM,UAAU,YAAY,IAAI,IAAI,IAAI;AAExC,YAAQ,OAAO,KAAK;AAAA,MAClB,UAAU,QAAQK,YAAW,OAAO;AAAA,MACpC,YAAYA;AAAA,MACZ,UAAU;AAAA,MACV;AAAA,MACA,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,aAAa,KAAK,MAAM,GAAGL,YAAW;AAAA,MACtC,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,eAAeS;AAAA,IACjB,CAAC;AAED,UAAM,UAAU,QAAQ,UAAU,IAAI,YAAY;AAClD,YAAQ,YAAY,KAAK;AAAA,MACvB,gBAAgB,aAAiBC,YAAW,YAAY;AAAA,MACxD,cAAc,SAAS,gBAAgB;AAAA,MACvC,gBAAgB;AAAA,MAChB,YAAYL;AAAA,MACZ,UAAUC;AAAA,MACV,QAAQ,UAAW,UAAU,UAAU,YAAa;AAAA,MACpD,UAAU;AAAA,MACV,kBAAkB;AAAA,MAClB,SAAS,KAAK,MAAM,GAAGN,YAAW,KAAK;AAAA,MACvC,eAAeS;AAAA,IACjB,CAAC;AACD,QAAI,QAAS,SAAQ,SAAS,UAAU,UAAU;AAClD;AAAA,EACF;AAGA,UAAQ,OAAO,KAAK;AAAA,IAClB,UAAU,QAAQJ,YAAW,OAAO;AAAA,IACpC,YAAYA;AAAA,IACZ,UAAU;AAAA,IACV;AAAA,IACA,YAAY,KAAK;AAAA,IACjB,gBAAgB;AAAA,IAChB,aAAaO,iBAAgB,IAAI,GAAG,MAAM,GAAGZ,YAAW,KAAK;AAAA,IAC7D,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,eAAeS;AAAA,EACjB,CAAC;AACH;AAEA,SAAS,YAAY,MAAkC;AAErD,QAAM,MAAM,KAAK;AACjB,MAAI,OAAO,OAAO,IAAI,YAAY,UAAW,QAAO,IAAI;AACxD,SAAO;AACT;AAEA,SAASE,mBAAkB,UAA0B;AACnD,QAAM,QAAQ,SAAS,YAAY;AACnC,MAAI,MAAM,WAAW,OAAO,EAAG,QAAO;AACtC,MAAI,UAAU,WAAW,UAAU,sBAAsB,UAAU,OAAQ,QAAO;AAClF,MAAI,UAAU,UAAU,UAAU,cAAc,UAAU,YAAa,QAAO;AAC9E,MAAI,UAAU,WAAW,UAAU,eAAe,UAAU,aAAc,QAAO;AACjF,MACE,UAAU,gBACV,UAAU,iBACV,UAAU,UACV,UAAU,kBACV;AACA,WAAO;AAAA,EACT;AACA,MACE,UAAU,UACV,UAAU,UACV,UAAU,qBACV,UAAU,oBACV;AACA,WAAO;AAAA,EACT;AACA,MAAI,UAAU,YAAa,QAAO;AAClC,MAAI,UAAU,gBAAgB,UAAU,cAAe,QAAO;AAC9D,SAAO;AACT;AAEA,SAASC,iBAAgB,OAA+B;AACtD,MAAI,SAAS,KAAM,QAAO;AAC1B,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,MAAI;AACF,WAAO,KAAK,UAAU,KAAK;AAAA,EAC7B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAASL,iBAAgB,SAA6B;AACpD,QAAMG,aAAY,QAAQ,SAAS,cAAc;AACjD,MAAI,CAACA,WAAW;AAChB,QAAM,cAAc,oBAAI,IAA4B;AACpD,aAAW,KAAK,QAAQ,QAAQ;AAC9B,QAAI,CAAC,EAAE,WAAY;AACnB,QAAI,EAAE,eAAe,uBAAuB,EAAE,eAAe,aAAc;AAC3E,QAAI,CAAC,EAAE,YAAa;AACpB,UAAM,OAAO,YAAY,IAAI,EAAE,UAAU,KAAK,CAAC;AAC/C,SAAK,KAAK,CAAC;AACX,gBAAY,IAAI,EAAE,YAAY,IAAI;AAAA,EACpC;AACA,aAAW,KAAK,QAAQ,UAAU;AAChC,UAAM,QAAQ,YAAY,IAAI,EAAE,UAAU,KAAK,CAAC,GAC7C,IAAI,CAAC,MAAM,EAAE,eAAe,EAAE,EAC9B,KAAK,IAAI,EACT,KAAK;AACR,QAAI,CAAC,KAAM;AACX,YAAQ,WAAW,KAAK;AAAA,MACtB,QAAQ,OAAO,EAAE,UAAU;AAAA,MAC3B,aAAa;AAAA,MACb,WAAW,EAAE;AAAA,MACb,WAAW,EAAE;AAAA,MACb,MAAM,EAAE;AAAA,MACR,WAAW;AAAA,MACX,qBAAqB;AAAA,MACrB,YACE,EAAE,SAAS,SAAS,gBAAgB,EAAE,SAAS,SAAS,gBAAgB;AAAA,MAC1E;AAAA,IACF,CAAC;AAAA,EACH;AACA,aAAW,MAAM,QAAQ,eAAe;AACtC,QAAI,GAAG,SAAS;AACd,cAAQ,WAAW,KAAK;AAAA,QACtB,QAAQ,UAAU,GAAG,YAAY;AAAA,QACjC,aAAa;AAAA,QACb,WAAW,GAAG;AAAA,QACd,WAAW,GAAG;AAAA,QACd,MAAM;AAAA,QACN,WAAW,GAAG;AAAA,QACd,qBAAqB,GAAG;AAAA,QACxB,YAAY;AAAA,QACZ,MAAM,GAAG;AAAA,MACX,CAAC;AAAA,IACH;AACA,QAAI,GAAG,MAAM;AACX,cAAQ,WAAW,KAAK;AAAA,QACtB,QAAQ,WAAW,GAAG,YAAY;AAAA,QAClC,aAAa;AAAA,QACb,WAAW,GAAG;AAAA,QACd,WAAW,GAAG;AAAA,QACd,MAAM;AAAA,QACN,WAAW,GAAG;AAAA,QACd,qBAAqB,GAAG;AAAA,QACxB,YAAY;AAAA,QACZ,MAAM,GAAG;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,SAASF,cAAa,QAAgB,SAA6B;AACjE,MAAI,CAAC,QAAQ,QAAS;AAEtB,QAAM,YAAY;AAAA,IAChB,OAAO;AAAA,IACP;AAAA;AAAA;AAAA;AAAA;AAAA,EAKF;AACA,aAAW,KAAK,QAAQ,YAAY;AAClC,cAAU;AAAA,MACR,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,EACF;AAEA;AAAA,IACE,OAAO;AAAA,IACP;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMF,EAAE;AAAA,IACA,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,EAClB;AAEA,QAAM,cAAc;AAAA,IAClB,OAAO;AAAA,IACP;AAAA;AAAA;AAAA;AAAA;AAAA,EAKF;AACA,aAAW,KAAK,QAAQ,QAAQ;AAC9B,gBAAY;AAAA,MACV,EAAE;AAAA,MACF,QAAQ,QAAQ;AAAA,MAChB,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,YAAY;AAAA,IAChB,OAAO;AAAA,IACP;AAAA;AAAA;AAAA;AAAA;AAAA,EAKF;AACA,aAAW,KAAK,QAAQ,UAAU;AAChC,cAAU;AAAA,MACR,EAAE;AAAA,MACF,QAAQ,QAAQ;AAAA,MAChB,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,cAAc;AAAA,IAClB,OAAO;AAAA,IACP;AAAA;AAAA;AAAA;AAAA;AAAA,EAKF;AACA,aAAW,KAAK,QAAQ,QAAQ;AAC9B,gBAAY;AAAA,MACV,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,QAAQ,QAAQ;AAAA,MAChB,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,aAAa;AAAA,IACjB,OAAO;AAAA,IACP;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMF;AACA,aAAW,KAAK,QAAQ,eAAe;AACrC,eAAW;AAAA,MACT,EAAE;AAAA,MACF,QAAQ,QAAQ;AAAA,MAChB,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,eAAe;AAAA,IACnB,OAAO;AAAA,IACP;AAAA;AAAA;AAAA;AAAA;AAAA,EAKF;AACA,aAAW,KAAK,QAAQ,aAAa;AACnC,iBAAa;AAAA,MACX,EAAE;AAAA,MACF,EAAE;AAAA,MACF,QAAQ,QAAQ;AAAA,MAChB,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,eAAe;AAAA,IACnB,OAAO;AAAA,IACP;AAAA;AAAA;AAAA;AAAA,EAIF;AACA,aAAW,KAAK,QAAQ,YAAY;AAClC,iBAAa;AAAA,MACX,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,QAAQ,QAAQ;AAAA,MAChB,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,EACF;AAEA,OAAK;AACP;;;AE7+BA,SAAS,YAAAK,iBAAgB;AACzB,OAAOC,YAAU;AAYjB;AAYA;;;ACzBA,SAAS,YAAAC,WAAU,WAAAC,gBAAe;AAClC,OAAOC,YAAU;AAejB,gBAAuB,oBACrB,MAC4C;AAC5C,QAAM,UAAU,MAAMC,aAAY,IAAI;AACtC,aAAW,SAAS,SAAS;AAC3B,QAAI,CAAC,MAAM,YAAY,EAAG;AAC1B,QAAI,MAAM,SAAS,MAAO;AAC1B,UAAM,cAAc,MAAM,gBAAgBD,OAAK,KAAK,MAAM,MAAM,IAAI,CAAC;AACrE,UAAM,WAAWA,OAAK,KAAK,MAAM,MAAM,MAAM,OAAO;AACpD,UAAM,cAAc,MAAMC,aAAY,QAAQ;AAC9C,eAAW,KAAK,aAAa;AAC3B,UAAI,CAAC,EAAE,OAAO,EAAG;AACjB,UAAI,CAAC,EAAE,KAAK,WAAW,UAAU,KAAK,CAAC,EAAE,KAAK,SAAS,OAAO,EAAG;AACjE,YAAM;AAAA,QACJ,UAAUD,OAAK,KAAK,UAAU,EAAE,IAAI;AAAA,QACpC,YAAY,MAAM;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAe,gBAAgB,KAAqC;AAClE,MAAI;AACF,UAAM,OAAO,MAAMF,UAASE,OAAK,KAAK,KAAK,eAAe,GAAG,MAAM;AACnE,WAAO,KAAK,QAAQ,QAAQ,EAAE,EAAE,KAAK,KAAK;AAAA,EAC5C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAeC,aAAY,KAAkD;AAC3E,MAAI;AACF,WAAO,MAAMF,SAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAAA,EACnD,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;;;ADHA,IAAMG,eAAc;AAEpB,eAAsB,cACpB,QACA,MACA,UAA0B,CAAC,GACH;AACxB,QAAM,SAAS,QAAQ;AACvB,QAAM,QAAQ,WAAW,QAAQ,UAAU,CAAC,IAAI,CAAC;AACjD,QAAM,SAAS,YAAY;AAC3B,UAAQ,KAAK,EAAE,UAAU,MAAM,UAAU,KAAK,GAAG,sBAAsB;AACvE,MAAI;AACF,qBAAiB,QAAQ,oBAAoB,IAAI,GAAG;AAClD,aAAO;AACP,cAAQ;AAAA,QACN;AAAA,UACE,MAAM,KAAK;AAAA,UACX,aAAa,KAAK;AAAA,UAClB,cAAc,KAAK;AAAA,QACrB;AAAA,QACA;AAAA,MACF;AACA,UAAI;AACF,cAAM,KAAK,MAAM,kBAAkB,QAAQ,OAAO,MAAM,MAAM;AAC9D,QAAAC,WAAU,QAAQ,EAAE;AAAA,MACtB,SAAS,OAAO;AACd,eAAO;AACP,gBAAQ;AAAA,UACN;AAAA,YACE,KAAK;AAAA,YACL,MAAM,KAAK;AAAA,UACb;AAAA,UACA;AAAA,QACF;AACA,cAAM,YAAY,QAAQ,MAAM,UAAU;AAAA,UACxC,MAAM;AAAA,UACN,SAAS,gBAAgB,KAAK;AAAA,UAC9B,SAAS,EAAE,MAAM,KAAK,SAAS;AAAA,QACjC,CAAC;AAAA,MACH;AAAA,IACF;AACA,gBAAY,QAAQ,OAAO,QAAQ,WAAW;AAC9C,YAAQ,KAAK,EAAE,UAAU,MAAM,UAAU,OAAO,GAAG,wBAAwB;AAAA,EAC7E,SAAS,OAAO;AACd,gBAAY,QAAQ,OAAO,QAAQ,QAAQ;AAC3C,YAAQ,MAAM,EAAE,KAAK,OAAO,UAAU,MAAM,UAAU,OAAO,GAAG,qBAAqB;AACrF,UAAM;AAAA,EACR;AACA,SAAO,EAAE,OAAO,OAAO;AACzB;AAiBA,SAASC,mBAA8B;AACrC,SAAO;AAAA,IACL,uBAAuB;AAAA,IACvB,sBAAsB;AAAA,IACtB,aAAa;AAAA,IACb,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,WAAW;AAAA,IACX,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AACF;AAEA,SAASD,WAAU,QAAsB,QAA0B;AACjE,SAAO,yBAAyB,OAAO;AACvC,SAAO,wBAAwB,OAAO;AACtC,SAAO,eAAe,OAAO;AAC7B,SAAO,YAAY,OAAO;AAC1B,SAAO,UAAU,OAAO;AACxB,SAAO,YAAY,OAAO;AAC1B,SAAO,kBAAkB,OAAO;AAChC,SAAO,cAAc,OAAO;AAC5B,SAAO,gBAAgB,OAAO;AAC9B,SAAO,aAAa,OAAO;AAC3B,SAAO,SAAS,OAAO;AACvB,SAAO,UAAU,OAAO;AAC1B;AA2IA,eAAe,kBACb,QACA,OACA,MACA,QACqB;AACrB,QAAM,SAASC,iBAAgB;AAE/B,QAAM,EAAE,KAAK,YAAY,aAAa,IAAI,MAAM,mBAAmB,QAAQ;AAAA,IACzE,YAAY;AAAA,IACZ,cAAcC,OAAK,QAAQ,KAAK,QAAQ;AAAA,IACxC,UAAU;AAAA,IACV,eAAe,KAAK;AAAA,EACtB,CAAC;AACD,MAAI,cAAc;AAChB,WAAO,uBAAuB;AAC9B,YAAQ;AAAA,MACN,EAAE,MAAM,KAAK,UAAU,gBAAgB,WAAW,eAAe;AAAA,MACjE;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACA,SAAO,wBAAwB;AAC/B,UAAQ;AAAA,IACN,EAAE,MAAM,KAAK,UAAU,gBAAgB,WAAW,eAAe;AAAA,IACjE;AAAA,EACF;AAEA,QAAM,OAAO,MAAMC,UAAS,KAAK,UAAU,MAAM;AACjD,QAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,QAAM,UAAU,qBAAqB;AACrC,QAAM,eAAe,WAAW,SAAS,OAAO,KAAK,MAAM,MAAM,GAAG;AAAA,IAClE,UAAU;AAAA,IACV,UAAU;AAAA,EACZ,CAAC;AAED,QAAM,kBAAkB,YAAgB,WAAW,gBAAgB,GAAG,YAAY;AAClF,QAAM,UAAwB;AAAA,IAC5B,YAAY;AAAA,MACV;AAAA,QACE,eAAe;AAAA,QACf,gBAAgB,WAAW;AAAA,QAC3B,SAAS;AAAA,QACT,SAAS;AAAA,QACT,cAAc;AAAA,QACd,WAAW,OAAO,aAAa;AAAA,QAC/B,eAAe;AAAA,QACf,wBAAwB;AAAA,QACxB,eAAe;AAAA,QACf,YAAY;AAAA,QACZ,iBAAiB,MAAM;AAAA,QACvB,aAAa;AAAA,MACf;AAAA,IACF;AAAA,IACA,SAAS;AAAA,IACT,QAAQ,CAAC;AAAA,IACT,UAAU,CAAC;AAAA,IACX,QAAQ,CAAC;AAAA,IACT,eAAe,CAAC;AAAA,IAChB,aAAa,CAAC;AAAA,IACd,WAAW,CAAC;AAAA,IACZ,YAAY,CAAC;AAAA,IACb,SAAS;AAAA,IACT;AAAA,EACF;AAEA,QAAM,YAAY,OAAO,aAAaD,OAAK,SAAS,KAAK,UAAU,OAAO;AAC1E,QAAM,YAAY,UAAc,UAAU,SAAS;AAGnD,MAAI,KAAK,aAAa;AACpB,YAAQ,UAAU;AAAA,MAChB,YAAY,UAAc,UAAU,OAAO,eAAe,KAAK,UAAU;AAAA,MACzE,gBAAgB,KAAK;AAAA,MACrB,mBAAmB,OAAO,eAAe,KAAK;AAAA,IAChD;AAAA,EACF;AAEA,QAAM,QAAQ,OAAO,aAAa;AAClC,QAAM,MAAM,OAAO,eAAe;AAClC,UAAQ,UAAU;AAAA,IAChB,YAAY;AAAA,IACZ,mBAAmB;AAAA,IACnB,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,aAAa,KAAK;AAAA,IAClB,OAAO,OAAO,WAAW;AAAA,IACzB,eAAe;AAAA,EACjB;AAEA,QAAM,WAAW,MAAM,QAAQ,OAAO,QAAQ,IAAI,OAAO,WAAW,CAAC;AAErE,WAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,UAAM,MAAM,SAAS,CAAC;AACtB,QAAI,CAAC,IAAK;AACV,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA,WAAW;AAAA,MACX;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN;AAAA,IACF;AAAA,EACF;AAEA,EAAAE,iBAAgB,OAAO;AAIvB,QAAM,oBAAoB,QAAQ,QAAQ,OAAO;AAEjD,gBAAc,OAAO,IAAI,MAAM;AAC7B,IAAAC,cAAa,QAAQ,OAAO;AAAA,EAC9B,CAAC;AAED,SAAO,cAAc,QAAQ,WAAW;AACxC,SAAO,WAAW,QAAQ,UAAU,IAAI;AACxC,SAAO,SAAS,QAAQ,OAAO;AAC/B,SAAO,WAAW,QAAQ,SAAS;AACnC,SAAO,iBAAiB,QAAQ,OAAO;AACvC,SAAO,aAAa,QAAQ,cAAc;AAC1C,SAAO,eAAe,QAAQ,YAAY;AAC1C,SAAO,YAAY,QAAQ,UAAU;AACrC,UAAQ;AAAA,IACN,EAAE,MAAM,KAAK,UAAU,gBAAgB,WAAW,gBAAgB,OAAO;AAAA,IACzE;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAe,eACb,QACAC,YACAC,eACA,OACA,KACA,SACA,SACe;AACf,QAAM,UAAU,QAAQ;AACxB,QAAM,KAAK,IAAI,aAAa;AAE5B,QAAM,YAAY,UAAU,QAAQ,SAAS,GAAG;AAEhD,QAAM,UAAU,aAAa,KAAK;AAGlC,QAAM,mBAAmB,UAAU,GAAG,OAAO;AAAA,EAAK,KAAK,UAAU,GAAG,CAAC,EAAE;AACvE,QAAM,cAAwB,UAAU,gBAAgB;AACxD,OAAK;AACL,QAAMC,eAAc,YAAgBD,eAAc,SAAS,SAAS;AAEpE,UAAQ,WAAW,KAAK;AAAA,IACtB,eAAeC;AAAA,IACf,gBAAgBD;AAAA,IAChB;AAAA,IACA,SAAS;AAAA,IACT,cAAc;AAAA,IACd,WAAW,IAAI,MAAM;AAAA,IACrB,eAAe;AAAA,IACf,wBAAwB;AAAA,IACxB,eAAe;AAAA,IACf,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,aAAa;AAAA,EACf,CAAC;AAED,QAAM,OAAO,IAAI,QAAQ;AAEzB,MAAI,SAAS,UAAU,SAAS,UAAU;AACxC,UAAM,OAA+B,SAAS,SAAS,SAAS;AAChE,UAAME,aAAY,UAAcH,YAAW,SAAS,IAAI,MAAM,IAAI;AAClE,UAAMI,WAAU,QAAYJ,YAAW,SAAS,SAAS;AAEzD,YAAQ,OAAO,KAAK;AAAA,MAClB,UAAUI;AAAA,MACV;AAAA,MACA,iBAAiB,IAAI,MAAM;AAAA,MAC3B,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,SAAS;AAAA,MACT,WAAW;AAAA,MACX,OAAO;AAAA,MACP,mBAAmB;AAAA,MACnB,eAAeF;AAAA,MACf,YAAY;AAAA,IACd,CAAC;AAED,YAAQ,SAAS,KAAK;AAAA,MACpB,YAAYC;AAAA,MACZ,UAAUC;AAAA,MACV,mBAAmB,IAAI,MAAM;AAAA,MAC7B;AAAA,MACA,OAAO,SAAS,cAAe,IAAI,SAAS,OAAQ;AAAA,MACpD,WAAW;AAAA,MACX;AAAA,MACA,eAAeF;AAAA,IACjB,CAAC;AAGD,UAAM,UAAU,IAAI;AACpB,QAAI,OAAO,YAAY,UAAU;AAC/B,YAAMG,eAAc,QAAQ,SAASF,YAAW,GAAG,QAAQ,SAASD,YAAW;AAAA,IACjF,WAAW,MAAM,QAAQ,OAAO,GAAG;AACjC,eAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,cAAM,OAAO,QAAQ,CAAC;AACtB,YAAI,CAAC,KAAM;AACX,cAAM,IAAI,KAAK,QAAQ;AACvB,cAAMG,eAAc,QAAQ,SAASF,YAAW,GAAG,KAAK,QAAQ,QAAQ,GAAGD,YAAW;AAAA,MACxF;AAAA,IACF;AAGA,UAAM,WAAW,MAAM,QAAQ,IAAI,QAAQ,IAAI,IAAI,WAAW,CAAC;AAC/D,aAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,YAAM,KAAK,SAAS,CAAC;AACrB,UAAI,CAAC,GAAI;AACT,YAAM,OAAO,CAAC,GAAG,SAAS,GAAG,WAAW,EAAE,OAAO,OAAO,EAAE,KAAK,MAAM;AACrE,YAAMG;AAAA,QACJ;AAAA,QACA;AAAA,QACAF;AAAA,QACA,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACAD;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAGA,UAAM,YAAY,MAAM,QAAQ,IAAI,SAAS,IAAI,IAAI,YAAY,CAAC;AAClE,aAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACzC,YAAM,KAAK,UAAU,CAAC;AACtB,UAAI,CAAC,GAAI;AACT,YAAM,gBAAgB,QAAQF,YAAWG,YAAWC,UAAS,GAAG,IAAIF,cAAa,OAAO;AAAA,IAC1F;AACA;AAAA,EACF;AAEA,MAAI,SAAS,UAAU,SAAS,SAAS;AACvC,UAAME,WAAU,QAAYJ,YAAW,SAAS,IAAI;AACpD,YAAQ,OAAO,KAAK;AAAA,MAClB,UAAUI;AAAA,MACV;AAAA,MACA,iBAAiB,IAAI,MAAM;AAAA,MAC3B,YAAY,SAAS,UAAU,UAAU;AAAA,MACzC,aAAa;AAAA,MACb,SAAS;AAAA,MACT,WAAW;AAAA,MACX,OAAO;AAAA,MACP,mBAAmB;AAAA,MACnB,eAAeF;AAAA,MACf,YAAY;AAAA,IACd,CAAC;AACD;AAAA,EACF;AAGA,UAAQ,OAAO,KAAK;AAAA,IAClB,UAAU,QAAYF,YAAW,SAAS,WAAW,IAAI,EAAE;AAAA,IAC3D;AAAA,IACA,iBAAiB,IAAI,MAAM;AAAA,IAC3B,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,IACX,OAAO;AAAA,IACP,mBAAmB;AAAA,IACnB,eAAeE;AAAA,IACf,YAAY;AAAA,EACd,CAAC;AACH;AAEA,eAAeG,eACb,QACA,SACAF,YACA,cACA,WACA,MACAD,cACA,aAA6D,WAC9C;AACf,MAAI,CAAC,KAAM;AACX,QAAM,aAAa,KAAK,SAAST,eAAc,UAAU,QAAQ,SAAS,IAAI,IAAI;AAClF,UAAQ,OAAO,KAAK;AAAA,IAClB,UAAU,QAAQU,YAAW,YAAY;AAAA,IACzC,YAAYA;AAAA,IACZ,UAAU;AAAA,IACV,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,aAAa,KAAK,MAAM,GAAGV,YAAW;AAAA,IACtC;AAAA,IACA,eAAeS;AAAA,EACjB,CAAC;AACH;AAEA,eAAe,gBACb,QACAF,YACAG,YACAC,UACA,OACA,IACAF,cACA,SACe;AACf,QAAM,eAAe,GAAG,MAAM,GAAGC,UAAS,IAAI,KAAK;AACnD,QAAM,WAAW,GAAG,QAAQ;AAC5B,QAAMG,cAAa,WAAeN,YAAW,YAAY;AACzD,QAAM,eAAe,GAAG,OAAO,UAAU,QAAQ,SAAS,GAAG,IAAI,IAAI;AAErE,UAAQ,cAAc,KAAK;AAAA,IACzB,cAAcM;AAAA,IACd,YAAYH;AAAA,IACZ,UAAUC;AAAA,IACV,gBAAgB;AAAA,IAChB,WAAW;AAAA,IACX,qBAAqBG,mBAAkB,QAAQ;AAAA,IAC/C,gBAAgB;AAAA,IAChB,SAAS,OAAO,GAAG,MAAM,YAAY,WAAY,GAAG,KAAK,UAAqB;AAAA,IAC9E,KAAK,OAAO,GAAG,MAAM,aAAa,WAAY,GAAG,KAAK,WAAsB;AAAA,IAC5E,MACE,OAAO,GAAG,MAAM,cAAc,WACzB,GAAG,KAAK,YACT,OAAO,GAAG,MAAM,SAAS,WACtB,GAAG,KAAK,OACT;AAAA,IACR,OAAO,OAAO,GAAG,MAAM,UAAU,WAAY,GAAG,KAAK,QAAmB;AAAA,IACxE,iBAAiB,GAAG,aAAa;AAAA,IACjC,QAAQ,GAAG,UAAU;AAAA,IACrB,eAAeL;AAAA,EACjB,CAAC;AAED,QAAM,UAAU,GAAG,WAAW,UAAU,IAAI;AAC5C,QAAM,aAAa,qBAAqB,GAAG,MAAM;AACjD,QAAM,aACJ,WAAW,SAAST,eAAc,UAAU,QAAQ,SAAS,UAAU,IAAI;AAE7E,UAAQ,YAAY,KAAK;AAAA,IACvB,gBAAgB,aAAiBO,YAAW,YAAY;AAAA,IACxD,cAAcM;AAAA,IACd,gBAAgB;AAAA,IAChB,YAAYH;AAAA,IACZ,UAAUC;AAAA,IACV,QAAQ,GAAG,UAAU;AAAA,IACrB,UAAU;AAAA,IACV,kBAAkB;AAAA,IAClB,SAAS,WAAW,MAAM,GAAGX,YAAW,KAAK;AAAA,IAC7C,eAAeS;AAAA,EACjB,CAAC;AAGD,MAAI,GAAG,iBAAiB,OAAO,GAAG,kBAAkB,UAAU;AAC5D,UAAM,KAAK,GAAG;AACd,QAAI,GAAG,YAAY,GAAG,UAAU;AAC9B,YAAM,WAAW,GAAG,YAAY;AAChC,YAAM,SAAS,WACX,UAAU,QAAQ,SAAS,UAAU,EAAE,UAAU,cAAc,CAAC,IAChE;AACJ,cAAQ,UAAU,KAAK;AAAA,QACrB,aAAa,WAAWF,YAAW,UAAU,GAAGM,WAAU,OAAO;AAAA,QACjE,MAAM;AAAA,QACN,MAAM,GAAG,YAAY;AAAA,QACrB,cAAc,GAAG,YAAY,GAAG,YAAY;AAAA,QAC5C,WAAW;AAAA,QACX,gBAAgB;AAAA,QAChB,WAAW;AAAA,QACX,YAAY,SAAS;AAAA,QACrB,YAAY,GAAG,aAAa;AAAA,QAC5B,eAAeJ;AAAA,MACjB,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,SAAS,qBAAqB,QAAgD;AAC5E,MAAI,CAAC,MAAM,QAAQ,MAAM,EAAG,QAAO;AACnC,QAAM,QAAkB,CAAC;AACzB,aAAW,KAAK,QAAQ;AACtB,QAAI,EAAE,MAAM;AACV,YAAM,KAAK,EAAE,IAAI;AACjB;AAAA,IACF;AACA,QAAI,EAAE,kBAAkB,UAAU;AAChC,YAAM,KAAK,EAAE,iBAAiB;AAC9B,UAAI,GAAG,SAAS;AACd,cAAM,KAAK,OAAO,GAAG,UAAU,WAAW,GAAG,QAAQ,KAAK,UAAU,GAAG,KAAK,CAAC;AAAA,eACtE,GAAG,UAAU;AACpB,cAAM,KAAK,OAAO,GAAG,WAAW,WAAW,GAAG,SAAS,KAAK,UAAU,GAAG,MAAM,CAAC;AAAA,IACpF;AAAA,EACF;AACA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAASK,mBAAkB,UAA0B;AACnD,UAAQ,UAAU;AAAA,IAChB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO,SAAS,WAAW,OAAO,IAAI,QAAQ;AAAA,EAClD;AACF;AAEA,SAAST,iBAAgB,SAA6B;AACpD,QAAME,aAAY,QAAQ,SAAS,cAAc;AACjD,MAAI,CAACA,WAAW;AAChB,QAAM,cAAc,oBAAI,IAA4B;AACpD,aAAW,KAAK,QAAQ,QAAQ;AAC9B,QAAI,CAAC,EAAE,WAAY;AACnB,QAAI,EAAE,eAAe,oBAAqB;AAC1C,UAAM,OAAO,YAAY,IAAI,EAAE,UAAU,KAAK,CAAC;AAC/C,SAAK,KAAK,CAAC;AACX,gBAAY,IAAI,EAAE,YAAY,IAAI;AAAA,EACpC;AACA,aAAW,KAAK,QAAQ,UAAU;AAChC,UAAM,QAAQ,YAAY,IAAI,EAAE,UAAU,KAAK,CAAC,GAC7C,IAAI,CAAC,MAAM,EAAE,eAAe,EAAE,EAC9B,KAAK,IAAI,EACT,KAAK;AACR,QAAI,CAAC,KAAM;AACX,YAAQ,WAAW,KAAK;AAAA,MACtB,QAAQ,OAAO,EAAE,UAAU;AAAA,MAC3B,aAAa;AAAA,MACb,WAAW,EAAE;AAAA,MACb,WAAW,EAAE;AAAA,MACb,MAAM,EAAE;AAAA,MACR,WAAW;AAAA,MACX,qBAAqB;AAAA,MACrB,YAAY,EAAE,SAAS,SAAS,gBAAgB;AAAA,MAChD;AAAA,IACF,CAAC;AAAA,EACH;AACA,aAAW,MAAM,QAAQ,eAAe;AACtC,QAAI,GAAG,SAAS;AACd,cAAQ,WAAW,KAAK;AAAA,QACtB,QAAQ,UAAU,GAAG,YAAY;AAAA,QACjC,aAAa;AAAA,QACb,WAAW,GAAG;AAAA,QACd,WAAW,GAAG;AAAA,QACd,MAAM;AAAA,QACN,WAAW,GAAG;AAAA,QACd,qBAAqB,GAAG;AAAA,QACxB,YAAY;AAAA,QACZ,MAAM,GAAG;AAAA,MACX,CAAC;AAAA,IACH;AACA,QAAI,GAAG,MAAM;AACX,cAAQ,WAAW,KAAK;AAAA,QACtB,QAAQ,WAAW,GAAG,YAAY;AAAA,QAClC,aAAa;AAAA,QACb,WAAW,GAAG;AAAA,QACd,WAAW,GAAG;AAAA,QACd,MAAM;AAAA,QACN,WAAW,GAAG;AAAA,QACd,qBAAqB,GAAG;AAAA,QACxB,YAAY;AAAA,QACZ,MAAM,GAAG;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF;AACA,aAAW,MAAM,QAAQ,aAAa;AACpC,QAAI,CAAC,GAAG,QAAS;AACjB,YAAQ,WAAW,KAAK;AAAA,MACtB,QAAQ,cAAc,GAAG,cAAc;AAAA,MACvC,aAAa;AAAA,MACb,WAAW,GAAG;AAAA,MACd,WAAW;AAAA,MACX,MAAM;AAAA,MACN,WAAW;AAAA,MACX,qBAAqB;AAAA,MACrB,YAAY,GAAG,WAAW,UAAU;AAAA,MACpC,MAAM,GAAG;AAAA,IACX,CAAC;AAAA,EACH;AACF;AAEA,SAASD,cAAa,QAAgB,SAA6B;AACjE,MAAI,CAAC,QAAQ,QAAS;AAEtB,QAAM,YAAY;AAAA,IAChB,OAAO;AAAA,IACP;AAAA;AAAA;AAAA;AAAA;AAAA,EAKF;AACA,aAAW,KAAK,QAAQ,YAAY;AAClC,cAAU;AAAA,MACR,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,EACF;AAEA,MAAI,QAAQ,SAAS;AACnB;AAAA,MACE,OAAO;AAAA,MACP;AAAA;AAAA;AAAA;AAAA,IAIF,EAAE;AAAA,MACA,QAAQ,QAAQ;AAAA,MAChB,QAAQ,QAAQ;AAAA,MAChB,QAAQ,QAAQ,iBACZ,UAAU,QAAQ,QAAQ,cAAc,EAAE,MAAM,GAAG,EAAE,IACrD;AAAA,MACJ,QAAQ,QAAQ;AAAA,OAChB,oBAAI,KAAK,GAAE,YAAY;AAAA,IACzB;AAAA,EACF;AAEA;AAAA,IACE,OAAO;AAAA,IACP;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMF,EAAE;AAAA,IACA,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,IAChB,QAAQ,SAAS,cAAc;AAAA,IAC/B,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,EAClB;AAEA,QAAM,cAAc;AAAA,IAClB,OAAO;AAAA,IACP;AAAA;AAAA;AAAA;AAAA;AAAA,EAKF;AACA,aAAW,KAAK,QAAQ,QAAQ;AAC9B,gBAAY;AAAA,MACV,EAAE;AAAA,MACF,QAAQ,QAAQ;AAAA,MAChB,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,YAAY;AAAA,IAChB,OAAO;AAAA,IACP;AAAA;AAAA;AAAA;AAAA;AAAA,EAKF;AACA,aAAW,KAAK,QAAQ,UAAU;AAChC,cAAU;AAAA,MACR,EAAE;AAAA,MACF,QAAQ,QAAQ;AAAA,MAChB,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,cAAc;AAAA,IAClB,OAAO;AAAA,IACP;AAAA;AAAA;AAAA;AAAA;AAAA,EAKF;AACA,aAAW,KAAK,QAAQ,QAAQ;AAC9B,gBAAY;AAAA,MACV,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,QAAQ,QAAQ;AAAA,MAChB,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,aAAa;AAAA,IACjB,OAAO;AAAA,IACP;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMF;AACA,aAAW,KAAK,QAAQ,eAAe;AACrC,eAAW;AAAA,MACT,EAAE;AAAA,MACF,QAAQ,QAAQ;AAAA,MAChB,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,eAAe;AAAA,IACnB,OAAO;AAAA,IACP;AAAA;AAAA;AAAA;AAAA;AAAA,EAKF;AACA,aAAW,KAAK,QAAQ,aAAa;AACnC,iBAAa;AAAA,MACX,EAAE;AAAA,MACF,EAAE;AAAA,MACF,QAAQ,QAAQ;AAAA,MAChB,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,iBAAiB;AAAA,IACrB,OAAO;AAAA,IACP;AAAA;AAAA;AAAA;AAAA;AAAA,EAKF;AACA,aAAW,KAAK,QAAQ,WAAW;AACjC,mBAAe;AAAA,MACb,EAAE;AAAA,MACF,QAAQ,QAAQ;AAAA,MAChB,QAAQ,SAAS,cAAc;AAAA,MAC/B,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,eAAe;AAAA,IACnB,OAAO;AAAA,IACP;AAAA;AAAA;AAAA;AAAA,EAIF;AACA,aAAW,KAAK,QAAQ,YAAY;AAClC,iBAAa;AAAA,MACX,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,QAAQ,QAAQ;AAAA,MAChB,QAAQ,SAAS,cAAc;AAAA,MAC/B,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,EACF;AACF;;;Ab/+BA;AAiDO,IAAM,oBAA6C;AAAA,EACxD;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,qBAAqB,MAAMS,OAAK,KAAKC,IAAG,QAAQ,GAAG,UAAU,UAAU;AAAA,IACvE,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,qBAAqB,MAAMD,OAAK,KAAKC,IAAG,QAAQ,GAAG,WAAW,UAAU;AAAA,IACxE,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,qBAAqB,MAAMD,OAAK,KAAKC,IAAG,QAAQ,GAAG,WAAW,KAAK;AAAA,IACnE,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,qBAAqB,MAAMD,OAAK,KAAKC,IAAG,QAAQ,GAAG,WAAW,OAAO;AAAA,IACrE,SAAS;AAAA,EACX;AACF;AAEO,SAAS,mBAAmB,QAA2C;AAC5E,QAAM,WAAW,kBAAkB,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM;AAChE,MAAI,CAAC,UAAU;AACb,UAAM,IAAI,MAAM,2BAA2B,MAAM,EAAE;AAAA,EACrD;AACA,SAAO;AACT;AAEO,SAAS,mBAAmB,GAAmB;AACpD,MAAI,MAAM,IAAK,QAAOA,IAAG,QAAQ;AACjC,MAAI,EAAE,WAAW,IAAI,EAAG,QAAOD,OAAK,KAAKC,IAAG,QAAQ,GAAG,EAAE,MAAM,CAAC,CAAC;AACjE,SAAOD,OAAK,QAAQ,CAAC;AACvB;AAEA,eAAsB,kBAAkB,SAcN;AAChC,QAAM,EAAE,QAAQ,WAAW,OAAO,IAAI;AACtC,QAAM,YAAY,QAAQ,cAAc;AACxC,MAAI,cAAc;AAClB,QAAM,YAAsC,CAAC;AAC7C,MAAI,UAAwC;AAC5C,MAAI,eAA8B;AAClC,MAAI,YAA2B;AAE/B,MAAI;AACF,YAAQ,KAAK,0CAA0C;AACvD,wBAAoB,MAAM;AAE1B,eAAW,YAAY,WAAW;AAChC,YAAM,aAAa,mBAAmB,QAAQ,gBAAgB,SAAS,oBAAoB,CAAC;AAC5F,YAAM,iBAAiB,QAAQ,MAAM;AAAA,QACnC,aAAa,SAAS;AAAA,QACtB,aAAa;AAAA,MACf,CAAC;AACD,sBAAgB,KAAK,kBAAkB;AACvC,YAAM,IAAI,MAAM,SAAS,QAAQ,QAAQ,YAAY,EAAE,QAAQ,eAAe,CAAC;AAC/E,sBAAgB,EAAE,OAAO,wBAAwB;AACjD,sBAAgB;AAAA,QACd;AAAA,UACE,UAAU,EAAE,MAAM;AAAA,UAClB,QAAQ,EAAE;AAAA,QACZ;AAAA,QACA;AAAA,MACF;AAEA,YAAM,UAAU;AAAA,QACd,QAAQ,SAAS;AAAA,QACjB;AAAA,QACA,SAAS,EAAE,MAAM;AAAA,QACjB,OAAO,EAAE;AAAA,QACT,QAAQ,EAAE;AAAA,MACZ;AACA,gBAAU,KAAK,OAAO;AACtB,cAAQ,qBAAqB,OAAO;AAAA,IACtC;AAEA,UAAM,uBAAuB,eAAe;AAC5C,QAAI,sBAAsB;AACxB,cAAQ;AAAA,QACN,EAAE,SAAS,aAAa,UAAU;AAAA,QAClC,cAAc,oBAAoB;AAAA,MACpC;AACA,6BAAuB,QAAQ,EAAE,SAAS,KAAK,CAAC;AAEhD,UAAI;AACF,gBAAQ,KAAK,uBAAuB;AACpC,yBAAiB,MAAM;AAAA,MACzB,SAAS,OAAO;AACd,oBAAY,gBAAgB,KAAK;AACjC,gBAAQ,MAAM,EAAE,KAAK,MAAM,GAAG,4CAA4C;AAAA,MAC5E;AAEA,UAAI;AACF,gBAAQ,KAAK,EAAE,UAAU,GAAG,0BAA0B;AACtD,cAAM,SAAS,MAAM,oBAAoB,QAAQ,EAAE,UAAU,CAAC;AAC9D,kBAAU,EAAE,iBAAiB,OAAO,kBAAkB;AACtD,gBAAQ,oBAAoB,OAAO;AAAA,MACrC,SAAS,OAAO;AACd,uBAAe,gBAAgB,KAAK;AACpC,gBAAQ,MAAM,EAAE,KAAK,MAAM,GAAG,+CAA+C;AAAA,MAC/E;AAAA,IACF;AAAA,EACF,UAAE;AACA,uBAAmB,MAAM;AAAA,EAC3B;AAEA,SAAO;AAAA,IACL,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAsB,qBAAqB,SAGR;AACjC,QAAM,YAAY,mBAAmB,QAAQ,SAAS;AACtD,UAAQ,QAAQ,KAAK,EAAE,YAAY,UAAU,GAAG,mBAAmB;AACnE,QAAM,SAAS,MAAM,oBAAoB,EAAE,YAAY,UAAU,CAAC;AAClE,SAAO;AAAA,IACL,QAAQ,OAAO;AAAA,IACf,cAAc,OAAO;AAAA,IACrB,YAAY,OAAO,KAAK,OAAO,KAAK,EAAE;AAAA,IACtC,OAAO,OAAO;AAAA,IACd,QAAQ,OAAO;AAAA,EACjB;AACF;;;AetNA,OAAO,UAA2B;AAClC,OAAO,YAAY;AAOZ,SAAS,gBAAgB,SAAmC;AACjE,QAAM,gBAAgB;AAAA,IACpB,MAAM;AAAA,IACN,OAAO,QAAQ,UAAU,UAAU;AAAA,EACrC;AAEA,MAAI,QAAQ,UAAU;AACpB,WAAO,KAAK,eAAe,KAAK,YAAY,EAAE,MAAM,GAAG,MAAM,KAAK,CAAC,CAAC;AAAA,EACtE;AAEA,SAAO;AAAA,IACL;AAAA,IACA,OAAO;AAAA,MACL,UAAU,QAAQ,OAAO;AAAA,MACzB,aAAa;AAAA,MACb,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,MAAM;AAAA,MACN,eAAe;AAAA,IACjB,CAAC;AAAA,EACH;AACF;;;AhBjBO,SAAS,iBAA0B;AACxC,QAAM,UAAU;AAAA,IACd,IAAIE,SAAQ,SAAS,EAAE;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAEA,aAAW,YAAY,mBAAmB;AACxC,YAAQ,WAAW,uBAAuB,QAAQ,CAAC;AAAA,EACrD;AAEA,UAAQ,OAAO,MAAM;AACnB,YAAQ,KAAK,EAAE,OAAO,KAAK,CAAC;AAAA,EAC9B,CAAC;AAED,SAAO;AACT;AAEO,SAAS,oBAA6B;AAC3C,SAAO,qBAAqB,IAAIA,SAAQ,aAAa,CAAC,EACnD,YAAY,oEAAoE,EAChF;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC,OAAO,OAAO,YAAuD;AACpE,UAAM,YAAY;AAAA,MAChB,WAAW;AAAA,MACX,WAAW,kBAAkB;AAAA,MAC7B,WAAW,QAAQ;AAAA,MACnB,YAAY;AAAA,IACd,CAAC;AAAA,EACH,CAAC;AACL;AAEA,SAAS,uBAAuB,UAA0C;AACxE,SAAO,qBAAqB,IAAIA,SAAQ,SAAS,IAAI,CAAC,EACnD,YAAY,SAAS,WAAW,EAChC;AAAA,IACC;AAAA,IACA,GAAG,SAAS,QAAQ,cAAc,SAAS,oBAAoB,CAAC;AAAA,IAChE,SAAS,oBAAoB;AAAA,EAC/B,EACC,OAAO,kBAAkB,oBAAoB,kBAAkB,CAAC,EAChE;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC,OACE,SAKA,YACG;AACH,YAAM,YAAY;AAAA,QAChB,WAAW,CAAC,QAAQ;AAAA,QACpB,WAAW,QAAQ;AAAA,QACnB,cAAc,QAAQ;AAAA,QACtB,WAAW,QAAQ;AAAA,QACnB,YAAY,QAAQ,gBAAgB;AAAA,MACtC,CAAC;AAAA,IACH;AAAA,EACF;AACJ;AAEA,SAAS,qBAAqB,SAA2B;AACvD,SAAO,QACJ,OAAO,aAAa,oCAAoC,EACxD,OAAO,eAAe,6DAA6D;AACxF;AAEA,eAAe,YAAY,SAMT;AAChB,QAAM,SAAS,gBAAgB,QAAQ,UAAU;AACjD,QAAM,YAAY,mBAAmB,QAAQ,SAAS;AACtD,SAAO,KAAK,EAAE,YAAY,UAAU,GAAG,gBAAgB;AACvD,QAAM,SAAS,MAAM,WAAW,SAAS;AACzC,MAAI,cAAc;AAClB,MAAI;AACF,UAAM,SAAS,MAAM,kBAAkB;AAAA,MACrC;AAAA,MACA,WAAW,QAAQ;AAAA,MACnB,cAAc,QAAQ;AAAA,MACtB,WAAW,QAAQ;AAAA,MACnB;AAAA,MACA,oBAAoB;AAAA,MACpB,mBAAmB,CAAC,WAAW;AAC7B,gBAAQ,OAAO,MAAM,oBAAoB,OAAO,eAAe;AAAA,CAAS;AAAA,MAC1E;AAAA,IACF,CAAC;AACD,kBAAc,OAAO;AAAA,EACvB,UAAE;AACA,gBAAY,MAAM;AAClB,WAAO,KAAK,EAAE,YAAY,UAAU,GAAG,eAAe;AAAA,EACxD;AAOA,QAAM,sBAAsB,eAAe,QAAQ,cAAc;AACjE,MAAI,qBAAqB;AACvB,QAAI;AACF,YAAM,SAAS,MAAM,qBAAqB,EAAE,WAAW,OAAO,CAAC;AAC/D,cAAQ,OAAO,MAAM,kBAAkB,OAAO,UAAU,cAAc,OAAO,MAAM;AAAA,CAAI;AAAA,IACzF,SAAS,OAAO;AACd,aAAO,MAAM,EAAE,KAAK,MAAM,GAAG,8CAA8C;AAAA,IAC7E;AAAA,EACF;AACF;AAEA,SAAS,YAAY,SAAuC;AAC1D,QAAM,IAAI,QAAQ;AAClB,UAAQ,OAAO;AAAA,IACb,GAAG,QAAQ,MAAM,kBAAkB,QAAQ,OAAO;AAAA,sBACzB,EAAE,iBAAiB,aAAa,EAAE,qBAAqB,YAAY,EAAE,oBAAoB;AAAA,aAClG,EAAE,QAAQ,UAAU,EAAE,KAAK,aAAa,EAAE,QAAQ,WAAW,EAAE,cAAc;AAAA,WAC/E,EAAE,MAAM,eAAe,EAAE,UAAU,iBAAiB,EAAE,YAAY;AAAA,cAC/D,EAAE,SAAS,UAAU,EAAE,KAAK,WAAW,EAAE,MAAM;AAAA;AAAA,EAClE;AACF;;;AiB/IA,SAAS,aAAAC,kBAAiB;AAC1B,OAAOC,YAAU;AACjB,SAAS,WAAAC,gBAAe;;;ACgDxB,eAAsB,sBAAsB,QAAgBC,YAAoC;AAC9F,QAAM,UAAU,OAAO,GACpB;AAAA,IACC;AAAA;AAAA;AAAA,EAGF,EACC,IAAIA,UAAS;AAEhB,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,sBAAsBA,UAAS,EAAE;AAAA,EACnD;AAEA,QAAM,WAAW,OAAO,GACrB;AAAA,IACC;AAAA;AAAA,EAEF,EACC,IAAIA,UAAS;AAEhB,QAAM,SAAS,OAAO,GACnB;AAAA,IACC;AAAA;AAAA,EAEF,EACC,IAAIA,UAAS;AAEhB,QAAM,YAAY,OAAO,GACtB;AAAA,IACC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMF,EACC,IAAIA,UAAS;AAEhB,QAAM,kBAAkB,oBAAI,IAAwB;AACpD,aAAW,KAAK,QAAQ;AACtB,QAAI,CAAC,EAAE,WAAY;AACnB,UAAM,OAAO,gBAAgB,IAAI,EAAE,UAAU,KAAK,CAAC;AACnD,SAAK,KAAK,CAAC;AACX,oBAAgB,IAAI,EAAE,YAAY,IAAI;AAAA,EACxC;AACA,QAAM,iBAAiB,oBAAI,IAA2B;AACtD,aAAW,KAAK,WAAW;AACzB,UAAM,MAAM,EAAE,cAAc;AAC5B,UAAM,OAAO,eAAe,IAAI,GAAG,KAAK,CAAC;AACzC,SAAK,KAAK,CAAC;AACX,mBAAe,IAAI,KAAK,IAAI;AAAA,EAC9B;AAEA,QAAM,QAAkB,CAAC;AACzB,QAAM,QACJ,QAAQ,OAAO,KAAK,KAAK,GAAG,QAAQ,WAAW,YAAY,QAAQ,iBAAiB;AACtF,QAAM,KAAK,KAAK,KAAK,IAAI,EAAE;AAC3B,QAAM,KAAK,iBAAiB,QAAQ,WAAW,EAAE;AACjD,QAAM,KAAK,uBAAuB,QAAQ,UAAU,IAAI;AACxD,QAAM,KAAK,8BAA8B,QAAQ,iBAAiB,IAAI;AACtE,MAAI,QAAQ,SAAU,OAAM,KAAK,gBAAgB,QAAQ,QAAQ,EAAE;AACnE,MAAI,QAAQ,OAAQ,OAAM,KAAK,cAAc,QAAQ,MAAM,EAAE;AAC7D,MAAI,QAAQ,YAAa,OAAM,KAAK,gBAAgB,QAAQ,WAAW,IAAI;AAC3E,MAAI,QAAQ,mBAAoB,OAAM,KAAK,qBAAqB,QAAQ,kBAAkB,EAAE;AAC5F,MAAI,QAAQ,eAAe,QAAQ,YAAY;AAC7C,UAAM;AAAA,MACJ,iBAAiB,QAAQ,eAAe,GAAG,WAAM,QAAQ,cAAc,QAAQ,eAAe,GAAG;AAAA,IACnG;AAAA,EACF;AACA,QAAM,KAAK,8BAA8B,QAAQ,mBAAmB,EAAE;AACtE,QAAM,KAAK,EAAE;AAEb,aAAW,KAAK,UAAU;AACxB,UAAM,KAAK,EAAE,YAAY,SAAM,EAAE,SAAS,KAAK;AAC/C,UAAM,QAAQ,EAAE,QAAQ,SAAM,EAAE,KAAK,KAAK;AAC1C,UAAM,KAAK,MAAM,EAAE,IAAI,GAAG,KAAK,GAAG,EAAE,IAAI,EAAE;AAE1C,UAAM,WAAW,gBAAgB,IAAI,EAAE,UAAU,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,OAAO;AAC9F,eAAW,KAAK,SAAS;AACvB,YAAM,OAAO,MAAM,gBAAgB,QAAQ,CAAC;AAC5C,UAAI,QAAQ,KAAM;AAClB,YAAM,KAAK,MAAM,EAAE;AAAA,IACrB;AAEA,UAAM,QAAQ,eAAe,IAAI,EAAE,UAAU,KAAK,CAAC;AACnD,eAAW,KAAK,OAAO;AACrB,YAAM,KAAK,eAAe,CAAC,GAAG,EAAE;AAAA,IAClC;AAAA,EACF;AAGA,QAAM,aAAa,eAAe,IAAI,gBAAgB,KAAK,CAAC;AAC5D,MAAI,WAAW,SAAS,GAAG;AACzB,UAAM,KAAK,8BAA8B,EAAE;AAC3C,eAAW,KAAK,YAAY;AAC1B,YAAM,KAAK,eAAe,CAAC,GAAG,EAAE;AAAA,IAClC;AAAA,EACF;AAEA,SAAO,GAAG,MAAM,KAAK,IAAI,CAAC;AAAA;AAC5B;AAEA,eAAe,gBAAgB,QAAgB,OAAyC;AACtF,MAAI,MAAM,YAAa,QAAO,MAAM;AACpC,MAAI,MAAM,gBAAgB;AACxB,QAAI;AACF,aAAO,MAAM,QAAQ,QAAQ,MAAM,cAAc;AAAA,IACnD,QAAQ;AACN,aAAO,0BAA0B,MAAM,cAAc;AAAA,IACvD;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,eAAe,GAAwB;AAC9C,QAAM,SAAS,EAAE,SAAS,SAAM,EAAE,MAAM,KAAK;AAC7C,QAAM,UAAU,EAAE,aAAa,IAAI,gBAAa;AAChD,QAAM,QAAkB,CAAC;AACzB,QAAM,KAAK,aAAa,EAAE,SAAS,GAAG,MAAM,GAAG,OAAO,EAAE;AACxD,MAAI,EAAE,SAAS;AACb,UAAM,KAAK,SAAS,EAAE,SAAS,KAAK;AAAA,EACtC;AACA,MAAI,EAAE,KAAM,OAAM,KAAK,aAAa,EAAE,IAAI,IAAI;AAC9C,MAAI,EAAE,SAAS;AACb,UAAM,KAAK,KAAK;AAChB,UAAM,KAAK,EAAE,OAAO;AACpB,UAAM,KAAK,KAAK;AAAA,EAClB;AACA,SAAO,MAAM,KAAK,IAAI;AACxB;;;AD3KO,SAAS,gBAAyB;AACvC,QAAM,UAAU,IAAIC,SAAQ,SAAS,EAClC,YAAY,qDAAqD,EACjE,SAAS,gBAAgB,kBAAkB,EAC3C,eAAe,kBAAkB,wCAAwC,EACzE,OAAO,gBAAgB,iCAAiC,EACxD,OAAO,kBAAkB,oBAAoB,kBAAkB,CAAC,EAChE,OAAO,OAAOC,YAAmB,YAA6D;AAC7F,QAAI,QAAQ,WAAW,YAAY;AACjC,YAAM,IAAI,MAAM,uBAAuB,QAAQ,MAAM,0BAA0B;AAAA,IACjF;AACA,UAAM,WAAW,QAAQ,OAAO,OAAO,WAAW;AAChD,YAAM,WAAW,MAAM,sBAAsB,QAAQA,UAAS;AAC9D,UAAI,QAAQ,KAAK;AACf,cAAMC,WAAUC,OAAK,QAAQ,QAAQ,GAAG,GAAG,UAAU,MAAM;AAC3D,gBAAQ,OAAO,MAAM,SAASA,OAAK,QAAQ,QAAQ,GAAG,CAAC;AAAA,CAAI;AAAA,MAC7D,OAAO;AACL,gBAAQ,OAAO,MAAM,QAAQ;AAAA,MAC/B;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAEH,QAAM,UAAU,IAAIH,SAAQ,SAAS,EAClC,YAAY,iEAAiE,EAC7E,OAAO,kBAAkB,oBAAoB,kBAAkB,CAAC,EAChE,OAAO,gBAAgB,6CAA6C,EACpE,OAAO,OAAO,YAA6C;AAC1D,UAAM,SAAS,MAAM,oBAAoB;AAAA,MACvC,YAAYG,OAAK,QAAQ,QAAQ,KAAK;AAAA,MACtC,QAAQ,QAAQ,MAAMA,OAAK,QAAQ,QAAQ,GAAG,IAAI;AAAA,IACpD,CAAC;AACD,YAAQ,OAAO,MAAM,2BAA2B,OAAO,MAAM;AAAA,CAAI;AACjE,YAAQ,OAAO,MAAM,YAAY,OAAO,YAAY;AAAA,CAAI;AAAA,EAC1D,CAAC;AAEH,SAAO,IAAIH,SAAQ,QAAQ,EACxB,YAAY,wDAAwD,EACpE,WAAW,OAAO,EAClB,WAAW,OAAO;AACvB;;;AE/CA,SAAS,WAAAI,gBAAe;AAExB;AAQO,SAAS,eAAwB;AACtC,QAAM,OAAO,IAAIC,SAAQ,MAAM,EAC5B,YAAY,iDAAiD,EAC7D,OAAO,kBAAkB,oBAAoB,kBAAkB,CAAC,EAChE;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC,OAAO,OAAO,YAAmD;AAChE,UAAM,WAAW,QAAQ,OAAO,CAAC,WAAW;AAI1C,WAAK,QAAQ;AACb,uBAAiB,iBAAiB,MAAM,CAAC;AAAA,IAC3C,CAAC;AAAA,EACH,CAAC;AAEH,QAAM,UAAU,IAAIA,SAAQ,SAAS,EAClC,YAAY,qDAAqD,EACjE,OAAO,kBAAkB,oBAAoB,kBAAkB,CAAC,EAChE;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC,OAAO,OAAO,YAAmD;AAChE,UAAM,WAAW,QAAQ,OAAO,OAAO,WAAW;AAChD,uBAAiB,MAAM,oBAAoB,QAAQ,EAAE,WAAW,QAAQ,UAAU,CAAC,CAAC;AAAA,IACtF,CAAC;AAAA,EACH,CAAC;AAEH,QAAM,SAAS,IAAIA,SAAQ,QAAQ,EAChC,YAAY,mCAAmC,EAC/C,OAAO,kBAAkB,oBAAoB,kBAAkB,CAAC,EAChE,OAAO,yBAAyB,8BAA8B,OAAO,EACrE,OAAO,OAAO,YAAqD;AAClE,UAAM,SAAS,kBAAkB,QAAQ,cAAc,OAAO;AAC9D,UAAM,WAAW,QAAQ,OAAO,CAAC,WAAW;AAC1C,YAAM,OAAO,uBAAuB,MAAM;AAC1C,gBAAU,MAAM;AAAA,QACd;AAAA,QACA,SAAS;AAAA,UACP;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AAEH,SAAO,IAAIA,SAAQ,OAAO,EACvB,YAAY,0CAA0C,EACtD,WAAW,IAAI,EACf,WAAW,OAAO,EAClB,WAAW,MAAM;AACtB;AAEA,SAAS,iBAAiB,QAKjB;AACP,UAAQ,OAAO;AAAA,IACb,GAAG,OAAO,MAAM,WAAW,OAAO,MAAM;AAAA,gBACrB,OAAO,gBAAgB,iBAAiB,OAAO,iBAAiB;AAAA;AAAA,EACrF;AACF;;;AClFA,SAAS,QAAAC,aAAY;AACrB,OAAOC,YAAU;AACjB,SAAS,WAAAC,gBAAe;AAGjB,SAAS,cAAuB;AACrC,SAAO,IAAIC,SAAQ,MAAM,EACtB,YAAY,+DAA+D,EAC3E,OAAO,kBAAkB,oBAAoB,kBAAkB,CAAC,EAChE,OAAO,oBAAoB,gDAAgD,KAAK,EAChF,OAAO,OAAO,YAAuD;AACpE,UAAM,WAAWC,OAAK,QAAQ,QAAQ,KAAK;AAC3C,UAAMC,UAAS,MAAMC,MAAK,GAAG,QAAQ,gBAAgB,EAClD,KAAK,MAAM,IAAI,EACf,MAAM,MAAM,KAAK;AAEpB,QAAID,SAAQ;AACV,UAAI,CAAC,QAAQ,eAAe;AAC1B,gBAAQ,OAAO;AAAA,UACb,iCAAiC,QAAQ;AAAA;AAAA;AAAA,QAC3C;AACA,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,YAAME,UAAS,MAAM,WAAW,QAAQ;AACxC,kBAAYA,OAAM;AAClB,cAAQ,OAAO,MAAM,4BAA4B,QAAQ;AAAA,CAAI;AAC7D;AAAA,IACF;AAEA,UAAM,SAAS,MAAM,WAAW,QAAQ;AACxC,gBAAY,MAAM;AAClB,YAAQ,OAAO,MAAM,+BAA+B,QAAQ;AAAA,CAAI;AAAA,EAClE,CAAC;AACL;;;ACjCA,OAAOC,YAAU;AACjB,SAAS,WAAAC,gBAAe;;;ACOxB;AARA,SAAS,kBAAkB;AAC3B,OAAO,UAAU;AAEjB,SAAS,iBAAiB;AAC1B,SAAS,4BAA4B;AACrC,SAAS,qCAAqC;;;ACLvC,IAAM,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyBpC,KAAK;AAEA,IAAM,gCAAgC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS3C,KAAK;AAEA,IAAM,2BAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAStC,KAAK;AAEA,IAAM,6BAA6B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWxC,KAAK;;;AC3DP,SAAS,SAAS;AAIlB;AAaA;AACA;AACA;;;ACnBA;AA+BO,SAAS,cAAc,QAAgB,UAA2B,CAAC,GAAuB;AAC/F,QAAM,QAAkB,CAAC;AACzB,QAAM,SAAoB,CAAC;AAE3B,MAAI,QAAQ,UAAU;AACpB,UAAM,KAAK,kBAAkB;AAC7B,WAAO,KAAK,QAAQ,QAAQ;AAAA,EAC9B;AACA,MAAI,QAAQ,eAAe;AACzB,UAAM,KAAK,4BAA4B;AACvC,WAAO,KAAK,QAAQ,aAAa;AAAA,EACnC;AACA,MAAI,QAAQ,WAAW;AACrB,UAAM,KAAK,mBAAmB;AAC9B,WAAO,KAAK,QAAQ,SAAS;AAAA,EAC/B;AACA,MAAI,QAAQ,YAAY;AACtB,UAAM,KAAK,oCAAoC;AAC/C,WAAO,KAAK,OAAO;AAAA,EACrB;AACA,MAAI,QAAQ,eAAe;AACzB,UAAM,KAAK,wCAAwC;AACnD,WAAO,KAAK,IAAI,QAAQ,aAAa,GAAG;AAAA,EAC1C;AACA,MAAI,QAAQ,UAAU;AACpB,UAAM,KAAK,yDAAyD;AACpE,WAAO,KAAK,QAAQ,QAAQ;AAAA,EAC9B;AACA,MAAI,QAAQ,UAAU;AACpB,UAAM,KAAK,wDAAwD;AACnE,WAAO,KAAK,QAAQ,QAAQ;AAAA,EAC9B;AAEA,QAAM,QAAQ,MAAM,SAAS,SAAS,MAAM,KAAK,OAAO,CAAC,KAAK;AAC9D,QAAMC,SAAQ,WAAW,QAAQ,OAAO,EAAE,KAAK,KAAK,UAAU,IAAI,CAAC;AAEnE,QAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAgBd,KAAK;AAAA;AAGX,MAAI,CAAC,QAAQ,eAAe;AAC1B,UAAMC,OAAM,GAAG,WAAW,2CAA2CD,MAAK;AAC1E,WAAO,OAAO,GAAG,QAAQC,IAAG,EAAE,IAAI,GAAG,MAAM;AAAA,EAC7C;AAKA,QAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBpB,QAAM,MAAM;AAAA,MACR,WAAW;AAAA;AAAA,MAEX,WAAW;AAAA;AAAA,YAELD,MAAK;AAAA;AAEf,SAAO,OAAO,GAAG,QAAQ,GAAG,EAAE,IAAI,GAAG,QAAQ,IAAI,QAAQ,aAAa,GAAG;AAC3E;;;ADtFA,IAAM,uBAAuB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,cAAc;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAMO,SAAS,mBACd,QACA,QACA,UAA4B,CAAC,GACvB;AACN,QAAM,eAAe,QAAQ,gBAAgB;AAC7C,QAAM,YAAY,QAAQ,aAAa,OAAO;AAC9C,QAAM,cAAc,QAAQ,eAAe;AAC3C,uBAAqB,MAAM;AAE3B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa,0FAA0F,YAAY;AAAA,MACnH,aAAa;AAAA,QACX,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,QACvB,QAAQ,EAAE,KAAK,CAAC,QAAQ,SAAS,CAAC,EAAE,SAAS;AAAA,QAC7C,YAAY,EAAE,KAAK,WAAW,EAAE,SAAS;AAAA,QACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE;AAAA,QAC7D,KAAK,EACF,QAAQ,EACR,SAAS,EACT,QAAQ,KAAK,EACb,SAAS,8DAA8D;AAAA,MAC5E;AAAA,MACA,aAAa,EAAE,cAAc,MAAM,gBAAgB,KAAK;AAAA,IAC1D;AAAA,IACA,OAAO,EAAE,OAAO,QAAQ,YAAY,OAAAE,QAAO,IAAI,MAC7C,eAAe,QAAQ,WAAW,aAAa,CAAC,iBAAiB;AAC/D,YAAM,iBAAiB,UAAU;AACjC,YAAM,OAAO,eAAe,cAAc;AAAA,QACxC;AAAA,QACA,OAAOA,UAAS;AAAA,QAChB;AAAA,QACA,QAAQ;AAAA,MACV,CAAC;AACD,YAAM,WAAW,aAAa,KAAK,OAAO,CAAC,QAAQ,IAAI,eAAe,UAAU,IAAI;AACpF,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,KAAK;AAAA,cACT;AAAA,gBACE;AAAA,gBACA,QAAQ;AAAA,gBACR,YAAY,cAAc;AAAA,gBAC1B,OAAO,SAAS;AAAA,gBAChB,MAAM;AAAA,cACR;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACL;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MACF,aAAa;AAAA,QACX,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,QACvC,QAAQ,EAAE,KAAK,CAAC,WAAW,UAAU,UAAU,CAAC,EAAE,SAAS,EAAE,QAAQ,QAAQ;AAAA,QAC7E,QAAQ,EAAE,KAAK,YAAY,EAAE,SAAS;AAAA,QACtC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,uCAAuC;AAAA,QAC7E,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,uCAAuC;AAAA,QAC7E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE;AAAA,MAC/D;AAAA,MACA,aAAa,EAAE,cAAc,MAAM,gBAAgB,KAAK;AAAA,IAC1D;AAAA,IACA,OAAO,EAAE,YAAY,QAAQ,QAAQ,OAAO,OAAO,OAAAA,OAAM,MACvD,eAAe,QAAQ,WAAW,aAAa,OAAO,iBAAiB;AACrE,UAAI,CAAC,YAAY;AACf,cAAM,OAAO,aAAa,cAAc;AAAA,UACtC,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,UAAU;AAAA,UACV,OAAOA,UAAS;AAAA,QAClB,CAAC;AACD,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,MAAM,MAAM,CAAC,EAAE,CAAC;AAAA,QACjE;AAAA,MACF;AAEA,UAAI,WAAW,YAAY;AACzB,YAAI;AACF,gBAAM,KAAK,MAAM,sBAAsB,cAAc,UAAU;AAC/D,iBAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,GAAG,CAAC,EAAE;AAAA,QACjD,SAAS,OAAO;AACd,iBAAO;AAAA,YACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,gBAAgB,KAAK,EAAE,CAAC;AAAA,YACxD,SAAS;AAAA,UACX;AAAA,QACF;AAAA,MACF;AAEA,YAAM,SAAS,WAAW,cAAc,UAAU;AAClD,UAAI,CAAC,QAAQ;AACX,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,sBAAsB,UAAU,GAAG,CAAC;AAAA,UACpE,SAAS;AAAA,QACX;AAAA,MACF;AACA,YAAM,UAAU,WAAW,YAAY,EAAE,SAAS,OAAO,QAAQ,IAAI;AACrE,aAAO;AAAA,QACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,SAAS,MAAM,CAAC,EAAE,CAAC;AAAA,MACpE;AAAA,IACF,CAAC;AAAA,EACL;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MACF,aAAa;AAAA,QACX,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,QACvC,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA,QAC/B,gBAAgB,EAAE,KAAK,oBAAoB,EAAE,SAAS;AAAA,QACtD,gBAAgB,EACb,OAAO,EACP,IAAI,CAAC,EACL,SAAS,EACT,SAAS,8EAA8E;AAAA,QAC1F,aAAa,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,KAAK;AAAA,QACjD,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,uCAAuC;AAAA,QAC7E,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,uCAAuC;AAAA,QAC7E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,EAAE,QAAQ,GAAG;AAAA,MAChE;AAAA,MACA,aAAa,EAAE,cAAc,MAAM,gBAAgB,KAAK;AAAA,IAC1D;AAAA,IACA,OAAO,UACL,eAAe,QAAQ,WAAW,aAAa,CAAC,iBAAiB;AAC/D,YAAM,OAAO,cAAc,cAAc;AAAA,QACvC,WAAW,MAAM;AAAA,QACjB,UAAU,MAAM;AAAA,QAChB,eAAe,MAAM;AAAA,QACrB,eAAe,MAAM;AAAA,QACrB,YAAY,MAAM;AAAA,QAClB,UAAU,MAAM;AAAA,QAChB,UAAU,MAAM;AAAA,QAChB,OAAO,MAAM,SAAS;AAAA,MACxB,CAAC;AACD,aAAO;AAAA,QACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,MAAM,MAAM,CAAC,EAAE,CAAC;AAAA,MACjE;AAAA,IACF,CAAC;AAAA,EACL;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MACF,aAAa;AAAA,QACX,QAAQ,EAAE,KAAK,iBAAiB;AAAA,QAChC,QAAQ,EAAE,KAAK,YAAY,EAAE,SAAS;AAAA,QACtC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,uCAAuC;AAAA,QAC7E,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,uCAAuC;AAAA,QAC7E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE;AAAA,QAC7D,YAAY,EACT,OAAO,EACP,IAAI,CAAC,EACL,SAAS,EACT,SAAS,mDAAmD;AAAA,QAC/D,uBAAuB,EACpB,OAAO,EACP,IAAI,CAAC,EACL,SAAS,EACT,SAAS,gEAAgE;AAAA,QAC5E,SAAS,EACN,OAAO,EACP,IAAI,CAAC,EACL,SAAS,EACT,SAAS,gDAAgD;AAAA,QAC5D,WAAW,EACR,OAAO,EACP,IAAI,CAAC,EACL,SAAS,EACT,SAAS,kDAAkD;AAAA,QAC9D,gBAAgB,EACb,KAAK,oBAAoB,EACzB,SAAS,EACT,SAAS,6CAA6C;AAAA,QACzD,aAAa,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,kCAAkC;AAAA,QAC/E,UAAU,EACP,OAAO,EACP,IAAI,CAAC,EACL,SAAS,EACT,SAAS,oEAAoE;AAAA,QAChF,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS,2CAA2C;AAAA,MAC1F;AAAA,MACA,aAAa,EAAE,cAAc,MAAM,gBAAgB,KAAK;AAAA,IAC1D;AAAA,IACA,OAAO,UACL,eAAe,QAAQ,WAAW,aAAa,CAAC,iBAAiB;AAC/D,YAAM,UAAkC;AAAA,QACtC,QAAQ,MAAM;AAAA,QACd,OAAO,MAAM;AAAA,QACb,OAAO,MAAM;AAAA,QACb,OAAO,MAAM;AAAA,QACb,WAAW,MAAM;AAAA,QACjB,qBAAqB,MAAM;AAAA,QAC3B,SAAS,MAAM;AAAA,QACf,UAAU,MAAM;AAAA,QAChB,eAAe,MAAM;AAAA,QACrB,YAAY,MAAM;AAAA,QAClB,UAAU,MAAM;AAAA,QAChB,OAAO,MAAM;AAAA,MACf;AACA,UAAI;AACF,cAAM,SAAS,6BAA6B;AAAA,UAC1C,QAAQ;AAAA,UACR,QAAQ,MAAM;AAAA,UACd;AAAA,QACF,CAAC;AACD,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,KAAK;AAAA,gBACT,EAAE,QAAQ,MAAM,QAAQ,OAAO,OAAO,KAAK,QAAQ,MAAM,OAAO,KAAK;AAAA,gBACrE;AAAA,gBACA;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,gBAAgB,KAAK,EAAE,CAAC;AAAA,UACxD,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACL;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MACF,aAAa;AAAA,QACX,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,MAC/B;AAAA,MACA,aAAa,EAAE,cAAc,MAAM,gBAAgB,KAAK;AAAA,IAC1D;AAAA,IACA,OAAO,EAAE,YAAY,MACnB,eAAe,QAAQ,WAAW,aAAa,OAAO,iBAAiB;AACrE,YAAM,MAAM,aAAa,GACtB,QAGC,kFAAkF,EACnF,IAAI,WAAW;AAClB,UAAI,CAAC,KAAK;AACR,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,uBAAuB,WAAW,GAAG,CAAC;AAAA,UACtE,SAAS;AAAA,QACX;AAAA,MACF;AACA,YAAM,WAAW,IAAI,kBAAkB,IAAI;AAC3C,UAAI,CAAC,UAAU;AACb,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,sBAAsB,CAAC,EAAE;AAAA,MACpE;AACA,UAAI;AACF,cAAM,OAAO,MAAM,QAAQ,cAAc,QAAQ;AACjD,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,KAAK,CAAC,EAAE;AAAA,MAC7C,QAAQ;AACN,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,qBAAqB,QAAQ,IAAI,CAAC,EAAE;AAAA,MAC/E;AAAA,IACF,CAAC;AAAA,EACL;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MACF,aAAa;AAAA,QACX,QAAQ,EAAE,KAAK,YAAY,EAAE,SAAS;AAAA,QACtC,eAAe,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,QAC1C,WAAW,EAAE,QAAQ,EAAE,SAAS;AAAA,MAClC;AAAA,MACA,aAAa,EAAE,cAAc,OAAO,iBAAiB,OAAO,gBAAgB,KAAK;AAAA,IACnF;AAAA,IACA,OAAO,EAAE,QAAQ,eAAe,UAAU,MACxC,eAAe,QAAQ,WAAW,aAAa,OAAO,iBAAiB;AACrE,UAAI,iBAAiB,CAAC,QAAQ;AAC5B,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM;AAAA,YACR;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AAEA,UAAI,CAAC,UAAU,CAAC,eAAe;AAC7B,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,KAAK;AAAA,gBACT,EAAE,MAAM,UAAU,cAAc,uBAAuB,YAAY,EAAE;AAAA,gBACrE;AAAA,gBACA;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,UAAI;AACF,cAAM,SAAS,MAAM,kBAAkB;AAAA,UACrC,QAAQ;AAAA,UACR,WAAW,SAAS,CAAC,mBAAmB,MAAM,CAAC,IAAI;AAAA,UACnD,cAAc;AAAA,UACd;AAAA,QACF,CAAC;AACD,cAAM,UAAU,OAAO,cAAc,MAAM,qBAAqB,EAAE,UAAU,CAAC,IAAI;AAEjF,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,KAAK;AAAA,gBACT;AAAA,kBACE,MAAM;AAAA,kBACN,WAAW,OAAO,UAAU,IAAI,CAAC,cAAc;AAAA,oBAC7C,QAAQ,SAAS;AAAA,oBACjB,aAAa,SAAS;AAAA,oBACtB,UAAU,SAAS;AAAA,oBACnB,QAAQ,SAAS;AAAA,kBACnB,EAAE;AAAA,kBACF,cAAc,OAAO;AAAA,kBACrB,SAAS,OAAO,UACZ,EAAE,mBAAmB,OAAO,QAAQ,gBAAgB,IACpD;AAAA,kBACJ,eAAe,OAAO;AAAA,kBACtB,YAAY,OAAO;AAAA,kBACnB,SAAS,UACL;AAAA,oBACE,SAAS,QAAQ;AAAA,oBACjB,eAAe,QAAQ;AAAA,oBACvB,aAAa,QAAQ;AAAA,oBACrB,OAAO,QAAQ;AAAA,oBACf,QAAQ,QAAQ;AAAA,kBAClB,IACA;AAAA,kBACJ,cAAc,uBAAuB,YAAY;AAAA,gBACnD;AAAA,gBACA;AAAA,gBACA;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,gBAAgB,KAAK,EAAE,CAAC;AAAA,UACxD,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACL;AACF;AAEA,eAAe,eACb,gBACA,WACA,aACA,IACY;AACZ,MAAI,CAAC,aAAa;AAChB,WAAO,MAAM,GAAG,cAAc;AAAA,EAChC;AAEA,QAAM,SAAS,MAAM,iBAAiB,SAAS;AAC/C,MAAI;AACF,WAAO,MAAM,GAAG,MAAM;AAAA,EACxB,UAAE;AACA,gBAAY,MAAM;AAAA,EACpB;AACF;AAEA,SAAS,qBAAqB,QAAyB;AACrD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MACF,YAAY;AAAA,QACV,OAAO,EACJ,OAAO,EACP,IAAI,CAAC,EACL,SAAS,4DAA4D;AAAA,MAC1E;AAAA,IACF;AAAA,IACA,CAAC,EAAE,MAAM,OAAO;AAAA,MACd,aAAa;AAAA,MACb,UAAU;AAAA,QACR;AAAA,UACE,MAAM;AAAA,UACN,SAAS;AAAA,YACP,MAAM;AAAA,YACN,MAAM,8BAA8B,QAAQ,aAAa,KAAK;AAAA,UAChE;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MACF,YAAY;AAAA,QACV,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,kDAAkD;AAAA,MACrF;AAAA,IACF;AAAA,IACA,CAAC,EAAE,MAAAC,OAAK,OAAO;AAAA,MACb,aAAa;AAAA,MACb,UAAU;AAAA,QACR;AAAA,UACE,MAAM;AAAA,UACN,SAAS;AAAA,YACP,MAAM;AAAA,YACN,MAAM,yBAAyB,QAAQ,YAAYA,MAAI;AAAA,UACzD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MACF,YAAY;AAAA,QACV,OAAO,EACJ,OAAO,EACP,SAAS,EACT,SAAS,yDAAyD;AAAA,MACvE;AAAA,IACF;AAAA,IACA,CAAC,EAAE,MAAM,OAAO;AAAA,MACd,aAAa;AAAA,MACb,UAAU;AAAA,QACR;AAAA,UACE,MAAM;AAAA,UACN,SAAS;AAAA,YACP,MAAM;AAAA,YACN,MAAM,2BAA2B;AAAA,cAC/B;AAAA,cACA,QAAQ,gBAAgB,KAAK,KAAK;AAAA,YACpC;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AFvfA,eAAsB,qBACpB,QACA,UAAiC,CAAC,GACL;AAC7B,QAAM,SAAS,gBAAgB,QAAQ,QAAQ,gBAAgB,QAAQ,QAAQ,SAAS;AACxF,QAAM,YAAY,IAAI,qBAAqB;AAC3C,QAAM,OAAO,QAAQ,SAAS;AAE9B,SAAO;AAAA,IACL,OAAO,YAAY;AACjB,YAAM,UAAU,MAAM;AACtB,YAAM,UAAU,SAAS;AAAA,IAC3B;AAAA,EACF;AACF;AAWA,eAAsB,gBACpB,QACA,SACwB;AACxB,QAAM,UAAU,QAAQ,QAAQ;AAChC,QAAM,WAAW,oBAAI,IAA0B;AAE/C,QAAM,eAAe,QAAQ,gBAAgB;AAC7C,QAAM,YAAY,QAAQ,aAAa,OAAO;AAE9C,QAAM,aAAa,KAAK,aAAa,CAAC,KAAK,QAAQ;AACjD,kBAAc,KAAK,KAAK,SAAS,UAAU,QAAQ,cAAc,SAAS,EAAE;AAAA,MAC1E,CAAC,UAAmB;AAClB,mBAAW,KAAK,KAAK;AAAA,MACvB;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAC3C,eAAW,KAAK,SAAS,MAAM;AAC/B,eAAW,OAAO,QAAQ,MAAM,QAAQ,MAAM,MAAM;AAClD,iBAAW,eAAe,SAAS,MAAM;AACzC,cAAQ;AAAA,IACV,CAAC;AAAA,EACH,CAAC;AAED,SAAO;AAAA,IACL,KAAK,UAAU,QAAQ,IAAI,IAAI,QAAQ,IAAI,GAAG,OAAO;AAAA,IACrD,OAAO,YAAY;AACjB,YAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAC3C,mBAAW,MAAM,CAAC,QAAS,MAAM,OAAO,GAAG,IAAI,QAAQ,CAAE;AAAA,MAC3D,CAAC;AACD,iBAAW,SAAS,SAAS,OAAO,GAAG;AACrC,cAAM,UAAU,MAAM,MAAM;AAC5B,cAAM,UAAU,MAAM,SAAS;AAAA,MACjC;AACA,eAAS,MAAM;AAAA,IACjB;AAAA,EACF;AACF;AAEA,eAAe,cACb,KACA,KACA,SACA,UACA,QACA,cACA,WACe;AACf,MAAI,CAAC,IAAI,OAAO,CAAC,IAAI,IAAI,WAAW,OAAO,GAAG;AAC5C,QAAI,UAAU,GAAG,EAAE,IAAI;AACvB;AAAA,EACF;AACA,QAAM,SAAS,IAAI,UAAU;AAE7B,MAAI,WAAW,OAAO;AAGpB,QAAI,UAAU,KAAK,EAAE,OAAO,eAAe,CAAC,EAAE,IAAI;AAClD;AAAA,EACF;AACA,MAAI,WAAW,UAAU,WAAW,UAAU;AAC5C,QAAI,UAAU,KAAK,EAAE,OAAO,eAAe,CAAC,EAAE,IAAI;AAClD;AAAA,EACF;AAEA,QAAM,kBAAkB,IAAI,QAAQ,gBAAgB;AACpD,QAAMC,aACJ,OAAO,oBAAoB,WACvB,kBACA,MAAM,QAAQ,eAAe,IAC3B,gBAAgB,CAAC,IACjB;AAER,MAAI,QAAkCA,aAAY,SAAS,IAAIA,UAAS,IAAI;AAE5E,MAAI,CAAC,OAAO;AACV,QAAI,WAAW,UAAU;AACvB,UAAI,UAAU,GAAG,EAAE,IAAI;AACvB;AAAA,IACF;AACA,YAAQ,MAAM,YAAY,QAAQ,UAAU,cAAc,SAAS;AAAA,EACrE;AAEA,QAAM,WAAW,MAAM,SAAS,GAAG;AACnC,QAAM,OAAO,SAAS,SAAS,IAAI,cAAc,QAAQ,IAAI;AAC7D,QAAM,MAAM,UAAU,cAAc,KAAK,KAAK,IAAI;AACpD;AAEA,eAAe,YACb,QACA,OACA,cACA,WACuB;AAGvB,QAAM,SAAS,gBAAgB,QAAQ,cAAc,SAAS;AAC9D,QAAM,YAAY,IAAI,8BAA8B;AAAA,IAClD,oBAAoB,MAAM,WAAW;AAAA,IACrC,sBAAsB,CAAC,OAAe;AACpC,YAAM,IAAI,IAAI,EAAE,QAAQ,UAAU,CAAC;AAAA,IACrC;AAAA,IACA,iBAAiB,OAAO,OAAe;AACrC,YAAM,IAAI,MAAM,IAAI,EAAE;AACtB,UAAI,GAAG;AACL,cAAM,UAAU,EAAE,MAAM;AACxB,cAAM,UAAU,EAAE,SAAS;AAC3B,cAAM,OAAO,EAAE;AAAA,MACjB;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,OAAO,QAAQ,SAAS;AAC9B,SAAO,EAAE,QAAQ,UAAU;AAC7B;AAEA,SAAS,gBACP,QACA,cACA,WACW;AACX,QAAM,SAAS,IAAI;AAAA,IACjB;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IACA,EAAE,cAAc,uBAAuB;AAAA,EACzC;AACA,qBAAmB,QAAQ,QAAQ,EAAE,aAAa,MAAM,cAAc,UAAU,CAAC;AACjF,SAAO;AACT;AAEA,eAAe,SAAS,KAAuC;AAC7D,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,SAAmB,CAAC;AAC1B,QAAI,GAAG,QAAQ,CAAC,UAAkB,OAAO,KAAK,KAAK,CAAC;AACpD,QAAI,GAAG,OAAO,MAAM,QAAQ,OAAO,OAAO,MAAM,EAAE,SAAS,MAAM,CAAC,CAAC;AACnE,QAAI,GAAG,SAAS,MAAM;AAAA,EACxB,CAAC;AACH;AAEA,SAAS,cAAc,MAAuB;AAC5C,MAAI;AACF,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,UAAU,GAAqE;AAC5F,MAAI;AACF,UAAM,EAAE,MAAM;AAAA,EAChB,QAAQ;AAAA,EAER;AACF;AAEA,SAAS,WAAW,KAAqB,OAAsB;AAC7D,MAAI,CAAC,IAAI,aAAa;AACpB,QAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AAAA,EAC3D;AACA,MAAI;AAAA,IACF,KAAK,UAAU;AAAA,MACb,SAAS;AAAA,MACT,OAAO,EAAE,MAAM,QAAQ,SAAS,gBAAgB,KAAK,EAAE;AAAA,MACvD,IAAI;AAAA,IACN,CAAC;AAAA,EACH;AACF;;;ADjOO,SAAS,aAAsB;AACpC,QAAM,QAAQ,IAAIC,SAAQ,OAAO,EAC9B,YAAY,iDAAiD,EAC7D,OAAO,kBAAkB,oBAAoB,kBAAkB,CAAC,EAChE,OAAO,2BAA2B,6BAA6B,OAAO,EACtE,OAAO,iBAAiB,aAAa,WAAW,EAChD,OAAO,iBAAiB,aAAa,MAAM,EAC3C,OAAO,iBAAiB,aAAa,MAAM,EAC3C,OAAO,4BAA4B,+BAA+B,MAAM,EACxE;AAAA,IACC,OAAO,YAOD;AACJ,YAAM,YAAYC,OAAK,QAAQ,QAAQ,KAAK;AAC5C,YAAM,SAAS,MAAM,iBAAiB,SAAS;AAC/C,UAAI;AACF,cAAM,YAAY,kBAAkB,QAAQ,SAAS;AACrD,cAAM,eAAe,kBAAkB,QAAQ,YAAY;AAC3D,YAAI,cAAc,QAAQ;AACxB,gBAAM,OAAO,OAAO,SAAS,QAAQ,MAAM,EAAE;AAC7C,cAAI,CAAC,OAAO,SAAS,IAAI,KAAK,QAAQ,GAAG;AACvC,kBAAM,IAAI,MAAM,iBAAiB,QAAQ,IAAI,EAAE;AAAA,UACjD;AACA,gBAAMC,UAAS,MAAM,gBAAgB,QAAQ;AAAA,YAC3C,MAAM,QAAQ;AAAA,YACd;AAAA,YACA,MAAM,QAAQ;AAAA,YACd;AAAA,YACA;AAAA,UACF,CAAC;AAED,kBAAQ,OAAO,MAAM,iCAAiCA,QAAO,GAAG;AAAA,CAAI;AACpE,kBAAQ,OAAO,MAAM,wBAAwB;AAC7C,2BAAiBA,QAAO,OAAO,MAAM;AACrC;AAAA,QACF;AAEA,cAAM,SAAS,MAAM,qBAAqB,QAAQ,EAAE,cAAc,UAAU,CAAC;AAC7E,yBAAiB,OAAO,OAAO,MAAM;AAAA,MACvC,SAAS,OAAO;AACd,oBAAY,MAAM;AAClB,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEF,SAAO,IAAIF,SAAQ,KAAK,EAAE,YAAY,sBAAsB,EAAE,WAAW,KAAK;AAChF;AAEA,SAAS,iBAAiB,aAAkC,QAAsB;AAChF,QAAM,WAAW,YAA2B;AAC1C,UAAM,YAAY;AAClB,gBAAY,MAAM;AAClB,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,UAAQ,KAAK,UAAU,MAAM;AAC3B,SAAK,SAAS;AAAA,EAChB,CAAC;AACD,UAAQ,KAAK,WAAW,MAAM;AAC5B,SAAK,SAAS;AAAA,EAChB,CAAC;AACH;;;AK7EA,OAAOG,YAAU;AACjB,SAAS,WAAAC,gBAAe;AAMjB,SAAS,eAAwB;AACtC,QAAM,SAAS,IAAIC,SAAQ,QAAQ,EAChC,YAAY,sDAAsD,EAClE,SAAS,SAAS,kBAAkB,EACpC,OAAO,kBAAkB,oBAAoB,kBAAkB,CAAC,EAChE,OAAO,wBAAwB,8CAA8C,EAC7E,OAAO,yBAAyB,8BAA8B,OAAO,EACrE;AAAA,IACC,OACE,KACA,YACG;AACH,YAAM,SAAS,kBAAkB,QAAQ,cAAc,OAAO;AAC9D,YAAM,aAAa,QAAQ,aACvBC,OAAK,QAAQ,QAAQ,UAAU,IAC/B,MAAM,WAAW,QAAQ,OAAO,CAAC,WAAW,OAAO,MAAM,OAAO;AAEpE,YAAM,SAAS,MAAM,mBAAmB,EAAE,YAAY,IAAI,CAAC;AAC3D,gBAAU,OAAO,MAAM;AAAA,QACrB;AAAA,QACA,SAAS,OAAO;AAAA,QAChB,MAAM,EAAE,OAAO,KAAK,OAAO,OAAO,KAAK,OAAO;AAAA,MAChD,CAAC;AAAA,IACH;AAAA,EACF;AAEF,SAAO,IAAID,SAAQ,OAAO,EAAE,YAAY,iCAAiC,EAAE,WAAW,MAAM;AAC9F;;;AClCA,SAAS,WAAAE,gBAAe;AAExB;AAKO,SAAS,gBAAyB;AACvC,SAAO,IAAIC,SAAQ,QAAQ,EACxB,YAAY,gEAAgE,EAC5E,SAAS,WAAW,2CAA2C,EAC/D,OAAO,kBAAkB,oBAAoB,kBAAkB,CAAC,EAChE,OAAO,eAAe,gBAAgB,IAAI,EAC1C,OAAO,qBAAqB,+BAA+B,MAAM,EACjE,OAAO,yBAAyB,8BAA8B,OAAO,EACrE;AAAA,IACC,OACE,OACA,YACG;AACH,YAAM,SAAS,kBAAkB,QAAQ,MAAM;AAC/C,YAAM,SAAS,kBAAkB,QAAQ,cAAc,OAAO;AAC9D,YAAM,WAAW,QAAQ,OAAO,CAAC,WAAW;AAC1C,cAAM,OAAO,eAAe,QAAQ;AAAA,UAClC;AAAA,UACA,OAAO,OAAO,SAAS,QAAQ,OAAO,EAAE;AAAA,UACxC;AAAA,QACF,CAAC;AACD,kBAAU,MAAM;AAAA,UACd;AAAA,UACA,SAAS,CAAC,aAAa,QAAQ,aAAa,cAAc,SAAS;AAAA,UACnE,MAAM,EAAE,OAAO,QAAQ,OAAO,KAAK,OAAO;AAAA,QAC5C,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,EACF;AACJ;;;ACpCA,SAAS,WAAAC,gBAAe;AAExB;AAKO,SAAS,kBAA2B;AACzC,QAAM,UAAU,IAAIC,SAAQ,UAAU,EACnC,YAAY,4CAA4C,EACxD,wBAAwB,EACxB,OAAO,kBAAkB,oBAAoB,kBAAkB,CAAC,EAChE,OAAO,mBAAmB,mDAAmD,EAC7E,OAAO,iBAAiB,+CAA+C,EACvE,OAAO,iBAAiB,6CAA6C,EACrE,OAAO,eAAe,gBAAgB,IAAI,EAC1C,OAAO,yBAAyB,8BAA8B,OAAO,EACrE;AAAA,IACC,OAAO,YAOD;AACJ,YAAM,SAAS,kBAAkB,QAAQ,cAAc,OAAO;AAC9D,YAAM,WAAW,QAAQ,OAAO,CAAC,WAAW;AAC1C,cAAM,OAAO,aAAa,QAAQ;AAAA,UAChC,YAAY,gBAAgB,QAAQ,MAAM;AAAA,UAC1C,UAAU,QAAQ;AAAA,UAClB,UAAU,QAAQ;AAAA,UAClB,OAAO,OAAO,SAAS,QAAQ,OAAO,EAAE;AAAA,QAC1C,CAAC;AAED,kBAAU,MAAM;AAAA,UACd;AAAA,UACA,SAAS;AAAA,YACP;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,EACF;AAEF,UAAQ;AAAA,IACN,IAAIA,SAAQ,OAAO,EAChB,YAAY,6CAA6C,EACzD,OAAO,kBAAkB,oBAAoB,kBAAkB,CAAC,EAChE,OAAO,mBAAmB,mDAAmD,EAC7E,OAAO,iBAAiB,+CAA+C,EACvE,OAAO,iBAAiB,6CAA6C,EACrE;AAAA,MACC,OAAO,YAKD;AACJ,cAAM,WAAW,QAAQ,OAAO,CAAC,WAAW;AAC1C,gBAAM,QAAQ,cAAc,QAAQ;AAAA,YAClC,YAAY,gBAAgB,QAAQ,MAAM;AAAA,YAC1C,UAAU,QAAQ;AAAA,YAClB,UAAU,QAAQ;AAAA,UACpB,CAAC;AACD,kBAAQ,OAAO,MAAM,GAAG,KAAK;AAAA,CAAI;AAAA,QACnC,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACJ;AAEA,SAAO;AACT;;;AC/EA,SAAS,WAAAC,iBAAe;AAIjB,SAAS,aAAsB;AACpC,SAAO,IAAIC,UAAQ,KAAK,EACrB,YAAY,0CAA0C,EACtD,OAAO,kBAAkB,oBAAoB,kBAAkB,CAAC,EAChE,OAAO,OAAO,YAA+B;AAE5C,UAAM,CAAC,EAAE,OAAO,GAAG,OAAO,EAAE,KAAAC,KAAI,CAAC,IAAI,MAAM,QAAQ,IAAI;AAAA,MACrD,OAAO,KAAK;AAAA,MACZ,OAAO,OAAO;AAAA,MACd;AAAA,IACF,CAAC;AACD,UAAM,WAAW,QAAQ,OAAO,OAAO,WAAW;AAEhD,cAAQ,MAAM;AACd,YAAM,MAAM,OAAO,MAAM,cAAcA,MAAK,EAAE,OAAO,CAAC,CAAC;AACvD,YAAM,IAAI,cAAc;AAAA,IAC1B,CAAC;AAAA,EACH,CAAC;AACL;;;A5CGA,SAAS,uBAAuB,MAAmC;AACjE,MAAI,KAAK,UAAU,KAAK,KAAK,CAAC,MAAM,MAAM;AACxC,WAAO,CAAC,KAAK,CAAC,GAAI,KAAK,CAAC,GAAI,GAAG,KAAK,MAAM,CAAC,CAAC;AAAA,EAC9C;AACA,SAAO,CAAC,GAAG,IAAI;AACjB;AAEA,eAAsB,OAAO,MAAwC;AACnE,QAAM,UAAU,IAAIC,UAAQ,EACzB,KAAK,OAAO,EACZ,wBAAwB,EACxB;AAAA,IACC;AAAA,EAEF,EACC,QAAQ,sBAAsB,eAAe;AAEhD,UAAQ,WAAW,YAAY,CAAC;AAChC,UAAQ,WAAW,eAAe,CAAC;AACnC,UAAQ,WAAW,kBAAkB,CAAC;AACtC,UAAQ,WAAW,aAAa,CAAC;AACjC,UAAQ,WAAW,gBAAgB,CAAC;AACpC,UAAQ,WAAW,cAAc,CAAC;AAClC,UAAQ,WAAW,cAAc,CAAC;AAClC,UAAQ,WAAW,aAAa,CAAC;AACjC,UAAQ,WAAW,iBAAiB,CAAC;AACrC,UAAQ,WAAW,WAAW,CAAC;AAC/B,UAAQ,WAAW,WAAW,CAAC;AAE/B,QAAM,QAAQ,WAAW,uBAAuB,IAAI,CAAC;AACvD;AAKA,IAAM,UAAU,YAAY,QAAQ,UAAU,QAAQ,KAAK,CAAC,CAAC;AAC7D,IAAI,SAAS;AACX,SAAO,QAAQ,IAAI,EAAE,MAAM,CAAC,UAAmB;AAC7C,YAAQ,OAAO;AAAA,MACb,GAAG,iBAAiB,QAAS,MAAM,SAAS,MAAM,UAAW,OAAO,KAAK,CAAC;AAAA;AAAA,IAC5E;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AACH;;;A6CjEA,OAAO,QAAQ,IAAI,EAAE,MAAM,CAAC,UAAmB;AAE7C,UAAQ,MAAM,iBAAiB,QAAS,MAAM,SAAS,MAAM,UAAW,KAAK;AAC7E,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":["path","createHash","mkdir","rm","writeFile","path","existsSync","limit","require","limit","sessionId","Command","path","mkdir","writeFile","path","path","mkdir","writeFile","sqlString","path","path","path","Command","os","path","readFile","path","mkdir","readFile","writeFile","path","mkdir","path","writeFile","readFile","path","path","limit","writeFile","sourceFileId","sessionId","access","readFile","stat","writeFile","path","stat","readFile","path","writeFile","access","path","path","readFile","rawRecordId","sessionId","messageId","eventId","readFile","path","readdir","path","PREVIEW_MAX","addCounts","linkSubagentParents","emptyFileCounts","path","readFile","rawRecordId","sessionId","turnId","stringifyOrNull","buildSearchDocs","flushPending","messageId","eventId","toolCallId","inferCommandFromArgs","canonicalToolType","inferPathFromArgs","path","Database","readdir","path","readdirSafe","PREVIEW_MAX","addCounts","emptyFileCounts","path","Database","messageId","eventId","buildSearchDocs","flushPending","rawRecordId","sessionId","canonicalToolType","stringifyOrNull","readFile","path","readFile","readdir","path","readdirSafe","PREVIEW_MAX","addCounts","emptyFileCounts","path","readFile","buildSearchDocs","flushPending","sessionId","sourceFileId","rawRecordId","messageId","eventId","pushTextBlock","toolCallId","canonicalToolType","path","os","Command","writeFile","path","Command","sessionId","Command","sessionId","writeFile","path","Command","Command","stat","path","Command","Command","path","exists","stat","bundle","path","Command","limit","sql","limit","path","sessionId","Command","path","server","path","Command","Command","path","Command","Command","Command","Command","Command","Command","App","Command"]}
|