# ctx.sessionPersistence `SessionPersistence` (abstract seam) — provided by `@deepseek-ai/dsh-session-persistence`. Durable append-only session storage. Implementations preserve contiguous, losslessly JSON-serializable events; append resolves only after durability, and load balances a complete interrupted tail without rewriting committed events. [Source](https://github.com/deepseek-harness/deepseek-harness/blob/master/packages/session-persistence/session-persistence/src/index.ts#L42) ### ctx.sessionPersistence.locate(meta) ```ts website-api abstract locate(meta: SessionHeader): SessionLocation | undefined ``` Resolve this backend's independent local artifact for a session without reading, creating, flushing, or otherwise materializing it. Backends such as SQLite that do not own one artifact per session return `undefined`. - `meta` — the immutable session header whose artifact is requested. **Returns** the backend-specific absolute location, when one exists. [Source](https://github.com/deepseek-harness/deepseek-harness/blob/master/packages/session-persistence/session-persistence/src/index.ts#L54) ### ctx.sessionPersistence.create(meta) ```ts website-api abstract create(meta: SessionHeader): Promise ``` Register a new session's metadata. A backend MAY defer the physical write until the first append (lazy materialization), in which case a created-but-never-appended session is absent from list — abandoned sessions leave nothing behind. - `meta` — the immutable header (id, version, cwd, lineage) to record. [Source](https://github.com/deepseek-harness/deepseek-harness/blob/master/packages/session-persistence/session-persistence/src/index.ts#L63) ### ctx.sessionPersistence.append(id, events) ```ts website-api abstract append(id: SessionId, events: readonly SessionEvent[]): Promise ``` Durably persist a batch of events (called from the write-behind drain at the `session/flush` checkpoint). Honors the append-only and contiguous-seq contracts: the first event's `seq` MUST equal the stored next-seq (after `load` has durably closed any interrupted turn). Rejects non-JSON- serializable `event.data` with an error naming the offending event type. - `id` — the session the batch belongs to. - `events` — the contiguous batch to persist, in seq order. [Source](https://github.com/deepseek-harness/deepseek-harness/blob/master/packages/session-persistence/session-persistence/src/index.ts#L74) ### ctx.sessionPersistence.load(id) ```ts website-api abstract load(id: SessionId): Promise<{ meta: SessionHeader; events: SessionEvent[] }> ``` Load a header and balanced contiguous log. A complete interrupted final turn is preserved and durably closed with missing tool errors plus any open step and turn boundaries; only a torn final record is discarded. Unknown versions and corruption in the committed prefix reject. - `id` — the persisted session to reload. **Returns** the header and a log ending on a balanced `turn/end`. [Source](https://github.com/deepseek-harness/deepseek-harness/blob/master/packages/session-persistence/session-persistence/src/index.ts#L84) ### ctx.sessionPersistence.list() ```ts website-api abstract list(): Promise ``` Lightweight listing from metadata, without a full-log parse. **Returns** one header per materialized session. [Source](https://github.com/deepseek-harness/deepseek-harness/blob/master/packages/session-persistence/session-persistence/src/index.ts#L90)