开源一件小工具:dsh-approval-center 审批中心

归类 · 历练 约 2 分钟读完

起点:一个烦人的 Bug

用 DSH(DeepSeek Harness)干活的时候,最怕的不是模型答错,而是——审批卡片消失了

DSH 的审批提示靠实时事件流驱动,浏览器标签页一切后台就节流连接,approval/requested 事件一错过,卡片就没了。agent 卡在那儿等你点「允许」,你却什么都看不见,回头一看:双向沉默,尴尬至极。

解法:不依赖事件,从状态重建

这个插件换了个思路——不追事件,读状态

每次渲染都从会话的 pending 状态重建待办列表。DSH 重连/replay 之后 pending 依然健在,所以审批入口永远可达

挂载点   conversation.input.dock(与内置 TODO 队列同款 dock 体系)
数据源   useSession((s) => s.pending)
答复     wait.respond({ ok: true, value: { outcome: "allowed-once" | "rejected" } })

效果就是在聊天输入框上方挂一条紧凑的待办坞:

  • ⚠️ 待审批的工具调用:工具名 + 原因 + ✓ 允许一次 / ✕ 拒绝
  • ❓ 智能体提问也会进坞提示
  • 没有待办时完全隐形,零干扰

一些设计上的小心思

  1. 零宿主代码——纯浏览器插件,host 端 no-op,装完即用
  2. 主题原生——全部用 DSH 的 --dsw-* 主题变量,深浅色自动协调
  3. 观感一致——宽度、间距自动跟随输入框,像亲生的
dsh plugin --profile web add dsh-approval-center

后记

期间还顺手修了上游一个更深的坑:DSH rc.7 重连时 resync() 会把 replay 回来的 pending 清掉,一闪而过。给上游 runtime 打了补丁才根治。

小工具解决小麻烦,但小麻烦天天见。开源地址:github.com/LflyIce/dsh-approval-center

# 开源# DSH# 插件开发# AI工具