DeepSeek Harness Hub
← 返回列表

JimChen-g/dsh-action-outbox

DeepSeek Harnessspec-screened在 GitHub 查看 ↗
未验证

面向 DeepSeek Harness 外部副作用的持久化 Batch Review…

尚未跑自动兼容性验证,可查看页面内的依赖与入口分析。 · 最近上游提交 2026/8/18 · 已提供中文文档

DeepSeek Harness 的批量审查收件箱——安全地暂存、检查、编辑、批准并提交精确的工具副作用。

综合分
28.3
GitHub 分
28.3
用户评分
★ Stars
2
周下载量
安装插件(需先安装 dsh CLI 引擎:npm install -g @deepseek-ai/dsh)
dsh plugin --profile web add JimChen-g/dsh-action-outbox
该插件未发布到 npm,走 GitHub 源安装(pnpm 若拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑)
数据截至 2026/9/19(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/schemastery@deepseek-ai/dsh-system-prompt@deepseek-ai/dsh-tools
用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动

README

dsh-action-outbox

面向 DeepSeek Harness 外部副作用的持久化 Batch Review Inbox:先暂存准确调用,查看或编辑完整 canonical JSON,再一次性批准不可变批次。

暂存不会调用目标工具。Review 会重新解析当前策略、工具身份、schema 与参数,返回 SHA-256 digest 和一次性 approval nonce;Commit 只接受这一对凭据,并按顺序让每个动作重新进入 DSH 原有工具流水线。

如果你希望 DSH Agent 保持高效,同时让外部写入更审慎、更透明,欢迎 Star——这会帮助更多 DSH 用户发现这个插件。

为什么需要它

Worktree 和文件 checkpoint 能恢复本地代码,却无法撤回已经发出的 Issue 评论、邮件、部署或付款。DeepSeek Harness 所依据的 Cordis 论文把这个系统边界讲得很明确:外部输出要么延迟到提交点,要么使用领域专属补偿。本插件实现前者——提交前不发出任何外部动作——同时不把多个外部系统伪装成原子事务。

v0.3 新增能力

- DSH Web 侧栏内的 Batch Review Inbox:显示完整参数、参数字节数、工具来源、工具指纹、action hash,并支持复制和下载。
- action_outbox_replace:可修改已暂存动作的工具、参数或摘要;编辑会立即作废旧 digest、nonce、review 与 approval。
- 超长审查安全门禁:被截断的审批卡片不能单独授权提交,必须先在 Inbox 中查看并确认完整内容。
- 0600 权限的持久化待提交状态:重启后只恢复为 needs_reapproval,清除旧审批状态,并重新检查当前策略、工具与 schema。
- 提交崩溃恢复:提交中断后进入 recovery_required;没有确定成功回执的动作标记为 ambiguous,绝不自动重试。
- Inbox 内置 Copy safe demo prompt 安全体验入口;过期批次进入历史区,不再占用待办角标,同时保留检查和清理入口。

安装

安装预构建的 Release tarball(无需授予安装时构建权限):

curl -LO https://github.com/JimchengChina/dsh-action-outbox/releases/download/v0.3.0/dsh-action-outbox-0.3.0.tgz
npx @deepseek-ai/dsh plugin --profile web add ./dsh-action-outbox-0.3.0.tgz

或安装带版本标签的 Git 源码:

dsh plugin --profile web add github:JimchengChina/dsh-action-outbox#v0.3.0

Git 安装会运行包内的 prepare 构建。使用 pnpm 10 或更高版本时,请按 DSH
报错提示,把确切的 dsh-action-outbox 包键加入该 profile 的
pnpm-workspace.yaml allowBuilds 映射,然后重试。锁定 tag 可防止分支后续
更新在不知情的情况下改变实际安装代码。

或从本地 checkout 安装:

dsh plugin --profile web add ./dsh-action-outbox

它是带 cordis.patch.yml 的 DSH bundle。浏览器端只使用 DSH 官方 sidebar.footer.action 和 shell.overlay 槽位。

第一次体验时,打开左下角 Outbox,点击 Copy safe demo prompt,把生成的文字粘贴到全新 DSH 会话。它只会暂存一个 /private/tmp 下的 no-clobber 文件写入,Review 后立即停止,不访问网络。过期批次默认不计入待办数量;点击 Show expired history 仍可查看或丢弃。

Agent 使用流程

1. action_outbox_begin({ label })
2. 一次或多次 action_outbox_stage({ tool, arguments, summary? })
3. 可调用 action_outbox_unstage({ action_id }) 删除,或调用 action_outbox_replace({ action_id, tool?, arguments?, summary? }) 修改
4. action_outbox_review()
5. 在 Batch Review Inbox 核对完整批次;若审批预览被截断,须在这里确认完整内容
6. 在 Inbox 编辑后点击 Run fresh review;批次变为 reviewed 后,该按钮会被 Next: copy exact commit prompt 取代。点击复制并粘贴到对话;仅在 Inbox 发生的 Review 不会自动进入聊天历史
7. action_outbox_commit({ expected_digest: digest, approval_nonce }),或调用 action_outbox_discard()

不要在 Inbox Review 后只告诉 Agent“使用最近一次 Review”。模型眼中的最近一次 Review 可能仍是聊天历史里旧的 action_outbox_review 工具结果。正确做法是粘贴 Inbox 生成的精确提交指令,或要求 Agent 在对话里调用 action_outbox_review,并立即提交该工具刚返回的 digest 和 nonce。

Commit 开始之前,Discard 能保证暂存的目标动作一个都没执行。任何批次修改都会生成新的授权状态,即使调用方仍保留旧 digest 或 nonce 也无法提交。

重启协议

open -> reviewed -> restart -> needs_reapproval
-> 重新解析当前策略/工具/schema
-> 新 digest + 新一次性 nonce
-> approve -> committing

committing -> crash -> recovery_required
-> 未确认结果的调用标记为 ambiguous
-> 永不自动恢复或重试

持久化记录绑定 DSH agent/session owner,并在 DSH 提供时记录 workspace。重启不会自动提交,不会复用审批 nonce,也不会把磁盘里保存的旧工具对象当成当前授权。

配置

- id: action-outbox
name: dsh-action-outbox
config:
include: ['github_', 'slack_', 'deploy_']
exclude: ['github_get_', 'github_list_']
enforce: ['github_create_', 'github_update_', 'slack_send', 'deploy_']
requireApproval: true
rejectDuplicateActions: true
persistPending: true
stateFile: ''
maxPendingMs: 1800000
maxActions: 20
maxArgumentBytes: 65536
resultPreviewChars: 2000
approvalPreviewChars: 4000

- include:允许暂存的工具通配模式。
- exclude:暂存与强制策略共同使用的例外。
- enforce:匹配工具禁止直接调用,必须走 Outbox;为兼容现有部署,默认空数组。
- requireApproval:对最终 digest/nonce 请求一次整批审批;没有审批服务时安全拒绝。
- rejectDuplicateActions:拒绝工具名和参数完全相同的重复动作;Replace 也会检查。
- persistPending:持久化有界草稿和恢复回执;默认开启。
- stateFile:可选路径;空值使用 $DSH_HOME/action-outbox/state.json,未设置 DSH_HOME 时使用 ~/.dsh/action-outbox/state.json。
- maxPendingMs:未提交批次的有效期;默认 30 分钟,设为 0 关闭过期。
- maxActions / maxArgumentBytes:限制持久化状态大小。
- resultPreviewChars:限制模型侧结果回执长度。
- approvalPreviewChars:紧凑审批卡片上限。超出时必须在 Inbox 确认完整内容;没有 Inbox 的 headless/TUI 部署需要把此值提高到足以完整显示批次,否则系统会按设计拒绝提交。

只有 * 是通配符,其余正则字符都按普通字符匹配。

安全语义

- 暂存与编辑零派发。 只修改有界本地状态,不调用目标工具。
- 完整审查可见性。 Inbox 保留完整 canonical JSON;紧凑卡片会明确标记截断,且不能成为唯一审批依据。
- TOCTOU 防护。 在相应边界校验 digest、一次性 nonce、实时工具对象身份、结构化工具指纹、schema 和策略。
- 修改即撤销授权。 Stage、Unstage、Replace 都清除旧 review、确认状态与 nonce。
- 重启重新授权。 待提交草稿只恢复为 needs_reapproval,通过实时 preflight 后获得新 nonce。
- 派发前持久化。 第一个外部调用之前先落盘 committing;每个成功动作完成后再持久化回执。
- 不削弱 DSH 控制。 提交动作仍经过权限、沙箱、hooks、guards、取消和结果观察。
- 浅层授权。 enforce 例外只覆盖准确暂存的直接调用,不会传递给后代调用。
- 严格串行、首错停止。 不自动重试失败或恢复后状态不确定的动作。
- 不承诺虚假回滚。 前序成功动作不会因为后续失败而消失,也不会臆造通用补偿。

局限

- 它不是跨工具、跨服务的分布式原子事务。
- 无法通用撤销已成功动作,也无法仅凭超时判断外部写入是否发生。
- 目标工具自己的审批策略仍然有效,因此 Commit 期间可能再次询问。
- 参数会出现在 DSH 工具/会话历史中;开启持久化后也会写入本地 0600 文件。不要暂存原工具本就不应暴露的秘密。
- 工具指纹覆盖声明的名称、描述、schema 与 timeout,用于发现结构漂移;它不是对插件实现代码或来源的密码学签名。
- Inbox 继承 DSH Web 的访问边界,不额外提供独立多用户认证。
- Enforcement 只覆盖 DSH 工具注册表调用,不是针对恶意同进程代码的沙箱。
- 后续规划依赖返回值的读取工具应正常调用,不应暂存。

功能对比、重复项目扫描和论文依据见研究说明;共享主机部署前请阅读安全策略与威胁模型。

开发

pnpm install
pnpm verify

pnpm build 会在 lib/client.js 生成 DSH 模块加载器产物;根目录的 client.js 是浏览器端源码输入,不会被直接提供给 Web 页面。

MIT

上游仓库有新提交时邮件通知你(每天最多一封,无更新不打扰),随时一键退订。

💬 加入 DPharness 群聊

插件用法、部署报错、新插件第一时间同步——群里问,比一个人翻文档快。

点击加入 QQ 群
DPharness 群聊二维码,手机 QQ 扫码进群
扫码进群