openclaw-openagent 1.0.7 → 1.0.8
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/dist/src/app/remote-agent-tool.js +1 -1
- package/dist/src/plugin-ui/assets/openagent-override.js +1 -1
- package/dist/src/plugin-ui/ui-extension-loader/registry-regex.js +43 -22
- package/package.json +1 -1
- package/src/app/remote-agent-tool.ts +1 -1
- package/src/plugin-ui/assets/openagent-override.js +1 -1
- package/src/plugin-ui/ui-extension-loader/registry-regex.ts +27 -9
|
@@ -197,7 +197,7 @@ export function createCallRemoteAgentTool() {
|
|
|
197
197
|
// listUnsettledInvocations() 续轮询,避免重复扣费
|
|
198
198
|
const requestId = generateRequestId();
|
|
199
199
|
const TIMEOUT_MS = 15 * 60 * 1000; // 15 分钟:远程 agent 可能跑长工具
|
|
200
|
-
const OASN_INVOCATION_TIMEOUT_MS =
|
|
200
|
+
const OASN_INVOCATION_TIMEOUT_MS = 24 * 60 * 60 * 1000; // 24 小时
|
|
201
201
|
logger.info(`[remote-tool] Calling remote agent: agentId=${agentId} requestId=${requestId} ` +
|
|
202
202
|
`mode=${mode} transport=${rt.transportType}`);
|
|
203
203
|
// 进度回调适配器:两条路径共用一套桥接逻辑,统一把字符串内容包装成 ToolResult
|
|
@@ -288,35 +288,56 @@ const toolcardRender = {
|
|
|
288
288
|
}
|
|
289
289
|
}
|
|
290
290
|
if (toolMessageOk) {
|
|
291
|
+
// 双模式匹配单卡 guard:
|
|
292
|
+
// Shape A (2026.4.x): ,Z=X.length===1?X[0]:null,Y=Z&&!A&&!B?
|
|
293
|
+
// Shape B (2026.5.x): ,N=u.length===1?u[0]:null,...ae=P?`Tool error`:ne&&!C&&!h?ne:...
|
|
291
294
|
const singleCardMatch = toolMessageFn.body.match(/(?:let\s+|,)([a-zA-Z_$]\w*)=([a-zA-Z_$]\w*)\.length===1\?\2\[0\]:null,\w+=\1&&!([a-zA-Z_$]\w*)&&!([a-zA-Z_$]\w*)\?/);
|
|
292
|
-
|
|
293
|
-
|
|
295
|
+
let cardsVar = '';
|
|
296
|
+
let mediaVar = '';
|
|
297
|
+
if (singleCardMatch) {
|
|
298
|
+
// Shape A: old bundle
|
|
299
|
+
cardsVar = singleCardMatch[2];
|
|
300
|
+
mediaVar = singleCardMatch[4];
|
|
301
|
+
}
|
|
302
|
+
else {
|
|
303
|
+
// Shape B: 2026.5.x bundle
|
|
304
|
+
const shapeB = toolMessageFn.body.match(/,(?:let\s+)?([a-zA-Z_$]\w*)=([a-zA-Z_$]\w*)\.length===1\?\2\[0\]:null/);
|
|
305
|
+
if (!shapeB) {
|
|
306
|
+
logger.warn('[ui-ext:regex] toolcard-render: tool message single-card guard not found');
|
|
307
|
+
toolMessageOk = false;
|
|
308
|
+
}
|
|
309
|
+
else {
|
|
310
|
+
cardsVar = shapeB[2];
|
|
311
|
+
// 从 ae=P?`Tool error`:ne&&!C&&!h 中提取排除变量 C, h
|
|
312
|
+
const aeMatch = toolMessageFn.body.match(/,\w+=\w+\?`Tool error`:(\w+)&&!(\w+)&&!(\w+)\?/);
|
|
313
|
+
if (aeMatch) {
|
|
314
|
+
mediaVar = `(${aeMatch[2]}||${aeMatch[3]})`;
|
|
315
|
+
}
|
|
316
|
+
else {
|
|
317
|
+
mediaVar = 'false';
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
const chatBubbleClassMatch = toolMessageFn.body.match(/[,;]([a-zA-Z_$]\w*)=\[`chat-bubble`,/);
|
|
322
|
+
if (!chatBubbleClassMatch) {
|
|
323
|
+
logger.warn('[ui-ext:regex] toolcard-render: tool message chat-bubble class var not found');
|
|
294
324
|
toolMessageOk = false;
|
|
295
325
|
}
|
|
296
326
|
if (toolMessageOk) {
|
|
297
|
-
const
|
|
298
|
-
const
|
|
299
|
-
const
|
|
300
|
-
|
|
301
|
-
|
|
327
|
+
const chatBubbleClassVar = chatBubbleClassMatch[1];
|
|
328
|
+
const toolMessageParams = toolMessageFn.params.split(',').map((s) => s.trim());
|
|
329
|
+
const toolMessageSidebarArg = toolMessageParams[3] || 'undefined';
|
|
330
|
+
const toolMessageReturnIdx = toolMessageFn.body.indexOf(`return ${toolMessageHtmlVar}\``);
|
|
331
|
+
if (toolMessageReturnIdx < 0) {
|
|
332
|
+
logger.warn('[ui-ext:regex] toolcard-render: tool message return anchor not found');
|
|
302
333
|
toolMessageOk = false;
|
|
303
334
|
}
|
|
304
335
|
if (toolMessageOk) {
|
|
305
|
-
const
|
|
306
|
-
const
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
logger.warn('[ui-ext:regex] toolcard-render: tool message return anchor not found');
|
|
311
|
-
toolMessageOk = false;
|
|
312
|
-
}
|
|
313
|
-
if (toolMessageOk) {
|
|
314
|
-
const toolMessageHook = `${marker}let __openagentToolMsgCard=null;if(!${mediaVar}&&window.__openagentRenderToolCard){for(let __openagentI=${cardsVar}.length-1;__openagentI>=0&&!__openagentToolMsgCard;__openagentI--){let __openagentCandidate=${cardsVar}[__openagentI];if(__openagentCandidate&&(__openagentCandidate.outputText||__openagentCandidate.text))__openagentToolMsgCard=window.__openagentRenderToolCard(__openagentCandidate,${toolMessageSidebarArg})}for(let __openagentI=0;__openagentI<${cardsVar}.length&&!__openagentToolMsgCard;__openagentI++){__openagentToolMsgCard=window.__openagentRenderToolCard(${cardsVar}[__openagentI],${toolMessageSidebarArg})}}if(__openagentToolMsgCard)return ${toolMessageHtmlVar}\`<div class="\${${chatBubbleClassVar}}">\${__openagentToolMsgCard}</div>\`;`;
|
|
315
|
-
const toolMessageInsertAt = toolMessageFn.bodyStart + toolMessageReturnIdx;
|
|
316
|
-
content = content.substring(0, toolMessageInsertAt) + toolMessageHook + content.substring(toolMessageInsertAt);
|
|
317
|
-
patchedToolMessageWrapper = true;
|
|
318
|
-
logger.info(`[ui-ext:regex] toolcard-render: patched tool message wrapper ${toolMessageFn.funcName}(${toolMessageFn.params.substring(0, 20)}) html=${toolMessageHtmlVar}`);
|
|
319
|
-
}
|
|
336
|
+
const toolMessageHook = `${marker}let __openagentToolMsgCard=null;console.log('[openagent] toolMsg hook: cards='+${cardsVar}.length+' mediaVar='+${mediaVar});if(!${mediaVar}&&window.__openagentRenderToolCard){for(let __openagentI=${cardsVar}.length-1;__openagentI>=0&&!__openagentToolMsgCard;__openagentI--){let __openagentCandidate=${cardsVar}[__openagentI];if(__openagentCandidate&&(__openagentCandidate.outputText||__openagentCandidate.text))__openagentToolMsgCard=window.__openagentRenderToolCard(__openagentCandidate,${toolMessageSidebarArg})}for(let __openagentI=0;__openagentI<${cardsVar}.length&&!__openagentToolMsgCard;__openagentI++){__openagentToolMsgCard=window.__openagentRenderToolCard(${cardsVar}[__openagentI],${toolMessageSidebarArg})}}if(__openagentToolMsgCard)return ${toolMessageHtmlVar}\`<div class="\${${chatBubbleClassVar}}">\${__openagentToolMsgCard}</div>\`;`;
|
|
337
|
+
const toolMessageInsertAt = toolMessageFn.bodyStart + toolMessageReturnIdx;
|
|
338
|
+
content = content.substring(0, toolMessageInsertAt) + toolMessageHook + content.substring(toolMessageInsertAt);
|
|
339
|
+
patchedToolMessageWrapper = true;
|
|
340
|
+
logger.info(`[ui-ext:regex] toolcard-render: patched tool message wrapper ${toolMessageFn.funcName}(${toolMessageFn.params.substring(0, 20)}) html=${toolMessageHtmlVar}`);
|
|
320
341
|
}
|
|
321
342
|
}
|
|
322
343
|
}
|
package/package.json
CHANGED
|
@@ -242,7 +242,7 @@ export function createCallRemoteAgentTool(): ToolDescriptor {
|
|
|
242
242
|
// listUnsettledInvocations() 续轮询,避免重复扣费
|
|
243
243
|
const requestId = generateRequestId();
|
|
244
244
|
const TIMEOUT_MS = 15 * 60 * 1000; // 15 分钟:远程 agent 可能跑长工具
|
|
245
|
-
const OASN_INVOCATION_TIMEOUT_MS =
|
|
245
|
+
const OASN_INVOCATION_TIMEOUT_MS = 24 * 60 * 60 * 1000; // 24 小时
|
|
246
246
|
|
|
247
247
|
logger.info(
|
|
248
248
|
`[remote-tool] Calling remote agent: agentId=${agentId} requestId=${requestId} ` +
|
|
@@ -311,14 +311,33 @@ const toolcardRender: UIExtension = {
|
|
|
311
311
|
}
|
|
312
312
|
|
|
313
313
|
if (toolMessageOk) {
|
|
314
|
+
// 双模式匹配单卡 guard:
|
|
315
|
+
// Shape A (2026.4.x): ,Z=X.length===1?X[0]:null,Y=Z&&!A&&!B?
|
|
316
|
+
// Shape B (2026.5.x): ,N=u.length===1?u[0]:null,...ae=P?`Tool error`:ne&&!C&&!h?ne:...
|
|
314
317
|
const singleCardMatch = toolMessageFn!.body.match(/(?:let\s+|,)([a-zA-Z_$]\w*)=([a-zA-Z_$]\w*)\.length===1\?\2\[0\]:null,\w+=\1&&!([a-zA-Z_$]\w*)&&!([a-zA-Z_$]\w*)\?/);
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
+
let cardsVar = '';
|
|
319
|
+
let mediaVar = '';
|
|
320
|
+
if (singleCardMatch) {
|
|
321
|
+
// Shape A: old bundle
|
|
322
|
+
cardsVar = singleCardMatch[2];
|
|
323
|
+
mediaVar = singleCardMatch[4];
|
|
324
|
+
} else {
|
|
325
|
+
// Shape B: 2026.5.x bundle
|
|
326
|
+
const shapeB = toolMessageFn!.body.match(/,(?:let\s+)?([a-zA-Z_$]\w*)=([a-zA-Z_$]\w*)\.length===1\?\2\[0\]:null/);
|
|
327
|
+
if (!shapeB) {
|
|
328
|
+
logger.warn('[ui-ext:regex] toolcard-render: tool message single-card guard not found');
|
|
329
|
+
toolMessageOk = false;
|
|
330
|
+
} else {
|
|
331
|
+
cardsVar = shapeB[2];
|
|
332
|
+
// 从 ae=P?`Tool error`:ne&&!C&&!h 中提取排除变量 C, h
|
|
333
|
+
const aeMatch = toolMessageFn!.body.match(/,\w+=\w+\?`Tool error`:(\w+)&&!(\w+)&&!(\w+)\?/);
|
|
334
|
+
if (aeMatch) {
|
|
335
|
+
mediaVar = `(${aeMatch[2]}||${aeMatch[3]})`;
|
|
336
|
+
} else {
|
|
337
|
+
mediaVar = 'false';
|
|
338
|
+
}
|
|
339
|
+
}
|
|
318
340
|
}
|
|
319
|
-
if (toolMessageOk) {
|
|
320
|
-
const cardsVar = singleCardMatch![2];
|
|
321
|
-
const mediaVar = singleCardMatch![4];
|
|
322
341
|
const chatBubbleClassMatch = toolMessageFn!.body.match(/[,;]([a-zA-Z_$]\w*)=\[`chat-bubble`,/);
|
|
323
342
|
if (!chatBubbleClassMatch) {
|
|
324
343
|
logger.warn('[ui-ext:regex] toolcard-render: tool message chat-bubble class var not found');
|
|
@@ -335,7 +354,7 @@ const toolcardRender: UIExtension = {
|
|
|
335
354
|
}
|
|
336
355
|
if (toolMessageOk) {
|
|
337
356
|
const toolMessageHook =
|
|
338
|
-
`${marker}let __openagentToolMsgCard=null;if(!${mediaVar}&&window.__openagentRenderToolCard){for(let __openagentI=${cardsVar}.length-1;__openagentI>=0&&!__openagentToolMsgCard;__openagentI--){let __openagentCandidate=${cardsVar}[__openagentI];if(__openagentCandidate&&(__openagentCandidate.outputText||__openagentCandidate.text))__openagentToolMsgCard=window.__openagentRenderToolCard(__openagentCandidate,${toolMessageSidebarArg})}for(let __openagentI=0;__openagentI<${cardsVar}.length&&!__openagentToolMsgCard;__openagentI++){__openagentToolMsgCard=window.__openagentRenderToolCard(${cardsVar}[__openagentI],${toolMessageSidebarArg})}}if(__openagentToolMsgCard)return ${toolMessageHtmlVar}\`<div class="\${${chatBubbleClassVar}}">\${__openagentToolMsgCard}</div>\`;`;
|
|
357
|
+
`${marker}let __openagentToolMsgCard=null;console.log('[openagent] toolMsg hook: cards='+${cardsVar}.length+' mediaVar='+${mediaVar});if(!${mediaVar}&&window.__openagentRenderToolCard){for(let __openagentI=${cardsVar}.length-1;__openagentI>=0&&!__openagentToolMsgCard;__openagentI--){let __openagentCandidate=${cardsVar}[__openagentI];if(__openagentCandidate&&(__openagentCandidate.outputText||__openagentCandidate.text))__openagentToolMsgCard=window.__openagentRenderToolCard(__openagentCandidate,${toolMessageSidebarArg})}for(let __openagentI=0;__openagentI<${cardsVar}.length&&!__openagentToolMsgCard;__openagentI++){__openagentToolMsgCard=window.__openagentRenderToolCard(${cardsVar}[__openagentI],${toolMessageSidebarArg})}}if(__openagentToolMsgCard)return ${toolMessageHtmlVar}\`<div class="\${${chatBubbleClassVar}}">\${__openagentToolMsgCard}</div>\`;`;
|
|
339
358
|
const toolMessageInsertAt = toolMessageFn!.bodyStart + toolMessageReturnIdx;
|
|
340
359
|
content = content.substring(0, toolMessageInsertAt) + toolMessageHook + content.substring(toolMessageInsertAt);
|
|
341
360
|
patchedToolMessageWrapper = true;
|
|
@@ -344,9 +363,8 @@ const toolcardRender: UIExtension = {
|
|
|
344
363
|
}
|
|
345
364
|
}
|
|
346
365
|
}
|
|
347
|
-
}
|
|
348
366
|
|
|
349
|
-
|
|
367
|
+
writeFileSync(bundlePath, content, 'utf-8');
|
|
350
368
|
logger.info(`[ui-ext:regex] toolcard-render: patched ${funcName}(${params.substring(0, 20)}) html=${litHtmlVar}${patchedWrapper ? ' + wrapper' : ''}${patchedToolMessageWrapper ? ' + tool-message' : ''}`);
|
|
351
369
|
return true;
|
|
352
370
|
},
|