DSH Plugins Marketplace

DSH Plugins

Plugins

/

dsh-restart-dock

7

dsh-restart-dock

Manifest valid

One-click restart / reload dock for the DSH Web UI

UI (client)hasBundlePatch

dsh-restart-dock · 重启坞

界面上一小框,两个按钮:

  • 重启 —— 停掉 DSH 宿主,再按原来的命令行把它拉起来。改插件、改 client.js、改 profile 配置之后用它。
  • 刷新 —— 只重载当前页面,不碰进程。

改完东西总要"关窗口 → 找快捷方式 → 重开"的那条路,变成一次点击。

点重启会先问一句:立即 / 30 秒 / 60 秒 / 2 分钟 / 取消。选延迟就在原地倒计时,随时可以撤回 —— 给自己留一个反悔的窗口。

框可以拖,而且始终贴边:整块按住就能拖走(像页面翻译那个小按钮),松手离哪边近就贴哪边;收起成小圆点之后照样能拖。位置记的是"贴哪条边 + 离边多远",不是绝对坐标 —— 所以窗口放大、缩小、全屏,它都自动跟着边框走,不会跑到视口外面看不见。

为什么值得单独做

DSH 的插件分两半:宿主半(进程里的 JS)和客户端半(浏览器里的 JS)。

  • 客户端半改完,刷新页面就行;
  • 宿主半改完,必须重启进程——模块已经加载过,改文件不会换掉那一代代码。

这就是这个插件唯一要解决的问题。它不装功能,只装一个"门把手"。

装

# 在 DSH 里让 agent 装本地目录
plugin_manager install_bundle target=D:\path\to\dsh-restart-dock

或从市场装(发布后)。

装完重启一次 DSH,界面右下角会出现小框;之后改插件就能点它了。

两个动作分别做什么

刷新

location.reload()。纯前端,不经过宿主,任何平台都能用。

重启

点一次 → 按钮变成「确认重启?」;4 秒内再点一次才执行(防误触)。

真正的执行体是 lib/relaunch.ps1,由宿主半 spawn 成一个脱离宿主的独立 PowerShell 进程,所以它能在宿主被停掉之后继续活着并把它拉起来。过程:

  1. 锁定目标:从宿主 pid 往上找 DSH 进程,再爬到「同一可执行文件的最顶层」——也就是用户会双击的那个应用(跳过 Chromium 的 --type= 子进程)。找不到就拒绝,绝不按名字猜一个进程去杀。
  2. 等 2 秒(让 HTTP 响应先回到界面,不留半截请求)。
  3. 停整棵进程树(先叶子后根),最多等 20 秒确认真的退出。 杀完还会再清一遍「孤儿」:只清「父进程 pid 在本次清理名单里」的漏网进程。判据不能是"父进程已死"——正常的桌面版主进程,其父进程本来就已经退了,那样会把用户正在用的实例和救援通道一起误杀。这一步是必需的:残留的 web 宿主占着端口时,新实例启动会报 desktop welcome: Web authentication failed,起一次崩一次。
  4. 按目标进程原来的命令行重新拉起它(参数原样保留)。
  5. 写报告到 ~/.dsh/dsh-restart-dock/last.json。

界面那边会自己轮询 /status:先确认宿主真的停过(连不上),再等它回来(又连上)→ 自动刷新页面,不用自己按 F5。

注意:桌面版里重启会关掉窗口,页面本身也跟着没了。自动刷新主要对「浏览器里打开的 DSH」有意义。窗口会自己回来。

安全边界(这部分是刻意的)

重启会打断一切,所以这个入口收得很紧:

边界做法
跨源网页(主防线)要求自定义头 x-dsh-restart-dock: 1 —— 跨源请求带自定义头必先撞 CORS preflight,而本插件不答 preflight,浏览器根本不会把真请求发出来
同一界面判定拒绝浏览器明确标的 Sec-Fetch-Site: cross-site;如果请求带了 Origin,再核对是否同源(127.0.0.1 / localhost / 0.0.0.0 同端口视为同源)
为什么不再强求 Origin实测桌面 app 的 dsh-app:// 页面连 POST 都不带 Origin(也不带 Sec-Fetch-Site)。强求它只会把界面自己的按钮全挡成 403 —— 加固措施必须以实测为准
目标进程显式探测 + exe 必须真实存在;探测失败直接拒绝
响应不带任何凭据,只回 pid / 端口 / 上次重启报告

只读接口:GET /dsh-restart-dock/status 也只对同源开放。

排障

文件内容
~/.dsh/dsh-restart-dock/last.json上一次重启的结果(relaunched / failed / armed / dry-run + 原因)
~/.dsh/dsh-restart-dock/helper.loghelper 的逐步日志(探测到哪个进程、什么时候停、什么时候拉、新 pid)
~/.dsh/dsh-restart-dock/pending.json点击后到 helper 动手之间的排程记录

只想看它会动谁、不动手:

powershell -NoProfile -ExecutionPolicy Bypass `
  -File lib\relaunch.ps1 -CallerPid <宿主pid> -StateDir D:\tmp\rd -DryRun

-DryRun 只探测并写报告,不碰任何进程。也可以 -TargetPid <pid> 显式指定目标(测试用)。

已知限制

  • 只实现了 Windows。非 Windows 平台「重启」返回 501 并提示用「刷新」;UI 和刷新在所有平台都能用。
  • 重启会打断正在跑的任务。插件不做排程、不做"等这一轮说完"——那是 dsh-restart-planner 的活,两者可共存:一个给人点,一个给 agent 自己用。
  • 重启后不会替你续话(刻意不做)。窗口回来就是你原来那一屏,不会自动往对话里发消息 —— 按钮是你亲手按的,回来再冒一句"我继续"很奇怪。想要"重启后自动接着干",用重启插件那条链。
  • 如果宿主是被某个 job object(例如某些终端)托管的,脱离出来的 helper 也可能被一起带走。桌面版从快捷方式启动时不在 job 里,实测正常。
  • lib/relaunch.ps1 必须带 UTF-8 BOM。Windows PowerShell 5.1 读无 BOM 的 UTF-8 文件会按 ANSI 解码,中文注释会把语法搞坏(实测会报一堆"意外标记")。

兼容性

  • DSH >=0.2.1-rc.2 <0.3.0-0(0.2.1-rc.2 真机验证)
  • Windows + Windows PowerShell 5.1 或更高
  • 客户端半没有任何构建步骤:window.__ModuleLoader__.load 形态,和官方插件同构

结构

lib/index.js       宿主半:两个路由 + spawn helper
lib/relaunch.ps1   执行体:探测 → 停 → 拉 → 报告
client.js          客户端半:右下角小框(shell.overlay 座位)
locale/{zh,en}.json  插件列表里的标题与描述
icon.svg           插件图标

License

MIT

Comments

Loading…

Similar plugins

dsh-restart

by zhouchengke2046

Independent one-click restart for DeepSeek Harness web (Settings page). · 独立的 DSH Web 一键重启插件。

Manifest valid

★ 0

MIT

JavaScript

Aug 19, 2026

dsh plugin --profile web add dsh-restart

by BaoBao1996121

One-click, cross-platform restart button for the DSH web GUI. The loopback-only host route relaunches the exact current DSH invocation; the browser half injects the button.

UI & ExperienceDevelopment & InfrastructureTerminal & ClientsManifest valid

★ 0

MIT

JavaScript

Aug 28, 2026

dsh plugin --profile web add dsh-restart-ui

by 1123762794

One-click restart button for the DSH Web UI: a sidebar footer button that restarts the dsh web process with a single click and persists across the restart it triggers.

UI & ExperienceDevelopment & InfrastructureTerminal & ClientsManifest valid

★ 5

MIT

JavaScript

Aug 18, 2026

dsh plugin --profile web add dsh-web-restart

by LnsiAxe

DSH bundle: ensure/rotate the DeepSeek Harness web server (detached via WMI) — load to start it

Manifest valid

★ 0

MIT

JavaScript

Aug 14, 2026

dsh plugin --profile web add @lnsiaxe/dsh-web-restart

by Towzai

DSH 应用内整体重启插件

Manifest valid

★ 0

JavaScript

Aug 16, 2026

dsh plugin --profile web add dsh-restart

by FuriousKinght

A button at the foot of the sidebar that restarts the DSH desktop app and reloads the page when it comes back.

UI & ExperienceManifest valid

★ 0

MIT

JavaScript

Oct 15, 2026

dsh plugin --profile web add dsh-restart-button