Back to home

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 一致)。

验证安装是否生效

  1. 查 loader 条目(确认插件已加载):在 DSH 会话里跑 cordis_inspect_self,或用探针列出 ctx.loader.entries(),应看到 approve-for-me | name=approve-for-me
  2. 行为验证:请求一次低风险提权(如 echo hi > /tmp/x),若插件生效会无弹窗直接执行; 会话日志里 approval/askedapproval/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 激活即可。进程重启后失效,适合先试用再决定是否按上面的方式安装。