@tomflow/chatloop-tools 0.4.15 → 0.4.16
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 +2 -0
- package/lib/extension-proxy.mjs +7 -3
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -21,6 +21,8 @@ Usage: chatloop-tools start [desktop-commander|tunnel]
|
|
|
21
21
|
Start all enabled tools or one.
|
|
22
22
|
```
|
|
23
23
|
|
|
24
|
+
MCP `chat_loop_extension__start` 入参为 `{projectId, prompt, confirmed:true}`,可选 `replaceBlockedSessionId` 仅用于在双重核验旧 Session `BLOCKED` 且新 projectId 不同的情况下显式开启**新任务**;不提供 `force`,不重发旧任务。`status` 保持只读,未知回执不自动重试。
|
|
25
|
+
|
|
24
26
|
Extension Actions 委托 `@tomflow/chatloop-extension` 公共 CLI,不复制浏览器操作。具体安全边界和协议见 [Local Tools 产品文档](../../docs/local-tools.md),实际部署与已验证状态见 [CURRENT](../../context/CURRENT.md)。
|
|
25
27
|
|
|
26
28
|
|
package/lib/extension-proxy.mjs
CHANGED
|
@@ -19,7 +19,8 @@ export const extensionTools=[
|
|
|
19
19
|
extensionTool('reload','Request reload of Chat Loop Extension; final health is unverified.',false),
|
|
20
20
|
extensionTool('status','Read the unique current Mac Chrome Web Chat Owner; never starts or sends.',true),
|
|
21
21
|
extensionTool('start','After confirmed intent and preflight, ask Extension to start one unique Web Chat; fails if any task owns it.',false,
|
|
22
|
-
{projectId:{type:'string',minLength:1,maxLength:128},prompt:{type:'string',minLength:1,maxLength:4000},confirmed:{const:true}
|
|
22
|
+
{projectId:{type:'string',minLength:1,maxLength:128},prompt:{type:'string',minLength:1,maxLength:4000},confirmed:{const:true},
|
|
23
|
+
replaceBlockedSessionId:{type:'string',pattern:'^[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}$'}},
|
|
23
24
|
['projectId','prompt','confirmed']),
|
|
24
25
|
extensionTool('continue','Submit next-turn text with turnToken and nextPrompt; alternatively query its final status with turnToken and intentId. Only the Extension can send after Turn completion.',false,
|
|
25
26
|
{turnToken:{type:'string'},nextPrompt:{type:'string',minLength:1,maxLength:4000},
|
|
@@ -61,10 +62,13 @@ export async function forwardExtensionAction(name,args={}) {
|
|
|
61
62
|
invocation.args.push(String(args.tabId));
|
|
62
63
|
}else if(!control && Object.keys(args).length)return fail('INVALID_ARGUMENT');
|
|
63
64
|
if(name==='start'){
|
|
64
|
-
if(Object.keys(args).some(k=>!['projectId','prompt','confirmed'].includes(k))
|
|
65
|
+
if(Object.keys(args).some(k=>!['projectId','prompt','confirmed','replaceBlockedSessionId'].includes(k))
|
|
65
66
|
||!(/^[a-zA-Z0-9][a-zA-Z0-9._-]{0,127}$/).test(args.projectId||'')
|
|
66
67
|
||typeof args.prompt!=='string'||!args.prompt.trim()||args.prompt.length>4000
|
|
67
|
-
||args.confirmed!==true
|
|
68
|
+
||args.confirmed!==true
|
|
69
|
+
||(args.replaceBlockedSessionId!==undefined
|
|
70
|
+
&& !/^[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}$/i.test(args.replaceBlockedSessionId)))
|
|
71
|
+
return fail('INVALID_ARGUMENT');
|
|
68
72
|
}
|
|
69
73
|
if(control&&name!=='start'){
|
|
70
74
|
const query=Object.hasOwn(args,'intentId')||args.lookup===true;
|