Memory Lake as a persistent memory layer for dsh: memory_search, memory_remember, and memory_forget tools over the memorylake CLI, a session status line, and guided setup/diagnostic skills, sharing one ~/.memorylake identity and memory set with the Claude Code and Codex plugins.
Install
# from npm (prebuilt)
dsh plugin --profile web add @memorylake/dsh-plugin
# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)
dsh plugin --profile web add github:memorylake-ai/memorylake-harness#path:/dsh-plugin
Any plugin you install runs third-party code with your own permissions — it can read your files, use your credentials, and reach the network, and tool approvals don’t sandbox it. GitHub-sourced plugins also run build scripts at install time — pnpm blocks those until you allow them, so an install can stop with ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED or ERR_PNPM_IGNORED_BUILDS; dsh prints the exact key to add under allowBuilds in your profile’s pnpm-workspace.yaml, and the install works on the next run. Allowing a build is a trust decision: only install sources you trust, and pin a commit (github:owner/repo#sha).
README
MemoryLake for DeepSeek Harness (dsh): persistent, cross-session, cross-project, cross-device memory.
dsh ships no native memory capability, so this plugin is not a bridge to one — it IS the harness's memory layer. It contributes:
- Three tools —
memory_search,memory_remember,memory_forget— backed by thememorylakeCLI (never by direct HTTP, never through a shell). - A prompt section owning the policy: when to remember, how to phrase recall queries, how to read results, and that a failed search is never an empty one.
- A one-line status context reporting connectivity — most importantly when the backend is UNREACHABLE, because a silently unavailable memory backend is indistinguishable from "you never told me that".
- Two user-invocable skills — type
/memorylake-initfor the guided setup wizard (CLI download with mandatory checksum verification, login, shared config) and/memorylake-statusfor the end-to-end health check. The model cannot trigger either.
Install
dsh plugin --profile web add @memorylake/dsh-plugin
dsh --profile web --dump-config # shows the "@memorylake/dsh-plugin" layer
dsh web
web is dsh's built-in Web UI profile (auto-initialized on first use); any
other profile name works the same way — the plugin composes with whatever
surface the profile mounts.
The package publishes with built lib/, so no build allowance is needed. A
github: install also works — a self-contained prepare script builds from
source — but pnpm ≥10 will ask you to allowlist the build; prefer the
registry install.
Zero-config on a machine that already has MemoryLake
Identity and switches live in the shared ~/.memorylake/ tree, not in
this plugin:
~/.memorylake/credentials.toml— the CLI's login state~/.memorylake/harness/config.md— workspace, actor, and feature flags<repo>/.claude/memorylake.local.md— optional per-project override, merged key by key over the global file (a one-linesync_on_write: falseoverride keeps the global workspace working)
If the Claude Code or Codex integration already wrote these, a dsh session
picks them up with zero additional steps: status line, tools, recall — all
live. Config files are re-read on every call, so /memorylake-init finishing
mid-session takes effect on the very next message, no restart.
When nothing is configured, the plugin is completely silent: no network
requests, no prompt injection. Only an explicitly invoked memory tool answers,
and only to point at /memorylake-init.
Shared config keys (config.md / memorylake.local.md frontmatter)
| Key | Default | Meaning |
|---|---|---|
workspace |
— | MemoryLake workspace id. The only required key; absent means the plugin stays silent |
actor |
— | Actor id facts are attributed to; required for writes |
enabled |
true |
false switches the plugin off entirely |
sync_on_write |
true |
false makes memory read-only (the canonical per-project override) |
status_line |
true |
false suppresses the session status line |
Keys consumed by the other harnesses (remind_on_read, sync_deny,
projects, project_custom_id) are parsed and preserved but not consumed by
this plugin's v1.
Deployment knobs (cordis config)
Only operational tuning lives in the bundle's rows; override by id in your
profile's cordis.patch.yml (a patch replaces the row's whole config).
Row memorylake (@memorylake/dsh-plugin/service):
| Key | Default | Meaning |
|---|---|---|
binaryPath |
— | Absolute path of the memorylake binary, overriding resolution (PATH, then ~/.memorylake/bin/memorylake) |
timeoutMs |
30000 |
Hard deadline per CLI invocation |
killGraceMs |
2000 |
SIGTERM→SIGKILL grace on timeout/cancel |
maxOutputBytes |
1000000 |
In-memory cap per collected CLI stream |
Row memorylake-tools (@memorylake/dsh-plugin/tools):
| Key | Default | Meaning |
|---|---|---|
topKMax |
10 |
Upper bound for the model's top_k |
statusTtlSeconds |
600 |
Status-line refresh interval and cache TTL |
Behavior notes
- Authentication is CLI login state. The dsh subprocess seam scrubs
credential-shaped environment names from children, so an ambient
MEMORYLAKE_API_KEYis never forwarded — by design, and matching the CLI's own "env vars alone are not a session" rule. Log in once withmemorylake auth login(the init skill walks through it). - Payload before exit code. The CLI prints its full JSON payload and then
encodes the business outcome in the exit code (
fact deleteexits non-zero when ids were not found). The plugin parses first and classifies second. - Failure is not emptiness. Unavailable backends produce an explicit
noticein the tool value and a loud status line, instructing the model to attribute empty results to the connection rather than to missing memory. - Scores are ordering-only. Relevance scores sort results and are then discarded; they never reach the model (they are weakly calibrated, and a model shown a number treats it as authority).
- No auto-recall, no session memory digest. Both were evaluated and rejected in the Claude Code integration: fixed token cost on sessions that never touch memory, no behavioral gain. The status line reports connectivity only.
v2 roadmap (deliberately not in v1)
- Session→conversation cook: append dsh session transcripts as MemoryLake conversations and let the backend distill them into memories — dsh's "model-visible ⟺ logged" invariant makes the transcript complete, which no other harness guarantees. Privacy defaults off.
- Document search: Library upload + project import, and passing
--projectson search (without it the server returns zero document hits — facts are unaffected, which is why v1 is facts-only). - Project identity: the explicit-custom-id → normalized-git-remote → physical-path rule shared with the other harnesses.
- Session-start facts digest: a small, config-gated summary — dsh has no local MEMORY.md, so unlike the other harnesses this may carry real value, but it must first justify its token cost.
- Upstreaming as an in-tree
packages/memorylake/capability seam.
Development
pnpm install
pnpm test # vitest: unit + integration + real-Loader composition
pnpm build # tsc → lib/
Tests run against a mock memorylake binary and an isolated data tree; no
network, no API key, and no touching your real ~/.memorylake.
Links
More in this category
vectorize-io/hindsight#coding-agents★ 60916
Hindsight, agent memory that learns: long-term project memory with auto recall and retain, knowledge pages, deep reflection, and per-repo memory banks.
volcengine/OpenViking#examples/dsh-memory-plugin★ 42209
OpenViking memory and context bundle for DeepSeek Harness: pre-step auto-recall and profile injection, session capture, `viking://` URI guarding, and recall/write memory tools backed by an OpenViking server.
MemTensor/MemOS#memos-local-plugin★ 12392
Local-first memory plugin for DeepSeek Harness: layered L1/L2/L3 memory with automatic capture, manual memos_* retrieval tools, and a built-in memory viewer.
agentscope-ai/ReMe#dsh★ 3799
Connects DeepSeek Harness to ReMe's local-first, self-evolving personal knowledge base: automatically captures completed main-agent conversations as user-owned Markdown memory, searches conversations and source material through reme_search with BM25, optional embeddings, and wikilink expansion, and schedules daily memory consolidation.
zilliztech/memsearch#MemSearch★ 2873
Shared Markdown memory for DSH and other coding agents, with automatic capture, pre-step context injection, searchable recall, and memory-to-skill self-evolution through a review panel.
vshulcz/deja-vu#extensions/dsh★ 1544
Cross-session memory and context recovery across forty-five other coding agents (45+) on this machine, reading session files they already wrote before install (Claude Code, Codex, Cursor, Windsurf, Trae, Antigravity, VS Code Copilot Chat, opencode, OpenClaw, Hermes, Kimi, Qoder, Cline, Zed, Magpie and more): six tools (deja_recall, deja_session, deja_blame, deja_fix, deja_how, deja_remember), a /deja command, and optional automatic recall injected into runtime context. Local BM25 CLI/MCP index, no LLM, no embeddings, no network (dsh plugin --profile web add dsh-deja).
Community comments
Comments are public GitHub Discussions. Loading them connects to GitHub and Giscus; a GitHub account is required to post.