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

伴航 zoe1nan/dsh-convoy

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

旁路监督 AI 会话,自动纠偏危险操作并留回执

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

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

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

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么
dsh 原生插件 · security
装得上吗
本站尚未做安装检查
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 9 天前
档位由哪些信号合成

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 49 处,展示前 43 条)
  • 读取本地文件
    index.js:53
    html = await readFile(DEMO_FILE, 'utf8')
  • 发起网络请求
    client.js:327
    const response = await fetch(`${API}/state`, { headers: { accept: 'application/json' } })
  • 发起网络请求
    client.js:385
    const response = await fetch(`${API}/receipts?${query}`, {
  • 发起网络请求
    client.js:714
    fetch(`${API}/config`, {
  • 读取本地文件
    src/host/state.mjs:223
    if (!existsSync(file)) return
  • 读取本地文件
    src/host/state.mjs:224
    const stored = JSON.parse(readFileSync(file, 'utf8'))
  • 写入本地文件
    src/host/state.mjs:241
    writeFileSync(tmp, `${JSON.stringify(this.config, null, 2)}\n`, 'utf8')
  • 写入本地文件
    src/host/state.mjs:242
    renameSync(tmp, file)
  • 读取本地文件
    src/receipts/store.mjs:50
    if (!existsSync(this.receiptsDir)) mkdirSync(this.receiptsDir, { recursive: true })
  • 写入本地文件
    src/receipts/store.mjs:50
    if (!existsSync(this.receiptsDir)) mkdirSync(this.receiptsDir, { recursive: true })
  • 写入本地文件
    src/receipts/store.mjs:60
    appendFileSync(this.dailyFile(date), JSON.stringify(receipt) + '\n', 'utf8')
  • 读取本地文件
    src/receipts/store.mjs:71
    if (!existsSync(file)) return []
  • 读取本地文件
    src/receipts/store.mjs:72
    return readFileSync(file, 'utf8')
  • 读取本地文件
    src/receipts/store.mjs:88
    if (!existsSync(this.dir)) mkdirSync(this.dir, { recursive: true })
  • 写入本地文件
    src/receipts/store.mjs:88
    if (!existsSync(this.dir)) mkdirSync(this.dir, { recursive: true })
  • 写入本地文件
    src/receipts/store.mjs:91
    writeFileSync(tmp, JSON.stringify(state, null, 2) + '\n', 'utf8')
  • 写入本地文件
    src/receipts/store.mjs:92
    renameSync(tmp, target)
  • 读取本地文件
    src/receipts/store.mjs:98
    if (!existsSync(target)) return null
  • 读取本地文件
    src/receipts/store.mjs:100
    return JSON.parse(readFileSync(target, 'utf8'))
  • 写入本地文件
    src/receipts/store.mjs:115
    if (!existsSync(dir)) mkdirSync(dir, { recursive: true })
  • 读取本地文件
    install.mjs:57
    console.log(readFileSync(fileURLToPath(import.meta.url), 'utf8').split('*/')[0])
  • 读取本地文件
    install.mjs:68
    if (!existsSync(profilePackage)) {
  • 读取本地文件
    install.mjs:72
    const raw = readFileSync(profilePackage, 'utf8')
  • 读取本地文件
    install.mjs:74
    const lockRaw = existsSync(lockfile) ? readFileSync(lockfile, 'utf8') : undefined
  • 读取本地文件
    install.mjs:74
    const lockRaw = existsSync(lockfile) ? readFileSync(lockfile, 'utf8') : undefined
  • 写入本地文件
    install.mjs:113
    copyFileSync(profilePackage, backup)
  • 写入本地文件
    install.mjs:114
    writeFileSync(profilePackage, JSON.stringify(json, null, indent) + '\n', 'utf8')
  • 读取本地文件
    install.mjs:128
    const nodeExe = NODE_CANDIDATES.find((candidate) => candidate === process.execPath || existsSync(candidate))
  • 执行外部命令固定命令
    install.mjs:134
    ? spawnSync('pnpm', ['install', '--prefer-offline', '--reporter=append-only', '--no-frozen-lockfile'], {
  • 执行外部命令来自配置/变量
    install.mjs:139
    : spawnSync(nodeExe, [pnpmCli, 'install', '--prefer-offline', '--reporter=append-only', '--no-frozen-lockfile'], {
  • 写入本地文件
    install.mjs:148
    writeFileSync(profilePackage, raw, 'utf8')
  • 写入本地文件
    install.mjs:153
    if (readFileSync(lockfile, 'utf8') !== lockRaw) writeFileSync(lockfile, lockRaw, 'utf8')
  • 写入本地文件
    install.mjs:172
    writeFileSync(profilePackage, raw, 'utf8')
  • 写入本地文件
    install.mjs:175
    if (readFileSync(lockfile, 'utf8') !== lockRaw) writeFileSync(lockfile, lockRaw, 'utf8')
  • 执行外部命令来自配置/变量
    src/actions/executor.mjs:38
    return spawnSync(command, args, {
  • 读取本地文件
    src/actions/executor.mjs:111
    if (typeof workdir !== 'string' || workdir === '' || !existsSync(workdir)) {
  • 读取本地文件
    src/actions/executor.mjs:225
    if (!existsSync(target)) continue
  • 读取本地文件
    src/actions/executor.mjs:226
    backups.push({ target, content: readFileSync(target, 'utf8'), hash: sha1(readFileSync(target, 'utf8')) })
  • 写入本地文件
    src/actions/executor.mjs:266
    for (const backup of record.backups) writeFileSync(backup.target, backup.content, 'utf8')
  • 读取本地文件
    src/events/frames.mjs:86
    const buffer = readFileSync(filePath)
  • 读取本地文件
    src/events/frames.mjs:93
    const stat = statSync(filePath)
  • 读取本地文件
    src/events/jsonl-source.mjs:54
    if (!existsSync(this.filePath)) return null
  • 读取本地文件
    src/events/jsonl-source.mjs:57
    size = statSync(this.filePath).size
扫描于 2026/11/1(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

伴航 Convoy for DeepSeek Harness — 内嵌在 DSH 里的 AI 自动纠偏层:危险命令改写、越界写入回滚、假完成重跑,全程零点击,只留可回溯回执。

README

由 DeepSeek 最新模型翻译生成
伴航 Convoy 伴航 Convoy 封面 ▶ 60 秒演示视频 · 三场景 + 实时监督 + 设置页 + 回执面板 + 复盘,全程零点击。 for DeepSeek Harness · 给每个 AI 会话配一个不干活的「找茬同事」——它不抢活干,只在 agent 快要犯错时直接出手收掉,然后留一张回执。 状态:v0.5.0 · M1 达成(2026-10-22):T1.1–T1.7 全部完成,真机四轮复验零误报;L2 模型复核已接入宿主 llm 服务(路由跟随会话,可开关);npm test 99/99、npm run replay 3/3。 日期:2026-10-22 · zoe1 / 小蓝鲸 这是什么 DSH 插件方向:AI 监督 AI。 现有 doctor/guard 类插件管的是「安装前检查、崩溃后修复」,teammate 管的是「分工干活」,没有人管运行过程中的语义级风险:危险命令、范围漂移、幻觉引用、假完成、验证缺失。 伴航旁路监听 DSH 会话事件,用「确定性规则 + 小模型 Reviewer」在关键节点判断,然后默认自动纠偏:安全改写命令、阻断高危操作、回滚范围外改动、补跑验证、循环降频、敏感信息脱敏。处理完只在界面上留一张回执——不弹确认、不等人点、不打断自动流程。
展开完整文档(README 剩余 1 节)
伴航 Convoy

伴航 Convoy 封面

▶ 60 秒演示视频 · 三场景 + 实时监督 + 设置页 + 回执面板 + 复盘,全程零点击。

for DeepSeek Harness · 给每个 AI 会话配一个不干活的「找茬同事」——它不抢活干,只在 agent 快要犯错时直接出手收掉,然后留一张回执。

状态:v0.5.0 · M1 达成(2026-10-22):T1.1–T1.7 全部完成,真机四轮复验零误报;L2 模型复核已接入宿主 llm 服务(路由跟随会话,可开关);npm test 99/99、npm run replay 3/3。
日期:2026-10-22 · zoe1 / 小蓝鲸

这是什么

DSH 插件方向:AI 监督 AI。

现有 doctor/guard 类插件管的是「安装前检查、崩溃后修复」,teammate 管的是「分工干活」,没有人管运行过程中的语义级风险:危险命令、范围漂移、幻觉引用、假完成、验证缺失。

伴航旁路监听 DSH 会话事件,用「确定性规则 + 小模型 Reviewer」在关键节点判断,然后默认自动纠偏:安全改写命令、阻断高危操作、回滚范围外改动、补跑验证、循环降频、敏感信息脱敏。处理完只在界面上留一张回执——不弹确认、不等人点、不打断自动流程。

一句话差异:别人管「安装、启动、权限、事后」,伴航管「过程」;别人把用户叫回来,伴航直接把事办了。

目录

dsh-convoy/
├─ README.md # 本文件 ├─ package.json # DSH 插件清单(dsh.bundle.patch + dsh.client) ├─ cordis.patch.yml # bundle patch:把宿主半插入 composition ├─ index.js # 宿主半:/convoy/ 面板页 + /convoy/api/* 实时接口 + 监听 session/event ├─ client.js # 客户端半:右下角回执胶囊/面板 + 设置页 + 侧边栏 + 主面板 ├─ install.mjs / install.cmd # 安装/卸载脚本(全部可回滚) ├─ src/ │ ├─ events/ # 事件层:多帧 zstd 解码、归一化、JSONL/总线双事件源 │ ├─ rules/ # L1 规则:W1 破坏性 / W2 路径越界 / W3 范围漂移 / W5 假完成 │ ├─ score/ # 信任分 │ ├─ receipts/ # 回执存储 + 复盘 markdown │ ├─ reviewer/ # L2 Reviewer(schema / 预算 / 触发 / 降级 / live-model) │ ├─ actions/ # AutoActionExecutor(nudge / git 回滚 / 重跑验证 / 脱敏) │ ├─ host/ # 实时状态中枢 ConvoyHub + /convoy/api 路由 │ └─ pipeline.mjs # 回放/宿主共用的串联管线 ├─ scripts/ # replay 回放器、真机会话探针、夹具生成 ├─ fixtures/ # 三个真实形状事件流(删库 / 范围漂移 / 假完成) ├─ test/ # node:test(99 项) ├─ docs/ │ ├─ PRD.md # 产品需求(v0.5) │ ├─ 工作计划表.md # 23 项任务 / 里程碑 / 风险 │ ├─ M0-技术设计.md # 事件模型 / 规则接口 / 自动动作 / 存储 │ └─ T1.7-冒烟记录.md # 真机冒烟四轮记录(误报证据 + 修复后复验) ├─ out/reviews/ # 三场景复盘样张(s1/s2/s3) └─ demo/ └─ index.html # 单文件交互 Demo(浅色 · 无依赖 · 面板内打开)

安装 / 卸载(全部可回滚)

安装(本机已完成过一次,重装/换机器用):

1. 双击 install.cmd(或在任意终端运行 node install.mjs)。脚本会:
- 备份 profile 的 package.json(package.json.bak-convoy-<时间戳>)
- 写入 "dsh-convoy": "link:<本目录绝对路径>" 与 dsh.profile.bundles 条目
- 用 DSH 自带 pnpm 安装并校验 node_modules/dsh-convoy
- 任一步失败自动还原 package.json / pnpm-lock.yaml,不会把 DSH 弄坏
2. 完全退出 DSH(托盘图标 → 退出),再重新启动。
3. 右下角出现回执胶囊;侧边栏出现「伴航 Convoy」面板;/convoy/ 由插件自己提供。

卸载 / 回滚:

node install.mjs --uninstall # 移除依赖与 bundles 条目,再跑一次 pnpm install
完全退出 DSH 再启动 → 胶囊、面板、路由全部消失

- 卸载同样先备份 package.json,失败会还原;重复执行是幂等的(输出 profile already up to date)。
- 应急手回滚:把最近的 package.json.bak-convoy-* 覆盖回 package.json,再 pnpm install。
- 演示(不落盘):node install.mjs --dry-run / node install.mjs --uninstall --dry-run。

安装/卸载演练已做:在临时 profile 上 install → uninstall → 二次 uninstall 幂等 → 清理,全程未触碰真实 profile。本机注记见 docs/T1.7-冒烟记录.md。

实时版怎么用

右下角 伴航回执胶囊(蓝色小标 + 信任分 + 状态点):

1. 不用点任何东西。正常和 DSH 对话,伴航在后台监听本机所有会话,命中 W1/W2/W3/W5 时自动生成回执并扣信任分。
2. 点胶囊展开面板:最近回执(哨点、原因、证据片段、自动动作)、会话数、红/黄计数、本轮状态;「下载复盘」导出当前会话 markdown。
3. 设置 → 伴航 Convoy:
- 自动纠偏(auto,默认) / 仅记录(record,观察期推荐) / 需要时提问(ask,M0 默认关)
- 自动动作计划开关(M0 只生成计划,不落盘执行)
- L2 状态(默认启用:复用 DSH 宿主 llm 服务,路由跟随会话 request/header;无服务/无路由时显式待命)
4. 数据只在本机:配置 ~/.dsh/convoy/config.json,回执按天追加 ~/.dsh/convoy/receipts/YYYY-MM-DD.jsonl,不上传任何会话内容。

接口(都过 GUI 登录校验,浏览器直连返回 401 属预期):

| 路由 | 说明 |
| GET /convoy/api/health | 存活 + 版本 + mode:"live" + L2 状态(enabled / standby-no-route / no-llm-service) |
| POST /convoy/api/review/run | 立刻对指定会话跑一次 L2(调试/验证用) |
| GET /convoy/api/state | 会话、信任分、回执统计、模式 |
| GET /convoy/api/stream | SSE 推送,面板实时刷新用 |
| GET /convoy/api/receipts?session=<id>&limit= | 回执列表 |
| GET /convoy/api/review?session=<id>[&download=1] | 复盘 markdown |
| GET\|POST /convoy/api/config | 读取/修改监督模式与自动动作开关 |
| POST /convoy/api/undo | 撤销(M0 诚实返回 not-executed:只生成了计划,未真实执行) |

怎么看 Demo

入口:DSH 侧边栏「伴航 Convoy」(面板内 iframe)或浏览器直开 demo/index.html,内容一致。

1. 打开即见品牌区:DeepSeek 官方 logo + 伴航 Convoy + for DeepSeek Harness;浅色背景,主色 #4D6BFE。
2. 选场景 → 点「▶ 播放」,然后什么都不用点:
- A · 删库前 3 秒:Remove-Item -Recurse -Force $HOME 在执行前被改写成只删 ./tmp、./logs。
- B · 顺手改了支付模块:只让改设置页,agent 顺手改 src/payment.ts;伴航自动回滚该文件,保留设置页改动。
- C · 「测试全部通过」:测试仍 failed 却声称通过;伴航自动重跑测试、贴出真实结果、把结论退回。
3. 每个风险点出现一张内联回执:风险级别、命中哨点、可展开证据、「✓ 已自动处理 · 零点击」;会话在回执后自动继续。
4. 右侧面板实时看:信任分、自动纠偏 / 人工介入(0)/ 避免事故、处理流水;顶部切「自动纠偏 / 仅记录」做对照;结束可下载复盘 .md。

Demo 是纯前端模拟,不操作真实文件;它演示 M1 目标形态(执行前改写/阻断)。真实会话的监督结果看右下角胶囊——M0 自动动作只生成可撤销计划,不落盘执行(见 PRD 5.1)。

PRD 核心(详见 docs/PRD.md)

- 三层机制:看见(事件流旁听)→ 判断(L1 确定性规则 + L2 语义 Reviewer)→ 处理(默认自动动作;仅记录 / 询问为备选)
- 交互原则:工作流是自动跑的,监督也必须自动跑——零点击优先、可逆优先、回执代替弹窗、升级是例外(默认关闭)
- 10 个哨点 + 默认自动动作:破坏性操作(改写/阻断)、路径越界(改写)、范围漂移(回滚)、幻觉引用(注入纠正)、假完成(重跑验证并退回结论)、验证缺失(补跑)、循环空转(中断/降频)、成本异常(降频/断点)、敏感信息(脱敏/阻断)、未兑现承诺(记录)
- 回执四要素:发现 / 证据(eventId + 片段)/ 自动动作 / 可撤销
- 信任分:自动处理红 -8、黄 -5;仅记录模式放行红 -30 / 黄 -15;撤销自动动作 -5
- M0(已完成):规则引擎 + Reviewer + 自动动作子集 + 回执 + 信任分 + 单会话复盘
- M1:真拦截/改写 hook、自定义自动动作、会话内纠正、报告导出
- M2:哨规/动作市场、跨会话模式、公开评测基准

开发与验证

node --test test/events.test.mjs test/rules.test.mjs test/score.test.mjs \
test/reviewer.test.mjs test/actions.test.mjs test/host.test.mjs # 99/99
node scripts/replay.mjs # 3/3 CHECK PASS(含信任分与复盘生成)
node scripts/replay.mjs --json # 机器可读:checks / decisions / score / plans
node scripts/probe-events.mjs # 解析本机最新真机会话:帧数/行数/事件直方图
node scripts/build-fixtures.mjs # 重新生成三份夹具

Node 24 下 node --test test/ 不支持目录,需显式列文件;定时器均已 unref(),测试不会挂住进程。

技术形态

已实现(T1.1–T1.7,M1)
- 事件层:真机会话 = 多帧 zstd 拼接的 session.v4.jsonl.zstd;按 magic 切帧逐帧解码(Node 单次 zstdDecompressSync 只出第一帧)。SessionNormalizer 做 seq 去重、缺口检测、工具归因;双事件源:总线(ctx.on('session/event') + snapshotEvents 补历史)与 JSONL tail(偏移量、半帧重试、轮转重置)。
- 规则/评分/回执:W1 破坏性命令(命令位置判定,忽略文档/heredoc 里的示例文本)、W2 路径越界、W3 范围漂移(只判源码文件,docs/日志不误报)、W5 假完成;信任分三模式;回执四要素;复盘 markdown。
- L2 Reviewer:严格 JSON schema + 证据门槛(引用不存在 eventId 直接丢弃)+ token 预算(会话 8%)+ 降采样 + 无模型路由时显式降级、绝不阻塞。AutoActionExecutor:nudge / git 回滚(先备份可 undo)/ 测试命令独立重跑 / 脱敏,全部有安全闸(workdir 内、拒敏感目录、不删文件、默认 dry-run)。
- 宿主实时链路:index.js 监听 session/event → ConvoyHub → L1 → 回执/信任分 → /convoy/api/state|stream|receipts|review|config|undo;会话暖启动 hydrate(静默,不重复生成回执);配置原子落 ~/.dsh/convoy/config.json。
- 客户端:shell.overlay 右下角回执胶囊 + 展开面板(信任分/回执/证据/下载复盘,SSE 实时 + 轮询兜底);settings.section 模式与开关;保留侧边栏 + main Demo 面板。
- 验证:npm test → 99/99;npm run replay → 3/3;真机四轮冒烟,最终零误报(docs/T1.7-冒烟记录.md)。

M0 边界 / M1 待做

- [ ] 真实执行接线(apply=true + undo 真回滚;M0 只生成可撤销计划)
- [x] L2 模型路由接入(复用宿主 llm 服务,跟随会话路由;每次复核只读、严格 JSON、证据门槛)
- [x] L2 真机接入(每回合只读复核一次;设置页可开关;无路由/无服务显式待命)
- [ ] 执行前「可暂停/可改写」hook 调研(决定 M1 真拦截)
- [ ] 用户误报/干扰接受度与自动动作正确率基线(T2.1 试用)

品牌与视觉

- 产品名固定写作 伴航 Convoy,副标 for DeepSeek Harness;插件 id / npm 包名 dsh-convoy。
- 图标使用 DeepSeek 官方 logo(引用,不重绘、不拉伸、不改色),仅作为生态标识;侧边栏另用自家「伴航」小标(蓝底 + 监视弧线),避免与官方图标混淆。
- 主色 DeepSeek 原生蓝 #4D6BFE;浅色主题:白底 + 浅灰面板 + 少量语义色(红 #E5484D / 黄 #C77F00)。
- 默认字体系统 UI + 中文回退;界面整洁留白,不用深色赛车风。

下一步

1. L2 真机验证:重启 DSH 后跑一个回合,看面板 L2 状态变为「已接入 · 路由」并产出回执
2. T2.1 试用观察(用户日常使用 3–5 天,盯误报;record 模式可先观察)
3. M2 发布:npm + dshbase / awesome-dsh-plugin PR(演示视频:out/video/convoy-60s.mp4,不入库)

旧版本(v0.2「暗哨 watchpost」深色 Demo)保留在 C:\work\dsh-watchpost\ 作为存档;本目录为 v0.3→v0.5「伴航 Convoy」。
预览分享卡片长什么样 ↓zoe1nan/dsh-convoy
分享 · DeepSeek Harness Hub
zoe1nan/dsh-convoy

旁路监督 AI 会话,自动纠偏危险操作并留回执

回到顶部