deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
PROJECT TOPICS
PROJECT README
The plugin follows the DSH language setting (Chinese and English in DSH 0.2.0-rc.2), including configuration, status messages and plugin-list metadata. Language-pack locales use the host fallback chain. Switching languages preserves unsaved settings; there is no separate plugin language selector.
memory_* tools treat topic: "core" / "core.md" (case-insensitive, surrounding whitespace ignored) as an omitted topic, reading/writing resident core memory. Other topics keep their existing behavior.topics/core.md files are preserved without automatic merging. Back them up, inspect them with a file reader, merge resident entries into core.md, and rename remaining topic content to another key. New memory_read({ topic: "core" }) calls read resident core.With layered memory enabled, memory_search({ query: "Electron packaging", limit: 5 })
searches topic keys, titles, summaries and full bodies, returning keys and summaries
only. Persona topics override global topics with the same key; missing keys fall
back to global topics, just like memory_read(topic). English matching is case
insensitive; Chinese phrases also use overlapping two-character terms. This is
lexical search, so synonyms without shared text require another query. Search does
not require automatic recall to be enabled.
The configuration page offers these independent, default-off options:
memory.recall: "keyword": from the second human message handled by the live
plugin, add a soul:recall section with possibly relevant keys and summaries.
The first message and internal context/compaction summaries do not trigger it.memory.indexMode: "recall": while keyword recall is enabled, replace the full
injected topic index with a short search hint. The existing index generation,
title/summary bounds, truncation rules and memory_read() index stay unchanged.memory.compactionRecall: true: after successful compaction or pruning, the
next human message restores descriptors for topics read/appended/rewritten in
this session. They remain stable for that turn, and clear on the next human
turn. Failed compaction does not trigger recovery. Recovery tracks at most the
latest 128 topic keys in memory; unloading/restarting the plugin resets state.Recall and recovery never inject topic bodies. They share recallMaxChars
(default 1600, maximum 8000) and the remaining injectMaxChars budget after the
existing memory section; if core/index uses the budget, no extra rows are added.
Each group includes at most recallMaxTopics (default 5, maximum 20).
Dynamic descriptors always preserve literal braces, even with allowTemplates.
memory.inject: false and skipSubagents also suppress soul:recall.
Suggested opt-in configuration in the soul-md row:
memory:
layered: true
recall: keyword
indexMode: recall
compactionRecall: true
recallMaxTopics: 5
recallMaxChars: 1600
injectMaxChars: 24000
Open Plugins → Installed → dsh-soul-md from the homepage sidebar to configure and save this plugin. The page uses the official plugins.bundle.config interface, without a duplicate entry in global Settings. Web and Desktop share the page. This version requires DSH 0.2.0-rc.2 or a later 0.2.x host; existing configuration is retained.
GitHub: Scorp1o117/dsh-soul-md · npm: dsh-soul-md
Part of the DeepSeek Harness Enhancement Suite — Vision · Soul/Persona · Long-term Memory · Plugin Marketplace.
Persona + long-term memory for DeepSeek Harness — zero file management:
In Settings → 人设卡, type a card name and its content, hit save. The plugin manages everything else.
soul:persona section. Multiple cards are supported; pick a default,
and switch per chat from the conversation header (a "人设" select).memory_append / memory_read / memory_rewrite — a persistent memory
file (Agent.md / memory.md style). The active persona card has its own
memory; otherwise the global memory is used. In layered mode, their optional
topic argument reads or writes one on-demand topic.memory_search — search layered topic content and return keys and summaries.soul_read / soul_update — the AI reads and evolves its own persona
card: when it notices a stable trait, preference, or value of its own,
it folds it into the card. It "grows" across sessions instead of
resetting every time.soul:memory prompt section (capped)
so the agent always sees its memories.session choice (chat switcher) > workspace mapping > default card > none. Switching applies from the next turn — no restart.Use the Desktop-installed dsh command (Application → Manage dsh Command), or the app’s Plugins page. Then install into the Desktop profile:
dsh plugin --profile desktop add dsh-soul-md
Restart the Desktop app to load the client bundle. Desktop keeps its profile under $DSH_HOME/profiles/desktop.
If Hub reports Cannot find module '...app.asar/dsh/node_modules/@deepseek-ai/dsh-desktop-host/lib/cli.js',
the Desktop CLI bootstrap failed before loading this plugin. Reinstall a complete
official Desktop distribution, or try the official Plugins page (outside Hub).
Switching this command to the Web profile does not repair the Desktop package.
See issue #14.
The plugin is a plain Cordis row. Mount it in a profile patch
($DSH_HOME/profiles/<name>/cordis.patch.yml):
- insert:
- id: soul-md
name: 'dsh-soul-md' # after: pnpm add dsh-soul-md in the profile
Then restart dsh web and open Settings → 人设卡: type a name + content, save.
soul-md entry of the active Profile patch,
as cards: { name -> markdown } + active + per-session sessions.$DSH_HOME/soul-md/memory/
(global.md + one file per card), created on demand.memory/<card>/core.md is injected
within the configured cap, while memory/<card>/topics/*.md contributes its title and first
body line to an index. memory_read({ topic: "..." }) retrieves a topic's full
text. Existing <card>.md files remain readable and seed core.md on the first
layered append, so enabling the option does not hide old memory.path card (as "默认") and the old memory file on first run.| Field | Default | Meaning |
|---|---|---|
cards |
{} |
Persona cards: name → markdown content (managed from the UI). |
active |
'' |
Default card name; empty disables the persona by default. |
sessions |
{} |
Per-session choice (sessionId → card name / none / ''); written by the chat switcher. |
workspaces |
{} |
Per-workspace choice (workspace path → card name / none / ''); written from the settings page. |
workspaceList |
[] |
Read-only workspace list (path + title), maintained by the host from dsh's workspace registry. |
memory.maxBytes |
1048576 |
memory_append / memory_rewrite refuse to exceed this size. |
memory.inject |
true |
Render the memory as the soul:memory prompt section. |
memory.layered |
false |
Enable progressive disclosure: core plus a topics index. |
memory.recall |
off |
off or keyword; automatic topic discovery from the second human message. |
memory.indexMode |
all |
all or recall; the latter omits the full injected index only when keyword recall is enabled. |
memory.compactionRecall |
false |
Restore consulted topic descriptors for the next human turn after successful compaction/pruning. |
memory.recallMaxTopics |
5 |
Results per recall/recovery group, maximum 20. |
memory.recallMaxChars |
1600 |
Combined recall/recovery cap, maximum 8000; also limited by the remaining memory injection budget. |
memory.injectMaxChars |
8000 |
Cap for injected memory content. Single-file mode retains the beginning and recent tail. Layered mode reserves the topic index first, then retains both ends of core. memory_read also retains both ends when its response exceeds 20,000 characters. |
memory.order |
0.5 |
Prompt section order for the injected memory section. |
allowTemplates |
false |
Keep {{…}} literal in persona cards and memory by default; when enabled, the host interpolates prompt variables and unknown variables fail rendering. |
skipSubagents |
false |
Delegated child sessions (DSH marks them origin: "subagent") skip the soul:persona / soul:memory sections; tool scopes are unchanged. |
| legacy fields | — | path, fallback, order, complete, watch, debounceMs, soulMaxBytes, personas, roster, memory.path… kept so old composition entries and settings still validate; only used for the one-time import. |
skipSubagents is off by default and keeps the v0.7.0 behavior. When enabled,
sessions that DSH created as delegated children (origin: "subagent") no longer receive the soul:persona / soul:memory sections —
a child usually does one small job and does not need to carry the parent's full persona and long-term memory every turn.
It only affects prompt injection: cardNameOf, memoryTarget, and the scope of the three memory_* tools are unchanged,
so a child reads and writes exactly the same card and memory files it would otherwise (nothing silently falls back to global.md).
Compatibility: tested with @deepseek-ai/dsh@0.1.7-rc.1 and 0.1.7-rc.2 (npm next); npm latest is
0.1.5-rc.3. This version uses Profile patch settings and browser configForms.
Older hosts require an older plugin release. Alpha builds remain unknown.
0.1.5-rc.3 Profile.skipSubagents: delegated child sessions (origin: "subagent") no longer receive the soul:persona / soul:memory sections.cardNameOf, memoryTarget, and the memory_* tool scopes are unchanged.memory.inject / memory.layered.0.1.5-rc.3 (next) compatibility; unverified alpha releases remain unknown.memory.layered; existing users keep the single-file behavior.core.md as resident memory and only a title/summary index for
topics/*.md.topic argument to all three memory_* tools for on-demand
topic reads and writes.<card>.md visible as the core fallback and carries it into the
first layered append.0.1.5-rc.2.{{cwd}}, enable
Allow prompt variables in persona and memory (allowTemplates: true) in
settings. Unknown variables still fail rendering in that mode.soul-md settings namespace directly; the plugin
does not modify files in the host installation.0.1.0-rc.7 or newer and are tested
against 0.1.0-rc.7, 0.1.0-rc.8, and 0.1.1-rc.1.0.1.0-rc.6 users must pin dsh-soul-md@0.5.6, the last release
carrying the legacy settings-allowlist compatibility patch.MIT
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: 无有效分类标签。