173787247/dsh-wsl-kit

dsh-wsl-kit

DeepSeek Harness WSL kit (EN/ZH): docs + install.sh + cordis.patch for Windows browser + WSL agent plugins

待分类deepseek-harnesswsl

dsh-wsl-kit

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.

中文说明 → README.zh.md


How the pieces fit

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
BoundaryWho owns it
Windows UIBrowser on :3081 with a one-shot ?token= (bare :3081 is 401; :3080 is WSL-only)
Agentdsh web inside WSL, tools via plugin ctx
Cross-OS Dailypath / open / clipboard / browser / launch / net / fetch (KIT_SET=daily)
Linux local optionalInference, media, sandboxed search, secrets, read-only DevOps — see docs/OPTIONAL_PLUGINS.md; bash scripts/link-linux-plugins.sh
IMdsh-wsl-im outbound WS/Stream/Gateway → ctx.agents. One workspace per IM, one session per chat
Obsidiandsh-wsl-obsidian: WSL agent ↔ Windows NTFS vault + obsidian://
Jevdsh-wsl-jev: System One (jev_ask / check / rank) via OpenRouter or TypeSafe

The bundle package, and why install.sh is still the way in

There 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.

Plugin versions

Three plugins install under a different name than their repository. npm already had dsh-wsl-tray, dsh-wsl-expose and dsh-wsl-workspace taken by other authors' plugins, so these three publish under dsh-wsl-tray-launcher, dsh-wsl-portproxy and dsh-wsl-workspace-check. The repositories are unchanged — only dsh plugin add needs 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.

Daily

PluginVersionSet
dsh-wsl-env0.3.0daily
dsh-wsl-net0.5.2daily
dsh-wsl-fetch0.1.2daily
dsh-wsl-open0.2.0daily
dsh-repeat-stop0.1.2daily
dsh-tool-budget0.1.2daily
dsh-wsl-clipboard0.1.0daily
dsh-wsl-path0.2.0daily
dsh-wsl-browser0.1.0daily
dsh-wsl-launch0.1.0daily

GitHub add-on and optional

PluginVersionSet
dsh-wsl-github0.2.0github
dsh-wsl-cred0.2.0github
dsh-wsl-notify0.1.0github
dsh-wsl-im0.3.8not in install.sh
dsh-wsl-obscura0.1.0not in Daily
dsh-wsl-obsidian0.1.0not in install.sh (optional)
dsh-wsl-jev0.1.0not in install.sh (optional)
dsh-wsl-ollama0.1.0not in install.sh (optional)
dsh-wsl-media0.2.0not in install.sh (optional)
dsh-wsl-search0.2.0not in install.sh (optional)
dsh-wsl-vecmem0.1.0not in install.sh (optional)
dsh-wsl-k8s0.1.0not in install.sh (optional)
dsh-wsl-secret0.2.0not in install.sh (optional)
dsh-wsl-llamacpp0.1.0not in install.sh (optional)
dsh-wsl-vllm0.1.0not in install.sh (optional)
dsh-wsl-struct0.1.0not in install.sh (optional)
dsh-wsl-git0.1.0not in install.sh (optional)
dsh-wsl-tmux0.1.0not in install.sh (optional)
dsh-wsl-compose0.1.0not in install.sh (optional)
dsh-wsl-systemd0.1.0not in install.sh (optional)
dsh-wsl-helm0.1.0not in install.sh (optional)
dsh-wsl-terraform0.1.0not in install.sh (optional)
dsh-wsl-rclone0.1.0not in install.sh (optional)
dsh-wsl-db0.1.0not in install.sh (optional)
dsh-wsl-glab0.1.0not in install.sh (optional)
dsh-wsl-playwright0.1.0not in install.sh (optional)
dsh-wsl-mail0.1.0not in install.sh (optional)
dsh-wsl-cal0.1.0not in install.sh (optional)
dsh-wsl-pkg0.1.0not in install.sh (optional)

Full-set extras

PluginVersionPluginVersion
gpu0.2.2port0.2.2
distro0.2.0workspace0.2.0
picker0.1.0tray0.2.4
expose0.2.2hostsvc0.4.3
clock0.2.0dns0.2.0
mnt0.2.0editor0.1.0
shot0.1.0docker0.2.2
ssh-agent0.2.0encoding0.2.0
wslconfig0.2.0download0.2.0

Shared helper dsh-wsl-common 0.1.0 is a library, not a KIT_SET entry.


Compatibility (2026-09)

PieceStatus
dshVerified 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 FlashOfficial 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 TeamsOpt-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.
PluginsSnapshot: Plugin versions (sibling checkouts 2026-09-16). Floor: scripts/check-plugin-versions.sh. Daily includes dsh-wsl-fetch ≥0.1.1.

⚠️ Breaking changes in dsh 0.2.1-alpha.2 (released 2026-10-09)

These hit things in this kit. Read this before upgrading, not after the UI stops working.

ChangeImpactWhat to do
{{cwd}} is no longer a prompt variableThe 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 deadUse 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 configInstruction directories now come from the process's DSH_HOME or the defaultCheck the profile patch for a dshHome entry under agent-instructions and remove it
Tool display both mode removedOnly native and ptc remainUpdate old configs and API calls
Agent Team messages go straight to the target InboxThe standalone outbox, auto-retry and resend dedup are goneConfig and result fields need migrating
Python PTC now uses the session sandbox policyCustom compositions must provide sandbox and sandboxPolicy servicesAdd them to hand-made compositions
Default SDK profile is now a general AI AgentNo longer a fixed coding AgentCompositions 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.

⚠️ Breaking changes in dsh 0.2.1-alpha.3 and 0.2.1-alpha.4

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.

VersionChangeImpactWhat to do
alpha.4Plugin compatibility is decided by engines.dsh when a plugin declares itA 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 absentKeep pinned @deepseek-ai/* plugins on the same version track as the core: dsh plugin --profile <name> add <pkg>@<version>
alpha.3Credential precedence changed: Web and Desktop prefer saved credentials; headless uses environment and .env and no longer reads saved keysA headless profile that relied on a saved key stops authenticatingGive headless an explicit key through the environment or .env
alpha.3The Azure provider is now named azureProvider configs still using azure-openai-responses stop resolvingRename the provider
alpha.3--from-default-profile now replaces the target custom profile, including its plugins and settingsRunning it against a profile you care about destroys that profile's plugin setBack the profile up first; do not use it to "refresh" a working profile
alpha.3Fixes "some sessions cannot be continued after a restart" and "history compatibility errors when switching to DeepSeek"Both symptoms are fixed upstream from alpha.3If 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.

⚠️ dsh 0.2.1-alpha.5 (released 2026-10-16)

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.

Upgrading, and what keeps the UI reachable

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.shProbes the port on a timer and revives only when it is down; anything already answering is left alone
scripts/dsh-rescue.shLast resort. Assumes neither systemd nor the rest of this kit is intact, falls back to starting dsh directly

Plugin README policy### Plugin README policy

  • This Compatibility section is the suite matrix. Each plugin README has a matching Compatibility table (EN + ZH): minimum dsh ≥0.1.2, pointer here for latest verified, kit set, and notes that cloud Flash / Agent Teams are not owned by WSL plugins.
  • When dsh ships a new line (e.g. 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.
  • API-sensitive plugins (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:

  1. Restart via scripts/restart-dsh-web.sh (starts dsh on :3080 and the Windows relay on :3081)
  2. In Windows open the URL printed by 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).
  3. Open a new session (old sessions keep the old toolset)
  4. Optionally merge cordis.patch.yml into your profile (a later plugin config replaces the whole object — restate every key you still need)
WantCommand
Daily (recommended)KIT_SET=daily bash install.sh
Daily + GitHub App / credentialsKIT_SET=github bash install.sh
Local LLM + network doctorKIT_SET=llm bash install.sh
EverythingKIT_SET=full bash install.sh (or omit KIT_SET — same as before)

From a local clone: KIT_SET=daily bash install.sh

What restart-dsh-web.sh loads

  • NODE_USE_ENV_PROXY=1, OLLAMA_API_KEY default ollama
  • NO_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)
  • Optional: source "$HOME/.dsh/dsh-wsl-github.env" yourself before start when using GitHub App plugins

What you get immediately

PainToolPlugin
Proxy / Node 24 blocks DeepSeek or npmnet_doctordsh-wsl-net
web_fetch TypeError: fetch failed (API works)Install dsh-wsl-fetch ≥0.1.1 + restart-dsh-web.shdsh-wsl-fetch
Open a Linux path from chat on Windows(clickable paths)dsh-wsl-open
Path convert / slow /mnt/cpath_convertdsh-wsl-path
Windows clipboardwsl_clipboarddsh-wsl-clipboard
Open a PR / docs URL in Windowswin_open_urldsh-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.


Install sets (short list)

SetIncludesWho
Dailyenv, net, fetch, open, repeat-stop, tool-budget, clipboard, path, browser, launchMost WSL + Windows-browser users
GitHub dayDaily + github + cred + notifyAlso need PR/Actions status and git push credential hints
LLMenv, net, fetch, hostsvc, docker, dns, clock, gpu, port, expose, tray, open, path, browserLocal Ollama / vLLM / Unsloth + connectivity
FullEverything 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.
Desktopuia, winshot, winctl, wininput — KIT_SET=desktopWant 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.

Optional: GitHub day

GitHub from WSL is credentials + API + browser open + proxy — not one mega-plugin. After KIT_SET=github:

  1. Create the App per dsh-wsl-github (read-only Metadata / PRs / Actions; webhooks off)
  2. Before start: source "$HOME/.dsh/dsh-wsl-github.env"
  3. New session → github_app_hint / github_repo_status; never paste PEM / PAT into chat

Node 24 + Windows proxy

export 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.

  • API works, web_fetch fails → dsh-wsl-fetch (Daily already installs it).
  • Third-party Workers / Cloudflare 403 (1010) via Clash → add a DIRECT rule for that host (plugin cannot override site WAF).

Local OpenAI-compatible backends on Windows: add dsh-wsl-hostsvc, run host_reach, merge examples/local-llm-providers.settings.yaml.


Troubleshooting

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).


Maintaining this kit

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.


Full catalog (reference)

Expand all plugins

Daily (KIT_SET=daily)

PluginRole
dsh-wsl-envInject WSL/Windows facts into the system prompt
dsh-wsl-netnet_doctor
dsh-wsl-fetchProxy-aware web_fetch (undici ProxyAgent)
dsh-wsl-openOpen Linux paths from chat on Windows
[dsh-repeat-stop](https://g