🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

进程守护看门狗 xiaohj233/dsh-keepalive

DeepSeek Harness
xiaohj23367 天前有提交已提供中文文档扫描:含敏感能力

DSH Web 退出后自动拉起并修复启动故障

29.5/100
综合分
2
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/9/18 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

自动兼容检查有告警:未发布到 npm registry,仅可从源码安装。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add xiaohj233/dsh-keepalive
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么[目录]—
dsh 原生插件 · dev
暂无时间戳·判据 →
装得上吗[实装验证]✓
本站已真实安装成功
非静态推断
L4 · 真实安装等级说明 →
数据截至 2026/09/25·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/04·判据 →
还在维护吗[仓库]—
更新放缓:最近一次提交在 67 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →

可信度证据

安装兼容性检查⚠ 装前注意

未发布到 npm registry,仅可从源码安装

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✗npm 包dsh-keepalive(未发布到 npm,仅可源码安装)
✓Node 引擎要求 ^22.19.0 || >=24.0.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/9/22 05:58:54

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 87 处,展示前 68 条)
  • 读取本地文件
    lib/index.js:58
    return JSON.parse(readFileSync(STATE_FILE, "utf8"));
  • 写入本地文件
    lib/index.js:68
    writeFileSync(tmp, JSON.stringify(merged, null, 2));
  • 写入本地文件
    lib/index.js:69
    renameSync(tmp, STATE_FILE);
  • 读取本地文件
    lib/index.js:99
    return parseKeepaliveConfig(readFileSync(SETTINGS_FILE, "utf8"));
  • 读取本地文件
    lib/index.js:108
    const text = readFileSync(SETTINGS_FILE, "utf8");
  • 写入本地文件
    lib/index.js:111
    writeFileSync(tmp, next);
  • 写入本地文件
    lib/index.js:112
    renameSync(tmp, SETTINGS_FILE);
  • 执行外部命令来自配置/变量
    lib/index.js:143
    const child = spawn(process.execPath, [WATCHDOG, bin], {
  • 执行外部命令来自配置/变量
    lib/index.js:176
    const child = spawn(process.execPath, [RESTARTER, spec], {
  • 读取本地文件
    lib/index.js:206
    if (existsSync(pf)) {
  • 读取本地文件
    lib/index.js:207
    const parsed = JSON.parse(readFileSync(pf, "utf8"));
  • 读取本地文件
    lib/index.js:236
    return readFileSync(SETTINGS_FILE, "utf8");
  • 发起网络请求
    client.js:506
    fetch("/api/keepalive/status", { cache: "no-store" })
  • 发起网络请求
    client.js:525
    fetch("/api/keepalive/restart", { method: "POST", cache: "no-store" })
  • 发起网络请求
    client.js:703
    fetch("/api/keepalive/report-plugin-failure", {
  • 发起网络请求
    client.js:732
    fetch("/api/keepalive/status", { cache: "no-store" })
  • 发起网络请求
    client.js:774
    fetch("/api/keepalive/status", { cache: "no-store" })
  • 读取本地文件
    bin/uninstall.mjs:77
    return JSON.parse(readFileSync(STATE_FILE, "utf8"));
  • 写入本地文件
    bin/uninstall.mjs:86
    writeFileSync(tmp, JSON.stringify(merged, null, 2));
  • 写入本地文件
    bin/uninstall.mjs:87
    renameSync(tmp, STATE_FILE);
  • 读取本地文件
    lib/installed-patches.mjs:105
    if (!existsSync(join(root, "node_modules", "@deepseek-ai"))) {
  • 写入本地文件
    lib/installed-patches.mjs:126
    writeFileSync(tmp, content);
  • 写入本地文件
    lib/installed-patches.mjs:127
    renameSync(tmp, file);
  • 执行外部命令来自配置/变量
    lib/installed-patches.mjs:133
    const res = spawnSync(process.execPath, ["--check", file], {
  • 读取本地文件
    lib/installed-patches.mjs:185
    if (statSync(candidate).isFile()) return candidate;
  • 读取本地文件
    lib/installed-patches.mjs:209
    manifest = JSON.parse(readFileSync(manifestPath, "utf8"));
  • 读取本地文件
    lib/installed-patches.mjs:311
    source = readFileSync(target.file, "utf8");
  • 读取本地文件
    lib/installed-patches.mjs:400
    source = readFileSync(target.file, "utf8");
  • 读取本地文件
    lib/snapshot-rollback.mjs:58
    pkg = JSON.parse(readFileSync(join(home, "profiles", "web", "package.json"), "utf8"));
  • 读取本地文件
    lib/snapshot-rollback.mjs:69
    if (!lstatSync(target).isDirectory()) continue;
  • 读取本地文件
    lib/snapshot-rollback.mjs:79
    const pkgName = JSON.parse(readFileSync(join(target, "package.json"), "utf8")).name;
  • 读取本地文件
    lib/snapshot-rollback.mjs:93
    if (lstatSync(p).isSymbolicLink()) return readlinkSync(p);
  • 读取本地文件
    lib/snapshot-rollback.mjs:106
    entries = readdirSync(nm, { withFileTypes: true });
  • 读取本地文件
    lib/snapshot-rollback.mjs:118
    sub = readdirSync(join(nm, ent.name), { withFileTypes: true });
  • 写入本地文件
    lib/snapshot-rollback.mjs:205
    mkdirSync(dir, { recursive: true });
  • 写入本地文件
    lib/snapshot-rollback.mjs:212
    mkdirSync(dirname(dst), { recursive: true });
  • 写入本地文件
    lib/snapshot-rollback.mjs:213
    copyFileSync(src, dst);
  • 写入本地文件
    lib/snapshot-rollback.mjs:226
    mkdirSync(dirname(dst), { recursive: true });
  • 写入本地文件
    lib/snapshot-rollback.mjs:227
    copyFileSync(src, dst);
  • 写入本地文件
    lib/snapshot-rollback.mjs:265
    mkdirSync(dirname(dst), { recursive: true });
  • 删除本地文件
    lib/snapshot-rollback.mjs:387
    rmSync(abs, { force: true });
  • 删除本地文件
    lib/snapshot-rollback.mjs:397
    rmdirSync(join(nm, scope));
  • 删除本地文件
    lib/snapshot-rollback.mjs:419
    rmSync(join(root, rel), { force: true });
  • 删除本地文件
    lib/snapshot-rollback.mjs:424
    rmdirSync(parent);
  • 读取本地文件
    restarter.mjs:27
    return JSON.parse(readFileSync(stateFile, "utf8"));
  • 执行外部命令来自配置/变量
    restarter.mjs:49
    const child = spawn(process.execPath, args, {
  • 写入本地文件
    watchdog.mjs:63
    appendFileSync(LOG, `${new Date().toISOString()} ${line}\n`);
  • 读取本地文件
    watchdog.mjs:75
    return JSON.parse(readFileSync(STATE, "utf8"));
  • 读取本地文件
    watchdog.mjs:91
    section = parseKeepaliveConfig(readFileSync(join(DSH_HOME, "settings.yaml"), "utf8"));
  • 写入本地文件
    watchdog.mjs:121
    writeFileSync(tmp, JSON.stringify(merged, null, 2));
  • 写入本地文件
    watchdog.mjs:122
    renameSync(tmp, STATE);
  • 发起网络请求
    watchdog.mjs:147
    const req = http.get({ host: HOST, port: PORT, path: "/", timeout: timeoutMs }, (res) => {
  • 执行外部命令固定命令
    watchdog.mjs:166
    const res = spawnSync("ss", ["-tlnp"], { encoding: "utf8", timeout: 8000 });
  • 执行外部命令固定命令
    watchdog.mjs:182
    const res = spawnSync("netstat", ["-ano"], { encoding: "utf8", timeout: 8000, windowsHide: true });
  • 执行外部命令固定命令
    watchdog.mjs:202
    spawnSync("taskkill", ["/PID", String(pid), "/T", "/F"], { timeout: 8000, windowsHide: true });
  • 执行外部命令固定命令
    watchdog.mjs:217
    spawnSync("sleep", ["1.5"], { timeout: 5000 });
  • 写入本地文件
    watchdog.mjs:252
    writeFileSync(fd, marker);
  • 读取本地文件
    watchdog.mjs:253
    const logStart = readFileSync(WEB_LOG).length;
  • 执行外部命令来自配置/变量
    watchdog.mjs:254
    const child = spawn(process.execPath, [BIN, "web"], {
  • 读取本地文件
    watchdog.mjs:271
    const buf = readFileSync(WEB_LOG);
  • 读取本地文件
    watchdog.mjs:282
    const buf = readFileSync(file);
  • 删除本地文件递归
    watchdog.mjs:321
    rmSync(dir, { recursive: true, force: true });
  • 写入本地文件
    watchdog.mjs:322
    mkdirSync(join(dir, "profiles"), { recursive: true });
  • 写入本地文件
    watchdog.mjs:323
    mkdirSync(join(dir, "sessions"), { recursive: true });
  • 读取本地文件
    watchdog.mjs:351
    if (existsSync(credentialsFile)) {
  • 执行外部命令来自配置/变量
    watchdog.mjs:397
    const child = spawn(process.execPath, [BIN, "--profile", "headless", task], {
  • 删除本地文件
    watchdog.mjs:441
    rmSync(join(repairHome, ".credentials.yaml"), { force: true });
  • 删除本地文件
    watchdog.mjs:522
    rmSync(REPAIR_PROGRESS_FILE, { force: true });
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

社区实装还没有人打卡 · 装过的第一个就是你
依赖的 DSH / Cordis 模块
@deepseek-ai/dsh-client-runtime@deepseek-ai/dsh-client-ui-primitives@deepseek-ai/dsh-home-paths@deepseek-ai/dsh-settings@deepseek-ai/schemastery
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 进程退出自动拉起
  • 快照校验修复
  • 补丁还原

DSH Web 进程的可选分离看门狗,带快照校验修复和显式补丁还原。

README

由 DeepSeek 最新模型翻译生成
dsh-keepalive 状态:功能插件(含兼容补丁),仅在 DeepSeek Harness 0.1.0-rc.6 上测试过。 dsh-keepalive 为 DSH Web 进程运行一个分离的看门狗。显式启用后,看门狗会在进程退出后把 DSH 重新拉起来。可选的修复代理会检查反复出现的启动失败、修改插件工作区,并从快照重试。 问题 进程一旦退出,Web 自己无法重启。DSH 内置了流空闲看门狗和浏览器重连退避,但这些机制都不负责监督宿主进程。 行为 - 为看门狗配置添加一张 Plugins 设置卡片。 - 仅当 enabled 为 true 时启动分离的 Node 看门狗。 - 检查进程健康状态,用相同的 DSH 二进制和参数重新拉起。 - 手动重启:设置卡片「手动重启」按钮(或 POST /api/keepalive/restart)——当前进程退出后由看门狗拉起;看门狗未运行时由兜底重启器(restarter.mjs)以相同命令拉起。 - 为设置命名空间和 Windows 隐藏子进程应用守卫式兼容补丁。 - 启动反复失败后,可选地运行修复代理。 - 对允许修复的工作区做快照,校验结果路径/配置/语法,失败的修复回滚。
展开完整文档(README 剩余 1 节)
dsh-keepalive

状态:功能插件(含兼容补丁),仅在 DeepSeek Harness 0.1.0-rc.6 上测试过。

dsh-keepalive 为 DSH Web 进程运行一个分离的看门狗。显式启用后,看门狗会在进程退出后把 DSH 重新拉起来。可选的修复代理会检查反复出现的启动失败、修改插件工作区,并从快照重试。

问题

进程一旦退出,Web 自己无法重启。DSH 内置了流空闲看门狗和浏览器重连退避,但这些机制都不负责监督宿主进程。

行为

- 为看门狗配置添加一张 Plugins 设置卡片。
- 仅当 enabled 为 true 时启动分离的 Node 看门狗。
- 检查进程健康状态,用相同的 DSH 二进制和参数重新拉起。
- 手动重启:设置卡片「手动重启」按钮(或 POST /api/keepalive/restart)——当前进程退出后由看门狗拉起;看门狗未运行时由兜底重启器(restarter.mjs)以相同命令拉起。
- 为设置命名空间和 Windows 隐藏子进程应用守卫式兼容补丁。
- 启动反复失败后,可选地运行修复代理。
- 对允许修复的工作区做快照,校验结果路径/配置/语法,失败的修复回滚。
- 修复范围扩展:对 web profile 中 link:/file:(目录)依赖指向的开发目录,修复代理可在其 node_modules 下新增 junction 补齐依赖解析;新增链接被快照追踪、失败回滚时移除,现有条目与源码/配置一律不动。
- 修复进度页:web 启动失败进入修复时,看门狗在 web 端口(默认 3080)上提供零依赖状态页——显示"启动发生错误,正在修复"、修复代理实时进度与已用时间;修复成功后页面自动跳回 web 界面,失败则显示修复代理的结论。
- 修复代理可对【本次报错插件所属的 link 目标开发目录】内的源码做最小修复(如补变量声明、修正 import、修复语法),该目录被内容快照覆盖、失败回滚;禁止删除文件。
- 修复代理的工作区根自动取所有用户 link 目标开发目录的公共父目录(如 D:\Code),官方 @deepseek-ai/* 的 link 包被排除、不可写;沙箱写入由快照审计兜底。
- 前端插件失败上报:web 存活但某个 client 插件模块加载失败时上报(仅限浏览器对动态 import() 失败的明确包装消息,如 "Failed to fetch dynamically imported module";不监听 window error、不使用 slots.onEntryError——普通脚本错误与 entry 渲染崩溃(如 React #130)都不是插件模块故障,误报只会骚扰正常使用),看门狗触发"降级修复"(跳过 live 目录快照,修复后自动重启 web 重载插件;若修复代理未做任何改动则不重启,直接清除上报)。
- 全局修复进度浮层:任何页面右下角实时显示"正在修复:阶段 + agent 进度行";仅在 status=repairing 时展示,修复结束自动消失,失败显示原因。

enabled 和 autoRepair 都需要显式选择启用;自动修复默认 false。

非目标

本包不是高可用集群、服务管理器、沙箱、恶意软件边界或秘密清洗器,也不保证失败的 DSH 实例能被自动修复。它替代不了 systemd、Windows 服务控制管理器、容器或外部监控。

兼容补丁

本插件精确针对:

- @deepseek-ai/dsh-host-apiproxy@0.1.0-rc.6:允许 Web 设置 API 使用 keepalive 设置命名空间。
- @deepseek-ai/dsh-subprocess-local@0.1.0-rc.6:Windows 上本地工具子进程使用 windowsHide: true。

版本策略默认自适应:如果已安装副本的版本不是 0.1.0-rc.6,但每个锚点仍然唯一匹配,就照常打补丁(记为 adaptive 匹配);锚点漂移则跳过并说明原因。编程选项 strict 可恢复"只打精确版本"的旧行为。单个漂移副本不会阻塞另一个目标,补丁应用在 host 或看门狗启动期间也绝不会抛错。设置命名空间这一行插在允许列表数组的顶部,避免占用与 dsh-tavily-search-provider 共享的尾部锚点——两个插件无论按什么顺序安装都能共存。还原(卸载)在任何模式下都严格校验版本。写入走临时文件加重命名的原子写入,替换后校验语法,校验失败则恢复原有字节。

兼容性

需要 DeepSeek Harness 0.1.0-rc.6、Node.js ^22.19.0 || >=24、pnpm >=10。看门狗针对当前 DSH CLI 的布局设计,已在 Windows 上测试。

安装

dsh plugin --profile web add "github:xiaohj233/dsh-keepalive#v0.1.0"

重启 Web profile。只安装并不会启用看门狗重启或修复。

配置

通过 Plugins 卡片或设置文件配置 keepalive 设置区块:

keepalive:
enabled: false
autoRepair: false
checkIntervalMs: 3000
bootWaitMs: 15000
repairProvider: ""
repairModel: ""

provider、model、base URL、API 名称和凭据引用都以单行 YAML 安全字符串序列化。所选模型和凭据路径验证过之前,先保持修复禁用。

还原与卸载

从 profile 移除插件之前,先运行本包的卸载命令:

pnpm --dir "$DSH_HOME/profiles/web" exec dsh-keepalive-uninstall
dsh plugin --profile web remove dsh-keepalive

未设置 $DSH_HOME 时,profile 位于用户主目录下(POSIX 为 ~/.dsh/profiles/web,Windows PowerShell 为 %USERPROFILE%\.dsh\profiles\web);Windows 上请把解析后的路径传给 pnpm --dir,不要用 ~。

命令会禁用 keepalive 状态、只终止记录的看门狗进程,并还原两个被打补丁的官方文件;任一步骤不完整都以非零状态退出。正常的 Web 关闭不会撤销补丁——关闭恰恰是看门狗要监督的事件。

安全

修复代理把启动诊断作为 prompt 输入接收。这些诊断不可信,可能夹带误导性的指令。修复运行时使用 workspace-write,继承启动进程可见的环境信息,可以修改插件工作区——这不是完整的隔离或保密边界。快照、路径、语法和回滚检查能减少意外损坏,但并不能让任意的 agent 输出变得安全。

每次修复后都要审查改动。不要在包含修复进程不该读取的凭据的机器或插件目录上启用修复。

其他已知限制:

- 看门狗监督和卸载只凭记录的 PID 识别看门狗。看门狗死后若该 PID 被无关进程复用,监督会静默失效,dsh-keepalive-uninstall 还可能终止那个无关进程。卸载前先确认看门狗是否在运行。
- 连续多次轮询无响应后,看门狗会强制终止监听所配置端口的任何进程(也就是预期的重启目标);恰好占着该端口的无关服务也会被一并杀掉。
- 启动失败的诊断和最近一次修复代理的输出(上限 4 KB)会持久化在 keepalive 状态里,同源或受信任的页面可以从 /api/keepalive/status 读取。启动失败日志可能夹带环境中的秘密。
- 快照/差异/回滚层追踪 link 目标 node_modules 的顶层条目:修复代理在那里新增的 junction 会被发现并在回滚时移除;但普通插件工作区仍只遍历普通文件和目录,仍建议保持工作区无链接。
- Host 与看门狗都会重写 keepalive.json;并发写入可能暂时丢掉一次更新(下一次写入会自行纠正)。

测试

npm test
npm run check:syntax
npm pack --dry-run

测试覆盖:默认值、YAML 注入与往返、补丁/还原的精确行为、歧义锚点、语法回滚、快照、一次真实的分离进程卸载、看门狗启动,以及 --unpatch 参数约定。

局限性与上游现状

DSH 社区已有重启/自愈类插件,上游也可能推出官方的 keepalive 实现。本包只做一个对 Windows 友好的分离式看门狗,外加可选启用、带快照校验的修复。它无法从操作系统关机、账户注销、Node/DSH 二进制不可用或主机级资源耗尽中恢复。

License

MIT。补丁目标均为 MIT 许可,详见 THIRD_PARTY_NOTICES.md。
预览分享卡片长什么样 ↓xiaohj233/dsh-keepalive
分享 · DeepSeek Harness Hub
xiaohj233/dsh-keepalive

DSH Web 退出后自动拉起并修复启动故障

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部