@feng0531/dsh-execution-bus 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/bus.js +18 -2
- package/docs/FLOW-TEST.md +38 -0
- package/docs/RELEASING.md +1 -1
- package/docs/releases/0.1.0.md +1 -1
- package/docs/releases/0.1.1.md +18 -0
- package/docs/validation.md +1 -1
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# 执行总线 / Execution Bus
|
|
2
2
|
|
|
3
|
-
DSH 独立插件 **@feng0531/dsh-execution-bus 0.1.
|
|
3
|
+
DSH 独立插件 **@feng0531/dsh-execution-bus 0.1.1**,用于让模型提出一次执行请求后,由程序排队、等待和收集结果,而不是反复询问是否完成。
|
|
4
4
|
|
|
5
5
|
**当前是第一阶段可运行原型、部分完成,不是完整生产验收。只做插件,不修改 DSH。** 不增加模型或 Agent,不是工作流引擎、PTC 包装或任意命令执行服务,也不会改动其他插件。它不能解决模型理解错误、不断改变方案等所有推理问题。
|
|
6
6
|
|
package/dist/bus.js
CHANGED
|
@@ -41,6 +41,14 @@ export function parse(raw) {
|
|
|
41
41
|
throw Error("MESSAGE_TOO_LARGE");
|
|
42
42
|
return structuredClone(m);
|
|
43
43
|
}
|
|
44
|
+
function freezeJson(value) {
|
|
45
|
+
if (value && typeof value === "object") {
|
|
46
|
+
for (const child of Object.values(value))
|
|
47
|
+
freezeJson(child);
|
|
48
|
+
Object.freeze(value);
|
|
49
|
+
}
|
|
50
|
+
return value;
|
|
51
|
+
}
|
|
44
52
|
const terminal = (s) => !["queued", "running"].includes(s);
|
|
45
53
|
/** Volatile single-process bus; no acceptance durability or automatic execution retry. */
|
|
46
54
|
export class ExecutionBus {
|
|
@@ -206,6 +214,7 @@ export class ExecutionBus {
|
|
|
206
214
|
throw Error("EXPECTED_CONTROL");
|
|
207
215
|
if (Object.keys(m.payload).length)
|
|
208
216
|
throw Error("INVALID_CONTROL");
|
|
217
|
+
this.sweep();
|
|
209
218
|
const e = this.get(owner, m.requestId);
|
|
210
219
|
const previous = e.messages.get(m.messageId), fingerprint = canonical(m);
|
|
211
220
|
if (previous && previous !== fingerprint)
|
|
@@ -240,7 +249,7 @@ export class ExecutionBus {
|
|
|
240
249
|
if (error)
|
|
241
250
|
e.view.error = error;
|
|
242
251
|
this.emit(e, state, { state });
|
|
243
|
-
e.resolve(this.view(e));
|
|
252
|
+
e.resolve(freezeJson(this.view(e)));
|
|
244
253
|
e.listeners.clear();
|
|
245
254
|
}
|
|
246
255
|
pump() {
|
|
@@ -278,7 +287,14 @@ export class ExecutionBus {
|
|
|
278
287
|
this.emit(e, "progress", { percent: pct });
|
|
279
288
|
},
|
|
280
289
|
});
|
|
281
|
-
|
|
290
|
+
let json;
|
|
291
|
+
try {
|
|
292
|
+
json = JSON.stringify(result);
|
|
293
|
+
}
|
|
294
|
+
catch {
|
|
295
|
+
this.finish(e, "unknown", undefined, "RESULT_NOT_RETAINED");
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
282
298
|
if (json === undefined ||
|
|
283
299
|
Buffer.byteLength(json) > this.options.resultBytes) {
|
|
284
300
|
this.finish(e, "unknown", undefined, "RESULT_NOT_RETAINED");
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# 不安装插件的流程测试
|
|
2
|
+
|
|
3
|
+
## 本次执行方式与边界
|
|
4
|
+
|
|
5
|
+
当前会话没有 execution_bus 工具,桌面配置未安装本插件。本次由当前会话运行测试命令,在独立进程中加载本仓库编译产物及真实 DSH npm 组件;不修改日常配置、不热注入运行宿主、不重启 DSH。
|
|
6
|
+
|
|
7
|
+
这能验证真实 AgentLoop、SessionStore、ToolRuntime、Job 与 read 组件路径;不等于本会话实际调用 execution_bus,不验证真实桌面 UI、PTC 进程或真实模型。真实 AgentLoop 测试使用脚本模型适配器,read 组件测试使用测试 Agent 身份。两条测试不能合称当前会话端到端通过。
|
|
8
|
+
|
|
9
|
+
## 重复运行
|
|
10
|
+
|
|
11
|
+
1. npm ci --include=dev --ignore-scripts
|
|
12
|
+
2. npm run test:flow:流程回归、真实宿主执行组件、真实 AgentLoop 原调用结果关联。
|
|
13
|
+
3. npm run check:包含核心队列、安全和发布门禁的全部测试。
|
|
14
|
+
4. npm run verify:package:包白名单。
|
|
15
|
+
|
|
16
|
+
流程包括:正常成功/失败、读文件、权限拒绝、匿名请求拒绝、重复请求只新增一个 Job、工具取消、插件关闭、进度不作为聊天消息、原调用只提交一次后才继续下一模型适配器请求。
|
|
17
|
+
|
|
18
|
+
## 本次可复现问题
|
|
19
|
+
|
|
20
|
+
| 问题 | 修复前证据 | 本地修复 | 影响范围 |
|
|
21
|
+
|---|---|---|---|
|
|
22
|
+
| core 返回的 done 结果对象共享且可修改 | 第一个消费者将 state/result 改写后,第二次同请求取得被修改值 | 深度冻结终态快照 | core 扩展接入;不能据此声称模型能修改宿主冻结结果 |
|
|
23
|
+
| Handler 完成但结果 JSON.stringify 抛错被记为 failed | 返回 BigInt 的一次执行被误记 failed | 保存异常为 unknown / RESULT_NOT_RETAINED,不重跑 | 当前内置只读/测试返回值正常;扩展 Handler 有风险 |
|
|
24
|
+
| 结果超期查询未检查 TTL | 无新 request 时,过期 result 仍可读 | command 查询前 sweep | 查询/重取/取消均遵守结果保存期 |
|
|
25
|
+
|
|
26
|
+
三个测试在修复前均失败;修复后全量 24/24 通过。这些修复归入 0.1.1 补丁发布;不改变已有 0.1.0 标签或公开包。发布状态以 GitHub Release 和 npm 公开结果为准。
|
|
27
|
+
|
|
28
|
+
## 优化建议
|
|
29
|
+
|
|
30
|
+
1. 已优化:终态结果不可变;保存失败明确区分执行失败;查询触发 TTL 回收,无常驻清理定时器。
|
|
31
|
+
2. 后续可优化:完成请求重取无需新建短暂 Job;现在不会重复执行,但会产生不必要的 UI 生命周期事件。
|
|
32
|
+
3. 后续可优化:每个重复附着仍注册一个空进度监听器;可将进度观察者绑定到共享逻辑请求,避免消耗 32 个监听者限额。
|
|
33
|
+
4. 后续可优化:宿主 read 取消错误仍统一映射 HOST_READ_FAILED,保守归为 unknown。应保留经过白名单验证的取消类型,而不泄露原始异常文本。
|
|
34
|
+
5. 不建议盲目改动:取消一个附着工具会请求取消整个逻辑执行,是当前明确语义;改成仅取消等待者需要单独设计宿主 drain、Job 通知和结果留存,不能只 Promise.race 后抛弃原执行。
|
|
35
|
+
|
|
36
|
+
## 真实当前会话测试前提
|
|
37
|
+
|
|
38
|
+
只有宿主通过正常插件加载向当前 Agent 注册工具后,才可能真正执行 await tools.execution_bus。当前没有暴露可用的临时插件注册工具,不能用额外 Node 进程、伪造 sessionId 或追加聊天结果来替代。若后续要测试真实当前会话,需要另行授权安装/加载并确认工具可见;本次未执行安装。
|
package/docs/RELEASING.md
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
|
|
15
15
|
## 发布门禁
|
|
16
16
|
|
|
17
|
-
用户已授权 0.1.0 正式发布,并确认沿用 dsh-vcs 的非商业源码公开许可证。该许可不是 OSI 开源许可证,限制商业项目内部使用与有偿交付,具体以 LICENSE
|
|
17
|
+
用户已授权 0.1.0 正式发布,并确认沿用 dsh-vcs 的非商业源码公开许可证。该许可不是 OSI 开源许可证,限制商业项目内部使用与有偿交付,具体以 LICENSE 为准。用户已持续授权本项目每轮改动完成并验证通过后主动正式发布,无需逐次提醒;仍必须通过工作流确认与完整门禁,不表示实际模型验收通过。版本采用 vX.Y.Z:X 大版本、Y 小版本/新增功能、Z BUG 修复;发布不自动安装或重启 DSH。
|
|
18
18
|
|
|
19
19
|
准备正式发布前:由用户明确授权;确定 LICENSE 与包 license 字段;检查公开材料、第三方许可和敏感信息;更新版本、锁文件与发布说明;提交并推送已批准的版本标签;等待四矩阵通过。
|
|
20
20
|
|
package/docs/releases/0.1.0.md
CHANGED
|
@@ -14,4 +14,4 @@
|
|
|
14
14
|
|
|
15
15
|
## 验证
|
|
16
16
|
|
|
17
|
-
真实宿主组件与 AgentLoop 内存会话采用脚本模型隔离测试;不能当作真实模型端到端通过。具体本地测试数与检查结果见 docs/validation.md。GitHub
|
|
17
|
+
真实宿主组件与 AgentLoop 内存会话采用脚本模型隔离测试;不能当作真实模型端到端通过。具体本地测试数与检查结果见 docs/validation.md。2026-10-15 正式发布完成:Windows/Ubuntu × Node 22/24 四项标签 CI 全部通过,发布工作流成功。npm latest 为 0.1.0;npm 与 GitHub 实际下载包均为 22,017 字节,与候选逐字节一致,SHA-256 为 9b5f57d829c2238d0bed8548e17633a67b15a5358b792df0d492071a261529ce。
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# 执行总线 0.1.1
|
|
2
|
+
|
|
3
|
+
## 本版变化
|
|
4
|
+
|
|
5
|
+
本版为 BUG 修复,无新增业务执行能力。
|
|
6
|
+
|
|
7
|
+
- 修复 core 多个结果消费者共享可修改终态快照,可能污染后续重复请求结果的问题;终态快照改为深度冻结。
|
|
8
|
+
- 修复 Handler 已完成但返回值无法 JSON 序列化时被误记执行失败的问题;记录为 unknown / RESULT_NOT_RETAINED,不自动重跑。
|
|
9
|
+
- 修复没有新请求时过期结果仍能查询/重取的问题;控制消息入口补上 TTL 清理。
|
|
10
|
+
- 增加不安装插件的可复用流程测试命令 npm run test:flow,以及三项修复前失败、修复后通过的回归测试。
|
|
11
|
+
|
|
12
|
+
## 安装与许可
|
|
13
|
+
|
|
14
|
+
npm 包 @feng0531/dsh-execution-bus@0.1.1,兼容目标 DSH 0.2.0-rc.2;建议先用隔离配置。非商业源码公开许可,具体以 LICENSE 为准。发布不自动安装、升级或重启日常 DSH。
|
|
15
|
+
|
|
16
|
+
## 验证与限制
|
|
17
|
+
|
|
18
|
+
本地全量 24/24 测试通过;真实宿主组件、AgentLoop 内存会话均为隔离测试,模型侧使用脚本适配器,不等于当前会话直接调用 execution_bus。真实模型、GUI、PTC 和桌面沙箱未验收;不持久化、不支持跨重启恢复。正式发布仍需同标签四矩阵 CI、包白名单、候选一致性、隔离安装与公开 npm 包核验全部通过。
|
package/docs/validation.md
CHANGED
|
@@ -40,7 +40,7 @@ npm test:**21/21 通过**。本地 tgz 已在 artifacts/package-check 独立
|
|
|
40
40
|
|
|
41
41
|
参考 dsh-vcs 配置标签/手动 CI:Windows/Ubuntu × Node 22/24;普通分支和 PR 不触发。新增版本/锁文件/标签一致性、包严格白名单、全新临时目录生产依赖安装、工作流 YAML 契约和许可证缺失拒绝测试。本地 Windows/Node 24 的 check、verify:package、pack:candidate、test:install 通过,npm audit 为 0 漏洞。
|
|
42
42
|
|
|
43
|
-
发布仅手动确认后运行,需精确标签 CI 成功且四份候选与重建包逐字节一致;先 npm 上传并验证公开实际字节,再创建 GitHub Release。用户已确认非商业许可证并授权正式发布;预检仍验证明确确认词及完整 LICENSE
|
|
43
|
+
发布仅手动确认后运行,需精确标签 CI 成功且四份候选与重建包逐字节一致;先 npm 上传并验证公开实际字节,再创建 GitHub Release。用户已确认非商业许可证并授权正式发布;预检仍验证明确确认词及完整 LICENSE。2026-10-15:v0.1.0 标签 CI 四矩阵成功(运行 38705851984),联合发布成功(38706021548)。GitHub Release 非草稿、非预发布;npm latest 为 0.1.0。公开 npm/GitHub 包均为 22,017 字节,与候选逐字节一致,SHA-256:9b5f57d829c2238d0bed8548e17633a67b15a5358b792df0d492071a261529ce。npm-release 环境此前不存在,未配置维护者保护审批,发布使用用户授权及工作流明确确认门禁。
|
|
44
44
|
|
|
45
45
|
## 已完成 / 部分完成 / 后续
|
|
46
46
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@feng0531/dsh-execution-bus",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"private": false,
|
|
6
6
|
"license": "SEE LICENSE IN LICENSE",
|
|
@@ -27,6 +27,7 @@
|
|
|
27
27
|
"test": "npm run build && node --test test/*.test.mjs",
|
|
28
28
|
"pack": "npm pack",
|
|
29
29
|
"check": "npm test",
|
|
30
|
+
"test:flow": "npm run build && node --test test/flow-regression.test.mjs test/host.test.mjs test/agent-loop.test.mjs",
|
|
30
31
|
"prepack": "npm run check && npm run verify:package",
|
|
31
32
|
"verify:package": "node scripts/verify-package.mjs",
|
|
32
33
|
"test:install": "node scripts/test-install.mjs",
|