@feng0531/dsh-execution-bus 0.1.1 → 0.1.2

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 CHANGED
@@ -1,54 +1,112 @@
1
1
  # 执行总线 / Execution Bus
2
2
 
3
- DSH 独立插件 **@feng0531/dsh-execution-bus 0.1.1**,用于让模型提出一次执行请求后,由程序排队、等待和收集结果,而不是反复询问是否完成。
3
+ **让模型发出一次执行请求,由程序负责排队、等待和收取结果。**
4
4
 
5
- **当前是第一阶段可运行原型、部分完成,不是完整生产验收。只做插件,不修改 DSH。** 不增加模型或 Agent,不是工作流引擎、PTC 包装或任意命令执行服务,也不会改动其他插件。它不能解决模型理解错误、不断改变方案等所有推理问题。
5
+ DSH 独立插件:`@feng0531/dsh-execution-bus` · 当前版本 **0.1.2**
6
6
 
7
- ## 已实现
7
+ > 当前是早期可运行版本,不是完整生产验收版。已验证真实 DSH 组件和脚本模型驱动的内存会话;真实模型、桌面界面和 PTC 完整链路尚未验收。**不支持重启后恢复任务。**
8
8
 
9
- - 版本化协议和运行时校验;有界 FIFO、并发限制、请求冲突检测、同请求执行复用。
10
- - 原工具调用异步等待终态;复用宿主 Job 进度、取消和等待,无模型轮询。
11
- - test:延迟、百分比、成功、失败、合作取消。
12
- - host.read:出队时通过宿主工具注册表调用现有 read,保留当前身份、工作目录、权限及输出限制,不自行读文件或启动进程。
13
- - 内存结果保存、大小限制、清理和关闭;失败日志不包含异常原文。
9
+ ## 它解决什么问题?
14
10
 
15
- ## 明确不支持 / 未验证
11
+ 执行一个稍慢的任务时,模型不应该反复问“做完了吗”,也不应该因为等得久就重新执行。执行总线把这些协调工作交给程序:
16
12
 
17
- - 不持久化,不支持重启保留队列或恢复原工具调用,不自动重跑。
18
- - 真实 AgentLoop 内存会话提交/继续已通过脚本适配器验证;GUI 实际展示、真实模型继续推理、磁盘会话提交与 PTC 完整链路未验证。
19
- - 没有外部 Handler 传输、跨插件 Handler 服务、非幂等执行对账;不是全要求验收完成版。
13
+ | 问题 | 执行总线的处理方式 |
14
+ |---|---|
15
+ | 请求提交后不知道是否接收 | 校验参数后受理;队列满则明确拒绝,不假装成功 |
16
+ | 任务还没完成,模型反复查询 | 原工具调用保持异步等待,完成后才返回 |
17
+ | 同一次请求重复提交 | 在同一会话、同一存活实例和保存期内,共用一次执行 |
18
+ | 重复或迟到的进度到达 | 按序号处理,忽略旧进度和终态后的进度 |
19
+ | 取消时不确定任务是否真的停了 | 区分“已请求取消”和“已确认取消” |
20
20
 
21
- 详见 [宿主调用链与兼容性](docs/host-compatibility.md)、[协议和状态](docs/protocol.md)、[验证记录](docs/validation.md)。
21
+ 它只是**执行协调层**,不是新的模型或 Agent,不是工作流引擎,也不是对所有工具的全局拦截器。它不能解决模型理解错误、反复改变方案等推理问题。
22
22
 
23
- ## 构建与测试
23
+ ## 它如何运作?
24
24
 
25
- 需要 Node.js >=22(本次使用 24.21.0)和 npm。开发环境依赖安装限定本仓库,不触及日常 DSH。
25
+ 可以把它理解为一个“执行服务台”:会话递交带编号的请求,服务台排队,指定处理器执行,最后把回执交回原来的窗口。
26
26
 
27
- ```powershell
28
- npm ci --ignore-scripts
29
- npm test
30
- npm run build
31
- npm pack --ignore-scripts
32
- npm run verify:package
33
- npm run test:install
27
+ ### 一次请求的完整流程
28
+
29
+ ```mermaid
30
+ flowchart TD
31
+ A[DSH 会话中的模型提出请求] --> B[调用 execution_bus 工具]
32
+ B --> C{参数有效且容量允许?}
33
+ C -->|否| D[明确返回校验错误或背压错误]
34
+ C -->|是| E{同一会话已有相同 requestId?}
35
+ E -->|输入不同| F[拒绝请求编号冲突]
36
+ E -->|输入相同| G[复用已有执行或保存结果]
37
+ E -->|新请求| H[受理并进入内存队列]
38
+ H --> I[有空闲名额后分发给 Handler]
39
+ I --> J[测试处理器 或 宿主 read 工具管线]
40
+ J -.进度.-> K[宿主 Job 状态更新]
41
+ J --> L[记录最终执行状态与结果]
42
+ G --> M[原工具调用异步等待结果]
43
+ L --> M
44
+ M --> N[由 DSH 把结果提交给原工具调用]
45
+ N --> O[会话继续推理]
34
46
  ```
35
47
 
36
- 标签 CI、四矩阵测试与受控发布见 [发布流程](docs/RELEASING.md)。采用[非商业源码公开许可证](LICENSE),非 OSI 开源许可证;正式发布必须通过同标签 CI 和工作流门禁。发布不安装或重启 DSH。
48
+ **图里的“等待”不是阻塞宿主线程,也不是让模型不断查询。** 工具返回的是一个尚未完成的异步操作,DSH 在它完成后继续。队列执行与等待同时进行;进度更新走宿主任务机制,不把每条进度变成聊天消息。
49
+
50
+ 若阅读器不支持 Mermaid,上图的主线是:
51
+
52
+ ```text
53
+ 模型提出请求 → 工具校验 → 内存排队 → Handler 执行
54
+ │
55
+ 进度 → 宿主 Job 状态
56
+ │
57
+ 原工具调用保持等待 ← 最终状态与结果 ←──────┘
58
+ │
59
+ └→ DSH 提交原调用结果 → 会话继续
60
+ ```
61
+
62
+ ### 谁负责什么?
63
+
64
+ | 部分 | 责任 |
65
+ |---|---|
66
+ | 模型 | 提出请求,收到结果后继续判断 |
67
+ | 执行总线 | 请求编号、排队、并发、重复请求、状态和结果保存 |
68
+ | Handler(处理器) | 完成某一种具体工作,响应取消并报告进度 |
69
+ | DSH 宿主 | 工具调用身份、权限、执行管线、Job 任务状态和原调用结果提交 |
70
+
71
+ **受理 ≠ 执行成功,执行完成 ≠ 会话已经收到结果。** 插件只沿原工具调用返回,不通过追加聊天消息伪造恢复。
72
+
73
+ ## 现在能执行哪些任务?
74
+
75
+ | Handler 名称 | 用途 | 输入 |
76
+ |---|---|---|
77
+ | `test` | 检查延迟、进度、成功、失败和取消 | `delayMs`:0–30000;`fail`:布尔值 |
78
+ | `host.read` | 经由 DSH 现有 `read` 工具读取文本 | `file_path`;可选 `offset` 和 `limit`,最多 100 行 |
79
+
80
+ `host.read` 在出队时重新进入宿主工具管线,沿用宿主当前权限、会话工作目录及输出限制。插件不自行启动命令、不提供任意远程执行服务。它也不会强制将现有工具改成总线调用。
81
+
82
+ ## 安装前先确认
83
+
84
+ - 兼容目标:**DSH 0.2.0-rc.2 / Cordis 4.0.4**,Node.js 22 或以上。其他宿主版本未承诺兼容。
85
+ - 建议先选择**隔离的 DSH 配置**试用,不直接更改日常环境。
86
+ - 目标组合需要可见的工具注册表、Job 服务、现有 Job 控制工具;读取任务还需要宿主 `read`。
87
+ - 安装 npm 包不等于插件已经加载;**只有当前会话能看到 `execution_bus` 工具,才可直接调用。**
88
+
89
+ ### 安装步骤
37
90
 
38
- 测试会在隔离 Cordis 上下文运行真实宿主组件;Agent 身份为夹具,不调用真实模型。安装包只含编译入口、类型与文档,不包含宿主源码快照、测试环境或 node_modules。源码构建需要整个仓库。
91
+ 1. 备份目标配置、依赖声明和锁文件,记录当前插件清单。
92
+ 2. 在你选定的隔离 DSH 配置依赖目录安装固定版本,不要在 DSH 程序安装目录执行:
39
93
 
40
- ## 安装:仅在你明确决定的隔离 DSH 配置中
94
+ ```powershell
95
+ npm install --ignore-scripts @feng0531/dsh-execution-bus@0.1.2
96
+ ```
41
97
 
42
- 本次**未安装到你的 DSH**。兼容目标精确为 DSH 0.2.0-rc.2 / Cordis 4.0.4;先确认你要操作的配置目录和宿主实际版本。不要向运行时安装目录复制文件或修改 ASAR。
98
+ 这是 npm 目录示例。若目标配置使用 pnpm,应沿用其包管理器,不混用锁文件。遇到宿主 peer 版本冲突就停止,不用强制安装绕过。
43
99
 
44
- 1. 备份目标配置文件、依赖声明和 lockfile,记录当前插件清单。先停止目标隔离实例的工作,不动日常会话。
45
- 2. 在隔离配置的依赖目录安装本地 tgz,禁用生命周期脚本;避免升级宿主依赖。若 peer 不匹配,停止安装,不用 force/legacy-peer-deps 绕过。
46
- 3. 在目标实例已有的插件加载配置中加入包名。必须位于可见 tools、jobs、现有 tool-jobs controller 和 read 的组合内。包导出标准 Cordis name / inject / apply;不提供未验证的全局配置键。
47
- 4. 由使用者自行启动/重载隔离实例,确认 execution_bus 工具可见。配置结构随宿主组合而异,不承诺“一条配置适用于所有版本”。
100
+ 3. 在该实例现有插件加载配置中加入包名,并放在具备上述服务的组合内。配置结构依宿主组合而定,本项目不提供未经验证的通用配置键。
101
+ 4. 按宿主正常方式加载,由你决定是否需要重载或重启。确认本会话出现 `execution_bus` 后再测试。
48
102
 
49
- ## 使用
103
+ **发布或本仓库测试不会替你安装、升级或重启 DSH,也不需要修改 DSH 源码或 ASAR。**
50
104
 
51
- 直接工具入口 execution_bus 的请求参数:
105
+ ## 先跑一个例子
106
+
107
+ 插件加载后,让 Agent 调用 `execution_bus`,参数如下。它会等待处理器完成,而不是立即只返回任务编号。
108
+
109
+ ### 例一:约一秒后成功
52
110
 
53
111
  ```json
54
112
  {
@@ -56,22 +114,116 @@ npm run test:install
56
114
  "messageId": "message-001",
57
115
  "requestId": "operation-001",
58
116
  "type": "request",
59
- "payload": {"handler": "test", "input": {"delayMs": 1000, "fail": false}}
117
+ "payload": {
118
+ "handler": "test",
119
+ "input": { "delayMs": 1000, "fail": false }
120
+ }
60
121
  }
61
122
  ```
62
123
 
63
- 调用会等待约一秒,再返回 succeeded 等终态,不需要 status 循环。真实只读任务把 payload 改为 {"handler":"host.read","input":{"file_path":"README.md","limit":20}},路径相对于可信宿主会话工作目录。
124
+ 完成后,返回值中的 `state` 为 `succeeded`,`result` 为 `{ "ok": true }`。把 `fail` 改成 `true` 并使用新的 `requestId`,可以验证失败路径。不要为了等待这个例子而循环调用 `status`。
125
+
126
+ ### 例二:读取会话工作目录中的文本
127
+
128
+ 保留上面的消息结构,使用新的消息编号和请求编号,将 `payload` 改为:
129
+
130
+ ```json
131
+ {
132
+ "handler": "host.read",
133
+ "input": { "file_path": "README.md", "limit": 20 }
134
+ }
135
+ ```
136
+
137
+ 相对路径由宿主当前会话工作目录解析,不由模型指定新的工作目录或权限。读取敏感文件的内容仍可能进入宿主会话记录,请只请求确有需要的内容。
138
+
139
+ ### 两种编号不要混淆
140
+
141
+ - **`messageId`:这条消息的编号。** 新的请求消息或控制消息使用新的编号。
142
+ - **`requestId`:这一次逻辑操作的编号。** 同一次操作重发沿用它;不同操作必须换编号,即使参数完全相同。
143
+
144
+ 同一 `requestId` 搭配不同输入会被拒绝;不同会话不能读取或取消彼此的任务。重复执行保护仅在当前插件实例和保存期内有效,不是永久保证。
64
145
 
65
- 若当前 DSH 是 PTC 模式,在 run_code 内 await tools.execution_bus(同上对象),而非直接工具调用;这不会解除 run_code 的时间预算。PTC 端到端尚未验收。
146
+ ### 查询、重取和取消
66
147
 
67
- 手工查询/重取/取消:保留 requestId,换新 messageId,type 改为 status / result / cancel,payload 为 {}。不同会话无法读取或取消其他会话请求。cancelRequested 不等于已取消;读取执行状态字段判断。不要因为等待或通信超时就换 requestId 重新执行。
148
+ 这三个入口用于人工诊断或恢复当前实例中的结果,**不是正常执行所需的模型轮询步骤**:
149
+
150
+ ```json
151
+ {
152
+ "protocolVersion": 1,
153
+ "messageId": "message-002",
154
+ "requestId": "operation-001",
155
+ "type": "cancel",
156
+ "payload": {}
157
+ }
158
+ ```
159
+
160
+ 将 `type` 换成 `status` 查询状态,换成 `result` 重取保存结果。取消中的任务要看最终 `state`;`cancelRequested: true` 只表示取消请求已经发出,不表示任务已停止或副作用已撤销。
161
+
162
+ ### 如果宿主使用 PTC 模式
163
+
164
+ PTC 是 DSH 的程序化工具调用入口。在 `run_code` 内使用 `await tools.execution_bus(请求对象)`,而不是直接调用折叠后的工具名。执行总线不会解除 `run_code` 自身的时间预算;PTC 完整进程链路尚未验收。
165
+
166
+ ## 如何理解任务状态?
167
+
168
+ ```mermaid
169
+ stateDiagram-v2
170
+ [*] --> queued: 已受理并排队
171
+ queued --> running: 开始执行
172
+ queued --> cancelled: 排队时确认取消
173
+ running --> succeeded: 执行成功且结果可保存
174
+ running --> failed: 执行异常
175
+ running --> cancelled: 处理器确认取消
176
+ running --> unknown: 结果不可保存或取消结果不明确
177
+ ```
178
+
179
+ | 状态 | 含义 |
180
+ |---|---|
181
+ | `queued` | 已受理,尚未执行;不代表成功 |
182
+ | `running` | 正在执行;等待窗口超时不自动把它变成失败 |
183
+ | `succeeded` | 执行成功且总线保存了结果 |
184
+ | `failed` | 处理器执行失败 |
185
+ | `cancelled` | 已确认取消 |
186
+ | `unknown` | 不能可靠保留或确认结果,不可盲目重跑有副作用操作 |
187
+
188
+ 执行终态不会再改成另一个终态。取消与成功竞争时,若处理器最终正常返回,仍可能是成功。`delivery` 是另一个字段:`pending` 表示尚未走到返回标记,`returned` 只表示插件已走到工具返回路径,**不证明会话结果已经写入磁盘或模型已经消费**。
189
+
190
+ ## 容量与重要限制
191
+
192
+ 默认并发 **2**,排队上限 **32**,最多保存 **256** 条任务记录,单结果最多 **64 KiB**,完成结果保存 **1 小时**,在新请求和查询时清理过期记录。队列或记录满时拒绝新任务;宿主 Job 自身也有容量限制。
193
+
194
+ - **全部状态在内存中。** 受理没有落盘,插件关闭或进程崩溃后,不能依靠它恢复原调用或保证请求不丢失。
195
+ - **不自动重跑任务。** 通信超时不等于执行失败,取消不等于回滚。
196
+ - **不承诺端到端 exactly-once。** 当前实例的请求复用不能代替外部副作用对账。
197
+ - 当前没有远端执行端、跨插件 Handler 注册服务或非幂等操作对账能力。
198
+ - 未证明真实模型轮次、主动查询次数或总耗时的提升比例。
199
+
200
+ ## 不安装也能测试吗?
201
+
202
+ 可以。开发者在本仓库运行:
203
+
204
+ ```powershell
205
+ npm ci --include=dev --ignore-scripts
206
+ npm run test:flow # 流程回归 + 真实宿主组件 + 脚本模型驱动的 AgentLoop
207
+ npm run check # 全量编译和测试
208
+ npm run verify:package # 检查公开包内容
209
+ npm run test:install # 临时目录安装,不操作日常 DSH
210
+ ```
211
+
212
+ 这些测试不等于“当前聊天会话直接调用插件”。真实 AgentLoop 测试使用脚本模型适配器;工具组件测试使用测试 Agent。具体边界见[流程测试说明](<docs/FLOW-TEST.md>)。构建候选安装包可运行 `npm run pack:candidate`。
68
213
 
69
214
  ## 卸载与回滚
70
215
 
71
- 先停止新请求并等待已有操作终态,或请求合作取消。然后从目标隔离实例插件加载配置移除包名,按宿主正常生命周期卸载;卸载会取消并等待本插件受理的任务。不要强杀并假定外部操作已回滚。
216
+ 先停止新请求,等待已有任务完成或请求合作取消,再从目标实例加载配置中移除插件,按宿主生命周期卸载。不要强杀后假定外部工作已撤销。
217
+
218
+ 若试用失败,恢复安装前备份的配置、依赖声明和锁文件,由你决定何时重新加载实例。内存结果会丢失;宿主已有会话日志不属于本插件卸载范围,不要删除。
219
+
220
+ ## 进一步阅读
72
221
 
73
- 若首次试用失败,恢复前述配置/依赖/锁文件备份,再由使用者自行启动目标实例。tgz 不写宿主文件、系统服务、全局命令或磁盘任务库,无专属磁盘数据迁移。进程关闭会丢失内存结果;宿主已有会话日志不在插件卸载范围内,不删除它们。
222
+ - [协议和投递语义](<docs/protocol.md>):字段、状态、重复处理与取消规则。
223
+ - [宿主兼容性与源码调用链](<docs/host-compatibility.md>):为什么可以等待,为什么不能跨重启恢复。
224
+ - [验证记录](<docs/validation.md>)、[0.1.2 发布说明](<docs/releases/0.1.2.md>):已验证与未验证范围。
225
+ - [维护者发布流程](<docs/RELEASING.md>):标签 CI、安装包校验与正式发布门禁。
74
226
 
75
- ## 减少反复的验证
227
+ ## 许可
76
228
 
77
- 真实模型参与轮次、主动状态查询次数、重复执行次数和总耗时对照:**未验证**,不提供提升比例。自动化测试只证明等待和状态机制,不替代同条件真实模型对比。
229
+ 采用[非商业源码公开许可证](<LICENSE>),**不是 OSI 开源许可证**。商业项目内部使用及有偿交付需要另行书面授权;第三方独立依赖仍受各自原许可证约束。
@@ -0,0 +1,20 @@
1
+ # 执行总线 0.1.2
2
+
3
+ ## 本版变化
4
+
5
+ 文档易用性补丁,不改变插件执行逻辑或工具参数。
6
+
7
+ - 按使用者阅读顺序重写 README:用途、运作方式、安装、示例、状态、限制、测试和回滚。
8
+ - 新增请求处理流程图及状态转换图,并提供纯文本流程,方便不支持 Mermaid 的阅读器。
9
+ - 用服务台类比解释 Handler、模型、执行总线与宿主的职责;区分受理成功、执行完成和结果交付。
10
+ - 补全请求编号与消息编号、真实只读示例、取消语义、PTC 入口和“不安装测试”的边界。
11
+
12
+ ## 安装与限制
13
+
14
+ 固定版本包 @feng0531/dsh-execution-bus@0.1.2。兼容目标仍为 DSH 0.2.0-rc.2,非商业源码公开许可。不会自动安装或重启 DSH。
15
+
16
+ 非持久化,不支持跨重启恢复原调用;真实模型、桌面界面、沙箱与 PTC 完整链路仍未验收,流程图不表示这些能力已实测。
17
+
18
+ ## 验证
19
+
20
+ 沿用完整测试与标签四矩阵 CI、包内容检查、生产依赖隔离安装和两端公开包一致性门禁。图示根据现有工具等待及状态实现核对;GitHub 页面实际 Mermaid 渲染不作为宿主 GUI 验收。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@feng0531/dsh-execution-bus",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "type": "module",
5
5
  "private": false,
6
6
  "license": "SEE LICENSE IN LICENSE",