dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
DeepSeek Harness WSL kit (EN/ZH): docs + install.sh + cordis.patch for Windows browser + WSL agent plugins
One line: DeepSeek Harness agent in WSL, chat in a Windows browser — install this kit when paths, proxy, clipboard, and “open that file” must cross the OS boundary.
This is a meta-repo (docs + install script + cordis.patch.yml). It does not ship plugin runtimes. Each plugin repo ships a homepage README.md (often Chinese-first for newer plugins) plus README.en.md / README.zh.md as needed.
The kit is not a runtime. install.sh loads Daily / GitHub / LLM / Full plugins into the dsh web profile. Chat stays on Windows; the agent and tools stay in WSL. A second tier of Linux/local capability plugins (inference, search, media, read-only DevOps, …) is not in install.sh — use link-linux-plugins.sh or dsh plugin add as needed. IM / Obsidian / Jev are likewise off install.sh.
flowchart TB
subgraph win [Windows]
browser["Browser :3081/?token="]
host["Clipboard / Explorer / default browser"]
vault["Obsidian vault (NTFS)"]
localLLM["Ollama / llama.cpp / vLLM"]
end
subgraph wslbox [WSL]
relay["port relay"]
dsh["dsh web :3080"]
subgraph kitPlugins ["install.sh suites · package.json bundle (npm-gated)"]
daily["Daily: env net fetch open clipboard path browser launch"]
guards["repeat-stop + tool-budget"]
more["GitHub / LLM / Full doctors"]
end
subgraph winread [Windows read-only diagnostics · not in install.sh]
wdiag["defender · eventlog · perf · power · registry · service"]
end
revive["dsh-wsl-revive — installs and reports the UI resident"]
subgraph linuxOpt [Optional Linux local · not in install.sh]
infer["ollama · llamacpp · vllm · vecmem"]
media["media · search · secret · struct"]
devops["git · tmux · compose · k8s · helm · terraform · …"]
desk["playwright · mail · cal · pkg · rclone · db · glab"]
end
im["dsh-wsl-im — optional"]
obsidian["dsh-wsl-obsidian — optional"]
jev["dsh-wsl-jev — optional"]
end
api["DeepSeek API"]
chats["Feishu / WeCom / DingTalk / QQ / Slack / Discord / Telegram"]
browser --> relay --> dsh
dsh --> kitPlugins
dsh --> linuxOpt
dsh --> api
linuxOpt --> localLLM
kitPlugins --> host
chats --> im --> dsh
obsidian --> vault
dsh --> obsidian
dsh --> jev
| Boundary | Who owns it |
|---|---|
| Windows UI | Browser on :3081 with a one-shot ?token= (bare :3081 is 401; :3080 is WSL-only) |
| Agent | dsh web inside WSL, tools via plugin ctx |
| Cross-OS Daily | path / open / clipboard / browser / launch / net / fetch (KIT_SET=daily) |
| Linux local optional | Inference, media, sandboxed search, secrets, read-only DevOps — see docs/OPTIONAL_PLUGINS.md; bash scripts/link-linux-plugins.sh |
| IM | dsh-wsl-im outbound WS/Stream/Gateway → ctx.agents. One workspace per IM, one session per chat |
| Obsidian | dsh-wsl-obsidian: WSL agent ↔ Windows NTFS vault + obsidian:// |
| Jev | dsh-wsl-jev: System One (jev_ask / check / rank) via OpenRouter or TypeSafe |
install.sh is still the way inThere is a package.json here that describes the same 31 plugins as one bundle
(dsh.bundle.patch → cordis.patch.yml, which carries their config). It does not install today, and
the reason is worth knowing before you try it:
pnpm add github:173787247/dsh-wsl-kit
→ ERR_PNPM_EXOTIC_SUBDEP: Exotic dependency "dsh-wsl-tray-launcher" (resolved via
git-repository) is not allowed in subdependencies when blockExoticSubdeps is enabled
pnpm refuses a git-resolved dependency inside another git-resolved package. A github: bundle therefore
cannot depend on github: plugins — so the bundle only becomes installable once the plugins are on npm,
at which point its dependencies become ordinary version ranges.
Until then: use install.sh (or dsh plugin add per plugin). The package.json is the
description of the destination, not a second route to it.
Three plugins install under a different name than their repository. npm already had
dsh-wsl-tray,dsh-wsl-exposeanddsh-wsl-workspacetaken by other authors' plugins, so these three publish underdsh-wsl-tray-launcher,dsh-wsl-portproxyanddsh-wsl-workspace-check. The repositories are unchanged — onlydsh plugin addneeds the package name. Everything else on this page links to the repository, which is what you clone or read.
Sibling checkout versions on 2026-09-18. Floors enforced by scripts/check-plugin-versions.sh are the minimum, not this snapshot.
Local dsh line: 0.2.1-alpha.5 (npm, 2026-10-16). npm latest still points at the 0.1.7 line; @next carries 0.2.0. Scripts still assume dsh ≥0.1.2.
| Plugin | Version | Set |
|---|---|---|
| dsh-wsl-env | 0.3.0 | daily |
| dsh-wsl-net | 0.5.2 | daily |
| dsh-wsl-fetch | 0.1.2 | daily |
| dsh-wsl-open | 0.2.0 | daily |
| dsh-repeat-stop | 0.1.2 | daily |
| dsh-tool-budget | 0.1.2 | daily |
| dsh-wsl-clipboard | 0.1.0 | daily |
| dsh-wsl-path | 0.2.0 | daily |
| dsh-wsl-browser | 0.1.0 | daily |
| dsh-wsl-launch | 0.1.0 | daily |
| Plugin | Version | Set |
|---|---|---|
| dsh-wsl-github | 0.2.0 | github |
| dsh-wsl-cred | 0.2.0 | github |
| dsh-wsl-notify | 0.1.0 | github |
| dsh-wsl-im | 0.3.8 | not in install.sh |
| dsh-wsl-obscura | 0.1.0 | not in Daily |
| dsh-wsl-obsidian | 0.1.0 | not in install.sh (optional) |
| dsh-wsl-jev | 0.1.0 | not in install.sh (optional) |
| dsh-wsl-ollama | 0.1.0 | not in install.sh (optional) |
| dsh-wsl-media | 0.2.0 | not in install.sh (optional) |
| dsh-wsl-search | 0.2.0 | not in install.sh (optional) |
| dsh-wsl-vecmem | 0.1.0 | not in install.sh (optional) |
| dsh-wsl-k8s | 0.1.0 | not in install.sh (optional) |
| dsh-wsl-secret | 0.2.0 | not in install.sh (optional) |
| dsh-wsl-llamacpp | 0.1.0 | not in install.sh (optional) |
| dsh-wsl-vllm | 0.1.0 | not in install.sh (optional) |
| dsh-wsl-struct | 0.1.0 | not in install.sh (optional) |
| dsh-wsl-git | 0.1.0 | not in install.sh (optional) |
| dsh-wsl-tmux | 0.1.0 | not in install.sh (optional) |
| dsh-wsl-compose | 0.1.0 | not in install.sh (optional) |
| dsh-wsl-systemd | 0.1.0 | not in install.sh (optional) |
| dsh-wsl-helm | 0.1.0 | not in install.sh (optional) |
| dsh-wsl-terraform | 0.1.0 | not in install.sh (optional) |
| dsh-wsl-rclone | 0.1.0 | not in install.sh (optional) |
| dsh-wsl-db | 0.1.0 | not in install.sh (optional) |
| dsh-wsl-glab | 0.1.0 | not in install.sh (optional) |
| dsh-wsl-playwright | 0.1.0 | not in install.sh (optional) |
| dsh-wsl-mail | 0.1.0 | not in install.sh (optional) |
| dsh-wsl-cal | 0.1.0 | not in install.sh (optional) |
| dsh-wsl-pkg | 0.1.0 | not in install.sh (optional) |
| Plugin | Version | Plugin | Version |
|---|---|---|---|
| gpu | 0.2.2 | port | 0.2.2 |
| distro | 0.2.0 | workspace | 0.2.0 |
| picker | 0.1.0 | tray | 0.2.4 |
| expose | 0.2.2 | hostsvc | 0.4.3 |
| clock | 0.2.0 | dns | 0.2.0 |
| mnt | 0.2.0 | editor | 0.1.0 |
| shot | 0.1.0 | docker | 0.2.2 |
| ssh-agent | 0.2.0 | encoding | 0.2.0 |
| wslconfig | 0.2.0 | download | 0.2.0 |
Shared helper dsh-wsl-common 0.1.0 is a library, not a KIT_SET entry.
| Piece | Status |
|---|---|
| dsh | Verified against 0.2.1-alpha.5 (2026-10-16). ⚠️ The releases before it — alpha.2, alpha.3, alpha.4 — have breaking changes; see the sections below. Kit scripts assume dsh ≥0.1.2 UI launch tokens (?token= on :3081). Upgrading to alpha.2 requires one plugin code change: the {{cwd}} variable in dsh-wsl-env (already fixed). The remaining plugins' lib/ entry points and the offline smoke set pass on alpha.2. |
| DeepSeek V4.1 Flash | Official API model id is deepseek-flash. Legacy deepseek-v4-flash / deepseek-v4-flash-vision-exp temporarily route to V4.1 Flash. Not configured by this kit — set under llm-deepseek / default model in ~/.dsh/settings.yaml. |
| Agent Teams | Opt-in experimental package (@deepseek-ai/dsh-experimental-agent-team-profile, same line as your dsh). Not part of install.sh. Expect longer “Deep diving” turns; use a fresh non-Teams session to smoke-test models. |
| Plugins | Snapshot: Plugin versions (sibling checkouts 2026-09-16). Floor: scripts/check-plugin-versions.sh. Daily includes dsh-wsl-fetch ≥0.1.1. |
These hit things in this kit. Read this before upgrading, not after the UI stops working.
| Change | Impact | What to do |
|---|---|---|
{{cwd}} is no longer a prompt variable | The official dsh-system-prompt README states the loop does not register it. Leaving it in a prompt makes assembly fail — every message reports unknown prompt variable and the UI looks dead | Use plain prose. The working directory now comes from runtime context and the new working_directory tool. dsh-wsl-env is fixed (a674c70) |
agent-instructions drops per-line dshHome config | Instruction directories now come from the process's DSH_HOME or the default | Check the profile patch for a dshHome entry under agent-instructions and remove it |
Tool display both mode removed | Only native and ptc remain | Update old configs and API calls |
| Agent Team messages go straight to the target Inbox | The standalone outbox, auto-retry and resend dedup are gone | Config and result fields need migrating |
| Python PTC now uses the session sandbox policy | Custom compositions must provide sandbox and sandboxPolicy services | Add them to hand-made compositions |
| Default SDK profile is now a general AI Agent | No longer a fixed coding Agent | Compositions relying on the old default identity must state it |
What you gain: the working_directory tool, shared AGENTS.md from an agents directory (DSH_AGENTS_HOME), an experimental Git Worktrees plugin, session state-record APIs, Web binding to a chosen address with native HTTPS, pi-ai 1.0.2.
One habit: read the release notes' "Other changes" section before upgrading — every breaking change lives there. We upgraded first and read afterwards, and paid for it with a night of debugging.
Read from the upstream release notes on 2026-10-16, after upgrading to alpha.4 without reading them first. The one change that mattered was a single line under Other changes.
| Version | Change | Impact | What to do |
|---|---|---|---|
| alpha.4 | Plugin compatibility is decided by engines.dsh when a plugin declares it | A plugin declaring a range narrower than the core is disabled outright: disabling profile plugin row "<id>": Plugin <pkg>@<old> is incompatible with dsh <new>. It is not an error you see — the tools and panels are simply absent | Keep pinned @deepseek-ai/* plugins on the same version track as the core: dsh plugin --profile <name> add <pkg>@<version> |
| alpha.3 | Credential precedence changed: Web and Desktop prefer saved credentials; headless uses environment and .env and no longer reads saved keys | A headless profile that relied on a saved key stops authenticating | Give headless an explicit key through the environment or .env |
| alpha.3 | The Azure provider is now named azure | Provider configs still using azure-openai-responses stop resolving | Rename the provider |
| alpha.3 | --from-default-profile now replaces the target custom profile, including its plugins and settings | Running it against a profile you care about destroys that profile's plugin set | Back the profile up first; do not use it to "refresh" a working profile |
| alpha.3 | Fixes "some sessions cannot be continued after a restart" and "history compatibility errors when switching to DeepSeek" | Both symptoms are fixed upstream from alpha.3 | If they still happen on alpha.3 or later, the cause is local rather than the version |
How to check the second row for yourself
grep 'disabling profile plugin row' /tmp/dsh-web.log # a plugin was disabled at startup
The log is appended across restarts, so count the lines before upgrading and compare
afterwards — a bare grep -c reports every past start as well.
No breaking change. Its "Other changes" adds one slot,
conversation.input.model.label, for plugins that relabel the composer's model
selector. Nothing in this kit is affected.
Recorded so the next upgrade does not have to re-derive it — and because the two releases before it did break things.
Use scripts/upgrade-dsh-full.sh; it reads the target release's notes before it
installs anything, and docs/UPGRADE.zh.md describes the layers and the traps.
Two scripts exist so a broken UI does not need a person at the keyboard:
scripts/dsh-web-watchdog.sh | Probes the port on a timer and revives only when it is down; anything already answering is left alone |
scripts/dsh-rescue.sh | Last resort. Assumes neither systemd nor the rest of this kit is intact, falls back to starting dsh directly |
0.1.5 GA or 0.1.6), update this kit table first, then refresh plugin “currently …” lines (or re-run the suite doc sync). Do not invent per-plugin “verified” dates without a smoke pass.net, fetch, port, expose, tray, hostsvc) carry an extra Scope paragraph; thinner Daily tools keep the shared table only.No kit code change is required solely for V4.1 Flash — update model ids in settings if you still default to retired names.
Prereq: dsh works inside WSL (profile usually web). Prefer 0.2.1-alpha.5 or newer from the same train.
curl -fsSL https://raw.githubusercontent.com/173787247/dsh-wsl-kit/master/install.sh \
| KIT_SET=daily bash
Then:
scripts/restart-dsh-web.sh (starts dsh on :3080 and the Windows relay on :3081)restart-dsh-web.sh (dsh ≥0.1.2 includes ?token=; bare :3081 is 401. Not :3080). Token is also written to /tmp/dsh-ui-url (WSL).cordis.patch.yml into your profile (a later plugin config replaces the whole object — restate every key you still need)| Want | Command |
|---|---|
| Daily (recommended) | KIT_SET=daily bash install.sh |
| Daily + GitHub App / credentials | KIT_SET=github bash install.sh |
| Local LLM + network doctor | KIT_SET=llm bash install.sh |
| Everything | KIT_SET=full bash install.sh (or omit KIT_SET — same as before) |
From a local clone: KIT_SET=daily bash install.sh
restart-dsh-web.sh loadsNODE_USE_ENV_PROXY=1, OLLAMA_API_KEY default ollamaNO_PROXY=127.0.0.1,localhost only (do not inherit Clash RFC1918 NO_PROXY globs — they make Node skip the proxy and timeout on api.deepseek.com)source "$HOME/.dsh/dsh-wsl-github.env" yourself before start when using GitHub App plugins| Pain | Tool | Plugin |
|---|---|---|
| Proxy / Node 24 blocks DeepSeek or npm | net_doctor | dsh-wsl-net |
web_fetch TypeError: fetch failed (API works) | Install dsh-wsl-fetch ≥0.1.1 + restart-dsh-web.sh | dsh-wsl-fetch |
| Open a Linux path from chat on Windows | (clickable paths) | dsh-wsl-open |
Path convert / slow /mnt/c | path_convert | dsh-wsl-path |
| Windows clipboard | wsl_clipboard | dsh-wsl-clipboard |
| Open a PR / docs URL in Windows | win_open_url | dsh-wsl-browser |
| Agent forgets it is in WSL | (system prompt inject) | dsh-wsl-env |
Daily = table above + win_launch + dsh-repeat-stop + dsh-tool-budget + dsh-wsl-fetch.
Smoke: in a new session ask “run net_doctor” and “copy this path to the Windows clipboard”. Prefer model deepseek-flash for cloud; keep Agent Teams off for first smoke.
| Set | Includes | Who |
|---|---|---|
| Daily | env, net, fetch, open, repeat-stop, tool-budget, clipboard, path, browser, launch | Most WSL + Windows-browser users |
| GitHub day | Daily + github + cred + notify | Also need PR/Actions status and git push credential hints |
| LLM | env, net, fetch, hostsvc, docker, dns, clock, gpu, port, expose, tray, open, path, browser | Local Ollama / vLLM / Unsloth + connectivity |
| Full | Everything in install.sh — Daily + GitHub extras + doctors, plus read-only Windows host observation (perf, service, eventlog, registry, defender, power) | GPU/Docker/clock doctors, tray, portproxy, etc. |
| Desktop | uia, winshot, winctl, wininput — KIT_SET=desktop | Want the agent to read and drive the Windows desktop |
Do not start with Full — get Daily working, then add plugins for specific pains.
Desktop is a separate set on purpose. dsh-wsl-wininput types and clicks,
dsh-wsl-winctl moves and closes windows; dsh-wsl-uia and dsh-wsl-winshot
are the observation half of the same pair. That is a different power level from
reading counters and an event log, so full never pulls it in.
GitHub from WSL is credentials + API + browser open + proxy — not one mega-plugin. After KIT_SET=github:
source "$HOME/.dsh/dsh-wsl-github.env"github_app_hint / github_repo_status; never paste PEM / PAT into chatexport HTTP_PROXY=http://127.0.0.1:7890 # or Clash mixed port, e.g. 16006
export HTTPS_PROXY=http://127.0.0.1:7890
export NODE_USE_ENV_PROXY=1
# Prefer restart-dsh-web.sh so NO_PROXY stays loopback-only
Still failing → ask the agent to run net_doctor.
web_fetch fails → dsh-wsl-fetch (Daily already installs it).Local OpenAI-compatible backends on Windows: add dsh-wsl-hostsvc, run host_reach, merge examples/local-llm-providers.settings.yaml.
Connectivity, UI token 401, Ollama ctx, and fetch faults: docs/TROUBLESHOOTING.md (中文: TROUBLESHOOTING.zh.md).
Order of play: host_reach → net_doctor → dns_doctor → clock_doctor → workspace/mnt → expose (LAN only).
Which file is generated and which is handwritten, what each of the thirty-two scripts does and when to run it, and the invariants that keep twenty-six plugin copies from drifting: docs/MAINTENANCE.zh.md.
KIT_SET=daily)| Plugin | Role |
|---|---|
| dsh-wsl-env | Inject WSL/Windows facts into the system prompt |
| dsh-wsl-net | net_doctor |
| dsh-wsl-fetch | Proxy-aware web_fetch (undici ProxyAgent) |
| dsh-wsl-open | Open Linux paths from chat on Windows |
| [dsh-repeat-stop](https://g |