@dobby.ai/dobby 0.1.0 → 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.
Files changed (156) hide show
  1. package/README.md +84 -39
  2. package/dist/src/agent/event-forwarder.js +185 -16
  3. package/dist/src/cli/commands/cron.js +39 -35
  4. package/dist/src/cli/commands/doctor.js +81 -2
  5. package/dist/src/cli/commands/extension.js +3 -1
  6. package/dist/src/cli/commands/init.js +43 -173
  7. package/dist/src/cli/commands/topology.js +38 -14
  8. package/dist/src/cli/program.js +15 -137
  9. package/dist/src/cli/shared/config-io.js +3 -31
  10. package/dist/src/cli/shared/config-mutators.js +33 -9
  11. package/dist/src/cli/shared/configure-sections.js +52 -12
  12. package/dist/src/cli/shared/init-catalog.js +89 -46
  13. package/dist/src/cli/shared/local-extension-specs.js +85 -0
  14. package/dist/src/cli/shared/schema-prompts.js +26 -2
  15. package/dist/src/core/gateway.js +3 -1
  16. package/dist/src/core/routing.js +53 -38
  17. package/dist/src/core/types.js +2 -0
  18. package/dist/src/cron/config.js +2 -2
  19. package/dist/src/cron/service.js +87 -23
  20. package/dist/src/cron/store.js +1 -1
  21. package/dist/src/main.js +0 -0
  22. package/dist/src/shared/dobby-repo.js +40 -0
  23. package/package.json +11 -4
  24. package/.env.example +0 -9
  25. package/AGENTS.md +0 -267
  26. package/ROADMAP.md +0 -34
  27. package/config/cron.example.json +0 -9
  28. package/config/gateway.example.json +0 -128
  29. package/config/models.custom.example.json +0 -27
  30. package/dist/src/agent/tests/event-forwarder.test.js +0 -113
  31. package/dist/src/cli/shared/config-path.js +0 -207
  32. package/dist/src/cli/shared/init-models-file.js +0 -65
  33. package/dist/src/cli/shared/presets.js +0 -86
  34. package/dist/src/cli/tests/config-command.test.js +0 -42
  35. package/dist/src/cli/tests/config-io.test.js +0 -64
  36. package/dist/src/cli/tests/config-mutators.test.js +0 -47
  37. package/dist/src/cli/tests/config-path.test.js +0 -21
  38. package/dist/src/cli/tests/discord-config.test.js +0 -23
  39. package/dist/src/cli/tests/doctor.test.js +0 -107
  40. package/dist/src/cli/tests/init-catalog.test.js +0 -87
  41. package/dist/src/cli/tests/presets.test.js +0 -41
  42. package/dist/src/cli/tests/program-options.test.js +0 -92
  43. package/dist/src/cli/tests/routing-config.test.js +0 -199
  44. package/dist/src/cli/tests/routing-legacy.test.js +0 -191
  45. package/dist/src/core/tests/control-command.test.js +0 -17
  46. package/dist/src/core/tests/gateway-update-strategy.test.js +0 -167
  47. package/dist/src/core/tests/runtime-registry.test.js +0 -116
  48. package/dist/src/core/tests/typing-controller.test.js +0 -103
  49. package/docs/BOXLITE_SANDBOX_FEASIBILITY.md +0 -175
  50. package/docs/CRON_SCHEDULER_DESIGN.md +0 -374
  51. package/docs/DOCKER_SANDBOX_vs_BOXLITE.md +0 -77
  52. package/docs/EXTENSION_SYSTEM_ARCHITECTURE.md +0 -119
  53. package/docs/MVP.md +0 -135
  54. package/docs/RUNBOOK.md +0 -242
  55. package/docs/TEAMWORK_HANDOFF_DESIGN.md +0 -440
  56. package/plugins/connector-discord/dobby.manifest.json +0 -18
  57. package/plugins/connector-discord/index.js +0 -1
  58. package/plugins/connector-discord/package-lock.json +0 -360
  59. package/plugins/connector-discord/package.json +0 -38
  60. package/plugins/connector-discord/src/connector.ts +0 -350
  61. package/plugins/connector-discord/src/contribution.ts +0 -21
  62. package/plugins/connector-discord/src/mapper.ts +0 -102
  63. package/plugins/connector-discord/tsconfig.json +0 -19
  64. package/plugins/connector-feishu/dobby.manifest.json +0 -18
  65. package/plugins/connector-feishu/index.js +0 -1
  66. package/plugins/connector-feishu/package-lock.json +0 -618
  67. package/plugins/connector-feishu/package.json +0 -38
  68. package/plugins/connector-feishu/src/connector.ts +0 -343
  69. package/plugins/connector-feishu/src/contribution.ts +0 -26
  70. package/plugins/connector-feishu/src/mapper.ts +0 -401
  71. package/plugins/connector-feishu/tsconfig.json +0 -19
  72. package/plugins/plugin-sdk/index.d.ts +0 -261
  73. package/plugins/plugin-sdk/index.js +0 -1
  74. package/plugins/plugin-sdk/package-lock.json +0 -12
  75. package/plugins/plugin-sdk/package.json +0 -22
  76. package/plugins/provider-claude/dobby.manifest.json +0 -17
  77. package/plugins/provider-claude/index.js +0 -1
  78. package/plugins/provider-claude/package-lock.json +0 -3398
  79. package/plugins/provider-claude/package.json +0 -39
  80. package/plugins/provider-claude/src/contribution.ts +0 -1018
  81. package/plugins/provider-claude/tsconfig.json +0 -19
  82. package/plugins/provider-claude-cli/dobby.manifest.json +0 -17
  83. package/plugins/provider-claude-cli/index.js +0 -1
  84. package/plugins/provider-claude-cli/package-lock.json +0 -2898
  85. package/plugins/provider-claude-cli/package.json +0 -38
  86. package/plugins/provider-claude-cli/src/contribution.ts +0 -1673
  87. package/plugins/provider-claude-cli/tsconfig.json +0 -19
  88. package/plugins/provider-pi/dobby.manifest.json +0 -17
  89. package/plugins/provider-pi/index.js +0 -1
  90. package/plugins/provider-pi/package-lock.json +0 -3877
  91. package/plugins/provider-pi/package.json +0 -40
  92. package/plugins/provider-pi/src/contribution.ts +0 -476
  93. package/plugins/provider-pi/tsconfig.json +0 -19
  94. package/plugins/sandbox-core/boxlite.js +0 -1
  95. package/plugins/sandbox-core/dobby.manifest.json +0 -17
  96. package/plugins/sandbox-core/docker.js +0 -1
  97. package/plugins/sandbox-core/package-lock.json +0 -136
  98. package/plugins/sandbox-core/package.json +0 -39
  99. package/plugins/sandbox-core/src/boxlite-context.ts +0 -2
  100. package/plugins/sandbox-core/src/boxlite-contribution.ts +0 -53
  101. package/plugins/sandbox-core/src/boxlite-executor.ts +0 -911
  102. package/plugins/sandbox-core/src/docker-contribution.ts +0 -43
  103. package/plugins/sandbox-core/src/docker-executor.ts +0 -217
  104. package/plugins/sandbox-core/tsconfig.json +0 -19
  105. package/scripts/local-extensions.mjs +0 -168
  106. package/src/agent/event-forwarder.ts +0 -414
  107. package/src/cli/commands/config.ts +0 -328
  108. package/src/cli/commands/configure.ts +0 -92
  109. package/src/cli/commands/cron.ts +0 -410
  110. package/src/cli/commands/doctor.ts +0 -230
  111. package/src/cli/commands/extension.ts +0 -205
  112. package/src/cli/commands/init.ts +0 -396
  113. package/src/cli/commands/start.ts +0 -223
  114. package/src/cli/commands/topology.ts +0 -383
  115. package/src/cli/index.ts +0 -9
  116. package/src/cli/program.ts +0 -465
  117. package/src/cli/shared/config-io.ts +0 -277
  118. package/src/cli/shared/config-mutators.ts +0 -440
  119. package/src/cli/shared/config-schema.ts +0 -228
  120. package/src/cli/shared/config-types.ts +0 -121
  121. package/src/cli/shared/configure-sections.ts +0 -551
  122. package/src/cli/shared/discord-config.ts +0 -14
  123. package/src/cli/shared/init-catalog.ts +0 -189
  124. package/src/cli/shared/init-models-file.ts +0 -77
  125. package/src/cli/shared/runtime.ts +0 -33
  126. package/src/cli/shared/schema-prompts.ts +0 -414
  127. package/src/cli/tests/config-command.test.ts +0 -56
  128. package/src/cli/tests/config-io.test.ts +0 -92
  129. package/src/cli/tests/config-mutators.test.ts +0 -59
  130. package/src/cli/tests/doctor.test.ts +0 -120
  131. package/src/cli/tests/init-catalog.test.ts +0 -96
  132. package/src/cli/tests/program-options.test.ts +0 -113
  133. package/src/cli/tests/routing-config.test.ts +0 -209
  134. package/src/core/control-command.ts +0 -12
  135. package/src/core/dedup-store.ts +0 -103
  136. package/src/core/gateway.ts +0 -607
  137. package/src/core/routing.ts +0 -379
  138. package/src/core/runtime-registry.ts +0 -141
  139. package/src/core/tests/control-command.test.ts +0 -20
  140. package/src/core/tests/runtime-registry.test.ts +0 -140
  141. package/src/core/tests/typing-controller.test.ts +0 -129
  142. package/src/core/types.ts +0 -318
  143. package/src/core/typing-controller.ts +0 -119
  144. package/src/cron/config.ts +0 -154
  145. package/src/cron/schedule.ts +0 -61
  146. package/src/cron/service.ts +0 -249
  147. package/src/cron/store.ts +0 -155
  148. package/src/cron/types.ts +0 -60
  149. package/src/extension/loader.ts +0 -145
  150. package/src/extension/manager.ts +0 -355
  151. package/src/extension/manifest.ts +0 -26
  152. package/src/extension/registry.ts +0 -229
  153. package/src/main.ts +0 -8
  154. package/src/sandbox/executor.ts +0 -44
  155. package/src/sandbox/host-executor.ts +0 -118
  156. package/tsconfig.json +0 -18
@@ -1,440 +0,0 @@
1
- # dobby Teamwork Handoff Loop 技术方案(Draft)
2
-
3
- > 状态:Draft / 待 Review
4
- > 日期:2026-03-06
5
- > 范围:单机单进程 `dobby`,Discord-first,多 bot 串行协作
6
- > 相关代码:`src/core/gateway.ts`、`src/core/runtime-registry.ts`、`plugins/connector-discord/src/connector.ts`
7
-
8
- ---
9
-
10
- ## 1. 背景与目标
11
-
12
- `dobby` 当前的主执行模型是“单条入站消息 -> 单 route runtime -> 串行执行 -> 回写 connector”。
13
- 在多 bot 场景下,现有能力更接近“一个 bot 完成一轮响应”,缺少“任务级多轮协作”。
14
-
15
- 本方案目标是引入 **Teamwork Handoff Loop(v1)**:
16
-
17
- 1. 用户发起消息可创建一个 `Task`。
18
- 2. Task 在多个 bot(角色 route)之间串行 `handoff`。
19
- 3. 支持 `complete` 与 `cancel` 终止语义。
20
- 4. 支持 `maxRound` 与 `maxPingPong` 防止无限循环。
21
- 5. 用户可通过 `stop` 取消当前 Task,并级联中断执行中的 actor。
22
-
23
- ---
24
-
25
- ## 2. 非目标
26
-
27
- 本版不包含以下能力:
28
-
29
- 1. 多 Task 并发(同会话仅单活跃 Task)。
30
- 2. 图编排 DSL / 可视化工作流编辑器。
31
- 3. 分布式多节点 Team Runtime。
32
- 4. 跨会话共享 Task 状态。
33
- 5. “任意 bot 消息均可触发”开放模式(需 trusted gating)。
34
-
35
- ---
36
-
37
- ## 3. 当前架构约束与改造边界
38
-
39
- ### 3.1 现状约束
40
-
41
- 1. `Gateway.handleInbound` 以消息为单位处理,按 route 选择 provider/runtime,单次 prompt 完成后结束该轮处理。
42
- 参考:`src/core/gateway.ts`
43
- 2. `RuntimeRegistry` 以 conversation key 串行排队,不提供 task-level 状态机。
44
- 参考:`src/core/runtime-registry.ts`
45
- 3. Discord connector 默认忽略 bot 消息(`if (message.author.bot) return`)。
46
- 参考:`plugins/connector-discord/src/connector.ts`
47
-
48
- ### 3.2 改造边界
49
-
50
- 1. 保持扩展系统 v3 边界不变(provider/connector/sandbox contribution 机制不变)。
51
- 2. 不依赖 bot-to-bot “纯聊天回环”直接替代状态机;仍由 Host 维护 task 状态。
52
- 3. 在 v1 中优先保障“可控 + 可观测 + 可取消”,再优化“更自然语言”的 handoff 体验。
53
-
54
- ---
55
-
56
- ## 4. 核心术语与状态机
57
-
58
- ### 4.1 术语
59
-
60
- 1. **Task**:一次从用户消息触发的协作任务执行单元。
61
- 2. **Active Actor**:当前被授权推进 Task 的 route/bot。
62
- 3. **Round**:每发生一次有效 `handoff`,round +1。
63
- 4. **PingPong Pair**:同一对 route 的来回跳转(`A->B->A`)计数单元。
64
- 5. **Conversation Scope**:`connectorId + platform + accountId + chatId + threadId(root)`。
65
-
66
- ### 4.2 Task 状态机
67
-
68
- 状态定义:
69
-
70
- 1. `running`
71
- 2. `completed`
72
- 3. `cancelled`
73
- 4. `failed`
74
- 5. `max_round_exceeded`
75
- 6. `pingpong_exceeded`
76
- 7. `timed_out`(预留)
77
-
78
- 状态约束:
79
-
80
- 1. Task 创建即 `running`。
81
- 2. 终态不可逆。
82
- 3. `cancel` 对终态幂等成功。
83
-
84
- ---
85
-
86
- ## 5. 协议语义(start / handoff / complete / cancel)
87
-
88
- ### 5.1 start(用户消息创建 Task)
89
-
90
- 触发条件:
91
-
92
- 1. 消息作者是用户(非 bot)。
93
- 2. 同一会话没有 `running` Task(单活跃约束)。
94
- 3. 消息满足“`@ 且仅 @ 一个团队 bot`”。
95
-
96
- 结果:
97
-
98
- 1. 创建 `Task`,`activeRouteId = 被@bot对应route`。
99
- 2. 该 route 作为第一位 actor 继续执行。
100
-
101
- ### 5.2 handoff(actor -> actor)
102
-
103
- 触发条件:
104
-
105
- 1. 来源消息作者为 trusted bot。
106
- 2. 来源 route 必须等于当前 `activeRouteId`。
107
- 3. 消息 `@` 到一个目标 bot。
108
- 4. 目标 route 在 `allowHandoffTo` 白名单内。
109
-
110
- 语义:
111
-
112
- 1. `activeRouteId` 切换到目标 route。
113
- 2. `currentRound += 1`。
114
- 3. 更新 pair bounce 计数(用于 pingpong 上限判定)。
115
-
116
- ### 5.3 complete
117
-
118
- 触发条件:
119
-
120
- 1. 当前 active actor 明确给出“任务完成”意图(由 intent extractor 判定)。
121
-
122
- 语义:
123
-
124
- 1. Task 进入 `completed`。
125
- 2. 记录 `complete` 事件并回写最终摘要。
126
-
127
- ### 5.4 cancel
128
-
129
- 触发条件:
130
-
131
- 1. 用户发送 `stop`;或
132
- 2. 当前 active actor 发出 cancel 意图(受策略控制)。
133
-
134
- 语义:
135
-
136
- 1. Task 进入 `cancelled`。
137
- 2. 级联中断当前 runtime(调用 `runtimeRegistry.abort`)。
138
-
139
- ---
140
-
141
- ## 6. 配置模型(文档规范)
142
-
143
- ### 6.1 `GatewayConfig.teamwork`(新增)
144
-
145
- 建议结构:
146
-
147
- ```json
148
- {
149
- "teamwork": {
150
- "enabled": false,
151
- "maxRoundPerTask": 12,
152
- "maxPingPongPerPair": 4,
153
- "singleActiveTaskPerConversation": true,
154
- "taskIntentTimeoutMs": 300000
155
- }
156
- }
157
- ```
158
-
159
- 字段语义:
160
-
161
- 1. `enabled`:全局开关,默认 `false`。
162
- 2. `maxRoundPerTask`:单 Task handoff 上限,默认 `12`。
163
- 3. `maxPingPongPerPair`:单 route pair 来回上限,默认 `4`。
164
- 4. `singleActiveTaskPerConversation`:同会话单活跃 Task,默认 `true`。
165
- 5. `taskIntentTimeoutMs`:Task 意图推进超时阈值,默认 `300000`。
166
-
167
- ### 6.2 `RouteProfile.a2a`(新增)
168
-
169
- 建议结构:
170
-
171
- ```json
172
- {
173
- "a2a": {
174
- "enabled": false,
175
- "allowHandoffTo": []
176
- }
177
- }
178
- ```
179
-
180
- 字段语义:
181
-
182
- 1. `enabled`:该 route 是否允许参与 handoff。
183
- 2. `allowHandoffTo`:可 handoff 到的目标 route 列表。
184
-
185
- ### 6.3 Discord connector 配置扩展(新增)
186
-
187
- 建议结构:
188
-
189
- ```json
190
- {
191
- "allowBotMessages": false,
192
- "trustedBotUserIds": []
193
- }
194
- ```
195
-
196
- 字段语义:
197
-
198
- 1. `allowBotMessages=false` 时保持现状(忽略 bot 消息)。
199
- 2. 开启后仅处理 `trustedBotUserIds` 中 bot 的消息。
200
- 3. 无论如何都忽略“自己发出的消息”。
201
-
202
- ---
203
-
204
- ## 7. 处理流程(用户入口 / bot入口 / 跳转 / 终态)
205
-
206
- ### 7.1 用户消息入口
207
-
208
- 1. Gateway 收到用户消息并完成 dedup + route resolve。
209
- 2. 若 teamwork 关闭,按现有单轮逻辑执行。
210
- 3. 若 teamwork 开启,先检查当前会话是否已有 `running` Task。
211
- 4. 若无 running Task 且消息满足 `@且仅@一个团队bot`,创建 Task 并进入 actor 执行。
212
-
213
- ### 7.2 bot 消息入口
214
-
215
- 1. connector 在 `allowBotMessages=true` 时接收 bot 消息。
216
- 2. 非 trusted bot 直接忽略并记 debug 日志。
217
- 3. 有 running Task 时,交由 `HandoffIntentExtractor` 判定意图:
218
- - `handoff`:推进 active actor
219
- - `complete`:终止 Task
220
- - `cancel`:取消 Task
221
- - `none`:仅记录日志,不推进状态
222
-
223
- ### 7.3 终态判定
224
-
225
- 1. `currentRound > maxRoundPerTask` -> `max_round_exceeded`。
226
- 2. pair bounce 超阈值 -> `pingpong_exceeded`。
227
- 3. 用户/actor cancel -> `cancelled`。
228
- 4. actor complete -> `completed`。
229
-
230
- ---
231
-
232
- ## 8. 防回环策略
233
-
234
- 核心策略组合:
235
-
236
- 1. **Round 上限**:每次有效 handoff +1,超过阈值立即终止。
237
- 2. **PingPong 上限**:针对 `A->B->A` 回环做 pair-level 限制。
238
- 3. **Actor Ownership**:仅 active actor 的消息可推进 Task。
239
- 4. **AllowList**:handoff 目标 route 必须命中 `allowHandoffTo`。
240
-
241
- ---
242
-
243
- ## 9. 持久化与恢复
244
-
245
- ### 9.1 数据模型(v1)
246
-
247
- ```ts
248
- type TeamTaskStatus =
249
- | "running"
250
- | "completed"
251
- | "cancelled"
252
- | "failed"
253
- | "max_round_exceeded"
254
- | "pingpong_exceeded"
255
- | "timed_out";
256
-
257
- type TeamTask = {
258
- taskId: string;
259
- conversationKey: string;
260
- status: TeamTaskStatus;
261
- activeRouteId: string;
262
- starterUserId: string;
263
- currentRound: number;
264
- pairBounceCount: Record<string, number>;
265
- createdAtMs: number;
266
- updatedAtMs: number;
267
- endedAtMs?: number;
268
- lastError?: string;
269
- };
270
-
271
- type TaskEventType = "start" | "handoff" | "complete" | "cancel" | "reject" | "timeout";
272
-
273
- type TaskEvent = {
274
- taskId: string;
275
- eventType: TaskEventType;
276
- fromRouteId?: string;
277
- toRouteId?: string;
278
- messageId: string;
279
- reason?: string;
280
- timestampMs: number;
281
- traceId: string;
282
- };
283
- ```
284
-
285
- ### 9.2 存储路径
286
-
287
- 1. `data/state/teamwork-tasks.json`
288
- 2. `data/state/teamwork-events.jsonl`
289
-
290
- ### 9.3 恢复规则
291
-
292
- 1. 进程重启时加载 task store。
293
- 2. 对 `running` task 执行恢复判定:
294
- - 若最近无活动且超过 `taskIntentTimeoutMs`,标记 `timed_out`。
295
- - 否则保留 `running` 并等待下一条有效消息推进。
296
-
297
- ---
298
-
299
- ## 10. 安全与权限
300
-
301
- 1. 默认拒绝 bot 消息触发(`allowBotMessages=false`)。
302
- 2. 仅信任 `trustedBotUserIds` 内 bot。
303
- 3. 仅 active actor 可推进 task。
304
- 4. 仅允许 `allowHandoffTo` 白名单目标。
305
- 5. 越权 handoff 返回拒绝事件并记录审计日志。
306
-
307
- ---
308
-
309
- ## 11. 可观测性
310
-
311
- 建议每次 Task 事件统一记录:
312
-
313
- 1. `taskId`
314
- 2. `traceId`
315
- 3. `conversationKey`
316
- 4. `eventType`
317
- 5. `fromRouteId`
318
- 6. `toRouteId`
319
- 7. `status`
320
- 8. `reason`
321
- 9. `durationMs`(终态时)
322
-
323
- 日志等级建议:
324
-
325
- 1. `info`:start/handoff/complete/cancel。
326
- 2. `warn`:reject/max_round_exceeded/pingpong_exceeded/timed_out。
327
- 3. `error`:状态持久化失败、runtime abort 失败、未捕获异常。
328
-
329
- ---
330
-
331
- ## 12. 错误处理与降级
332
-
333
- 1. 意图无法判定(`none`):不推进状态,仅日志记录。
334
- 2. @目标 bot 无映射 route:写入 reject 事件并提醒 actor。
335
- 3. handoff 目标未授权:写入 reject 事件并提醒 actor。
336
- 4. 当前无 running Task 收到 bot 消息:忽略并日志记录。
337
- 5. runtime 中断失败:保留 cancelled 终态,并记录 error。
338
-
339
- ---
340
-
341
- ## 13. 实施分期
342
-
343
- ### Phase 1(MVP)
344
-
345
- 1. `TaskStore`(task + event 持久化)。
346
- 2. `TaskCoordinator`(状态推进、权限判定、回环限制)。
347
- 3. Discord connector trusted bot 接入。
348
- 4. 用户 `stop` 升级为 task cancel 语义。
349
-
350
- ### Phase 2(稳定性)
351
-
352
- 1. 更强 `HandoffIntentExtractor` 规则(多语言、歧义收敛)。
353
- 2. 重启恢复增强与超时治理。
354
- 3. CLI 诊断:`task list` / `task show`(提案)。
355
-
356
- ### Phase 3(体验增强)
357
-
358
- 1. 任务进度摘要与阶段性提示。
359
- 2. 人工介入指令(例如 approve/force-handoff)。
360
- 3. 并发能力预留(仍默认关闭)。
361
-
362
- ---
363
-
364
- ## 14. 验收标准与测试矩阵
365
-
366
- 1. 用户 `@` 单 bot 可创建 Task。
367
- 2. 同会话已有 running Task 时,第二个创建请求被拒绝或提示等待。
368
- 3. trusted bot 的有效 handoff 可推进 active actor。
369
- 4. untrusted bot 消息被忽略。
370
- 5. 非 active actor 的 bot 消息被忽略。
371
- 6. 越权 handoff 被拒绝并记录事件。
372
- 7. 超过 `maxRoundPerTask` 自动终止。
373
- 8. 超过 `maxPingPongPerPair` 自动终止。
374
- 9. 用户 `stop` 后 Task 进入 `cancelled` 且 runtime 被中断。
375
- 10. 重启后可恢复并查询历史 Task 状态。
376
- 11. 可复现“review 不通过 -> impl 修复 -> review 通过 -> complete”闭环。
377
- 12. 意图解析失败时不推进状态,仅记录日志。
378
-
379
- ---
380
-
381
- ## 15. Public API / 接口变更清单(用于后续实现)
382
-
383
- 1. `src/core/types.ts`:
384
- - 新增 `GatewayConfig.teamwork`
385
- - `RouteProfile` 新增 `a2a`
386
- - `InboundEnvelope` 新增 `authorIsBot`
387
- - `InboundEnvelope` 新增 `mentionedUserIds`
388
- 2. `src/core/routing.ts`:
389
- - 新增 teamwork schema 与默认值
390
- - 新增 route `a2a` schema 与引用校验
391
- 3. `plugins/connector-discord`:
392
- - 新增 `allowBotMessages`
393
- - 新增 `trustedBotUserIds`
394
- - 保留“忽略自己消息”
395
- 4. 新增核心模块(v1 提案):
396
- - `TaskStore`
397
- - `TaskCoordinator`
398
- - `HandoffIntentExtractor`
399
- 5. `stop` 语义升级:
400
- - 从“仅 runtime abort”扩展为“cancel active task + 级联中断”
401
-
402
- ---
403
-
404
- ## 16. 默认假设(v1)
405
-
406
- 1. `teamwork.enabled=false`(显式开启才生效)。
407
- 2. `allowBotMessages=false`(显式开启且 trusted 列表非空才接收 bot 消息)。
408
- 3. `singleActiveTaskPerConversation=true`。
409
- 4. `maxRoundPerTask=12`。
410
- 5. `maxPingPongPerPair=4`。
411
- 6. Task 入口策略:用户必须 `@` 且仅 `@` 一个团队 bot。
412
- 7. 本版不支持多 Task 并发。
413
- 8. handoff 采用“`@目标bot + 自然语言`”并由 extractor 判定。
414
-
415
- ---
416
-
417
- ## 17. 开源参考与取舍
418
-
419
- 1. AutoGen:
420
- - 借鉴点:多 agent 轮转、终止条件可配置。
421
- - 取舍:不引入完整 team runtime,先做 host 内 task 状态机。
422
- 2. LangGraph / LangChain multi-agent:
423
- - 借鉴点:handoff + recursion limit 防无限循环。
424
- - 取舍:当前以 `maxRound`/`maxPingPong` 落地最小闭环。
425
- 3. OpenClaw:
426
- - 借鉴点:A2A 默认关闭、allowlist 显式放行、loop guard。
427
- - 取舍:保留“默认拒绝”策略,先做单进程可控能力。
428
- 4. CrewAI:
429
- - 借鉴点:角色分工与层级协作思路。
430
- - 取舍:不引入框架级 process DSL,以 route + policy 驱动。
431
-
432
- 参考链接:
433
-
434
- 1. https://microsoft.github.io/autogen/stable/user-guide/agentchat-user-guide/selector-group-chat.html
435
- 2. https://microsoft.github.io/autogen/dev/user-guide/core-user-guide/design-patterns/handoffs.html
436
- 3. https://docs.langchain.com/oss/javascript/langchain/multi-agent/handoffs
437
- 4. https://docs.langchain.com/oss/javascript/langgraph/errors/GRAPH_RECURSION_LIMIT
438
- 5. https://docs.openclaw.ai/tools
439
- 6. https://docs.openclaw.ai/gateway/configuration-reference
440
- 7. https://docs.crewai.com/en/concepts/processes
@@ -1,18 +0,0 @@
1
- {
2
- "apiVersion": "1.0",
3
- "name": "@dobby.ai/connector-discord",
4
- "version": "0.1.0",
5
- "contributions": [
6
- {
7
- "id": "connector.discord",
8
- "kind": "connector",
9
- "entry": "./dist/contribution.js",
10
- "capabilities": {
11
- "updateStrategy": "edit",
12
- "supportsThread": true,
13
- "supportsTyping": true,
14
- "supportsFileUpload": true
15
- }
16
- }
17
- ]
18
- }
@@ -1 +0,0 @@
1
- export { connectorDiscordContribution as contribution, connectorDiscordContribution as default } from "./dist/contribution.js";