wcwplaygitbub
dsh-approve-for-me
dsh增加类似替我审批的能力
- Stars
- 0
- Language
- JavaScript
- Created
- Aug 16, 2026
- Updated
- Aug 16, 2026
Introduction
approve-for-me · 替我审批 (Approve for me)
DSH 权限模式插件:仿照 Codex 的「替我审批」——安全操作自动放行,仅检测到的危险操作请求人工审批。
原理
DSH 的沙盒提权(sandbox_permissions)会走 approval/request 审批通道。本插件用 prepend: true
注册在该通道最前面(先于 Web 人工审批弹窗),按真实工具参数(从会话日志按 callId 取回)做风险评估:
- 低风险(工作区内开发命令、包管理、构建测试、只读命令、写工作区文件)→ 直接返回
allowed-once,静默放行 - 高风险 / 无法判定 → 调用
next()转给人工审批弹窗,行为与未安装时完全一致
模式开关:只有当前会话的权限预设是 approve-for-me(替我审批)时才自动放行;
选 workspace-write / read-only / danger-full-access 时插件完全旁观(全部转人工)。
选择器控制开关,不选中就没有任何行为变化。
安装
DSH 的 profile 由
cordis.yml(空根)+ 各 bundle 补丁 +cordis.patch.yml(用户补丁层)组合而成。 用户自定义永远改cordis.patch.yml,不要改cordis.yml(每次启动会被重写)。
1. 把插件包放进 profile 的 node_modules
# 目标 profile(web / dsh-tui …)的 node_modules
cp -r approve-for-me ~/.dsh/profiles/web/node_modules/approve-for-me
验证包可从 profile 目录解析:
cd ~/.dsh/profiles/web && node --input-type=module -e "const m = await import('approve-for-me'); console.log(Object.keys(m))"
# 期望输出: [ 'apply', 'name' ]
2. 在 profile 的 cordis.patch.yml 里 INSERT 插件行
- insert:
- id: approve-for-me
name: approve-for-me
⚠️ 必须用
insert:。- id: x / name: y是「覆盖已有行」的写法:如果该 id 在 base 组合里不存在, 它会被静默跳过(loader 报patch: entry "approve-for-me" not found但不影响其他行)。 表现为:预设表能看到「替我审批」选项,但审批链里没有自动放行——这正是本插件早期版本踩过的坑。
3. 把「替我审批」加进权限选择器(可选但推荐)
permission 行在 base 组合里已存在,所以用覆盖写法。presets 是整体替换,必须把原有三个预设一起写上:
- id: permission
config:
presets:
read-only:
sandbox: read-only
approval: ask
name: read-only
description: 只读:修改文件或执行需要写入的命令时请求审批
workspace-write:
sandbox: workspace-write
approval: ask
name: workspace-write
description: 工作区读写 + 常规本地命令;越界或提权时请求审批
approve-for-me:
sandbox: workspace-write
approval: ask
name: 替我审批
description: 自动批准工作区内低风险操作,仅检测到的危险操作请求人工审批(Approve for me)
danger-full-access:
sandbox: danger-full-access
approval: never
name: danger-full-access
description: 完全访问:不做沙盒限制,不请求审批
4. 重启 DSH Web 应用
权限预设表和插件行都是进程级配置,补丁在启动时加载(Web profile 的 HMR 已禁用),必须重启才生效。
5. 切换到「替我审批」预设
重启后当前会话默认仍是创建时 pin 的 workspace-write。在权限选择器(或 /permission 命令)里切到
替我审批,自动放行即生效。新会话默认预设由 permission 表的 defaultPreset 决定,默认仍是
workspace-write(opt-in 语义,与 Codex 一致)。
验证安装是否生效
- 查 loader 条目(确认插件已加载):在 DSH 会话里跑
cordis_inspect_self,或用探针列出ctx.loader.entries(),应看到approve-for-me | name=approve-for-me。 - 行为验证:请求一次低风险提权(如
echo hi > /tmp/x),若插件生效会无弹窗直接执行; 会话日志里approval/asked→approval/decided间隔仅毫秒级(插件同步判定),而人工批准通常间隔数秒到数十秒。
自定义规则
lib/index.js 顶部的 DANGER(黑名单,命中即转人工)与 ALLOW(白名单,命中且无黑名单即放行)
是两段正则数组,按需增删即可;rm 与重定向还做了工作区路径边界检查。改完重启生效。
审计
每次决策都走 DSH 原有审计通道(approval/asked + approval/decided 会话事件),
同时 console.log 输出 [approve-for-me] AUTO-APPROVED / escalated to human 日志。
动态插件(临时试用)
在任意 DSH 会话里把 lib/index.js 里的 apply 函数体贴进 cordis_define(Host 代码),
cordis_run 激活即可。进程重启后失效,适合先试用再决定是否按上面的方式安装。