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

双星自愈 cenjiuyihu/dsh-binary-star

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

让智能体崩溃后自动修复并切换副本顶班

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

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

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add cenjiuyihu/dsh-binary-star
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

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

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

验证判据与等级说明 →

可信度证据

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

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

可执行外部命令读写/删除本地文件读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 89 处,展示前 80 条)
  • 读取本地文件
    src/cli.js:22
    return JSON.parse(fs.readFileSync(path.join(p.locks, "supervisor.lock"), "utf8"));
  • 写入本地文件
    src/cli.js:77
    fs.writeFileSync(shutdownFile, JSON.stringify({ ts: new Date().toISOString(), by: "cli" }));
  • 写入本地文件
    src/cli.js:116
    fs.writeFileSync(authFile, JSON.stringify({ ts: new Date().toISOString(), by: "cli" }));
  • 写入本地文件
    src/cli.js:123
    fs.writeFileSync(hbFile, JSON.stringify({ ts: new Date().toISOString(), by: "cli" }));
  • 写入本地文件
    src/cli.js:131
    fs.writeFileSync(path.join(p.control, "halt"), new Date().toISOString());
  • 写入本地文件
    src/cli.js:149
    fs.mkdirSync(backupDir, { recursive: true });
  • 读取本地文件
    src/cli.js:152
    if (fs.existsSync(src)) fs.cpSync(src, path.join(backupDir, rel), { recursive: true });
  • 执行外部命令来自配置/变量
    src/cli.js:197
    const r = spawnSync(process.execPath, [script, ...process.argv.slice(3)], {
  • 执行外部命令来自配置/变量
    src/paths.js:33
    const r = spawnSync(comSpec, ["/c", `${bin} root -g`], { encoding: "utf8", windowsHide: true, timeout: 20000 });
  • 读取本地文件
    src/paths.js:46
    const cfg = JSON.parse(fs.readFileSync(file, "utf8"));
  • 写入本地文件
    src/paths.js:91
    fs.mkdirSync(dir, { recursive: true });
  • 写入本地文件
    src/paths.js:139
    fs.appendFileSync(file, `${new Date().toISOString()} ${line}\n`);
  • 写入本地文件
    src/heartbeat.js:24
    fs.writeFileSync(tmp, JSON.stringify(hb));
  • 写入本地文件
    src/heartbeat.js:25
    fs.renameSync(tmp, file);
  • 读取本地文件
    src/heartbeat.js:32
    return JSON.parse(fs.readFileSync(path.join(heartbeatDir, `${role}.json`), "utf8"));
  • 读取本地文件
    src/state.js:25
    return JSON.parse(fs.readFileSync(stateFile, "utf8"));
  • 写入本地文件
    src/state.js:35
    fs.writeFileSync(tmp, JSON.stringify(st, null, 2));
  • 写入本地文件
    src/state.js:36
    fs.renameSync(tmp, stateFile);
  • 读取本地文件
    src/snapshot.js:13
    return JSON.parse(fs.readFileSync(path.join(dshPkg, "package.json"), "utf8")).version || "unknown";
  • 读取本地文件
    src/snapshot.js:27
    const st = fs.statSync(src);
  • 写入本地文件
    src/snapshot.js:29
    fs.mkdirSync(dest, { recursive: true });
  • 读取本地文件
    src/snapshot.js:30
    for (const child of fs.readdirSync(src)) {
  • 写入本地文件
    src/snapshot.js:34
    fs.mkdirSync(path.dirname(dest), { recursive: true });
  • 写入本地文件
    src/snapshot.js:35
    fs.copyFileSync(src, dest);
  • 写入本地文件
    src/snapshot.js:43
    fs.mkdirSync(dir, { recursive: true });
  • 读取本地文件
    src/snapshot.js:48
    if (!fs.existsSync(src)) continue;
  • 读取本地文件
    src/snapshot.js:56
    uiPatchApplied: !!(cfg.uiPatch && cfg.uiPatch.backup && fs.existsSync(cfg.uiPatch.backup)),
  • 写入本地文件
    src/snapshot.js:60
    fs.writeFileSync(path.join(dir, "meta.json"), JSON.stringify(meta, null, 2));
  • 读取本地文件
    src/snapshot.js:66
    if (!fs.existsSync(paths_.snapshots)) return [];
  • 删除本地文件
    src/snapshot.js:97
    fs.rmSync(to, { recursive: true, force: true });
  • 读取本地文件
    src/journal.js:22
    const text = fs.readFileSync(journalFile, "utf8");
  • 写入本地文件
    src/journal.js:34
    fs.mkdirSync(path.dirname(journalFile), { recursive: true });
  • 写入本地文件
    src/journal.js:35
    fs.appendFileSync(journalFile, JSON.stringify(entry) + "\n");
  • 读取本地文件
    src/journal.js:69
    const lines = fs.readFileSync(journalFile, "utf8").split("\n").filter(Boolean);
  • 写入本地文件
    src/journal.js:82
    fs.writeFileSync(journalFile, out.join("\n") + "\n");
  • 读取本地文件
    src/journal.js:87
    const lines = fs.readFileSync(journalFile, "utf8").split("\n").filter(Boolean);
  • 写入本地文件
    src/journal.js:101
    fs.writeFileSync(journalFile, out.join("\n") + "\n");
  • 读取本地文件
    src/journal.js:106
    const lines = fs.readFileSync(journalFile, "utf8").split("\n").filter(Boolean);
  • 写入本地文件
    src/journal.js:118
    fs.writeFileSync(journalFile, out.join("\n") + "\n");
  • 读取本地文件
    src/ladder.js:25
    return fs.existsSync(path.join(cfg.dshHome, rel));
  • 读取本地文件
    src/ladder.js:46
    const text = fs.readFileSync(patch, "utf8");
  • 执行外部命令来自配置/变量
    src/ladder.js:54
    const r = spawnSync(process.execPath, [bin, "--profile", cfg.primaryProfile, "--dump-config"], {
  • 读取本地文件
    src/ladder.js:72
    if (!fs.existsSync(backupDir)) return { restored: [], missing: true };
  • 读取本地文件
    src/ladder.js:76
    if (!fs.existsSync(from)) continue;
  • 删除本地文件
    src/ladder.js:78
    fs.rmSync(to, { recursive: true, force: true });
  • 写入本地文件
    src/ladder.js:79
    fs.mkdirSync(path.dirname(to), { recursive: true });
  • 写入本地文件
    src/ladder.js:107
    fs.mkdirSync(dir, { recursive: true });
  • 写入本地文件
    src/ladder.js:108
    fs.writeFileSync(path.join(dir, `${stamp}.json`), JSON.stringify(report, null, 2));
  • 执行外部命令来自配置/变量
    src/ladder.js:174
    const r = spawnSync(comSpec, ["/c", `npm.cmd install -g @deepseek-ai/dsh@${lkg} --loglevel=warn`], {
  • 读取本地文件
    src/ladder.js:179
    if (cfg.uiPatch && cfg.uiPatch.script && fs.existsSync(cfg.uiPatch.script)) {
  • 执行外部命令来自配置/变量
    src/ladder.js:180
    const p = spawnSync(process.execPath, [cfg.uiPatch.script], { encoding: "utf8", timeout: 60000, windowsHide: true, stdio: ["ignore", "pipe", "pipe"] }
  • 发起网络请求
    src/probe.js:16
    const req = http.get(url, (res) => {
  • 写入本地文件
    src/probe.js:48
    fs.writeFileSync(probeFile, "ok");
  • 删除本地文件
    src/probe.js:49
    fs.rmSync(probeFile, { force: true });
  • 执行外部命令固定命令
    src/supervisor.js:27
    const r = spawnSync("taskkill", ["/PID", String(pid), "/T", "/F"], { stdio: "ignore" });
  • 执行外部命令来自配置/变量
    src/supervisor.js:74
    const proc = spawn(cmd.cmd, cmd.args, {
  • 读取本地文件
    src/supervisor.js:153
    if (!fs.existsSync(lastFile)) {
  • 读取本地文件
    src/supervisor.js:158
    try { last = JSON.parse(fs.readFileSync(lastFile, "utf8")); } catch (e) { this._log(`自动恢复:last-session.json 解析失败: ${e.message}`); return; }
  • 发起网络请求
    src/supervisor.js:170
    const res = await fetch(`http://127.0.0.1:${port}/api/session.prompt`, {
  • 读取本地文件
    src/seed.js:64
    const buf = fs.readFileSync(file);
  • 读取本地文件
    src/seed.js:77
    if (!fs.existsSync(sessionsRoot)) return null;
  • 读取本地文件
    src/seed.js:78
    const dirs = fs.readdirSync(sessionsRoot)
  • 读取本地文件
    src/seed.js:80
    .filter((p) => fs.statSync(p).isDirectory());
  • 读取本地文件
    src/seed.js:84
    pool.sort((a, b) => fs.statSync(b).mtimeMs - fs.statSync(a).mtimeMs);
  • 读取本地文件
    src/seed.js:122
    if (!fs.existsSync(file)) return { ok: false, reason: "无 session.jsonl.zstd" };
  • 写入本地文件
    src/seed.js:127
    fs.mkdirSync(seedDir, { recursive: true });
  • 写入本地文件
    src/seed.js:142
    fs.writeFileSync(path.join(seedDir, "latest.txt"), `# 会话种子(${meta.sessionId || "?"},取最近 ${n} 条)\n\n${text || "(无可提取消息)"}\n`);
  • 写入本地文件
    src/seed.js:143
    fs.writeFileSync(path.join(seedDir, "latest.meta.json"), JSON.stringify(meta, null, 2));
  • 读取本地文件
    plugin/src/index.js:35
    if (!existsSync(patch)) {
  • 读取本地文件
    plugin/src/index.js:39
    try { text = readFileSync(patch, 'utf8') } catch { text = '' }
  • 读取本地文件
    plugin/src/index.js:47
    if (existsSync(pkg)) {
  • 读取本地文件
    plugin/src/index.js:48
    try { JSON.parse(readFileSync(pkg, 'utf8')) } catch { issues.push('profiles/web/package.json 不是合法 JSON') }
  • 读取密钥环境变量
    plugin/src/index.js:60
    const token = process.env.DSH_BINARY_TOKEN || 'none'
  • 写入本地文件
    plugin/src/index.js:83
    mkdirSync(dir, { recursive: true })
  • 写入本地文件
    plugin/src/index.js:96
    writeFileSync(tmp, JSON.stringify(hb))
  • 写入本地文件
    plugin/src/index.js:97
    renameSync(tmp, file)
  • 读取本地文件
    plugin/src/index.js:118
    if (!existsSync(sessionsRoot)) return
  • 读取本地文件
    plugin/src/index.js:125
    if (!existsSync(f)) continue
  • 写入本地文件
    plugin/src/index.js:137
    writeFileSync(tmp, JSON.stringify(rec))
  • 写入本地文件
    plugin/src/index.js:138
    renameSync(tmp, target)
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 GitHub 仓库

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

社区实装还没有人打卡 · 装过的第一个就是你
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 心跳监视
  • 修复阶梯
  • 副本故障转移

双星系统:DeepSeek Harness (DSH) 的自愈系统——心跳监视、修复阶梯、受控自重启验证、卫星副本故障转移。Binary-star self-healing system for DSH.

README

由 DeepSeek 最新模型翻译生成
dsh-binary-star 双星系统 让 DeepSeek Harness (DSH) 智能体拥有「把自己搞坏后能自己修好」的能力: 主星干活,卫星(副本 profile)待命,监督者(纯 Node、无 LLM)负责监视、修复、顶班。 本项目由 AI 辅助开发。适用 Windows;dsh 版本 0.1.1-rc.2(已验证 0.1.0-rc.7 → rc.8 → 0.1.1-rc.2 连续升级)。 特性 - 三线检测:L1 心跳(进程层)/ L3 自检(配置被改坏未崩溃即上报 degraded)/ 组合树冒烟(--dump-config) - 变更账本:自我修改先记账(journal open/commit/rollback),崩溃 = 一笔 open 账目 = 修复头号嫌疑 - 修复阶梯(0-6,每步验证、成功即停):重启 → 校验 → 回滚账目 → 快照还原 → 重装 → 顶班;每次执行写结构化修复报告 - 受控自重启验证:需重启生效的修改 → 受控重启 → 探针验证 → 失败自动回滚(根治「装完重启后全废」) - 代班接管(failover):阶梯用尽 → 授权/超时 → 卫星副本 profile 顶班(GUI + 修复智能体 + 会话种子续接)→ 交回时会话归档 - 70+ 项沙箱演练(scripts/drill-*.js):故意搞炸系统来证明它能修
展开完整文档(README 剩余 1 节)
dsh-binary-star 双星系统

让 DeepSeek Harness (DSH) 智能体拥有「把自己搞坏后能自己修好」的能力: 主星干活,卫星(副本 profile)待命,监督者(纯 Node、无 LLM)负责监视、修复、顶班。

本项目由 AI 辅助开发。适用 Windows;dsh 版本 0.1.1-rc.2(已验证 0.1.0-rc.7 → rc.8 → 0.1.1-rc.2 连续升级)。

特性

- 三线检测:L1 心跳(进程层)/ L3 自检(配置被改坏未崩溃即上报 degraded)/ 组合树冒烟(--dump-config)
- 变更账本:自我修改先记账(journal open/commit/rollback),崩溃 = 一笔 open 账目 = 修复头号嫌疑
- 修复阶梯(0-6,每步验证、成功即停):重启 → 校验 → 回滚账目 → 快照还原 → 重装 → 顶班;每次执行写结构化修复报告
- 受控自重启验证:需重启生效的修改 → 受控重启 → 探针验证 → 失败自动回滚(根治「装完重启后全废」)
- 代班接管(failover):阶梯用尽 → 授权/超时 → 卫星副本 profile 顶班(GUI + 修复智能体 + 会话种子续接)→ 交回时会话归档
- 70+ 项沙箱演练(scripts/drill-*.js):故意搞炸系统来证明它能修
- 一键运维脚本:setup-satellite.js(卫星副本自动准备)/ upgrade-dsh.js(版本升级+失败自动回滚)/ soak.js(长时随机故障韧性测试)
- 桌面壳监视器 v2:事件流 / 日志查看 / 修复历史与统计 / 失败告警横幅 / 监督者崩溃自动重启(看门狗)/ 系统通知

架构

用户/GUI :3080 ─► 主星(web profile:心跳/自检/账本) │ 文件级通信(心跳/控制文件,无网络依赖)监督者(独立进程,无 LLM)── 监视 → 分类(D1-D4) → 快速重启 → 修复阶梯 │ → 受控自重启验证 → 顶班等待 → 代班接管 → 交回归档卫星副本(satellite profile:web bundles + 自有 patch,永不自我修改 → 永远可启动)

- 三角色:主星(干活)、监督者(机制中枢)、卫星(副本环境)
- 全部通信是文件:单机设计,主星网络挂了不影响监督者判断
- 保护范围:只修 profiles 组合/plugins/settings.yaml/dsh 包版本;绝不碰 sessions/storages/credentials/用户工作区

快速开始

前置:Node.js >= 20、全局安装 @deepseek-ai/dsh(本项目适配 0.1.1-rc.2)。

1. 部署宿主插件到真实 web profile(自动备份 + 验证,可回滚)
node scripts/deploy-live.js

2. 验收(只读 11 项检查)
node scripts/verify-live.js

命令

| 命令 | 说明 |
| node src/cli.js start | 启动监督者(拉起主星并监视;卫星在 P2 接入) |
| node src/cli.js status | 双星状态一览 |
| node src/cli.js stop | 停掉监督者拉起的双星进程树 |
| node src/cli.js snapshot <tag> | 打快照(baseline/pre/daily/manual) |
| node src/cli.js repair --now | 手动触发修复阶梯 |
| node src/cli.js halt | 暂停自动修复 |
| node src/cli.js journal <open\|commit\|rollback\|list> | 变更账本 |
| node src/cli.js takeover --now\|--undo | 人工授权顶班 / 请求交回 |
| node scripts/setup-satellite.js | 卫星副本 profile 自动准备(幂等) |
| node scripts/upgrade-dsh.js <版本> | dsh 升级 + 验证(失败自动回滚) |
| node scripts/soak.js [轮数] | 长时随机故障韧性测试 |

文档

- docs/architecture.md — 架构设计
- docs/deploy.md — 部署与验收
- docs/runbook.md — 故障排查
- docs/drills.md — 演练清单
- docs/chaos-methodology.md — 混沌演练方法论
预览分享卡片长什么样 ↓cenjiuyihu/dsh-binary-star
分享 · DeepSeek Harness Hub
cenjiuyihu/dsh-binary-star

让智能体崩溃后自动修复并切换副本顶班

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