@morlay/session-rdb 0.0.12 → 0.0.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/artifact.d.mts +64 -0
- package/dist/artifact.mjs +3 -0
- package/dist/import-D2vUnUZe.mjs +438 -0
- package/dist/import.d.mts +24 -0
- package/dist/import.mjs +2 -0
- package/dist/index-uUvn6gYp.d.mts +111 -0
- package/dist/index.d.mts +3 -203
- package/dist/index.mjs +7 -1571
- package/dist/invariant.d.mts +1 -2
- package/dist/invariant.mjs +0 -2
- package/dist/magic-string.es-BWtG0AyA.mjs +1017 -0
- package/dist/schema-B-8G4lWc.mjs +852 -0
- package/dist/schema-CFXZURX7.d.mts +116 -0
- package/dist/sqlite-DIXY-dFZ.mjs +356 -0
- package/dist/storage.d.mts +44 -0
- package/dist/storage.mjs +3 -0
- package/dist/testing.d.mts +31 -0
- package/dist/testing.mjs +16051 -0
- package/package.json +19 -2
- package/src/artifact.ts +4 -0
- package/src/index.ts +4 -0
- package/src/log.ts +86 -0
- package/src/storage.ts +5 -0
- package/src/testing/contract.ts +562 -0
- package/src/testing/coordinator-contract.ts +1723 -0
- package/src/testing/helpers.ts +20 -0
- package/src/testing.ts +12 -0
- package/dist/index.d.mts.map +0 -1
- package/dist/index.mjs.map +0 -1
- package/dist/invariant.d.mts.map +0 -1
- package/dist/invariant.mjs.map +0 -1
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Context } from "@deepseek-ai/cordis";
|
|
2
|
+
import { SettingsProvider, type SettingsNamespace } from "@deepseek-ai/dsh-settings";
|
|
3
|
+
|
|
4
|
+
export class EmptySettings extends SettingsProvider {
|
|
5
|
+
constructor(ctx: Context) {
|
|
6
|
+
super(ctx);
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
get writable(): boolean {
|
|
10
|
+
return true;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
protected async load(): Promise<Record<string, unknown>> {
|
|
14
|
+
return {};
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
protected persist(_ns: SettingsNamespace, _section: Record<string, unknown>): Promise<void> {
|
|
18
|
+
return Promise.resolve();
|
|
19
|
+
}
|
|
20
|
+
}
|
package/src/testing.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// 测试支撑(跨包测试共享):helpers / contract / coordinator-contract。
|
|
2
|
+
// 仅供 vitest 测试引用;不进入运行时 bundle。
|
|
3
|
+
export { EmptySettings } from "./testing/helpers.ts";
|
|
4
|
+
export type { ContractBackend } from "./testing/contract.ts";
|
|
5
|
+
export {
|
|
6
|
+
appendLog,
|
|
7
|
+
meta,
|
|
8
|
+
oneTurnLog,
|
|
9
|
+
runPersistenceContract,
|
|
10
|
+
} from "./testing/contract.ts";
|
|
11
|
+
export type { CoordinatorFixture } from "./testing/coordinator-contract.ts";
|
|
12
|
+
export { runCoordinatorContract } from "./testing/coordinator-contract.ts";
|
package/dist/index.d.mts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/backend.ts","../src/write-guard.ts","../src/schema.ts","../src/branch.ts","../src/index.ts"],"mappings":"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"}
|
package/dist/index.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["raw","buildColumn","sqliteCheck","text","integer","pgCheck","unique","index","drizzle","drizzlePg"],"sources":["../src/write-guard.ts","../src/log.ts","../src/entities/types.ts","../src/adapters/to-sqlite.ts","../src/adapters/to-postgres.ts","../src/adapters/ddl.ts","../src/entities/persistence-state.ts","../src/entities/schema-meta.ts","../src/entities/sessions.ts","../src/entities/events.ts","../src/entities/session-events.ts","../src/entities/index.ts","../src/schema.ts","../src/migrate.ts","../src/sqlite.ts","../src/postgres.ts","../src/branch.ts","../src/import.ts","../src/index.ts"],"sourcesContent":["import type { SessionId } from \"@deepseek-ai/dsh-session\";\n\nexport class WriteGuard {\n private readonly headSeqs = new Map<SessionId, number>();\n\n confirmHead(id: SessionId, head: number): void {\n this.headSeqs.set(id, head);\n }\n\n assertNoConcurrentWriter(id: SessionId, storedHead: number): void {\n const known = this.headSeqs.get(id);\n if (known === undefined) {\n if (storedHead !== -1) {\n throw new Error(\n `session \"${id}\" has a persisted log this instance has not read; another writer may own it — load the session first`,\n );\n }\n return;\n }\n if (known !== storedHead) {\n throw new Error(\n `session \"${id}\" was modified by another writer (stored head ${storedHead}, this instance last confirmed head ${known}); ` +\n \"concurrent writers on one session are not supported\",\n );\n }\n }\n}\n","import type { SessionEvent, SessionHeader, SessionId, SurfaceOp } from \"@deepseek-ai/dsh-session\";\nimport { SessionSeq, encodeSeqRanges, packChunkRuns } from \"@deepseek-ai/dsh-session\";\nimport type { SessionStorageMetadata } from \"@deepseek-ai/dsh-session-persistence\";\nimport type { EventRow, SessionRow } from \"./backend.ts\";\n\nexport function rowToMeta(row: SessionRow): SessionHeader {\n if (!Number.isSafeInteger(row.fCreatedAt) || row.fCreatedAt < 0) {\n throw new Error(\"stored session createdAt must be a non-negative safe integer\");\n }\n return {\n version: row.fVersion,\n id: row.fSessionId as SessionId,\n createdAt: row.fCreatedAt,\n ...(row.fCwd !== null ? { cwd: row.fCwd } : {}),\n ...(row.fParentSession !== null ? { parentSession: row.fParentSession as SessionId } : {}),\n isSeeded: row.fSeedLength !== null,\n ...(row.fOrigin !== null ? { origin: row.fOrigin as \"subagent\" } : {}),\n ...(row.fDelegationDepth === null ? {} : { delegationDepth: row.fDelegationDepth }),\n };\n}\n\nexport function sessionInsertRow(\n storage: SessionStorageMetadata,\n incarnation: string,\n): {\n fSessionId: string;\n fHeadEventId: string;\n fHeadSequence: number;\n fVersion: number;\n fCreatedAt: number;\n fCwd: string | null;\n fParentSession: string | null;\n fSeedLength: number | null;\n fOrigin: string | null;\n fDelegationDepth: number | null;\n fIncarnation: string;\n fRevision: number;\n} {\n const meta = storage.meta;\n return {\n fSessionId: meta.id,\n fHeadEventId: \"\",\n fHeadSequence: -1,\n fVersion: meta.version,\n fCreatedAt: meta.createdAt,\n fCwd: meta.cwd ?? null,\n fParentSession: meta.parentSession ?? null,\n fSeedLength: meta.isSeeded ? storage.inheritedEventCount : null,\n fOrigin: meta.origin ?? null,\n fDelegationDepth: meta.delegationDepth ?? null,\n fIncarnation: incarnation,\n fRevision: 0,\n };\n}\n\nexport function sessionConflictRow(storage: SessionStorageMetadata): {\n fVersion: number;\n fCreatedAt: number;\n fCwd: string | null;\n fParentSession: string | null;\n fSeedLength: number | null;\n fOrigin: string | null;\n fDelegationDepth: number | null;\n} {\n const meta = storage.meta;\n return {\n fVersion: meta.version,\n fCreatedAt: meta.createdAt,\n fCwd: meta.cwd ?? null,\n fParentSession: meta.parentSession ?? null,\n fSeedLength: meta.isSeeded ? storage.inheritedEventCount : null,\n fOrigin: meta.origin ?? null,\n fDelegationDepth: meta.delegationDepth ?? null,\n };\n}\n\nexport function remapSurfaceOp(op: SurfaceOp, remap: (seq: number) => number): SurfaceOp {\n if (op === \"append\") return op;\n return {\n op: \"replace\",\n start: SessionSeq(remap(op.start)),\n end: SessionSeq(remap(op.end)),\n };\n}\n\nexport function remapShadowedRange(\n range: { start: number; end: number },\n remap: (seq: number) => number,\n): { start: number; end: number } {\n return { start: remap(range.start), end: remap(range.end) };\n}\n\nexport function rowToEvent(row: EventRow, seqMap: ReadonlyMap<number, number>): SessionEvent {\n const remap = (seq: number): number => seqMap.get(seq) ?? seq;\n const surfaceOp =\n row.fSurfaceOp !== null\n ? remapSurfaceOp(JSON.parse(row.fSurfaceOp) as SurfaceOp, remap)\n : undefined;\n const data = JSON.parse(row.fData) as SessionEvent[\"data\"];\n // compaction 事件的 shadowedRange 是插件合并字段,经结构化视图重映射。\n if (row.fType === \"compaction/summary\" || row.fType === \"compaction/prune\") {\n const metering = data as unknown as { shadowedRange?: { start: number; end: number } };\n if (metering.shadowedRange !== undefined) {\n metering.shadowedRange = remapShadowedRange(metering.shadowedRange, remap);\n }\n }\n return {\n type: row.fType as SessionEvent[\"type\"],\n seq: row.fSequence,\n time: row.fCreatedAt,\n data,\n ...(surfaceOp === undefined ? {} : { surfaceOp }),\n } as SessionEvent;\n}\n\nexport function buildSeqMap(\n rows: readonly Pick<EventRow, \"fSequence\" | \"fOriginalSeq\">[],\n): Map<number, number> {\n const map = new Map<number, number>();\n for (const row of rows) {\n if (!map.has(row.fOriginalSeq)) map.set(row.fOriginalSeq, row.fSequence);\n }\n return map;\n}\n\nconst SURFACE_EVENT_TYPES = new Set([\"user/message\", \"assistant/message\", \"tool/result\"]);\n\nexport function recomputeReplaceProvenance(events: SessionEvent[]): void {\n for (const event of events) {\n const raw = event as SessionEvent & { surfaceOp?: unknown; sourceEventSeqs?: number[] };\n const op = raw.surfaceOp;\n if (typeof op !== \"object\" || op === null || (op as { op?: string }).op !== \"replace\") {\n continue;\n }\n const { start, end } = op as { start: number; end: number };\n const refs: number[] = [];\n for (const candidate of events) {\n if (\n candidate.seq >= start &&\n candidate.seq <= end &&\n SURFACE_EVENT_TYPES.has(candidate.type)\n ) {\n refs.push(candidate.seq);\n }\n }\n raw.sourceEventSeqs = refs;\n }\n}\n\nfunction isEventSeqLike(value: unknown): value is number {\n return (\n typeof value === \"number\" && Number.isSafeInteger(value) && value >= 0 && !Object.is(value, -0)\n );\n}\n\nfunction isDeepEqualJson(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (Array.isArray(a) || Array.isArray(b)) {\n if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) return false;\n return a.every((item, i) => isDeepEqualJson(item, b[i]));\n }\n if (typeof a !== \"object\" || typeof b !== \"object\" || a === null || b === null) return false;\n const aKeys = Object.keys(a as Record<string, unknown>);\n const bRecord = b as Record<string, unknown>;\n if (aKeys.length !== Object.keys(bRecord).length) return false;\n return aKeys.every(\n (key) =>\n Object.hasOwn(bRecord, key) &&\n isDeepEqualJson((a as Record<string, unknown>)[key], bRecord[key]),\n );\n}\n\nfunction toolResultRewriteContentOnly(original: SessionEvent, replacement: SessionEvent): boolean {\n const originalData = original.data as Record<string, unknown>;\n const replacementData = replacement.data as Record<string, unknown>;\n const originalMessage = originalData[\"message\"] as { content?: unknown } | undefined;\n const replacementMessage = replacementData[\"message\"] as { content?: unknown } | undefined;\n const originalContent = Array.isArray(originalMessage?.content)\n ? originalMessage.content\n : undefined;\n const replacementContent = Array.isArray(replacementMessage?.content)\n ? replacementMessage.content\n : undefined;\n if (originalContent === undefined || replacementContent === undefined) return false;\n const originalRest = {\n ...originalData,\n message: {\n ...originalMessage,\n content: [{ ...(originalContent[0] as Record<string, unknown>), content: null }],\n },\n };\n const replacementRest = {\n ...replacementData,\n message: {\n ...replacementMessage,\n content: [{ ...(replacementContent[0] as Record<string, unknown>), content: null }],\n },\n };\n return isDeepEqualJson(originalRest, replacementRest);\n}\n\nexport function findSurfaceRepairs(events: readonly SessionEvent[]): {\n degradeToAppend: Set<number>;\n addAppendMarker: Set<number>;\n clearSurfaceOp: Set<number>;\n} {\n const nodes: number[] = [];\n const degradeToAppend = new Set<number>();\n const addAppendMarker = new Set<number>();\n const clearSurfaceOp = new Set<number>();\n for (const event of events) {\n const raw = event as SessionEvent & { surfaceOp?: unknown };\n const op = raw.surfaceOp;\n if (op === undefined) {\n if (SURFACE_EVENT_TYPES.has(event.type)) {\n addAppendMarker.add(event.seq);\n nodes.push(event.seq);\n }\n continue;\n }\n if (op === \"append\") {\n if (SURFACE_EVENT_TYPES.has(event.type)) nodes.push(event.seq);\n else clearSurfaceOp.add(event.seq);\n continue;\n }\n if (!SURFACE_EVENT_TYPES.has(event.type)) {\n clearSurfaceOp.add(event.seq);\n continue;\n }\n const replace =\n typeof op === \"object\" && op !== null && !Array.isArray(op)\n ? (op as Record<string, unknown>)\n : undefined;\n const start = replace?.[\"start\"];\n const end = replace?.[\"end\"];\n const shapeOk =\n replace !== undefined &&\n replace[\"op\"] === \"replace\" &&\n isEventSeqLike(start) &&\n isEventSeqLike(end);\n const startIdx = shapeOk ? nodes.indexOf(start as number) : -1;\n const endIdx = shapeOk ? nodes.indexOf(end as number) : -1;\n const rangeOk = shapeOk && startIdx !== -1 && endIdx !== -1 && startIdx <= endIdx;\n let rewriteOk = true;\n if (rangeOk && event.type === \"tool/result\") {\n const shadowed = nodes.slice(startIdx, endIdx + 1);\n if (shadowed.length !== 1) {\n rewriteOk = false;\n } else {\n const original = events[shadowed[0]!];\n rewriteOk =\n original?.type === \"tool/result\" && toolResultRewriteContentOnly(original, event);\n }\n }\n if (!rangeOk || !rewriteOk) {\n degradeToAppend.add(event.seq);\n nodes.push(event.seq);\n continue;\n }\n nodes.splice(startIdx, endIdx - startIdx + 1, event.seq);\n }\n return { degradeToAppend, addAppendMarker, clearSurfaceOp };\n}\n\nexport function repairSurfaceOps(events: SessionEvent[]): void {\n const repairs = findSurfaceRepairs(events);\n if (\n repairs.degradeToAppend.size === 0 &&\n repairs.addAppendMarker.size === 0 &&\n repairs.clearSurfaceOp.size === 0\n ) {\n return;\n }\n for (const event of events) {\n const raw = event as SessionEvent & { surfaceOp?: unknown };\n if (repairs.degradeToAppend.has(event.seq)) {\n raw.surfaceOp = \"append\";\n } else if (repairs.addAppendMarker.has(event.seq)) {\n raw.surfaceOp = \"append\";\n } else if (repairs.clearSurfaceOp.has(event.seq)) {\n delete raw.surfaceOp;\n }\n }\n}\n\nexport function scanRows(\n rows: readonly EventRow[],\n base = 0,\n seqMap: ReadonlyMap<number, number> = new Map(),\n): { preserved: SessionEvent[]; tornFrom?: number } {\n // Pass 1:解析每行 data;JSON 非法的行是洞(seq/type 列即使在 data 损坏\n // 时也存在)。\n interface Parsed {\n ok: boolean;\n event?: SessionEvent;\n }\n const parsed: Parsed[] = rows.map((row) => {\n try {\n return { ok: true, event: rowToEvent(row, seqMap) };\n } catch {\n return { ok: false };\n }\n });\n\n // 最后一个合法 turn/end 的索引——洞在闭合轮内一律是已提交损坏。\n let lastTurnEnd = -1;\n for (let i = parsed.length - 1; i >= 0; i--) {\n if (parsed[i]?.ok && rows[i]?.fType === \"turn/end\") {\n lastTurnEnd = i;\n break;\n }\n }\n\n // 保留连续前缀(含完整的中断轮);最后一个已提交边界之前的洞抛错,\n // 之后的洞停止(torn tail)。\n const preserved: SessionEvent[] = [];\n for (let i = 0; i < rows.length; i++) {\n const p = parsed[i];\n if (!p?.ok || p.event === undefined) {\n if (i <= lastTurnEnd)\n throw new Error(\n `corrupt session log: unparsable committed event at seq ${rows[i]?.fSequence}`,\n );\n break; // 最后一个 turn/end 之后的 torn tail 片段——停止、容忍\n }\n if (p.event.seq !== base + i) {\n if (i <= lastTurnEnd)\n throw new Error(\n `corrupt session log: seq gap in committed region (expected ${base + i}, got ${p.event.seq})`,\n );\n break; // 最后一个 turn/end 之后的 seq 空洞——torn tail,停止\n }\n preserved.push(p.event);\n }\n\n // 保留前缀之外的行是未提交的 torn tail;其首个 seq 是物理删除起点。\n return preserved.length < rows.length\n ? { preserved, tornFrom: base + preserved.length }\n : { preserved };\n}\n\nfunction toStorageRecord(record: import(\"@deepseek-ai/dsh-session\").StorageRecord): unknown {\n const withSeqs = record as import(\"@deepseek-ai/dsh-session\").StorageRecord & {\n sourceEventSeqs?: unknown;\n };\n if (withSeqs.sourceEventSeqs === undefined) return record;\n return { ...record, sourceEventSeqs: encodeSeqRanges(withSeqs.sourceEventSeqs as never) };\n}\n\nexport function toJsonlArtifact(\n meta: SessionHeader,\n inheritedEventCount: number,\n events: readonly SessionEvent[],\n): string {\n const header = {\n type: \"session\",\n version: meta.version,\n id: meta.id,\n createdAt: meta.createdAt,\n ...(meta.cwd === undefined ? {} : { cwd: meta.cwd }),\n ...(meta.parentSession === undefined ? {} : { parentSession: meta.parentSession }),\n ...(meta.isSeeded ? { seedLength: inheritedEventCount } : {}),\n ...(meta.origin === undefined ? {} : { origin: meta.origin }),\n delegationDepth: meta.delegationDepth ?? 0,\n ...(meta.agentPreset === undefined ? {} : { agentPreset: meta.agentPreset }),\n };\n const lines = [JSON.stringify(header)];\n for (const record of packChunkRuns(events)) lines.push(JSON.stringify(toStorageRecord(record)));\n return lines.join(\"\\n\");\n}\n","export type ColumnTypeName = \"serial\" | \"integer\" | \"bigint\" | \"text\";\n\nexport type DeleteAction = \"cascade\" | \"set null\" | \"restrict\" | \"no action\";\n\nexport interface ColumnDef {\n name: string;\n type: ColumnTypeName;\n notNull?: boolean;\n\n primaryKey?: boolean;\n\n default?: string | number;\n\n unique?: boolean;\n\n references?: {\n table: string;\n column: string;\n onDelete?: DeleteAction;\n };\n}\n\nexport interface CheckDef {\n name: string;\n expression: string;\n}\n\nexport interface UniqueDef {\n name?: string;\n columns: string[];\n}\n\nexport interface IndexDef {\n name: string;\n columns: string[];\n}\n\nexport interface TableDef {\n name: string;\n columns: ColumnDef[];\n checks?: CheckDef[];\n uniques?: UniqueDef[];\n indexes?: IndexDef[];\n}\n\nexport function toProperty(name: string): string {\n return name.replace(/_([a-z])/g, (_match, char: string) => char.toUpperCase());\n}\n","import { sql } from \"drizzle-orm\";\nimport {\n check as sqliteCheck,\n index,\n integer,\n sqliteTable,\n text,\n unique,\n type AnySQLiteColumn,\n type AnySQLiteTable,\n type SQLiteColumnBuilder,\n} from \"drizzle-orm/sqlite-core\";\nimport { toProperty, type ColumnDef, type TableDef } from \"../entities/types.ts\";\n\ntype TableRegistry = Record<string, AnySQLiteTable>;\n\nfunction buildColumn(c: ColumnDef, tables: TableRegistry): SQLiteColumnBuilder {\n // 具体 builder 类型与基类在方法层面不兼容(泛型逆变),构建阶段用宽松\n // 类型合并,返回时收窄为基类;查询类型安全由手写行接口兜底。\n let col: any;\n switch (c.type) {\n case \"text\":\n col = text(c.name);\n break;\n case \"serial\":\n col = integer(c.name).primaryKey({ autoIncrement: true });\n break;\n case \"integer\":\n case \"bigint\": {\n const built = integer(c.name);\n col = c.primaryKey ? built.primaryKey() : built;\n break;\n }\n }\n if (c.notNull) col = col.notNull();\n if (c.default !== undefined) col = col.default(c.default);\n if (c.unique) col = col.unique();\n if (c.references) {\n const { table, column, onDelete } = c.references;\n col = col.references(\n () => (tables[table] as unknown as Record<string, AnySQLiteColumn>)[toProperty(column)],\n { onDelete },\n );\n }\n return col as SQLiteColumnBuilder;\n}\n\nexport function toSqliteSchema(defs: readonly TableDef[]): Record<string, AnySQLiteTable> {\n const tables: TableRegistry = {};\n for (const def of defs) {\n const columns: Record<string, SQLiteColumnBuilder> = {};\n for (const c of def.columns) columns[toProperty(c.name)] = buildColumn(c, tables);\n const extra = (self: Record<string, unknown>) => [\n ...(def.checks ?? []).map((c) => sqliteCheck(c.name, sql.raw(c.expression))),\n ...(def.uniques ?? []).map((u) =>\n unique(u.name).on(\n ...(u.columns.map((name) => self[toProperty(name)] as AnySQLiteColumn) as [\n AnySQLiteColumn,\n ...AnySQLiteColumn[],\n ]),\n ),\n ),\n ...(def.indexes ?? []).map((i) =>\n index(i.name).on(\n ...(i.columns.map((name) => self[toProperty(name)] as AnySQLiteColumn) as [\n AnySQLiteColumn,\n ...AnySQLiteColumn[],\n ]),\n ),\n ),\n ];\n tables[def.name] = sqliteTable(\n def.name,\n columns as Record<string, SQLiteColumnBuilder>,\n extra as never,\n );\n }\n return tables;\n}\n","import { sql } from \"drizzle-orm\";\nimport {\n bigint,\n check as pgCheck,\n index,\n integer,\n pgSchema,\n pgTable,\n serial,\n text,\n unique,\n type AnyPgColumn,\n type AnyPgColumnBuilder,\n type AnyPgTable,\n} from \"drizzle-orm/pg-core\";\nimport { toProperty, type ColumnDef, type TableDef } from \"../entities/types.ts\";\n\ntype TableRegistry = Record<string, AnyPgTable>;\n\nfunction buildColumn(c: ColumnDef, tables: TableRegistry): AnyPgColumnBuilder {\n // 具体 builder 类型与 AnyPgColumnBuilder 在方法层面不兼容,构建阶段用宽松类型。\n let col: any;\n switch (c.type) {\n case \"text\":\n col = text(c.name);\n break;\n case \"serial\":\n col = serial(c.name).primaryKey();\n break;\n case \"integer\": {\n const built = integer(c.name);\n col = c.primaryKey ? built.primaryKey() : built;\n break;\n }\n case \"bigint\": {\n const built = bigint(c.name, { mode: \"number\" });\n col = c.primaryKey ? built.primaryKey() : built;\n break;\n }\n }\n if (c.notNull) col = col.notNull();\n if (c.default !== undefined) col = col.default(c.default);\n if (c.unique) col = col.unique();\n if (c.references) {\n const { table, column, onDelete } = c.references;\n col = col.references(\n () => (tables[table] as unknown as Record<string, AnyPgColumn>)[toProperty(column)],\n { onDelete },\n );\n }\n return col;\n}\n\nexport function toPostgresSchema(\n defs: readonly TableDef[],\n schemaName = \"public\",\n): Record<string, AnyPgTable> {\n const tables: TableRegistry = {};\n // `pgSchema(name).table` 使表对象携带 schema 限定(查询/DDL 显式引用,\n // 不依赖 search_path);public 与无 schema 行为一致。\n const table = schemaName === \"public\" ? pgTable : pgSchema(schemaName).table;\n for (const def of defs) {\n const columns: Record<string, AnyPgColumnBuilder> = {};\n for (const c of def.columns) columns[toProperty(c.name)] = buildColumn(c, tables);\n const extra = (self: Record<string, unknown>) => [\n ...(def.checks ?? []).map((c) => pgCheck(c.name, sql.raw(c.expression))),\n ...(def.uniques ?? []).map((u) =>\n unique(u.name).on(\n ...(u.columns.map((name) => self[toProperty(name)] as AnyPgColumn) as [\n AnyPgColumn,\n ...AnyPgColumn[],\n ]),\n ),\n ),\n ...(def.indexes ?? []).map((i) =>\n index(i.name).on(\n ...(i.columns.map((name) => self[toProperty(name)] as AnyPgColumn) as [\n AnyPgColumn,\n ...AnyPgColumn[],\n ]),\n ),\n ),\n ];\n tables[def.name] = (table as typeof pgTable)(\n def.name,\n columns as Record<string, AnyPgColumnBuilder>,\n extra as never,\n );\n }\n return tables;\n}\n","import type { ColumnDef, TableDef } from \"../entities/types.ts\";\n\nexport type Dialect = \"sqlite\" | \"postgres\";\n\nfunction sqlType(dialect: Dialect, type: ColumnDef[\"type\"]): string {\n switch (type) {\n case \"serial\":\n return dialect === \"sqlite\" ? \"INTEGER\" : \"SERIAL\";\n case \"integer\":\n return \"INTEGER\";\n case \"bigint\":\n return dialect === \"sqlite\" ? \"INTEGER\" : \"BIGINT\";\n case \"text\":\n return \"TEXT\";\n }\n}\n\nfunction literal(value: string | number): string {\n return typeof value === \"string\" ? `'${value.replace(/'/g, \"''\")}'` : String(value);\n}\n\nfunction quote(name: string): string {\n return `\"${name}\"`;\n}\n\nfunction columnSql(dialect: Dialect, c: ColumnDef): string {\n let sql = `${quote(c.name)} ${sqlType(dialect, c.type)}`;\n if (c.primaryKey) sql += \" PRIMARY KEY\";\n if (c.type === \"serial\" && dialect === \"sqlite\") sql += \" AUTOINCREMENT\";\n if (c.notNull) sql += \" NOT NULL\";\n if (c.default !== undefined) sql += ` DEFAULT ${literal(c.default)}`;\n if (c.unique) sql += \" UNIQUE\";\n if (c.references) {\n sql += ` REFERENCES ${quote(c.references.table)}(${quote(c.references.column)})`;\n if (c.references.onDelete) sql += ` ON DELETE ${c.references.onDelete.toUpperCase()}`;\n }\n return sql;\n}\n\nexport function createTableSql(dialect: Dialect, def: TableDef, schema?: string): string {\n const parts = def.columns.map((c) => columnSql(dialect, c));\n for (const ck of def.checks ?? []) parts.push(`CHECK (${ck.expression})`);\n for (const u of def.uniques ?? []) {\n parts.push(`UNIQUE (${u.columns.map(quote).join(\", \")})`);\n }\n const strict = dialect === \"sqlite\" ? \" STRICT\" : \"\";\n const qualified =\n schema === undefined || schema === \"public\"\n ? quote(def.name)\n : `${quote(schema)}.${quote(def.name)}`;\n return `CREATE TABLE IF NOT EXISTS ${qualified} (\\n ${parts.join(\",\\n \")}\\n)${strict}`;\n}\n\nexport function createIndexSql(def: TableDef, name: string, schema?: string): string {\n const idx = def.indexes?.find((i) => i.name === name);\n if (idx === undefined) throw new Error(`unknown index \"${name}\" on table \"${def.name}\"`);\n const qualified =\n schema === undefined || schema === \"public\"\n ? quote(def.name)\n : `${quote(schema)}.${quote(def.name)}`;\n return `CREATE INDEX IF NOT EXISTS ${quote(idx.name)} ON ${qualified}(${idx.columns\n .map(quote)\n .join(\", \")})`;\n}\n\nexport function createTablesSql(\n dialect: Dialect,\n defs: readonly TableDef[],\n schema?: string,\n): string[] {\n const statements: string[] = [];\n for (const def of defs) {\n statements.push(createTableSql(dialect, def, schema));\n for (const idx of def.indexes ?? []) statements.push(createIndexSql(def, idx.name, schema));\n }\n return statements;\n}\n","import type { TableDef } from \"./types.ts\";\n\nexport const persistenceState: TableDef = {\n name: \"t_persistence_state\",\n columns: [\n { name: \"f_singleton\", type: \"integer\", primaryKey: true },\n { name: \"f_store_id\", type: \"text\", notNull: true },\n ],\n checks: [{ name: \"ck_persistence_state_singleton\", expression: \"f_singleton = 1\" }],\n};\n","import type { TableDef } from \"./types.ts\";\n\nexport const schemaMeta: TableDef = {\n name: \"t_schema_meta\",\n columns: [\n { name: \"f_key\", type: \"text\", primaryKey: true },\n { name: \"f_value\", type: \"text\", notNull: true },\n ],\n};\n","import type { TableDef } from \"./types.ts\";\n\nexport const sessions: TableDef = {\n name: \"t_sessions\",\n columns: [\n { name: \"f_id\", type: \"serial\", primaryKey: true },\n { name: \"f_session_id\", type: \"text\", notNull: true, unique: true },\n { name: \"f_head_event_id\", type: \"text\", notNull: true, default: \"\" },\n { name: \"f_head_sequence\", type: \"integer\", notNull: true, default: -1 },\n { name: \"f_version\", type: \"integer\", notNull: true },\n { name: \"f_created_at\", type: \"bigint\", notNull: true },\n { name: \"f_cwd\", type: \"text\" },\n { name: \"f_parent_session\", type: \"text\" },\n { name: \"f_seed_length\", type: \"integer\" },\n { name: \"f_origin\", type: \"text\" },\n { name: \"f_delegation_depth\", type: \"integer\" },\n { name: \"f_incarnation\", type: \"text\", notNull: true },\n { name: \"f_revision\", type: \"integer\", notNull: true },\n ],\n};\n","import type { TableDef } from \"./types.ts\";\n\nexport const events: TableDef = {\n name: \"t_events\",\n columns: [\n { name: \"f_id\", type: \"serial\", primaryKey: true },\n { name: \"f_event_id\", type: \"text\", notNull: true, unique: true },\n { name: \"f_parent_id\", type: \"text\", notNull: true, default: \"\" },\n { name: \"f_type\", type: \"text\", notNull: true, default: \"\" },\n { name: \"f_kind\", type: \"text\", notNull: true, default: \"\" },\n { name: \"f_role\", type: \"text\", notNull: true, default: \"\" },\n { name: \"f_name\", type: \"text\", notNull: true, default: \"\" },\n { name: \"f_action_id\", type: \"text\", notNull: true, default: \"\" },\n { name: \"f_encoding\", type: \"text\", notNull: true, default: \"\" },\n { name: \"f_data\", type: \"text\", notNull: true },\n { name: \"f_created_at\", type: \"bigint\", notNull: true, default: 0 },\n ],\n // 查询经 f_event_id(列级 UNIQUE 唯一索引)与 t_session_events 复合索引\n // (按 session 过滤后回表);f_parent_id 仅写路径构造;维度列索引为\n // 审计/UI 过滤预留。\n indexes: [\n { name: \"idx_events_kind\", columns: [\"f_kind\"] },\n { name: \"idx_events_role\", columns: [\"f_role\"] },\n { name: \"idx_events_name\", columns: [\"f_name\"] },\n { name: \"idx_events_action_id\", columns: [\"f_action_id\"] },\n ],\n};\n","import type { TableDef } from \"./types.ts\";\n\nexport const sessionEvents: TableDef = {\n name: \"t_session_events\",\n columns: [\n { name: \"f_id\", type: \"serial\", primaryKey: true },\n {\n name: \"f_session_id\",\n type: \"text\",\n notNull: true,\n references: { table: \"t_sessions\", column: \"f_session_id\", onDelete: \"cascade\" },\n },\n {\n name: \"f_event_id\",\n type: \"text\",\n notNull: true,\n references: { table: \"t_events\", column: \"f_event_id\", onDelete: \"cascade\" },\n },\n { name: \"f_sequence\", type: \"integer\", notNull: true },\n { name: \"f_original_seq\", type: \"integer\", notNull: true },\n { name: \"f_surface_op\", type: \"text\" },\n ],\n uniques: [\n { name: \"uq_session_events_session_sequence\", columns: [\"f_session_id\", \"f_sequence\"] },\n ],\n // UNIQUE(f_session_id, f_sequence) 自动建唯一索引(按 session 过滤 + seq\n // 范围/排序/取尾);f_event_id 索引覆盖反向查找(孤儿事件行清理)。\n indexes: [{ name: \"idx_session_events_event_id\", columns: [\"f_event_id\"] }],\n};\n","import { persistenceState } from \"./persistence-state.ts\";\nimport { schemaMeta } from \"./schema-meta.ts\";\nimport { sessions } from \"./sessions.ts\";\nimport { events } from \"./events.ts\";\nimport { sessionEvents } from \"./session-events.ts\";\n\nexport { persistenceState };\nexport { schemaMeta };\nexport { sessions };\nexport { events };\nexport { sessionEvents };\nexport type {\n ColumnDef,\n TableDef,\n CheckDef,\n UniqueDef,\n IndexDef,\n ColumnTypeName,\n DeleteAction,\n} from \"./types.ts\";\n\nexport const sqliteTableDefs = [persistenceState, sessions, events, sessionEvents] as const;\n\nexport const postgresTableDefs = [\n persistenceState,\n schemaMeta,\n sessions,\n events,\n sessionEvents,\n] as const;\n","import type { SessionEvent } from \"@deepseek-ai/dsh-session\";\nimport { toSqliteSchema } from \"./adapters/index.ts\";\nimport { sqliteTableDefs } from \"./entities/index.ts\";\n\nexport const SCHEMA_VERSION = 2;\n\nexport const SESSION_PERSISTENCE_SQLITE_APPLICATION_ID = 0x44534850;\n\nexport const EPHEMERAL_EVENT_TYPES = [\"assistant/chunk\"] as const;\n\nexport const EVENT_ENCODING = \"json\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst sqliteTables: Record<string, any> = toSqliteSchema(sqliteTableDefs);\n\nexport const tPersistenceState = sqliteTables[\"t_persistence_state\"]!;\n\nexport const tSessions = sqliteTables[\"t_sessions\"]!;\n\nexport const tEvents = sqliteTables[\"t_events\"]!;\n\nexport const tSessionEvents = sqliteTables[\"t_session_events\"]!;\n\nexport type { SessionRow } from \"./backend.ts\";\n\nexport type { EventRow } from \"./backend.ts\";\n\nexport type JournalMode = \"wal\" | \"delete\" | \"truncate\" | \"persist\";\n\nexport const DEFAULT_BUSY_TIMEOUT_MS = 5000;\n\nexport function isEphemeralType(type: string): boolean {\n return (EPHEMERAL_EVENT_TYPES as readonly string[]).includes(type);\n}\n\nexport function isPersistedEvent(event: SessionEvent): boolean {\n return (\n !isEphemeralType(event.type) &&\n (event as SessionEvent & { ignorable?: unknown }).ignorable !== true\n );\n}\n\nexport type EventKind =\n | \"message\"\n | \"thinking\"\n | \"turn\"\n | \"tool\"\n | \"request\"\n | \"config\"\n | \"audit\"\n | \"lifecycle\"\n | \"inbox\"\n | \"compaction\"\n | \"llm\"\n | \"subagent\"\n | \"team\"\n | \"workflow\"\n | \"goal\"\n | \"schedule\"\n | \"todo\"\n | \"web\";\n\nexport type EventRole = \"user\" | \"assistant\" | \"tool\";\n\nexport function eventKind(event: { type: string; data?: unknown }): EventKind | \"\" {\n switch (event.type) {\n case \"user/message\":\n return \"message\";\n case \"assistant/message\": {\n const content = (event.data as { message?: { content?: unknown[] } }).message?.content;\n if (content?.some((block) => (block as { type?: string })?.type === \"reasoning\")) {\n return \"thinking\";\n }\n return \"message\";\n }\n case \"turn/start\":\n case \"turn/end\":\n case \"step/start\":\n case \"step/end\":\n case \"session/end-seed\":\n return \"turn\";\n case \"tool/call\":\n case \"tool/result\":\n case \"tool/code-dispatch-start\":\n case \"tool/code-dispatch\":\n return \"tool\";\n case \"request/header\":\n case \"request/context\":\n return \"request\";\n case \"model/selection\":\n case \"permission/preset\":\n case \"approval/policy\":\n case \"sandbox/mode\":\n case \"plan/mode\":\n case \"agent-preset/selected\":\n return \"config\";\n case \"approval/asked\":\n case \"approval/decided\":\n case \"command/run\":\n case \"command/done\":\n case \"hook/invoked\":\n case \"hook/result\":\n case \"feedback/record\":\n return \"audit\";\n case \"session/title\":\n case \"session/title-llm-request\":\n case \"session-log-deepseek/delivery-accepted\":\n return \"lifecycle\";\n case \"agent/inbox/spliced\":\n return \"inbox\";\n case \"compaction/start\":\n case \"compaction/end\":\n case \"compaction/summary\":\n case \"compaction/prune\":\n return \"compaction\";\n case \"llm/retry\":\n case \"llm/retry-started\":\n return \"llm\";\n case \"subagent/descriptor\":\n case \"subagent/model-selection-policy\":\n return \"subagent\";\n case \"team/member\":\n case \"team/task\":\n case \"team/message/queued\":\n case \"team/message/delivered\":\n return \"team\";\n case \"tool-workflow/run-start\":\n case \"tool-workflow/run-end\":\n case \"tool-workflow/agent-start\":\n case \"tool-workflow/agent-end\":\n return \"workflow\";\n case \"goal/change\":\n return \"goal\";\n case \"schedule/change\":\n return \"schedule\";\n case \"todo/write\":\n return \"todo\";\n case \"web/deepseek-search-llm-request\":\n return \"web\";\n default:\n return \"\"; // unknown plugin-merged type\n }\n}\n\nexport function eventDimensions(event: SessionEvent): {\n kind: string;\n role: string;\n name: string;\n actionId: string;\n} {\n const kind = eventKind(event);\n // 插件合并类型不在 core 的判别联合内,type/data 经结构化视图访问。\n const type = event.type as string;\n const data = event.data as Record<string, unknown>;\n switch (type) {\n case \"user/message\":\n return { kind, role: \"user\", name: \"\", actionId: \"\" };\n case \"assistant/message\":\n return { kind, role: \"assistant\", name: \"\", actionId: \"\" };\n case \"tool/result\": {\n // append 可能携带旧形状(无 message);可选链容忍。\n const message = data[\"message\"] as { content?: Array<{ toolCallId?: string }> } | undefined;\n return { kind, role: \"tool\", name: \"\", actionId: message?.content?.[0]?.toolCallId ?? \"\" };\n }\n case \"tool/call\":\n return {\n kind,\n role: \"\",\n name: typeof data[\"name\"] === \"string\" ? data[\"name\"] : \"\",\n actionId: typeof data[\"callId\"] === \"string\" ? data[\"callId\"] : \"\",\n };\n case \"tool/code-dispatch-start\":\n case \"tool/code-dispatch\":\n return {\n kind,\n role: \"\",\n name: \"\",\n actionId: typeof data[\"subCallId\"] === \"string\" ? data[\"subCallId\"] : \"\",\n };\n case \"command/run\":\n case \"command/done\":\n return {\n kind,\n role: \"\",\n name: type === \"command/run\" && typeof data[\"name\"] === \"string\" ? data[\"name\"] : \"\",\n actionId: typeof data[\"commandId\"] === \"string\" ? data[\"commandId\"] : \"\",\n };\n case \"approval/asked\":\n case \"approval/decided\":\n return {\n kind,\n role: \"\",\n name: \"\",\n actionId: typeof data[\"id\"] === \"string\" ? data[\"id\"] : \"\",\n };\n case \"hook/invoked\":\n case \"hook/result\":\n return {\n kind,\n role: \"\",\n name: \"\",\n actionId: typeof data[\"handlerId\"] === \"string\" ? data[\"handlerId\"] : \"\",\n };\n case \"llm/retry\":\n case \"llm/retry-started\":\n return {\n kind,\n role: \"\",\n name: \"\",\n actionId: typeof data[\"retryId\"] === \"string\" ? data[\"retryId\"] : \"\",\n };\n case \"tool-workflow/run-start\":\n case \"tool-workflow/run-end\":\n case \"tool-workflow/agent-start\":\n case \"tool-workflow/agent-end\":\n return {\n kind,\n role: \"\",\n name: \"\",\n actionId: typeof data[\"runId\"] === \"string\" ? data[\"runId\"] : \"\",\n };\n case \"todo/write\":\n return { kind, role: \"\", name: \"todos\", actionId: \"\" };\n case \"subagent/descriptor\":\n return {\n kind,\n role: \"\",\n name: typeof data[\"label\"] === \"string\" ? data[\"label\"] : \"\",\n actionId: \"\",\n };\n default:\n return { kind, role: \"\", name: \"\", actionId: \"\" };\n }\n}\n","import { DatabaseSync } from \"node:sqlite\";\nimport { eventDimensions } from \"./schema.ts\";\n\nexport const SCHEMA_VERSION_V2 = 2;\n\nexport function migrateSqliteV1ToV2(db: DatabaseSync): number {\n const { user_version: onDisk } = db.prepare(\"PRAGMA user_version\").get() as {\n user_version: number;\n };\n if (onDisk === SCHEMA_VERSION_V2) return 0;\n if (onDisk !== 1) {\n throw new Error(`unsupported schema version ${onDisk} (expected 1)`);\n }\n\n // 1. 建 v2 表(临时名)。\n db.exec(`\n CREATE TABLE t_events_v2 (\n f_id INTEGER PRIMARY KEY AUTOINCREMENT,\n f_event_id TEXT NOT NULL UNIQUE,\n f_parent_id TEXT NOT NULL DEFAULT '',\n f_type TEXT NOT NULL DEFAULT '',\n f_kind TEXT NOT NULL DEFAULT '',\n f_role TEXT NOT NULL DEFAULT '',\n f_name TEXT NOT NULL DEFAULT '',\n f_action_id TEXT NOT NULL DEFAULT '',\n f_encoding TEXT NOT NULL DEFAULT '',\n f_data TEXT NOT NULL,\n f_created_at INTEGER NOT NULL DEFAULT 0\n ) STRICT;\n CREATE TABLE t_session_events_v2 (\n f_id INTEGER PRIMARY KEY AUTOINCREMENT,\n f_session_id TEXT NOT NULL REFERENCES t_sessions(f_session_id) ON DELETE CASCADE,\n f_event_id TEXT NOT NULL REFERENCES t_events_v2(f_event_id) ON DELETE CASCADE,\n f_sequence INTEGER NOT NULL,\n f_original_seq INTEGER NOT NULL,\n f_surface_op TEXT,\n UNIQUE (f_session_id, f_sequence)\n ) STRICT;\n CREATE INDEX idx_events_v2_kind ON t_events_v2(f_kind);\n CREATE INDEX idx_events_v2_role ON t_events_v2(f_role);\n CREATE INDEX idx_events_v2_name ON t_events_v2(f_name);\n CREATE INDEX idx_events_v2_action_id ON t_events_v2(f_action_id);\n CREATE INDEX idx_session_events_v2_event_id ON t_session_events_v2(f_event_id);\n `);\n\n // 2. 搬运 t_events:f_type = 旧 f_kind,维度列重算。\n const oldEvents = db\n .prepare(\n `SELECT f_event_id, f_parent_id, f_kind, f_data, f_created_at FROM t_events ORDER BY f_id`,\n )\n .all() as Array<{\n f_event_id: string;\n f_parent_id: string;\n f_kind: string;\n f_data: string;\n f_created_at: number;\n }>;\n const insertEvent = db.prepare(`\n INSERT INTO t_events_v2\n (f_event_id, f_parent_id, f_type, f_kind, f_role, f_name, f_action_id, f_encoding, f_data, f_created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, 'json', ?, ?)\n `);\n for (const row of oldEvents) {\n let data: unknown;\n try {\n data = JSON.parse(row.f_data);\n } catch {\n throw new Error(`t_events row ${row.f_event_id} has unparsable f_data; aborting`);\n }\n const dims = eventDimensions({\n type: row.f_kind,\n seq: 0,\n time: row.f_created_at,\n data,\n } as never);\n insertEvent.run(\n row.f_event_id,\n row.f_parent_id,\n row.f_kind,\n dims.kind,\n dims.role,\n dims.name,\n dims.actionId,\n row.f_data,\n row.f_created_at,\n );\n }\n\n // 3. 搬运 t_session_events:f_original_seq / f_surface_op 从旧 t_events 取。\n const oldBridges = db\n .prepare(\n `SELECT se.f_session_id, se.f_event_id, se.f_sequence\n FROM t_session_events se ORDER BY se.f_id`,\n )\n .all() as Array<{ f_session_id: string; f_event_id: string; f_sequence: number }>;\n const oldEventMeta = new Map(\n (\n db.prepare(`SELECT f_event_id, f_original_seq, f_surface_op FROM t_events`).all() as Array<{\n f_event_id: string;\n f_original_seq: number;\n f_surface_op: string | null;\n }>\n ).map((row) => [row.f_event_id, row]),\n );\n const insertBridge = db.prepare(`\n INSERT INTO t_session_events_v2\n (f_session_id, f_event_id, f_sequence, f_original_seq, f_surface_op)\n VALUES (?, ?, ?, ?, ?)\n `);\n for (const row of oldBridges) {\n const meta = oldEventMeta.get(row.f_event_id);\n if (meta === undefined) {\n throw new Error(\n `bridge row ${row.f_session_id}:${row.f_sequence} references missing event ${row.f_event_id}`,\n );\n }\n insertBridge.run(\n row.f_session_id,\n row.f_event_id,\n row.f_sequence,\n meta.f_original_seq,\n meta.f_surface_op,\n );\n }\n\n // 4. 删旧表、重命名新表。\n db.exec(`\n DROP TABLE t_session_events;\n DROP TABLE t_events;\n ALTER TABLE t_events_v2 RENAME TO t_events;\n ALTER TABLE t_session_events_v2 RENAME TO t_session_events;\n `);\n\n // 5. user_version = 2。\n db.exec(`PRAGMA user_version = ${SCHEMA_VERSION_V2}`);\n return oldEvents.length;\n}\n","import { randomUUID } from \"node:crypto\";\nimport { statSync } from \"node:fs\";\nimport { mkdir, open } from \"node:fs/promises\";\nimport { dirname, resolve } from \"node:path\";\nimport { DatabaseSync } from \"node:sqlite\";\nimport { and, desc, eq, gte, sql } from \"drizzle-orm\";\nimport { drizzle, type NodeSQLiteDatabase } from \"drizzle-orm/node-sqlite\";\nimport type { SessionId } from \"@deepseek-ai/dsh-session\";\nimport type { SessionStorageMetadata } from \"@deepseek-ai/dsh-session-persistence\";\nimport {\n type Backend,\n type BackendTx,\n type EventInsert,\n type EventRow,\n type SessionRow,\n} from \"./backend.ts\";\nimport { createTablesSql } from \"./adapters/index.ts\";\nimport { sqliteTableDefs } from \"./entities/index.ts\";\nimport { sessionConflictRow, sessionInsertRow } from \"./log.ts\";\nimport { migrateSqliteV1ToV2 } from \"./migrate.ts\";\nimport {\n DEFAULT_BUSY_TIMEOUT_MS,\n SCHEMA_VERSION,\n SESSION_PERSISTENCE_SQLITE_APPLICATION_ID,\n tEvents,\n tPersistenceState,\n tSessionEvents,\n tSessions,\n type JournalMode,\n} from \"./schema.ts\";\n\ntype SqliteDb = NodeSQLiteDatabase & { $client: DatabaseSync };\n\nconst sqliteTxQueues = new Map<string, Promise<void>>();\n\nfunction enqueueSqliteTx<T>(path: string, fn: () => Promise<T>): Promise<T> {\n const tail = sqliteTxQueues.get(path) ?? Promise.resolve();\n const run = tail.then(fn);\n // 失败的事务不得毒化后续队列。\n sqliteTxQueues.set(\n path,\n run.then(\n () => undefined,\n () => undefined,\n ),\n );\n return run;\n}\n\nasync function createDatabaseFile(path: string): Promise<void> {\n try {\n const handle = await open(path, \"wx\", 0o600);\n await handle.close();\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"EEXIST\") throw error;\n }\n}\n\nexport function openDatabase(\n path: string,\n journalMode: JournalMode,\n busyTimeout = DEFAULT_BUSY_TIMEOUT_MS,\n): DatabaseSync {\n const db = new DatabaseSync(path);\n try {\n configureDatabase(db, path, journalMode, busyTimeout);\n return db;\n } catch (error: unknown) {\n db.close();\n throw error;\n }\n}\n\nfunction configureDatabase(\n db: DatabaseSync,\n path: string,\n journalMode: JournalMode,\n busyTimeout: number,\n): void {\n // 其余是驱动级 SQLite 操作(无 drizzle API):连接 pragma 与 sqlite_schema 探测。\n db.exec(\"PRAGMA foreign_keys = ON\");\n // busy_timeout 必须先于一切锁获取(初始化事务与每次写事务)。\n db.exec(`PRAGMA busy_timeout = ${busyTimeout}`);\n const dbx = drizzle({ client: db });\n // 初始化在单个 `BEGIN IMMEDIATE` 事务内完成,持写锁校验 schema 归属。\n dbx.transaction(\n (tx) => {\n const { user_version: onDisk } = tx.get(sql`PRAGMA user_version`) as {\n user_version: number;\n };\n const { application_id: applicationId } = tx.get(sql`PRAGMA application_id`) as {\n application_id: number;\n };\n const { count: userObjectCount } = tx.get(\n sql`SELECT COUNT(*) AS count FROM sqlite_schema WHERE name NOT GLOB 'sqlite_*'`,\n ) as { count: number };\n if (onDisk === 0 && (applicationId !== 0 || userObjectCount > 0)) {\n throw new Error(\n `session database at \"${path}\" has an unversioned schema or application identity`,\n );\n }\n if (onDisk === 1) {\n // 启动时自动迁移 v1 → v2(同一写锁事务内,失败整体回滚)。\n migrateSqliteV1ToV2(db);\n } else if (onDisk !== 0 && onDisk !== SCHEMA_VERSION) {\n throw new Error(\n `session database at \"${path}\" has schema version ${onDisk}, incompatible with this build (${SCHEMA_VERSION})`,\n );\n }\n if (\n (onDisk === SCHEMA_VERSION || onDisk === 1) &&\n applicationId !== SESSION_PERSISTENCE_SQLITE_APPLICATION_ID\n ) {\n throw new Error(\n `session database at \"${path}\" has application id ${applicationId}, expected ${SESSION_PERSISTENCE_SQLITE_APPLICATION_ID}`,\n );\n }\n for (const statement of createTablesSql(\"sqlite\", sqliteTableDefs)) {\n tx.run(sql.raw(statement));\n }\n tx.insert(tPersistenceState)\n .values({ fSingleton: 1, fStoreId: randomUUID() })\n .onConflictDoNothing()\n .run();\n if (onDisk === 0) {\n tx.run(sql.raw(`PRAGMA application_id = ${SESSION_PERSISTENCE_SQLITE_APPLICATION_ID}`));\n tx.run(sql.raw(`PRAGMA user_version = ${SCHEMA_VERSION}`));\n }\n },\n { behavior: \"immediate\" },\n );\n // journal_mode 不可绑定,经校验后的联合可直接插值;在归属校验与初始化\n // 提交之后应用。\n db.exec(`PRAGMA journal_mode = ${journalMode.toUpperCase()}`);\n}\n\nexport interface SqliteBackendOptions {\n path: string;\n journalMode: JournalMode;\n busyTimeout: number;\n}\n\nexport class SqliteBackend implements Backend {\n readonly kind = \"sqlite\" as const;\n storeIdentity!: string;\n\n private dbPath = \"\";\n private db!: SqliteDb;\n\n constructor(private readonly options: SqliteBackendOptions) {}\n\n async open(): Promise<void> {\n const actual =\n this.options.path === \":memory:\" ? this.options.path : resolve(this.options.path);\n this.dbPath = actual;\n if (actual !== \":memory:\") {\n await mkdir(dirname(actual), { recursive: true, mode: 0o700 });\n await createDatabaseFile(actual);\n }\n // openDatabase 内的初始化事务是同步 `BEGIN IMMEDIATE`,须排进同一\n // per-path 写队列——否则与进行中的写事务竞争会在持有锁的异步回调\n // 让步期间忙等,冻结事件循环(死锁直到 busy_timeout)。\n await enqueueSqliteTx(actual, async () => {\n this.db = drizzle({\n client: openDatabase(actual, this.options.journalMode, this.options.busyTimeout),\n });\n });\n try {\n const row = this.db\n .select({ fStoreId: tPersistenceState.fStoreId })\n .from(tPersistenceState)\n .where(eq(tPersistenceState.fSingleton, 1))\n .get() as { fStoreId: string } | undefined;\n /* v8 ignore next -- openDatabase inserts the singleton before returning. */\n if (row === undefined) {\n throw new Error(`session database at \"${actual}\" has no store identity`);\n }\n if (row.fStoreId.length === 0) {\n throw new Error(`session database at \"${actual}\" has no valid store identity`);\n }\n if (actual !== \":memory:\") {\n const identity = statSync(actual, { bigint: true });\n this.storeIdentity = `file:${identity.dev}:${identity.ino}:${identity.birthtimeNs}:store:${row.fStoreId}`;\n } else {\n this.storeIdentity = `memory:store:${row.fStoreId}`;\n }\n } catch (error: unknown) {\n this.db.$client.close();\n throw error;\n }\n }\n\n async close(): Promise<void> {\n // open 可能未及赋值 db 就失败(队列内初始化抛错);close 不得在\n // coordinator 的 dispose 之上再崩。\n if (this.db === undefined) return;\n this.db.$client.close();\n }\n\n async getSession(id: SessionId): Promise<SessionRow | undefined> {\n return this.db.select().from(tSessions).where(eq(tSessions.fSessionId, id)).get() as\n | SessionRow\n | undefined;\n }\n\n async getSeqMapRows(id: SessionId): Promise<Array<{ fSequence: number; fOriginalSeq: number }>> {\n return this.db\n .select({ fSequence: tSessionEvents.fSequence, fOriginalSeq: tSessionEvents.fOriginalSeq })\n .from(tSessionEvents)\n .where(eq(tSessionEvents.fSessionId, id))\n .all();\n }\n\n async getEventRows(id: SessionId, fromSequence?: number): Promise<EventRow[]> {\n const scoped =\n fromSequence === undefined\n ? this.eventRows().where(eq(tSessionEvents.fSessionId, id))\n : this.eventRows().where(\n and(eq(tSessionEvents.fSessionId, id), gte(tSessionEvents.fSequence, fromSequence)),\n );\n return scoped.orderBy(tSessionEvents.fSequence).all() as unknown as EventRow[];\n }\n\n async listSessions(): Promise<SessionRow[]> {\n return this.db.select().from(tSessions).all() as SessionRow[];\n }\n\n async transaction<T>(fn: (tx: BackendTx) => Promise<T>): Promise<T> {\n // drizzle 的 SQLite 驱动只支持同步事务回调,而共享 BackendTx 接口因\n // PostgreSQL 是异步的——BEGIN/COMMIT/ROLLBACK 语句因此走驱动层。\n // 异步回调在持写锁期间让出微任务间隙:本进程内第二个连接此时同步\n // `BEGIN IMMEDIATE` 会忙等并冻结事件循环(锁持有者无法提交,死锁直到\n // busy_timeout)。per-path 写队列串行化消除该间隙——SQLite 本就单写者;\n // 跨进程竞争仍经 busy_timeout 解决,不同数据库文件互不串行。\n return enqueueSqliteTx(this.dbPath, async () => {\n this.db.$client.exec(\"BEGIN IMMEDIATE\");\n try {\n const result = await fn(this.tx);\n this.db.$client.exec(\"COMMIT\");\n return result;\n } catch (error: unknown) {\n // DELETE+INSERT 不会冲突;这里回滚 DB 级失败(磁盘满等),测试不可达。\n /* v8 ignore start */\n try {\n this.db.$client.exec(\"ROLLBACK\");\n } catch {\n // 原始 SQLite 失败仍是可操作的根因。\n }\n throw error;\n /* v8 ignore stop */\n }\n });\n }\n\n private readonly tx: BackendTx = {\n upsertSession: (storage, incarnation) => this.upsertSession(storage, incarnation),\n getHead: (id) => this.getHead(id),\n getSeedLength: (id) => this.getSeedLength(id),\n updateSeedLength: (id, seedLength) => this.updateSeedLength(id, seedLength),\n insertEvents: (events) => this.insertEvents(events),\n insertBridges: (rows) => this.insertBridges(rows),\n updateHead: (id, headEventId, headSequence) => this.updateHead(id, headEventId, headSequence),\n bumpRevision: (id) => this.bumpRevision(id),\n deleteBridgeTail: (id, fromSequence) => this.deleteBridgeTail(id, fromSequence),\n getPrevBridge: (id, sequence) => this.getPrevBridge(id, sequence),\n getLastBridge: (id) => this.getLastBridge(id),\n };\n\n // --- row primitives (transaction-internal or standalone) ---\n\n private async upsertSession(storage: SessionStorageMetadata, incarnation: string): Promise<void> {\n this.db\n .insert(tSessions)\n .values(sessionInsertRow(storage, incarnation))\n .onConflictDoUpdate({\n target: tSessions.fSessionId,\n set: sessionConflictRow(storage),\n })\n .run();\n }\n\n private async getHead(\n id: SessionId,\n ): Promise<Pick<SessionRow, \"fHeadEventId\" | \"fHeadSequence\">> {\n const head = this.db\n .select({ fHeadEventId: tSessions.fHeadEventId, fHeadSequence: tSessions.fHeadSequence })\n .from(tSessions)\n .where(eq(tSessions.fSessionId, id))\n .get() as Pick<SessionRow, \"fHeadEventId\" | \"fHeadSequence\"> | undefined;\n /* v8 ignore next -- appendBatch/commitRepair always materialize the row before reading the head */\n if (head === undefined) throw new Error(`session \"${id}\" has no materialized row`);\n return head;\n }\n\n private async getSeedLength(id: SessionId): Promise<number | null> {\n const row = this.db\n .select({ fSeedLength: tSessions.fSeedLength })\n .from(tSessions)\n .where(eq(tSessions.fSessionId, id))\n .get() as { fSeedLength: number | null } | undefined;\n /* v8 ignore next -- rewind always materializes the row before reading the seed length */\n if (row === undefined) throw new Error(`session \"${id}\" has no materialized row`);\n return row.fSeedLength;\n }\n\n private async updateSeedLength(id: SessionId, seedLength: number): Promise<void> {\n this.db\n .update(tSessions)\n .set({ fSeedLength: seedLength })\n .where(eq(tSessions.fSessionId, id))\n .run();\n }\n\n private static readonly INSERT_BATCH_ROWS = 1000;\n\n private async insertEvents(events: EventInsert[]): Promise<void> {\n if (events.length === 0) return;\n for (let i = 0; i < events.length; i += SqliteBackend.INSERT_BATCH_ROWS) {\n this.db\n .insert(tEvents)\n .values(events.slice(i, i + SqliteBackend.INSERT_BATCH_ROWS).map((event) => ({ ...event })))\n .run();\n }\n }\n\n private async insertBridges(\n rows: Array<{\n fSessionId: SessionId;\n fEventId: string;\n fSequence: number;\n fOriginalSeq: number;\n fSurfaceOp: string | null;\n }>,\n ): Promise<void> {\n if (rows.length === 0) return;\n for (let i = 0; i < rows.length; i += SqliteBackend.INSERT_BATCH_ROWS) {\n this.db\n .insert(tSessionEvents)\n .values(rows.slice(i, i + SqliteBackend.INSERT_BATCH_ROWS).map((row) => ({ ...row })))\n .run();\n }\n }\n\n private async updateHead(\n id: SessionId,\n headEventId: string,\n headSequence: number,\n ): Promise<void> {\n this.db\n .update(tSessions)\n .set({ fHeadEventId: headEventId, fHeadSequence: headSequence })\n .where(eq(tSessions.fSessionId, id))\n .run();\n }\n\n private async bumpRevision(id: SessionId): Promise<void> {\n this.db\n .update(tSessions)\n .set({ fRevision: sql`${tSessions.fRevision} + 1` })\n .where(eq(tSessions.fSessionId, id))\n .run();\n }\n\n private async deleteBridgeTail(id: SessionId, fromSequence: number): Promise<void> {\n this.db\n .delete(tSessionEvents)\n .where(and(eq(tSessionEvents.fSessionId, id), gte(tSessionEvents.fSequence, fromSequence)))\n .run();\n }\n\n private async getPrevBridge(\n id: SessionId,\n sequence: number,\n ): Promise<{ fEventId: string; fSequence: number } | undefined> {\n return this.db\n .select({ fEventId: tSessionEvents.fEventId, fSequence: tSessionEvents.fSequence })\n .from(tSessionEvents)\n .where(and(eq(tSessionEvents.fSessionId, id), eq(tSessionEvents.fSequence, sequence)))\n .get() as { fEventId: string; fSequence: number } | undefined;\n }\n\n private async getLastBridge(\n id: SessionId,\n ): Promise<{ fEventId: string; fSequence: number } | undefined> {\n return this.db\n .select({ fEventId: tSessionEvents.fEventId, fSequence: tSessionEvents.fSequence })\n .from(tSessionEvents)\n .where(eq(tSessionEvents.fSessionId, id))\n .orderBy(desc(tSessionEvents.fSequence))\n .limit(1)\n .get() as { fEventId: string; fSequence: number } | undefined;\n }\n\n private eventRows() {\n return this.db\n .select({\n fEventId: tSessionEvents.fEventId,\n fSequence: tSessionEvents.fSequence,\n fOriginalSeq: tSessionEvents.fOriginalSeq,\n fType: tEvents.fType,\n fKind: tEvents.fKind,\n fRole: tEvents.fRole,\n fName: tEvents.fName,\n fActionId: tEvents.fActionId,\n fCreatedAt: tEvents.fCreatedAt,\n fData: tEvents.fData,\n fSurfaceOp: tSessionEvents.fSurfaceOp,\n })\n .from(tSessionEvents)\n .innerJoin(tEvents, eq(tSessionEvents.fEventId, tEvents.fEventId));\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport { and, desc, eq, gte, sql } from \"drizzle-orm\";\nimport type { PgAsyncDatabase, PgAsyncTransaction, PgQueryResultHKT } from \"drizzle-orm/pg-core\";\nimport type { SessionId } from \"@deepseek-ai/dsh-session\";\nimport type { SessionStorageMetadata } from \"@deepseek-ai/dsh-session-persistence\";\nimport {\n type Backend,\n type BackendTx,\n type EventInsert,\n type EventRow,\n type SessionRow,\n} from \"./backend.ts\";\nimport { SCHEMA_VERSION, SESSION_PERSISTENCE_SQLITE_APPLICATION_ID } from \"./schema.ts\";\nimport { createTablesSql, toPostgresSchema } from \"./adapters/index.ts\";\nimport { postgresTableDefs } from \"./entities/index.ts\";\nimport { sessionConflictRow, sessionInsertRow } from \"./log.ts\";\n\nexport interface PostgresBackendOptions {\n identityBase: string;\n\n schema?: string;\n\n close: () => Promise<void>;\n}\n\nexport class PostgresBackend<THKT extends PgQueryResultHKT = PgQueryResultHKT> implements Backend {\n readonly kind = \"postgres\" as const;\n storeIdentity!: string;\n\n private readonly tables: Record<string, any>;\n\n constructor(\n private readonly db: PgAsyncDatabase<THKT>,\n private readonly options: PostgresBackendOptions,\n ) {\n this.tables = toPostgresSchema(postgresTableDefs, this.options.schema ?? \"public\");\n }\n\n async open(): Promise<void> {\n const storeId = await this.db.transaction(async (tx) => {\n const schema = this.options.schema ?? \"public\";\n // 探测在建表之前:t_schema_meta 存在与否区分全新库与已有库。\n // `to_regclass` 是数据库元数据查询,drizzle 无对应 API;schema 限定\n // 显式引用(不依赖 search_path)。\n const qualifiedMeta = schema === \"public\" ? \"t_schema_meta\" : `\"${schema}\".t_schema_meta`;\n const probe = (await tx.execute(\n sql`SELECT to_regclass(${qualifiedMeta}) IS NOT NULL AS exists`,\n )) as unknown as { rows: { exists: boolean }[] };\n const metaExists = probe.rows[0]?.exists === true;\n // DDL 一次一条(PG 的 extended query protocol 拒绝多语句字符串),\n // 逐条执行保持初始化原子。\n for (const statement of createTablesSql(\"postgres\", postgresTableDefs, schema)) {\n await tx.execute(sql.raw(statement));\n }\n if (!metaExists) {\n await tx\n .insert(this.tables[\"t_schema_meta\"])\n .values([\n { fKey: \"schema_version\", fValue: String(SCHEMA_VERSION) },\n { fKey: \"application_id\", fValue: String(SESSION_PERSISTENCE_SQLITE_APPLICATION_ID) },\n ])\n .execute();\n }\n // 校验:缺版本行 = 有对象但未版本化 → 拒绝,不迁移。\n const version = await this.readMeta(tx, \"schema_version\");\n const applicationId = await this.readMeta(tx, \"application_id\");\n if (version === undefined || applicationId === undefined) {\n throw new Error(\"session database has an unversioned schema or application identity\");\n }\n if (Number(version) !== SCHEMA_VERSION) {\n throw new Error(\n `session database has schema version ${version}, incompatible with this build (${SCHEMA_VERSION})`,\n );\n }\n if (Number(applicationId) !== SESSION_PERSISTENCE_SQLITE_APPLICATION_ID) {\n throw new Error(\n `session database has application id ${applicationId}, expected ${SESSION_PERSISTENCE_SQLITE_APPLICATION_ID}`,\n );\n }\n await tx\n .insert(this.tables[\"t_persistence_state\"])\n .values({ fSingleton: 1, fStoreId: randomUUID() })\n .onConflictDoNothing()\n .execute();\n const store = await tx\n .select({ fStoreId: this.tables[\"t_persistence_state\"].fStoreId })\n .from(this.tables[\"t_persistence_state\"])\n .where(eq(this.tables[\"t_persistence_state\"].fSingleton, 1))\n .execute();\n const storeId = store[0]?.fStoreId;\n if (storeId === undefined || storeId.length === 0) {\n throw new Error(\"session database has no valid store identity\");\n }\n return storeId;\n });\n this.storeIdentity = `${this.options.identityBase}:store:${storeId}`;\n }\n\n async close(): Promise<void> {\n await this.options.close();\n }\n\n async getSession(id: SessionId): Promise<SessionRow | undefined> {\n return (\n await this.db\n .select()\n .from(this.tables[\"t_sessions\"])\n .where(eq(this.tables[\"t_sessions\"].fSessionId, id))\n .execute()\n )[0] as SessionRow | undefined;\n }\n\n async getSeqMapRows(id: SessionId): Promise<Array<{ fSequence: number; fOriginalSeq: number }>> {\n return this.db\n .select({\n fSequence: this.tables[\"t_session_events\"].fSequence,\n fOriginalSeq: this.tables[\"t_session_events\"].fOriginalSeq,\n })\n .from(this.tables[\"t_session_events\"])\n .where(eq(this.tables[\"t_session_events\"].fSessionId, id))\n .execute();\n }\n\n async getEventRows(id: SessionId, fromSequence?: number): Promise<EventRow[]> {\n const scoped =\n fromSequence === undefined\n ? this.eventRows(this.db).where(eq(this.tables[\"t_session_events\"].fSessionId, id))\n : this.eventRows(this.db).where(\n and(\n eq(this.tables[\"t_session_events\"].fSessionId, id),\n gte(this.tables[\"t_session_events\"].fSequence, fromSequence),\n ),\n );\n return scoped\n .orderBy(this.tables[\"t_session_events\"].fSequence)\n .execute() as unknown as EventRow[];\n }\n\n async listSessions(): Promise<SessionRow[]> {\n return this.db.select().from(this.tables[\"t_sessions\"]).execute() as unknown as Promise<\n SessionRow[]\n >;\n }\n\n async transaction<T>(fn: (tx: BackendTx) => Promise<T>): Promise<T> {\n return this.db.transaction(async (tx) => fn(this.txFor(tx)));\n }\n\n private txFor(tx: PgAsyncTransaction<THKT>): BackendTx {\n return {\n upsertSession: (storage, incarnation) => this.upsertSession(tx, storage, incarnation),\n getHead: (id) => this.getHead(tx, id),\n getSeedLength: (id) => this.getSeedLength(tx, id),\n updateSeedLength: (id, seedLength) => this.updateSeedLength(tx, id, seedLength),\n insertEvents: (events) => this.insertEvents(tx, events),\n insertBridges: (rows) => this.insertBridges(tx, rows),\n updateHead: (id, headEventId, headSequence) =>\n this.updateHead(tx, id, headEventId, headSequence),\n bumpRevision: (id) => this.bumpRevision(tx, id),\n deleteBridgeTail: (id, fromSequence) => this.deleteBridgeTail(tx, id, fromSequence),\n getPrevBridge: (id, sequence) => this.getPrevBridge(tx, id, sequence),\n getLastBridge: (id) => this.getLastBridge(tx, id),\n };\n }\n\n // --- meta helpers ---\n\n private async readMeta(exec: PgAsyncDatabase<THKT>, key: string): Promise<string | undefined> {\n const rows = await exec\n .select({ fValue: this.tables[\"t_schema_meta\"].fValue })\n .from(this.tables[\"t_schema_meta\"])\n .where(eq(this.tables[\"t_schema_meta\"].fKey, key))\n .execute();\n return rows[0]?.fValue;\n }\n\n // --- row primitives (transaction-internal) ---\n\n private async upsertSession(\n exec: PgAsyncDatabase<THKT>,\n storage: SessionStorageMetadata,\n incarnation: string,\n ): Promise<void> {\n await exec\n .insert(this.tables[\"t_sessions\"])\n .values(sessionInsertRow(storage, incarnation))\n .onConflictDoUpdate({\n target: this.tables[\"t_sessions\"].fSessionId,\n set: sessionConflictRow(storage),\n })\n .execute();\n }\n\n private async getHead(\n exec: PgAsyncDatabase<THKT>,\n id: SessionId,\n ): Promise<Pick<SessionRow, \"fHeadEventId\" | \"fHeadSequence\">> {\n const head = (\n await exec\n .select({\n fHeadEventId: this.tables[\"t_sessions\"].fHeadEventId,\n fHeadSequence: this.tables[\"t_sessions\"].fHeadSequence,\n })\n .from(this.tables[\"t_sessions\"])\n .where(eq(this.tables[\"t_sessions\"].fSessionId, id))\n .execute()\n )[0] as Pick<SessionRow, \"fHeadEventId\" | \"fHeadSequence\"> | undefined;\n /* v8 ignore next -- appendBatch/commitRepair always materialize the row before reading the head */\n if (head === undefined) throw new Error(`session \"${id}\" has no materialized row`);\n return head;\n }\n\n private async getSeedLength(exec: PgAsyncDatabase<THKT>, id: SessionId): Promise<number | null> {\n const row = (\n await exec\n .select({ fSeedLength: this.tables[\"t_sessions\"].fSeedLength })\n .from(this.tables[\"t_sessions\"])\n .where(eq(this.tables[\"t_sessions\"].fSessionId, id))\n .execute()\n )[0] as { fSeedLength: number | null } | undefined;\n /* v8 ignore next -- rewind always materializes the row before reading the seed length */\n if (row === undefined) throw new Error(`session \"${id}\" has no materialized row`);\n return row.fSeedLength;\n }\n\n private async updateSeedLength(\n exec: PgAsyncDatabase<THKT>,\n id: SessionId,\n seedLength: number,\n ): Promise<void> {\n await exec\n .update(this.tables[\"t_sessions\"])\n .set({ fSeedLength: seedLength })\n .where(eq(this.tables[\"t_sessions\"].fSessionId, id))\n .execute();\n }\n\n private static readonly INSERT_BATCH_ROWS = 1000;\n\n private async insertEvents(exec: PgAsyncDatabase<THKT>, events: EventInsert[]): Promise<void> {\n if (events.length === 0) return;\n for (let i = 0; i < events.length; i += PostgresBackend.INSERT_BATCH_ROWS) {\n await exec\n .insert(this.tables[\"t_events\"])\n .values(\n events.slice(i, i + PostgresBackend.INSERT_BATCH_ROWS).map((event) => ({ ...event })),\n )\n .execute();\n }\n }\n\n private async insertBridges(\n exec: PgAsyncDatabase<THKT>,\n rows: Array<{\n fSessionId: SessionId;\n fEventId: string;\n fSequence: number;\n fOriginalSeq: number;\n fSurfaceOp: string | null;\n }>,\n ): Promise<void> {\n if (rows.length === 0) return;\n for (let i = 0; i < rows.length; i += PostgresBackend.INSERT_BATCH_ROWS) {\n await exec\n .insert(this.tables[\"t_session_events\"])\n .values(rows.slice(i, i + PostgresBackend.INSERT_BATCH_ROWS).map((row) => ({ ...row })))\n .execute();\n }\n }\n\n private async updateHead(\n exec: PgAsyncDatabase<THKT>,\n id: SessionId,\n headEventId: string,\n headSequence: number,\n ): Promise<void> {\n await exec\n .update(this.tables[\"t_sessions\"])\n .set({ fHeadEventId: headEventId, fHeadSequence: headSequence })\n .where(eq(this.tables[\"t_sessions\"].fSessionId, id))\n .execute();\n }\n\n private async bumpRevision(exec: PgAsyncDatabase<THKT>, id: SessionId): Promise<void> {\n await exec\n .update(this.tables[\"t_sessions\"])\n .set({ fRevision: sql`${this.tables[\"t_sessions\"].fRevision} + 1` })\n .where(eq(this.tables[\"t_sessions\"].fSessionId, id))\n .execute();\n }\n\n private async deleteBridgeTail(\n exec: PgAsyncDatabase<THKT>,\n id: SessionId,\n fromSequence: number,\n ): Promise<void> {\n await exec\n .delete(this.tables[\"t_session_events\"])\n .where(\n and(\n eq(this.tables[\"t_session_events\"].fSessionId, id),\n gte(this.tables[\"t_session_events\"].fSequence, fromSequence),\n ),\n )\n .execute();\n }\n\n private async getPrevBridge(\n exec: PgAsyncDatabase<THKT>,\n id: SessionId,\n sequence: number,\n ): Promise<{ fEventId: string; fSequence: number } | undefined> {\n return (\n await exec\n .select({\n fEventId: this.tables[\"t_session_events\"].fEventId,\n fSequence: this.tables[\"t_session_events\"].fSequence,\n })\n .from(this.tables[\"t_session_events\"])\n .where(\n and(\n eq(this.tables[\"t_session_events\"].fSessionId, id),\n eq(this.tables[\"t_session_events\"].fSequence, sequence),\n ),\n )\n .execute()\n )[0] as { fEventId: string; fSequence: number } | undefined;\n }\n\n private async getLastBridge(\n exec: PgAsyncDatabase<THKT>,\n id: SessionId,\n ): Promise<{ fEventId: string; fSequence: number } | undefined> {\n return (\n await exec\n .select({\n fEventId: this.tables[\"t_session_events\"].fEventId,\n fSequence: this.tables[\"t_session_events\"].fSequence,\n })\n .from(this.tables[\"t_session_events\"])\n .where(eq(this.tables[\"t_session_events\"].fSessionId, id))\n .orderBy(desc(this.tables[\"t_session_events\"].fSequence))\n .limit(1)\n .execute()\n )[0] as { fEventId: string; fSequence: number } | undefined;\n }\n\n private eventRows(exec: PgAsyncDatabase<THKT>) {\n return exec\n .select({\n fEventId: this.tables[\"t_session_events\"].fEventId,\n fSequence: this.tables[\"t_session_events\"].fSequence,\n fOriginalSeq: this.tables[\"t_session_events\"].fOriginalSeq,\n fType: this.tables[\"t_events\"].fType,\n fKind: this.tables[\"t_events\"].fKind,\n fRole: this.tables[\"t_events\"].fRole,\n fName: this.tables[\"t_events\"].fName,\n fActionId: this.tables[\"t_events\"].fActionId,\n fCreatedAt: this.tables[\"t_events\"].fCreatedAt,\n fData: this.tables[\"t_events\"].fData,\n fSurfaceOp: this.tables[\"t_session_events\"].fSurfaceOp,\n })\n .from(this.tables[\"t_session_events\"])\n .innerJoin(\n this.tables[\"t_events\"],\n eq(this.tables[\"t_session_events\"].fEventId, this.tables[\"t_events\"].fEventId),\n );\n }\n}\n","import {\n SESSION_FORMAT_VERSION,\n type Session,\n type SessionEvent,\n type SessionHeader,\n type SessionId,\n} from \"@deepseek-ai/dsh-session\";\nimport type { SessionPersistenceSnapshot } from \"@deepseek-ai/dsh-session-persistence\";\nimport {\n SessionBranch,\n SessionBranchError,\n balanceRewindPrefix,\n buildTimeline,\n type BranchAnchorMode,\n type BranchBoundary,\n type ForkFromOptions,\n type SessionBranchProvider,\n} from \"@morlay/session-branch\";\nimport { randomUUID } from \"node:crypto\";\nimport type { SessionPersistenceRdb } from \"./index.ts\";\nimport { rowToMeta } from \"./log.ts\";\nimport { isPersistedEvent } from \"./schema.ts\";\n\nexport function locateTurnEnd(\n events: readonly SessionEvent[],\n atSeq?: number,\n mode: BranchAnchorMode = \"after\",\n): number {\n const ends = events.filter((event) => event.type === \"turn/end\").map((event) => event.seq);\n if (atSeq === undefined) {\n const last = ends.at(-1);\n if (last === undefined) throw new SessionBranchError(\"session has no closed turn\", \"OPEN_TURN\");\n return last;\n }\n if (mode === \"before\") {\n let boundary = -1;\n for (const seq of ends) {\n if (seq < atSeq) boundary = seq;\n else break;\n }\n return boundary;\n }\n const firstAfter = ends.find((seq) => seq >= atSeq);\n if (firstAfter !== undefined) return firstAfter;\n // atSeq 越过末尾:若其落在未闭合轮内则拒绝,否则回退最后一个闭合轮。\n const lastStart = [...events].reverse().find((event) => event.type === \"turn/start\");\n if (lastStart !== undefined && lastStart.seq <= atSeq) {\n throw new SessionBranchError(`anchor ${atSeq} lies inside an open turn`, \"OPEN_TURN\");\n }\n const last = ends.at(-1);\n if (last === undefined) throw new SessionBranchError(\"session has no closed turn\", \"OPEN_TURN\");\n return last;\n}\n\nfunction renumber(events: readonly SessionEvent[], offset: number): SessionEvent[] {\n return events.map((event, index) => ({ ...event, seq: offset + index }) as SessionEvent);\n}\n\nfunction mintSessionId(): SessionId {\n return `session-${randomUUID()}` as SessionId;\n}\n\nexport interface LiveSessionHooks {\n getSession(id: SessionId): Session | undefined;\n\n getAgent(id: SessionId): LiveAgentLike | undefined;\n\n flush(session: Session): Promise<boolean>;\n\n setCoordinatorCursor(id: SessionId, cursor: number): void;\n\n setCoordinatorState(id: SessionId, cursor: number, meta: SessionHeader): void;\n\n setCoordinatorSeedLength(id: SessionId, seedLength: number): void;\n}\n\nexport interface LiveAgentLike {\n session: Session;\n\n requestHeaderLogged?: boolean;\n}\n\nexport function truncateLiveSession(session: Session, newLength: number): void {\n const s = session as unknown as {\n log: SessionEvent[];\n eventsSnapshot?: unknown;\n headerFold?: unknown;\n headerFoldSeq: number;\n contextFold?: unknown;\n contextFoldSeq: number;\n derived: unknown[];\n derivedNodes: number;\n derivedGeneration: number;\n surfaceManager: {\n _state: { nodes: number[]; replaceGeneration: number };\n _lastProcessedSeq: number;\n _pendingPlan?: unknown;\n baseSeq: number;\n };\n };\n s.log.length = newLength;\n s.eventsSnapshot = undefined;\n s.headerFold = undefined;\n s.headerFoldSeq = 0;\n s.contextFold = undefined;\n s.contextFoldSeq = 0;\n s.derived = [];\n s.derivedNodes = 0;\n s.derivedGeneration = 0;\n s.surfaceManager._state = { nodes: [], replaceGeneration: 0 };\n s.surfaceManager._lastProcessedSeq = s.surfaceManager.baseSeq - 1;\n s.surfaceManager._pendingPlan = undefined;\n}\n\nexport function replaceLiveSessionLog(session: Session, events: readonly SessionEvent[]): void {\n const s = session as unknown as {\n log: SessionEvent[];\n eventsSnapshot?: unknown;\n headerFold?: unknown;\n headerFoldSeq: number;\n contextFold?: unknown;\n contextFoldSeq: number;\n derived: unknown[];\n derivedNodes: number;\n derivedGeneration: number;\n surfaceManager: {\n _state: { nodes: number[]; replaceGeneration: number };\n _lastProcessedSeq: number;\n _pendingPlan?: unknown;\n baseSeq: number;\n };\n };\n s.log.length = 0;\n s.log.push(...events);\n s.eventsSnapshot = undefined;\n s.headerFold = undefined;\n s.headerFoldSeq = 0;\n s.contextFold = undefined;\n s.contextFoldSeq = 0;\n s.derived = [];\n s.derivedNodes = 0;\n s.derivedGeneration = 0;\n s.surfaceManager._state = { nodes: [], replaceGeneration: 0 };\n s.surfaceManager._lastProcessedSeq = s.surfaceManager.baseSeq - 1;\n s.surfaceManager._pendingPlan = undefined;\n}\n\nexport class SessionBranchRdbProvider implements SessionBranchProvider {\n readonly name = \"session-rdb\";\n\n constructor(\n private readonly persistence: SessionPersistenceRdb,\n\n private readonly live: LiveSessionHooks = {\n getSession: () => undefined,\n getAgent: () => undefined,\n flush: async () => true,\n setCoordinatorCursor: () => {},\n setCoordinatorState: () => {},\n setCoordinatorSeedLength: () => {},\n },\n ) {}\n\n async readBranchPrefix(\n id: SessionId,\n atSeq?: number,\n mode: BranchAnchorMode = \"after\",\n signal?: AbortSignal,\n ): Promise<BranchBoundary> {\n const { events } = await this.readRawEvents(id, signal);\n const boundary = locateTurnEnd(events, atSeq, mode);\n return { seq: boundary, events: events.slice(0, boundary + 1) };\n }\n\n async readRawEvents(\n id: SessionId,\n signal?: AbortSignal,\n ): Promise<{ meta: SessionHeader; events: readonly SessionEvent[] }> {\n const stored = await this.persistence.loadStored(id, signal);\n if (stored === undefined)\n throw new SessionBranchError(`session \"${id}\" not found`, \"SESSION_NOT_FOUND\");\n return { meta: stored.meta, events: stored.events };\n }\n\n async forkFrom(\n sourceId: SessionId,\n options: ForkFromOptions = {},\n signal?: AbortSignal,\n ): Promise<SessionId> {\n signal?.throwIfAborted();\n const { atSeq, anchorMode = \"after\", seedSuffix = [], childSessionId, meta = {} } = options;\n const source = await this.persistence.inspect(sourceId, signal);\n const boundary = locateTurnEnd(source.events, atSeq, anchorMode);\n const prefix = source.events.slice(0, boundary + 1);\n const childId = childSessionId ?? mintSessionId();\n const childMeta: SessionHeader = {\n version: SESSION_FORMAT_VERSION,\n id: childId,\n createdAt: meta.createdAt ?? Date.now(),\n ...(meta.cwd !== undefined\n ? { cwd: meta.cwd }\n : source.meta.cwd !== undefined\n ? { cwd: source.meta.cwd }\n : {}),\n parentSession: sourceId,\n isSeeded: true,\n ...(meta.agentPreset !== undefined\n ? { agentPreset: meta.agentPreset }\n : source.meta.agentPreset !== undefined\n ? { agentPreset: source.meta.agentPreset }\n : {}),\n ...(meta.origin !== undefined ? { origin: meta.origin } : {}),\n ...(meta.delegationDepth !== undefined ? { delegationDepth: meta.delegationDepth } : {}),\n };\n const seed = [...renumber(prefix, 0), ...renumber(seedSuffix, prefix.length)];\n // 事件行复用:前缀事件(上游 seq → 源会话已存在事件行 id)注册到写路径,\n // appendBatch 消费时复用事件行、不复制。seedSuffix 的 manualTurn 事件是\n // 新事件(无源行),不注册。\n const internals = this.persistence.internals();\n const sourceRows = await internals.backend.getEventRows(sourceId);\n const sourceEventIds = new Map(sourceRows.map((row) => [row.fOriginalSeq, row.fEventId]));\n const reuse = new Map<number, string>();\n for (const event of prefix) {\n const eventId = sourceEventIds.get(event.seq);\n if (eventId !== undefined) reuse.set(event.seq, eventId);\n }\n internals.registerReuseEventIds(childId, reuse);\n await this.persistence.create(childMeta, prefix.length);\n if (seed.length > 0) await this.persistence.append(childId, seed);\n return childId;\n }\n\n async rewind(\n id: SessionId,\n toBoundary: number,\n signal?: AbortSignal,\n ): Promise<SessionPersistenceSnapshot> {\n signal?.throwIfAborted();\n if (!Number.isSafeInteger(toBoundary) || toBoundary < -1) {\n throw new SessionBranchError(\n `rewind boundary must be a non-negative safe integer, got ${toBoundary}`,\n \"INVALID_BOUNDARY\",\n );\n }\n const live = this.live.getSession(id);\n // live 会话先落盘 write-behind 缓冲,保证后续读取与后端事务同视图。\n if (live !== undefined) await this.live.flush(live);\n // 边界校验用原始事件(loadStored,不补 closers)——inspect 会给未闭合\n // log 补合成 closers,把 user/message 边界掩盖成 turn/end,丢失 exclusive\n // 语义。\n const raw = live === undefined ? await this.readRawEvents(id, signal) : undefined;\n const inspection = live === undefined ? undefined : await this.persistence.inspect(id, signal);\n const events = live === undefined ? raw!.events : inspection!.events;\n const meta = live === undefined ? raw!.meta : inspection!.meta;\n const boundaryEvent = events[toBoundary];\n if (toBoundary === -1) {\n // 空前缀:清空整个 log(head 归 -1),与 commitRepair 的初始状态一致。\n } else if (boundaryEvent === undefined) {\n throw new SessionBranchError(\n `rewind boundary ${toBoundary} does not exist in session \"${id}\"`,\n \"INVALID_BOUNDARY\",\n );\n } else if (boundaryEvent.type !== \"turn/end\" && boundaryEvent.type !== \"user/message\") {\n throw new SessionBranchError(\n `rewind boundary ${toBoundary} is not a turn/end or user/message (${boundaryEvent.type})`,\n \"INVALID_BOUNDARY\",\n );\n }\n // 保留前缀长度:turn/end inclusive;user/message exclusive(边界消息由\n // 编辑版替换)。exclusive 截断可能残留孤儿 step/start,经平衡化剔除。\n const rawKeepLength =\n toBoundary === -1 ? 0 : boundaryEvent!.type === \"turn/end\" ? toBoundary + 1 : toBoundary;\n const keepLength = balanceRewindPrefix(events.slice(0, rawKeepLength)).length;\n\n const internals = this.persistence.internals();\n // live 视图是上游 seq(含被过滤的 delta),RDB head 是稠密 seq——live\n // 边界须换算为前缀中 persisted 事件数 - 1;cold 视图本身已是稠密 seq。\n const denseBoundary =\n live === undefined\n ? keepLength - 1\n : events.slice(0, keepLength).filter(isPersistedEvent).length - 1;\n const newSeedLength = await internals.backend.transaction(async (tx) => {\n signal?.throwIfAborted();\n const head = await tx.getHead(id);\n if (denseBoundary > head.fHeadSequence) {\n throw new SessionBranchError(\n `rewind boundary ${toBoundary} is beyond the stored head ${head.fHeadSequence}`,\n \"INVALID_BOUNDARY\",\n );\n }\n if (denseBoundary < head.fHeadSequence) {\n await tx.deleteBridgeTail(id, denseBoundary + 1);\n const prev = denseBoundary === -1 ? undefined : await tx.getPrevBridge(id, denseBoundary);\n if (prev === undefined) {\n await tx.updateHead(id, \"\", -1);\n } else {\n await tx.updateHead(id, prev.fEventId, prev.fSequence);\n }\n }\n // 截断进入继承前缀后收缩 f_seed_length(只收缩、不扩张),防止存储\n // 出现「继承前缀超过存储事件数」的矛盾(上游 load 判损坏)。\n const storedSeedLength = await tx.getSeedLength(id);\n let shrunk = storedSeedLength;\n if (storedSeedLength !== null && storedSeedLength > denseBoundary + 1) {\n await tx.updateSeedLength(id, denseBoundary + 1);\n shrunk = denseBoundary + 1;\n }\n await tx.bumpRevision(id);\n return shrunk;\n });\n // 同步 coordinator 的 storage.inheritedEventCount——DB 已收缩而内存不\n // 收缩的话,下一次 append 的 upsert 会把旧值覆盖回去。\n if (newSeedLength !== null) {\n this.live.setCoordinatorSeedLength(id, newSeedLength);\n }\n\n // 更新确认 head(下一次 append 的并发校验基准),与 appendBatch 同语义。\n internals.writeGuard.confirmHead(id, denseBoundary);\n\n if (live !== undefined) {\n // live 分支:截断内存 log 并重置派生缓存;同步 coordinator cursor 与\n // agent 轮次游标。不调用 load——live 时 load 会先 flush 把旧内存写回,\n // 撤销本次截断。\n truncateLiveSession(live, keepLength);\n const agent = this.live.getAgent(id);\n if (agent !== undefined) {\n agent.requestHeaderLogged = false;\n // 重置 agent 的轮次游标,使重放(followup)复用目标轮号而非递增。\n const lastTurn =\n live.snapshotEvents().findLast((e) => e.type === \"turn/start\")?.data.turn ?? 0;\n const phase = (agent as unknown as { phase?: { lastTurn?: number } }).phase;\n if (phase !== undefined) phase.lastTurn = lastTurn;\n }\n this.live.setCoordinatorCursor(id, keepLength);\n } else {\n // cold 分支:user/message 边界直接同步 ownerless states 条目(load 会\n // 补 closers 撤销截断语义);turn/end 边界经 load 重新 adopt。\n if (boundaryEvent?.type === \"user/message\") {\n this.live.setCoordinatorState(id, keepLength, meta);\n } else {\n await this.persistence.load(id);\n }\n }\n\n const row = await internals.backend.getSession(id);\n if (row === undefined) {\n // 空会话(toBoundary = -1 且从未有行):返回「已确认缺席」快照。\n return {\n header: {\n version: SESSION_FORMAT_VERSION,\n id,\n createdAt: meta.createdAt,\n ...(meta.cwd !== undefined ? { cwd: meta.cwd } : {}),\n ...(meta.parentSession !== undefined ? { parentSession: meta.parentSession } : {}),\n isSeeded: meta.isSeeded,\n ...(meta.origin !== undefined ? { origin: meta.origin } : {}),\n ...(meta.delegationDepth !== undefined ? { delegationDepth: meta.delegationDepth } : {}),\n ...(meta.agentPreset !== undefined ? { agentPreset: meta.agentPreset } : {}),\n },\n revision:\n (await internals.readStoredRevision(id)) ??\n (await this.persistence.readStoredRevision(id))!,\n };\n }\n return { header: rowToMeta(row), revision: (await internals.readStoredRevision(id))! };\n }\n}\n\nexport class SessionBranchRdb extends SessionBranch {\n static inject = [\"sessionPersistence\", \"sessions\"];\n\n constructor(ctx: import(\"@deepseek-ai/cordis\").Context) {\n super(ctx);\n }\n\n private readonly provider = new SessionBranchRdbProvider(\n this.ctx.sessionPersistence as SessionPersistenceRdb,\n {\n getSession: (id) => this.ctx.sessions.get(id),\n getAgent: (id) => {\n // agents 服务可选(纯持久化环境无 agent-loop):经 ctx.get 动态访问。\n const agents = this.ctx.get(\"agents\") as\n | { get(id: SessionId): LiveAgentLike | undefined }\n | undefined;\n return agents?.get(id);\n },\n flush: (session) => this.ctx.sessions.flush(session),\n setCoordinatorCursor: (id, cursor) => {\n // states 是私有 Map;保留条目(owner 不能丢),仅对齐 cursor 到新尾部。\n const persistence = this.ctx.sessionPersistence as unknown as {\n coordinator?: {\n states?: Map<SessionId, { cursor: number } | undefined>;\n };\n };\n const state = persistence.coordinator?.states?.get(id);\n if (state !== undefined) state.cursor = cursor;\n },\n setCoordinatorState: (id, cursor, meta) => {\n // states 条目可能不存在(会话从未被 adopt);存在则仅对齐 cursor,\n // 不存在则创建 ownerless 条目,使下一次 append 走标准路径而非 adopt\n // (adopt 会经 prepareCore 补 closers 撤销截断)。\n const persistence = this.ctx.sessionPersistence as unknown as {\n coordinator?: {\n states?: Map<\n SessionId,\n { cursor: number; meta: SessionHeader; materialized: boolean } | undefined\n >;\n };\n };\n const states = persistence.coordinator?.states;\n if (states === undefined) return;\n const state = states.get(id);\n if (state !== undefined) {\n state.cursor = cursor;\n } else {\n states.set(id, { meta, cursor, materialized: true });\n }\n },\n setCoordinatorSeedLength: (id, seedLength) => {\n // 收缩 storage.inheritedEventCount,与 DB 事务内的收缩保持一致——\n // 不同步的话下一次 append 的 upsert 会把旧值覆盖回去。storage 对象\n // 可能被冻结,整体替换 state.storage 而非改字段。\n const persistence = this.ctx.sessionPersistence as unknown as {\n coordinator?: {\n states?: Map<\n SessionId,\n | {\n storage?: { meta: SessionHeader; inheritedEventCount: number };\n }\n | undefined\n >;\n };\n };\n const state = persistence.coordinator?.states?.get(id);\n if (state?.storage !== undefined && state.storage.inheritedEventCount > seedLength) {\n state.storage = { ...state.storage, inheritedEventCount: seedLength };\n }\n },\n },\n );\n\n readBranchPrefix(\n id: SessionId,\n atSeq?: number,\n mode?: BranchAnchorMode,\n signal?: AbortSignal,\n ): Promise<BranchBoundary> {\n return this.provider.readBranchPrefix(id, atSeq, mode, signal);\n }\n\n readRawEvents(\n id: SessionId,\n signal?: AbortSignal,\n ): Promise<{ meta: SessionHeader; events: readonly SessionEvent[] }> {\n return this.provider.readRawEvents(id, signal);\n }\n\n forkFrom(\n sourceId: SessionId,\n options?: ForkFromOptions,\n signal?: AbortSignal,\n ): Promise<SessionId> {\n return this.provider.forkFrom(sourceId, options, signal);\n }\n\n rewind(\n id: SessionId,\n toBoundary: number,\n signal?: AbortSignal,\n ): Promise<SessionPersistenceSnapshot> {\n return this.provider.rewind(id, toBoundary, signal);\n }\n\n syncLiveCursor(sessionId: SessionId): void {\n const live = this.ctx.sessions.get(sessionId);\n if (live === undefined) return;\n const persistence = this.ctx.sessionPersistence as unknown as {\n coordinator?: {\n states?: Map<SessionId, { cursor: number } | undefined>;\n };\n };\n const state = persistence.coordinator?.states?.get(sessionId);\n if (state === undefined) return;\n let cursor = state.cursor;\n // ignorable 是下游信封扩展(上游 SessionEvent 无此字段),结构化读取。\n while (\n (live.snapshotEvents()[cursor] as (SessionEvent & { ignorable?: unknown }) | undefined)\n ?.ignorable === true\n )\n cursor += 1;\n state.cursor = cursor;\n }\n\n async timeline(sessionId: SessionId, signal?: AbortSignal) {\n const persistence = this.ctx.sessionPersistence as SessionPersistenceRdb;\n const snapshots = await persistence.listSnapshots(signal);\n // live 会话从内存 log 读自有后缀(含 ignorable 版本效果事件);cold 会话\n // 走持久化 readFrom(版本效果不落 canonical log,timeline 为 lineage 骨架)。\n const readOwnEvents = async (id: SessionId, fromSeq: number, s?: AbortSignal) => {\n const live = this.ctx.sessions.get(id);\n if (live !== undefined) return live.snapshotEvents().slice(fromSeq);\n return (await persistence.readFrom(id, fromSeq, s)).events;\n };\n return buildTimeline(snapshots, readOwnEvents, sessionId, signal);\n }\n}\n\nexport default SessionBranchRdb;\n","import { randomUUID } from \"node:crypto\";\nimport type { Context } from \"@deepseek-ai/cordis\";\nimport { SessionLogOffset, decodeSeqRanges, decodeStorageRecord } from \"@deepseek-ai/dsh-session\";\nimport type { Session, SessionEvent, SessionId } from \"@deepseek-ai/dsh-session\";\nimport type { SessionStorageMetadata } from \"@deepseek-ai/dsh-session-persistence\";\nimport { unzipSync } from \"fflate\";\nimport { replaceLiveSessionLog } from \"./branch.ts\";\nimport type { SessionPersistenceRdb } from \"./index.ts\";\n\nexport const SESSION_LOG_ARTIFACT_FILENAME = \"session.jsonl\";\n\nexport const SESSION_IMPORT_PATH = \"/api/session.import\";\n\nconst MAX_IMPORT_ZIP_BYTES = 64 * 1024 * 1024;\n\nexport function expandProvenanceFromStorage(parsed: unknown): unknown {\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n throw new TypeError(\"imported session records must be objects\");\n }\n const record = parsed as { seq?: unknown; sourceEventSeqs?: unknown };\n if (record.sourceEventSeqs === undefined) return parsed;\n if (!Number.isSafeInteger(record.seq) || (record.seq as number) < 0) {\n throw new TypeError(\"imported session event seq must be a non-negative safe integer\");\n }\n return {\n ...record,\n sourceEventSeqs: decodeSeqRanges(record.sourceEventSeqs, (record.seq as number) + 1),\n };\n}\n\nexport function parseJsonlArtifact(content: string): SessionStorageMetadata & {\n events: SessionEvent[];\n} {\n const lines = content.split(\"\\n\");\n if (lines.length === 0 || lines[0] === \"\") {\n throw new Error(\"imported session log is empty\");\n }\n let header: Record<string, unknown> | undefined;\n try {\n header = JSON.parse(lines[0] as string) as Record<string, unknown>;\n } catch {\n throw new Error(\"imported session log has an unparsable header line\");\n }\n if (\n typeof header !== \"object\" ||\n header === null ||\n header[\"type\"] !== \"session\" ||\n typeof header[\"id\"] !== \"string\" ||\n typeof header[\"version\"] !== \"number\" ||\n !Number.isSafeInteger(header[\"createdAt\"] as number) ||\n (header[\"createdAt\"] as number) < 0\n ) {\n throw new Error(\"imported session log has an invalid header line\");\n }\n const seedLength = header[\"seedLength\"];\n if (\n seedLength !== undefined &&\n (!Number.isSafeInteger(seedLength) || (seedLength as number) < 0)\n ) {\n throw new Error(\"imported session log has an invalid seedLength\");\n }\n const events: SessionEvent[] = [];\n for (let i = 1; i < lines.length; i++) {\n const line = lines[i];\n if (line === undefined || line === \"\") continue;\n let parsed: unknown;\n try {\n parsed = JSON.parse(line) as unknown;\n } catch {\n throw new Error(`imported session log has an unparsable event line at ${i}`);\n }\n for (const event of decodeStorageRecord(expandProvenanceFromStorage(parsed))) {\n events.push(event);\n }\n }\n // 连续性校验:导入的 log 必须是从 0 开始的稠密 seq(落库前的最后一道闸)。\n for (let i = 0; i < events.length; i++) {\n if (events[i]!.seq !== i) {\n throw new Error(\n `imported session log seq gap at ${i} (got ${events[i]!.seq}); import requires a dense log`,\n );\n }\n }\n const origin = header[\"origin\"];\n const delegationDepth = header[\"delegationDepth\"];\n // 继承前缀长度不得超过事件总数(上游 load 判损坏);导出已收缩,此处\n // 防御性收缩非自洽的 artifact。\n const inheritedEventCount = Math.min((seedLength as number | undefined) ?? 0, events.length);\n return {\n meta: {\n version: header[\"version\"] as number,\n id: header[\"id\"] as SessionId,\n createdAt: header[\"createdAt\"] as number,\n ...(typeof header[\"cwd\"] === \"string\" ? { cwd: header[\"cwd\"] } : {}),\n ...(typeof header[\"parentSession\"] === \"string\"\n ? { parentSession: header[\"parentSession\"] as SessionId }\n : {}),\n isSeeded: seedLength !== undefined,\n ...(origin === \"subagent\" ? { origin: origin as \"subagent\" } : {}),\n ...(Number.isSafeInteger(delegationDepth as number) && (delegationDepth as number) > 0\n ? { delegationDepth: delegationDepth as number }\n : {}),\n ...(typeof header[\"agentPreset\"] === \"string\" ? { agentPreset: header[\"agentPreset\"] } : {}),\n },\n inheritedEventCount: SessionLogOffset(inheritedEventCount),\n events,\n };\n}\n\nexport function parseImportZip(zip: Uint8Array): SessionStorageMetadata & {\n events: SessionEvent[];\n} {\n let entries: Record<string, Uint8Array>;\n try {\n entries = unzipSync(zip);\n } catch {\n throw new Error(\"imported zip is not a valid ZIP archive\");\n }\n const artifact = entries[SESSION_LOG_ARTIFACT_FILENAME];\n if (artifact === undefined) {\n throw new Error(`imported zip is missing ${SESSION_LOG_ARTIFACT_FILENAME}`);\n }\n return parseJsonlArtifact(new TextDecoder().decode(artifact));\n}\n\nexport async function persistImport(\n persistence: SessionPersistenceRdb,\n branch: { rewind(id: SessionId, toBoundary: number): Promise<unknown> } | undefined,\n imported: SessionStorageMetadata & { events: SessionEvent[] },\n targetId?: SessionId,\n sessions?: { get(id: SessionId): Session | undefined },\n): Promise<SessionId> {\n const id = targetId ?? (`session-${randomUUID()}` as SessionId);\n if (targetId !== undefined) {\n if (branch === undefined) {\n throw new Error(\"sessionBranch service is unavailable\");\n }\n await branch.rewind(targetId, -1);\n } else {\n await persistence.create({ ...imported.meta, id }, imported.inheritedEventCount);\n }\n if (imported.events.length > 0) await persistence.append(id, imported.events);\n // 覆盖语义的 live 同步:rewind 截断的 live log 由同一批导入事件补回\n // (不发布、不落库),使 observeSession 的 live 快照与 DB 一致。\n if (targetId !== undefined) {\n const live = sessions?.get(targetId);\n if (live !== undefined) replaceLiveSessionLog(live, imported.events);\n }\n return id;\n}\n\nexport function registerSessionImport(ctx: Context, persistence: SessionPersistenceRdb): void {\n // webServer / connection 由其他插件注册,本后端构造早于它们——用\n // ctx.inject 延迟到两个服务就绪后再注册 exact route(disposer 随 fiber\n // 卸载自动回滚);服务缺失(headless 装配、纯后端测试)时注入永不触发。\n ctx.inject([\"webServer\", \"connection\"] as const, (webCtx) => {\n const webServer = webCtx.webServer as unknown as {\n register(route: {\n kind: \"exact\";\n path: string;\n handler: (\n req: import(\"node:http\").IncomingMessage,\n res: import(\"node:http\").ServerResponse,\n ) => void | Promise<void>;\n }): () => void;\n };\n const connection = webCtx.get(\"connection\") as unknown as {\n requestRejection(request: {\n headers: import(\"node:http\").IncomingHttpHeaders;\n }): number | undefined;\n };\n return webCtx.effect(\n () =>\n webServer.register({\n kind: \"exact\",\n path: SESSION_IMPORT_PATH,\n handler: async (req, res) => {\n const rejection = connection.requestRejection(req);\n if (rejection !== undefined) {\n res.writeHead(rejection);\n res.end(rejection === 401 ? \"unauthorized\" : \"forbidden\");\n return;\n }\n const chunks: Buffer[] = [];\n for await (const chunk of req) chunks.push(chunk as Buffer);\n const body = Buffer.concat(chunks);\n let envelope: { zip?: unknown; sessionId?: unknown };\n try {\n envelope = JSON.parse(body.toString(\"utf8\")) as {\n zip?: unknown;\n sessionId?: unknown;\n };\n } catch {\n res.writeHead(400, { \"content-type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"request body is not JSON\" }));\n return;\n }\n if (typeof envelope.zip !== \"string\" || envelope.zip === \"\") {\n res.writeHead(400, { \"content-type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"missing zip field\" }));\n return;\n }\n if (\n envelope.sessionId !== undefined &&\n (typeof envelope.sessionId !== \"string\" || envelope.sessionId === \"\")\n ) {\n res.writeHead(400, { \"content-type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"sessionId must be a non-empty string\" }));\n return;\n }\n let zip: Uint8Array;\n try {\n zip = Buffer.from(envelope.zip, \"base64\");\n } catch {\n res.writeHead(400, { \"content-type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"zip field is not valid base64\" }));\n return;\n }\n if (zip.byteLength > MAX_IMPORT_ZIP_BYTES) {\n res.writeHead(413, { \"content-type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"imported zip exceeds the size limit\" }));\n return;\n }\n let imported: SessionStorageMetadata & { events: SessionEvent[] };\n try {\n imported = parseImportZip(zip);\n } catch (error: unknown) {\n res.writeHead(400, { \"content-type\": \"application/json\" });\n res.end(\n JSON.stringify({\n error: error instanceof Error ? error.message : \"imported zip is invalid\",\n }),\n );\n return;\n }\n const targetId =\n typeof envelope.sessionId === \"string\"\n ? (envelope.sessionId as SessionId)\n : undefined;\n const branch = webCtx.get(\"sessionBranch\") as unknown as\n | { rewind(id: SessionId, toBoundary: number): Promise<unknown> }\n | undefined;\n try {\n const sessions = webCtx.get(\"sessions\") as\n | { get(id: SessionId): Session | undefined }\n | undefined;\n const id = await persistImport(persistence, branch, imported, targetId, sessions);\n res.writeHead(200, { \"content-type\": \"application/json\" });\n res.end(JSON.stringify({ sessionId: id }));\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n if (targetId !== undefined && /not found/i.test(message)) {\n res.writeHead(404, { \"content-type\": \"application/json\" });\n res.end(JSON.stringify({ error: `session \"${targetId}\" not found` }));\n return;\n }\n res.writeHead(500, { \"content-type\": \"application/json\" });\n res.end(\n JSON.stringify({\n error: error instanceof Error ? error.message : \"import failed\",\n }),\n );\n return;\n }\n },\n }),\n `session-rdb: ${SESSION_IMPORT_PATH} route`,\n );\n });\n}\n","import { Context } from \"@deepseek-ai/cordis\";\nimport z from \"@deepseek-ai/schemastery\";\nimport type { SettingsProvider } from \"@deepseek-ai/dsh-settings\";\nimport { randomUUID } from \"node:crypto\";\nimport { Pool } from \"pg\";\nimport { drizzle as drizzlePg } from \"drizzle-orm/node-postgres\";\nimport {\n SessionPersistence,\n SessionPersistenceRevision,\n PersistenceCoordinator,\n type PersistenceBackend,\n type SessionLocation,\n type SessionPersistenceSnapshot,\n type SessionStorageMetadata,\n type StoredPrefix,\n type StoredSuffix,\n} from \"@deepseek-ai/dsh-session-persistence\";\nimport {\n SessionLogOffset,\n type SessionEvent,\n type SurfaceEventType,\n type SessionId,\n type SessionHeader,\n} from \"@deepseek-ai/dsh-session\";\nimport { type Backend, type BackendTx, type EventInsert, type EventRow } from \"./backend.ts\";\nimport { WriteGuard } from \"./write-guard.ts\";\nimport {\n buildSeqMap,\n recomputeReplaceProvenance,\n repairSurfaceOps,\n rowToMeta,\n scanRows,\n toJsonlArtifact,\n} from \"./log.ts\";\nimport {\n DEFAULT_BUSY_TIMEOUT_MS,\n eventDimensions,\n EVENT_ENCODING,\n isPersistedEvent,\n type JournalMode,\n} from \"./schema.ts\";\nimport { SqliteBackend } from \"./sqlite.ts\";\nimport { PostgresBackend } from \"./postgres.ts\";\nimport { SessionBranchRdb } from \"./branch.ts\";\nimport { registerSessionImport } from \"./import.ts\";\n\nexport { SCHEMA_VERSION, EPHEMERAL_EVENT_TYPES } from \"./schema.ts\";\nexport { SessionBranchRdb, SessionBranchRdbProvider, locateTurnEnd } from \"./branch.ts\";\n\nexport interface SessionPersistenceRdbInternals {\n readonly backend: Backend;\n readonly writeGuard: WriteGuard;\n create(meta: SessionHeader, inheritedEventCount?: number): Promise<void>;\n append(id: SessionId, events: readonly SessionEvent[]): Promise<void>;\n load(id: SessionId): Promise<import(\"@deepseek-ai/dsh-session-persistence\").SessionInspection>;\n inspect(\n id: SessionId,\n signal?: AbortSignal,\n ): Promise<import(\"@deepseek-ai/dsh-session-persistence\").SessionInspection>;\n readFrom(\n id: SessionId,\n fromSeq: number,\n signal?: AbortSignal,\n ): Promise<import(\"@deepseek-ai/dsh-session-persistence\").SessionEventSuffix>;\n listSnapshots(signal?: AbortSignal): Promise<SessionPersistenceSnapshot[]>;\n readStoredRevision(\n id: SessionId,\n signal?: AbortSignal,\n ): Promise<import(\"@deepseek-ai/dsh-session-persistence\").SessionPersistenceRevision | undefined>;\n\n registerReuseEventIds(childId: SessionId, map: ReadonlyMap<number, string>): void;\n}\n\nexport type Config =\n | {\n type: \"sqlite\";\n\n path: string;\n\n journalMode?: JournalMode;\n\n busyTimeout?: number;\n }\n | {\n type: \"postgres\";\n\n connectionString: string;\n\n schema?: string;\n };\n\nexport class SessionPersistenceRdb\n extends SessionPersistence\n implements PersistenceBackend<number>\n{\n static inject = [\"sessions\", \"settings\"];\n\n static Config: z<Config> = z.union([\n z.object({\n type: z.const(\"sqlite\"),\n path: z.string().required(),\n journalMode: z.union([\"wal\", \"delete\", \"truncate\", \"persist\"] as const).default(\"wal\"),\n busyTimeout: z.number().step(1).min(0).default(DEFAULT_BUSY_TIMEOUT_MS),\n }),\n z.object({\n type: z.const(\"postgres\"),\n connectionString: z.string().required(),\n schema: z.string().default(\"public\"),\n }),\n ]);\n\n static readonly settingsNs = \"session-rdb\";\n\n override readonly name = \"session-rdb\";\n\n override readonly supportsRawArtifacts = true;\n\n override async readRaw(\n id: SessionId,\n signal?: AbortSignal,\n ): Promise<import(\"@deepseek-ai/dsh-session-persistence\").SessionRawArtifact | undefined> {\n signal?.throwIfAborted();\n await this.ready;\n signal?.throwIfAborted();\n const log = await this.readLog(id, {}, signal);\n if (log === undefined) return undefined;\n repairSurfaceOps(log.events);\n recomputeReplaceProvenance(log.events);\n const inheritedEventCount = Math.min(log.inheritedEventCount, log.events.length);\n return {\n meta: log.meta,\n inheritedEventCount: SessionLogOffset(inheritedEventCount),\n filename: \"session.jsonl\",\n content: toJsonlArtifact(log.meta, inheritedEventCount, log.events),\n };\n }\n\n private readonly backend: Backend;\n private storeIdentity!: string;\n private readonly ready: Promise<void>;\n private readonly coordinator: PersistenceCoordinator<number>;\n\n private readonly writeGuard = new WriteGuard();\n\n private readonly reuseEventIds = new Map<SessionId, Map<number, string>>();\n\n constructor(\n ctx: Context,\n public config: Config,\n\n injectedBackend?: Backend,\n ) {\n // settings.yaml 的 `session-rdb` namespace 覆盖 cordis 层 entry config;\n // settings 服务缺失时(纯 cordis 装配/测试)退化为 entry config。\n let resolved: Config = config;\n const settings = ctx.reflect.get(\"settings\") as unknown as SettingsProvider | undefined;\n if (settings !== undefined) {\n const scope = settings.register(\n SessionPersistenceRdb.settingsNs,\n SessionPersistenceRdb.Config,\n { base: config },\n );\n resolved = scope.get();\n scope.watch(() => {\n // 后端在构造时建成,settings 变更后需重启 dsh 生效。\n ctx.logger.warn(\"session-rdb: settings changed; restart to apply the new configuration\");\n });\n }\n super(ctx);\n // 异步打开连接,避免阻塞插件 apply;存储钩子统一 await 同一个 readiness。\n this.config = resolved;\n this.backend = injectedBackend ?? createBackend(resolved);\n this.ready = this.init();\n this.coordinator = new PersistenceCoordinator<number>(this.ctx, this);\n // 分支 provider 服务(rewind / forkFrom / timeline),随 fiber 卸载自动回滚。\n new SessionBranchRdb(this.ctx);\n // 导入端点:webServer + connection 就绪后注册 `/api/session.import`。\n registerSessionImport(this.ctx, this);\n }\n\n private async init(): Promise<void> {\n await this.backend.open();\n this.storeIdentity = this.backend.storeIdentity;\n }\n\n // --- SessionPersistence service surface (delegated to the coordinator) ---\n\n locate(_meta: SessionHeader): SessionLocation | undefined {\n return undefined;\n }\n\n create(meta: SessionHeader, inheritedEventCount?: number): Promise<void> {\n return this.coordinator.create(\n meta,\n inheritedEventCount === undefined ? undefined : SessionLogOffset(inheritedEventCount),\n );\n }\n\n append(id: SessionId, events: readonly SessionEvent[]): Promise<void> {\n return this.coordinator.append(id, events);\n }\n\n load(id: SessionId): Promise<import(\"@deepseek-ai/dsh-session-persistence\").SessionInspection> {\n return this.coordinator.load(id);\n }\n\n inspect(\n id: SessionId,\n signal?: AbortSignal,\n ): Promise<import(\"@deepseek-ai/dsh-session-persistence\").SessionInspection> {\n return this.coordinator.inspect(id, signal);\n }\n\n readFrom(\n id: SessionId,\n fromSeq: number,\n signal?: AbortSignal,\n ): Promise<import(\"@deepseek-ai/dsh-session-persistence\").SessionEventSuffix> {\n // 校验委托给 coordinator;这里只做品牌转换,避免 cordis proxy 下同步 throw 逃逸。\n return this.coordinator.readFrom(id, fromSeq as SessionLogOffset, signal);\n }\n\n override borrowSession(\n id: SessionId,\n signal?: AbortSignal,\n ): Promise<import(\"@deepseek-ai/dsh-session-persistence\").BorrowedSessionSource> {\n return this.coordinator.borrowSession(id, signal);\n }\n\n // --- PersistenceBackend hooks (the storage primitives) ---\n\n loadStored(id: SessionId, signal?: AbortSignal): Promise<StoredPrefix<number> | undefined> {\n return this.readPrefix(id, signal);\n }\n\n async loadStoredFrom(\n id: SessionId,\n fromSeq: number,\n signal?: AbortSignal,\n ): Promise<StoredSuffix | undefined> {\n const log = await this.readLog(id, { fromSeq }, signal);\n if (log === undefined) return undefined;\n return {\n meta: log.meta,\n inheritedEventCount: SessionLogOffset(log.inheritedEventCount),\n events: log.events,\n };\n }\n\n private async readPrefix(\n id: SessionId,\n signal?: AbortSignal,\n ): Promise<StoredPrefix<number> | undefined> {\n const log = await this.readLog(id, {}, signal);\n if (log === undefined) {\n // 已确认缺席:本实例读过的新会话,后续对已出现行的 append 必须拒绝。\n this.writeGuard.confirmHead(id, -1);\n return undefined;\n }\n // 确认 head 是最后一个保留 seq(torn tail 由 commitRepair 删除并重确认)。\n this.writeGuard.confirmHead(id, log.events.at(-1)?.seq ?? -1);\n // replace 的 provenance 读取时重计算(sourceEventSeqs 不落库)。\n recomputeReplaceProvenance(log.events);\n return {\n meta: log.meta,\n inheritedEventCount: SessionLogOffset(log.inheritedEventCount),\n events: log.events,\n // revision 表示必须与 readStoredRevision 的表示一致(见 listSnapshots)。\n revision: SessionPersistenceRevision(\n `${this.storeIdentity}:incarnation:${log.incarnation}:revision:${log.revision}`,\n ),\n ...(log.tornFrom !== undefined ? { tornMarker: log.tornFrom } : {}),\n };\n }\n\n async readStoredRevision(\n id: SessionId,\n signal?: AbortSignal,\n ): Promise<SessionPersistenceRevision | undefined> {\n signal?.throwIfAborted();\n await this.ready;\n signal?.throwIfAborted();\n const row = await this.backend.getSession(id);\n if (row === undefined) return undefined;\n return SessionPersistenceRevision(\n `${this.storeIdentity}:incarnation:${row.fIncarnation}:revision:${row.fRevision}`,\n );\n }\n\n private async readLog(\n id: SessionId,\n options: { fromSeq?: number } = {},\n signal?: AbortSignal,\n ): Promise<\n | {\n meta: SessionHeader;\n\n inheritedEventCount: number;\n events: SessionEvent[];\n tornFrom?: number;\n\n incarnation: string;\n\n revision: number;\n }\n | undefined\n > {\n signal?.throwIfAborted();\n await this.ready;\n signal?.throwIfAborted();\n const row = await this.backend.getSession(id);\n if (row === undefined) return undefined;\n const meta = rowToMeta(row);\n let eventRows: EventRow[];\n let seqMap: ReadonlyMap<number, number>;\n if (options.fromSeq === undefined) {\n // 全量读:seq map 由同一批行构建(无额外查询)。\n eventRows = await this.backend.getEventRows(id);\n seqMap = buildSeqMap(eventRows);\n } else {\n // 后缀读:坐标重映射需要每一行的上游 seq,另读轻量两列映射。\n eventRows = await this.backend.getEventRows(id, options.fromSeq);\n const seqRows = await this.backend.getSeqMapRows(id);\n seqMap = buildSeqMap(seqRows);\n }\n signal?.throwIfAborted();\n const { preserved, tornFrom } = scanRows(eventRows, options.fromSeq ?? 0, seqMap);\n return {\n meta,\n inheritedEventCount: row.fSeedLength ?? 0,\n events: preserved,\n incarnation: row.fIncarnation,\n revision: row.fRevision,\n ...(tornFrom !== undefined ? { tornFrom } : {}),\n };\n }\n\n async appendBatch(\n storage: SessionStorageMetadata,\n events: readonly SessionEvent[],\n _isMaterialized: boolean,\n ): Promise<void> {\n await this.ready;\n const persisted = events.filter(isPersistedEvent);\n if (persisted.length === 0) return;\n const meta = storage.meta;\n // fork 派生会话的 seed 复用源会话事件行(不复制);消费后清除。\n const reuse = this.reuseEventIds.get(meta.id);\n if (reuse !== undefined) this.reuseEventIds.delete(meta.id);\n let confirmedHead = -1;\n await this.backend.transaction(async (tx) => {\n await tx.upsertSession(storage, randomUUID());\n const head = await tx.getHead(meta.id);\n // 重编号前拒绝第二个写入者:多实例共享数据库时,第二个写入者经陈旧\n // 视图 append 会把事件静默重编号到对方尾部、损坏 log。磁盘 head 必须\n // 等于本实例确认过的最后一个 head。\n this.writeGuard.assertNoConcurrentWriter(meta.id, head.fHeadSequence);\n const { headEventId, headSequence } = await appendEventTail(\n tx,\n meta,\n persisted,\n { parentId: head.fHeadEventId, nextSeq: head.fHeadSequence + 1 },\n reuse,\n );\n await tx.updateHead(meta.id, headEventId, headSequence);\n await tx.bumpRevision(meta.id);\n confirmedHead = headSequence;\n });\n // 提交后才确认新 head:回滚不得留下本实例实际未写的已确认 head。\n this.writeGuard.confirmHead(meta.id, confirmedHead);\n }\n\n async commitRepair(\n storage: SessionStorageMetadata,\n tornMarker: number | undefined,\n closers: readonly SessionEvent[],\n ): Promise<void> {\n await this.ready;\n const meta = storage.meta;\n const persistedClosers = closers.filter(isPersistedEvent);\n if (tornMarker === undefined && persistedClosers.length === 0) return;\n await this.backend.transaction(async (tx) => {\n if (tornMarker !== undefined) {\n await tx.deleteBridgeTail(meta.id, tornMarker);\n // head 游标回退到最后一个幸存事件(torn tail 从 seq 0 开始时为初始态)。\n const prev = await tx.getPrevBridge(meta.id, tornMarker - 1);\n if (prev === undefined) {\n await tx.updateHead(meta.id, \"\", -1);\n } else {\n await tx.updateHead(meta.id, prev.fEventId, prev.fSequence);\n }\n }\n if (persistedClosers.length > 0) {\n // 锚定实际尾行:head 游标可能滞后于行(手工 torn tail 不更新游标)。\n const last = await tx.getLastBridge(meta.id);\n const { headEventId, headSequence } = await appendEventTail(tx, meta, persistedClosers, {\n parentId: last?.fEventId ?? \"\",\n nextSeq: (last?.fSequence ?? -1) + 1,\n });\n await tx.updateHead(meta.id, headEventId, headSequence);\n }\n await tx.bumpRevision(meta.id);\n });\n // 修复后重确认 head:截断会回退它、closers 会推进它,下一次 append 不得\n // 基于陈旧确认被拒绝(或更糟,被静默重编号)。\n const row = await this.backend.getSession(meta.id);\n this.writeGuard.confirmHead(meta.id, row?.fHeadSequence ?? -1);\n }\n\n async list(signal?: AbortSignal): Promise<SessionHeader[]> {\n signal?.throwIfAborted();\n await this.ready;\n signal?.throwIfAborted();\n const rows = await this.backend.listSessions();\n signal?.throwIfAborted();\n return rows.map(rowToMeta);\n }\n\n async listSnapshots(\n signal?: AbortSignal,\n ): Promise<Array<SessionPersistenceSnapshot & { inheritedEventCount: number }>> {\n signal?.throwIfAborted();\n await this.ready;\n signal?.throwIfAborted();\n const rows = await this.backend.listSessions();\n signal?.throwIfAborted();\n return rows.map((row) => ({\n header: rowToMeta(row),\n revision: SessionPersistenceRevision(\n `${this.storeIdentity}:incarnation:${row.fIncarnation}:revision:${row.fRevision}`,\n ),\n inheritedEventCount: row.fSeedLength ?? 0,\n }));\n }\n\n async close(): Promise<void> {\n await this.ready;\n await this.backend.close();\n }\n\n registerReuseEventIds(childId: SessionId, map: ReadonlyMap<number, string>): void {\n this.reuseEventIds.set(childId, new Map(map));\n }\n\n internals(): SessionPersistenceRdbInternals {\n return {\n backend: this.backend,\n writeGuard: this.writeGuard,\n create: (meta, inheritedEventCount) => this.create(meta, inheritedEventCount),\n append: (id, events) => this.append(id, events),\n load: (id) => this.load(id),\n inspect: (id, signal) => this.inspect(id, signal),\n readFrom: (id, fromSeq, signal) => this.readFrom(id, fromSeq, signal),\n listSnapshots: (signal) => this.listSnapshots(signal),\n readStoredRevision: (id, signal) => this.readStoredRevision(id, signal),\n registerReuseEventIds: (childId, map) => this.registerReuseEventIds(childId, map),\n };\n }\n}\n\nfunction createBackend(config: Config): Backend {\n if (config.type === \"sqlite\") {\n return new SqliteBackend({\n path: config.path,\n journalMode: config.journalMode ?? \"wal\",\n busyTimeout: config.busyTimeout ?? DEFAULT_BUSY_TIMEOUT_MS,\n });\n }\n const pool = new Pool({ connectionString: config.connectionString });\n // node-postgres 要求 Pool 必须监听 error:未监听的 idle client error 会\n // 以 uncaughtException 崩溃进程;池级错误在下次查询处可见,这里只消费。\n pool.on(\"error\", () => {});\n const db = drizzlePg({ client: pool });\n const identityBase = [\n \"postgres\",\n pool.options.host ?? \"localhost\",\n String(pool.options.port ?? 5432),\n pool.options.database ?? \"\",\n config.schema ?? \"public\",\n ].join(\":\");\n return new PostgresBackend(db, {\n identityBase,\n schema: config.schema ?? \"public\",\n close: () => pool.end(),\n });\n}\n\nasync function appendEventTail(\n tx: BackendTx,\n meta: SessionHeader,\n events: readonly SessionEvent[],\n anchor: { parentId: string; nextSeq: number },\n reuse?: ReadonlyMap<number, string>,\n): Promise<{ headEventId: string; headSequence: number }> {\n let parentId = anchor.parentId;\n let nextSeq = anchor.nextSeq;\n // 两个批次一次性多行 INSERT(N 事件 2 条语句,而非 2N)。\n const eventRows: EventInsert[] = [];\n const bridgeRows: Array<{\n fSessionId: SessionId;\n fEventId: string;\n fSequence: number;\n fOriginalSeq: number;\n fSurfaceOp: string | null;\n }> = [];\n for (const event of events) {\n const reusedId = reuse?.get(event.seq);\n const eventId = reusedId ?? randomUUID();\n if (reusedId === undefined) {\n const { kind, role, name, actionId } = eventDimensions(event);\n eventRows.push({\n fEventId: eventId,\n fParentId: parentId,\n fType: event.type,\n fKind: kind,\n fRole: role,\n fName: name,\n fActionId: actionId,\n fEncoding: EVENT_ENCODING,\n fData: JSON.stringify(event.data),\n fCreatedAt: event.time,\n });\n }\n const surfaceOp =\n (event as SessionEvent<SurfaceEventType>).surfaceOp === undefined\n ? null\n : JSON.stringify((event as SessionEvent<SurfaceEventType>).surfaceOp);\n bridgeRows.push({\n fSessionId: meta.id,\n fEventId: eventId,\n fSequence: nextSeq,\n fOriginalSeq: event.seq,\n fSurfaceOp: surfaceOp,\n });\n parentId = eventId;\n nextSeq++;\n }\n if (eventRows.length > 0) await tx.insertEvents(eventRows);\n await tx.insertBridges(bridgeRows);\n return { headEventId: parentId, headSequence: nextSeq - 1 };\n}\n\nexport default SessionPersistenceRdb;\n"],"mappings":"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"}
|
package/dist/invariant.d.mts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"invariant.d.mts","names":[],"sources":["../src/invariant.ts"],"mappings":";;cAMa;cAEA;cAIA,QAAK,KAAS,YAAU"}
|
package/dist/invariant.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"invariant.mjs","names":[],"sources":["../src/invariant.ts"],"sourcesContent":["/* jscpd:ignore-start */\nimport type { Context } from \"@deepseek-ai/cordis\";\nimport type { InvariantInstaller } from \"@deepseek-ai/dsh-invariants\";\n\nconst PACKAGE_NAME = \"@morlay/session-rdb\";\n\nexport const name = \"session-rdb-invariant\";\n\nexport const inject = [\"invariants\"];\n\nconst install: InvariantInstaller = () => {};\n\nexport const apply = (ctx: Context): Promise<() => void> =>\n Promise.resolve(ctx.invariants.register(PACKAGE_NAME, install));\n/* jscpd:ignore-end */\n"],"mappings":";AAIA,MAAM,eAAe;AAErB,MAAa,OAAO;AAEpB,MAAa,SAAS,CAAC,YAAY;AAEnC,MAAM,gBAAoC,CAAC;AAE3C,MAAa,SAAS,QACpB,QAAQ,QAAQ,IAAI,WAAW,SAAS,cAAc,OAAO,CAAC"}
|