040822/dsh-codex-approval1

dsh-codex-approval

Codex-style approval autopilot for DeepSeek Harness: ordered glob rules (allow/ask/deny) plus an AI risk judge (low/medium/high) mapped through a risk tolerance, as an approval answerer.

AI Analysis

通过通配符规则和AI风险评估实现自动审批,适合需要自动化安全合规审查的场景。

Package
dsh-codex-approval
Version
0.4.2
License
MIT
Last updated
Sep 12, 2026

Install

$npx -p @deepseek-ai/dsh dsh plugin --profile web add github:040822/dsh-codex-approval

Web 配置与模型可用性

卡片在哪:Web UI → 设置 → 插件 → 插件配置(英文 Settings → Plugins → Plugin configuration)。该标签页按 settings namespace 列出可配置插件,本插件的卡片由自身浏览器半边注册在 settings.plugin.item slot 上,key 为 dsh-codex-approval-config。看不到卡片时先确认 Host 已加载新代码并刷新页面(见下方构建与重启说明)。

卡片长什么样:与内置插件卡片一致——里的 卡片(.5px 边框、16px 圆角、bg-layer-3/展开后 bg-layer-2),可折叠 header(名称 + 描述 + 未保存 Tag + 箭头)、body 表单、footer 的「放弃 / 保存」。样式取值逐条抄自内置的 PluginCard.module.cssfields.module.css(边框、圆角、14/16px 内边距、15px/600 标题、13px 描述、34px 控件高、focus 用 --dsw-alias-brand-primary 描边),并作用域在 dsh-ca- 前缀下,通过 data-plugin-css 约定的 `` 注入(client-card-style.js,测试见 test/client-card-style.test.mjs)。图标、TagSwitch 来自 shell 静态表模块 @deepseek-ai/dsh-client-ui-primitives。卡片默认折叠,与其它插件卡片行为一致。

卡片里可以配置:主模型(下拉,按 provider 分组,可用项在前、不可用项标 并置底)、兜底候选(最多 4 项,可增删、可上下移动调序)、风险容忍度、failOpenmode3OnAsk、超时、最大输出 token、拒绝反馈开关。改动后 header 出现「未保存」Tag 并启用「保存 / 放弃」;保存经 settings revision fence 写入并在 Host 侧 live 生效。

可用性来自 session.modelCatalog()failures 里的 provider 显示具体失败原因(如 401 额度),不在 routableProviders 里的 provider 标注“不可路由”;两种都仍可选,只是标红置底,避免冷却中的路由被藏起来。当前配置的 provider 若不在目录中,下拉会保留一个“(不在模型目录中)”项,防止静默改值。

配置变更通过 settings revision fence 保存,并在 Host 侧 live 更新运行时配置;正在进行的 judge 调用不会被中途替换。真实 provider failure 仍以审批日志中的脱敏 failure.code/message 为准;API key 不存入该 namespace。

审判模型是一条有序候选链:先试 provider/model,失败(AUTH/额度/上游 5xx/连接/超时)再依次试 fallbacks 里的每一项,按 provider+model 去重。第一个给出回复的候选胜出;全部失败时按主模型的失败信息记 ai-error(它才是配置意图),并附带 judgeAttempts/judgeTried。走兜底时成功记录会带 judgeModel(实际作答的模型)、judgeFallbackFrom(被跳过的主模型)与 judgeAttempts。候选链也读同一个 settings namespace 的 fallbacks 字段(最多 4 项),修改同样 live 生效;调用方取消(signal 已 abort)时不会再花下一次调用。

注意:链只在provider 层失败时推进。"模型答了但输出无法解析成 {risk, authorization, reason}" 仍按原逻辑走 failOpen,不会静默换模型。

上游 opencode-go 订阅到期后,cpa-wx301 上的 opencode/* 模型同样因渠道 auth_unavailable 不可用;ai.fallbacks 因此默认选 DeepSeek 官方 API(deepseek-official,即 DSH 原生 llm-deepseek 适配器,走 DEEPSEEK_API_KEY),与主模型同属 DeepSeek V4.x 家族但路由独立。

当前 DSH 0.1.2-rc.1 的 dsh-llm-pi-ai 安装产物还需要应用工作区中的 patches/dsh-llm-pi-ai-opencode-session.patch,让 opencode-go 请求把每个会话的 sessionId 映射为动态 x-opencode-session。该补丁不会影响其他 provider;全局 npm/npx 重装后需要重新应用。

配置(~/.dsh/profiles/web/cordis.patch.yml)

- id: dsh-codex-approval
  config:
    mode: ai                   # manual | ai | ai-auto(默认 ai)
    mode3OnAsk: deny           # deny | allow(ai-auto 下 ask 的归宿;默认 deny 安全)
    locale: auto               # auto | zh | en(命令文案语言;auto=跟随 dsh 设置的语言偏好)
    rules:
      - match: 'Bash(git status*)'   # 命中即自动通过(Codex approve-always)
        action: allow
      - match: 'Bash(rm -rf /*)'     # 危险命令直接拒绝(Codex reject-always)
        action: deny
      - match: 'reason:*credential*' # 敏感场景强制询问
        action: ask
    ai:
      enabled: true
      provider: cpa-wx301                      # 本机 CLIProxyAPI(Command Code 通道)
      model: command/deepseek/deepseek-v4.1-flash
      fallbacks:                               # 主模型失败时按序尝试(最多 4 项)
        - provider: deepseek-official          # DSH 原生 llm-deepseek(api.deepseek.com)
          model: deepseek-flash
      riskTolerance: medium          # low | medium | high(仿 Codex risk tolerance)
      maxPromptChars: 2000
      timeoutMs: 15000
      maxTokens: 512                 # 含 reasoning 余量
      failOpen: ask                  # AI 故障兜底:ask | deny | allow
    fallback: ask                    # 无规则命中且 AI 关闭时:ask | deny | allow
    denyFeedback: true               # 拒绝后向主 agent 注入归因更正消息(默认 true)
    denyFeedbackMax: 3               # 未注入拒绝队列上限(1-10)
    transcript: off                  # off | short:AI 审判是否带紧凑会话上下文(默认 off)
    transcriptMaxChars: 4000         # 上下文骨架字符上限(100-16000)
    logFile: ~/.dsh/logs/approval.jsonl

不配置即用内置默认:只读命令(git status/diff/log、ls、cat、pwd、which、echo)自动放行,破坏性命令(rm -rf /rm -rf ~sudo rmshutdownrebootmkfs)直接拒绝,敏感词(secret/password/credential/token)询问。