Uses a configurable system-prompt section to request a chosen reasoning language (Simplified Chinese by default), and expands thinking rows by default while preserving rows the user manually collapses.
Install
# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)
dsh plugin --profile web add github:jide315/dsh-reasoning-language
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
Make the DeepSeek Harness agent think in a language you choose — Simplified Chinese by default — and expand its thinking rows so you can actually read the reasoning while it runs.
The problem it solves: the model reasons in English (or another language you don't read), so
the thinking process is an opaque box and you can't tell whether it is on track. This plugin
injects the language requirement into systemPrompt, so the reasoning is written in your
language from the start — and expands the Think rows by default so you can watch it.
What it does
| Capability | Behaviour |
|---|---|
| Thinking language | Injects a systemPrompt section asking the model to reason in a chosen language (Simplified Chinese by default) |
| Protects non-prose | The injected instruction explicitly requires code, identifiers, paths, commands, config keys, errors, logs, URLs and proper nouns to stay verbatim — so "make it Chinese" never degrades the reasoning |
| Answer language unchanged | Only the reasoning is constrained; the final answer still follows the user's language |
| Thinking rows expanded | Think rows open by default, including while streaming. A row you collapse by hand stays collapsed — the plugin never fights your clicks, and turning the setting off only reclaims rows it expanded itself |
| Configurable in the GUI | Settings → Plugins → Thinking language. Changes apply to the next turn with no restart |
| New turns only | Existing history is never rewritten (rewriting stored reasoning means rewriting compacted context — poor risk/reward) |
Install
From GitHub:
dsh plugin --profile web add github:jide315/dsh-reasoning-language
The package is plain JavaScript and commits its runtime files, so GitHub installs do not need a build allowlist. Restart DSH Desktop after installation, then refresh the page.
After the catalog submission is merged, you can also install it from Settings → Plugin market by
searching for reasoning-language.
For local development, run this from the directory containing the checkout:
dsh plugin --profile web add ./dsh-reasoning-language
Local-development gotcha: don't install a local plugin with
file:*.tgz. Measured here: the resultingnode_modules/dsh-reasoning-languagelost itslib/index.jsafter a laterpnpm install, the Harness failed to boot withCannot find module ...\lib\index.js, and the desktop's startup-repair quarantined the plugin.link:is stable and needs no repacking.
If it fails to boot
Run dsh plugin --profile web remove dsh-reasoning-language. If DSH cannot boot, use the desktop's
startup-repair dialog and choose uninstall this plugin; it keeps a recovery backup.
Settings
Settings → Plugins → Thinking language:
- Enabled — turning it off is exactly equivalent to not having the plugin installed.
- Thinking language — defaults to
简体中文. Set it toEnglishto go back to English reasoning; any language name works, the model reads it as natural language. Effective from the next turn (the prompt is assembled per turn); existing history is untouched. - Expand thinking rows by default — on by default. Toggling it applies to the current page immediately (existing thinking rows expand or collapse) and persists across reloads.
Reset to defaults clears the fields you changed (unset) rather than writing the defaults
back, so no redundant "equals the default" entries are left in settings.yaml.
Settings live under the reasoning-language key of $DSH_HOME/settings.yaml:
reasoning-language:
enabled: true
language: 简体中文
expandThinking: true
How it works
- Host half uses only public seams:
ctx.settings.register()for the namespace andctx.systemPrompt.section()for the section. The section'stextis a function re-evaluated on every prompt assembly — that is why a settings change needs no restart. - No DSH source is modified and no built-in component is replaced.
- Browser half: (1) binds the same settings namespace through
ctx.settingsScope.bind()for the settings card; (2) the thinking-row collapsed state is a per-rowuseState(false)inside the built-inReasoningRowwith no global switch, so aMutationObserverplus a fallback poll finds collapsed Think rows and dispatches a real click — which goes through React's event delegation, so the component's state updates too (no "DOM expanded but state still collapsed" desync). - Bookkeeping: only rows the plugin actually opened are recorded, so a row you collapsed by hand stays collapsed, a row you opened by hand is never collapsed by the plugin, and turning the setting off only reclaims rows the plugin expanded.
- The settings schema is a real
schemasteryschema. This matters:settings.describe()callsregistration.schema.toJSON()unconditionally and has no fallback, so a schema that does not satisfy the contract breaks the entire settings panel, not just this card.
Tests
pnpm test # 26 assertions: host logic, settings-card interaction, expander
pnpm run test:integration # 10 assertions: real DSH SettingsProvider / SystemPrompt
The smoke suite stubs the environment. The integration suite requires DSH Desktop, or a
DSH_APP_ROOT pointing to a compatible DSH node_modules; it drives DSH's own
FileSettingsProvider and SystemPrompt to prove describe() does not throw, the schema
serialises, and a written setting reaches the rendered prompt.
Publishing
See PREPUBLISH.md for the full market-submission process, and
node scripts/check-release.mjs for the pre-flight check.
Limitations
- The thinking language is a request to the model, not a hard guarantee: an occasional model
may ignore it. The instruction is placed late and specifically, which works well in practice; if
a model does not comply, phrasing the language the way that model prefers (e.g.
Chinese (中文)) usually helps. - Only newly generated reasoning is affected; history is untouched.
- The expander relies on the built-in thinking row's
data-variant="think"marker. If DSH drops that attribute the expander fails silently (no error, no broken UI) — update the selector.
Compatibility
- Requires
@deepseek-ai/dsh >= 0.1.5-rc.1. - Developed and verified on DSH Desktop 0.9.1 (dsh 0.1.5-rc.2).
- Needs only the
slots/locale/settingsScopeclient services; a missing one degrades rather than crashes.
License
MIT
Links
More in this category
zhu1090093659/dsh-web#packages/dsh-task-board★ 8405
Task board for the dsh web GUI: a sidebar multi-column kanban whose cards run in real DSH agent sessions and can also be scheduled with cron expressions, executed host-side even with the browser closed.
zhu1090093659/dsh-web#packages/dsh-web-all★ 8405
Plugin and skin collection for the DSH Web UI: task board, Git graph, right-side panel, remote mobile UI, pet, live token stats, and a skin center.
ccch1mneyyy/dsh-TUI★ 4088
Claude Code-style full-screen terminal UI: pixel-whale header, live status line, and streaming thought expansion.
MeteorNOX/DeepSeek-Balance-Whale-Widget★ 4076
A fixed-corner whale widget for the DSH web GUI — balance, today's usage and per-turn cost with peak/off-peak pricing, editable balance-alert and daily-budget bubbles, a module-based custom bubble queue with A/B weighted choices and random lines or images, 30+ vendor templates (OpenAI, OpenRouter, Kimi, SiliconFlow, Ark, Zhipu, MiniMax and more) with per-model balance and subscription quota, plus task-end sound, imported audio, custom roles and a resource manager. Local-only, no telemetry.
omdsh-dev/DSH-better-sidebar★ 4009
Full sidebar workbench with file rendering and editing, terminal, Git, and subagents; third-party plugins can register new tabs.
Devin-AXIS/deepseek-design#deepseek-idesign★ 1423
Visual design studio for websites, app prototypes, posters, cards, reports, and magazines, with templates, direct element editing, selection-aware AI draft handoff, and export.
Community comments
Comments are public GitHub Discussions. Loading them connects to GitHub and Giscus; a GitHub account is required to post.