Cross-platform Web UI launcher for DeepSeek Harness: webui_start/stop/status/open model tools, a /webui start|stop|status|open slash command, a Settings-page launch card, and an optional desktop shortcut that starts the Web UI hidden and opens the browser once it is fully ready (dsh default icon).
Install
# from a prebuilt release tarball
dsh plugin --profile web add "https://github.com/YV3507/dsh-webui-launcher/releases/download/v0.1.11/dsh-webui-launcher-0.1.11.tgz"
# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)
dsh plugin --profile web add github:YV3507/dsh-webui-launcher
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. Only install sources you trust, and pin a commit (github:owner/repo#sha).
README
English | 中文
A DSH plugin that starts, stops, checks and opens the DeepSeek Harness Web UI from inside the harness — cross-platform (Windows / macOS / Linux), no desktop scripts needed.
Install
dsh plugin --profile web add github:YV3507/dsh-webui-launcher
or from a checkout:
cd dsh-webui-launcher
npm install && npm run build
dsh plugin --profile web add .
What it adds
- Model tools
webui_status,webui_start,webui_stop,webui_open— start the Web UI (spawningdsh --profile webin the background), wait until it answers HTTP 200, report or stop it, open the default browser. - A
/webui start|stop|status|openslash command. - A "Web UI Launcher" card on the Settings page of the web GUI (browser half,
exports["./client"]), driving the same/webui/*JSON endpoints. - Desktop shortcut: on the first plugin start, a launcher shortcut is created on the desktop (
.lnkon Windows,.desktopon Linux,.commandon macOS) that starts the Web UI and opens the browser once ready. Headless hosts (no Desktop, no DISPLAY) skip creation silently — the plugin never crashes on a server. Disable withdesktopShortcut: false. - dsh default icon: the shortcut uses the official dsh icon by default (the web app favicon rasterized and bundled in the plugin's
assets/;.icoon Windows,.pngon Linux). The icon is copied into the persistent state directory, so a plugin reinstall never orphans it. - Custom shortcut icon: upload any image (PNG/JPEG/BMP/GIF/TIFF) from the Settings card; it is converted automatically (multi-size
.icoon Windows,.pngon Linux) and the existing shortcut's icon is updated immediately. Without a shortcut (headless/disabled), the converted icon is still persisted for a future creation. An explicitshortcutIconPathconfig overrides the default icon. - Plugin config:
port(default 3080),host(127.0.0.1),cliBin("" = reuse the running CLI),startupTimeoutMs(120000),openBrowserOnStart(true),desktopShortcut(true),shortcutName("DeepSeek Harness Web UI"),shortcutIconPath("" = use the bundled dsh default icon; a path overrides it).
Behavior and robustness
- Adopt-or-start: a server already listening on the port is adopted — never restarted, never stopped.
webui_stopkills the process tree this plugin spawned, and also an adopted server whose PID the desktop launcher (or an earlier plugin instance) recorded — only when the recorded PID is the one currently listening, and with the same node.exe identity guard before killing. A foreign server without a PID record is never touched. - Explicit state machine:
idle → starting → running → stopping, with single-flight serialization — concurrentstart/stopcalls never interleave. - Orphan cleanup: when the plugin unloads or hot-reloads, any server it spawned — and any PID-recorded launcher server — is stopped (
ctx.effectdispose). - PID identity guard: before killing, the process is re-checked (alive, still our child, and on Windows still
node.exevia tasklist) so a recycled PID is never touched. - Abort/timeout hygiene: an aborted or timed-out start kills the child it spawned and surfaces the output tail in the error.
- CLI location fallback chain: the running CLI (
process.argv[1]) → the@deepseek-ai/dshpackage → explicitcliBinconfig; resolution failure throws an actionable error.
Development
npm run build # esbuild → lib/index.js (host) + lib/client.js (browser)
npm test # node --test, zero-dependency (mocks the two external packages)
The state-machine failure paths (child death, timeout, abort, sibling adoption, concurrency, dispose) are unit-tested against the built bundle with scripted fake dependencies — no real processes or timers.
Security
Loopback-only by default, no elevation, no external network. The plugin kills only the process tree it spawned, after verifying the PID still belongs to that process.
License
MIT
Links
More in this category
superdesigndev/treg★ 477
Tool catalog for agents: search ~2,600 external endpoints (SEO and SERP, backlinks, social, people and company enrichment, ad libraries, scraping) by the task you want done, read each one's parameters and per-call price, then call it with the credential injected server-side. Ships the skill plus an MCP row that stays disabled until TREG_TOKEN is set.
zhaoolee/notes#dsh-plugin★ 147
Export DSH conversations as Smartisan Notes-style PNGs, or create and update Markdown notes in a configured account-scoped workspace.
taxueseek/argo#dsh-plugin★ 101
Search built for agents: multilingual coverage across web, academic, code, shopping, finance, news, and encyclopedias.
omdsh-dev/dsh-data-agent★ 55
Let the AI connect to databases and write SQL for you.
heartleo/hn-cli#hacker-news★ 50
Hacker News tools for feeds, discussion threads, search, and user profiles.
geml-spec/geml#integrations/dsh-plugin★ 24
Block-addressed document editing: an MCP server exposing geml_get / geml_set / geml_check and friends, so an agent reads or rewrites one addressed block of a Markdown or GEML document instead of the whole file. Ships the GEML authoring skill and a code-graph skill that builds and navigates a project call graph as GEML codemaps.