dsh-plugin
DayuanJiang/next-ai-draw-iodsh 的 draw.io 绘图插件:通过 next-ai-drawio MCP 服务器作图,点回复里的链接在右侧栏打开实时预览,可以手动修改图,AI 的每次修改都是可以恢复的版本。需 Node.js 18+,首次使用由 npx 下载 MCP 服务器。
跨平台 Web UI 启动器:提供 webui_start/stop/status/open 模型工具、/webui start|stop|status|open 斜杠命令、设置页启动卡片,以及可选的桌面快捷方式——隐藏控制台启动 Web UI,完全就绪后自动打开浏览器,默认使用 dsh 官方图标。
English | 中文
Start, stop, check and open the DeepSeek Harness Web UI from inside the harness — cross-platform (Windows / macOS / Linux), no desktop scripts needed.
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 .
webui_start, webui_stop, webui_status, webui_open: start the Web UI (spawning dsh --profile web in the background), wait until it answers HTTP 200, report or stop it, open the default browser./webui start|stop|status|open.exports["./client"]), driving the same /webui/* JSON endpoints..lnk on Windows, .desktop on Linux, .command on macOS) that starts the Web UI and opens the browser once ready. Headless hosts (no Desktop, no DISPLAY) skip creation silently; disable with desktopShortcut: false.assets/; .ico on Windows, .png on Linux), copied into the persistent state directory so a reinstall never orphans it..ico on Windows, .png on Linux) and the existing shortcut's icon is updated immediately. An explicit shortcutIconPath overrides the default.| Option | Default | Meaning |
|---|---|---|
port | 3080 | Web UI port. |
host | 127.0.0.1 | Loopback host dsh web binds. |
cliBin | "" | Explicit dsh CLI script; empty reuses the running CLI. |
startupTimeoutMs | 120000 | How long start waits for the surface to answer HTTP 200. |
openBrowserOnStart | true | Open the default browser once the Web UI is ready. |
desktopShortcut | true | Create the desktop launcher shortcut on the first plugin start. |
shortcutName | "DeepSeek Harness Web UI" | Display name of the desktop shortcut. |
shortcutIconPath | "" | Explicit icon image; empty uses the bundled dsh icon. |
webui_stop kills the tree this plugin spawned, and also an adopted server whose PID the launcher (or an earlier instance) recorded — only when that PID is the one currently listening, and only for the process hosting this plugin, with the same node.exe identity guard before killing. A foreign server without a PID record is never touched.idle → starting → running → stopping, single-flight serialized: concurrent start/stop calls never interleave.ctx.effect dispose).node.exe via tasklist on Windows) so a recycled PID is never touched.process.argv[1]) → the @deepseek-ai/dsh package → explicit cliBin; resolution failure throws an actionable error.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.
Loopback-only by default, no elevation, no external network. The plugin kills only the process tree it spawned — or a PID-recorded launcher server it hosts — after verifying the PID still belongs to that process.
MIT