@earendil-works/pi-session-backend-sqlite-node 0.84.1 → 0.84.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/README.md +10 -3
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +6 -0
  5. package/dist/index.js.map +1 -1
  6. package/dist/sqlite/migrations/001_initial.sql +4 -8
  7. package/dist/sqlite/repo.d.ts.map +1 -1
  8. package/dist/sqlite/repo.js +16 -21
  9. package/dist/sqlite/repo.js.map +1 -1
  10. package/dist/sqlite/search-backend.d.ts +7 -2
  11. package/dist/sqlite/search-backend.d.ts.map +1 -1
  12. package/dist/sqlite/search-backend.js +71 -34
  13. package/dist/sqlite/search-backend.js.map +1 -1
  14. package/dist/sqlite/sql.d.ts +1 -0
  15. package/dist/sqlite/sql.d.ts.map +1 -1
  16. package/dist/sqlite/sql.js +3 -0
  17. package/dist/sqlite/sql.js.map +1 -1
  18. package/dist/sqlite/storage/branch-entries.d.ts +2 -2
  19. package/dist/sqlite/storage/branch-entries.d.ts.map +1 -1
  20. package/dist/sqlite/storage/branch-entries.js +39 -22
  21. package/dist/sqlite/storage/branch-entries.js.map +1 -1
  22. package/dist/sqlite/storage/entries.d.ts +6 -2
  23. package/dist/sqlite/storage/entries.d.ts.map +1 -1
  24. package/dist/sqlite/storage/entries.js +9 -2
  25. package/dist/sqlite/storage/entries.js.map +1 -1
  26. package/dist/sqlite/storage/facts.d.ts.map +1 -1
  27. package/dist/sqlite/storage/facts.js +13 -11
  28. package/dist/sqlite/storage/facts.js.map +1 -1
  29. package/dist/sqlite/storage/records.d.ts +2 -2
  30. package/dist/sqlite/storage/records.d.ts.map +1 -1
  31. package/dist/sqlite/storage/records.js.map +1 -1
  32. package/dist/sqlite/storage/sessions.d.ts +2 -2
  33. package/dist/sqlite/storage/sessions.d.ts.map +1 -1
  34. package/dist/sqlite/storage/sessions.js +3 -4
  35. package/dist/sqlite/storage/sessions.js.map +1 -1
  36. package/dist/sqlite/types.d.ts +1 -0
  37. package/dist/sqlite/types.d.ts.map +1 -1
  38. package/dist/sqlite/types.js.map +1 -1
  39. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"repo.js","sourceRoot":"","sources":["../../src/sqlite/repo.ts"],"names":[],"mappings":"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","sourcesContent":["import type { FileError, Result } from \"@earendil-works/pi-agent-core\";\nimport {\n\ttype BranchBounds,\n\ttype Entry,\n\ttype EntryQuery,\n\ttype ForkOptions,\n\ttype LaneRecord,\n\ttype LogItem,\n\ttype LogOptions,\n\ttype NewRecord,\n\ttype OperationStartedRecord,\n\ttype ProvisionedEntry,\n\ttype RecordQuery,\n\tSession,\n\tSessionError,\n\ttype SessionRepo as SessionRepository,\n\ttype SessionStats,\n\ttype SessionStorage,\n} from \"@earendil-works/pi-agent-core\";\nimport { uuidv7 } from \"@earendil-works/pi-ai\";\nimport { appendEntryToBranchCache, buildCachedBranch, deleteBranchCache, rebuildBranchCache } from \"./branch-cache.ts\";\nimport { applyMigrations } from \"./migrations.ts\";\nimport { sql } from \"./sql.ts\";\nimport { type CachedBranchEntryRow, queryCachedBranchRows, readCachedBranch } from \"./storage/branch-entries.ts\";\nimport { readBranchTipIds } from \"./storage/branch-tips.ts\";\nimport {\n\tdeleteEntryRows,\n\ttype EntryRow,\n\tentryPayload,\n\tidExistsInEntries,\n\tinsertEntryRow,\n\treadEntryRow,\n\treadEntryRows,\n} from \"./storage/entries.ts\";\nimport { appendFact, deleteFactRows, readFactRows, readLatestFact, readLatestLabelFacts } from \"./storage/facts.ts\";\nimport {\n\tcreateInitialLane,\n\tdeleteLaneRows,\n\tfinishLaneOperation,\n\tcreateLane as insertLane,\n\treadLane,\n\treadLaneHead,\n\treadLaneMoveRows,\n\treadLanes,\n\tsetLaneLeaf,\n\tstartLaneOperation,\n\tmoveLane as updateLane,\n} from \"./storage/lanes.ts\";\nimport {\n\tappendRecordRow,\n\tdeleteRecordRows,\n\tidExistsInRecords,\n\treadOpenOperationRows,\n\treadRecordRows,\n} from \"./storage/records.ts\";\nimport {\n\tadvanceSequence,\n\tcreateSequence,\n\tdeleteSequence,\n\tgetNextSequence,\n\tsetNextSequence,\n} from \"./storage/session-sequences.ts\";\nimport {\n\taddUsageToStats,\n\tcreateStats,\n\tdeleteStats,\n\tincrementMessageCount,\n\treadStats,\n} from \"./storage/session-stats.ts\";\nimport {\n\tdecodeSessionMetadata,\n\tdeleteSessionRow,\n\tinsertSessionRow,\n\treadSessionRow,\n\treadSessionRows,\n\ttype SessionRow,\n\tsessionExists,\n} from \"./storage/sessions.ts\";\nimport {\n\tacquireWriterLease,\n\tdeleteWriterLease,\n\treleaseWriterLease,\n\trenewWriterLease,\n\ttype WriterLease,\n} from \"./storage/writer-leases.ts\";\nimport type {\n\tSqliteDatabase,\n\tSqliteDatabaseFactory,\n\tSqliteSessionCreateOptions,\n\tSqliteSessionListOptions,\n\tSqliteSessionMetadata,\n\tSqliteSessionRepositoryEnv,\n} from \"./types.ts\";\n\nexport interface SqliteWriterLeaseOptions {\n\t/** Time without a successful heartbeat before another writer may take over. Default: 30 seconds. */\n\tttlMs?: number;\n\t/** Idle heartbeat cadence. Default: 10 seconds. Must be less than ttlMs. */\n\theartbeatIntervalMs?: number;\n}\n\nexport interface SqliteSessionRepositoryOptions {\n\tenv: SqliteSessionRepositoryEnv;\n\tsqlite: SqliteDatabaseFactory;\n\tdatabasePath: string;\n\twriterLease?: SqliteWriterLeaseOptions;\n}\n\ninterface ResolvedWriterLeaseOptions {\n\tttlMs: number;\n\theartbeatIntervalMs: number;\n}\n\nfunction resolveWriterLeaseOptions(options: SqliteWriterLeaseOptions | undefined): ResolvedWriterLeaseOptions {\n\tconst ttlMs = options?.ttlMs ?? 30_000;\n\tconst heartbeatIntervalMs = options?.heartbeatIntervalMs ?? 10_000;\n\tif (!Number.isSafeInteger(ttlMs) || ttlMs <= 0) throw new RangeError(\"writerLease.ttlMs must be positive\");\n\tif (!Number.isSafeInteger(heartbeatIntervalMs) || heartbeatIntervalMs <= 0 || heartbeatIntervalMs >= ttlMs) {\n\t\tthrow new RangeError(\"writerLease.heartbeatIntervalMs must be positive and less than ttlMs\");\n\t}\n\treturn { ttlMs, heartbeatIntervalMs };\n}\n\nfunction activeWriterError(sessionId: string): SessionError {\n\treturn new SessionError(\"storage\", `SQLite session ${sessionId} already has an active writer`);\n}\n\nfunction lostWriterError(sessionId: string): SessionError {\n\treturn new SessionError(\"storage\", `SQLite session ${sessionId} writer lease was lost`);\n}\n\nfunction claimWriterLease(db: SqliteDatabase, sessionId: string, options: ResolvedWriterLeaseOptions): WriterLease {\n\tconst now = Date.now();\n\tconst lease = acquireWriterLease(db, sessionId, uuidv7(), now, now + options.ttlMs);\n\tif (!lease) throw activeWriterError(sessionId);\n\treturn lease;\n}\n\nclass SerialOperationQueue {\n\tprivate tail: Promise<void> = Promise.resolve();\n\n\tenqueue<T>(operation: () => Promise<T> | T): Promise<T> {\n\t\tconst result = this.tail.then(operation);\n\t\tthis.tail = result.then(\n\t\t\t() => undefined,\n\t\t\t() => undefined,\n\t\t);\n\t\treturn result;\n\t}\n\n\tasync drain(): Promise<void> {\n\t\tawait this.tail;\n\t}\n}\n\nfunction resultOrThrow<T>(result: Result<T, FileError>, message: string): T {\n\tif (!result.ok) {\n\t\tconst code = result.error.code === \"not_found\" ? \"not_found\" : \"storage\";\n\t\tthrow new SessionError(code, `${message}: ${result.error.message}`, result.error);\n\t}\n\treturn result.value;\n}\n\nfunction getParentPath(path: string): string {\n\tconst normalized = path.replace(/[\\\\/]+$/, \"\");\n\tconst lastSlash = Math.max(normalized.lastIndexOf(\"/\"), normalized.lastIndexOf(\"\\\\\"));\n\tif (lastSlash < 0) return \".\";\n\tif (lastSlash === 0) return normalized.slice(0, 1);\n\treturn normalized.slice(0, lastSlash);\n}\n\nfunction configureSqliteDatabase(db: SqliteDatabase): void {\n\tsql`PRAGMA journal_mode=WAL`.exec(db);\n\tsql`PRAGMA synchronous=FULL`.exec(db);\n\tsql`PRAGMA busy_timeout=5000`.exec(db);\n}\n\nfunction timestampToText(timestamp: number): string {\n\treturn new Date(timestamp).toISOString();\n}\n\nfunction timestampFromText(timestamp: string): number {\n\treturn Date.parse(timestamp);\n}\n\nfunction entryRowFromCached(row: CachedBranchEntryRow): EntryRow {\n\treturn { ...row, seq: row.entry_seq, type: row.type as Entry[\"type\"] };\n}\n\nfunction readObjectPayload(row: EntryRow): Record<string, unknown> {\n\tconst payload = JSON.parse(row.payload) as unknown;\n\tif (typeof payload !== \"object\" || payload === null || Array.isArray(payload)) {\n\t\tthrow new Error(\"Payload is not an object\");\n\t}\n\treturn payload as Record<string, unknown>;\n}\n\nfunction decodeEntry(row: EntryRow): Entry {\n\ttry {\n\t\tconst payload = readObjectPayload(row);\n\t\tconst timestamp = timestampFromText(row.timestamp);\n\t\tif (!Number.isFinite(timestamp)) throw new Error(`Invalid timestamp ${row.timestamp}`);\n\t\tconst base = { id: row.id, seq: row.seq, parentId: row.parent_id, timestamp };\n\t\tswitch (row.type) {\n\t\t\tcase \"message\":\n\t\t\t\tif (typeof payload.message !== \"object\" || payload.message === null) throw new Error(\"Missing message\");\n\t\t\t\treturn {\n\t\t\t\t\t...base,\n\t\t\t\t\ttype: \"message\",\n\t\t\t\t\tmessage: payload.message as Extract<Entry, { type: \"message\" }>[\"message\"],\n\t\t\t\t\t...(payload.terminate === true ? { terminate: true as const } : {}),\n\t\t\t\t};\n\t\t\tcase \"model_change\":\n\t\t\t\tif (typeof payload.provider !== \"string\" || typeof payload.modelId !== \"string\") {\n\t\t\t\t\tthrow new Error(\"Invalid model_change payload\");\n\t\t\t\t}\n\t\t\t\treturn { ...base, type: \"model_change\", provider: payload.provider, modelId: payload.modelId };\n\t\t\tcase \"thinking_level_change\":\n\t\t\t\tif (typeof payload.thinkingLevel !== \"string\") throw new Error(\"Invalid thinking_level_change payload\");\n\t\t\t\treturn { ...base, type: \"thinking_level_change\", thinkingLevel: payload.thinkingLevel };\n\t\t\tcase \"active_tools_change\":\n\t\t\t\tif (!Array.isArray(payload.activeToolNames)) throw new Error(\"Invalid active_tools_change payload\");\n\t\t\t\tif (payload.activeToolNames.some((value) => typeof value !== \"string\")) {\n\t\t\t\t\tthrow new Error(\"Invalid active_tools_change payload\");\n\t\t\t\t}\n\t\t\t\treturn { ...base, type: \"active_tools_change\", activeToolNames: payload.activeToolNames };\n\t\t\tcase \"compaction\":\n\t\t\t\tif (\n\t\t\t\t\ttypeof payload.summary !== \"string\" ||\n\t\t\t\t\t!Array.isArray(payload.retainedTail) ||\n\t\t\t\t\ttypeof payload.tokensBefore !== \"number\"\n\t\t\t\t) {\n\t\t\t\t\tthrow new Error(\"Invalid compaction payload\");\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\t...base,\n\t\t\t\t\ttype: \"compaction\",\n\t\t\t\t\tsummary: payload.summary,\n\t\t\t\t\tretainedTail: payload.retainedTail as Extract<Entry, { type: \"compaction\" }>[\"retainedTail\"],\n\t\t\t\t\ttokensBefore: payload.tokensBefore,\n\t\t\t\t\t...(Object.hasOwn(payload, \"details\") ? { details: payload.details } : {}),\n\t\t\t\t\t...(Object.hasOwn(payload, \"usage\")\n\t\t\t\t\t\t? { usage: payload.usage as Extract<Entry, { type: \"compaction\" }>[\"usage\"] }\n\t\t\t\t\t\t: {}),\n\t\t\t\t};\n\t\t\tcase \"branch_summary\":\n\t\t\t\tif (typeof payload.fromId !== \"string\" || typeof payload.summary !== \"string\") {\n\t\t\t\t\tthrow new Error(\"Invalid branch_summary payload\");\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\t...base,\n\t\t\t\t\ttype: \"branch_summary\",\n\t\t\t\t\tfromId: payload.fromId,\n\t\t\t\t\tsummary: payload.summary,\n\t\t\t\t\t...(Object.hasOwn(payload, \"details\") ? { details: payload.details } : {}),\n\t\t\t\t\t...(Object.hasOwn(payload, \"usage\")\n\t\t\t\t\t\t? { usage: payload.usage as Extract<Entry, { type: \"branch_summary\" }>[\"usage\"] }\n\t\t\t\t\t\t: {}),\n\t\t\t\t};\n\t\t\tcase \"custom\":\n\t\t\t\tif (typeof payload.customType !== \"string\") throw new Error(\"Invalid custom payload\");\n\t\t\t\treturn {\n\t\t\t\t\t...base,\n\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\tcustomType: payload.customType,\n\t\t\t\t\t...(Object.hasOwn(payload, \"data\") ? { data: payload.data } : {}),\n\t\t\t\t};\n\t\t}\n\t} catch (error) {\n\t\tthrow new SessionError(\n\t\t\t\"invalid_entry\",\n\t\t\t`Invalid SQLite session entry ${row.id}: failed to decode entry ${row.id}`,\n\t\t\terror instanceof Error ? error : undefined,\n\t\t);\n\t}\n}\n\nfunction recordRunId(record: NewRecord): string | undefined {\n\treturn record.type === \"operation_started\" ? record.id : \"runId\" in record ? record.runId : undefined;\n}\n\nfunction recordOpKind(record: NewRecord): string | undefined {\n\treturn record.type === \"operation_started\" ? record.intent.kind : undefined;\n}\n\nfunction decodeRecord(row: { seq: number; timestamp: string; payload: string }): LaneRecord {\n\ttry {\n\t\tconst timestamp = timestampFromText(row.timestamp);\n\t\tif (!Number.isFinite(timestamp)) throw new Error(`Invalid timestamp ${row.timestamp}`);\n\t\treturn {\n\t\t\t...(JSON.parse(row.payload) as object),\n\t\t\tseq: row.seq,\n\t\t\ttimestamp,\n\t\t} as LaneRecord;\n\t} catch (error) {\n\t\tthrow new SessionError(\n\t\t\t\"storage\",\n\t\t\t`Invalid SQLite session record at sequence ${row.seq}: failed to decode payload`,\n\t\t\terror instanceof Error ? error : undefined,\n\t\t);\n\t}\n}\n\nfunction validateCachedBranchRows(rows: readonly CachedBranchEntryRow[], query: BranchBounds & EntryQuery): void {\n\tif (rows.length === 0 || query.type !== undefined || query.customType !== undefined) return;\n\tconst path = [...rows].sort((left, right) => left.entry_seq - right.entry_seq);\n\tconst shouldIncludeRoot =\n\t\tquery.stopAtId === undefined &&\n\t\tquery.stopAtType === undefined &&\n\t\tquery.cursor === undefined &&\n\t\t(query.order === \"oldestFirst\" || query.limit === undefined);\n\tif (shouldIncludeRoot && path[0]?.parent_id !== null) {\n\t\tthrow new SessionError(\"invalid_entry\", `Entry ${path[0]?.parent_id} not found`);\n\t}\n\tfor (let index = 1; index < path.length; index++) {\n\t\tconst previous = path[index - 1]!;\n\t\tconst current = path[index]!;\n\t\tif (current.parent_id !== previous.id) {\n\t\t\tthrow new SessionError(\"invalid_entry\", `Entry ${current.parent_id} not found`);\n\t\t}\n\t}\n}\n\nfunction matchesEntryQuery(entry: Entry, query: EntryQuery): boolean {\n\treturn (\n\t\t(query.type === undefined || entry.type === query.type) &&\n\t\t(query.customType === undefined || (entry.type === \"custom\" && entry.customType === query.customType)) &&\n\t\t(query.cursor === undefined ||\n\t\t\t(query.order === \"oldestFirst\" ? entry.seq > query.cursor.afterSeq : entry.seq < query.cursor.afterSeq))\n\t);\n}\n\nfunction assertUnusedId(db: SqliteDatabase, sessionId: string, id: string): void {\n\tif (idExistsInEntries(db, sessionId, id) || idExistsInRecords(db, sessionId, id)) {\n\t\tthrow new SessionError(\"already_exists\", `ID already exists: ${id}`);\n\t}\n}\n\nfunction requireSessionRow(db: SqliteDatabase, sessionId: string): SessionRow {\n\tconst row = readSessionRow(db, sessionId);\n\tif (!row) throw new SessionError(\"not_found\", `Session not found: ${sessionId}`);\n\treturn row;\n}\n\nclass SqliteSessionStorage implements SessionStorage<SqliteSessionMetadata> {\n\tprivate readonly db: SqliteDatabase;\n\tprivate readonly metadata: SqliteSessionMetadata;\n\tprivate readonly lease: WriterLease;\n\tprivate readonly leaseOptions: ResolvedWriterLeaseOptions;\n\tprivate readonly onRelease: () => void;\n\tprivate readonly operations = new SerialOperationQueue();\n\tprivate heartbeatTimer: ReturnType<typeof setTimeout> | undefined;\n\tprivate leaseError: SessionError | undefined;\n\tprivate closing = false;\n\tprivate releasePromise: Promise<void> | undefined;\n\n\tconstructor(\n\t\tdb: SqliteDatabase,\n\t\tmetadata: SqliteSessionMetadata,\n\t\tlease: WriterLease,\n\t\tleaseOptions: ResolvedWriterLeaseOptions,\n\t\tonRelease: () => void,\n\t) {\n\t\tthis.db = db;\n\t\tthis.metadata = metadata;\n\t\tthis.lease = lease;\n\t\tthis.leaseOptions = leaseOptions;\n\t\tthis.onRelease = onRelease;\n\t\tthis.scheduleHeartbeat();\n\t}\n\n\tasync release(): Promise<void> {\n\t\tthis.releasePromise ??= this.finishRelease();\n\t\tawait this.releasePromise;\n\t}\n\n\tprivate async finishRelease(): Promise<void> {\n\t\tthis.closing = true;\n\t\tif (this.heartbeatTimer !== undefined) clearTimeout(this.heartbeatTimer);\n\t\ttry {\n\t\t\tawait this.operations.enqueue(() =>\n\t\t\t\tthis.db.transaction(() => releaseWriterLease(this.db, this.metadata.id, this.lease)),\n\t\t\t);\n\t\t} finally {\n\t\t\tthis.onRelease();\n\t\t}\n\t}\n\n\tprivate enqueueWrite<T>(operation: () => T): Promise<T> {\n\t\tif (this.closing)\n\t\t\treturn Promise.reject(new SessionError(\"storage\", `SQLite session ${this.metadata.id} is closed`));\n\t\treturn this.operations.enqueue(() => {\n\t\t\tif (this.leaseError) throw this.leaseError;\n\t\t\treturn this.db.transaction(() => {\n\t\t\t\tconst now = Date.now();\n\t\t\t\tif (!renewWriterLease(this.db, this.metadata.id, this.lease, now, now + this.leaseOptions.ttlMs)) {\n\t\t\t\t\tthis.leaseError = lostWriterError(this.metadata.id);\n\t\t\t\t\tif (this.heartbeatTimer !== undefined) clearTimeout(this.heartbeatTimer);\n\t\t\t\t\tthrow this.leaseError;\n\t\t\t\t}\n\t\t\t\treturn operation();\n\t\t\t});\n\t\t});\n\t}\n\n\tprivate scheduleHeartbeat(): void {\n\t\tif (this.closing || this.leaseError) return;\n\t\tthis.heartbeatTimer = setTimeout(async () => {\n\t\t\tthis.heartbeatTimer = undefined;\n\t\t\ttry {\n\t\t\t\tawait this.operations.enqueue(() => {\n\t\t\t\t\tif (this.closing || this.leaseError) return;\n\t\t\t\t\tthis.db.transaction(() => {\n\t\t\t\t\t\tconst now = Date.now();\n\t\t\t\t\t\tif (!renewWriterLease(this.db, this.metadata.id, this.lease, now, now + this.leaseOptions.ttlMs)) {\n\t\t\t\t\t\t\tthis.leaseError = lostWriterError(this.metadata.id);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t} catch {\n\t\t\t\t// A transient heartbeat failure is retried. Every write still verifies ownership transactionally.\n\t\t\t} finally {\n\t\t\t\tthis.scheduleHeartbeat();\n\t\t\t}\n\t\t}, this.leaseOptions.heartbeatIntervalMs);\n\t\tthis.heartbeatTimer.unref();\n\t}\n\n\tasync getMetadata(): Promise<SqliteSessionMetadata> {\n\t\treturn decodeSessionMetadata(requireSessionRow(this.db, this.metadata.id), this.metadata.path);\n\t}\n\n\tisForSession(sessionId: string): boolean {\n\t\treturn this.metadata.id === sessionId;\n\t}\n\n\tasync getLanes(): Promise<{ lane: string; leafId: string | null }[]> {\n\t\treturn readLanes(this.db, this.metadata.id).map((row) => ({ lane: row.lane, leafId: row.leaf_id }));\n\t}\n\n\tasync createLane(lane: string, at: string | null): Promise<void> {\n\t\treturn this.enqueueWrite(() => {\n\t\t\tif (readLane(this.db, this.metadata.id, lane)) {\n\t\t\t\tthrow new SessionError(\"already_exists\", `Lane already exists: ${lane}`);\n\t\t\t}\n\t\t\tif (at !== null && !readEntryRow(this.db, this.metadata.id, at)) {\n\t\t\t\tthrow new SessionError(\"not_found\", `Entry not found: ${at}`);\n\t\t\t}\n\t\t\tconst seq = getNextSequence(this.db, this.metadata.id);\n\t\t\tinsertLane(this.db, this.metadata.id, seq, lane, at);\n\t\t\tadvanceSequence(this.db, this.metadata.id, seq);\n\t\t});\n\t}\n\n\tasync moveLane(lane: string, to: string | null): Promise<void> {\n\t\treturn this.enqueueWrite(() => {\n\t\t\tif (!readLane(this.db, this.metadata.id, lane))\n\t\t\t\tthrow new SessionError(\"invalid_lane\", `Lane not found: ${lane}`);\n\t\t\tif (to !== null && !readEntryRow(this.db, this.metadata.id, to)) {\n\t\t\t\tthrow new SessionError(\"not_found\", `Entry not found: ${to}`);\n\t\t\t}\n\t\t\tconst seq = getNextSequence(this.db, this.metadata.id);\n\t\t\tupdateLane(this.db, this.metadata.id, seq, lane, to);\n\t\t\tadvanceSequence(this.db, this.metadata.id, seq);\n\t\t});\n\t}\n\n\tasync appendEntry<TEntry extends Entry>(entry: ProvisionedEntry<TEntry>, lane: string): Promise<TEntry> {\n\t\treturn this.enqueueWrite(() => {\n\t\t\tconst parentId = readLaneHead(this.db, this.metadata.id, lane).leafId;\n\t\t\tassertUnusedId(this.db, this.metadata.id, entry.id);\n\t\t\tconst seq = getNextSequence(this.db, this.metadata.id);\n\t\t\tconst committed = { ...entry, parentId, seq, timestamp: Date.now() } as Entry;\n\t\t\tinsertEntryRow(this.db, this.metadata.id, {\n\t\t\t\tseq,\n\t\t\t\tid: committed.id,\n\t\t\t\tparentId: committed.parentId,\n\t\t\t\ttype: committed.type,\n\t\t\t\ttimestamp: timestampToText(committed.timestamp),\n\t\t\t\tpayload: JSON.stringify(entryPayload(committed)),\n\t\t\t});\n\t\t\tsetLaneLeaf(this.db, this.metadata.id, lane, committed.id);\n\t\t\tappendEntryToBranchCache(\n\t\t\t\tthis.db,\n\t\t\t\tthis.metadata.id,\n\t\t\t\tcommitted.id,\n\t\t\t\tseq,\n\t\t\t\tcommitted.type,\n\t\t\t\tcommitted.type === \"custom\" ? committed.customType : null,\n\t\t\t\tcommitted.parentId,\n\t\t\t);\n\t\t\tif (committed.type === \"message\") incrementMessageCount(this.db, this.metadata.id);\n\t\t\tadvanceSequence(this.db, this.metadata.id, seq);\n\t\t\treturn structuredClone(committed as TEntry);\n\t\t});\n\t}\n\n\tasync appendRecord<TRecord extends LaneRecord>(record: NewRecord<TRecord>): Promise<TRecord>;\n\tasync appendRecord(record: NewRecord): Promise<LaneRecord> {\n\t\treturn this.enqueueWrite(() => {\n\t\t\tif (!readLane(this.db, this.metadata.id, record.lane)) {\n\t\t\t\tthrow new SessionError(\"invalid_lane\", `Lane not found: ${record.lane}`);\n\t\t\t}\n\t\t\tassertUnusedId(this.db, this.metadata.id, record.id);\n\t\t\tconst seq = getNextSequence(this.db, this.metadata.id);\n\t\t\tconst committed: LaneRecord = { ...record, seq, timestamp: Date.now() };\n\t\t\tif (record.type === \"operation_started\") {\n\t\t\t\tstartLaneOperation(this.db, this.metadata.id, record.lane, record.id);\n\t\t\t}\n\t\t\tappendRecordRow(this.db, this.metadata.id, {\n\t\t\t\tseq,\n\t\t\t\tid: record.id,\n\t\t\t\tlane: record.lane,\n\t\t\t\trunId: recordRunId(record),\n\t\t\t\ttype: record.type,\n\t\t\t\topKind: recordOpKind(record),\n\t\t\t\ttimestamp: timestampToText(committed.timestamp),\n\t\t\t\tpayload: JSON.stringify(record),\n\t\t\t});\n\t\t\tif (record.type === \"operation_finished\") {\n\t\t\t\tfinishLaneOperation(this.db, this.metadata.id, record.lane, record.runId);\n\t\t\t}\n\t\t\tif (record.type === \"usage\") addUsageToStats(this.db, this.metadata.id, record.usage);\n\t\t\tadvanceSequence(this.db, this.metadata.id, seq);\n\t\t\treturn structuredClone(committed);\n\t\t});\n\t}\n\n\tasync getEntry(id: string): Promise<Entry | undefined> {\n\t\tconst row = readEntryRow(this.db, this.metadata.id, id);\n\t\treturn row ? decodeEntry(row) : undefined;\n\t}\n\n\tasync findEntries(query: EntryQuery = {}): Promise<Entry[]> {\n\t\tconst rows = readEntryRows(this.db, this.metadata.id, { order: query.order });\n\t\tconst entries = rows.map(decodeEntry).filter((entry) => matchesEntryQuery(entry, query));\n\t\treturn query.limit === undefined ? entries : entries.slice(0, query.limit);\n\t}\n\n\tasync findEntriesOnBranch(query: EntryQuery & BranchBounds & { start: string }): Promise<Entry[]> {\n\t\tconst cached = readCachedBranch(this.db, this.metadata.id, query.start);\n\t\tif (!cached) {\n\t\t\tif (!readEntryRow(this.db, this.metadata.id, query.start))\n\t\t\t\tthrow new SessionError(\"not_found\", `Entry not found: ${query.start}`);\n\t\t\tthrow new SessionError(\"invalid_entry\", `Branch cache missing entry ${query.start}`);\n\t\t}\n\t\tconst rows = queryCachedBranchRows(this.db, this.metadata.id, cached, query);\n\t\tvalidateCachedBranchRows(rows, query);\n\t\tconst entries = rows\n\t\t\t.map(entryRowFromCached)\n\t\t\t.map(decodeEntry)\n\t\t\t.filter((entry) => matchesEntryQuery(entry, query));\n\t\treturn query.limit === undefined ? entries : entries.slice(0, query.limit);\n\t}\n\n\tasync findRecords(query: RecordQuery = {}): Promise<LaneRecord[]> {\n\t\tconst rows = readRecordRows(this.db, this.metadata.id, query);\n\t\treturn rows.map(decodeRecord);\n\t}\n\n\tasync findOpenOperations(lane: string, options?: { limit?: number }): Promise<OperationStartedRecord[]> {\n\t\tconst rows = readOpenOperationRows(this.db, this.metadata.id, lane, options);\n\n\t\treturn rows.map((row) => {\n\t\t\tconst record = decodeRecord(row);\n\t\t\tif (record.type !== \"operation_started\") {\n\t\t\t\tthrow new SessionError(\"storage\", \"Expected operation_started record\");\n\t\t\t}\n\t\t\treturn record;\n\t\t});\n\t}\n\n\tasync getLog(options: LogOptions = {}): Promise<LogItem[]> {\n\t\tconst afterSeq = options.afterSeq ?? 0;\n\t\tconst limit = options.limit;\n\t\tconst entryRows = readEntryRows(this.db, this.metadata.id, { afterSeq, order: \"oldestFirst\", limit });\n\t\tconst recordRows = readRecordRows(this.db, this.metadata.id, { afterSeq, order: \"oldestFirst\", limit });\n\t\tconst laneRows = readLaneMoveRows(this.db, this.metadata.id, { afterSeq, limit });\n\t\tconst factRows = readFactRows(this.db, this.metadata.id, { afterSeq, limit });\n\n\t\tconst logRows: { seq: number; decode: () => LogItem }[] = [\n\t\t\t...entryRows.map((row) => ({\n\t\t\t\tseq: row.seq,\n\t\t\t\tdecode: () => ({ kind: \"entry\" as const, seq: row.seq, entry: decodeEntry(row) }),\n\t\t\t})),\n\t\t\t...recordRows.map((row) => ({\n\t\t\t\tseq: row.seq,\n\t\t\t\tdecode: () => ({ kind: \"record\" as const, seq: row.seq, record: decodeRecord(row) }),\n\t\t\t})),\n\t\t\t...laneRows.map((row) => ({\n\t\t\t\tseq: row.seq,\n\t\t\t\tdecode: () => ({ kind: \"lane\" as const, seq: row.seq, lane: row.lane, leafId: row.leaf_id }),\n\t\t\t})),\n\t\t\t...factRows.map((row) => ({\n\t\t\t\tseq: row.seq,\n\t\t\t\tdecode: () => {\n\t\t\t\t\tif (row.kind === \"name\")\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tkind: \"fact\" as const,\n\t\t\t\t\t\t\tseq: row.seq,\n\t\t\t\t\t\t\tfact: \"name\" as const,\n\t\t\t\t\t\t\tname: JSON.parse(row.value ?? \"null\") as string,\n\t\t\t\t\t\t};\n\t\t\t\t\treturn {\n\t\t\t\t\t\tkind: \"fact\" as const,\n\t\t\t\t\t\tseq: row.seq,\n\t\t\t\t\t\tfact: \"label\" as const,\n\t\t\t\t\t\ttargetId: row.key ?? \"\",\n\t\t\t\t\t\tlabel: row.value === null ? undefined : (JSON.parse(row.value) as string),\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t})),\n\t\t].sort((left, right) => left.seq - right.seq);\n\t\tconst selectedRows = options.limit === undefined ? logRows : logRows.slice(0, options.limit);\n\t\treturn selectedRows.map((row) => row.decode());\n\t}\n\n\tasync getName(): Promise<string | undefined> {\n\t\tconst row = readLatestFact(this.db, this.metadata.id, \"name\", null);\n\t\treturn row?.value === undefined || row.value === null ? undefined : (JSON.parse(row.value) as string);\n\t}\n\n\tasync setName(name: string): Promise<void> {\n\t\treturn this.enqueueWrite(() => {\n\t\t\tconst seq = getNextSequence(this.db, this.metadata.id);\n\t\t\tappendFact(this.db, this.metadata.id, seq, \"name\", null, JSON.stringify(name));\n\t\t\tadvanceSequence(this.db, this.metadata.id, seq);\n\t\t});\n\t}\n\n\tasync getLabel(id: string): Promise<string | undefined> {\n\t\tconst row = readLatestFact(this.db, this.metadata.id, \"label\", id);\n\t\treturn row?.value === undefined || row.value === null ? undefined : (JSON.parse(row.value) as string);\n\t}\n\n\tasync setLabel(id: string, label: string | undefined): Promise<void> {\n\t\treturn this.enqueueWrite(() => {\n\t\t\tif (!readEntryRow(this.db, this.metadata.id, id)) {\n\t\t\t\tthrow new SessionError(\"not_found\", `Entry not found: ${id}`);\n\t\t\t}\n\t\t\tconst seq = getNextSequence(this.db, this.metadata.id);\n\t\t\tappendFact(this.db, this.metadata.id, seq, \"label\", id, label === undefined ? null : JSON.stringify(label));\n\t\t\tadvanceSequence(this.db, this.metadata.id, seq);\n\t\t});\n\t}\n\n\tasync getStats(): Promise<SessionStats> {\n\t\treturn readStats(this.db, this.metadata.id);\n\t}\n}\n\nfunction claimStorage(\n\tdb: SqliteDatabase,\n\tmetadata: SqliteSessionMetadata,\n\tleaseOptions: ResolvedWriterLeaseOptions,\n\tonRelease: () => void,\n): SqliteSessionStorage {\n\trequireSessionRow(db, metadata.id);\n\tconst claimed = db.transaction(() => {\n\t\tconst lease = claimWriterLease(db, metadata.id, leaseOptions);\n\t\tconst row = requireSessionRow(db, metadata.id);\n\t\treadLanes(db, metadata.id);\n\t\treturn { lease, row };\n\t});\n\treturn new SqliteSessionStorage(\n\t\tdb,\n\t\tdecodeSessionMetadata(claimed.row, metadata.path),\n\t\tclaimed.lease,\n\t\tleaseOptions,\n\t\tonRelease,\n\t);\n}\n\nexport class SqliteSessionRepository\n\timplements\n\t\tSessionRepository<SqliteSessionMetadata, SqliteSessionCreateOptions, SqliteSessionListOptions>,\n\t\tAsyncDisposable\n{\n\tprivate databasePath: string | undefined;\n\tprivate database: SqliteDatabase | undefined;\n\tprivate databasePromise: Promise<SqliteDatabase> | undefined;\n\tprivate readonly operations = new SerialOperationQueue();\n\tprivate readonly activeStorages = new Set<SqliteSessionStorage>();\n\tprivate readonly options: SqliteSessionRepositoryOptions;\n\tprivate readonly leaseOptions: ResolvedWriterLeaseOptions;\n\n\tconstructor(options: SqliteSessionRepositoryOptions) {\n\t\tthis.options = options;\n\t\tthis.leaseOptions = resolveWriterLeaseOptions(options.writerLease);\n\t}\n\n\tprivate async releaseStoragesForSession(sessionId: string): Promise<void> {\n\t\tfor (const storage of [...this.activeStorages]) {\n\t\t\tif (storage.isForSession(sessionId)) await storage.release();\n\t\t}\n\t}\n\n\tprivate sessionFromLease(\n\t\tdb: SqliteDatabase,\n\t\tmetadata: SqliteSessionMetadata,\n\t\tlease: WriterLease,\n\t): Session<SqliteSessionMetadata> {\n\t\tlet storage: SqliteSessionStorage;\n\t\tstorage = new SqliteSessionStorage(db, metadata, lease, this.leaseOptions, () => {\n\t\t\tthis.activeStorages.delete(storage);\n\t\t});\n\t\tthis.activeStorages.add(storage);\n\t\treturn new Session(storage);\n\t}\n\n\tprivate claimSession(db: SqliteDatabase, metadata: SqliteSessionMetadata): Session<SqliteSessionMetadata> {\n\t\tconst active = [...this.activeStorages].find((storage) => storage.isForSession(metadata.id));\n\t\tif (active) {\n\t\t\treadLanes(db, metadata.id);\n\t\t\treturn new Session(active);\n\t\t}\n\t\tlet storage: SqliteSessionStorage;\n\t\tstorage = claimStorage(db, metadata, this.leaseOptions, () => {\n\t\t\tthis.activeStorages.delete(storage);\n\t\t});\n\t\tthis.activeStorages.add(storage);\n\t\treturn new Session(storage);\n\t}\n\n\tasync create(options: SqliteSessionCreateOptions): Promise<Session<SqliteSessionMetadata>> {\n\t\treturn this.operations.enqueue(async () => {\n\t\t\tconst db = await this.getDatabase();\n\t\t\tconst path = await this.getDatabasePath();\n\t\t\tconst id = options.id ?? uuidv7();\n\t\t\tif (sessionExists(db, id)) throw new SessionError(\"already_exists\", `Session already exists: ${id}`);\n\t\t\tconst createdAt = Date.now();\n\t\t\tconst lease = db.transaction(() => {\n\t\t\t\tinsertSessionRow(db, {\n\t\t\t\t\tid,\n\t\t\t\t\tcreatedAt: timestampToText(createdAt),\n\t\t\t\t\tcwd: options.cwd,\n\t\t\t\t\tparentSessionId: options.parentSessionId,\n\t\t\t\t\tmetadata: options.metadata,\n\t\t\t\t});\n\t\t\t\tcreateSequence(db, id);\n\t\t\t\tcreateStats(db, id);\n\t\t\t\tcreateInitialLane(db, id);\n\t\t\t\treturn claimWriterLease(db, id, this.leaseOptions);\n\t\t\t});\n\t\t\tconst row = requireSessionRow(db, id);\n\t\t\treturn this.sessionFromLease(db, decodeSessionMetadata(row, path), lease);\n\t\t});\n\t}\n\n\tasync open(metadata: SqliteSessionMetadata): Promise<Session<SqliteSessionMetadata>> {\n\t\treturn this.operations.enqueue(async () => this.claimSession(await this.getDatabase(), metadata));\n\t}\n\n\t/** Rebuilds this session's private branch-read cache from canonical entry parent links. */\n\tasync repairBranchCache(metadata: SqliteSessionMetadata): Promise<void> {\n\t\treturn this.operations.enqueue(async () => {\n\t\t\tawait this.releaseStoragesForSession(metadata.id);\n\t\t\tconst db = await this.getDatabase();\n\t\t\tdb.transaction(() => {\n\t\t\t\tconst lease = claimWriterLease(db, metadata.id, this.leaseOptions);\n\t\t\t\trequireSessionRow(db, metadata.id);\n\t\t\t\trebuildBranchCache(db, metadata.id);\n\t\t\t\treleaseWriterLease(db, metadata.id, lease);\n\t\t\t});\n\t\t});\n\t}\n\n\t/** Reads the session catalog without acquiring or renewing per-session writer leases. */\n\tasync list(options: SqliteSessionListOptions = {}): Promise<SqliteSessionMetadata[]> {\n\t\treturn this.operations.enqueue(async () => {\n\t\t\tconst path = await this.getDatabasePath();\n\t\t\tif (!resultOrThrow(await this.options.env.exists(path), `Failed to check database ${path}`)) return [];\n\t\t\tconst db = await this.getDatabase();\n\t\t\tconst rows = readSessionRows(db, options);\n\t\t\treturn rows.map((row) => decodeSessionMetadata(row, path));\n\t\t});\n\t}\n\n\tasync delete(metadata: SqliteSessionMetadata): Promise<void> {\n\t\treturn this.operations.enqueue(async () => {\n\t\t\tawait this.releaseStoragesForSession(metadata.id);\n\t\t\tconst db = await this.getDatabase();\n\t\t\tdb.transaction(() => {\n\t\t\t\tif (!sessionExists(db, metadata.id)) {\n\t\t\t\t\tdeleteWriterLease(db, metadata.id);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tclaimWriterLease(db, metadata.id, this.leaseOptions);\n\t\t\t\tdeleteBranchCache(db, metadata.id);\n\t\t\t\tdeleteFactRows(db, metadata.id);\n\t\t\t\tdeleteLaneRows(db, metadata.id);\n\t\t\t\tdeleteRecordRows(db, metadata.id);\n\t\t\t\tdeleteEntryRows(db, metadata.id);\n\t\t\t\tdeleteWriterLease(db, metadata.id);\n\t\t\t\tdeleteStats(db, metadata.id);\n\t\t\t\tdeleteSequence(db, metadata.id);\n\t\t\t\tdeleteSessionRow(db, metadata.id);\n\t\t\t});\n\t\t});\n\t}\n\n\tasync fork(\n\t\tsource: SqliteSessionMetadata,\n\t\toptions: ForkOptions & SqliteSessionCreateOptions,\n\t): Promise<Session<SqliteSessionMetadata>> {\n\t\treturn this.operations.enqueue(async () => {\n\t\t\tconst db = await this.getDatabase();\n\t\t\tconst path = await this.getDatabasePath();\n\t\t\tconst sourceMetadata = decodeSessionMetadata(requireSessionRow(db, source.id), path);\n\t\t\tconst id = options.id ?? uuidv7();\n\t\t\tif (sessionExists(db, id)) throw new SessionError(\"already_exists\", `Session already exists: ${id}`);\n\n\t\t\tconst entries: EntryRow[] = [];\n\t\t\tconst lanes: { lane: string; leafId: string | null }[] = [];\n\t\t\tconst branchTips: string[] = [];\n\t\t\tlet branchForkTargetId: string | null = null;\n\n\t\t\tif (options.scope === \"tree\") {\n\t\t\t\tentries.push(...readEntryRows(db, source.id, { order: \"oldestFirst\" }));\n\t\t\t\tlanes.push(...readLanes(db, source.id).map((row) => ({ lane: row.lane, leafId: row.leaf_id })));\n\t\t\t\tbranchTips.push(...readBranchTipIds(db, source.id));\n\t\t\t} else {\n\t\t\t\tconst main = readLane(db, source.id, \"main\");\n\t\t\t\tif (!main) throw new SessionError(\"invalid_lane\", \"Lane not found: main\");\n\t\t\t\tconst selectedEntryId = options.entryId ?? main.leaf_id;\n\t\t\t\tif (selectedEntryId !== null) {\n\t\t\t\t\tconst target = readEntryRow(db, source.id, selectedEntryId);\n\t\t\t\t\tif (!target || target.type !== \"message\") {\n\t\t\t\t\t\tthrow new SessionError(\n\t\t\t\t\t\t\t\"invalid_fork_target\",\n\t\t\t\t\t\t\t`Fork target is not a message entry: ${selectedEntryId}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tconst position = options.position ?? (options.entryId === undefined ? \"at\" : \"before\");\n\t\t\t\t\tbranchForkTargetId = position === \"at\" ? target.id : target.parent_id;\n\t\t\t\t}\n\t\t\t\tlanes.push({ lane: \"main\", leafId: branchForkTargetId });\n\t\t\t\tif (branchForkTargetId !== null) {\n\t\t\t\t\tconst cached = readCachedBranch(db, source.id, branchForkTargetId);\n\t\t\t\t\tif (!cached) {\n\t\t\t\t\t\tthrow new SessionError(\n\t\t\t\t\t\t\t\"invalid_fork_target\",\n\t\t\t\t\t\t\t`Fork target is not on a cached branch: ${branchForkTargetId}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tconst rows = queryCachedBranchRows(db, source.id, cached, { order: \"oldestFirst\" });\n\t\t\t\t\tentries.push(...rows.map(entryRowFromCached));\n\t\t\t\t\tbranchTips.push(branchForkTargetId);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst copiedIds = new Set(entries.map((entry) => entry.id));\n\t\t\tconst latestName = readLatestFact(db, source.id, \"name\", null);\n\t\t\tconst latestLabels = readLatestLabelFacts(db, source.id);\n\t\t\tconst labelsToCopy = latestLabels.filter(\n\t\t\t\t(row) => options.scope === \"tree\" || (row.key !== null && copiedIds.has(row.key)),\n\t\t\t);\n\t\t\tconst createdAt = Date.now();\n\t\t\tconst metadata = options.metadata ?? sourceMetadata.metadata;\n\t\t\tlet lease: WriterLease;\n\n\t\t\ttry {\n\t\t\t\tlease = db.transaction(() => {\n\t\t\t\t\tinsertSessionRow(db, {\n\t\t\t\t\t\tid,\n\t\t\t\t\t\tcreatedAt: timestampToText(createdAt),\n\t\t\t\t\t\tcwd: options.cwd,\n\t\t\t\t\t\tparentSessionId: options.parentSessionId ?? source.id,\n\t\t\t\t\t\tmetadata,\n\t\t\t\t\t});\n\t\t\t\t\tcreateSequence(db, id);\n\t\t\t\t\tcreateStats(db, id, entries.filter((entry) => entry.type === \"message\").length);\n\n\t\t\t\t\tlet nextSeq = 1;\n\t\t\t\t\tconst allocateSeq = () => nextSeq++;\n\t\t\t\t\tfor (const entry of entries) {\n\t\t\t\t\t\tinsertEntryRow(db, id, {\n\t\t\t\t\t\t\tseq: allocateSeq(),\n\t\t\t\t\t\t\tid: entry.id,\n\t\t\t\t\t\t\tparentId: entry.parent_id,\n\t\t\t\t\t\t\ttype: entry.type,\n\t\t\t\t\t\t\ttimestamp: entry.timestamp,\n\t\t\t\t\t\t\tpayload: entry.payload,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (options.scope === \"tree\") {\n\t\t\t\t\t\tfor (const lane of lanes) insertLane(db, id, allocateSeq(), lane.lane, lane.leafId);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcreateInitialLane(db, id, \"main\", branchForkTargetId);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (latestName?.value !== undefined && latestName.value !== null) {\n\t\t\t\t\t\tappendFact(db, id, allocateSeq(), \"name\", null, latestName.value);\n\t\t\t\t\t}\n\t\t\t\t\tfor (const label of labelsToCopy) appendFact(db, id, allocateSeq(), \"label\", label.key, label.value);\n\n\t\t\t\t\tsetNextSequence(db, id, nextSeq);\n\t\t\t\t\tfor (const tip of branchTips) buildCachedBranch(db, id, tip);\n\t\t\t\t\treturn claimWriterLease(db, id, this.leaseOptions);\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof SessionError) throw error;\n\t\t\t\tthrow new SessionError(\n\t\t\t\t\t\"storage\",\n\t\t\t\t\t`Failed to fork SQLite session ${id}`,\n\t\t\t\t\terror instanceof Error ? error : undefined,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst row = requireSessionRow(db, id);\n\t\t\treturn this.sessionFromLease(db, decodeSessionMetadata(row, path), lease);\n\t\t});\n\t}\n\n\tasync close(): Promise<void> {\n\t\tawait this.operations.drain();\n\t\tfor (const storage of [...this.activeStorages]) await storage.release();\n\t\tif (this.database) this.database.close();\n\t\tthis.database = undefined;\n\t\tthis.databasePromise = undefined;\n\t}\n\n\tasync [Symbol.asyncDispose](): Promise<void> {\n\t\tawait this.close();\n\t}\n\n\tprivate async getDatabasePath(): Promise<string> {\n\t\tthis.databasePath ??= resultOrThrow(\n\t\t\tawait this.options.env.absolutePath(this.options.databasePath),\n\t\t\t`Failed to resolve SQLite sessions database ${this.options.databasePath}`,\n\t\t);\n\t\treturn this.databasePath;\n\t}\n\n\tprivate async getDatabase(): Promise<SqliteDatabase> {\n\t\tif (!this.databasePromise) this.databasePromise = this.openDatabase();\n\t\tthis.database = await this.databasePromise;\n\t\treturn this.database;\n\t}\n\n\tprivate async openDatabase(): Promise<SqliteDatabase> {\n\t\tconst path = await this.getDatabasePath();\n\t\tresultOrThrow(\n\t\t\tawait this.options.env.createDir(getParentPath(path), { recursive: true }),\n\t\t\t`Failed to create SQLite sessions directory ${path}`,\n\t\t);\n\t\tconst db = await this.options.sqlite.open(path);\n\t\ttry {\n\t\t\tconfigureSqliteDatabase(db);\n\t\t\tawait applyMigrations(db);\n\t\t\treturn db;\n\t\t} catch (error) {\n\t\t\tdb.close();\n\t\t\tthrow error;\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"repo.js","sourceRoot":"","sources":["../../src/sqlite/repo.ts"],"names":[],"mappings":"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","sourcesContent":["import type { FileError, Result } from \"@earendil-works/pi-agent-core\";\nimport {\n\ttype BranchBounds,\n\ttype Entry,\n\ttype EntryQuery,\n\ttype ForkOptions,\n\ttype LaneRecord,\n\ttype LogItem,\n\ttype LogOptions,\n\ttype NewRecord,\n\ttype OperationStartedRecord,\n\ttype ProvisionedEntry,\n\ttype RecordQuery,\n\tSession,\n\tSessionError,\n\ttype SessionRepo as SessionRepository,\n\ttype SessionStats,\n\ttype SessionStorage,\n} from \"@earendil-works/pi-agent-core\";\nimport { uuidv7 } from \"@earendil-works/pi-ai\";\nimport { appendEntryToBranchCache, buildCachedBranch, deleteBranchCache, rebuildBranchCache } from \"./branch-cache.ts\";\nimport { applyMigrations } from \"./migrations.ts\";\nimport { sql } from \"./sql.ts\";\nimport { type CachedBranchEntryRow, queryCachedBranchRows, readCachedBranch } from \"./storage/branch-entries.ts\";\nimport { readBranchTipIds } from \"./storage/branch-tips.ts\";\nimport {\n\tdeleteEntryRows,\n\ttype EntryRow,\n\tentryPayload,\n\tidExistsInEntries,\n\tinsertEntryRow,\n\treadEntryRow,\n\treadEntryRows,\n} from \"./storage/entries.ts\";\nimport { appendFact, deleteFactRows, readFactRows, readLatestFact, readLatestLabelFacts } from \"./storage/facts.ts\";\nimport {\n\tcreateInitialLane,\n\tdeleteLaneRows,\n\tfinishLaneOperation,\n\tcreateLane as insertLane,\n\treadLane,\n\treadLaneHead,\n\treadLaneMoveRows,\n\treadLanes,\n\tsetLaneLeaf,\n\tstartLaneOperation,\n\tmoveLane as updateLane,\n} from \"./storage/lanes.ts\";\nimport {\n\tappendRecordRow,\n\tdeleteRecordRows,\n\tidExistsInRecords,\n\treadOpenOperationRows,\n\treadRecordRows,\n} from \"./storage/records.ts\";\nimport {\n\tadvanceSequence,\n\tcreateSequence,\n\tdeleteSequence,\n\tgetNextSequence,\n\tsetNextSequence,\n} from \"./storage/session-sequences.ts\";\nimport {\n\taddUsageToStats,\n\tcreateStats,\n\tdeleteStats,\n\tincrementMessageCount,\n\treadStats,\n} from \"./storage/session-stats.ts\";\nimport {\n\tdecodeSessionMetadata,\n\tdeleteSessionRow,\n\tinsertSessionRow,\n\treadSessionRow,\n\treadSessionRows,\n\ttype SessionRow,\n\tsessionExists,\n} from \"./storage/sessions.ts\";\nimport {\n\tacquireWriterLease,\n\tdeleteWriterLease,\n\treleaseWriterLease,\n\trenewWriterLease,\n\ttype WriterLease,\n} from \"./storage/writer-leases.ts\";\nimport type {\n\tSqliteDatabase,\n\tSqliteDatabaseFactory,\n\tSqliteSessionCreateOptions,\n\tSqliteSessionListOptions,\n\tSqliteSessionMetadata,\n\tSqliteSessionRepositoryEnv,\n} from \"./types.ts\";\n\nexport interface SqliteWriterLeaseOptions {\n\t/** Time without a successful heartbeat before another writer may take over. Default: 30 seconds. */\n\tttlMs?: number;\n\t/** Idle heartbeat cadence. Default: 10 seconds. Must be less than ttlMs. */\n\theartbeatIntervalMs?: number;\n}\n\nexport interface SqliteSessionRepositoryOptions {\n\tenv: SqliteSessionRepositoryEnv;\n\tsqlite: SqliteDatabaseFactory;\n\tdatabasePath: string;\n\twriterLease?: SqliteWriterLeaseOptions;\n}\n\ninterface ResolvedWriterLeaseOptions {\n\tttlMs: number;\n\theartbeatIntervalMs: number;\n}\n\nfunction resolveWriterLeaseOptions(options: SqliteWriterLeaseOptions | undefined): ResolvedWriterLeaseOptions {\n\tconst ttlMs = options?.ttlMs ?? 30_000;\n\tconst heartbeatIntervalMs = options?.heartbeatIntervalMs ?? 10_000;\n\tif (!Number.isSafeInteger(ttlMs) || ttlMs <= 0) throw new RangeError(\"writerLease.ttlMs must be positive\");\n\tif (!Number.isSafeInteger(heartbeatIntervalMs) || heartbeatIntervalMs <= 0 || heartbeatIntervalMs >= ttlMs) {\n\t\tthrow new RangeError(\"writerLease.heartbeatIntervalMs must be positive and less than ttlMs\");\n\t}\n\treturn { ttlMs, heartbeatIntervalMs };\n}\n\nfunction activeWriterError(sessionId: string): SessionError {\n\treturn new SessionError(\"storage\", `SQLite session ${sessionId} already has an active writer`);\n}\n\nfunction lostWriterError(sessionId: string): SessionError {\n\treturn new SessionError(\"storage\", `SQLite session ${sessionId} writer lease was lost`);\n}\n\nfunction claimWriterLease(db: SqliteDatabase, sessionId: string, options: ResolvedWriterLeaseOptions): WriterLease {\n\tconst now = Date.now();\n\tconst lease = acquireWriterLease(db, sessionId, uuidv7(), now, now + options.ttlMs);\n\tif (!lease) throw activeWriterError(sessionId);\n\treturn lease;\n}\n\nclass SerialOperationQueue {\n\tprivate tail: Promise<void> = Promise.resolve();\n\n\tenqueue<T>(operation: () => Promise<T> | T): Promise<T> {\n\t\tconst result = this.tail.then(operation);\n\t\tthis.tail = result.then(\n\t\t\t() => undefined,\n\t\t\t() => undefined,\n\t\t);\n\t\treturn result;\n\t}\n\n\tasync drain(): Promise<void> {\n\t\tawait this.tail;\n\t}\n}\n\nfunction resultOrThrow<T>(result: Result<T, FileError>, message: string): T {\n\tif (!result.ok) {\n\t\tconst code = result.error.code === \"not_found\" ? \"not_found\" : \"storage\";\n\t\tthrow new SessionError(code, `${message}: ${result.error.message}`, result.error);\n\t}\n\treturn result.value;\n}\n\nfunction getParentPath(path: string): string {\n\tconst normalized = path.replace(/[\\\\/]+$/, \"\");\n\tconst lastSlash = Math.max(normalized.lastIndexOf(\"/\"), normalized.lastIndexOf(\"\\\\\"));\n\tif (lastSlash < 0) return \".\";\n\tif (lastSlash === 0) return normalized.slice(0, 1);\n\treturn normalized.slice(0, lastSlash);\n}\n\nfunction configureSqliteDatabase(db: SqliteDatabase): void {\n\tsql`PRAGMA journal_mode=WAL`.exec(db);\n\tsql`PRAGMA synchronous=FULL`.exec(db);\n\tsql`PRAGMA busy_timeout=5000`.exec(db);\n}\n\nfunction entryRowFromCached(row: CachedBranchEntryRow): EntryRow {\n\treturn { ...row, seq: row.entry_seq, type: row.type as Entry[\"type\"] };\n}\n\nfunction readObjectPayload(row: EntryRow): Record<string, unknown> {\n\tconst payload = JSON.parse(row.payload) as unknown;\n\tif (typeof payload !== \"object\" || payload === null || Array.isArray(payload)) {\n\t\tthrow new Error(\"Payload is not an object\");\n\t}\n\treturn payload as Record<string, unknown>;\n}\n\nfunction decodeEntry(row: EntryRow): Entry {\n\ttry {\n\t\tconst payload = readObjectPayload(row);\n\t\tconst base = { id: row.id, seq: row.seq, parentId: row.parent_id, timestamp: row.timestamp };\n\t\tswitch (row.type) {\n\t\t\tcase \"message\":\n\t\t\t\tif (typeof payload.message !== \"object\" || payload.message === null) throw new Error(\"Missing message\");\n\t\t\t\treturn {\n\t\t\t\t\t...base,\n\t\t\t\t\ttype: \"message\",\n\t\t\t\t\tmessage: payload.message as Extract<Entry, { type: \"message\" }>[\"message\"],\n\t\t\t\t\t...(payload.terminate === true ? { terminate: true as const } : {}),\n\t\t\t\t};\n\t\t\tcase \"model_change\":\n\t\t\t\tif (typeof payload.provider !== \"string\" || typeof payload.modelId !== \"string\") {\n\t\t\t\t\tthrow new Error(\"Invalid model_change payload\");\n\t\t\t\t}\n\t\t\t\treturn { ...base, type: \"model_change\", provider: payload.provider, modelId: payload.modelId };\n\t\t\tcase \"thinking_level_change\":\n\t\t\t\tif (typeof payload.thinkingLevel !== \"string\") throw new Error(\"Invalid thinking_level_change payload\");\n\t\t\t\treturn { ...base, type: \"thinking_level_change\", thinkingLevel: payload.thinkingLevel };\n\t\t\tcase \"active_tools_change\":\n\t\t\t\tif (!Array.isArray(payload.activeToolNames)) throw new Error(\"Invalid active_tools_change payload\");\n\t\t\t\tif (payload.activeToolNames.some((value) => typeof value !== \"string\")) {\n\t\t\t\t\tthrow new Error(\"Invalid active_tools_change payload\");\n\t\t\t\t}\n\t\t\t\treturn { ...base, type: \"active_tools_change\", activeToolNames: payload.activeToolNames };\n\t\t\tcase \"compaction\":\n\t\t\t\tif (\n\t\t\t\t\ttypeof payload.summary !== \"string\" ||\n\t\t\t\t\t!Array.isArray(payload.retainedTail) ||\n\t\t\t\t\ttypeof payload.tokensBefore !== \"number\"\n\t\t\t\t) {\n\t\t\t\t\tthrow new Error(\"Invalid compaction payload\");\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\t...base,\n\t\t\t\t\ttype: \"compaction\",\n\t\t\t\t\tsummary: payload.summary,\n\t\t\t\t\tretainedTail: payload.retainedTail as Extract<Entry, { type: \"compaction\" }>[\"retainedTail\"],\n\t\t\t\t\ttokensBefore: payload.tokensBefore,\n\t\t\t\t\t...(Object.hasOwn(payload, \"details\") ? { details: payload.details } : {}),\n\t\t\t\t\t...(Object.hasOwn(payload, \"usage\")\n\t\t\t\t\t\t? { usage: payload.usage as Extract<Entry, { type: \"compaction\" }>[\"usage\"] }\n\t\t\t\t\t\t: {}),\n\t\t\t\t};\n\t\t\tcase \"branch_summary\":\n\t\t\t\tif (typeof payload.fromId !== \"string\" || typeof payload.summary !== \"string\") {\n\t\t\t\t\tthrow new Error(\"Invalid branch_summary payload\");\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\t...base,\n\t\t\t\t\ttype: \"branch_summary\",\n\t\t\t\t\tfromId: payload.fromId,\n\t\t\t\t\tsummary: payload.summary,\n\t\t\t\t\t...(Object.hasOwn(payload, \"details\") ? { details: payload.details } : {}),\n\t\t\t\t\t...(Object.hasOwn(payload, \"usage\")\n\t\t\t\t\t\t? { usage: payload.usage as Extract<Entry, { type: \"branch_summary\" }>[\"usage\"] }\n\t\t\t\t\t\t: {}),\n\t\t\t\t};\n\t\t\tcase \"custom\":\n\t\t\t\tif (typeof payload.customType !== \"string\") throw new Error(\"Invalid custom payload\");\n\t\t\t\treturn {\n\t\t\t\t\t...base,\n\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\tcustomType: payload.customType,\n\t\t\t\t\t...(Object.hasOwn(payload, \"data\") ? { data: payload.data } : {}),\n\t\t\t\t};\n\t\t}\n\t} catch (error) {\n\t\tthrow new SessionError(\n\t\t\t\"invalid_entry\",\n\t\t\t`Invalid SQLite session entry ${row.id}: failed to decode entry ${row.id}`,\n\t\t\terror instanceof Error ? error : undefined,\n\t\t);\n\t}\n}\n\nfunction recordRunId(record: NewRecord): string | undefined {\n\treturn record.type === \"operation_started\" ? record.id : \"runId\" in record ? record.runId : undefined;\n}\n\nfunction recordOpKind(record: NewRecord): string | undefined {\n\treturn record.type === \"operation_started\" ? record.intent.kind : undefined;\n}\n\nfunction decodeRecord(row: { seq: number; timestamp: number; payload: string }): LaneRecord {\n\ttry {\n\t\treturn {\n\t\t\t...(JSON.parse(row.payload) as object),\n\t\t\tseq: row.seq,\n\t\t\ttimestamp: row.timestamp,\n\t\t} as LaneRecord;\n\t} catch (error) {\n\t\tthrow new SessionError(\n\t\t\t\"storage\",\n\t\t\t`Invalid SQLite session record at sequence ${row.seq}: failed to decode payload`,\n\t\t\terror instanceof Error ? error : undefined,\n\t\t);\n\t}\n}\n\nfunction validateCachedBranchRows(rows: readonly CachedBranchEntryRow[], query: BranchBounds & EntryQuery): void {\n\tif (rows.length === 0 || query.type !== undefined || query.customType !== undefined) return;\n\tconst path = [...rows].sort((left, right) => left.entry_seq - right.entry_seq);\n\tconst shouldIncludeRoot =\n\t\tquery.stopAtId === undefined &&\n\t\tquery.stopAtType === undefined &&\n\t\tquery.cursor === undefined &&\n\t\t(query.order === \"oldestFirst\" || query.limit === undefined);\n\tif (shouldIncludeRoot && path[0]?.parent_id !== null) {\n\t\tthrow new SessionError(\"invalid_entry\", `Entry ${path[0]?.parent_id} not found`);\n\t}\n\tfor (let index = 1; index < path.length; index++) {\n\t\tconst previous = path[index - 1]!;\n\t\tconst current = path[index]!;\n\t\tif (current.parent_id !== previous.id) {\n\t\t\tthrow new SessionError(\"invalid_entry\", `Entry ${current.parent_id} not found`);\n\t\t}\n\t}\n}\n\nfunction matchesEntryQuery(entry: Entry, query: EntryQuery): boolean {\n\treturn (\n\t\t(query.type === undefined || entry.type === query.type) &&\n\t\t(query.customType === undefined || (entry.type === \"custom\" && entry.customType === query.customType)) &&\n\t\t(query.cursor === undefined ||\n\t\t\t(query.order === \"oldestFirst\" ? entry.seq > query.cursor.afterSeq : entry.seq < query.cursor.afterSeq))\n\t);\n}\n\nfunction assertUnusedId(db: SqliteDatabase, sessionId: string, id: string): void {\n\tif (idExistsInEntries(db, sessionId, id) || idExistsInRecords(db, sessionId, id)) {\n\t\tthrow new SessionError(\"already_exists\", `ID already exists: ${id}`);\n\t}\n}\n\nfunction requireSessionRow(db: SqliteDatabase, sessionId: string): SessionRow {\n\tconst row = readSessionRow(db, sessionId);\n\tif (!row) throw new SessionError(\"not_found\", `Session not found: ${sessionId}`);\n\treturn row;\n}\n\nclass SqliteSessionStorage implements SessionStorage<SqliteSessionMetadata> {\n\tprivate readonly db: SqliteDatabase;\n\tprivate readonly metadata: SqliteSessionMetadata;\n\tprivate readonly lease: WriterLease;\n\tprivate readonly leaseOptions: ResolvedWriterLeaseOptions;\n\tprivate readonly onRelease: () => void;\n\tprivate readonly operations = new SerialOperationQueue();\n\tprivate heartbeatTimer: ReturnType<typeof setTimeout> | undefined;\n\tprivate leaseError: SessionError | undefined;\n\tprivate closing = false;\n\tprivate releasePromise: Promise<void> | undefined;\n\n\tconstructor(\n\t\tdb: SqliteDatabase,\n\t\tmetadata: SqliteSessionMetadata,\n\t\tlease: WriterLease,\n\t\tleaseOptions: ResolvedWriterLeaseOptions,\n\t\tonRelease: () => void,\n\t) {\n\t\tthis.db = db;\n\t\tthis.metadata = metadata;\n\t\tthis.lease = lease;\n\t\tthis.leaseOptions = leaseOptions;\n\t\tthis.onRelease = onRelease;\n\t\tthis.scheduleHeartbeat();\n\t}\n\n\tasync release(): Promise<void> {\n\t\tthis.releasePromise ??= this.finishRelease();\n\t\tawait this.releasePromise;\n\t}\n\n\tprivate async finishRelease(): Promise<void> {\n\t\tthis.closing = true;\n\t\tif (this.heartbeatTimer !== undefined) clearTimeout(this.heartbeatTimer);\n\t\ttry {\n\t\t\tawait this.operations.enqueue(() =>\n\t\t\t\tthis.db.transaction(() => releaseWriterLease(this.db, this.metadata.id, this.lease)),\n\t\t\t);\n\t\t} finally {\n\t\t\tthis.onRelease();\n\t\t}\n\t}\n\n\tprivate enqueueWrite<T>(operation: () => T): Promise<T> {\n\t\tif (this.closing)\n\t\t\treturn Promise.reject(new SessionError(\"storage\", `SQLite session ${this.metadata.id} is closed`));\n\t\treturn this.operations.enqueue(() => {\n\t\t\tif (this.leaseError) throw this.leaseError;\n\t\t\treturn this.db.transaction(() => {\n\t\t\t\tconst now = Date.now();\n\t\t\t\tif (!renewWriterLease(this.db, this.metadata.id, this.lease, now, now + this.leaseOptions.ttlMs)) {\n\t\t\t\t\tthis.leaseError = lostWriterError(this.metadata.id);\n\t\t\t\t\tif (this.heartbeatTimer !== undefined) clearTimeout(this.heartbeatTimer);\n\t\t\t\t\tthrow this.leaseError;\n\t\t\t\t}\n\t\t\t\treturn operation();\n\t\t\t});\n\t\t});\n\t}\n\n\tprivate scheduleHeartbeat(): void {\n\t\tif (this.closing || this.leaseError) return;\n\t\tthis.heartbeatTimer = setTimeout(async () => {\n\t\t\tthis.heartbeatTimer = undefined;\n\t\t\ttry {\n\t\t\t\tawait this.operations.enqueue(() => {\n\t\t\t\t\tif (this.closing || this.leaseError) return;\n\t\t\t\t\tthis.db.transaction(() => {\n\t\t\t\t\t\tconst now = Date.now();\n\t\t\t\t\t\tif (!renewWriterLease(this.db, this.metadata.id, this.lease, now, now + this.leaseOptions.ttlMs)) {\n\t\t\t\t\t\t\tthis.leaseError = lostWriterError(this.metadata.id);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t} catch {\n\t\t\t\t// A transient heartbeat failure is retried. Every write still verifies ownership transactionally.\n\t\t\t} finally {\n\t\t\t\tthis.scheduleHeartbeat();\n\t\t\t}\n\t\t}, this.leaseOptions.heartbeatIntervalMs);\n\t\tthis.heartbeatTimer.unref();\n\t}\n\n\tasync getMetadata(): Promise<SqliteSessionMetadata> {\n\t\treturn decodeSessionMetadata(requireSessionRow(this.db, this.metadata.id), this.metadata.path);\n\t}\n\n\tisForSession(sessionId: string): boolean {\n\t\treturn this.metadata.id === sessionId;\n\t}\n\n\tasync getLanes(): Promise<{ lane: string; leafId: string | null }[]> {\n\t\treturn readLanes(this.db, this.metadata.id).map((row) => ({ lane: row.lane, leafId: row.leaf_id }));\n\t}\n\n\tasync createLane(lane: string, at: string | null): Promise<void> {\n\t\treturn this.enqueueWrite(() => {\n\t\t\tif (readLane(this.db, this.metadata.id, lane)) {\n\t\t\t\tthrow new SessionError(\"already_exists\", `Lane already exists: ${lane}`);\n\t\t\t}\n\t\t\tif (at !== null && !readEntryRow(this.db, this.metadata.id, at)) {\n\t\t\t\tthrow new SessionError(\"not_found\", `Entry not found: ${at}`);\n\t\t\t}\n\t\t\tconst seq = getNextSequence(this.db, this.metadata.id);\n\t\t\tinsertLane(this.db, this.metadata.id, seq, lane, at);\n\t\t\tadvanceSequence(this.db, this.metadata.id, seq);\n\t\t});\n\t}\n\n\tasync moveLane(lane: string, to: string | null): Promise<void> {\n\t\treturn this.enqueueWrite(() => {\n\t\t\tif (!readLane(this.db, this.metadata.id, lane))\n\t\t\t\tthrow new SessionError(\"invalid_lane\", `Lane not found: ${lane}`);\n\t\t\tif (to !== null && !readEntryRow(this.db, this.metadata.id, to)) {\n\t\t\t\tthrow new SessionError(\"not_found\", `Entry not found: ${to}`);\n\t\t\t}\n\t\t\tconst seq = getNextSequence(this.db, this.metadata.id);\n\t\t\tupdateLane(this.db, this.metadata.id, seq, lane, to);\n\t\t\tadvanceSequence(this.db, this.metadata.id, seq);\n\t\t});\n\t}\n\n\tasync appendEntry<TEntry extends Entry>(entry: ProvisionedEntry<TEntry>, lane: string): Promise<TEntry> {\n\t\treturn this.enqueueWrite(() => {\n\t\t\tconst parentId = readLaneHead(this.db, this.metadata.id, lane).leafId;\n\t\t\tassertUnusedId(this.db, this.metadata.id, entry.id);\n\t\t\tconst seq = getNextSequence(this.db, this.metadata.id);\n\t\t\tconst committed = { ...entry, parentId, seq, timestamp: Date.now() } as Entry;\n\t\t\tinsertEntryRow(this.db, this.metadata.id, {\n\t\t\t\tseq,\n\t\t\t\tid: committed.id,\n\t\t\t\tparentId: committed.parentId,\n\t\t\t\ttype: committed.type,\n\t\t\t\ttimestamp: committed.timestamp,\n\t\t\t\tpayload: JSON.stringify(entryPayload(committed)),\n\t\t\t});\n\t\t\tsetLaneLeaf(this.db, this.metadata.id, lane, committed.id);\n\t\t\tappendEntryToBranchCache(\n\t\t\t\tthis.db,\n\t\t\t\tthis.metadata.id,\n\t\t\t\tcommitted.id,\n\t\t\t\tseq,\n\t\t\t\tcommitted.type,\n\t\t\t\tcommitted.type === \"custom\" ? committed.customType : null,\n\t\t\t\tcommitted.parentId,\n\t\t\t);\n\t\t\tif (committed.type === \"message\") incrementMessageCount(this.db, this.metadata.id);\n\t\t\tadvanceSequence(this.db, this.metadata.id, seq);\n\t\t\treturn structuredClone(committed as TEntry);\n\t\t});\n\t}\n\n\tasync appendRecord<TRecord extends LaneRecord>(record: NewRecord<TRecord>): Promise<TRecord>;\n\tasync appendRecord(record: NewRecord): Promise<LaneRecord> {\n\t\treturn this.enqueueWrite(() => {\n\t\t\tif (!readLane(this.db, this.metadata.id, record.lane)) {\n\t\t\t\tthrow new SessionError(\"invalid_lane\", `Lane not found: ${record.lane}`);\n\t\t\t}\n\t\t\tassertUnusedId(this.db, this.metadata.id, record.id);\n\t\t\tconst seq = getNextSequence(this.db, this.metadata.id);\n\t\t\tconst committed: LaneRecord = { ...record, seq, timestamp: Date.now() };\n\t\t\tif (record.type === \"operation_started\") {\n\t\t\t\tstartLaneOperation(this.db, this.metadata.id, record.lane, record.id);\n\t\t\t}\n\t\t\tappendRecordRow(this.db, this.metadata.id, {\n\t\t\t\tseq,\n\t\t\t\tid: record.id,\n\t\t\t\tlane: record.lane,\n\t\t\t\trunId: recordRunId(record),\n\t\t\t\ttype: record.type,\n\t\t\t\topKind: recordOpKind(record),\n\t\t\t\ttimestamp: committed.timestamp,\n\t\t\t\tpayload: JSON.stringify(record),\n\t\t\t});\n\t\t\tif (record.type === \"operation_finished\") {\n\t\t\t\tfinishLaneOperation(this.db, this.metadata.id, record.lane, record.runId);\n\t\t\t}\n\t\t\tif (record.type === \"usage\") addUsageToStats(this.db, this.metadata.id, record.usage);\n\t\t\tadvanceSequence(this.db, this.metadata.id, seq);\n\t\t\treturn structuredClone(committed);\n\t\t});\n\t}\n\n\tasync getEntry(id: string): Promise<Entry | undefined> {\n\t\tconst row = readEntryRow(this.db, this.metadata.id, id);\n\t\treturn row ? decodeEntry(row) : undefined;\n\t}\n\n\tasync findEntries(query: EntryQuery = {}): Promise<Entry[]> {\n\t\tconst sqlType = query.type ?? (query.customType === undefined ? undefined : \"custom\");\n\t\tconst sqlLimit = query.customType === undefined ? query.limit : undefined;\n\t\tconst rows = readEntryRows(this.db, this.metadata.id, {\n\t\t\tcursor: query.cursor,\n\t\t\tlimit: sqlLimit,\n\t\t\torder: query.order,\n\t\t\ttype: sqlType,\n\t\t});\n\t\tconst entries = rows.map(decodeEntry).filter((entry) => matchesEntryQuery(entry, query));\n\t\treturn query.limit === undefined ? entries : entries.slice(0, query.limit);\n\t}\n\n\tasync findEntriesOnBranch(query: EntryQuery & BranchBounds & { start: string }): Promise<Entry[]> {\n\t\tconst cached = readCachedBranch(this.db, this.metadata.id, query.start);\n\t\tif (!cached) {\n\t\t\tif (!readEntryRow(this.db, this.metadata.id, query.start))\n\t\t\t\tthrow new SessionError(\"not_found\", `Entry not found: ${query.start}`);\n\t\t\tthrow new SessionError(\"invalid_entry\", `Branch cache missing entry ${query.start}`);\n\t\t}\n\t\tconst rows = queryCachedBranchRows(this.db, this.metadata.id, cached, query);\n\t\tvalidateCachedBranchRows(rows, query);\n\t\tconst entries = rows\n\t\t\t.map(entryRowFromCached)\n\t\t\t.map(decodeEntry)\n\t\t\t.filter((entry) => matchesEntryQuery(entry, query));\n\t\treturn query.limit === undefined ? entries : entries.slice(0, query.limit);\n\t}\n\n\tasync findRecords(query: RecordQuery = {}): Promise<LaneRecord[]> {\n\t\tconst rows = readRecordRows(this.db, this.metadata.id, query);\n\t\treturn rows.map(decodeRecord);\n\t}\n\n\tasync findOpenOperations(lane: string, options?: { limit?: number }): Promise<OperationStartedRecord[]> {\n\t\tconst rows = readOpenOperationRows(this.db, this.metadata.id, lane, options);\n\n\t\treturn rows.map((row) => {\n\t\t\tconst record = decodeRecord(row);\n\t\t\tif (record.type !== \"operation_started\") {\n\t\t\t\tthrow new SessionError(\"storage\", \"Expected operation_started record\");\n\t\t\t}\n\t\t\treturn record;\n\t\t});\n\t}\n\n\tasync getLog(options: LogOptions = {}): Promise<LogItem[]> {\n\t\tconst afterSeq = options.afterSeq ?? 0;\n\t\tconst limit = options.limit;\n\t\tconst entryRows = readEntryRows(this.db, this.metadata.id, { afterSeq, order: \"oldestFirst\", limit });\n\t\tconst recordRows = readRecordRows(this.db, this.metadata.id, { afterSeq, order: \"oldestFirst\", limit });\n\t\tconst laneRows = readLaneMoveRows(this.db, this.metadata.id, { afterSeq, limit });\n\t\tconst factRows = readFactRows(this.db, this.metadata.id, { afterSeq, limit });\n\n\t\tconst logRows: { seq: number; decode: () => LogItem }[] = [\n\t\t\t...entryRows.map((row) => ({\n\t\t\t\tseq: row.seq,\n\t\t\t\tdecode: () => ({ kind: \"entry\" as const, seq: row.seq, entry: decodeEntry(row) }),\n\t\t\t})),\n\t\t\t...recordRows.map((row) => ({\n\t\t\t\tseq: row.seq,\n\t\t\t\tdecode: () => ({ kind: \"record\" as const, seq: row.seq, record: decodeRecord(row) }),\n\t\t\t})),\n\t\t\t...laneRows.map((row) => ({\n\t\t\t\tseq: row.seq,\n\t\t\t\tdecode: () => ({ kind: \"lane\" as const, seq: row.seq, lane: row.lane, leafId: row.leaf_id }),\n\t\t\t})),\n\t\t\t...factRows.map((row) => ({\n\t\t\t\tseq: row.seq,\n\t\t\t\tdecode: () => {\n\t\t\t\t\tif (row.kind === \"name\")\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tkind: \"fact\" as const,\n\t\t\t\t\t\t\tseq: row.seq,\n\t\t\t\t\t\t\tfact: \"name\" as const,\n\t\t\t\t\t\t\tname: row.value === null ? undefined : (JSON.parse(row.value) as string),\n\t\t\t\t\t\t};\n\t\t\t\t\treturn {\n\t\t\t\t\t\tkind: \"fact\" as const,\n\t\t\t\t\t\tseq: row.seq,\n\t\t\t\t\t\tfact: \"label\" as const,\n\t\t\t\t\t\ttargetId: row.key ?? \"\",\n\t\t\t\t\t\tlabel: row.value === null ? undefined : (JSON.parse(row.value) as string),\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t})),\n\t\t].sort((left, right) => left.seq - right.seq);\n\t\tconst selectedRows = options.limit === undefined ? logRows : logRows.slice(0, options.limit);\n\t\treturn selectedRows.map((row) => row.decode());\n\t}\n\n\tasync getName(): Promise<string | undefined> {\n\t\tconst row = readLatestFact(this.db, this.metadata.id, \"name\", null);\n\t\treturn row?.value === undefined || row.value === null ? undefined : (JSON.parse(row.value) as string);\n\t}\n\n\tasync setName(name: string | undefined): Promise<void> {\n\t\treturn this.enqueueWrite(() => {\n\t\t\tconst seq = getNextSequence(this.db, this.metadata.id);\n\t\t\tappendFact(this.db, this.metadata.id, seq, \"name\", null, name === undefined ? null : JSON.stringify(name));\n\t\t\tadvanceSequence(this.db, this.metadata.id, seq);\n\t\t});\n\t}\n\n\tasync getLabel(id: string): Promise<string | undefined> {\n\t\tconst row = readLatestFact(this.db, this.metadata.id, \"label\", id);\n\t\treturn row?.value === undefined || row.value === null ? undefined : (JSON.parse(row.value) as string);\n\t}\n\n\tasync setLabel(id: string, label: string | undefined): Promise<void> {\n\t\treturn this.enqueueWrite(() => {\n\t\t\tif (!readEntryRow(this.db, this.metadata.id, id)) {\n\t\t\t\tthrow new SessionError(\"not_found\", `Entry not found: ${id}`);\n\t\t\t}\n\t\t\tconst seq = getNextSequence(this.db, this.metadata.id);\n\t\t\tappendFact(this.db, this.metadata.id, seq, \"label\", id, label === undefined ? null : JSON.stringify(label));\n\t\t\tadvanceSequence(this.db, this.metadata.id, seq);\n\t\t});\n\t}\n\n\tasync getStats(): Promise<SessionStats> {\n\t\treturn readStats(this.db, this.metadata.id);\n\t}\n}\n\nfunction claimStorage(\n\tdb: SqliteDatabase,\n\tmetadata: SqliteSessionMetadata,\n\tleaseOptions: ResolvedWriterLeaseOptions,\n\tonRelease: () => void,\n): SqliteSessionStorage {\n\trequireSessionRow(db, metadata.id);\n\tconst claimed = db.transaction(() => {\n\t\tconst lease = claimWriterLease(db, metadata.id, leaseOptions);\n\t\tconst row = requireSessionRow(db, metadata.id);\n\t\treadLanes(db, metadata.id);\n\t\treturn { lease, row };\n\t});\n\treturn new SqliteSessionStorage(\n\t\tdb,\n\t\tdecodeSessionMetadata(claimed.row, metadata.path),\n\t\tclaimed.lease,\n\t\tleaseOptions,\n\t\tonRelease,\n\t);\n}\n\nexport class SqliteSessionRepository\n\timplements\n\t\tSessionRepository<SqliteSessionMetadata, SqliteSessionCreateOptions, SqliteSessionListOptions>,\n\t\tAsyncDisposable\n{\n\tprivate databasePath: string | undefined;\n\tprivate database: SqliteDatabase | undefined;\n\tprivate databasePromise: Promise<SqliteDatabase> | undefined;\n\tprivate readonly operations = new SerialOperationQueue();\n\tprivate readonly activeStorages = new Set<SqliteSessionStorage>();\n\tprivate readonly options: SqliteSessionRepositoryOptions;\n\tprivate readonly leaseOptions: ResolvedWriterLeaseOptions;\n\n\tconstructor(options: SqliteSessionRepositoryOptions) {\n\t\tthis.options = options;\n\t\tthis.leaseOptions = resolveWriterLeaseOptions(options.writerLease);\n\t}\n\n\tprivate async releaseStoragesForSession(sessionId: string): Promise<void> {\n\t\tfor (const storage of [...this.activeStorages]) {\n\t\t\tif (storage.isForSession(sessionId)) await storage.release();\n\t\t}\n\t}\n\n\tprivate sessionFromLease(\n\t\tdb: SqliteDatabase,\n\t\tmetadata: SqliteSessionMetadata,\n\t\tlease: WriterLease,\n\t): Session<SqliteSessionMetadata> {\n\t\tlet storage: SqliteSessionStorage;\n\t\tstorage = new SqliteSessionStorage(db, metadata, lease, this.leaseOptions, () => {\n\t\t\tthis.activeStorages.delete(storage);\n\t\t});\n\t\tthis.activeStorages.add(storage);\n\t\treturn new Session(storage);\n\t}\n\n\tprivate claimSession(db: SqliteDatabase, metadata: SqliteSessionMetadata): Session<SqliteSessionMetadata> {\n\t\tconst active = [...this.activeStorages].find((storage) => storage.isForSession(metadata.id));\n\t\tif (active) {\n\t\t\treadLanes(db, metadata.id);\n\t\t\treturn new Session(active);\n\t\t}\n\t\tlet storage: SqliteSessionStorage;\n\t\tstorage = claimStorage(db, metadata, this.leaseOptions, () => {\n\t\t\tthis.activeStorages.delete(storage);\n\t\t});\n\t\tthis.activeStorages.add(storage);\n\t\treturn new Session(storage);\n\t}\n\n\tasync create(options: SqliteSessionCreateOptions): Promise<Session<SqliteSessionMetadata>> {\n\t\treturn this.operations.enqueue(async () => {\n\t\t\tconst db = await this.getDatabase();\n\t\t\tconst path = await this.getDatabasePath();\n\t\t\tconst id = options.id ?? uuidv7();\n\t\t\tif (sessionExists(db, id)) throw new SessionError(\"already_exists\", `Session already exists: ${id}`);\n\t\t\tconst createdAt = Date.now();\n\t\t\tconst lease = db.transaction(() => {\n\t\t\t\tinsertSessionRow(db, {\n\t\t\t\t\tid,\n\t\t\t\t\tcreatedAt,\n\t\t\t\t\tcwd: options.cwd,\n\t\t\t\t\tparentSessionId: options.parentSessionId,\n\t\t\t\t\tmetadata: options.metadata,\n\t\t\t\t});\n\t\t\t\tcreateSequence(db, id);\n\t\t\t\tcreateStats(db, id);\n\t\t\t\tcreateInitialLane(db, id);\n\t\t\t\treturn claimWriterLease(db, id, this.leaseOptions);\n\t\t\t});\n\t\t\tconst row = requireSessionRow(db, id);\n\t\t\treturn this.sessionFromLease(db, decodeSessionMetadata(row, path), lease);\n\t\t});\n\t}\n\n\tasync open(metadata: SqliteSessionMetadata): Promise<Session<SqliteSessionMetadata>> {\n\t\treturn this.operations.enqueue(async () => this.claimSession(await this.getDatabase(), metadata));\n\t}\n\n\t/** Rebuilds this session's private branch-read cache from canonical entry parent links. */\n\tasync repairBranchCache(metadata: SqliteSessionMetadata): Promise<void> {\n\t\treturn this.operations.enqueue(async () => {\n\t\t\tawait this.releaseStoragesForSession(metadata.id);\n\t\t\tconst db = await this.getDatabase();\n\t\t\tdb.transaction(() => {\n\t\t\t\tconst lease = claimWriterLease(db, metadata.id, this.leaseOptions);\n\t\t\t\trequireSessionRow(db, metadata.id);\n\t\t\t\trebuildBranchCache(db, metadata.id);\n\t\t\t\treleaseWriterLease(db, metadata.id, lease);\n\t\t\t});\n\t\t});\n\t}\n\n\t/** Reads the session catalog without acquiring or renewing per-session writer leases. */\n\tasync list(options: SqliteSessionListOptions = {}): Promise<SqliteSessionMetadata[]> {\n\t\treturn this.operations.enqueue(async () => {\n\t\t\tconst path = await this.getDatabasePath();\n\t\t\tif (!resultOrThrow(await this.options.env.exists(path), `Failed to check database ${path}`)) return [];\n\t\t\tconst db = await this.getDatabase();\n\t\t\tconst rows = readSessionRows(db, options);\n\t\t\treturn rows.map((row) => decodeSessionMetadata(row, path));\n\t\t});\n\t}\n\n\tasync delete(metadata: SqliteSessionMetadata): Promise<void> {\n\t\treturn this.operations.enqueue(async () => {\n\t\t\tawait this.releaseStoragesForSession(metadata.id);\n\t\t\tconst db = await this.getDatabase();\n\t\t\tdb.transaction(() => {\n\t\t\t\tif (!sessionExists(db, metadata.id)) {\n\t\t\t\t\tdeleteWriterLease(db, metadata.id);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tclaimWriterLease(db, metadata.id, this.leaseOptions);\n\t\t\t\tdeleteBranchCache(db, metadata.id);\n\t\t\t\tdeleteFactRows(db, metadata.id);\n\t\t\t\tdeleteLaneRows(db, metadata.id);\n\t\t\t\tdeleteRecordRows(db, metadata.id);\n\t\t\t\tdeleteEntryRows(db, metadata.id);\n\t\t\t\tdeleteWriterLease(db, metadata.id);\n\t\t\t\tdeleteStats(db, metadata.id);\n\t\t\t\tdeleteSequence(db, metadata.id);\n\t\t\t\tdeleteSessionRow(db, metadata.id);\n\t\t\t});\n\t\t});\n\t}\n\n\tasync fork(\n\t\tsource: SqliteSessionMetadata,\n\t\toptions: ForkOptions & SqliteSessionCreateOptions,\n\t): Promise<Session<SqliteSessionMetadata>> {\n\t\treturn this.operations.enqueue(async () => {\n\t\t\tconst db = await this.getDatabase();\n\t\t\tconst path = await this.getDatabasePath();\n\t\t\tconst sourceMetadata = decodeSessionMetadata(requireSessionRow(db, source.id), path);\n\t\t\tconst id = options.id ?? uuidv7();\n\t\t\tif (sessionExists(db, id)) throw new SessionError(\"already_exists\", `Session already exists: ${id}`);\n\n\t\t\tconst entries: EntryRow[] = [];\n\t\t\tconst lanes: { lane: string; leafId: string | null }[] = [];\n\t\t\tconst branchTips: string[] = [];\n\t\t\tlet branchForkTargetId: string | null = null;\n\n\t\t\tif (options.scope === \"tree\") {\n\t\t\t\tentries.push(...readEntryRows(db, source.id, { order: \"oldestFirst\" }));\n\t\t\t\tlanes.push(...readLanes(db, source.id).map((row) => ({ lane: row.lane, leafId: row.leaf_id })));\n\t\t\t\tbranchTips.push(...readBranchTipIds(db, source.id));\n\t\t\t} else {\n\t\t\t\tconst main = readLane(db, source.id, \"main\");\n\t\t\t\tif (!main) throw new SessionError(\"invalid_lane\", \"Lane not found: main\");\n\t\t\t\tconst selectedEntryId = options.entryId ?? main.leaf_id;\n\t\t\t\tif (selectedEntryId !== null) {\n\t\t\t\t\tconst target = readEntryRow(db, source.id, selectedEntryId);\n\t\t\t\t\tif (!target || target.type !== \"message\") {\n\t\t\t\t\t\tthrow new SessionError(\n\t\t\t\t\t\t\t\"invalid_fork_target\",\n\t\t\t\t\t\t\t`Fork target is not a message entry: ${selectedEntryId}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tconst position = options.position ?? (options.entryId === undefined ? \"at\" : \"before\");\n\t\t\t\t\tbranchForkTargetId = position === \"at\" ? target.id : target.parent_id;\n\t\t\t\t}\n\t\t\t\tlanes.push({ lane: \"main\", leafId: branchForkTargetId });\n\t\t\t\tif (branchForkTargetId !== null) {\n\t\t\t\t\tconst cached = readCachedBranch(db, source.id, branchForkTargetId);\n\t\t\t\t\tif (!cached) {\n\t\t\t\t\t\tthrow new SessionError(\n\t\t\t\t\t\t\t\"invalid_fork_target\",\n\t\t\t\t\t\t\t`Fork target is not on a cached branch: ${branchForkTargetId}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tconst rows = queryCachedBranchRows(db, source.id, cached, { order: \"oldestFirst\" });\n\t\t\t\t\tentries.push(...rows.map(entryRowFromCached));\n\t\t\t\t\tbranchTips.push(branchForkTargetId);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst copiedIds = new Set(entries.map((entry) => entry.id));\n\t\t\tconst latestName = readLatestFact(db, source.id, \"name\", null);\n\t\t\tconst latestLabels = readLatestLabelFacts(db, source.id);\n\t\t\tconst labelsToCopy = latestLabels.filter(\n\t\t\t\t(row) => options.scope === \"tree\" || (row.key !== null && copiedIds.has(row.key)),\n\t\t\t);\n\t\t\tconst createdAt = Date.now();\n\t\t\tconst metadata = options.metadata ?? sourceMetadata.metadata;\n\t\t\tlet lease: WriterLease;\n\n\t\t\ttry {\n\t\t\t\tlease = db.transaction(() => {\n\t\t\t\t\tinsertSessionRow(db, {\n\t\t\t\t\t\tid,\n\t\t\t\t\t\tcreatedAt,\n\t\t\t\t\t\tcwd: options.cwd,\n\t\t\t\t\t\tparentSessionId: options.parentSessionId ?? source.id,\n\t\t\t\t\t\tmetadata,\n\t\t\t\t\t});\n\t\t\t\t\tcreateSequence(db, id);\n\t\t\t\t\tcreateStats(db, id, entries.filter((entry) => entry.type === \"message\").length);\n\n\t\t\t\t\tlet nextSeq = 1;\n\t\t\t\t\tconst allocateSeq = () => nextSeq++;\n\t\t\t\t\tfor (const entry of entries) {\n\t\t\t\t\t\tinsertEntryRow(db, id, {\n\t\t\t\t\t\t\tseq: allocateSeq(),\n\t\t\t\t\t\t\tid: entry.id,\n\t\t\t\t\t\t\tparentId: entry.parent_id,\n\t\t\t\t\t\t\ttype: entry.type,\n\t\t\t\t\t\t\ttimestamp: entry.timestamp,\n\t\t\t\t\t\t\tpayload: entry.payload,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (options.scope === \"tree\") {\n\t\t\t\t\t\tfor (const lane of lanes) insertLane(db, id, allocateSeq(), lane.lane, lane.leafId);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcreateInitialLane(db, id, \"main\", branchForkTargetId);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (latestName?.value !== undefined && latestName.value !== null) {\n\t\t\t\t\t\tappendFact(db, id, allocateSeq(), \"name\", null, latestName.value);\n\t\t\t\t\t}\n\t\t\t\t\tfor (const label of labelsToCopy) appendFact(db, id, allocateSeq(), \"label\", label.key, label.value);\n\n\t\t\t\t\tsetNextSequence(db, id, nextSeq);\n\t\t\t\t\tfor (const tip of branchTips) buildCachedBranch(db, id, tip);\n\t\t\t\t\treturn claimWriterLease(db, id, this.leaseOptions);\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof SessionError) throw error;\n\t\t\t\tthrow new SessionError(\n\t\t\t\t\t\"storage\",\n\t\t\t\t\t`Failed to fork SQLite session ${id}`,\n\t\t\t\t\terror instanceof Error ? error : undefined,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst row = requireSessionRow(db, id);\n\t\t\treturn this.sessionFromLease(db, decodeSessionMetadata(row, path), lease);\n\t\t});\n\t}\n\n\tasync close(): Promise<void> {\n\t\tawait this.operations.drain();\n\t\tfor (const storage of [...this.activeStorages]) await storage.release();\n\t\tif (this.database) this.database.close();\n\t\tthis.database = undefined;\n\t\tthis.databasePromise = undefined;\n\t}\n\n\tasync [Symbol.asyncDispose](): Promise<void> {\n\t\tawait this.close();\n\t}\n\n\tprivate async getDatabasePath(): Promise<string> {\n\t\tthis.databasePath ??= resultOrThrow(\n\t\t\tawait this.options.env.absolutePath(this.options.databasePath),\n\t\t\t`Failed to resolve SQLite sessions database ${this.options.databasePath}`,\n\t\t);\n\t\treturn this.databasePath;\n\t}\n\n\tprivate async getDatabase(): Promise<SqliteDatabase> {\n\t\tif (!this.databasePromise) this.databasePromise = this.openDatabase();\n\t\tthis.database = await this.databasePromise;\n\t\treturn this.database;\n\t}\n\n\tprivate async openDatabase(): Promise<SqliteDatabase> {\n\t\tconst path = await this.getDatabasePath();\n\t\tresultOrThrow(\n\t\t\tawait this.options.env.createDir(getParentPath(path), { recursive: true }),\n\t\t\t`Failed to create SQLite sessions directory ${path}`,\n\t\t);\n\t\tconst db = await this.options.sqlite.open(path);\n\t\ttry {\n\t\t\tconfigureSqliteDatabase(db);\n\t\t\tawait applyMigrations(db);\n\t\t\treturn db;\n\t\t} catch (error) {\n\t\t\tdb.close();\n\t\t\tthrow error;\n\t\t}\n\t}\n}\n"]}
@@ -1,9 +1,14 @@
1
- import type { SessionSearch } from "@earendil-works/pi-agent-core";
1
+ import type { SessionSearch, SessionSearchHit } from "@earendil-works/pi-agent-core";
2
2
  import type { SqliteDatabaseFactory, SqliteSessionMetadata, SqliteSessionRepositoryEnv } from "./types.ts";
3
3
  export interface SqliteSessionSearchOptions {
4
4
  env: Pick<SqliteSessionRepositoryEnv, "absolutePath" | "createDir">;
5
5
  sqlite: SqliteDatabaseFactory;
6
6
  databasePath: string;
7
7
  }
8
- export declare function createSqliteSessionSearch(options: SqliteSessionSearchOptions): SessionSearch<SqliteSessionMetadata>;
8
+ export interface SqliteSessionSearchHit extends SessionSearchHit {
9
+ readonly metadata: SqliteSessionMetadata;
10
+ readonly timestamp: number;
11
+ readonly score: number;
12
+ }
13
+ export declare function createSqliteSessionSearch(options: SqliteSessionSearchOptions): SessionSearch<SqliteSessionSearchHit>;
9
14
  //# sourceMappingURL=search-backend.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"search-backend.d.ts","sourceRoot":"","sources":["../../src/sqlite/search-backend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAA0C,MAAM,+BAA+B,CAAC;AAK3G,OAAO,KAAK,EAEX,qBAAqB,EACrB,qBAAqB,EACrB,0BAA0B,EAC1B,MAAM,YAAY,CAAC;AAgBpB,MAAM,WAAW,0BAA0B;IAC1C,GAAG,EAAE,IAAI,CAAC,0BAA0B,EAAE,cAAc,GAAG,WAAW,CAAC,CAAC;IACpE,MAAM,EAAE,qBAAqB,CAAC;IAC9B,YAAY,EAAE,MAAM,CAAC;CACrB;AA2GD,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,0BAA0B,GAAG,aAAa,CAAC,qBAAqB,CAAC,CAEnH","sourcesContent":["import type { SessionSearch, SessionSearchHit, SessionSearchOptions } from \"@earendil-works/pi-agent-core\";\nimport { getFileSystemResultOrThrow } from \"@earendil-works/pi-agent-core\";\nimport { applyMigrations } from \"./migrations.ts\";\nimport { sql } from \"./sql.ts\";\nimport { decodeSessionMetadata, type SessionRow } from \"./storage/sessions.ts\";\nimport type {\n\tSqliteDatabase,\n\tSqliteDatabaseFactory,\n\tSqliteSessionMetadata,\n\tSqliteSessionRepositoryEnv,\n} from \"./types.ts\";\n\nfunction getParentPath(path: string): string {\n\tconst normalized = path.replace(/[\\\\/]+$/, \"\");\n\tconst lastSlash = Math.max(normalized.lastIndexOf(\"/\"), normalized.lastIndexOf(\"\\\\\"));\n\tif (lastSlash < 0) return \".\";\n\tif (lastSlash === 0) return normalized.slice(0, 1);\n\treturn normalized.slice(0, lastSlash);\n}\n\nfunction configureSqliteDatabase(db: SqliteDatabase): void {\n\tsql`PRAGMA journal_mode=WAL`.exec(db);\n\tsql`PRAGMA synchronous=FULL`.exec(db);\n\tsql`PRAGMA busy_timeout=5000`.exec(db);\n}\n\nexport interface SqliteSessionSearchOptions {\n\tenv: Pick<SqliteSessionRepositoryEnv, \"absolutePath\" | \"createDir\">;\n\tsqlite: SqliteDatabaseFactory;\n\tdatabasePath: string;\n}\n\nfunction tableExists(db: SqliteDatabase, name: string): boolean {\n\treturn !!sql`SELECT 1 AS found FROM sqlite_master WHERE type = 'table' AND name = ${name} LIMIT 1`.get<{\n\t\tfound: number;\n\t}>(db);\n}\n\nfunction ensureSearchSchema(db: SqliteDatabase): void {\n\tconst ftsExists = tableExists(db, \"session_search_fts\");\n\tsql`\nCREATE VIRTUAL TABLE IF NOT EXISTS session_search_fts USING fts5(\n payload,\n content = 'entries',\n content_rowid = 'rowid',\n tokenize = 'trigram remove_diacritics 1'\n);\nCREATE TRIGGER IF NOT EXISTS session_search_fts_ai AFTER INSERT ON entries BEGIN\n INSERT INTO session_search_fts(rowid, payload) VALUES (new.rowid, new.payload);\nEND;\nCREATE TRIGGER IF NOT EXISTS session_search_fts_ad AFTER DELETE ON entries BEGIN\n INSERT INTO session_search_fts(session_search_fts, rowid, payload) VALUES('delete', old.rowid, old.payload);\nEND;\nCREATE TRIGGER IF NOT EXISTS session_search_fts_au AFTER UPDATE OF payload ON entries BEGIN\n INSERT INTO session_search_fts(session_search_fts, rowid, payload) VALUES('delete', old.rowid, old.payload);\n INSERT INTO session_search_fts(rowid, payload) VALUES (new.rowid, new.payload);\nEND;\n`.exec(db);\n\tif (!ftsExists) sql`INSERT INTO session_search_fts(session_search_fts) VALUES('rebuild')`.exec(db);\n}\n\n/** SQLite FTS search over a co-located canonical session database. */\nclass SqliteSessionSearch implements SessionSearch<SqliteSessionMetadata> {\n\tprivate readonly options: SqliteSessionSearchOptions;\n\tprivate databasePath: string | undefined;\n\n\tconstructor(options: SqliteSessionSearchOptions) {\n\t\tthis.options = options;\n\t}\n\n\tprivate async getDatabasePath(): Promise<string> {\n\t\tif (!this.databasePath) {\n\t\t\tthis.databasePath = getFileSystemResultOrThrow(\n\t\t\t\tawait this.options.env.absolutePath(this.options.databasePath),\n\t\t\t\t`Failed to resolve SQLite search database ${this.options.databasePath}`,\n\t\t\t);\n\t\t}\n\t\treturn this.databasePath;\n\t}\n\n\tprivate async openDatabase(): Promise<SqliteDatabase> {\n\t\tconst path = await this.getDatabasePath();\n\t\tconst directory = getParentPath(path);\n\t\tgetFileSystemResultOrThrow(\n\t\t\tawait this.options.env.createDir(directory, { recursive: true }),\n\t\t\t`Failed to create SQLite search directory ${directory}`,\n\t\t);\n\t\tconst db = await this.options.sqlite.open(path);\n\t\ttry {\n\t\t\tconfigureSqliteDatabase(db);\n\t\t\tawait applyMigrations(db);\n\t\t\tensureSearchSchema(db);\n\t\t\treturn db;\n\t\t} catch (error) {\n\t\t\tdb.close();\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync search(options: SessionSearchOptions): Promise<SessionSearchHit<SqliteSessionMetadata>[]> {\n\t\tconst text = options.text.trim();\n\t\tif (!text) return [];\n\t\tconst db = await this.openDatabase();\n\t\ttry {\n\t\t\tconst query = `\"${text.replaceAll('\"', '\"\"')}\"`;\n\t\t\tconst cwd = options.cwd ?? null;\n\t\t\tconst rows = sql`SELECT s.id, s.created_at, s.metadata, s.cwd, s.parent_session_id,\n\t\t\t\tname_fact.seq IS NOT NULL AS has_session_name,\n\t\t\t\tname_fact.value AS session_name,\n\t\t\t\tse.id AS entry_id, se.timestamp, bm25(session_search_fts) AS score\n\t\t\tFROM session_search_fts\n\t\t\tJOIN entries AS se ON se.rowid = session_search_fts.rowid\n\t\t\tJOIN sessions AS s ON s.id = se.session_id\n\t\t\tLEFT JOIN facts AS name_fact\n\t\t\t\tON name_fact.session_id = s.id\n\t\t\t\tAND name_fact.kind = 'name'\n\t\t\t\tAND name_fact.key IS NULL\n\t\t\t\tAND name_fact.seq = (\n\t\t\t\t\tSELECT MAX(f.seq)\n\t\t\t\t\tFROM facts AS f\n\t\t\t\t\tWHERE f.session_id = s.id AND f.kind = 'name' AND f.key IS NULL\n\t\t\t\t)\n\t\t\tWHERE session_search_fts MATCH ${query} AND (${cwd} IS NULL OR s.cwd = ${cwd})\n\t\t\tORDER BY score`.all<SessionRow & { entry_id: string; timestamp: string; score: number }>(db);\n\t\t\tconst path = await this.getDatabasePath();\n\t\t\treturn rows.map((row) => ({\n\t\t\t\tmetadata: decodeSessionMetadata(row, path),\n\t\t\t\tentryId: row.entry_id,\n\t\t\t\ttimestamp: row.timestamp,\n\t\t\t\tscore: row.score,\n\t\t\t}));\n\t\t} finally {\n\t\t\tdb.close();\n\t\t}\n\t}\n}\n\nexport function createSqliteSessionSearch(options: SqliteSessionSearchOptions): SessionSearch<SqliteSessionMetadata> {\n\treturn new SqliteSessionSearch(options);\n}\n"]}
1
+ {"version":3,"file":"search-backend.d.ts","sourceRoot":"","sources":["../../src/sqlite/search-backend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGX,aAAa,EACb,gBAAgB,EAEhB,MAAM,+BAA+B,CAAC;AAKvC,OAAO,KAAK,EAEX,qBAAqB,EACrB,qBAAqB,EACrB,0BAA0B,EAC1B,MAAM,YAAY,CAAC;AAgCpB,MAAM,WAAW,0BAA0B;IAC1C,GAAG,EAAE,IAAI,CAAC,0BAA0B,EAAE,cAAc,GAAG,WAAW,CAAC,CAAC;IACpE,MAAM,EAAE,qBAAqB,CAAC;IAC9B,YAAY,EAAE,MAAM,CAAC;CACrB;AAsCD,MAAM,WAAW,sBAAuB,SAAQ,gBAAgB;IAC/D,QAAQ,CAAC,QAAQ,EAAE,qBAAqB,CAAC;IACzC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACvB;AAiGD,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,0BAA0B,GAAG,aAAa,CAAC,sBAAsB,CAAC,CAEpH","sourcesContent":["import type {\n\tFileError,\n\tResult,\n\tSessionSearch,\n\tSessionSearchHit,\n\tSessionSearchOptions,\n} from \"@earendil-works/pi-agent-core\";\nimport { SessionError } from \"@earendil-works/pi-agent-core\";\nimport { applyMigrations } from \"./migrations.ts\";\nimport { sql } from \"./sql.ts\";\nimport { decodeSessionMetadata, type SessionRow } from \"./storage/sessions.ts\";\nimport type {\n\tSqliteDatabase,\n\tSqliteDatabaseFactory,\n\tSqliteSessionMetadata,\n\tSqliteSessionRepositoryEnv,\n} from \"./types.ts\";\n\nfunction getFileSystemResultOrThrow<TValue>(result: Result<TValue, FileError>, message: string): TValue {\n\tif (!result.ok) {\n\t\tconst code = result.error.code === \"not_found\" ? \"not_found\" : \"storage\";\n\t\tthrow new SessionError(code, `${message}: ${result.error.message}`, result.error);\n\t}\n\treturn result.value;\n}\n\nfunction getParentPath(path: string): string {\n\tconst normalized = path.replace(/[\\\\/]+$/, \"\");\n\tconst lastSlash = Math.max(normalized.lastIndexOf(\"/\"), normalized.lastIndexOf(\"\\\\\"));\n\tif (lastSlash < 0) return \".\";\n\tif (lastSlash === 0) return normalized.slice(0, 1);\n\treturn normalized.slice(0, lastSlash);\n}\n\nfunction throwIfAborted(signal: AbortSignal | undefined): void {\n\tif (!signal?.aborted) return;\n\tif (signal.reason instanceof Error) throw signal.reason;\n\tconst error = new Error(\"The operation was aborted\");\n\terror.name = \"AbortError\";\n\tthrow error;\n}\n\nfunction configureSqliteDatabase(db: SqliteDatabase): void {\n\tsql`PRAGMA journal_mode=WAL`.exec(db);\n\tsql`PRAGMA synchronous=FULL`.exec(db);\n\tsql`PRAGMA busy_timeout=5000`.exec(db);\n}\n\nexport interface SqliteSessionSearchOptions {\n\tenv: Pick<SqliteSessionRepositoryEnv, \"absolutePath\" | \"createDir\">;\n\tsqlite: SqliteDatabaseFactory;\n\tdatabasePath: string;\n}\n\nfunction tableExists(db: SqliteDatabase, name: string): boolean {\n\treturn !!sql`SELECT 1 AS found FROM sqlite_master WHERE type = 'table' AND name = ${name} LIMIT 1`.get<{\n\t\tfound: number;\n\t}>(db);\n}\n\nfunction rebuildSearchIndex(db: SqliteDatabase): void {\n\tsql`INSERT INTO session_search_fts(session_search_fts) VALUES('rebuild')`.run(db);\n}\n\nfunction ensureSearchSchema(db: SqliteDatabase): void {\n\tconst ftsExists = tableExists(db, \"session_search_fts\");\n\tconst entriesExist = tableExists(db, \"entries\");\n\tdb.transaction(() => {\n\t\tsql`\nCREATE VIRTUAL TABLE IF NOT EXISTS session_search_fts USING fts5(\n payload,\n content = 'entries',\n content_rowid = 'rowid',\n tokenize = 'trigram remove_diacritics 1'\n);\nCREATE TRIGGER IF NOT EXISTS session_search_fts_ai AFTER INSERT ON entries BEGIN\n INSERT INTO session_search_fts(rowid, payload) VALUES (new.rowid, new.payload);\nEND;\nCREATE TRIGGER IF NOT EXISTS session_search_fts_ad AFTER DELETE ON entries BEGIN\n INSERT INTO session_search_fts(session_search_fts, rowid, payload) VALUES('delete', old.rowid, old.payload);\nEND;\nCREATE TRIGGER IF NOT EXISTS session_search_fts_au AFTER UPDATE OF payload ON entries BEGIN\n INSERT INTO session_search_fts(session_search_fts, rowid, payload) VALUES('delete', old.rowid, old.payload);\n INSERT INTO session_search_fts(rowid, payload) VALUES (new.rowid, new.payload);\nEND;\n`.exec(db);\n\t\tif (!ftsExists && entriesExist) rebuildSearchIndex(db);\n\t});\n}\n\nexport interface SqliteSessionSearchHit extends SessionSearchHit {\n\treadonly metadata: SqliteSessionMetadata;\n\treadonly timestamp: number;\n\treadonly score: number;\n}\n\n/** SQLite FTS search over a co-located canonical session database. */\nclass SqliteSessionSearch implements SessionSearch<SqliteSessionSearchHit> {\n\tprivate readonly options: SqliteSessionSearchOptions;\n\tprivate databasePath: string | undefined;\n\n\tconstructor(options: SqliteSessionSearchOptions) {\n\t\tthis.options = options;\n\t}\n\n\tprivate async getDatabasePath(): Promise<string> {\n\t\tif (!this.databasePath) {\n\t\t\tthis.databasePath = getFileSystemResultOrThrow(\n\t\t\t\tawait this.options.env.absolutePath(this.options.databasePath),\n\t\t\t\t`Failed to resolve SQLite search database ${this.options.databasePath}`,\n\t\t\t);\n\t\t}\n\t\treturn this.databasePath;\n\t}\n\n\tprivate async openDatabase(): Promise<SqliteDatabase> {\n\t\tconst path = await this.getDatabasePath();\n\t\tconst directory = getParentPath(path);\n\t\tgetFileSystemResultOrThrow(\n\t\t\tawait this.options.env.createDir(directory, { recursive: true }),\n\t\t\t`Failed to create SQLite search directory ${directory}`,\n\t\t);\n\t\tconst db = await this.options.sqlite.open(path);\n\t\ttry {\n\t\t\tconfigureSqliteDatabase(db);\n\t\t\tawait applyMigrations(db);\n\t\t\tensureSearchSchema(db);\n\t\t\treturn db;\n\t\t} catch (error) {\n\t\t\tdb.close();\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync *search(text: string, options: SessionSearchOptions = {}): AsyncIterable<SqliteSessionSearchHit> {\n\t\tconst queryText = text.trim();\n\t\tif (!queryText || (options.limit !== undefined && options.limit <= 0)) return;\n\t\tif (options.entryTypes?.length === 0) return;\n\t\tthrowIfAborted(options.signal);\n\t\tconst db = await this.openDatabase();\n\t\ttry {\n\t\t\tconst query = `\"${queryText.replaceAll('\"', '\"\"')}\"`;\n\t\t\tconst predicates = [\"session_search_fts MATCH ?\"];\n\t\t\tconst params: unknown[] = [query];\n\t\t\tif (options.entryTypes !== undefined) {\n\t\t\t\tpredicates.push(`se.type IN (${options.entryTypes.map(() => \"?\").join(\", \")})`);\n\t\t\t\tparams.push(...options.entryTypes);\n\t\t\t}\n\t\t\tconst rows = db\n\t\t\t\t.prepare(\n\t\t\t\t\t`SELECT s.id, s.created_at, s.metadata, s.cwd, s.parent_session_id,\n\t\t\t\t\t\tname_fact.seq IS NOT NULL AS has_session_name,\n\t\t\t\t\t\tname_fact.value AS session_name,\n\t\t\t\t\t\tse.id AS entry_id, se.timestamp, bm25(session_search_fts) AS score\n\t\t\t\t\tFROM session_search_fts\n\t\t\t\t\tJOIN entries AS se ON se.rowid = session_search_fts.rowid\n\t\t\t\t\tJOIN sessions AS s ON s.id = se.session_id\n\t\t\t\t\tLEFT JOIN facts AS name_fact\n\t\t\t\t\t\tON name_fact.session_id = s.id\n\t\t\t\t\t\tAND name_fact.kind = 'name'\n\t\t\t\t\t\tAND name_fact.key IS NULL\n\t\t\t\t\t\tAND name_fact.seq = (\n\t\t\t\t\t\t\tSELECT MAX(f.seq)\n\t\t\t\t\t\t\tFROM facts AS f\n\t\t\t\t\t\t\tWHERE f.session_id = s.id AND f.kind = 'name' AND f.key IS NULL\n\t\t\t\t\t\t)\n\t\t\t\t\tWHERE ${predicates.join(\" AND \")}\n\t\t\t\t\tORDER BY score\n\t\t\t\t\tLIMIT ?`,\n\t\t\t\t)\n\t\t\t\t.iterate<SessionRow & { entry_id: string; timestamp: number; score: number }>(\n\t\t\t\t\t...params,\n\t\t\t\t\toptions.limit ?? -1,\n\t\t\t\t);\n\t\t\tconst path = await this.getDatabasePath();\n\t\t\tfor (const row of rows) {\n\t\t\t\tthrowIfAborted(options.signal);\n\t\t\t\tyield {\n\t\t\t\t\tsessionId: row.id,\n\t\t\t\t\tmetadata: decodeSessionMetadata(row, path),\n\t\t\t\t\tentryId: row.entry_id,\n\t\t\t\t\ttimestamp: row.timestamp,\n\t\t\t\t\tscore: row.score,\n\t\t\t\t};\n\t\t\t}\n\t\t} finally {\n\t\t\tdb.close();\n\t\t}\n\t}\n}\n\nexport function createSqliteSessionSearch(options: SqliteSessionSearchOptions): SessionSearch<SqliteSessionSearchHit> {\n\treturn new SqliteSessionSearch(options);\n}\n"]}
@@ -1,7 +1,14 @@
1
- import { getFileSystemResultOrThrow } from "@earendil-works/pi-agent-core";
1
+ import { SessionError } from "@earendil-works/pi-agent-core";
2
2
  import { applyMigrations } from "./migrations.js";
3
3
  import { sql } from "./sql.js";
4
4
  import { decodeSessionMetadata } from "./storage/sessions.js";
5
+ function getFileSystemResultOrThrow(result, message) {
6
+ if (!result.ok) {
7
+ const code = result.error.code === "not_found" ? "not_found" : "storage";
8
+ throw new SessionError(code, `${message}: ${result.error.message}`, result.error);
9
+ }
10
+ return result.value;
11
+ }
5
12
  function getParentPath(path) {
6
13
  const normalized = path.replace(/[\\/]+$/, "");
7
14
  const lastSlash = Math.max(normalized.lastIndexOf("/"), normalized.lastIndexOf("\\"));
@@ -11,6 +18,15 @@ function getParentPath(path) {
11
18
  return normalized.slice(0, 1);
12
19
  return normalized.slice(0, lastSlash);
13
20
  }
21
+ function throwIfAborted(signal) {
22
+ if (!signal?.aborted)
23
+ return;
24
+ if (signal.reason instanceof Error)
25
+ throw signal.reason;
26
+ const error = new Error("The operation was aborted");
27
+ error.name = "AbortError";
28
+ throw error;
29
+ }
14
30
  function configureSqliteDatabase(db) {
15
31
  sql `PRAGMA journal_mode=WAL`.exec(db);
16
32
  sql `PRAGMA synchronous=FULL`.exec(db);
@@ -19,9 +35,14 @@ function configureSqliteDatabase(db) {
19
35
  function tableExists(db, name) {
20
36
  return !!sql `SELECT 1 AS found FROM sqlite_master WHERE type = 'table' AND name = ${name} LIMIT 1`.get(db);
21
37
  }
38
+ function rebuildSearchIndex(db) {
39
+ sql `INSERT INTO session_search_fts(session_search_fts) VALUES('rebuild')`.run(db);
40
+ }
22
41
  function ensureSearchSchema(db) {
23
42
  const ftsExists = tableExists(db, "session_search_fts");
24
- sql `
43
+ const entriesExist = tableExists(db, "entries");
44
+ db.transaction(() => {
45
+ sql `
25
46
  CREATE VIRTUAL TABLE IF NOT EXISTS session_search_fts USING fts5(
26
47
  payload,
27
48
  content = 'entries',
@@ -39,8 +60,9 @@ CREATE TRIGGER IF NOT EXISTS session_search_fts_au AFTER UPDATE OF payload ON en
39
60
  INSERT INTO session_search_fts(rowid, payload) VALUES (new.rowid, new.payload);
40
61
  END;
41
62
  `.exec(db);
42
- if (!ftsExists)
43
- sql `INSERT INTO session_search_fts(session_search_fts) VALUES('rebuild')`.exec(db);
63
+ if (!ftsExists && entriesExist)
64
+ rebuildSearchIndex(db);
65
+ });
44
66
  }
45
67
  /** SQLite FTS search over a co-located canonical session database. */
46
68
  class SqliteSessionSearch {
@@ -71,39 +93,54 @@ class SqliteSessionSearch {
71
93
  throw error;
72
94
  }
73
95
  }
74
- async search(options) {
75
- const text = options.text.trim();
76
- if (!text)
77
- return [];
96
+ async *search(text, options = {}) {
97
+ const queryText = text.trim();
98
+ if (!queryText || (options.limit !== undefined && options.limit <= 0))
99
+ return;
100
+ if (options.entryTypes?.length === 0)
101
+ return;
102
+ throwIfAborted(options.signal);
78
103
  const db = await this.openDatabase();
79
104
  try {
80
- const query = `"${text.replaceAll('"', '""')}"`;
81
- const cwd = options.cwd ?? null;
82
- const rows = sql `SELECT s.id, s.created_at, s.metadata, s.cwd, s.parent_session_id,
83
- name_fact.seq IS NOT NULL AS has_session_name,
84
- name_fact.value AS session_name,
85
- se.id AS entry_id, se.timestamp, bm25(session_search_fts) AS score
86
- FROM session_search_fts
87
- JOIN entries AS se ON se.rowid = session_search_fts.rowid
88
- JOIN sessions AS s ON s.id = se.session_id
89
- LEFT JOIN facts AS name_fact
90
- ON name_fact.session_id = s.id
91
- AND name_fact.kind = 'name'
92
- AND name_fact.key IS NULL
93
- AND name_fact.seq = (
94
- SELECT MAX(f.seq)
95
- FROM facts AS f
96
- WHERE f.session_id = s.id AND f.kind = 'name' AND f.key IS NULL
97
- )
98
- WHERE session_search_fts MATCH ${query} AND (${cwd} IS NULL OR s.cwd = ${cwd})
99
- ORDER BY score`.all(db);
105
+ const query = `"${queryText.replaceAll('"', '""')}"`;
106
+ const predicates = ["session_search_fts MATCH ?"];
107
+ const params = [query];
108
+ if (options.entryTypes !== undefined) {
109
+ predicates.push(`se.type IN (${options.entryTypes.map(() => "?").join(", ")})`);
110
+ params.push(...options.entryTypes);
111
+ }
112
+ const rows = db
113
+ .prepare(`SELECT s.id, s.created_at, s.metadata, s.cwd, s.parent_session_id,
114
+ name_fact.seq IS NOT NULL AS has_session_name,
115
+ name_fact.value AS session_name,
116
+ se.id AS entry_id, se.timestamp, bm25(session_search_fts) AS score
117
+ FROM session_search_fts
118
+ JOIN entries AS se ON se.rowid = session_search_fts.rowid
119
+ JOIN sessions AS s ON s.id = se.session_id
120
+ LEFT JOIN facts AS name_fact
121
+ ON name_fact.session_id = s.id
122
+ AND name_fact.kind = 'name'
123
+ AND name_fact.key IS NULL
124
+ AND name_fact.seq = (
125
+ SELECT MAX(f.seq)
126
+ FROM facts AS f
127
+ WHERE f.session_id = s.id AND f.kind = 'name' AND f.key IS NULL
128
+ )
129
+ WHERE ${predicates.join(" AND ")}
130
+ ORDER BY score
131
+ LIMIT ?`)
132
+ .iterate(...params, options.limit ?? -1);
100
133
  const path = await this.getDatabasePath();
101
- return rows.map((row) => ({
102
- metadata: decodeSessionMetadata(row, path),
103
- entryId: row.entry_id,
104
- timestamp: row.timestamp,
105
- score: row.score,
106
- }));
134
+ for (const row of rows) {
135
+ throwIfAborted(options.signal);
136
+ yield {
137
+ sessionId: row.id,
138
+ metadata: decodeSessionMetadata(row, path),
139
+ entryId: row.entry_id,
140
+ timestamp: row.timestamp,
141
+ score: row.score,
142
+ };
143
+ }
107
144
  }
108
145
  finally {
109
146
  db.close();
@@ -1 +1 @@
1
- {"version":3,"file":"search-backend.js","sourceRoot":"","sources":["../../src/sqlite/search-backend.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,qBAAqB,EAAmB,MAAM,uBAAuB,CAAC;AAQ/E,SAAS,aAAa,CAAC,IAAY,EAAU;IAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;IACtF,IAAI,SAAS,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IAC9B,IAAI,SAAS,KAAK,CAAC;QAAE,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACnD,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;AAAA,CACtC;AAED,SAAS,uBAAuB,CAAC,EAAkB,EAAQ;IAC1D,GAAG,CAAA,yBAAyB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACtC,GAAG,CAAA,yBAAyB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACtC,GAAG,CAAA,0BAA0B,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAAA,CACvC;AAQD,SAAS,WAAW,CAAC,EAAkB,EAAE,IAAY,EAAW;IAC/D,OAAO,CAAC,CAAC,GAAG,CAAA,wEAAwE,IAAI,UAAU,CAAC,GAAG,CAEnG,EAAE,CAAC,CAAC;AAAA,CACP;AAED,SAAS,kBAAkB,CAAC,EAAkB,EAAQ;IACrD,MAAM,SAAS,GAAG,WAAW,CAAC,EAAE,EAAE,oBAAoB,CAAC,CAAC;IACxD,GAAG,CAAA;;;;;;;;;;;;;;;;;CAiBH,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACV,IAAI,CAAC,SAAS;QAAE,GAAG,CAAA,sEAAsE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAAA,CACnG;AAED,sEAAsE;AACtE,MAAM,mBAAmB;IACP,OAAO,CAA6B;IAC7C,YAAY,CAAqB;IAEzC,YAAY,OAAmC,EAAE;QAChD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IAAA,CACvB;IAEO,KAAK,CAAC,eAAe,GAAoB;QAChD,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACxB,IAAI,CAAC,YAAY,GAAG,0BAA0B,CAC7C,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAC9D,4CAA4C,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CACvE,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,CAAC;IAAA,CACzB;IAEO,KAAK,CAAC,YAAY,GAA4B;QACrD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC1C,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QACtC,0BAA0B,CACzB,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,EAChE,4CAA4C,SAAS,EAAE,CACvD,CAAC;QACF,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC;YACJ,uBAAuB,CAAC,EAAE,CAAC,CAAC;YAC5B,MAAM,eAAe,CAAC,EAAE,CAAC,CAAC;YAC1B,kBAAkB,CAAC,EAAE,CAAC,CAAC;YACvB,OAAO,EAAE,CAAC;QACX,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,KAAK,CAAC;QACb,CAAC;IAAA,CACD;IAED,KAAK,CAAC,MAAM,CAAC,OAA6B,EAAsD;QAC/F,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACjC,IAAI,CAAC,IAAI;YAAE,OAAO,EAAE,CAAC;QACrB,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QACrC,IAAI,CAAC;YACJ,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC;YAChD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC;YAChC,MAAM,IAAI,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;oCAgBiB,KAAK,SAAS,GAAG,uBAAuB,GAAG;kBAC7D,CAAC,GAAG,CAAsE,EAAE,CAAC,CAAC;YAC7F,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBACzB,QAAQ,EAAE,qBAAqB,CAAC,GAAG,EAAE,IAAI,CAAC;gBAC1C,OAAO,EAAE,GAAG,CAAC,QAAQ;gBACrB,SAAS,EAAE,GAAG,CAAC,SAAS;gBACxB,KAAK,EAAE,GAAG,CAAC,KAAK;aAChB,CAAC,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YACV,EAAE,CAAC,KAAK,EAAE,CAAC;QACZ,CAAC;IAAA,CACD;CACD;AAED,MAAM,UAAU,yBAAyB,CAAC,OAAmC,EAAwC;IACpH,OAAO,IAAI,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAAA,CACxC","sourcesContent":["import type { SessionSearch, SessionSearchHit, SessionSearchOptions } from \"@earendil-works/pi-agent-core\";\nimport { getFileSystemResultOrThrow } from \"@earendil-works/pi-agent-core\";\nimport { applyMigrations } from \"./migrations.ts\";\nimport { sql } from \"./sql.ts\";\nimport { decodeSessionMetadata, type SessionRow } from \"./storage/sessions.ts\";\nimport type {\n\tSqliteDatabase,\n\tSqliteDatabaseFactory,\n\tSqliteSessionMetadata,\n\tSqliteSessionRepositoryEnv,\n} from \"./types.ts\";\n\nfunction getParentPath(path: string): string {\n\tconst normalized = path.replace(/[\\\\/]+$/, \"\");\n\tconst lastSlash = Math.max(normalized.lastIndexOf(\"/\"), normalized.lastIndexOf(\"\\\\\"));\n\tif (lastSlash < 0) return \".\";\n\tif (lastSlash === 0) return normalized.slice(0, 1);\n\treturn normalized.slice(0, lastSlash);\n}\n\nfunction configureSqliteDatabase(db: SqliteDatabase): void {\n\tsql`PRAGMA journal_mode=WAL`.exec(db);\n\tsql`PRAGMA synchronous=FULL`.exec(db);\n\tsql`PRAGMA busy_timeout=5000`.exec(db);\n}\n\nexport interface SqliteSessionSearchOptions {\n\tenv: Pick<SqliteSessionRepositoryEnv, \"absolutePath\" | \"createDir\">;\n\tsqlite: SqliteDatabaseFactory;\n\tdatabasePath: string;\n}\n\nfunction tableExists(db: SqliteDatabase, name: string): boolean {\n\treturn !!sql`SELECT 1 AS found FROM sqlite_master WHERE type = 'table' AND name = ${name} LIMIT 1`.get<{\n\t\tfound: number;\n\t}>(db);\n}\n\nfunction ensureSearchSchema(db: SqliteDatabase): void {\n\tconst ftsExists = tableExists(db, \"session_search_fts\");\n\tsql`\nCREATE VIRTUAL TABLE IF NOT EXISTS session_search_fts USING fts5(\n payload,\n content = 'entries',\n content_rowid = 'rowid',\n tokenize = 'trigram remove_diacritics 1'\n);\nCREATE TRIGGER IF NOT EXISTS session_search_fts_ai AFTER INSERT ON entries BEGIN\n INSERT INTO session_search_fts(rowid, payload) VALUES (new.rowid, new.payload);\nEND;\nCREATE TRIGGER IF NOT EXISTS session_search_fts_ad AFTER DELETE ON entries BEGIN\n INSERT INTO session_search_fts(session_search_fts, rowid, payload) VALUES('delete', old.rowid, old.payload);\nEND;\nCREATE TRIGGER IF NOT EXISTS session_search_fts_au AFTER UPDATE OF payload ON entries BEGIN\n INSERT INTO session_search_fts(session_search_fts, rowid, payload) VALUES('delete', old.rowid, old.payload);\n INSERT INTO session_search_fts(rowid, payload) VALUES (new.rowid, new.payload);\nEND;\n`.exec(db);\n\tif (!ftsExists) sql`INSERT INTO session_search_fts(session_search_fts) VALUES('rebuild')`.exec(db);\n}\n\n/** SQLite FTS search over a co-located canonical session database. */\nclass SqliteSessionSearch implements SessionSearch<SqliteSessionMetadata> {\n\tprivate readonly options: SqliteSessionSearchOptions;\n\tprivate databasePath: string | undefined;\n\n\tconstructor(options: SqliteSessionSearchOptions) {\n\t\tthis.options = options;\n\t}\n\n\tprivate async getDatabasePath(): Promise<string> {\n\t\tif (!this.databasePath) {\n\t\t\tthis.databasePath = getFileSystemResultOrThrow(\n\t\t\t\tawait this.options.env.absolutePath(this.options.databasePath),\n\t\t\t\t`Failed to resolve SQLite search database ${this.options.databasePath}`,\n\t\t\t);\n\t\t}\n\t\treturn this.databasePath;\n\t}\n\n\tprivate async openDatabase(): Promise<SqliteDatabase> {\n\t\tconst path = await this.getDatabasePath();\n\t\tconst directory = getParentPath(path);\n\t\tgetFileSystemResultOrThrow(\n\t\t\tawait this.options.env.createDir(directory, { recursive: true }),\n\t\t\t`Failed to create SQLite search directory ${directory}`,\n\t\t);\n\t\tconst db = await this.options.sqlite.open(path);\n\t\ttry {\n\t\t\tconfigureSqliteDatabase(db);\n\t\t\tawait applyMigrations(db);\n\t\t\tensureSearchSchema(db);\n\t\t\treturn db;\n\t\t} catch (error) {\n\t\t\tdb.close();\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync search(options: SessionSearchOptions): Promise<SessionSearchHit<SqliteSessionMetadata>[]> {\n\t\tconst text = options.text.trim();\n\t\tif (!text) return [];\n\t\tconst db = await this.openDatabase();\n\t\ttry {\n\t\t\tconst query = `\"${text.replaceAll('\"', '\"\"')}\"`;\n\t\t\tconst cwd = options.cwd ?? null;\n\t\t\tconst rows = sql`SELECT s.id, s.created_at, s.metadata, s.cwd, s.parent_session_id,\n\t\t\t\tname_fact.seq IS NOT NULL AS has_session_name,\n\t\t\t\tname_fact.value AS session_name,\n\t\t\t\tse.id AS entry_id, se.timestamp, bm25(session_search_fts) AS score\n\t\t\tFROM session_search_fts\n\t\t\tJOIN entries AS se ON se.rowid = session_search_fts.rowid\n\t\t\tJOIN sessions AS s ON s.id = se.session_id\n\t\t\tLEFT JOIN facts AS name_fact\n\t\t\t\tON name_fact.session_id = s.id\n\t\t\t\tAND name_fact.kind = 'name'\n\t\t\t\tAND name_fact.key IS NULL\n\t\t\t\tAND name_fact.seq = (\n\t\t\t\t\tSELECT MAX(f.seq)\n\t\t\t\t\tFROM facts AS f\n\t\t\t\t\tWHERE f.session_id = s.id AND f.kind = 'name' AND f.key IS NULL\n\t\t\t\t)\n\t\t\tWHERE session_search_fts MATCH ${query} AND (${cwd} IS NULL OR s.cwd = ${cwd})\n\t\t\tORDER BY score`.all<SessionRow & { entry_id: string; timestamp: string; score: number }>(db);\n\t\t\tconst path = await this.getDatabasePath();\n\t\t\treturn rows.map((row) => ({\n\t\t\t\tmetadata: decodeSessionMetadata(row, path),\n\t\t\t\tentryId: row.entry_id,\n\t\t\t\ttimestamp: row.timestamp,\n\t\t\t\tscore: row.score,\n\t\t\t}));\n\t\t} finally {\n\t\t\tdb.close();\n\t\t}\n\t}\n}\n\nexport function createSqliteSessionSearch(options: SqliteSessionSearchOptions): SessionSearch<SqliteSessionMetadata> {\n\treturn new SqliteSessionSearch(options);\n}\n"]}
1
+ {"version":3,"file":"search-backend.js","sourceRoot":"","sources":["../../src/sqlite/search-backend.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n\tFileError,\n\tResult,\n\tSessionSearch,\n\tSessionSearchHit,\n\tSessionSearchOptions,\n} from \"@earendil-works/pi-agent-core\";\nimport { SessionError } from \"@earendil-works/pi-agent-core\";\nimport { applyMigrations } from \"./migrations.ts\";\nimport { sql } from \"./sql.ts\";\nimport { decodeSessionMetadata, type SessionRow } from \"./storage/sessions.ts\";\nimport type {\n\tSqliteDatabase,\n\tSqliteDatabaseFactory,\n\tSqliteSessionMetadata,\n\tSqliteSessionRepositoryEnv,\n} from \"./types.ts\";\n\nfunction getFileSystemResultOrThrow<TValue>(result: Result<TValue, FileError>, message: string): TValue {\n\tif (!result.ok) {\n\t\tconst code = result.error.code === \"not_found\" ? \"not_found\" : \"storage\";\n\t\tthrow new SessionError(code, `${message}: ${result.error.message}`, result.error);\n\t}\n\treturn result.value;\n}\n\nfunction getParentPath(path: string): string {\n\tconst normalized = path.replace(/[\\\\/]+$/, \"\");\n\tconst lastSlash = Math.max(normalized.lastIndexOf(\"/\"), normalized.lastIndexOf(\"\\\\\"));\n\tif (lastSlash < 0) return \".\";\n\tif (lastSlash === 0) return normalized.slice(0, 1);\n\treturn normalized.slice(0, lastSlash);\n}\n\nfunction throwIfAborted(signal: AbortSignal | undefined): void {\n\tif (!signal?.aborted) return;\n\tif (signal.reason instanceof Error) throw signal.reason;\n\tconst error = new Error(\"The operation was aborted\");\n\terror.name = \"AbortError\";\n\tthrow error;\n}\n\nfunction configureSqliteDatabase(db: SqliteDatabase): void {\n\tsql`PRAGMA journal_mode=WAL`.exec(db);\n\tsql`PRAGMA synchronous=FULL`.exec(db);\n\tsql`PRAGMA busy_timeout=5000`.exec(db);\n}\n\nexport interface SqliteSessionSearchOptions {\n\tenv: Pick<SqliteSessionRepositoryEnv, \"absolutePath\" | \"createDir\">;\n\tsqlite: SqliteDatabaseFactory;\n\tdatabasePath: string;\n}\n\nfunction tableExists(db: SqliteDatabase, name: string): boolean {\n\treturn !!sql`SELECT 1 AS found FROM sqlite_master WHERE type = 'table' AND name = ${name} LIMIT 1`.get<{\n\t\tfound: number;\n\t}>(db);\n}\n\nfunction rebuildSearchIndex(db: SqliteDatabase): void {\n\tsql`INSERT INTO session_search_fts(session_search_fts) VALUES('rebuild')`.run(db);\n}\n\nfunction ensureSearchSchema(db: SqliteDatabase): void {\n\tconst ftsExists = tableExists(db, \"session_search_fts\");\n\tconst entriesExist = tableExists(db, \"entries\");\n\tdb.transaction(() => {\n\t\tsql`\nCREATE VIRTUAL TABLE IF NOT EXISTS session_search_fts USING fts5(\n payload,\n content = 'entries',\n content_rowid = 'rowid',\n tokenize = 'trigram remove_diacritics 1'\n);\nCREATE TRIGGER IF NOT EXISTS session_search_fts_ai AFTER INSERT ON entries BEGIN\n INSERT INTO session_search_fts(rowid, payload) VALUES (new.rowid, new.payload);\nEND;\nCREATE TRIGGER IF NOT EXISTS session_search_fts_ad AFTER DELETE ON entries BEGIN\n INSERT INTO session_search_fts(session_search_fts, rowid, payload) VALUES('delete', old.rowid, old.payload);\nEND;\nCREATE TRIGGER IF NOT EXISTS session_search_fts_au AFTER UPDATE OF payload ON entries BEGIN\n INSERT INTO session_search_fts(session_search_fts, rowid, payload) VALUES('delete', old.rowid, old.payload);\n INSERT INTO session_search_fts(rowid, payload) VALUES (new.rowid, new.payload);\nEND;\n`.exec(db);\n\t\tif (!ftsExists && entriesExist) rebuildSearchIndex(db);\n\t});\n}\n\nexport interface SqliteSessionSearchHit extends SessionSearchHit {\n\treadonly metadata: SqliteSessionMetadata;\n\treadonly timestamp: number;\n\treadonly score: number;\n}\n\n/** SQLite FTS search over a co-located canonical session database. */\nclass SqliteSessionSearch implements SessionSearch<SqliteSessionSearchHit> {\n\tprivate readonly options: SqliteSessionSearchOptions;\n\tprivate databasePath: string | undefined;\n\n\tconstructor(options: SqliteSessionSearchOptions) {\n\t\tthis.options = options;\n\t}\n\n\tprivate async getDatabasePath(): Promise<string> {\n\t\tif (!this.databasePath) {\n\t\t\tthis.databasePath = getFileSystemResultOrThrow(\n\t\t\t\tawait this.options.env.absolutePath(this.options.databasePath),\n\t\t\t\t`Failed to resolve SQLite search database ${this.options.databasePath}`,\n\t\t\t);\n\t\t}\n\t\treturn this.databasePath;\n\t}\n\n\tprivate async openDatabase(): Promise<SqliteDatabase> {\n\t\tconst path = await this.getDatabasePath();\n\t\tconst directory = getParentPath(path);\n\t\tgetFileSystemResultOrThrow(\n\t\t\tawait this.options.env.createDir(directory, { recursive: true }),\n\t\t\t`Failed to create SQLite search directory ${directory}`,\n\t\t);\n\t\tconst db = await this.options.sqlite.open(path);\n\t\ttry {\n\t\t\tconfigureSqliteDatabase(db);\n\t\t\tawait applyMigrations(db);\n\t\t\tensureSearchSchema(db);\n\t\t\treturn db;\n\t\t} catch (error) {\n\t\t\tdb.close();\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync *search(text: string, options: SessionSearchOptions = {}): AsyncIterable<SqliteSessionSearchHit> {\n\t\tconst queryText = text.trim();\n\t\tif (!queryText || (options.limit !== undefined && options.limit <= 0)) return;\n\t\tif (options.entryTypes?.length === 0) return;\n\t\tthrowIfAborted(options.signal);\n\t\tconst db = await this.openDatabase();\n\t\ttry {\n\t\t\tconst query = `\"${queryText.replaceAll('\"', '\"\"')}\"`;\n\t\t\tconst predicates = [\"session_search_fts MATCH ?\"];\n\t\t\tconst params: unknown[] = [query];\n\t\t\tif (options.entryTypes !== undefined) {\n\t\t\t\tpredicates.push(`se.type IN (${options.entryTypes.map(() => \"?\").join(\", \")})`);\n\t\t\t\tparams.push(...options.entryTypes);\n\t\t\t}\n\t\t\tconst rows = db\n\t\t\t\t.prepare(\n\t\t\t\t\t`SELECT s.id, s.created_at, s.metadata, s.cwd, s.parent_session_id,\n\t\t\t\t\t\tname_fact.seq IS NOT NULL AS has_session_name,\n\t\t\t\t\t\tname_fact.value AS session_name,\n\t\t\t\t\t\tse.id AS entry_id, se.timestamp, bm25(session_search_fts) AS score\n\t\t\t\t\tFROM session_search_fts\n\t\t\t\t\tJOIN entries AS se ON se.rowid = session_search_fts.rowid\n\t\t\t\t\tJOIN sessions AS s ON s.id = se.session_id\n\t\t\t\t\tLEFT JOIN facts AS name_fact\n\t\t\t\t\t\tON name_fact.session_id = s.id\n\t\t\t\t\t\tAND name_fact.kind = 'name'\n\t\t\t\t\t\tAND name_fact.key IS NULL\n\t\t\t\t\t\tAND name_fact.seq = (\n\t\t\t\t\t\t\tSELECT MAX(f.seq)\n\t\t\t\t\t\t\tFROM facts AS f\n\t\t\t\t\t\t\tWHERE f.session_id = s.id AND f.kind = 'name' AND f.key IS NULL\n\t\t\t\t\t\t)\n\t\t\t\t\tWHERE ${predicates.join(\" AND \")}\n\t\t\t\t\tORDER BY score\n\t\t\t\t\tLIMIT ?`,\n\t\t\t\t)\n\t\t\t\t.iterate<SessionRow & { entry_id: string; timestamp: number; score: number }>(\n\t\t\t\t\t...params,\n\t\t\t\t\toptions.limit ?? -1,\n\t\t\t\t);\n\t\t\tconst path = await this.getDatabasePath();\n\t\t\tfor (const row of rows) {\n\t\t\t\tthrowIfAborted(options.signal);\n\t\t\t\tyield {\n\t\t\t\t\tsessionId: row.id,\n\t\t\t\t\tmetadata: decodeSessionMetadata(row, path),\n\t\t\t\t\tentryId: row.entry_id,\n\t\t\t\t\ttimestamp: row.timestamp,\n\t\t\t\t\tscore: row.score,\n\t\t\t\t};\n\t\t\t}\n\t\t} finally {\n\t\t\tdb.close();\n\t\t}\n\t}\n}\n\nexport function createSqliteSessionSearch(options: SqliteSessionSearchOptions): SessionSearch<SqliteSessionSearchHit> {\n\treturn new SqliteSessionSearch(options);\n}\n"]}