Context Window = RAM, Local Wiki = Disk — long-term memory for DeepSeek Harness, powered by your local Markdown vault.
TypeScript port of llmwiki (Python: llmwiki-harness on PyPI), packaged as a native dsh plugin.
| Mechanism | dsh extension point |
|---|---|
| Inject relevant wiki knowledge into the same turn's model request | session/event (agent/inbox/spliced, pre-assembly live event) → ctx.systemPrompt.context() |
| Teach the model about memory | ctx.systemPrompt.section() |
memory_search — model recalls prior sessions / curated notes |
ctx.tools.register() |
memory_save — model persists durable insights |
ctx.tools.register() |
Auto-capture every turn to chronicle/daily/YYYY-MM-DD.md |
session/event (turn/end) |
Retrieval: keyword + wikilink graph + temporal strategies fused with RRF (Reciprocal Rank Fusion), assembled under a token budget, with an LRU + TTL cache. Zero runtime dependencies beyond Node.js.
my-vault/
├── raw/ # Layer 1: session dumps
├── chronicle/daily/ # Layer 2: auto-captured daily logs
├── entities/ # Layer 3: compiled knowledge
├── concepts/
├── comparisons/
├── projects/
└── queries/
Open it with Obsidian, curate Layer-3 notes with [[wikilinks]] — the graph strategy follows them.
Requires Node.js ≥ 22 (same as dsh itself) and a working dsh CLI (npm install -g @deepseek-ai/dsh) with pnpm on PATH.
# from npm
dsh plugin --profile web add dsh-llmwiki
# or from a tarball
dsh plugin --profile web add ./dsh-llmwiki-0.1.1.tgz
# verify the layer, then boot
dsh --profile web --dump-config # shows a "# == dsh-llmwiki" layer
dsh web # logs: [dsh-llmwiki] memory plugin loaded, vault: ...The package declares dsh.bundle, so dsh plugin add activates it automatically — no manual patching needed.
The plugin works zero-config (vault defaults to ~/llmwiki-vault). To override, add a row to your profile's cordis.patch.yml (or a --patch overlay) — note the override restates the row by id without insert:
- id: llmwiki
config:
vaultPath: /path/to/your/vault # Obsidian vault welcome
tokenBudget: 2000
strategies: [keyword, graph, temporal]
daysBack: 7
topK: 5
autoInject: true
autoCapture: trueA patch replaces the row's entire config, so restate every key you want to keep.
| Key | Default | Meaning |
|---|---|---|
vaultPath |
~/llmwiki-vault |
Markdown vault path; structure created if missing |
tokenBudget |
2000 |
Max tokens of injected wiki context |
strategies |
[keyword, graph, temporal] |
Enabled recall strategies |
daysBack |
7 |
Temporal look-back window |
topK |
5 |
Results per retrieval |
priority |
relevance |
Assembly priority: relevance / recency / diversity / structured |
cacheTtl |
300 |
Cache TTL seconds |
autoInject |
true |
Inject wiki context on each user message |
autoCapture |
true |
Append each turn to the daily chronicle |
Python (llmwiki) |
TypeScript (dsh-llmwiki) |
|---|---|
core/retriever.py |
src/retriever.ts |
core/assembler.py |
src/assembler.ts |
core/cache.py |
src/cache.ts |
vault/capture.py |
src/capture.ts |
search/python_engine.py |
merged into retriever.ts (keeps the package zero-dep) |
OpenClawMemoryHook adapter |
the dsh plugin itself (src/index.ts) |
Not yet ported: ripgrep / SQLite FTS engines (the pure-JS engine keeps installs dependency-free — contributions welcome), the LLM-driven curate pipeline (run the Python CLI alongside for now).
MIT