Repository navigation
Releases
v0.7.7
变更
- 审批台账落盘(
approvals.json,0600、原子替换):每会话的放宽额度、本桥创建的会话所有权、尚未还清的放宽欠账都跨重启保留;启动时把上一个进程留下的放宽收回。 history补上期限:新增historyBudgetMs(默认30000ms,钳制 100–120000),读不到就以-32005结束,不再无限等待;关闭事件流也改成有界(最多等 1 秒),Host 卡住不会再把答案一起拖住。- 文档:中英 README 逐节对齐;
docs/release.md重写为可执行的手册,并新增 Release 正文模板(本正文即按该骨架写)。
说明
- 等待仍是分片循环:单次 HTTP 响应活不过五分钟(Node fetch 的 300 s
headersTimeout,实测 303.9 s 报fetch failed),片长由maxWaitSliceMs控制(默认 120000,上限 240000)。CLI 与 MCP 工具已自动续等,自己写客户端要自己切片。 - 审批任务停在待批时会立刻返回:
approvals.mode=delegate下,轮次若因等你回答而停下,dsh_ask/dsh_wait返回status:"waiting-approval"与pendingApproval,而不是死等到deadlineMs。 - 已知边界:① token 对桥创建的子会话可读(同机同用户),
delegate防的是误操作与提示注入,不防同用户进程自我批准;② 闸门只拦工具参数里的sandbox_permissions,configure改预设被禁止,但"创建会话时调用方自选预设"不受闸门约束;③ 放宽额度按会话,重启不再清零,新建会话仍重新计三次。
验证
| 项 | 结果 |
|---|---|
| 单测(十套件) | methods 76 · mcp-format 19 · registry 8 · pending 36 · approvals 11 · approval-state 8 · wait 6 · abort 7 · client 6 · status 6 = 182 例 |
| 真宿主集成 | test/host.test.mjs 1 例 |
| 端到端 / 边界 | test/e2e.mjs 14 例、test/edge.mjs 24 例(最近一次运行 2026-11-05) |
| 版本一致性 | check:version → version ok: 0.7.7 |
| 打包完整性 | check:package → 32 files, 485.2 KB unpacked, 172.3 KB packed |
| CI | 合入提交 27c09df 的 test run #42220725409 双绿(Node 22.x / 24.x) |
本机沙箱限制:
abort套件里一条用例需要spawn子进程,在workspace-write下被以EPERM拒绝,因此本机npm test退出码为 1(170 通过 / 该例环境性失败);同一提交的 CI 在无此限制的环境下双绿,故以 CI 为发布依据。这是环境边界,不是代码失败。
安装
dsh plugin add @punchact/dsh-rpc-agent@0.7.7v0.7.6
v0.7.6
从 npm 上现存的 0.5.3 起算,这一版把 0.5.4 → 0.7.6 四个版本一起交付。
变更
0.5.4 · 长调用不再被单次 HTTP 请求的寿命卡死
- 等待预算按 120 秒切片循环,片长默认 120 s、硬上限 240 s;
dsh.discover回报maxWaitSliceMs,被钳制时另报maxWaitSliceMsRequested。 - 截止不再只靠中止:读流与既有截止赛跑,超时立刻收成本次结果,不等宿主交还控制权。
- 清理有界:事件流的
return()最多等 1 秒,答案不依赖清理是否完成。
0.6.0 · 调用方断开时中止,并把非失败结局与错误分开计
res.on("close")→ 中止本次调用;轮次照旧继续,桥只是不再空等。- MCP 的
notifications/cancelled真的会中止在途调用。 /status新增calls.outcomes: { timeouts, cancelledByClient };被中止的调用不再计入errors。
0.7.0–0.7.6 · 无人值守会话撞上审批墙时,桥能回绝,也能把决定交回派发方
- 三档
approvals.mode:off(默认)/deny(桥直接回绝升权)/delegate(派发方 agent 回答)。 - 两个新方法:
dsh.approvals.pending(长轮询 ≤120 s)与dsh.approvals.resolve。 - 轮次停在待批时立刻返回
status: "waiting-approval"与pendingApproval,而不是把调用方拖到超时。 allow-once只在被批准的那次调用期间放宽预设,调用结束(或下游拒绝、或 5 分钟兜底到期)即恢复;同一会话同一时刻只允许一条待批。- 按两轮独立审计收窄:决策包递归脱敏并带
untrusted标记、所有权只认桥创建的会话、改预设走所有权与模式校验、闸门任何异常都降级放行。
说明
approvals.mode默认仍是off:不开就与旧版行为一致,升级不会改变任何现有会话的行为。- 已知边界(本轮不修):子会话与桥同用户,能读到
~/.dsh/dsh-rpc/token,因此delegate挡不住「拿到 token 的子代理自己批准自己」。默认off时不触发;开启前请确保子代理可信。 - 3 次升权额度与所有权记录仍在内存,宿主重启后清零。
验证
- 单元/契约:172 例通过(methods 74、mcp-format 19、pending 36、approvals 11、registry 8、wait 6、abort 6/7、client 6、status 6)+ 宿主集成 1 例 +
catalogue ok。唯一未通过的是abort套件里那条需要child_process.spawn的用例,在本机沙箱里报EPERM,CI 上通过。 - 打包:
31 files, 432.3 KB unpacked, 153.8 KB packed。 - 真宿主端到端(本机 profile):allow-once、reject、到期、取消、preset 上报五条路径全部跑通;批准后命令确实按新预设执行,拒绝/到期/取消时命令确实未执行。
- CI:
main的 run 42214271524 双绿(Node 22.x / 24.x)。
安装
dsh plugin add @punchact/dsh-rpc-agent
或在 profile 里 install_bundle("@punchact/dsh-rpc-agent@0.7.6")。MCP 侧接法见 README 的「接进 MCP 客户端」一节。
v0.5.3
变更
dsh.discover现在返回config(defaultTimeoutMs、maxWaitSliceMs等),MCP 层的默认预算与提示文案从这里读,不再各自复制一份。
说明
0.5.1 与 0.5.2 都没有发布到 npm,这一版把三段改动一并带上:
- PR #9:MCP 渲染三处(句柄不再打印
turn ?、completed不再重复打印reason、错误不再 dump 已经说过的字段);红队审计提出的reason判据与两处测试守门;以及prompt丢失model/reasoningEffort参数——它此前只读sessionId/text/mode,静默落回会话默认模型。 - PR #10:等待改成分片循环。Node 内建 fetch 的 300 秒
headersTimeout会掐死任何"静默五分钟才回响应"的请求(实测 303.9 秒报fetch failed),这与推荐的timeout_ms: 600000直接冲突。 - PR #11:
dsh.discover此前只回plugin/version/protocol/transport/methods,没有config——于是 0.5.2 里"默认值只有一个来源"在实现上并不成立,客户端读到undefined就退回写死的 600000。现在由测试守着这条契约。
验证
- 单元与集成:
methods68、mcp-format18、wait3、registry8、client6、status6、host1、catalog.smoke14 项全过 check:version→version ok: 0.5.3;check:package→ 27 files、340.4 KB unpacked- 现网分片证据:
waitForTurn对真桥,片长 3000 ms、预算 9000 ms →slices: 3、waitedMs: 9015、wallClockMs: 9015;dsh-rpc wait --timeout 20000准时 20.0 秒返回 - CI:PR #11 的 run
42156700937双绿;合并后 main 的 run42157124395双绿 - 未验证项:片长 240 秒的单次
wait在超大会话(19008 条事件)上跑过一次 13 分钟未返回,原因未查明
安装
dsh plugin add @punchact/dsh-rpc-agentv0.4.4
变更
- 发布流水线(
.github/workflows/release.yml):发布 job 不再向setup-node传registry-url;toolchain步骤打印node/npm版本并检测 OIDC 请求端点是否可用;publish步骤改为仅在存在NPM_TOKEN时写入~/.npmrc - 版本号 0.4.3 → 0.4.4(
package.json、lib/version.mjs) CHANGELOG.md增补 0.4.4 段
说明
本版没有运行时改动,只改发布流水线与版本号。
背景:由 GitHub Release 触发的发布连续两次以 npm error code ENEEDAUTH 失败。根因既不在令牌,也不在 npm 侧的信任关系条目:setup-node 收到 registry-url 后会写入一行
//registry.npmjs.org/:_authToken=${NODE_AUTH_TOKEN}
仓库没有配置 NPM_TOKEN 时,该行展开为空令牌,npm 判定"凭证存在但不可用"并直接拒绝,根本不会进入 OIDC 交换。移除 registry-url 后,本版由 Trusted Publishing(OIDC)发布成功,首次带上 SLSA provenance。
验证
- 干跑(
workflow_dispatch+dry_run=true):verify全绿;发布 job 输出node v24.22.1, npm 11.19.1与OIDC: request endpoint present — id-token: write is in effect,唯一报错是版本已存在(You cannot publish over the previously published versions: 0.4.3),即认证已经通过 - 正式发布(release 事件):
verify与publish两个 job 均为 success;日志含no NPM_TOKEN secret configured — relying on Trusted Publishing (OIDC)与+ @punchact/dsh-rpc-agent@0.4.4 - 注册表核对:
latest = 0.4.4,25 个文件,unpacked 264843 B,shasum9b897d15219884a98eb753c93eb0e5e975fee9af - provenance:
GET https://registry.npmjs.org/-/npm/v1/attestations/@punchact%2Fdsh-rpc-agent@0.4.4→200,predicate 含npm publish/v0.1与https://slsa.dev/provenance/v1 - 本地套件:单元测试 41、客户端 6、状态页 6、真宿主集成 1、方法目录冒烟 1,全部通过;
node scripts/check-package.mjs25 个文件
安装
dsh plugin add @punchact/dsh-rpc-agentv0.4.3
变更
docs/design.md不再出现开发早期的包名,只保留"改过一次包名"这件事本身的描述- 测试夹具的示例路径改用中性的
/home/dev/... - 仓库历史一并重建:早期提交里写死本机绝对路径的那几行、以及早期包名,已从历史中抹去
说明
这一版没有任何运行时变更。发版是为了让 npm 上的 latest 指向不含这些字样的产物。
验证
npm run check:version→version ok: 0.4.3- 单元测试 41 项、客户端 6 项、状态页 6 项、真宿主集成 1 项、冒烟检查 1 项,全部通过
node scripts/check-package.mjs→ 25 个文件、258.0 KB unpacked、91.6 KB packed- 全新 clone 复核:12 个可达提交中
andy/C:\Users/ 插件项目路径 0 命中