READMESource: main@0a0c8b35
dsh-auto-mode
CC 风格的自动审批层(DeepSeek Harness 常驻插件)。在专用权限预设 auto 内,
把 approval/request 瀑布的请求按六个频带路由,从便宜到昂贵:
- hardDeny 正则 — 直接拒绝(外传凭据、管道执行远程脚本、authorized_keys、密钥材料等)
- humanOnly 正则 — 永远转人工(
~/.ssh、shell 配置、.env、credentials 等) - deletionGuard —
rm/unlink/shred/git clean -f一律拒绝,并提示改用trash <file>(macOS 自带/usr/bin/trash),文件进回收站可恢复,而非永久销毁 - allowCommands 白名单 — CC settings.json 风格的前缀 glob(
npm install*、git status *…), 零 LLM 直接放行;deny 频带永远优先于白名单 - 确定性形状 — 只读工具/联网工具放行;
escalate sandbox to <mode>:请求仅当 目标是 workspace-write 且所有可提取路径都在信任根内才放行;danger-full-access 永不自动给 - 两级分类器 — 仅模糊频带:fast 单发 SAFE/UNSAFE → 不确定时 JSON 复查; 任何失败 FAIL 转人工,绝不瞎猜。会话级熔断器(连续/累计 DENY)把失控会话还给人类
路径白名单:allowPaths(如 ~/Documents/work/)会并入信任根,工作区外的常用目录从此不再弹卡。
上线第一天 = shadow 观察模式
dryRun: true:所有判定只进环形缓冲 + 控制台 + GET /auto-mode/decisions,
实际决定仍交给瀑布下游(approval-llm / 人工)。确认观察期无异常后,在
profile 的 cordis.patch.yml 里加一行覆盖即可切换为强制模式:
- id: auto-mode
config:
enabled: true
modePreset: auto
dryRun: false # ← 关键开关;补丁整行替换,需重述要保留的字段
trustWorkspace: true
trustRoots: []
allowNetwork: true
# …其余字段见 cordis.patch.yml 默认值
设计铁律与关键发现(2026-08-21 会话事故复盘)
- 审批处理器内零会话日志写入(dsh-approval-llm v0.1.3 会话中毒类)。
- 每个
approval.request必须携带signal: exec.signal:ApprovalService.decide()在无 signal 时跳过中止竞速 (if (signal === undefined) return answer),停止永远取消不了该询问。 - 瀑布注册顺序 = 外层先跑:apiproxy 的人工应答器在组合启动时注册,
任何启动后追加的监听器(全部动态插件)都排在它下游、永远轮不到。
本插件用
{ prepend: true }注册到最外层;无判定时照常 next()。
自检
- 工具:
auto_mode_probe(被占用时自动降级为auto_mode_probe_v2), 把合成请求推进真实 ApprovalService 管线并回报各场景判定。 - HTTP:
GET /auto-mode/decisions(被占用时-alt后缀),环形缓冲最近 200 条。 - 纯路由单测:
proto/routing.test.mjs(12 例),node --test proto/routing.test.mjs。
维护警告
任何 pnpm 操作(install/add/update)都会清掉 harness 的两份运行时补丁。 装完依赖后必须立刻重跑:
bash ~/.dsh/apply-dsh-patches.sh # 你部署里的补丁重放脚本(如有)
结构
package.json dsh.bundle.patch -> ./cordis.patch.yml
lib/index.js 宿主半区(ESM;Config schema + apply)
cordis.patch.yml 插件行插入 + permission 行重述(新增 auto 预设)
proto/ 动态原型(开发史 + 单测),不再参与加载
No comments yet. Be the first to write one.