feat(session-persistence-sqlite): second backend validating the abstraction
Add a SQLite SessionPersistence backend (node:sqlite), a SECOND implementation built to prove the abstract seam + the shared runPersistenceContract suite are genuinely backend-agnostic. Each SessionEvent maps 1:1 onto an events row (session_id, seq, type, time, data); append is an INSERT inside a transaction asserting the contiguous-seq contract; the mutable SessionSummary lives in the sessions metadata row. It satisfies the SAME contract semantics as the JSONL backend, expressed over rows instead of file bytes: - Lazy materialization: create() records intent in memory; no row until the first append (a never-appended session is absent from has()/list() via a materialized flag set inside the first append transaction). - Crash-tail-on-load: load() returns events only through the last complete turn/end and deletes the uncommitted tail; a seq gap in the committed region makes the session unloadable. - Transactional append: a mid-batch failure (a UNIQUE seq collision from a concurrent writer) rolls back entirely, keeping the cursor truthful. Like the JSONL backend it is also the write-path plugin (session/event → buffer → session/flush drain, onCreated seed/adopt/collision handling, HMR seeding, dispose-to-quiescence). The package runs the shared runPersistenceContract suite plus SQLite-specific tests (transaction rollback, crash-tail cut, schema version, HMR adoption). Docs flip every "SQLite is future/deferred" reference (ADR 0016, architecture.md, the persistence module doc + README) to "implemented; the contract holds both backends to identical semantics".
This commit is contained in:
15
yarn.lock
15
yarn.lock
@@ -706,6 +706,21 @@ __metadata:
|
||||
languageName: unknown
|
||||
linkType: soft
|
||||
|
||||
"@deepseek-ai/dsh-session-persistence-sqlite@workspace:packages/session-persistence-sqlite":
|
||||
version: 0.0.0-use.local
|
||||
resolution: "@deepseek-ai/dsh-session-persistence-sqlite@workspace:packages/session-persistence-sqlite"
|
||||
dependencies:
|
||||
"@deepseek-ai/dsh-session": "npm:^0.0.1"
|
||||
"@deepseek-ai/dsh-session-persistence": "npm:^0.0.1"
|
||||
cordis: "npm:^4.0.0-rc.6"
|
||||
schemastery: "npm:^3.18.0"
|
||||
peerDependencies:
|
||||
"@deepseek-ai/dsh-session": ^0.0.1
|
||||
"@deepseek-ai/dsh-session-persistence": ^0.0.1
|
||||
cordis: ^4.0.0-rc.6
|
||||
languageName: unknown
|
||||
linkType: soft
|
||||
|
||||
"@deepseek-ai/dsh-session-persistence@npm:^0.0.1, @deepseek-ai/dsh-session-persistence@workspace:packages/session-persistence":
|
||||
version: 0.0.0-use.local
|
||||
resolution: "@deepseek-ai/dsh-session-persistence@workspace:packages/session-persistence"
|
||||
|
||||
Reference in New Issue
Block a user