一键重启宿主或刷新页面,改完插件立刻生效
30/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/19 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add 7gzgn/dsh-restart-dock该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:待复验
是什么
dsh 原生插件 · ui
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 13 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 11 处,展示前 11 条)
- 读取本地文件lib/index.js:44
if (!existsSync(file)) return undefined; - 读取本地文件lib/index.js:45
return JSON.parse(readFileSync(file, 'utf8')); - 写入本地文件lib/index.js:53
mkdirSync(dirname(file), { recursive: true }); - 写入本地文件lib/index.js:54
writeFileSync(file, JSON.stringify(value, null, 2), 'utf8'); - 写入本地文件lib/index.js:146
try { mkdirSync(info.stateDir, { recursive: true }); } catch { } - 执行外部命令固定命令lib/index.js:158
const child = spawn('cmd.exe', ['/c', 'start', '', '/b', 'powershell.exe', ...psArgs], { - 读取本地文件lib/index.js:342
const st = statSync(base.path); - 发起网络请求client.js:528
const res = await fetch(BASE + '/status', { headers: MARK, cache: 'no-store' }); - 发起网络请求client.js:541
const res = await fetch(BASE + '/status', { headers: MARK, cache: 'no-store' }); - 发起网络请求client.js:574
const res = await fetch(BASE + '/restart', { - 发起网络请求client.js:671
const res = await fetch(BASE + '/bundle-ready', { headers: MARK, cache: 'no-store' });
扫描于 2026/10/31(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-client-ui-slots给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
README
由 DeepSeek 最新模型翻译生成dsh-restart-dock · 重启坞
界面上一个小框,两个按钮:
- 重启 —— 停掉 DSH 宿主,再按原来的命令行把它拉起来。改插件、改 client.js、改 profile 配置之后用它。
- 刷新 —— 只重载当前页面,不碰进程。
改完东西总要「关窗口 → 找快捷方式 → 重开」的那条路,变成一次点击。
点重启会先问一句:立即 / 30 秒 / 60 秒 / 2 分钟 / 取消。选延迟就在原地倒计时,随时可以撤回 —— 给自己留一个反悔的窗口。
框可以拖,而且始终贴边:整块按住就能拖走(像页面翻译那个小按钮),松手离哪边近就贴哪边;收起成小圆点之后照样能拖。位置记的是「贴哪条边 + 离边多远」,不是绝对坐标 —— 所以窗口放大、缩小、全屏,它都自动跟着边框走,不会跑到视口外面看不见。
为什么值得单独做
DSH 的插件分两半:宿主半(进程里的 JS)和客户端半(浏览器里的 JS)。
- 客户端半改完,刷新页面就行;
- 宿主半改完,必须重启进程——模块已经加载过,改文件不会换掉那一代代码。
这就是这个插件唯一要解决的问题。它不装功能,只装一个「门把手」。
展开完整文档(README 剩余 1 节)
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.log | helper 的逐步日志(探测到哪个进程、什么时候停、什么时候拉、新 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预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
7gzgn/dsh-restart-dock
一键重启宿主或刷新页面,改完插件立刻生效
相关插件 · UI / 主题
破甲增强版JeffKeeping/dsh-purge-plus
dsh-purge 的非官方分支fork:适配 DeepSeek Harness 0.2.1-rc.2、破甲内核…
★ 387已汉化DeepSeek 客户端
71.9
无代码业务系统平台nocobase/nocobase
NocoBase 是什么
★ 24,798已汉化DSH
71.8
1Panel 服务器面板1Panel-dev/1Panel
全球 250 万+ 自托管用户共同喜爱。
★ 37,327已汉化DSH
71.5
终端编码代理esengine/DeepSeek-Reasonix
· 指南 · ACP · 扩展开发 · 规格 · 官方网站 · Discord · QQ
★ 36,021已汉化DSH
71.2
工作状态行动态ccch1mneyyy/working-activity
作者:chimney@ccch1mneyyy。社区项目,非 DeepSeek 官方项目。
★ 664已汉化DSH
71.2
多模型配置管家farion1231/cc-switch
跨平台桌面一体化助手,支持 Claude Code、Codex、OpenCode、DeepSeek Harness 等工具,唯一官网 ccswitch.io
★ 150,486已汉化DSH
71.1