guntur-d
dsh-memory
Persistent cross-session memory plugin for DeepSeek Harness: workspace-scoped durable facts with memory_write/list/search/forget tools and bounded prompt injection
- Stars
- 0
- Language
- TypeScript
- Created
- Aug 14, 2026
- Updated
- Aug 14, 2026
Introduction
dsh-memory
Persistent cross-session memory plugin for DeepSeek Harness. Facts the model saves are stored durably per workspace (the owning session's cwd) on the harness storage-domain seam, and injected as a bounded prompt section into later sessions in the same workspace — so something important established in one session carries over to the next.
ctx.memoryservice:save/list/search/forget- Model tools:
memory_write,memory_list,memory_search,memory_forget - Prompt section:
app:memory(order 50, default 8 lines) in every session of the workspace
Requirements
The harness profile must mount the storage seam with a backend:
@deepseek-ai/dsh-storage(the hub)@deepseek-ai/dsh-storage-json(default, human-readable JSON files) or@deepseek-ai/dsh-storage-sqlite@deepseek-ai/dsh-storage-domain(the domain facility this plugin opens thememorydomain on)
The shipped web profile already mounts all three with the json backend — no extra setup needed there.
Install
# from this repo (sources build on install via prepare)
dsh plugin --profile web add github:guntur-d/dsh-memory
# or from npm once published
dsh plugin --profile web add @guntur-d/dsh-memory
The dsh.bundle.patch manifest field makes the plugin a bundle layer: the included cordis.patch.yml row activates the plugin automatically in the profile. GitHub-topic discovery: dsh-plugin.
Usage
The model calls memory_write when something durable is established (a port, a preference, a non-obvious project fact). You can prompt it explicitly:
Please remember: the staging server listens on port 3080 and the deploy script is deploy.sh
A later session in the same workspace starts with an app:memory section listing the recent memories, and can memory_list / memory_search / memory_forget (by id) on demand.
Config
interface Config {
maxEntriesPerWorkspace: number // default 500; the oldest are evicted past it
maxTextChars: number // default 2000; longer saves are refused
maxContextEntries: number // default 8; memories rendered into the prompt section
maxListEntries: number // default 50; memories one list/search call returns
}
The storage backend route is decided by the deployment's dsh-storage-domain config (routes for the memory domain, else its default backend).
Semantics
- Entries are scoped by the owning session's
cwd; sessions without acwdshare one anonymous workspace. - A monotonic
seq(minted on the domain's atomic write chain) keeps ordering and eviction deterministic even when wall-clock timestamps tie. - Saves and forgets await durability on the backend; reads are synchronous from the domain's in-memory state.
- The model decides what is worth saving — no automatic summarization.
Develop
pnpm run check # typecheck against a deepseek-harness checkout (tsconfig.check.json)
Notes:
- The npm-published
@deepseek-ai/*dependency chain is currently incomplete (a peer package@deepseek-ai/dsh-type-metais not published), so a from-npmpnpm installof this plugin fails until upstream completes the publish chain. Thetsconfig.check.jsontypechecks this source against a localdeepseek-harnesscheckout instead (edit the absolute path in itspathsif your checkout lives elsewhere). - Until the npm chain is fixed, install the plugin from a checkout:
dsh plugin --profile web add .from this repo (the profile resolves@deepseek-ai/*through the harness installation).