DeepSeek Harness Plugin

Aliuyanfeng/dsh-soul

Stars ★ 4 Downloads (30d) 1,533 Category UI Enhancements Added 2026-09-01 npm dsh-soul

Personalization for the agent: a Web UI panel (about-you, reply style & tone, traits for headings/lists and emoji, output language, custom instructions) and `/soul` commands, with nickname/occupation/bio/style/traits/language compiled into a system prompt and re-injected into active sessions. Exposes `soulConfig` for other plugins and a `set_persona` tool the agent can call.

Install

# from npm (prebuilt)

dsh plugin --profile web add dsh-soul

# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)

dsh plugin --profile web add github:Aliuyanfeng/dsh-soul

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

简体中文 | English

dsh-soul

A personalization plugin for DeepSeek Harness (DSH). Configure your agent's nickname, reply style, tone, and custom instructions.

Features

  • Personalization settings page in the Web UI
  • Localized settings UI (English/Chinese, follows the interface language), dirty tracking (save disabled when unchanged), save-result toasts, and a read-only "active prompt" viewer
  • Enable or disable personalization
  • "About you": set your nickname, occupation and bio so replies fit your background
  • Combined style & tone option: professional, casual, humorous, roast, efficient
  • Trait fine-tuning (layered on top of style & tone):
    • Headings & lists: default, more (clear formatting with headings and lists), less (more paragraph text)
    • Emoji: default, more (frequent emoji usage), less (minimal emoji usage)
  • Output language (agent reply language + /soul command output language): Chinese or English
  • The compiled system prompt follows the output language (English descriptions when language=en)
  • Custom instructions
  • Agent-callable tool set_persona to let the model adjust persona during a conversation
  • Named personas: save the current config under a name and switch with one click (save / use / list / delete, in both the Web UI and slash commands)
  • set_persona confirmation mode (requireToolConfirmation): agent persona changes take effect only after /soul confirm
  • Composer light trail: while the agent is replying, a light trail loops around the composer border (default color #679EFE)
    • Color: preset swatches, a color picker, or a hex input (e.g. #679EFE)
    • Flow speed: slow / normal / fast (default slow, 4.8s / 3.6s / 2.4s); trail thickness: thin / normal / thick (default thin, 1.5 / 2.5 / 4 px)
    • The trail advances at constant speed along the border and fades into a tail; it sits exactly on the composer border, never producing a double line
    • The settings page shows a live preview that follows color / speed / thickness; automatically disabled under "reduce motion"
  • /soul set key=value field updates
  • Configuration persisted to disk
  • Input validation: field whitelist, types, length limits (nickname/occupation 50, bio 500, custom instructions 2000 chars), enum and hex-color checks; invalid or oversized fields reject the whole write
  • Configuration synced to all active agents after every update
  • Change detection: the prompt is refreshed and sessions injected only when a behavior-affecting field actually changed — appearance-only config (composer light trail) is persisted without injecting anything

Installation

dsh plugin --profile web add dsh-soul
dsh plugin --profile web update dsh-soul

The plugin is registered via cordis.patch.yml:

- insert:
    - id: soul
      name: dsh-soul

Compatibility

The plugin ships no DSH runtime packages; the host provides them all. DSH validates peerDependencies before loading, comparing against the DSH runtime version (the version of @deepseek-ai/dsh-app-boot), not the individual packages' versions:

Package Range
@deepseek-ai/dsh-llm >=0.1.1-rc.2 <0.3.0-0
@deepseek-ai/dsh-tools >=0.1.0-rc.6 <0.3.0-0
@deepseek-ai/cordis ^4.0.1 || ^4.0.5-alpha.1

So DSH 0.1.x and 0.2.x are supported, prereleases included. Run npm run verify:compat to check the declaration against your environment.

If DSH reports "dsh-soul@x.y.z is incompatible with DSH a.b.c", the plugin predates that DSH version — updating it is enough:

dsh plugin --profile web update dsh-soul

Screenshots

Settings page (About you + Traits)

Settings page (upper part): About you & start of Traits

Settings page (Traits + Output language + Custom instructions)

Settings page (lower part): Traits, Output language & Custom instructions

/soul command prompt

`/soul` command autocomplete hint and input box

/soul command output (set nickname, show, enable, disable, reset)

Sample outputs of multiple `/soul` commands

Usage

After starting DSH, open the Personalization section on the settings page, edit the configuration and click Save Settings.

Slash commands are also available:

/soul show        Show current configuration (confirmation mode & persona count)
/soul set k=v     Change config fields (e.g. /soul set style=humorous language=en; trail: trailColor=#679EFE trailSpeed=fast trailWidth=thick)
/soul save <name> Save the current config as a persona
/soul use <name>  Apply a persona
/soul list        List personas (✔ marks the active match)
/soul del <name>  Delete a persona (delete / rm aliases)
/soul confirm     Apply the pending persona proposal (confirmation mode)
/soul reject      Discard the pending persona proposal
/soul reset       Reset configuration (keeps the persona library)
/soul enable      Enable personalization
/soul disable     Disable personalization
/soul Bob         Set nickname

Once saved, the configuration is synced to all active agents and takes effect on the next request in the current session; no-op saves inject nothing.

The agent can also use the set_persona tool to adjust your persona (nickname, style & tone, traits, reply language, custom instructions). The model only invokes this tool when you explicitly ask to change how it addresses or responds to you. With Require confirmation for persona changes (requireToolConfirmation) enabled, tool changes come back as a pending proposal and take effect only after /soul confirm (or are discarded by /soul reject).

Configuration File

The configuration is stored in the DSH user data directory:

soul-config.json

Example:

{
  "enabled": true,
  "nickname": "Bob",
  "occupation": "Software Engineer",
  "bio": "Interested in programming and technology",
  "style": "professional",
  "language": "en",
  "customInstructions": "Be concise and lead with the conclusion.",
  "requireToolConfirmation": false,
  "trailEnabled": true,
  "trailColor": "#679EFE",
  "trailSpeed": "slow",
  "trailWidth": "thin"
}

Personas are stored in the same file under the personas field: name → persona field snapshot (nickname / occupation / bio / style / traits / language / custom instructions) + updatedAt. Persona library changes never touch the active config; a persona is applied to the config (and synced to sessions) only when used.

Composer light trail fields: trailEnabled (on/off, default true), trailColor (6-digit hex, stored uppercase, default #679EFE), trailSpeed (slow / normal / fast, default slow), trailWidth (thin / normal / thick, default thin). These are appearance-only: they are persisted but never enter the system prompt and never trigger a session injection.

Length limits: nickname / occupation 50 chars, bio 500 chars, custom instructions 2000 chars; the color must be #rrggbb. Unknown fields are dropped; invalid or oversized fields reject the whole write (HTTP returns 400 with per-field error details).

How It Works

The plugin compiles the nickname, style, tone and custom instructions into a system prompt via compilePrompt() and registers it with DSH:

spCtx.systemPrompt.section({
  name: 'soul:persona',
  order: 0,
  text: () => compilePrompt(configCache || DEFAULT_CONFIG)
})

After each update, the plugin iterates over all active agents and calls agent.inject() with a standard UserMessage:

agent.inject(createUserMessage({
  content: [{ type: 'text', text: prompt }],
  source: {
    kind: 'plugin',
    plugin: 'dsh-soul',
    form: 'snapshot',
    sections: [{ name: 'soul:persona', text: prompt }]
  }
}))

agent.inject() places the latest configuration into the agent's pending context so it takes effect on the next request. It does not trigger a new request and does not modify message history.

License

MIT License

Content from the project README on GitHub ↗

Links

More in this category

View the whole category →

Community comments

Comments are public GitHub Discussions. Loading them connects to GitHub and Giscus; a GitHub account is required to post.