Install guide
August 17, 2026 · View on GitHub
How to install dsh-advisor into a dsh profile, verify the install, and
uninstall. The quick version lives in the README.
Prerequisites
- A dsh runtime environment (
$DSH_HOME, default~/.dsh) and a writable target profile (e.g.web); restart the dsh session after installing. - A registry install needs only pnpm on PATH (
dsh pluginis a pnpm forwarder). Building from source (git / local / tarball installs below) additionally needs node (≥ 22) and registry auth for the private@deepseek-ai/*peers —preparerunspnpm buildonly (noDSH_HOMEsource-tree prerequisite for dependency resolution; the peers resolve from the npm registry viaautoInstallPeers+ the~/.npmrcauth token).
1. One-line registry install
dsh plugin --profile web add dsh-advisor # <name> = your profile name
# Pin an exact version for reproducibility:
# dsh plugin --profile web add dsh-advisor@0.1.0
A registry install fetches the published tarball, which ships the built
artifacts (lib/ + cordis.patch.yml) and has no install / postinstall
scripts — no prepare build runs and no build permission is needed. Runtime
dependencies (@deepseek-ai/cordis, @deepseek-ai/schemastery, and the @deepseek-ai/dsh-*
peers) are declared as peerDependencies and resolved by the dsh installation's
flat profile module fallback — no extra install step.
- Version pinning: append
@<version>to pin (e.g.dsh-advisor@0.1.0). Registry packages have no commit pinning; use the local directory install to test un-released changes.
2. Local directory install (development / verification)
pnpm install # build the bundle (prepare self-build)
dsh plugin --profile web add . # <name> = your profile name
dsh plugin add appends the bundle to the profile's dsh.profile.bundles
(the package declares dsh.bundle); the bundle inserts one plugin row —
id: advisor, name: dsh-advisor (see cordis.patch.yml). A local add .
goes through pnpm's link: dependency, for which pnpm does not run
prepare/postinstall — build the bundle with pnpm install (or pnpm build)
before adding. No host patching is involved: the plugin runs entirely from its
plugin config row (see Web Settings exposure).
3. Tarball install
pnpm pack
dsh plugin --profile web add dsh-advisor-0.1.0.tgz
A tarball ships the built artifacts (lib/ + cordis.patch.yml), so no
prepare script runs and no build permission is needed. Runtime dependencies
(@deepseek-ai/cordis, @deepseek-ai/schemastery, and @deepseek-ai/dsh-{session,agent,llm,commands,timeout})
are declared as peerDependencies and resolved by the dsh installation's flat
profile module fallback — no extra install step.
4. dsh-tui profile install
The advisor also installs into the terminal TUI profile (dsh --profile dsh-tui) with the same commands as the web profile:
dsh plugin --profile dsh-tui add dsh-advisor # <name> = your profile name
# Pin an exact version for reproducibility:
# dsh plugin --profile dsh-tui add dsh-advisor@0.1.0
# Local-dir variant (from a built checkout):
dsh plugin --profile dsh-tui add .
The bundle inserts the same - insert: id: advisor row into the dsh-tui
profile's patch layer (~/.dsh/profiles/dsh-tui/cordis.patch.yml). The
advisor settings namespace is shared across profiles via the global
$DSH_HOME/settings.yaml advisor: section (the web Settings card writes
there too). On dsh-tui ≥ v0.8.0 the TUI /settings screen also edits the
same five keys (enabled / provider / model / immuneTurns /
maxDeltaMessages) in its Advisor section — edits are staged and written on
save through the revision-fenced settings.mutate into the same namespace
user layer, re-applying live without a restart. The section ships with the
dsh-tui-settings-sections row in the v0.8.0+ bundle; on older dsh-tui
versions it is a clean no-op and the patch layer / settings.yaml remain the
edit paths. systemPrompt is not a TUI field (single-line input) — edit it
via the web card or $DSH_HOME/settings.yaml. /advisor config is the
readback (read-only, with edit hints naming the /settings screen when the
seam is mounted), and /advisor / on|off|status|config surface in the TUI
/ menu with subcommand completion (requires the dsh-tui-command-trees
row, shipped in the dsh-tui bundle).
Verify:
dsh --profile dsh-tui --dump-config # shows a "# == dsh-advisor" layer with the advisor row
dsh --profile dsh-tui
Uninstall:
dsh plugin --profile dsh-tui remove dsh-advisor
dsh --profile dsh-tui --dump-config # confirm the dsh-advisor layer is gone
5. Web Settings exposure
The dsh web Settings page's "插件配置" (Plugin Configuration) page renders
one card per plugin that registers into the settings.plugin.item card slot.
The Advisor card (namespace key advisor, rendered after the upstream bash / agent-loop /
web-search cards in registration order) reads the provider directory through the dsh host's apiproxy
describe (the exposed llm-* namespaces), but reads and writes the advisor
config EXCLUSIVELY through the official GatewayService RPC channel — it
does not depend on the apiproxy allowlist, which exposes only an allowlist of
namespaces to configuration clients: model-provider namespaces plus product
namespaces (locale / permission / ui-conversation / ui-theme / ui-onboarding /
agent-presets). Upstream dsh has no registration-level opt-in
(exposeToWebClients does not exist in upstream SettingsRegisterOptions —
verified against the pristine 20da39e snapshot), so the advisor namespace is
not on the apiproxy allowlist. The plugin registers AdvisorConfigGateway
(a GatewayService with @Remote('get')/@Remote('set') methods), the
host's typertGateway claims /api/advisor/get + /api/advisor/set (the same
mechanism the dsh goals service uses), and the card calls them via
connection.rpc. The in-process write (ctx.settings.update) carries no
exposed-namespace check, so saving works on any dsh build that ships the
GatewayService channel. No host patching is applied or required.
6. Verify
dsh --profile web --dump-config # shows a "# == dsh-advisor" layer with the advisor row
dsh --profile web
After booting, the web Settings page's "插件配置" page renders the Advisor
card; it reads and writes the advisor namespace live through
/api/advisor/get + /api/advisor/set — saving applies to new sessions
immediately.
7. Uninstall
dsh plugin --profile web remove dsh-advisor
dsh --profile web --dump-config # confirm the dsh-advisor layer is gone
Restart the dsh session to complete the uninstall.