multiclaws 0.4.16 → 0.4.18

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.
@@ -152,11 +152,16 @@ class OpenClawAgentExecutor {
152
152
  // Respect explicit completion flag from gateway
153
153
  if (details.isComplete === false)
154
154
  return null;
155
+ // Check for session-level error/status from gateway
156
+ const sessionError = details.error;
157
+ const sessionStatus = details.status;
155
158
  const messages = (details.messages ?? []);
156
- if (messages.length === 0)
159
+ if (messages.length === 0 && !details.isComplete)
157
160
  return null;
158
161
  // If no explicit isComplete flag, use heuristic: check if the session is still executing
159
162
  if (details.isComplete === undefined) {
163
+ if (messages.length === 0)
164
+ return null;
160
165
  const lastMsg = messages[messages.length - 1];
161
166
  if (lastMsg && Array.isArray(lastMsg.content)) {
162
167
  const content = lastMsg.content;
@@ -167,8 +172,7 @@ class OpenClawAgentExecutor {
167
172
  return null;
168
173
  }
169
174
  // If the last message is a user message, the agent hasn't responded yet
170
- const lastMsg2 = messages[messages.length - 1];
171
- if (lastMsg2?.role === "user")
175
+ if (lastMsg?.role === "user")
172
176
  return null;
173
177
  }
174
178
  // Session is complete — collect ALL assistant text messages in order
@@ -180,12 +184,23 @@ class OpenClawAgentExecutor {
180
184
  if (text)
181
185
  allTexts.push(text);
182
186
  }
183
- // Session completed but no text output return a marker instead of null
184
- // to avoid infinite polling / timeout
185
- if (allTexts.length === 0) {
186
- return "(task completed with no text output)";
187
+ // If we have assistant text, return it (even if there's also an error)
188
+ if (allTexts.length > 0) {
189
+ // Append error info if present so the delegating agent sees both
190
+ if (sessionError) {
191
+ allTexts.push(`[session error: ${sessionError}]`);
192
+ }
193
+ return allTexts.join("\n\n");
194
+ }
195
+ // No assistant text — check if the session reported an error
196
+ if (sessionError) {
197
+ return `Error: ${sessionError}`;
198
+ }
199
+ if (sessionStatus === "failed" || sessionStatus === "error") {
200
+ return `Error: session ended with status "${sessionStatus}"`;
187
201
  }
188
- return allTexts.join("\n\n");
202
+ // Session truly completed with no output at all
203
+ return "(task completed with no text output)";
189
204
  }
190
205
  /** Extract text content from a single history message. */
191
206
  extractTextFromHistoryMessage(msg) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "multiclaws",
3
- "version": "0.4.16",
3
+ "version": "0.4.18",
4
4
  "description": "MultiClaws plugin for OpenClaw collaboration via A2A protocol",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -157,48 +157,88 @@ multiclaws_profile_show()
157
157
 
158
158
  适用于需要协商、确认、多次沟通才能完成的任务(如约会议、对需求、联合调试)。
159
159
 
160
- **根据用户是否需要看到中间过程,选择以下两种模式:**
160
+ **默认使用异步子 agent 模式。** 主 agent 启动子 agent 后立即返回,子 agent 自主完成全部沟通并通过 `message` 工具实时汇报进展。
161
161
 
162
- #### 模式 A:交互式多轮(推荐 — 用户能看到每一步进展)
162
+ #### 工作流程
163
163
 
164
- 主 AI 直接处理多轮沟通,每轮之间向用户汇报进展。
164
+ ```
165
+ 用户: "帮我和小明、小红约明天下午的会议"
165
166
 
167
+ 1. multiclaws_agents() — 列出智能体,读 bio
168
+ 2. sessions_spawn(task="<协作任务 prompt>", mode="run")
169
+ 3. → 立即告诉用户: "已启动协作任务,会实时汇报进展"
170
+ 4.(子 agent 在后台自主完成全部沟通,通过 message 实时汇报)
171
+ 5. 子 agent 完成 → announce 回主 agent → 最终结果自动通知用户
166
172
  ```
167
- 用户: "帮我和小明约明天下午的会议"
168
173
 
169
- 1. multiclaws_agents() — 找到小明
170
- 2. multiclaws_delegate(agentUrl="小明", task="我想约明天下午开会,你什么时候有空?")
171
- 3. 向用户汇报: "小明说明天下午 3 点和 4 点都可以"
172
- 4.(用户说"约 3 点"或 AI 自行判断)
173
- 5. multiclaws_delegate(agentUrl="小明", task="确认明天下午 3 点开会")
174
- 6. → 向用户汇报: "已和小明确认明天下午 3 点"
174
+ #### agent 的 task prompt 模板
175
+
176
+ spawn agent 时,task 必须包含以下要素:
177
+
178
+ ```
179
+ sessions_spawn(task="
180
+ ## 任务
181
+ 联系小明和小红,协商明天下午的会议时间。我这边下午 2-5 点都可以。
182
+
183
+ ## 可用工具
184
+ - `multiclaws_agents()` — 查看所有智能体
185
+ - `multiclaws_delegate(agentUrl, task)` — 向智能体发送任务
186
+
187
+ ## 执行步骤
188
+ 1. 调用 multiclaws_agents() 获取智能体列表
189
+ 2. 依次用 multiclaws_delegate 联系每个相关智能体
190
+ 3. 每完成一个智能体的沟通,立即用 message 工具向用户汇报进展
191
+ 4. 全部沟通完成后,汇总结果
192
+
193
+ ## 中间汇报
194
+ 每次 multiclaws_delegate 返回后,立即调用 message 工具告知用户当前进展。
195
+ 例如:'已联系小明,他说明天下午 3 点和 4 点都可以。正在联系小红...'
196
+
197
+ ## 完成条件
198
+ 所有相关智能体都已回复,汇总最终结果。
199
+ ", mode="run")
175
200
  ```
176
201
 
177
- **关键规则:**
178
- - 每次 `multiclaws_delegate` 返回后,**立即向用户汇报结果**,不要等全部完成
179
- - 如果能自行判断下一步(如对方给了选项,用户已表达偏好),直接继续
180
- - 如果需要用户决策(如对方提出多个方案),暂停并询问用户
181
- - 协商未达成一致时,继续发 `multiclaws_delegate`,最多 5 轮
202
+ #### 关键规则
182
203
 
183
- #### 模式 B:自主式多轮(AI 全自动完成,只报告最终结果)
204
+ - **主 agent 不做多轮沟通。** 所有多轮协作都交给子 agent。
205
+ - **子 agent 用 `message` 工具实时汇报。** 子 agent 继承了父 agent 的频道上下文,`message` 发出的消息用户能直接看到。
206
+ - 每次 `multiclaws_delegate` 返回后,子 agent 必须立即用 `message` 汇报,不要等全部完成。
207
+ - 如果某个智能体没有回复或返回错误,子 agent 应在汇报中说明,继续联系其他智能体。
208
+ - 协商未达成一致时,子 agent 可继续发 `multiclaws_delegate`,最多 5 轮。
209
+ - 涉及多个智能体时,依次联系(串行),每个完成后立即汇报。
184
210
 
185
- 适用于用户明确授权自主处理、不需要看中间过程的场景。使用 `sessions_spawn` 启动子 agent,子 agent 自主完成全部沟通。
211
+ #### 示例场景
186
212
 
213
+ **约多人会议:**
187
214
  ```
188
- 用户: "帮我和小明约个会,我明天下午都行,你自己搞定"
189
-
190
- 1. sessions_spawn(task="联系小明协商明天下午的会议时间。我这边下午都可以。
191
- 使用 multiclaws_delegate 与小明沟通,协商确定具体时间。
192
- 完成后汇报最终结果。", mode="run")
193
- 2.(子 agent 自主多轮沟通)
194
- 3. 子 agent 完成 → announce 回父 agent → 向用户报告最终结果
215
+ 用户: "帮我和小明、小红约明天下午的会议"
216
+
217
+ agent:
218
+ 1. multiclaws_agents() → 找到小明、小红
219
+ 2. sessions_spawn(task="联系小明和小红...(按模板)", mode="run")
220
+ 3. 回复用户: "已启动协作任务,正在联系小明和小红,会实时汇报进展。"
221
+
222
+ 子 agent(后台执行):
223
+ 1. multiclaws_delegate(小明, "明天下午 2-5 点开会,你什么时候有空?")
224
+ → 小明回复: "3 点和 4 点都行"
225
+ → message("已联系小明,他明天下午 3 点和 4 点都可以。正在联系小红...")
226
+ 2. multiclaws_delegate(小红, "明天下午 2-5 点开会,小明 3 点和 4 点都行,你呢?")
227
+ → 小红回复: "3 点可以"
228
+ → message("小红也确认明天下午 3 点可以。")
229
+ 3. multiclaws_delegate(小明, "确认明天下午 3 点开会")
230
+ 4. multiclaws_delegate(小红, "确认明天下午 3 点开会")
231
+ 5. 完成 → announce: "会议已确认:明天下午 3 点,参与人:小明、小红"
195
232
  ```
196
233
 
197
- **何时用模式 B:**
198
- - 用户明确说「你自己搞定」「自动处理」「不用问我」
199
- - 任务参数已完全明确,不需要用户中间决策
234
+ **简单单人协作:**
235
+ ```
236
+ 用户: "问一下小明他那个 API 接口的参数格式"
200
237
 
201
- **默认用模式 A。** 除非用户明确要求自主处理,否则始终用交互式模式,确保用户看到每一步。
238
+ (单轮任务,不需要多轮 直接用智能委派)
239
+ 1. multiclaws_delegate(小明, "你那个 API 接口的参数格式是什么?")
240
+ 2. 把结果返回给用户
241
+ ```
202
242
 
203
243
  ---
204
244