@clinebot/agents 0.0.0
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 +145 -0
- package/dist/agent-input.d.ts +2 -0
- package/dist/agent.d.ts +56 -0
- package/dist/extensions.d.ts +21 -0
- package/dist/hooks/engine.d.ts +42 -0
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/lifecycle.d.ts +5 -0
- package/dist/hooks/node.d.ts +2 -0
- package/dist/hooks/subprocess-runner.d.ts +16 -0
- package/dist/hooks/subprocess.d.ts +268 -0
- package/dist/index.browser.d.ts +1 -0
- package/dist/index.browser.js +49 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +49 -0
- package/dist/index.node.d.ts +5 -0
- package/dist/index.node.js +49 -0
- package/dist/mcp/index.d.ts +4 -0
- package/dist/mcp/policies.d.ts +14 -0
- package/dist/mcp/tools.d.ts +9 -0
- package/dist/mcp/types.d.ts +35 -0
- package/dist/message-builder.d.ts +31 -0
- package/dist/prompts/cline.d.ts +1 -0
- package/dist/prompts/index.d.ts +1 -0
- package/dist/runtime/agent-runtime-bus.d.ts +13 -0
- package/dist/runtime/conversation-store.d.ts +16 -0
- package/dist/runtime/lifecycle-orchestrator.d.ts +28 -0
- package/dist/runtime/tool-orchestrator.d.ts +39 -0
- package/dist/runtime/turn-processor.d.ts +21 -0
- package/dist/teams/index.d.ts +3 -0
- package/dist/teams/multi-agent.d.ts +566 -0
- package/dist/teams/spawn-agent-tool.d.ts +85 -0
- package/dist/teams/team-tools.d.ts +51 -0
- package/dist/tools/ask-question.d.ts +12 -0
- package/dist/tools/create.d.ts +59 -0
- package/dist/tools/execution.d.ts +61 -0
- package/dist/tools/formatting.d.ts +20 -0
- package/dist/tools/index.d.ts +11 -0
- package/dist/tools/registry.d.ts +26 -0
- package/dist/tools/validation.d.ts +27 -0
- package/dist/types.d.ts +826 -0
- package/package.json +54 -0
- package/src/agent-input.ts +116 -0
- package/src/agent.test.ts +931 -0
- package/src/agent.ts +1050 -0
- package/src/example.test.ts +564 -0
- package/src/extensions.ts +337 -0
- package/src/hooks/engine.test.ts +163 -0
- package/src/hooks/engine.ts +537 -0
- package/src/hooks/index.ts +6 -0
- package/src/hooks/lifecycle.ts +239 -0
- package/src/hooks/node.ts +18 -0
- package/src/hooks/subprocess-runner.ts +140 -0
- package/src/hooks/subprocess.test.ts +180 -0
- package/src/hooks/subprocess.ts +620 -0
- package/src/index.browser.ts +1 -0
- package/src/index.node.ts +21 -0
- package/src/index.ts +133 -0
- package/src/mcp/index.ts +17 -0
- package/src/mcp/policies.test.ts +51 -0
- package/src/mcp/policies.ts +53 -0
- package/src/mcp/tools.test.ts +76 -0
- package/src/mcp/tools.ts +60 -0
- package/src/mcp/types.ts +41 -0
- package/src/message-builder.test.ts +175 -0
- package/src/message-builder.ts +429 -0
- package/src/prompts/cline.ts +49 -0
- package/src/prompts/index.ts +1 -0
- package/src/runtime/agent-runtime-bus.ts +53 -0
- package/src/runtime/conversation-store.ts +61 -0
- package/src/runtime/lifecycle-orchestrator.ts +90 -0
- package/src/runtime/tool-orchestrator.ts +177 -0
- package/src/runtime/turn-processor.ts +250 -0
- package/src/streaming.test.ts +197 -0
- package/src/streaming.ts +307 -0
- package/src/teams/index.ts +63 -0
- package/src/teams/multi-agent.lifecycle.test.ts +48 -0
- package/src/teams/multi-agent.ts +1866 -0
- package/src/teams/spawn-agent-tool.test.ts +172 -0
- package/src/teams/spawn-agent-tool.ts +223 -0
- package/src/teams/team-tools.test.ts +448 -0
- package/src/teams/team-tools.ts +929 -0
- package/src/tools/ask-question.ts +78 -0
- package/src/tools/create.ts +104 -0
- package/src/tools/execution.ts +311 -0
- package/src/tools/formatting.ts +73 -0
- package/src/tools/index.ts +45 -0
- package/src/tools/registry.ts +52 -0
- package/src/tools/tools.test.ts +292 -0
- package/src/tools/validation.ts +73 -0
- package/src/types.ts +966 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import{providers as Rr}from"@clinebot/llms";async function cn(n,r,o,e){let i=ro(r),E=await eo(o,e);if(i.length===0&&!E)return n;let f=[{type:"text",text:n},...i];if(E)f.push(...E);return f}function ro(n){if(!n||n.length===0)return[];let r=[];for(let o of n){let e=oo(o);if(e)r.push(e)}return r}function oo(n){let r=n.trim();if(!r)return;let o=r.match(/^data:([^;,]+);base64,(.+)$/);if(o){let e=o[1],i=o[2];if(!e||!i)return;return{type:"image",mediaType:e,data:i}}return{type:"image",mediaType:"image/png",data:r}}async function eo(n,r){if(!n||n.length===0)return;let o=r??(async()=>{throw Error("File loading is not configured in this runtime. Provide userFileContentLoader to enable userFiles support.")}),e=await Promise.all(n.map(async(i)=>{let E=i.replace(/\\/g,"/");try{let f=await o(i);return{type:"file",path:E,content:f}}catch(f){let s=f instanceof Error?f.message:String(f);return{type:"file",path:E,content:`Error fetching content: ${s}`}}}));if(e.length===0)return;return e}var io=new Set(["hooks","tools","commands","shortcuts","flags","message_renderers","providers"]),Eo=new Set(["input","runtime_event","session_start","run_start","iteration_start","turn_start","before_agent_start","tool_call_before","tool_call_after","turn_end","iteration_end","run_end","session_shutdown","error"]),zn={input:"onInput",runtime_event:"onRuntimeEvent",session_start:"onSessionStart",run_start:"onRunStart",iteration_start:"onIterationStart",turn_start:"onTurnStart",before_agent_start:"onBeforeAgentStart",tool_call_before:"onToolCall",tool_call_after:"onToolResult",turn_end:"onAgentEnd",iteration_end:"onIterationEnd",run_end:"onRunEnd",session_shutdown:"onSessionShutdown",error:"onError"};function fo(n,r){return n.name||`extension_${String(r).padStart(4,"0")}`}function so(n){return typeof n.onInput==="function"||typeof n.onRuntimeEvent==="function"||typeof n.onSessionStart==="function"||typeof n.onRunStart==="function"||typeof n.onIterationStart==="function"||typeof n.onTurnStart==="function"||typeof n.onBeforeAgentStart==="function"||typeof n.onToolCall==="function"||typeof n.onToolResult==="function"||typeof n.onAgentEnd==="function"||typeof n.onIterationEnd==="function"||typeof n.onRunEnd==="function"||typeof n.onSessionShutdown==="function"||typeof n.onError==="function"}function So(n,r){let o=fo(n,r),e=n.manifest;if(!e||typeof e!=="object")throw Error(`Invalid manifest for extension "${o}": manifest is required`);if(!Array.isArray(e.capabilities)||e.capabilities.length===0)throw Error(`Invalid manifest for extension "${o}": capabilities must be a non-empty array`);let i=new Set;for(let _ of e.capabilities){if(!io.has(_))throw Error(`Invalid manifest for extension "${o}": unsupported capability "${String(_)}"`);i.add(_)}let E=e.hookStages??[];if(!Array.isArray(E))throw Error(`Invalid manifest for extension "${o}": hookStages must be an array when provided`);let f=new Set;for(let _ of E){if(!Eo.has(_))throw Error(`Invalid manifest for extension "${o}": unsupported hook stage "${String(_)}"`);f.add(_)}let s=i.has("hooks");if(so(n)&&!s)throw Error(`Invalid manifest for extension "${o}": hook handlers require the "hooks" capability`);if(s&&f.size===0)throw Error(`Invalid manifest for extension "${o}": hooks capability requires at least one hook stage`);for(let _ of f){let P=zn[_];if(typeof n[P]!=="function")throw Error(`Invalid manifest for extension "${o}": stage "${_}" is declared but handler "${P}" is missing`)}for(let[_,P]of Object.entries(zn))if(typeof n[P]==="function"&&!f.has(_))throw Error(`Invalid manifest for extension "${o}": handler "${P}" must declare stage "${_}"`);return{capabilities:i,hookStages:f,raw:e}}class xn{extensions;registry={tools:[],commands:[],shortcuts:[],flags:[],messageRenderers:[],providers:[]};normalized=[];phase="resolve";constructor(n={}){this.extensions=n.extensions??[]}resolve(){if(this.phase!=="resolve")return;this.normalized=this.extensions.map((n,r)=>({extension:n,order:r,manifest:{capabilities:new Set,hookStages:new Set,raw:n.manifest}})),this.phase="validate"}validate(){if(this.phase==="resolve")this.resolve();if(this.phase!=="validate")return;this.normalized=this.normalized.map((n)=>({...n,manifest:So(n.extension,n.order)})),this.phase="setup"}async setup(){if(this.phase==="resolve")this.resolve();if(this.phase==="validate")this.validate();if(this.phase!=="setup")return;let n={registerTool:(r)=>this.registry.tools.push(r),registerCommand:(r)=>this.registry.commands.push(r),registerShortcut:(r)=>this.registry.shortcuts.push(r),registerFlag:(r)=>this.registry.flags.push(r),registerMessageRenderer:(r)=>this.registry.messageRenderers.push(r),registerProvider:(r)=>this.registry.providers.push(r)};for(let{extension:r}of this.normalized)await r.setup?.(n);this.phase="activate"}activate(){if(this.phase==="resolve")this.resolve();if(this.phase==="validate")this.validate();if(this.phase==="setup")throw Error("Contribution registry setup must complete before activation");if(this.phase!=="activate")return;this.phase="run"}async initialize(){this.resolve(),this.validate(),await this.setup(),this.activate()}isActivated(){return this.phase==="run"}getRegistrySnapshot(){return{tools:[...this.registry.tools],commands:[...this.registry.commands],shortcuts:[...this.registry.shortcuts],flags:[...this.registry.flags],messageRenderers:[...this.registry.messageRenderers],providers:[...this.registry.providers]}}getRegisteredTools(){return[...this.registry.tools]}getValidatedExtensions(){if(this.phase==="resolve")this.resolve();if(this.phase==="validate")this.validate();return this.normalized.slice().sort((n,r)=>n.order-r.order).map(({extension:n})=>n)}}function an(n={}){return new xn(n)}function vo(n,r){let o=(r.priority??0)-(n.priority??0);if(o!==0)return o;return n.name.localeCompare(r.name)}var _o={input:{mode:"blocking",timeoutMs:2500,retries:0,retryDelayMs:100,failureMode:"fail_open",maxConcurrency:1,queueLimit:100},runtime_event:{mode:"async",timeoutMs:1500,retries:0,retryDelayMs:100,failureMode:"fail_open",maxConcurrency:4,queueLimit:2000},session_start:{mode:"blocking",timeoutMs:2500,retries:0,retryDelayMs:100,failureMode:"fail_open",maxConcurrency:1,queueLimit:100},run_start:{mode:"blocking",timeoutMs:2500,retries:0,retryDelayMs:100,failureMode:"fail_open",maxConcurrency:1,queueLimit:100},iteration_start:{mode:"blocking",timeoutMs:2000,retries:0,retryDelayMs:100,failureMode:"fail_open",maxConcurrency:1,queueLimit:200},turn_start:{mode:"blocking",timeoutMs:2000,retries:0,retryDelayMs:100,failureMode:"fail_open",maxConcurrency:1,queueLimit:200},before_agent_start:{mode:"blocking",timeoutMs:3000,retries:0,retryDelayMs:100,failureMode:"fail_open",maxConcurrency:1,queueLimit:200},tool_call_before:{mode:"blocking",timeoutMs:4000,retries:1,retryDelayMs:150,failureMode:"fail_open",maxConcurrency:1,queueLimit:500},tool_call_after:{mode:"blocking",timeoutMs:3000,retries:1,retryDelayMs:200,failureMode:"fail_open",maxConcurrency:1,queueLimit:1000},turn_end:{mode:"blocking",timeoutMs:3000,retries:1,retryDelayMs:200,failureMode:"fail_open",maxConcurrency:1,queueLimit:500},iteration_end:{mode:"async",timeoutMs:3000,retries:1,retryDelayMs:200,failureMode:"fail_open",maxConcurrency:2,queueLimit:500},run_end:{mode:"async",timeoutMs:3000,retries:1,retryDelayMs:200,failureMode:"fail_open",maxConcurrency:2,queueLimit:500},session_shutdown:{mode:"async",timeoutMs:3000,retries:1,retryDelayMs:200,failureMode:"fail_open",maxConcurrency:2,queueLimit:500},error:{mode:"async",timeoutMs:1500,retries:0,retryDelayMs:100,failureMode:"fail_open",maxConcurrency:2,queueLimit:500}};function To(n,r){if(!n&&!r)return;let o=[...Array.isArray(n?.appendMessages)?n.appendMessages:[],...Array.isArray(r?.appendMessages)?r.appendMessages:[]],e={cancel:!!(n?.cancel||r?.cancel),review:!!(n?.review||r?.review),context:[n?.context,r?.context].filter((E)=>typeof E==="string"&&!!E).join(`
|
|
2
|
+
`),overrideInput:Object.hasOwn(r??{},"overrideInput")?r?.overrideInput:n?.overrideInput},i=typeof r?.systemPrompt==="string"?r.systemPrompt:n?.systemPrompt;if(typeof i==="string")e.systemPrompt=i;if(o.length>0)e.appendMessages=o;return e}function Pn(n,r){return{mode:r?.mode??n.mode,timeoutMs:r?.timeoutMs??n.timeoutMs,retries:r?.retries??n.retries,retryDelayMs:r?.retryDelayMs??n.retryDelayMs,failureMode:r?.failureMode??n.failureMode,maxConcurrency:Math.max(1,r?.maxConcurrency??n.maxConcurrency),queueLimit:Math.max(1,r?.queueLimit??n.queueLimit)}}function ho(n){return n instanceof Error?n:Error(String(n))}function yo(n){return!!n&&typeof n==="object"}async function Ro(n,r,o,e){if(r<=0)return await n;let i;try{return await Promise.race([n,new Promise((E,f)=>{i=setTimeout(()=>{f(Error(`Hook handler "${o}" timed out after ${r}ms at stage "${e}"`))},r)})])}finally{if(i)clearTimeout(i)}}class u{handlers=new Map;options;sequence=0;eventCounter=0;stageQueues=new Map;inFlight=new Set;constructor(n={}){this.options=n}register(n){let r=this.handlers.get(n.stage)??[];r.push(n),r.sort(vo),this.handlers.set(n.stage,r)}async dispatch(n){let r={eventId:`hook_evt_${String(++this.eventCounter).padStart(8,"0")}`,stage:n.stage,createdAt:new Date,sequence:++this.sequence,runId:n.runId,agentId:n.agentId,conversationId:n.conversationId,parentAgentId:n.parentAgentId,iteration:n.iteration,parentEventId:n.parentEventId,payload:n.payload},o=this.getHandlers(n.stage);if(o.length===0)return{event:r,queued:!1,dropped:!1,control:void 0,results:[]};let e=this.resolveStagePolicy(n.stage);if(e.mode==="async"){let E=this.getStageQueueState(n.stage);if(E.items.length>=e.queueLimit)return this.options.onDroppedEvent?.(r,e),{event:r,queued:!1,dropped:!0,control:void 0,results:[]};return E.items.push({event:r,stagePolicy:e,handlers:o}),this.kickQueue(n.stage),{event:r,queued:!0,dropped:!1,control:void 0,results:[]}}let i=await this.executeHandlers(r,o,e);return{event:r,queued:!1,dropped:!1,control:this.mergeControlsFromResults(i),results:i}}async shutdown(n=3000){let r=Date.now();while(this.inFlight.size>0){if(Date.now()-r>=n)break;await Promise.race([...this.inFlight])}}getHandlers(n){return[...this.handlers.get(n)??[]]}getStageQueueState(n){let r=this.stageQueues.get(n);if(r)return r;let o={activeCount:0,items:[]};return this.stageQueues.set(n,o),o}kickQueue(n){let r=this.getStageQueueState(n),o=this.resolveStagePolicy(n);while(r.activeCount<o.maxConcurrency&&r.items.length>0){let e=r.items.shift();if(!e)return;r.activeCount+=1;let i=this.executeHandlers(e.event,e.handlers,e.stagePolicy).then(()=>{return}).catch(()=>{}).finally(()=>{r.activeCount-=1,this.inFlight.delete(i),this.kickQueue(n)});this.inFlight.add(i)}}resolveStagePolicy(n){let r=Pn(_o[n],this.options.policies?.defaultPolicy);return Pn(r,this.options.policies?.stages?.[n])}resolveHandlerPolicy(n,r){let o=this.resolveStagePolicy(n);return Pn(o,this.options.policies?.handlers?.[r])}async executeHandlers(n,r,o){let e=[];for(let i of r){let E=this.resolveHandlerPolicy(n.stage,i.name);if(o.mode==="async"&&E.mode==="blocking"){e.push({handlerName:i.name,stage:n.stage,status:"skipped",attempts:0,durationMs:0});continue}let f=await this.executeHandler(n,i,E);if(e.push(f),(f.status==="error"||f.status==="timeout")&&E.failureMode==="fail_closed")throw f.error??Error(`Hook handler "${i.name}" failed at stage "${n.stage}"`)}return e}async executeHandler(n,r,o){let e=Date.now(),i=0,E,f="error";while(i<=o.retries){i+=1;try{let s=await Ro(Promise.resolve(r.handle(n)),o.timeoutMs,r.name,n.stage),v=yo(s)?s:void 0;return{handlerName:r.name,stage:n.stage,status:"ok",attempts:i,durationMs:Date.now()-e,control:v}}catch(s){if(E=ho(s),f=/timed out/i.test(E.message)?"timeout":"error",this.options.onDispatchError?.(E,n,r.name),i<=o.retries&&o.retryDelayMs>0)await new Promise((v)=>setTimeout(v,o.retryDelayMs))}}return{handlerName:r.name,stage:n.stage,status:f,attempts:i,durationMs:Date.now()-e,error:E}}mergeControlsFromResults(n){let r;for(let o of n){if(o.status!=="ok")continue;r=To(r,o.control)}return r}}var Po={input:{name:"onInput",handler:(n,r)=>n.onInput?.(r.payload)},session_start:{name:"onSessionStart",handler:(n,r)=>n.onSessionStart?.(r.payload)},run_start:{name:"onRunStart",handler:(n,r)=>n.onRunStart?.(r.payload)},iteration_start:{name:"onIterationStart",handler:(n,r)=>n.onIterationStart?.(r.payload)},turn_start:{name:"onTurnStart",handler:(n,r)=>n.onTurnStart?.(r.payload)},before_agent_start:{name:"onBeforeAgentStart",handler:(n,r)=>n.onBeforeAgentStart?.(r.payload)},tool_call_before:{name:"onToolCall",handler:(n,r)=>n.onToolCall?.(r.payload)},tool_call_after:{name:"onToolResult",handler:(n,r)=>n.onToolResult?.(r.payload)},turn_end:{name:"onAgentEnd",handler:(n,r)=>n.onAgentEnd?.(r.payload)},iteration_end:{name:"onIterationEnd",handler:async(n,r)=>{await n.onIterationEnd?.(r.payload);return}},run_end:{name:"onRunEnd",handler:async(n,r)=>{await n.onRunEnd?.(r.payload);return}},session_shutdown:{name:"onSessionShutdown",handler:(n,r)=>n.onSessionShutdown?.(r.payload)},error:{name:"onError",handler:async(n,r)=>{await n.onError?.(r.payload);return}},runtime_event:{name:"onRuntimeEvent",handler:async(n,r)=>{await n.onRuntimeEvent?.(r.payload);return}}};function wn(n,r){let o=(i)=>{n.register(i)},e=r.hooks;if(e?.onSessionStart)o({name:"hooks.onSessionStart",stage:"session_start",handle:(i)=>e.onSessionStart?.(i.payload)});if(e?.onRunStart)o({name:"hooks.onRunStart",stage:"run_start",handle:(i)=>e.onRunStart?.(i.payload)});if(e?.onRunEnd)o({name:"hooks.onRunEnd",stage:"run_end",handle:async(i)=>{await e.onRunEnd?.(i.payload);return}});if(e?.onIterationStart)o({name:"hooks.onIterationStart",stage:"iteration_start",handle:(i)=>e.onIterationStart?.(i.payload)});if(e?.onIterationEnd)o({name:"hooks.onIterationEnd",stage:"iteration_end",handle:async(i)=>{await e.onIterationEnd?.(i.payload);return}});if(e?.onTurnStart)o({name:"hooks.onTurnStart",stage:"turn_start",handle:(i)=>e.onTurnStart?.(i.payload)});if(e?.onTurnEnd)o({name:"hooks.onTurnEnd",stage:"turn_end",handle:(i)=>e.onTurnEnd?.(i.payload)});if(e?.onToolCallStart)o({name:"hooks.onToolCallStart",stage:"tool_call_before",handle:(i)=>e.onToolCallStart?.(i.payload)});if(e?.onToolCallEnd)o({name:"hooks.onToolCallEnd",stage:"tool_call_after",handle:(i)=>e.onToolCallEnd?.(i.payload)});if(e?.onSessionShutdown)o({name:"hooks.onSessionShutdown",stage:"session_shutdown",handle:(i)=>e.onSessionShutdown?.(i.payload)});if(e?.onError)o({name:"hooks.onError",stage:"error",handle:async(i)=>{await e.onError?.(i.payload);return}});for(let[i,E]of(r.extensions??[]).entries()){if(!E.manifest.capabilities.includes("hooks"))continue;let f=String(i).padStart(4,"0"),s=E.name||`extension_${f}`,v=`${f}:${s}`,_=new Set(E.manifest.hookStages??[]);for(let P of _){let D=Po[P];if(!D)continue;o({name:`${v}.${D.name}`,stage:P,handle:(R)=>D.handler(E,R)})}}}var wo=new Set(["read","read_files","bash","run_commands"]),Co=new Set(["read","read_files"]);class Cn{maxToolResultChars;targetToolNames;indexedMessageCount=0;indexedTailRef;toolNameByIdCache=new Map;readPathsByToolUseIdCache=new Map;latestReadToolUseByPathCache=new Map;readResultPathCache=new WeakMap;constructor(n=50000,r=wo){this.maxToolResultChars=n;this.targetToolNames=r}buildForApi(n){this.reindex(n);let r=this.toolNameByIdCache,o=this.readPathsByToolUseIdCache,e=this.latestReadToolUseByPathCache;return n.map((i)=>{if(!Array.isArray(i.content))return i;let E=i.content.map((f)=>{if(f.type==="file"){let _=this.truncateMiddle(f.content);if(_===f.content)return f;return{...f,content:_}}if(f.type!=="tool_result")return f;let s=r.get(f.tool_use_id),v=f.content;if(this.isReadTool(s)){let _=this.getReadResultRecord(f,o.get(f.tool_use_id));if(_){let P=_.paths.filter((D)=>e.get(D)!==f.tool_use_id);if(P.length>0)v=this.replaceOutdatedReadContent(v,P)}}if(this.shouldTruncateTool(s))v=this.truncateToolResultContent(v);if(v===f.content)return f;return{...f,content:v}});return{...i,content:E}})}reindex(n){if(n.length<this.indexedMessageCount)this.resetIndexes();if(this.indexedMessageCount>0&&n.length>=this.indexedMessageCount&&n[this.indexedMessageCount-1]!==this.indexedTailRef)this.resetIndexes();for(let r=this.indexedMessageCount;r<n.length;r++){let o=n[r];if(!Array.isArray(o.content))continue;for(let e of o.content){if(e.type==="tool_use"){let i=e.name.toLowerCase();if(this.toolNameByIdCache.set(e.id,i),this.isReadTool(i)){let E=this.extractPathsFromReadToolInput(e.input);if(E.length>0)this.readPathsByToolUseIdCache.set(e.id,E)}continue}if(e.type==="tool_result"){let i=this.toolNameByIdCache.get(e.tool_use_id);if(!this.isReadTool(i))continue;let E=this.getReadResultRecord(e,this.readPathsByToolUseIdCache.get(e.tool_use_id));if(!E)continue;for(let f of E.paths)this.latestReadToolUseByPathCache.set(f,E.toolUseId)}}}this.indexedMessageCount=n.length,this.indexedTailRef=n.length>0?n[n.length-1]:void 0}resetIndexes(){this.indexedMessageCount=0,this.indexedTailRef=void 0,this.toolNameByIdCache.clear(),this.readPathsByToolUseIdCache.clear(),this.latestReadToolUseByPathCache.clear(),this.readResultPathCache=new WeakMap}getReadResultRecord(n,r){let o=n,e=this.readResultPathCache.get(o),i=e??this.extractReadPathsFromToolResultContent(n.content);if(!e)this.readResultPathCache.set(o,i);let E=i.length>0?i:r??[];if(E.length===0)return;return{toolUseId:n.tool_use_id,paths:E}}extractPathsFromReadToolInput(n){let r=[],o=n.path,e=n.file_path,i=n.file_paths;if(typeof o==="string"&&o.length>0)r.push(o);if(typeof e==="string"&&e.length>0)r.push(e);if(Array.isArray(i)){for(let E of i)if(typeof E==="string"&&E.length>0)r.push(E)}return Array.from(new Set(r))}extractReadPathsFromToolResultContent(n){if(typeof n!=="string")return[];try{let r=JSON.parse(n);return this.extractPathsFromParsedReadResult(r)}catch{return[]}}extractPathsFromParsedReadResult(n){if(Array.isArray(n)){let o=n.map((e)=>this.extractPathFromResultEntry(e)).filter((e)=>typeof e==="string"&&e.length>0);return Array.from(new Set(o))}let r=this.extractPathFromResultEntry(n);return r?[r]:[]}extractPathFromResultEntry(n){if(!n||typeof n!=="object")return;let r=n,o=[r.path,r.file_path,r.filePath,r.query];for(let e of o)if(typeof e==="string"&&e.length>0)return e;return}replaceOutdatedReadContent(n,r){let o=new Set(r);if(typeof n==="string")return this.replaceOutdatedReadContentInString(n,o)??"[outdated - see the latest file content]";return n.map((e)=>{if(e.type==="file"){if(!o.has(e.path))return e;return{...e,content:"[outdated - see the latest file content]"}}if(e.type!=="text")return e;let i=this.replaceOutdatedReadContentInString(e.text,o);if(i===null)return{...e,text:"[outdated - see the latest file content]"};if(i===e.text)return e;return{...e,text:i}})}replaceOutdatedReadContentInString(n,r){try{let o=JSON.parse(n),e=this.replaceOutdatedReadContentInParsed(o,r);return JSON.stringify(e)}catch{return null}}replaceOutdatedReadContentInParsed(n,r){if(Array.isArray(n))return n.map((o)=>this.replaceOutdatedReadEntry(o,r));return this.replaceOutdatedReadEntry(n,r)}replaceOutdatedReadEntry(n,r){if(!n||typeof n!=="object")return n;let o={...n},e=this.extractPathFromResultEntry(o);if(!e||!r.has(e))return n;if(typeof o.result==="string")o.result="[outdated - see the latest file content]";else if(typeof o.content==="string")o.content="[outdated - see the latest file content]";else o.result="[outdated - see the latest file content]";return o}isReadTool(n){if(!n)return!1;return Co.has(n.toLowerCase())}shouldTruncateTool(n){if(!n)return!1;return this.targetToolNames.has(n.toLowerCase())}truncateToolResultContent(n){if(typeof n==="string")return this.truncateMiddle(n);return n.map((r)=>{if(r.type==="file"){let e=this.truncateMiddle(r.content);if(e===r.content)return r;return{...r,content:e}}if(r.type!=="text")return r;let o=this.truncateMiddle(r.text);if(o===r.text)return r;return{...r,text:o}})}truncateMiddle(n){if(n.length<=this.maxToolResultChars)return n;let r=1e5,e=`
|
|
3
|
+
|
|
4
|
+
...[truncated ${Math.max(0,n.length-r)} chars]...
|
|
5
|
+
|
|
6
|
+
`,i=n.slice(0,50000),E=n.slice(-50000);return`${i}${e}${E}`}}function pn(){let n=0,r=0,o=new Map,e=new Map;return{subscribeRuntimeEvent:(i)=>{let E=++n;return o.set(E,i),()=>{o.delete(E)}},subscribeLifecycleEvent:(i)=>{let E=++r;return e.set(E,i),()=>{e.delete(E)}},emitRuntimeEvent:(i)=>{for(let E of o.values())E(i)},emitLifecycleEvent:(i)=>{for(let E of e.values())E(i)}}}function An(){return`conv_${Date.now()}_${Math.random().toString(36).slice(2,9)}`}class Hn{messages=[];conversationId=An();sessionStarted=!1;constructor(n){if((n?.length??0)>0)this.restore(n??[])}getConversationId(){return this.conversationId}getMessages(){return[...this.messages]}appendMessage(n){this.messages.push(n)}appendMessages(n){if(n.length===0)return;this.messages.push(...n)}resetForRun(){this.messages=[],this.conversationId=An(),this.sessionStarted=!1}clearHistory(){this.messages=[],this.conversationId=An(),this.sessionStarted=!1}restore(n){this.messages=[...n],this.sessionStarted=!1}isSessionStarted(){return this.sessionStarted}markSessionStarted(){this.sessionStarted=!0}}class Dn{hookEngine;runtimeBus;getRunId;getAgentId;getConversationId;getParentAgentId;onHookContext;onDispatchError;constructor(n){this.hookEngine=n.hookEngine,this.runtimeBus=n.runtimeBus,this.getRunId=n.getRunId,this.getAgentId=n.getAgentId,this.getConversationId=n.getConversationId,this.getParentAgentId=n.getParentAgentId,this.onHookContext=n.onHookContext,this.onDispatchError=n.onDispatchError}async dispatch(n,r){this.runtimeBus.emitLifecycleEvent({stage:r.stage,iteration:r.iteration,payload:r.payload});let o=await this.hookEngine.dispatch({...r,runId:this.getRunId(),agentId:this.getAgentId(),conversationId:this.getConversationId(),parentAgentId:this.getParentAgentId()});if(o.control?.context)this.onHookContext?.(n,o.control.context);return o.control}dispatchRuntimeEvent(n){this.hookEngine.dispatch({stage:"runtime_event",runId:this.getRunId(),agentId:this.getAgentId(),conversationId:this.getConversationId(),parentAgentId:this.getParentAgentId(),payload:{agentId:this.getAgentId(),conversationId:this.getConversationId(),parentAgentId:this.getParentAgentId(),event:n}}).catch((r)=>{this.onDispatchError?.(r)})}async shutdown(n){await this.hookEngine.shutdown(n)}}import{z as k}from"zod";var tn=k.enum(["connector.started","connector.stopping","message.received","message.completed","message.failed","session.started","session.reused","thread.reset","schedule.delivery.started","schedule.delivery.sent","schedule.delivery.failed"]),Ao=k.object({adapter:k.string(),botUserName:k.string().optional(),event:tn,payload:k.record(k.string(),k.unknown()),ts:k.string()});var nr=[{modelsDevKey:"openai",generatedProviderId:"openai",runtimeProviderId:"openai-native"},{modelsDevKey:"openai",generatedProviderId:"openai",runtimeProviderId:"openai-codex"},{modelsDevKey:"anthropic",generatedProviderId:"anthropic"},{modelsDevKey:"anthropic",generatedProviderId:"anthropic",runtimeProviderId:"claude-code"},{modelsDevKey:"google",generatedProviderId:"gemini"},{modelsDevKey:"deepseek",generatedProviderId:"deepseek"},{modelsDevKey:"xai",generatedProviderId:"xai"},{modelsDevKey:"togetherai",runtimeProviderId:"together",generatedProviderId:"together"},{modelsDevKey:"sap-ai-core",runtimeProviderId:"sapaicore",generatedProviderId:"sapaicore"},{modelsDevKey:"fireworks-ai",runtimeProviderId:"fireworks",generatedProviderId:"fireworks"},{modelsDevKey:"groq",runtimeProviderId:"groq",generatedProviderId:"groq"},{modelsDevKey:"cerebras",runtimeProviderId:"cerebras",generatedProviderId:"cerebras"},{modelsDevKey:"sambanova",runtimeProviderId:"sambanova",generatedProviderId:"sambanova"},{modelsDevKey:"nebius",runtimeProviderId:"nebius",generatedProviderId:"nebius"},{modelsDevKey:"huggingface",runtimeProviderId:"huggingface",generatedProviderId:"huggingface"},{modelsDevKey:"openrouter",runtimeProviderId:"cline",generatedProviderId:"openrouter"},{modelsDevKey:"ollama",runtimeProviderId:"ollama-cloud"},{modelsDevKey:"ollama-cloud",generatedProviderId:"ollama"},{modelsDevKey:"vercel",runtimeProviderId:"dify",generatedProviderId:"vercel-ai-gateway"},{modelsDevKey:"vercel",generatedProviderId:"vercel-ai-gateway"},{modelsDevKey:"aihubmix",runtimeProviderId:"aihubmix",generatedProviderId:"aihubmix"},{modelsDevKey:"hicap",runtimeProviderId:"hicap"},{modelsDevKey:"nous-research",runtimeProviderId:"nousResearch"},{modelsDevKey:"huawei-cloud-maas",runtimeProviderId:"huawei-cloud-maas"},{modelsDevKey:"baseten",runtimeProviderId:"baseten",generatedProviderId:"baseten"},{modelsDevKey:"google-vertex-anthropic",generatedProviderId:"vertex"},{modelsDevKey:"lmstudio",generatedProviderId:"lmstudio"},{modelsDevKey:"zai",generatedProviderId:"zai"},{modelsDevKey:"requesty",generatedProviderId:"requesty"},{modelsDevKey:"amazon-bedrock",generatedProviderId:"bedrock"},{modelsDevKey:"moonshotai",generatedProviderId:"moonshot"},{modelsDevKey:"minimax",generatedProviderId:"minimax"}];function Ho(n){return Object.fromEntries(nr.flatMap((r)=>{let o=n==="modelsDevKey"?r.modelsDevKey:r.generatedProviderId;return o?[[r.modelsDevKey,o]]:[]}))}var Do=Ho("generatedProviderId");import{z as K}from"zod";var On=K.object({agentId:K.string(),conversationId:K.string(),iteration:K.number(),abortSignal:K.custom().optional(),metadata:K.record(K.string(),K.unknown()).optional()}),c=K.object({id:K.string(),name:K.string(),input:K.unknown(),output:K.unknown(),error:K.string().optional(),durationMs:K.number(),startedAt:K.date(),endedAt:K.date()});class M extends Error{constructor(n,r){super(`${n} at position ${r}`);this.position=r}}function rr(n){return/^[0-9A-Fa-f]$/.test(n)}function Z(n){return n>="0"&&n<="9"}function or(n){return n>=" "}function z(n){return`,:[]/{}()
|
|
7
|
+
+`.includes(n)}function gn(n){return n>="a"&&n<="z"||n>="A"&&n<="Z"||n==="_"||n==="$"}function Ln(n){return n>="a"&&n<="z"||n>="A"&&n<="Z"||n==="_"||n==="$"||n>="0"&&n<="9"}var qn=/^(http|https|ftp|mailto|file|data|irc):\/\/$/,Kn=/^[A-Za-z0-9-._~:/?#@!$&'()*+;=]$/;function $n(n){return`,[]/{}
|
|
8
|
+
+`.includes(n)}function Nn(n){return x(n)||Oo.test(n)}var Oo=/^[[{\w-]$/;function er(n){return n===`
|
|
9
|
+
`||n==="\r"||n==="\t"||n==="\b"||n==="\f"}function X(n,r){let o=n.charCodeAt(r);return o===32||o===10||o===9||o===13}function ir(n,r){let o=n.charCodeAt(r);return o===32||o===9||o===13}function Er(n,r){let o=n.charCodeAt(r);return o===160||o===6158||o>=8192&&o<=8203||o===8239||o===8287||o===12288||o===65279}function x(n){return Bn(n)||on(n)}function Bn(n){return n==='"'||n==="“"||n==="”"}function ln(n){return n==='"'}function on(n){return n==="'"||n==="‘"||n==="’"||n==="`"||n==="´"}function Jn(n){return n==="'"}function I(n,r){let o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!1,e=n.lastIndexOf(r);return e!==-1?n.substring(0,e)+(o?"":n.substring(e+1)):n}function J(n,r){let o=n.length;if(!X(n,o-1))return n+r;while(X(n,o-1))o--;return n.substring(0,o)+r+n.substring(o)}function fr(n,r,o){return n.substring(0,r)+n.substring(r+o)}function sr(n){return/[,\n][ \t\r]*$/.test(n)}var go={"\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r","\t":"\\t"},Lo={'"':'"',"\\":"\\","/":"/",b:"\b",f:"\f",n:`
|
|
10
|
+
`,r:"\r",t:"\t"};function Yn(n){let r=0,o="";if(_(["```","[```","{```"]),!E())pr();_(["```","```]","```}"]);let i=D(",");if(i)f();if(Nn(n[r])&&sr(o)){if(!i)o=J(o,",");l()}else if(i)o=I(o,",");while(n[r]==="}"||n[r]==="]")r++,f();if(r>=n.length)return o;ar();function E(){f();let h=Y()||N()||A()||Q()||hn()||p(!1)||t();return f(),h}function f(){let h=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!0,w=r,H=s(h);do if(H=v(),H)H=s(h);while(H);return r>w}function s(h){let w=h?X:ir,H="";while(!0)if(w(n,r))H+=n[r],r++;else if(Er(n,r))H+=" ",r++;else break;if(H.length>0)return o+=H,!0;return!1}function v(){if(n[r]==="/"&&n[r+1]==="*"){while(r<n.length&&!qo(n,r))r++;return r+=2,!0}if(n[r]==="/"&&n[r+1]==="/"){while(r<n.length&&n[r]!==`
|
|
11
|
+
`)r++;return!0}return!1}function _(h){if(P(h)){if(gn(n[r]))while(r<n.length&&Ln(n[r]))r++;return f(),!0}return!1}function P(h){s(!0);for(let w of h){let H=r+w.length;if(n.slice(r,H)===w)return r=H,!0}return!1}function D(h){if(n[r]===h)return o+=n[r],r++,!0;return!1}function R(h){if(n[r]===h)return r++,!0;return!1}function q(){return R("\\")}function B(){if(f(),n[r]==="."&&n[r+1]==="."&&n[r+2]===".")return r+=3,f(),R(","),!0;return!1}function Y(){if(n[r]==="{"){if(o+="{",r++,f(),R(","))f();let h=!0;while(r<n.length&&n[r]!=="}"){let w;if(!h){if(w=D(","),!w)o=J(o,",");f()}else w=!0,h=!1;if(B(),!(A()||p(!0))){if(n[r]==="}"||n[r]==="{"||n[r]==="]"||n[r]==="["||n[r]===void 0)o=I(o,",");else tr();break}f();let rn=D(":"),U=r>=n.length;if(!rn)if(Nn(n[r])||U)o=J(o,":");else bn();if(!E())if(rn||U)o+="null";else bn()}if(n[r]==="}")o+="}",r++;else o=J(o,"}");return!0}return!1}function N(){if(n[r]==="["){if(o+="[",r++,f(),R(","))f();let h=!0;while(r<n.length&&n[r]!=="]"){if(!h){if(!D(","))o=J(o,",")}else h=!1;if(B(),!E()){o=I(o,",");break}}if(n[r]==="]")o+="]",r++;else o=J(o,"]");return!0}return!1}function l(){let h=!0,w=!0;while(w){if(!h){if(!D(","))o=J(o,",")}else h=!1;w=E()}if(!w)o=I(o,",");o=`[
|
|
12
|
+
${o}
|
|
13
|
+
]`}function A(){let h=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!1,w=arguments.length>1&&arguments[1]!==void 0?arguments[1]:-1,H=n[r]==="\\";if(H)r++,H=!0;if(x(n[r])){let rn=ln(n[r])?ln:Jn(n[r])?Jn:on(n[r])?on:Bn,U=r,b=o.length,L='"';r++;while(!0){if(r>=n.length){let $=mn(r-1);if(!h&&z(n.charAt($)))return r=U,o=o.substring(0,b),A(!0);return L=J(L,'"'),o+=L,!0}if(r===w)return L=J(L,'"'),o+=L,!0;if(rn(n[r])){let $=r,Rn=L.length;if(L+='"',r++,o+=L,f(!1),h||r>=n.length||z(n[r])||x(n[r])||Z(n[r]))return y(),!0;let G=mn($-1),un=n.charAt(G);if(un===",")return r=U,o=o.substring(0,b),A(!1,G);if(z(un))return r=U,o=o.substring(0,b),A(!0);o=o.substring(0,b),r=$+1,L=`${L.substring(0,Rn)}\\${L.substring(Rn)}`}else if(h&&$n(n[r])){if(n[r-1]===":"&&qn.test(n.substring(U+1,r+2)))while(r<n.length&&Kn.test(n[r]))L+=n[r],r++;return L=J(L,'"'),o+=L,y(),!0}else if(n[r]==="\\"){let $=n.charAt(r+1);if(Lo[$]!==void 0)L+=n.slice(r,r+2),r+=2;else if($==="u"){let G=2;while(G<6&&rr(n[r+G]))G++;if(G===6)L+=n.slice(r,r+6),r+=6;else if(r+G>=n.length)r=n.length;else no()}else L+=$,r+=2}else{let $=n.charAt(r);if($==='"'&&n[r-1]!=="\\")L+=`\\${$}`,r++;else if(er($))L+=go[$],r++;else{if(!or($))xr($);L+=$,r++}}if(H)q()}}return!1}function y(){let h=!1;f();while(n[r]==="+"){h=!0,r++,f(),o=I(o,'"',!0);let w=o.length;if(A())o=fr(o,w,1);else o=J(o,'"')}return h}function Q(){let h=r;if(n[r]==="-"){if(r++,nn())return yn(h),!0;if(!Z(n[r]))return r=h,!1}while(Z(n[r]))r++;if(n[r]==="."){if(r++,nn())return yn(h),!0;if(!Z(n[r]))return r=h,!1;while(Z(n[r]))r++}if(n[r]==="e"||n[r]==="E"){if(r++,n[r]==="-"||n[r]==="+")r++;if(nn())return yn(h),!0;if(!Z(n[r]))return r=h,!1;while(Z(n[r]))r++}if(!nn())return r=h,!1;if(r>h){let w=n.slice(h,r),H=/^0\d/.test(w);return o+=H?`"${w}"`:w,!0}return!1}function hn(){return V("true","true")||V("false","false")||V("null","null")||V("True","true")||V("False","false")||V("None","null")}function V(h,w){if(n.slice(r,r+h.length)===h)return o+=w,r+=h.length,!0;return!1}function p(h){let w=r;if(gn(n[r])){while(r<n.length&&Ln(n[r]))r++;let H=r;while(X(n,H))H++;if(n[H]==="("){if(r=H+1,E(),n[r]===")"){if(r++,n[r]===";")r++}return!0}}while(r<n.length&&!$n(n[r])&&!x(n[r])&&(!h||n[r]!==":"))r++;if(n[r-1]===":"&&qn.test(n.substring(w,r+2)))while(r<n.length&&Kn.test(n[r]))r++;if(r>w){while(X(n,r-1)&&r>0)r--;let H=n.slice(w,r);if(o+=H==="undefined"?"null":JSON.stringify(H),n[r]==='"')r++;return!0}}function t(){if(n[r]==="/"){let h=r;r++;while(r<n.length&&(n[r]!=="/"||n[r-1]==="\\"))r++;return r++,o+=JSON.stringify(n.substring(h,r)),!0}}function mn(h){let w=h;while(w>0&&X(n,w))w--;return w}function nn(){return r>=n.length||z(n[r])||X(n,r)}function yn(h){o+=`${n.slice(h,r)}0`}function xr(h){throw new M(`Invalid character ${JSON.stringify(h)}`,r)}function ar(){throw new M(`Unexpected character ${JSON.stringify(n[r])}`,r)}function pr(){throw new M("Unexpected end of json string",n.length)}function tr(){throw new M("Object key expected",r)}function bn(){throw new M("Colon expected",r)}function no(){let h=n.slice(r,r+6);throw new M(`Invalid unicode character "${h}"`,r)}}function qo(n,r){return n[r]==="*"&&n[r+1]==="/"}function Sr(n){return JSON.parse(n)}function Vn(n){if(typeof n!=="string")return n;let r=n.trimStart();if(!(r.startsWith("{")||r.startsWith("[")))return n;try{return Sr(r)}catch{try{return Sr(Yn(r))}catch{return n}}}import{z as vr}from"zod";function g(n,r){let o=n.safeParse(r);if(!o.success)throw Error(vr.prettifyError(o.error));return o.data}function O(n){return vr.toJSONSchema(n)}function dr(n,r){return`<file_content path="${n}">
|
|
14
|
+
${r}
|
|
15
|
+
</file_content>`}function _r(n){let r=n?.trim();return r?r:void 0}function Qn(n){if(!n)return;let r=typeof n==="function"?n():n;if(!r)return;let o=_r(r.rootSessionId),e=_r(r.hookLogPath);if(!o&&!e)return;return{rootSessionId:o,hookLogPath:e}}import{z as En}from"zod";import{z as Ko}from"zod";function C(n){let r=n.inputSchema instanceof Ko.ZodType?O(n.inputSchema):n.inputSchema;return{name:n.name,description:n.description,inputSchema:r,execute:n.execute,timeoutMs:n.timeoutMs??30000,retryable:n.retryable??!0,maxRetries:n.maxRetries??2}}function Gn(n){return{name:n.name,description:n.description,inputSchema:{type:"object",properties:n.inputSchema.properties,required:n.inputSchema.required,additionalProperties:n.inputSchema.additionalProperties}}}function en(n){return n.map(Gn)}var fn=En.object({question:En.string().min(1).describe('The single question to ask the user. E.g. "How can I help you?"'),options:En.array(En.string().min(1)).min(2).max(5).describe("Array of 2-5 user-selectable answer options for the single question")});function $o(n,r,o){return Promise.race([n,new Promise((e,i)=>{setTimeout(()=>i(Error(o)),r)})])}function Tr(n,r={}){let o=r.askQuestionTimeoutMs??15000;return C({name:"ask_question",description:"Ask user a question for clarifying or gathering information needed to complete the task. For example, ask the user clarifying questions about a key implementation decision. You should only ask one question. Provide an array of 2-5 options for the user to choose from. Never include an option to toggle to Act mode.",inputSchema:O(fn),timeoutMs:o,retryable:!1,maxRetries:0,execute:async(e,i)=>{let E=g(fn,e);return $o(n(E.question,E.options,i),o,`ask_question timed out after ${o}ms`)}})}async function hr(n,r,o){let e=Date.now(),i=n.timeoutMs??30000,E,f,s=new Promise((_,P)=>{E=setTimeout(()=>{P(Error(`Tool execution timed out after ${i}ms`))},i)}),v=o.abortSignal?new Promise((_,P)=>{if(o.abortSignal?.aborted){P(Error("Tool execution was aborted"));return}f=()=>{P(Error("Tool execution was aborted"))},o.abortSignal?.addEventListener("abort",f)}):null;try{let _=[n.execute(r,o),s];if(v)_.push(v);let P=await Promise.race(_),D=Date.now()-e;return{output:P,durationMs:D}}catch(_){let P=Date.now()-e;return{output:null,error:_ instanceof Error?_.message:String(_),durationMs:P}}finally{if(E)clearTimeout(E);if(o.abortSignal&&f)o.abortSignal.removeEventListener("abort",f)}}async function yr(n,r,o){let e=n.maxRetries??2,i=null;for(let E=0;E<=e;E++){if(o.abortSignal?.aborted)return{output:null,error:"Tool execution was aborted",durationMs:i?.durationMs??0};let f=await hr(n,r,o);if(i=f,!f.error)return f;if(!n.retryable||E===e)return f;let s=Math.min(1000*2**E,1e4);await new Promise((v)=>setTimeout(v,s))}return i}async function kn(n,r,o,e,i,E){let f=async(R)=>{let q=new Date;await e?.onToolCallStart?.(R);let B=n.get(R.name);if(!B){let y=new Date,Q={id:R.id,name:R.name,input:R.input,output:null,error:`Unknown tool: ${R.name}`,durationMs:y.getTime()-q.getTime(),startedAt:q,endedAt:y};return await e?.onToolCallEnd?.(Q),Q}let Y=await i?.authorize?.(R,o);if(Y&&!Y.allowed){let y=new Date,Q={id:R.id,name:R.name,input:R.input,output:null,error:Y.reason,durationMs:y.getTime()-q.getTime(),startedAt:q,endedAt:y};return await e?.onToolCallEnd?.(Q),Q}let N=await yr(B,R.input,o),l=new Date,A={id:R.id,name:R.name,input:R.input,output:N.output,error:N.error,durationMs:N.durationMs,startedAt:q,endedAt:l};return await e?.onToolCallEnd?.(A),A},s=Math.max(1,E?.maxConcurrency??(r.length||1)),v=Array(r.length),_=0,P=Math.min(s,r.length),D=Array.from({length:P},async()=>{while(!0){let R=_++;if(R>=r.length)return;v[R]=await f(r[R])}});return await Promise.all(D),v}function Mn(n,r){if(r)return JSON.stringify({error:r});if(n===null||n===void 0)return"null";if(typeof n==="string")return n;if(typeof n==="number"||typeof n==="boolean")return String(n);try{return JSON.stringify(n)}catch{return String(n)}}function sn(n){let r=new Map;for(let o of n){if(r.has(o.name))throw Error(`Duplicate tool name: ${o.name}`);r.set(o.name,o)}return r}import{z as hi}from"zod";function Xn(n){let r=new Set;for(let o of n){if(r.has(o.name))throw Error(`Duplicate tool name: ${o.name}`);r.add(o.name)}}class Zn{options;constructor(n){this.options=n}async execute(n,r,o,e,i){let E=!1;return{results:await kn(n,r,o,{onToolCallStart:async(s)=>{this.options.onLog?.("debug","Tool call started",{agentId:this.options.getAgentId(),conversationId:this.options.getConversationId(),runId:e.runId,iteration:e.iteration,toolCallId:s.id,toolName:s.name}),this.options.emit({type:"content_start",contentType:"tool",toolName:s.name,toolCallId:s.id,input:s.input});let v=await this.options.dispatchLifecycle({source:"hook.tool_call_before",iteration:e.iteration,stage:"tool_call_before",payload:{agentId:this.options.getAgentId(),conversationId:this.options.getConversationId(),parentAgentId:this.options.getParentAgentId(),iteration:e.iteration,call:s}});if(v?.overrideInput!==void 0)s.input=v.overrideInput;if(v?.review)s.review=!0;if(v?.cancel)E=!0,this.options.onCancelRequested?.()},onToolCallEnd:async(s)=>{if(this.options.onLog?.("debug","Tool call finished",{agentId:this.options.getAgentId(),conversationId:this.options.getConversationId(),runId:e.runId,iteration:e.iteration,toolCallId:s.id,toolName:s.name,durationMs:s.durationMs,error:s.error}),this.options.emit({type:"content_end",contentType:"tool",toolName:s.name,toolCallId:s.id,output:s.output,error:s.error,durationMs:s.durationMs}),(await this.options.dispatchLifecycle({source:"hook.tool_call_after",iteration:e.iteration,stage:"tool_call_after",payload:{agentId:this.options.getAgentId(),conversationId:this.options.getConversationId(),parentAgentId:this.options.getParentAgentId(),iteration:e.iteration,record:s}}))?.cancel)E=!0}},{authorize:async(s,v)=>this.options.authorizeToolCall(s,v)},i),cancelRequested:E}}buildToolResultMessage(n,r,o){let e=[];for(let i of n)e.push({type:"tool_result",tool_use_id:i.id,content:Mn(i.output,i.error),is_error:!!i.error});if(o.afterIterations>0&&r>=o.afterIterations)e.push({type:"text",text:o.text});return{role:"user",content:e}}}class Sn{handler;messageBuilder;emit;constructor(n){this.handler=n.handler,this.messageBuilder=n.messageBuilder,this.emit=n.emit}async processTurn(n,r,o,e){let i=en(o),E=this.messageBuilder.buildForApi(n),f=this.handler.createMessage(r,E,i),s="",v,_="",P,D=[],R={inputTokens:0,outputTokens:0,cacheReadTokens:void 0,cacheWriteTokens:void 0,cost:void 0},q=!1,B,Y=new Map;for await(let y of f){if(e.aborted)break;switch(B=y.id??B,y.type){case"text":if(s+=y.text,y.signature)v=y.signature;this.emit({type:"content_start",contentType:"text",text:y.text,accumulated:s});break;case"reasoning":if(_+=y.reasoning,y.signature)P=y.signature;if(y.redacted_data)D.push(y.redacted_data);this.emit({type:"content_start",contentType:"reasoning",reasoning:y.reasoning,redacted:!!y.redacted_data});break;case"tool_calls":this.processToolCallChunk(y,Y);break;case"usage":R.inputTokens=y.inputTokens,R.outputTokens=y.outputTokens,R.cacheReadTokens=y.cacheReadTokens,R.cacheWriteTokens=y.cacheWriteTokens,R.cost=y.totalCost;break;case"done":if(q=y.incompleteReason==="max_tokens",!y.success&&y.error)throw Error(y.error);break}}let N=this.finalizePendingToolCalls(Y),l=[];if(s)this.emit({type:"content_end",contentType:"text",text:s});if(_||D.length>0){this.emit({type:"content_end",contentType:"reasoning",reasoning:_}),l.push({type:"thinking",thinking:_,signature:P});for(let y of D)l.push({type:"redacted_thinking",data:y})}if(s)l.push({type:"text",text:s,signature:v});for(let y of N)l.push({type:"tool_use",id:y.id,name:y.name,input:y.input,signature:y.signature});let A=l.length>0?{role:"assistant",content:l}:void 0;return{turn:{text:s,reasoning:_||void 0,toolCalls:N,usage:R,truncated:q,responseId:B},assistantMessage:A}}processToolCallChunk(n,r){let{tool_call:o}=n,e=o.call_id??o.function.id??`call_${Date.now()}`,i=r.get(e);if(!i)i={name:void 0,arguments:""},r.set(e,i);if(o.function.name)i.name=o.function.name;if(o.function.arguments)if(typeof o.function.arguments==="string"){let E=o.function.arguments,f=E.trimStart();if((f.startsWith("{")||f.startsWith("["))&&this.tryParseJson(E)!==void 0)i.arguments=E;else i.arguments+=E}else i.arguments=JSON.stringify(o.function.arguments);if(n.signature)i.signature=n.signature}finalizePendingToolCalls(n){let r=[];for(let[o,e]of n.entries()){if(!e.name||!e.arguments)continue;let i=this.tryParseJson(e.arguments);if(i===void 0)continue;r.push({id:o,name:e.name,input:i,signature:e.signature})}return r}tryParseJson(n){let r=Vn(n);return r===n?void 0:r}}var No="REMINDER: If you have gathered enough information to answer the user's question, please provide your final answer now without using any more tools.";function Bo(n){if(n.providerConfig?.knownModels)return n.providerConfig.knownModels;if(n.knownModels)return n.knownModels;try{return Rr.toProviderConfig({provider:n.providerId,model:n.modelId,apiKey:n.apiKey,baseUrl:n.baseUrl,headers:n.headers}).knownModels}catch{return}}class a{config;handler;toolRegistry;abortController=null;contributionRegistry;hookEngine;messageBuilder;logger;extensionsInitialized=!1;activeRunId="";runState="idle";runtimeBus=pn();conversationStore;lifecycle;turnProcessor;toolOrchestrator;agentId;parentAgentId;constructor(n){this.config={...n,maxIterations:n.maxIterations,maxParallelToolCalls:n.maxParallelToolCalls??8,apiTimeoutMs:n.apiTimeoutMs??120000,maxTokensPerTurn:n.maxTokensPerTurn??8192,reminderAfterIterations:n.reminderAfterIterations??50,reminderText:n.reminderText??No,hookErrorMode:n.hookErrorMode??"ignore",extensions:n.extensions??[],toolPolicies:n.toolPolicies??{}},this.agentId=`agent_${Date.now()}_${Math.random().toString(36).slice(2,9)}`,this.parentAgentId=n.parentAgentId??null,this.conversationStore=new Hn(n.initialMessages??[]),this.logger=n.logger,this.contributionRegistry=an({extensions:this.config.extensions}),this.contributionRegistry.resolve(),this.contributionRegistry.validate();let r=this.config.hookErrorMode==="throw"?"fail_closed":"fail_open";this.hookEngine=new u({policies:{defaultPolicy:{failureMode:r},...this.config.hookPolicies},onDispatchError:(o)=>{this.reportRecoverableError(o)}}),wn(this.hookEngine,{...this.config,extensions:this.contributionRegistry.getValidatedExtensions()}),this.messageBuilder=new Cn,this.toolRegistry=sn([]),this.handler=this.createHandlerFromConfig(this.config),this.turnProcessor=new Sn({handler:this.handler,messageBuilder:this.messageBuilder,emit:(o)=>this.emit(o)}),this.lifecycle=new Dn({hookEngine:this.hookEngine,runtimeBus:this.runtimeBus,getRunId:()=>this.activeRunId||this.conversationStore.getConversationId(),getAgentId:()=>this.agentId,getConversationId:()=>this.conversationStore.getConversationId(),getParentAgentId:()=>this.parentAgentId,onHookContext:(o,e)=>this.appendHookContext(o,e),onDispatchError:(o)=>this.reportRecoverableError(o)}),this.toolOrchestrator=new Zn({getAgentId:()=>this.agentId,getConversationId:()=>this.conversationStore.getConversationId(),getParentAgentId:()=>this.parentAgentId,emit:(o)=>this.emit(o),dispatchLifecycle:({source:o,iteration:e,stage:i,payload:E})=>this.lifecycle.dispatch(o,{stage:i,iteration:e,payload:E}),authorizeToolCall:(o,e)=>this.authorizeToolCall(o,e),onCancelRequested:()=>{this.abortController?.abort()},onLog:(o,e,i)=>{this.log(o,e,i)}}),this.runtimeBus.subscribeRuntimeEvent((o)=>{try{this.config.onEvent?.(o)}catch{}}),this.runtimeBus.subscribeRuntimeEvent((o)=>{this.lifecycle.dispatchRuntimeEvent(o)})}async run(n,r,o){this.assertCanStartRun(),this.log("info","Agent run requested",{agentId:this.agentId,conversationId:this.conversationStore.getConversationId(),messageLength:n.length}),await this.ensureExtensionsInitialized(),this.conversationStore.resetForRun();let e=await this.prepareUserInput(n,"run");if(e.cancel)return this.buildAbortedResult(new Date,"");return this.conversationStore.appendMessage({role:"user",content:await this.buildInitialUserContent(e.input,r,o)}),this.executeLoop(e.input)}async continue(n,r,o){this.assertCanStartRun(),this.log("info","Agent continue requested",{agentId:this.agentId,conversationId:this.conversationStore.getConversationId(),messageLength:n.length}),await this.ensureExtensionsInitialized();let e=await this.prepareUserInput(n,"continue");if(e.cancel)return this.buildAbortedResult(new Date,"");return this.conversationStore.appendMessage({role:"user",content:await this.buildInitialUserContent(e.input,r,o)}),this.executeLoop(e.input)}getMessages(){return this.conversationStore.getMessages()}clearHistory(){this.conversationStore.clearHistory()}restore(n){this.conversationStore.restore(n)}abort(){this.abortController?.abort()}subscribeEvents(n){return this.runtimeBus.subscribeRuntimeEvent(n)}async shutdown(n){if(this.runState==="running")throw Error("Cannot shutdown agent while a run is in progress");if(this.runState==="shutting_down")return;this.runState="shutting_down";try{await this.lifecycle.dispatch("hook.session_shutdown",{stage:"session_shutdown",payload:{agentId:this.agentId,conversationId:this.conversationStore.getConversationId(),parentAgentId:this.parentAgentId,reason:n}}),await this.lifecycle.shutdown()}finally{this.runState="idle"}}getExtensionRegistry(){return this.contributionRegistry.getRegistrySnapshot()}getAgentId(){return this.agentId}getConversationId(){return this.conversationStore.getConversationId()}updateConnection(n){this.config={...this.config,...n},this.handler=this.createHandlerFromConfig(this.config),this.turnProcessor=new Sn({handler:this.handler,messageBuilder:this.messageBuilder,emit:(r)=>this.emit(r)})}assertCanStartRun(){if(this.runState==="running")throw Error("Cannot start a new run while another run is already in progress");if(this.runState==="shutting_down")throw Error("Cannot start a run while agent is shutting down")}createHandlerFromConfig(n){let r=n.providerConfig?.providerId===n.providerId?n.providerConfig:void 0,o={...r??{},providerId:n.providerId,modelId:n.modelId,apiKey:n.apiKey??r?.apiKey,baseUrl:n.baseUrl??r?.baseUrl,headers:n.headers??r?.headers,knownModels:Bo(n),maxOutputTokens:n.maxTokensPerTurn,reasoningEffort:n.reasoningEffort,thinkingBudgetTokens:n.thinkingBudgetTokens,thinking:n.thinking,abortSignal:n.abortSignal};return Rr.createHandler(o)}async executeLoop(n){if(this.runState!=="idle")throw Error(`Cannot start agent run while state is "${this.runState}"`);this.runState="running";let r=new Date,o=`run_${Date.now()}_${Math.random().toString(36).slice(2,9)}`;this.activeRunId=o,this.abortController=new AbortController,this.log("info","Agent loop started",{agentId:this.agentId,conversationId:this.conversationStore.getConversationId(),runId:o,triggerLength:n.length});let e=this.mergeAbortSignals(this.config.abortSignal,this.abortController.signal),i=0,E="completed",f="",s=[],v={inputTokens:0,outputTokens:0,cacheReadTokens:0,cacheWriteTokens:0,totalCost:void 0};try{if(!this.conversationStore.isSessionStarted()){if((await this.lifecycle.dispatch("hook.session_start",{stage:"session_start",payload:{agentId:this.agentId,conversationId:this.conversationStore.getConversationId(),parentAgentId:this.parentAgentId,schedule:this.config.schedule}}))?.cancel)E="aborted";this.conversationStore.markSessionStarted()}if((await this.lifecycle.dispatch("hook.run_start",{stage:"run_start",payload:{agentId:this.agentId,conversationId:this.conversationStore.getConversationId(),parentAgentId:this.parentAgentId,userMessage:n}}))?.cancel)E="aborted";while(E!=="aborted"){if(this.config.maxIterations!==void 0&&i>=this.config.maxIterations){E="max_iterations";break}if(e.aborted){E="aborted";break}if(i++,this.log("debug","Agent iteration started",{agentId:this.agentId,conversationId:this.conversationStore.getConversationId(),runId:o,iteration:i}),(await this.lifecycle.dispatch("hook.iteration_start",{stage:"iteration_start",iteration:i,payload:{agentId:this.agentId,conversationId:this.conversationStore.getConversationId(),parentAgentId:this.parentAgentId,iteration:i}}))?.cancel){E="aborted";break}if(this.emit({type:"iteration_start",iteration:i}),(await this.lifecycle.dispatch("hook.turn_start",{stage:"turn_start",iteration:i,payload:{agentId:this.agentId,conversationId:this.conversationStore.getConversationId(),parentAgentId:this.parentAgentId,iteration:i,messages:this.conversationStore.getMessages()}}))?.cancel){E="aborted";break}let N=await this.lifecycle.dispatch("hook.before_agent_start",{stage:"before_agent_start",iteration:i,payload:{agentId:this.agentId,conversationId:this.conversationStore.getConversationId(),parentAgentId:this.parentAgentId,iteration:i,systemPrompt:this.config.systemPrompt,messages:this.conversationStore.getMessages()}}),l=typeof N?.systemPrompt==="string"?N.systemPrompt:this.config.systemPrompt;if(N?.cancel){E="aborted";break}if(N?.appendMessages&&N.appendMessages.length>0)this.conversationStore.appendMessages(N.appendMessages);let{turn:A,assistantMessage:y}=await this.turnProcessor.processTurn(this.conversationStore.getMessages(),l,this.config.tools,e);if(y)this.conversationStore.appendMessage(y);if((await this.lifecycle.dispatch("hook.turn_end",{stage:"turn_end",iteration:i,payload:{agentId:this.agentId,conversationId:this.conversationStore.getConversationId(),parentAgentId:this.parentAgentId,iteration:i,turn:A}}))?.cancel){E="aborted";break}if(f=A.text,v.inputTokens+=A.usage.inputTokens,v.outputTokens+=A.usage.outputTokens,v.cacheReadTokens=(v.cacheReadTokens??0)+(A.usage.cacheReadTokens??0),v.cacheWriteTokens=(v.cacheWriteTokens??0)+(A.usage.cacheWriteTokens??0),typeof A.usage.cost==="number")v.totalCost=(v.totalCost??0)+A.usage.cost;if(this.emit({type:"usage",inputTokens:A.usage.inputTokens,outputTokens:A.usage.outputTokens,cacheReadTokens:A.usage.cacheReadTokens,cacheWriteTokens:A.usage.cacheWriteTokens,cost:A.usage.cost,totalInputTokens:v.inputTokens,totalOutputTokens:v.outputTokens,totalCost:v.totalCost}),A.toolCalls.length===0){let t=this.config.completionGuard?.();if(t){this.log("info","Completion guard prevented early exit",{agentId:this.agentId,conversationId:this.conversationStore.getConversationId(),runId:o,iteration:i}),this.conversationStore.appendMessage({role:"user",content:[{type:"text",text:t}]});continue}this.emit({type:"iteration_end",iteration:i,hadToolCalls:!1,toolCallCount:0}),await this.lifecycle.dispatch("hook.iteration_end",{stage:"iteration_end",iteration:i,payload:{agentId:this.agentId,conversationId:this.conversationStore.getConversationId(),parentAgentId:this.parentAgentId,iteration:i,hadToolCalls:!1,toolCallCount:0}}),E="completed";break}let hn={agentId:this.agentId,conversationId:this.conversationStore.getConversationId(),iteration:i,abortSignal:e},{results:V,cancelRequested:p}=await this.toolOrchestrator.execute(this.toolRegistry,A.toolCalls,hn,{iteration:i,runId:o},{maxConcurrency:this.config.maxParallelToolCalls});if(s.push(...V),this.conversationStore.appendMessage(this.toolOrchestrator.buildToolResultMessage(V,i,{afterIterations:this.config.reminderAfterIterations,text:this.config.reminderText})),this.emit({type:"iteration_end",iteration:i,hadToolCalls:!0,toolCallCount:A.toolCalls.length}),await this.lifecycle.dispatch("hook.iteration_end",{stage:"iteration_end",iteration:i,payload:{agentId:this.agentId,conversationId:this.conversationStore.getConversationId(),parentAgentId:this.parentAgentId,iteration:i,hadToolCalls:!0,toolCallCount:A.toolCalls.length}}),p){this.log("warn","Agent iteration cancelled by tool lifecycle",{agentId:this.agentId,conversationId:this.conversationStore.getConversationId(),runId:o,iteration:i}),E="aborted";break}this.log("debug","Agent iteration finished",{agentId:this.agentId,conversationId:this.conversationStore.getConversationId(),runId:o,iteration:i,toolCalls:A.toolCalls.length})}}catch(q){E="error",this.log("error","Agent loop failed",{agentId:this.agentId,conversationId:this.conversationStore.getConversationId(),runId:o,error:q});let B=q instanceof Error?q:Error(String(q));throw await this.lifecycle.dispatch("hook.error",{stage:"error",iteration:i,payload:{agentId:this.agentId,conversationId:this.conversationStore.getConversationId(),parentAgentId:this.parentAgentId,iteration:i,error:B}}),this.emit({type:"error",error:B,recoverable:!1,iteration:i}),q}finally{if(this.abortController=null,this.activeRunId="",this.runState==="running")this.runState="idle"}let _=new Date,P=_.getTime()-r.getTime(),D=this.handler.getModel();this.emit({type:"done",reason:E,text:f,iterations:i}),this.log("info","Agent loop finished",{agentId:this.agentId,conversationId:this.conversationStore.getConversationId(),runId:o,finishReason:E,iterations:i,durationMs:P});let R={text:f,usage:v,messages:this.conversationStore.getMessages(),toolCalls:s,iterations:i,finishReason:E,model:{id:D.id,provider:this.config.providerId,info:D.info},startedAt:r,endedAt:_,durationMs:P};return await this.lifecycle.dispatch("hook.run_end",{stage:"run_end",iteration:i,payload:{agentId:this.agentId,conversationId:this.conversationStore.getConversationId(),parentAgentId:this.parentAgentId,result:R}}),await this.lifecycle.shutdown(),R}async ensureExtensionsInitialized(){if(this.extensionsInitialized)return;try{await this.contributionRegistry.initialize()}catch(r){if(this.config.hookErrorMode==="throw")throw r;this.emit({type:"error",error:r instanceof Error?r:Error(String(r)),recoverable:!0,iteration:0})}let n=[...this.config.tools,...this.contributionRegistry.getRegisteredTools()];Xn(n),this.config.tools=n,this.toolRegistry=sn(n),this.extensionsInitialized=!0}async prepareUserInput(n,r){let o=await this.lifecycle.dispatch("hook.input",{stage:"input",payload:{agentId:this.agentId,conversationId:this.conversationStore.getConversationId(),parentAgentId:this.parentAgentId,mode:r,input:n}}),e=Object.hasOwn(o??{},"overrideInput")&&typeof o?.overrideInput==="string"?o.overrideInput:n;if(o?.cancel)return{input:e,cancel:!0};return{input:e,cancel:!1}}async buildInitialUserContent(n,r,o){return cn(n,r,o,this.config.userFileContentLoader)}buildAbortedResult(n,r){let o=new Date,e=this.handler.getModel();return{text:r,usage:{inputTokens:0,outputTokens:0,cacheReadTokens:0,cacheWriteTokens:0,totalCost:void 0},messages:this.conversationStore.getMessages(),toolCalls:[],iterations:0,finishReason:"aborted",model:{id:e.id,provider:this.config.providerId,info:e.info},startedAt:n,endedAt:o,durationMs:o.getTime()-n.getTime()}}emit(n){this.runtimeBus.emitRuntimeEvent(n)}reportRecoverableError(n){this.log("warn","Recoverable agent error",{agentId:this.agentId,conversationId:this.conversationStore.getConversationId(),runId:this.activeRunId||this.conversationStore.getConversationId(),error:n}),this.emit({type:"error",error:n instanceof Error?n:Error(String(n)),recoverable:this.config.hookErrorMode!=="throw",iteration:0})}resolveToolPolicy(n){let r=this.config.toolPolicies?.["*"]??{},o=this.config.toolPolicies?.[n]??{};return{...r,...o}}async requestToolApproval(n,r,o,e,i){let E=this.config.requestToolApproval;if(!E)return{approved:!1,reason:`Tool "${n}" requires approval but no approval handler is configured`};try{return await E({agentId:this.agentId,conversationId:this.conversationStore.getConversationId(),iteration:e.iteration,toolCallId:r,toolName:n,input:o,policy:i})}catch(f){return{approved:!1,reason:f instanceof Error?f.message:String(f)}}}async authorizeToolCall(n,r){let o=this.resolveToolPolicy(n.name);if(o.enabled===!1)return{allowed:!1,reason:`Tool "${n.name}" is disabled by policy`};if(o.autoApprove!==!1&&n.review!==!0)return{allowed:!0};let E=await this.requestToolApproval(n.name,n.id,n.input,r,n.review===!0?{...o,autoApprove:!1}:o);if(!E.approved)return{allowed:!1,reason:E.reason?.trim()||`Tool "${n.name}" was not approved`};return{allowed:!0}}appendHookContext(n,r){let o=r.trim();if(!o)return;let e=o.startsWith("<hook_context")?o:`<hook_context source="${n}">
|
|
16
|
+
${o}
|
|
17
|
+
</hook_context>`;this.conversationStore.appendMessage({role:"user",content:[{type:"text",text:e}]})}log(n,r,o){let e=this.logger?.[n];if(!e)return;try{if(n==="error"){let i=o?.error instanceof Error?{...o,error:{name:o.error.name,message:o.error.message,stack:o.error.stack}}:o;e(r,i);return}e(r,o)}catch{}}mergeAbortSignals(...n){let r=n.filter((i)=>!!i);if(r.length===0)return new AbortController().signal;if(r.length===1)return r[0];let o=AbortSignal;if(o.any)return o.any(r);let e=new AbortController;for(let i of r){if(i.aborted){e.abort();break}i.addEventListener("abort",()=>e.abort(),{once:!0})}return e.signal}}function Wn(n){return new a(n)}import{z as T}from"zod";import{spawn as lo}from"node:child_process";function Jo(n){let r=n.trim();if(!r)return{};let e=r.split(`
|
|
18
|
+
`).map((E)=>E.trim()).filter(Boolean).filter((E)=>E.startsWith("HOOK_CONTROL\t")).map((E)=>E.slice(13)),i=e.length>0?e[e.length-1]:r;try{return{parsedJson:JSON.parse(i)}}catch(E){return{parseError:E instanceof Error?E.message:"Failed to parse subprocess stdout JSON"}}}function Pr(n,r){let o=n instanceof Error?n:Error(String(n)),e=o,i=r.join(" ");if(e.code==="EACCES")return Error(`Failed to execute hook command "${i}" (EACCES). Configure hooks with an explicit interpreter/command array (for example: ["bash", "/path/to/script"]) or make the script executable with a valid shebang.`);return Error(`Failed to execute hook command "${i}": ${o.message}`)}async function vn(n,r){let o=r.command;if(!Array.isArray(o)||o.length===0)throw Error("runSubprocessEvent requires a non-empty command");let e=!!r.detached,i=lo(o[0],o.slice(1),{cwd:r.cwd,env:r.env,stdio:e?["pipe","ignore","ignore"]:["pipe","pipe","pipe"],detached:e});if(!i.stdin)throw Error("runSubprocessEvent failed to create stdin pipe");if(i.stdin.write(JSON.stringify(n)),i.stdin.end(),e){await new Promise((_,P)=>{i.once("error",(D)=>{P(Pr(D,o))}),i.once("spawn",()=>_())}),i.unref();return}if(!i.stdout||!i.stderr)throw Error("runSubprocessEvent failed to create stdout/stderr pipes");let E="",f="",s=!1,v;return i.stdout.on("data",(_)=>{E+=_.toString()}),i.stderr.on("data",(_)=>{f+=_.toString()}),await new Promise((_,P)=>{if(i.once("error",(D)=>{P(Pr(D,o))}),(r.timeoutMs??0)>0)v=setTimeout(()=>{s=!0,i.kill("SIGKILL")},r.timeoutMs);i.once("close",(D)=>{if(v)clearTimeout(v);let{parsedJson:R,parseError:q}=Jo(E);_({exitCode:D,stdout:E,stderr:f,parsedJson:R,parseError:q,timedOut:s})})})}var Un=T.enum(["agent_start","agent_resume","agent_abort","agent_end","tool_call","tool_result","prompt_submit","pre_compact","session_shutdown"]),j=T.record(T.string(),T.string()),Yo=T.object({contextModification:T.string().optional(),cancel:T.boolean().optional(),review:T.boolean().optional(),errorMessage:T.string().optional(),context:T.string().optional(),overrideInput:T.unknown().optional()}).passthrough(),Vo=T.object({toolName:T.string(),parameters:j}),Qo=T.object({toolName:T.string(),parameters:j,result:T.string(),success:T.boolean(),executionTimeMs:T.number()}),Go=T.object({prompt:T.string(),attachments:T.array(T.string())}),ko=T.object({taskMetadata:j}),Mo=T.object({taskMetadata:j,previousState:j}),Xo=T.object({taskMetadata:j}),Zo=T.object({taskMetadata:j}),Wo=T.object({taskId:T.string(),ulid:T.string(),contextSize:T.number(),compactionStrategy:T.string(),previousApiReqIndex:T.number(),tokensIn:T.number(),tokensOut:T.number(),tokensInCache:T.number(),tokensOutCache:T.number(),deletedRangeStart:T.number(),deletedRangeEnd:T.number(),contextJsonPath:T.string(),contextRawPath:T.string()}),Fn=T.object({clineVersion:T.string(),hookName:Un,timestamp:T.string(),taskId:T.string(),sessionContext:T.object({rootSessionId:T.string().optional(),hookLogPath:T.string().optional()}).optional(),workspaceRoots:T.array(T.string()),userId:T.string(),agent_id:T.string(),parent_agent_id:T.string().nullable(),iteration:T.number().optional(),reason:T.string().optional(),tool_call:T.object({id:T.string(),name:T.string(),input:T.unknown()}).optional(),tool_result:T.custom().optional(),turn:T.custom().optional(),preToolUse:Vo.optional(),postToolUse:Qo.optional(),userPromptSubmit:Go.optional(),taskStart:ko.optional(),taskResume:Mo.optional(),taskCancel:Xo.optional(),taskComplete:Zo.optional(),preCompact:Wo.optional()}).passthrough();function Cr(n){let r=Fn.safeParse(n);if(!r.success)return;return r.data}var Uo=["agent","hook"];async function dn(n,r={}){let o=r.command??Uo;return await vn(n,{command:o,cwd:r.cwd,env:r.env,detached:r.detached,timeoutMs:r.timeoutMs})}function Ar(n){return n instanceof Error?n:Error(String(n))}function Fo(n){if(!n||typeof n!=="object")return;let r=Yo.safeParse(n);if(!r.success)return;let o=r.data;if(!(("cancel"in o)||("review"in o)||("context"in o)||("contextModification"in o)||("overrideInput"in o)||("errorMessage"in o)))return;let i=typeof o.context==="string"?o.context:typeof o.contextModification==="string"?o.contextModification:typeof o.errorMessage==="string"&&o.errorMessage.length>0?o.errorMessage:void 0;return{cancel:typeof o.cancel==="boolean"?o.cancel:void 0,review:typeof o.review==="boolean"?o.review:void 0,context:i,overrideInput:Object.hasOwn(o,"overrideInput")?o.overrideInput:void 0}}function wr(n){if(!n||typeof n!=="object")return{};let r={};for(let[o,e]of Object.entries(n))if(typeof e==="string")r[o]=e;else r[o]=JSON.stringify(e);return r}function W(n,r,o){let e=o.env??process.env,i=e.CLINE_USER_ID?.trim()||e.USER?.trim()||"unknown",E=o.cwd||process.cwd();return{clineVersion:e.CLINE_VERSION?.trim()||"",hookName:n,timestamp:new Date().toISOString(),taskId:r.conversationId,sessionContext:Qn(o.sessionContext),workspaceRoots:E?[E]:[],userId:i,agent_id:r.agentId,parent_agent_id:r.parentAgentId}}function jo(n){let r=String(n??"").toLowerCase();return r.includes("cancel")||r.includes("abort")||r.includes("interrupt")}async function F(n,r){try{let o=await dn(n,{command:r.command,cwd:r.cwd,env:r.env,detached:!0});r.onDispatch?.({payload:n,result:o,detached:!0})}catch(o){r.onDispatchError?.(Ar(o),n)}}function Hr(n={}){let r=async(f)=>{if((n.env??process.env).CLINE_HOOK_AGENT_RESUME==="1"){let _={...W("agent_resume",f,n),hookName:"agent_resume",taskResume:{taskMetadata:{},previousState:{}}};await F(_,n)}else{let _={...W("agent_start",f,n),hookName:"agent_start",taskStart:{taskMetadata:{}}};await F(_,n)}let v={...W("prompt_submit",f,n),hookName:"prompt_submit",userPromptSubmit:{prompt:f.userMessage,attachments:[]}};await F(v,n);return},o=async(f)=>{let s={...W("tool_call",f,n),hookName:"tool_call",iteration:f.iteration,tool_call:{id:f.call.id,name:f.call.name,input:f.call.input},preToolUse:{toolName:f.call.name,parameters:wr(f.call.input)}};try{let v=await dn(s,{command:n.command,cwd:n.cwd,env:n.env,detached:!1,timeoutMs:n.timeoutMs});if(n.onDispatch?.({payload:s,result:v,detached:!1}),v?.timedOut)throw Error("tool_call hook command timed out");if(v?.parseError)throw Error(`tool_call hook produced invalid control JSON: ${v.parseError}`);return Fo(v?.parsedJson)}catch(v){n.onDispatchError?.(Ar(v),s);return}},e=async(f)=>{let s={...W("tool_result",f,n),hookName:"tool_result",iteration:f.iteration,tool_result:f.record,postToolUse:{toolName:f.record.name,parameters:wr(f.record.input),result:typeof f.record.output==="string"?f.record.output:JSON.stringify(f.record.output),success:!f.record.error,executionTimeMs:f.record.durationMs}};await F(s,n);return},i=async(f)=>{let s={...W("agent_end",f,n),hookName:"agent_end",iteration:f.iteration,turn:f.turn,taskComplete:{taskMetadata:{}}};await F(s,n);return},E=async(f)=>{if(jo(f.reason)){let v={...W("agent_abort",f,n),hookName:"agent_abort",reason:f.reason,taskCancel:{taskMetadata:{}}};await F(v,n)}let s={...W("session_shutdown",f,n),hookName:"session_shutdown",reason:f.reason};await F(s,n)};return{hooks:{onRunStart:r,onToolCallStart:o,onToolCallEnd:e,onTurnEnd:i,onSessionShutdown:async({agentId:f,conversationId:s,parentAgentId:v,reason:_})=>{await E({agentId:f,conversationId:s,parentAgentId:v,reason:_});return}},shutdown:E}}function _n(n,r,o="",e=""){let i=typeof process<"u"&&process?.platform?process.platform:"unknown";return`You are Cline, an AI coding agent. Your primary goal is to assist users with various coding tasks by leveraging your knowledge and the tools at your disposal. Given the user's prompt, you should use the tools available to you to answer user's question.
|
|
19
|
+
|
|
20
|
+
Always gather all the necessary context before starting to work on a task. For example, if you are generating a unit test or new code, make sure you understand the requirement, the naming conventions, frameworks and libraries used and aligned in the current codebase, and the environment and commands used to run and test the code etc. Always validate the new unit test at the end including running the code if possible for live feedback.
|
|
21
|
+
Review each question carefully and answer it with detailed, accurate information.
|
|
22
|
+
If you need more information, use one of the available tools or ask for clarification instead of making assumptions or lies.
|
|
23
|
+
|
|
24
|
+
Environment you are running in:
|
|
25
|
+
<env>
|
|
26
|
+
1. Platform: {{PLATFORM_NAME}}
|
|
27
|
+
2. Date: {{CURRENT_DATE}}
|
|
28
|
+
3. IDE: {{IDE_NAME}}
|
|
29
|
+
4. Working Directory: {{CWD}}
|
|
30
|
+
</env>
|
|
31
|
+
|
|
32
|
+
Remember:
|
|
33
|
+
- Always adhere to existing code conventions and patterns.
|
|
34
|
+
- Use only libraries and frameworks that are confirmed to be in use in the current codebase.
|
|
35
|
+
- Provide complete and functional code without omissions or placeholders.
|
|
36
|
+
- Be explicit about any assumptions or limitations in your solution.
|
|
37
|
+
- Always show your planning process before executing any task. This will help ensure that you have a clear understanding of the requirements and that your approach aligns with the user's needs.
|
|
38
|
+
|
|
39
|
+
Begin by analyzing the user's input and gathering any necessary additional context. Then, present your plan at the start of your response before proceeding with the task. It's OK for this section to be quite long.
|
|
40
|
+
|
|
41
|
+
REMEMBER, always be helpful and proactive! Don't ask for permission to do something when you can do it! Do not indicates you will be using a tool unless you are actually going to use it.
|
|
42
|
+
|
|
43
|
+
When you have completed the task, please provide a summary of what you did and any relevant information that the user should know. This will help ensure that the user understands the changes made and can easily follow up if they have any questions or need further assistance. Do not indicate that you will perform an action without actually doing it. Always provide the final result in your response.
|
|
44
|
+
|
|
45
|
+
If user asked a simple question without any coding context, answer it directly without using any tools.
|
|
46
|
+
{{CLINE_RULES}}
|
|
47
|
+
{{CLINE_METADATA}}`.replace("{{PLATFORM_NAME}}",i).replace("{{CWD}}",r).replace("{{CURRENT_DATE}}",new Date().toLocaleDateString()).replace("{{IDE_NAME}}",n).replace("{{CLINE_METADATA}}",o).replace("{{CLINE_RULES}}",e).trim()}function Dr(n){return C({name:"spawn_agent",description:"Spawn a sub-agent with a custom system prompt for specialized tasks. Use when delegating work that benefits from focused expertise.",inputSchema:{type:"object",properties:{systemPrompt:{type:"string",description:"System prompt defining the sub-agent's behavior"},task:{type:"string",description:"Task for the sub-agent to complete"},maxIterations:{type:"integer",description:"Max iterations for the sub-agent",minimum:1}},required:["systemPrompt","task"]},execute:async(r,o)=>{let e=n.createSubAgentTools?await n.createSubAgentTools(r,o):n.subAgentTools??[],i=new a({providerId:n.providerId,modelId:n.modelId,apiKey:n.apiKey,baseUrl:n.baseUrl,providerConfig:n.providerConfig,knownModels:n.knownModels,thinking:n.thinking,systemPrompt:r.systemPrompt,tools:e,maxIterations:r.maxIterations??n.defaultMaxIterations,parentAgentId:o.agentId,abortSignal:o.abortSignal,onEvent:n.onSubAgentEvent,hooks:n.hooks,extensions:n.extensions,hookErrorMode:n.hookErrorMode,toolPolicies:n.toolPolicies,requestToolApproval:n.requestToolApproval,logger:n.logger}),E=i.getAgentId(),f=i.getConversationId(),s=o.agentId;if(n.onSubAgentStart)try{await n.onSubAgentStart({subAgentId:E,conversationId:f,parentAgentId:s,input:r})}catch{}try{let v=await i.run(r.task),_={text:v.text,iterations:v.iterations,finishReason:v.finishReason,usage:{inputTokens:v.usage.inputTokens,outputTokens:v.usage.outputTokens}};if(n.onSubAgentEnd)try{await n.onSubAgentEnd({subAgentId:E,conversationId:f,parentAgentId:s,input:r,result:_})}catch{}return _}catch(v){if(n.onSubAgentEnd)try{await n.onSubAgentEnd({subAgentId:E,conversationId:f,parentAgentId:s,input:r,error:v instanceof Error?v:Error(String(v))})}catch{}throw v}},timeoutMs:300000,retryable:!1})}class jn{teamId;teamName;onTeamEvent;members=new Map;tasks=new Map;missionLog=[];mailbox=[];missionStepCounter=0;taskCounter=0;messageCounter=0;missionCounter=0;runCounter=0;outcomeCounter=0;outcomeFragmentCounter=0;runs=new Map;runQueue=[];outcomes=new Map;outcomeFragments=new Map;missionLogIntervalSteps;missionLogIntervalMs;maxConcurrentRuns;constructor(n){this.teamName=n.teamName,this.teamId=`team_${Io(n.teamName)}_${Date.now().toString(36)}`,this.onTeamEvent=n.onTeamEvent,this.missionLogIntervalSteps=Math.max(1,n.missionLogIntervalSteps??3),this.missionLogIntervalMs=Math.max(1000,n.missionLogIntervalMs??120000),this.maxConcurrentRuns=Math.max(1,n.maxConcurrentRuns??2);let r=n.leadAgentId??"lead";this.members.set(r,{agentId:r,role:"lead",status:"idle",runningCount:0,lastMissionStep:0,lastMissionAt:Date.now()})}getTeamId(){return this.teamId}getTeamName(){return this.teamName}getMemberRole(n){return this.members.get(n)?.role}getMemberIds(){return Array.from(this.members.keys())}getTeammateIds(){return Array.from(this.members.values()).filter((n)=>n.role==="teammate").map((n)=>n.agentId)}getTask(n){return this.tasks.get(n)}listTasks(){return Array.from(this.tasks.values())}listMissionLog(n){if(!n||n<=0)return[...this.missionLog];return this.missionLog.slice(Math.max(0,this.missionLog.length-n))}listMailbox(n,r){let o=r?.unreadOnly??!0,e=r?.markRead??!0,i=r?.limit,E=this.mailbox.filter((s)=>s.toAgentId===n&&(!o||!s.readAt)),f=typeof i==="number"&&i>0?E.slice(Math.max(0,E.length-i)):E;if(e){let s=new Date;for(let v of f)if(!v.readAt)v.readAt=s}return f.map((s)=>({...s}))}getSnapshot(){let n={pending:0,in_progress:0,blocked:0,completed:0};for(let o of this.tasks.values())n[o.status]++;let r={draft:0,in_review:0,finalized:0};for(let o of this.outcomes.values())r[o.status]++;return{teamId:this.teamId,teamName:this.teamName,members:Array.from(this.members.values()).map((o)=>({agentId:o.agentId,role:o.role,description:o.description,status:o.status})),taskCounts:n,unreadMessages:this.mailbox.filter((o)=>!o.readAt).length,missionLogEntries:this.missionLog.length,activeRuns:Array.from(this.runs.values()).filter((o)=>o.status==="running").length,queuedRuns:Array.from(this.runs.values()).filter((o)=>o.status==="queued").length,outcomeCounts:r}}exportState(){return{teamId:this.teamId,teamName:this.teamName,members:Array.from(this.members.values()).map((n)=>({agentId:n.agentId,role:n.role,description:n.description,status:n.status})),tasks:Array.from(this.tasks.values()).map((n)=>({...n})),mailbox:this.mailbox.map((n)=>({...n})),missionLog:this.missionLog.map((n)=>({...n})),runs:Array.from(this.runs.values()).map((n)=>({...n})),outcomes:Array.from(this.outcomes.values()).map((n)=>({...n})),outcomeFragments:Array.from(this.outcomeFragments.values()).map((n)=>({...n}))}}hydrateState(n){this.tasks.clear();for(let o of n.tasks)this.tasks.set(o.id,{...o});this.mailbox.length=0,this.mailbox.push(...n.mailbox.map((o)=>({...o}))),this.missionLog.length=0,this.missionLog.push(...n.missionLog.map((o)=>({...o}))),this.runs.clear();for(let o of n.runs??[])this.runs.set(o.id,{...o});this.runQueue.length=0,this.runQueue.push(...Array.from(this.runs.values()).filter((o)=>o.status==="queued").map((o)=>o.id)),this.outcomes.clear();for(let o of n.outcomes??[])this.outcomes.set(o.id,{...o});this.outcomeFragments.clear();for(let o of n.outcomeFragments??[])this.outcomeFragments.set(o.id,{...o});let r=Array.from(this.members.values()).filter((o)=>o.role==="lead");this.members.clear();for(let o of r)this.members.set(o.agentId,{...o,status:"idle",runningCount:0,lastMissionStep:this.missionStepCounter,lastMissionAt:Date.now()});for(let o of n.members){if(o.role!=="teammate")continue;this.members.set(o.agentId,{agentId:o.agentId,role:"teammate",description:o.description,status:"stopped",agent:void 0,runningCount:0,lastMissionStep:this.missionStepCounter,lastMissionAt:Date.now()})}this.taskCounter=Math.max(this.taskCounter,m(n.tasks.map((o)=>o.id),"task_")),this.messageCounter=Math.max(this.messageCounter,m(n.mailbox.map((o)=>o.id),"msg_")),this.missionCounter=Math.max(this.missionCounter,m(n.missionLog.map((o)=>o.id),"log_")),this.runCounter=Math.max(this.runCounter,m((n.runs??[]).map((o)=>o.id),"run_")),this.outcomeCounter=Math.max(this.outcomeCounter,m((n.outcomes??[]).map((o)=>o.id),"out_")),this.outcomeFragmentCounter=Math.max(this.outcomeFragmentCounter,m((n.outcomeFragments??[]).map((o)=>o.id),"frag_"))}isTeammateActive(n){let r=this.members.get(n);return!!r&&r.role==="teammate"&&!!r.agent}spawnTeammate({agentId:n,config:r}){let o=this.members.get(n);if(o&&o.role!=="teammate")throw Error(`Team member "${n}" already exists and is not a teammate`);if(o&&o.runningCount>0)throw Error(`Teammate "${n}" is currently running and cannot be respawned`);let e={...r,onEvent:(f)=>{r.onEvent?.(f),this.emitEvent({type:"agent_event",agentId:n,event:f}),this.trackMeaningfulEvent(n,f)}},i=Wn(e),E={agentId:n,role:"teammate",description:r.role,status:"idle",agent:i,runningCount:0,lastMissionStep:0,lastMissionAt:Date.now()};return this.members.set(n,E),this.emitEvent({type:"teammate_spawned",agentId:n,role:r.role,teammate:{rolePrompt:r.systemPrompt,modelId:r.modelId,maxIterations:r.maxIterations}}),{agentId:E.agentId,role:E.role,description:E.description,status:E.status}}shutdownTeammate(n,r){let o=this.members.get(n);if(!o||o.role!=="teammate")throw Error(`Teammate "${n}" was not found`);o.agent?.abort(),o.status="stopped",this.emitEvent({type:"teammate_shutdown",agentId:n,reason:r})}updateTeammateConnections(n){for(let r of this.members.values()){if(r.role!=="teammate"||!r.agent)continue;r.agent.updateConnection(n)}}createTask(n){let r=`task_${String(++this.taskCounter).padStart(4,"0")}`,o=new Date,e={id:r,title:n.title,description:n.description,status:n.assignee?"in_progress":"pending",createdAt:o,updatedAt:o,createdBy:n.createdBy,assignee:n.assignee,dependsOn:n.dependsOn??[]};return this.tasks.set(r,e),this.emitEvent({type:"team_task_updated",task:{...e}}),{...e}}claimTask(n,r){let o=this.requireTask(n);return this.assertDependenciesResolved(o),o.status="in_progress",o.assignee=r,o.updatedAt=new Date,this.emitEvent({type:"team_task_updated",task:{...o}}),this.appendMissionLog({agentId:r,taskId:n,kind:"progress",summary:`Claimed task "${o.title}"`}),{...o}}blockTask(n,r,o){let e=this.requireTask(n);return e.status="blocked",e.updatedAt=new Date,e.summary=o,this.emitEvent({type:"team_task_updated",task:{...e}}),this.appendMissionLog({agentId:r,taskId:n,kind:"blocked",summary:o}),{...e}}completeTask(n,r,o){let e=this.requireTask(n);if(e.status="completed",e.updatedAt=new Date,e.summary=o,!e.assignee)e.assignee=r;return this.emitEvent({type:"team_task_updated",task:{...e}}),this.appendMissionLog({agentId:r,taskId:n,kind:"done",summary:o}),{...e}}async routeToTeammate(n,r,o){let e=this.members.get(n);if(!e||e.role!=="teammate"||!e.agent)throw Error(`Teammate "${n}" was not found`);e.runningCount++,e.status="running",this.emitEvent({type:"task_start",agentId:n,message:r});try{let i=o?.continueConversation?await e.agent.continue(r):await e.agent.run(r);return this.emitEvent({type:"task_end",agentId:n,result:i}),this.recordProgressStep(n,`Completed a delegated run (${i.iterations} iterations)`,o?.taskId,!0),i}catch(i){let E=i instanceof Error?i:Error(String(i));throw this.emitEvent({type:"task_end",agentId:n,error:E}),this.appendMissionLog({agentId:n,taskId:o?.taskId,kind:"error",summary:E.message}),E}finally{if(e.runningCount--,e.runningCount<=0&&this.members.get(n)?.status!=="stopped")e.status="idle"}}startTeammateRun(n,r,o){let e=`run_${String(++this.runCounter).padStart(5,"0")}`,i={id:e,agentId:n,taskId:o?.taskId,status:"queued",message:r,priority:o?.priority??0,retryCount:0,maxRetries:Math.max(0,o?.maxRetries??0),continueConversation:o?.continueConversation,startedAt:new Date(0),leaseOwner:o?.leaseOwner,heartbeatAt:void 0};return this.runs.set(e,i),this.runQueue.push(e),this.emitEvent({type:"run_queued",run:{...i}}),this.dispatchQueuedRuns(),{...i}}dispatchQueuedRuns(){while(this.countActiveRuns()<this.maxConcurrentRuns&&this.runQueue.length>0){let n=this.selectNextQueuedRunIndex(),[r]=this.runQueue.splice(n,1),o=r?this.runs.get(r):void 0;if(!o||o.status!=="queued")continue;this.executeQueuedRun(o)}}selectNextQueuedRunIndex(){let n=0,r=Number.NEGATIVE_INFINITY;for(let o=0;o<this.runQueue.length;o++){let e=this.runs.get(this.runQueue[o]);if(!e||e.status!=="queued")continue;if(e.priority>r)r=e.priority,n=o}return n}countActiveRuns(){let n=0;for(let r of this.runs.values())if(r.status==="running")n++;return n}async executeQueuedRun(n){n.status="running",n.startedAt=new Date,n.heartbeatAt=new Date,this.emitEvent({type:"run_started",run:{...n}});let r=setInterval(()=>{if(n.status!=="running")return;n.heartbeatAt=new Date,this.emitEvent({type:"run_progress",run:{...n},message:"heartbeat"})},2000);try{let o=await this.routeToTeammate(n.agentId,n.message,{taskId:n.taskId,continueConversation:n.continueConversation});n.status="completed",n.result=o,n.endedAt=new Date,this.emitEvent({type:"run_completed",run:{...n}})}catch(o){let e=o instanceof Error?o.message:String(o??"Unknown error");if(n.error=e,n.endedAt=new Date,n.retryCount<n.maxRetries)n.retryCount++,n.status="queued",n.nextAttemptAt=new Date(Date.now()+Math.min(30000,1000*2**n.retryCount)),this.runQueue.push(n.id),this.emitEvent({type:"run_progress",run:{...n},message:`retry_scheduled_${n.retryCount}`});else n.status="failed",this.emitEvent({type:"run_failed",run:{...n}})}finally{clearInterval(r),this.dispatchQueuedRuns()}}listRuns(n){let r=n?.includeCompleted??!0;return Array.from(this.runs.values()).filter((o)=>{if(!r&&!["running","queued"].includes(o.status))return!1;if(n?.status&&o.status!==n.status)return!1;if(n?.agentId&&o.agentId!==n.agentId)return!1;return!0}).map((o)=>({...o}))}getRun(n){let r=this.runs.get(n);return r?{...r}:void 0}async awaitRun(n,r=250){let o=this.runs.get(n);if(!o)throw Error(`Run "${n}" was not found`);while(o.status==="running")await Or(r);return{...o}}async awaitAllRuns(n=250){while(Array.from(this.runs.values()).some((r)=>["queued","running"].includes(r.status)))await Or(n);return this.listRuns()}cancelRun(n,r){let o=this.runs.get(n);if(!o)throw Error(`Run "${n}" was not found`);if(o.status==="completed"||o.status==="failed")return{...o};o.status="cancelled",o.error=r,o.endedAt=new Date;let e=this.runQueue.indexOf(n);if(e>=0)this.runQueue.splice(e,1);return this.emitEvent({type:"run_cancelled",run:{...o},reason:r}),{...o}}markStaleRunsInterrupted(n="runtime_recovered"){let r=[];for(let o of this.runs.values()){if(!["queued","running"].includes(o.status))continue;o.status="interrupted",o.error=n,o.endedAt=new Date,r.push({...o}),this.emitEvent({type:"run_interrupted",run:{...o},reason:n})}return this.runQueue.length=0,r}sendMessage(n,r,o,e,i){if(!this.members.has(n))throw Error(`Unknown sender "${n}"`);if(!this.members.has(r))throw Error(`Unknown recipient "${r}"`);let E={id:`msg_${String(++this.messageCounter).padStart(5,"0")}`,teamId:this.teamId,fromAgentId:n,toAgentId:r,subject:o,body:e,taskId:i,sentAt:new Date};return this.mailbox.push(E),this.emitEvent({type:"team_message",message:{...E}}),{...E}}broadcast(n,r,o,e){let i=e?.includeLead??!1,E=[];for(let f of this.members.values()){if(f.agentId===n)continue;if(!i&&f.role==="lead")continue;E.push(this.sendMessage(n,f.agentId,r,o,e?.taskId))}return E}appendMissionLog(n){if(!this.members.has(n.agentId))throw Error(`Unknown team member "${n.agentId}"`);let r={id:`log_${String(++this.missionCounter).padStart(6,"0")}`,ts:new Date,teamId:this.teamId,agentId:n.agentId,taskId:n.taskId,kind:n.kind,summary:n.summary,evidence:n.evidence,nextAction:n.nextAction};this.missionLog.push(r);let o=this.members.get(n.agentId);if(o)o.lastMissionAt=Date.now(),o.lastMissionStep=this.missionStepCounter;return this.emitEvent({type:"team_mission_log",entry:{...r}}),{...r}}createOutcome(n){let r={id:`out_${String(++this.outcomeCounter).padStart(4,"0")}`,teamId:this.teamId,title:n.title,status:"draft",requiredSections:[...new Set(n.requiredSections)],createdBy:n.createdBy,createdAt:new Date};return this.outcomes.set(r.id,r),this.emitEvent({type:"outcome_created",outcome:{...r}}),{...r}}listOutcomes(){return Array.from(this.outcomes.values()).map((n)=>({...n}))}attachOutcomeFragment(n){let r=this.outcomes.get(n.outcomeId);if(!r)throw Error(`Outcome "${n.outcomeId}" was not found`);if(!r.requiredSections.includes(n.section))throw Error(`Section "${n.section}" is not part of outcome "${n.outcomeId}"`);let o={id:`frag_${String(++this.outcomeFragmentCounter).padStart(5,"0")}`,teamId:this.teamId,outcomeId:n.outcomeId,section:n.section,sourceAgentId:n.sourceAgentId,sourceRunId:n.sourceRunId,content:n.content,status:"draft",createdAt:new Date};if(this.outcomeFragments.set(o.id,o),r.status==="draft")r.status="in_review";return this.emitEvent({type:"outcome_fragment_attached",fragment:{...o}}),{...o}}reviewOutcomeFragment(n){let r=this.outcomeFragments.get(n.fragmentId);if(!r)throw Error(`Fragment "${n.fragmentId}" was not found`);return r.status=n.approved?"reviewed":"rejected",r.reviewedBy=n.reviewedBy,r.reviewedAt=new Date,this.emitEvent({type:"outcome_fragment_reviewed",fragment:{...r}}),{...r}}listOutcomeFragments(n){return Array.from(this.outcomeFragments.values()).filter((r)=>r.outcomeId===n).map((r)=>({...r}))}finalizeOutcome(n){let r=this.outcomes.get(n);if(!r)throw Error(`Outcome "${n}" was not found`);let o=this.listOutcomeFragments(n);for(let e of r.requiredSections)if(!o.some((E)=>E.section===e&&E.status==="reviewed"))throw Error(`Outcome "${n}" cannot be finalized. Section "${e}" is missing a reviewed fragment.`);return r.status="finalized",r.finalizedAt=new Date,this.emitEvent({type:"outcome_finalized",outcome:{...r}}),{...r}}cleanup(){for(let n of this.members.values())if(n.role==="teammate"&&n.runningCount>0)throw Error(`Cannot cleanup team while teammate "${n.agentId}" is still running`);if(Array.from(this.runs.values()).some((n)=>["queued","running"].includes(n.status)))throw Error("Cannot cleanup team while async teammate runs are still active");for(let n of this.members.values())if(n.role==="teammate")n.agent?.abort();this.tasks.clear(),this.mailbox.length=0,this.missionLog.length=0,this.runs.clear(),this.runQueue.length=0,this.outcomes.clear(),this.outcomeFragments.clear();for(let[n,r]of this.members.entries())if(r.role==="teammate")this.members.delete(n)}requireTask(n){let r=this.tasks.get(n);if(!r)throw Error(`Task "${n}" was not found`);return r}assertDependenciesResolved(n){for(let r of n.dependsOn){let o=this.tasks.get(r);if(!o||o.status!=="completed")throw Error(`Task "${n.id}" is blocked by "${r}"`)}}trackMeaningfulEvent(n,r){if(r.type==="iteration_end"&&r.hadToolCalls){this.recordProgressStep(n,`Completed iteration ${r.iteration} with ${r.toolCallCount} tool call(s)`);return}if(r.type==="content_end"&&r.contentType==="tool"&&!r.error){this.recordProgressStep(n,`Finished tool "${r.toolName??"unknown"}"`);return}if(r.type==="done"){this.appendMissionLog({agentId:n,kind:"done",summary:`Run completed after ${r.iterations} iteration(s)`});return}if(r.type==="error")this.appendMissionLog({agentId:n,kind:"error",summary:r.error.message})}recordProgressStep(n,r,o,e=!1){this.missionStepCounter++;let i=this.members.get(n);if(!i)return;let E=this.missionStepCounter-i.lastMissionStep,f=Date.now()-i.lastMissionAt;if(!e&&E<this.missionLogIntervalSteps&&f<this.missionLogIntervalMs)return;this.appendMissionLog({agentId:n,taskId:o,kind:"progress",summary:r})}emitEvent(n){try{this.onTeamEvent?.(n)}catch{}}}function Io(n){return n.toLowerCase().replace(/[^a-z0-9]+/g,"_").replace(/^_+|_+$/g,"").slice(0,24)}function Or(n){return new Promise((r)=>setTimeout(r,n))}function m(n,r){let o=0;for(let e of n){if(!e.startsWith(r))continue;let i=Number.parseInt(e.slice(r.length),10);if(Number.isFinite(i))o=Math.max(o,i)}return o}import{basename as mo,resolve as bo}from"node:path";import{z as d}from"zod";var gr=d.object({agentId:d.string().min(1).describe("Teammate identifier"),rolePrompt:d.string().min(1).describe("System prompt describing teammate role"),maxIterations:d.number().int().min(1).optional().describe("Max iterations per teammate run for spawn")}).strict(),Lr=d.object({agentId:d.string().min(1).describe("Teammate identifier"),reason:d.string().min(1).optional().describe("Optional shutdown reason")}),qr=d.object({}),Kr=d.object({title:d.string().min(1).describe("Task title"),description:d.string().min(1).describe("Task details"),dependsOn:d.array(d.string()).optional().describe("Dependency task IDs"),assignee:d.string().min(1).optional().describe("Optional assignee")}),$r=d.object({taskId:d.string().describe("Task ID")}),Nr=d.object({taskId:d.string().describe("Task ID"),summary:d.string().min(1).describe("Completion summary")}),Br=d.object({taskId:d.string().describe("Task ID"),reason:d.string().min(1).describe("Blocking reason")}),lr=d.object({agentId:d.string().describe("Teammate agent ID"),task:d.string().min(1).describe("Task instructions for the teammate"),taskId:d.string().optional().describe("Optional shared task list ID"),runMode:d.enum(["sync","async"]).optional().describe("Execution mode: sync waits for result; async returns a runId immediately"),continueConversation:d.boolean().optional().describe("If true, continue the teammate conversation; otherwise start fresh")}),Jr=d.object({status:d.enum(["queued","running","completed","failed","cancelled","interrupted"]).optional(),agentId:d.string().min(1).optional().describe("Filter by teammate ID"),includeCompleted:d.boolean().optional().describe("Include completed/failed runs (default true)")}),Yr=d.object({runId:d.string().min(1).describe("Run ID"),reason:d.string().min(1).optional().describe("Optional cancellation reason")}),Vr=d.object({runId:d.string().min(1).describe("Async run ID to await")}),Qr=d.object({}),Gr=d.object({toAgentId:d.string().min(1).describe("Recipient agent ID"),subject:d.string().min(1).describe("Message subject"),body:d.string().min(1).describe("Message body"),taskId:d.string().min(1).optional().describe("Optional task ID context")}),kr=d.object({subject:d.string().min(1).describe("Message subject"),body:d.string().min(1).describe("Message body"),taskId:d.string().min(1).optional().describe("Optional task ID context"),includeLead:d.boolean().optional().describe("Include the lead agent in broadcast recipients")}),Mr=d.object({unreadOnly:d.boolean().optional().describe("Only unread messages for read action (default true)"),limit:d.number().int().min(1).max(100).optional().describe("Optional max number of messages for read action")}),Xr=d.object({kind:d.enum(["progress","handoff","blocked","decision","done","error"]),summary:d.string().min(1).describe("Update summary"),taskId:d.string().min(1).optional().describe("Optional task ID context"),evidence:d.array(d.string().min(1)).optional().describe("Optional evidence links/snippets"),nextAction:d.string().min(1).optional().describe("Planned next step")}),Zr=d.object({}),uo=["current_state","boundary_analysis","interface_proposal"],Wr=d.object({title:d.string().describe("Outcome title"),requiredSections:d.array(d.string()).default(uo).describe("Required sections for finalization gate (defaults to current_state,boundary_analysis,interface_proposal)")}),Ur=d.object({outcomeId:d.string().describe("Outcome ID"),section:d.string().describe("Section name"),sourceRunId:d.string().optional().describe("Optional source run ID"),content:d.string().describe("Section fragment content")}),Fr=d.object({fragmentId:d.string().describe("Fragment ID"),approved:d.boolean().describe("Review decision")}),jr=d.object({outcomeId:d.string().describe("Outcome ID")}),Ir=d.object({});function co(n){let r=bo(n);return`# Workspace Configuration
|
|
48
|
+
${JSON.stringify({workspaces:{[r]:{hint:mo(r)}}},null,2)}`}function zo(n,r){if(r.providerId!=="cline")return n.rolePrompt;let o=r.cwd?.trim()||process.cwd(),e=r.clineWorkspaceMetadata?.trim()||co(o),i=n.rolePrompt.trim(),E=i?`# Team Teammate Role
|
|
49
|
+
${i}`:"";return _n(r.clineIdeName?.trim()||"Terminal Shell",o,e,E)}function mr(n){let r=[];if(n.createBaseTools)r.push(...n.createBaseTools());r.push(...Tn({runtime:n.runtime,requesterId:n.spec.agentId,teammateRuntime:n.teammateRuntime,createBaseTools:n.createBaseTools,allowSpawn:!1})),n.runtime.spawnTeammate({agentId:n.spec.agentId,config:{providerId:n.teammateRuntime.providerId,modelId:n.spec.modelId??n.teammateRuntime.modelId,apiKey:n.teammateRuntime.apiKey,baseUrl:n.teammateRuntime.baseUrl,headers:n.teammateRuntime.headers,providerConfig:n.teammateRuntime.providerConfig,knownModels:n.teammateRuntime.knownModels,thinking:n.teammateRuntime.thinking,systemPrompt:zo(n.spec,n.teammateRuntime),maxIterations:n.spec.maxIterations??n.teammateRuntime.maxIterations,tools:r,hooks:n.teammateRuntime.hooks,extensions:n.teammateRuntime.extensions,logger:n.teammateRuntime.logger}})}function br(n){let r=n.leadAgentId??"lead",o=n.restoredFromPersistence===!0,e=Tn({runtime:n.runtime,requesterId:r,teammateRuntime:n.teammateRuntime,createBaseTools:n.createBaseTools,allowSpawn:!0}),i=[];for(let E of n.restoredTeammates??[]){if(n.runtime.isTeammateActive(E.agentId))continue;mr({runtime:n.runtime,requesterId:r,teammateRuntime:n.teammateRuntime,createBaseTools:n.createBaseTools,spec:E}),i.push(E.agentId)}return{tools:e,restoredFromPersistence:o,restoredTeammates:i}}function Tn(n){let r=n.allowSpawn??!0,o=[];return o.push(C({name:"team_spawn_teammate",description:"Spawn a teammate with a required agentId and rolePrompt.",inputSchema:O(gr),execute:async(e)=>{let i=g(gr,e);if(n.runtime.getMemberRole(n.requesterId)!=="lead")throw Error("Only the lead agent can manage teammates.");if(!r)throw Error("Spawning teammates is disabled in this context.");let E={agentId:i.agentId,rolePrompt:i.rolePrompt,maxIterations:i.maxIterations};return mr({runtime:n.runtime,requesterId:n.requesterId,teammateRuntime:n.teammateRuntime,createBaseTools:n.createBaseTools,spec:E}),{agentId:i.agentId,status:"spawned"}}})),o.push(C({name:"team_shutdown_teammate",description:"Shutdown a teammate by agentId.",inputSchema:O(Lr),execute:async(e)=>{let i=g(Lr,e);if(n.runtime.getMemberRole(n.requesterId)!=="lead")throw Error("Only the lead agent can manage teammates.");return n.runtime.shutdownTeammate(i.agentId,i.reason),{agentId:i.agentId,status:"stopped"}}})),o.push(C({name:"team_status",description:"Return a snapshot of team members, task counts, mailbox, and mission log stats.",inputSchema:O(qr),execute:async(e)=>{return g(qr,e),n.runtime.getSnapshot()}})),o.push(C({name:"team_create_task",description:"Create a shared team task with title and description.",inputSchema:O(Kr),execute:async(e)=>{let i=g(Kr,e),E=n.runtime.createTask({title:i.title,description:i.description,dependsOn:i.dependsOn,assignee:i.assignee,createdBy:n.requesterId});return{taskId:E.id,status:E.status}}})),o.push(C({name:"team_claim_task",description:"Claim a task by taskId.",inputSchema:O($r),execute:async(e)=>{let i=g($r,e),E=n.runtime.claimTask(i.taskId,n.requesterId);return{taskId:E.id,status:E.status,nextStep:"Task is now in_progress. Execute the work using team_run_task or your own tools, then call team_complete_task when done."}}})),o.push(C({name:"team_complete_task",description:"Complete a task by taskId and provide a summary.",inputSchema:O(Nr),execute:async(e)=>{let i=g(Nr,e),E=n.runtime.completeTask(i.taskId,n.requesterId,i.summary);return{taskId:E.id,status:E.status}}})),o.push(C({name:"team_block_task",description:"Block a task by taskId with a reason.",inputSchema:O(Br),execute:async(e)=>{let i=g(Br,e),E=n.runtime.blockTask(i.taskId,n.requesterId,i.reason);return{taskId:E.id,status:E.status}}})),o.push(C({name:"team_run_task",description:"Route a delegated task to a teammate. Choose sync (wait) or async (run in background).",inputSchema:O(lr),execute:async(e)=>{let i=g(lr,e);if(i.runMode==="async"){let f=n.runtime.startTeammateRun(i.agentId,i.task,{taskId:i.taskId,fromAgentId:n.requesterId,continueConversation:i.continueConversation});return{agentId:i.agentId,mode:"async",runId:f.id}}let E=await n.runtime.routeToTeammate(i.agentId,i.task,{taskId:i.taskId,fromAgentId:n.requesterId,continueConversation:i.continueConversation});return{agentId:i.agentId,mode:"sync",text:E.text,iterations:E.iterations}}})),o.push(C({name:"team_cancel_run",description:"Cancel one async teammate run.",inputSchema:O(Yr),execute:async(e)=>{let i=g(Yr,e),E=n.runtime.cancelRun(i.runId,i.reason);return{runId:E.id,status:E.status}}})),o.push(C({name:"team_list_runs",description:"List teammate runs started with team_run_task in async mode.",inputSchema:O(Jr),execute:async(e)=>n.runtime.listRuns(g(Jr,e))})),o.push(C({name:"team_await_run",description:"Wait for one async run by runId.",inputSchema:O(Vr),execute:async(e)=>{let i=g(Vr,e),E=await n.runtime.awaitRun(i.runId);if(E.status==="failed")throw Error(`Run "${E.id}" failed${E.error?`: ${E.error}`:""}`);if(E.status==="cancelled")throw Error(`Run "${E.id}" was cancelled${E.error?`: ${E.error}`:""}`);if(E.status==="interrupted")throw Error(`Run "${E.id}" was interrupted${E.error?`: ${E.error}`:""}`);return E}})),o.push(C({name:"team_await_all_runs",description:"Wait for all active async runs to complete.",inputSchema:O(Qr),execute:async(e)=>{g(Qr,e);let i=await n.runtime.awaitAllRuns(),E=i.filter((f)=>["failed","cancelled","interrupted"].includes(f.status));if(E.length>0){let f=E.map((s)=>`${s.id}:${s.status}${s.error?`(${s.error})`:""}`).join(", ");throw Error(`One or more runs did not complete successfully: ${f}`)}return i}})),o.push(C({name:"team_send_message",description:"Send a direct mailbox message to one teammate.",inputSchema:O(Gr),execute:async(e)=>{let i=g(Gr,e),E=n.runtime.sendMessage(n.requesterId,i.toAgentId,i.subject,i.body,i.taskId);return{id:E.id,toAgentId:E.toAgentId}}})),o.push(C({name:"team_broadcast",description:"Broadcast a mailbox message to all teammates.",inputSchema:O(kr),execute:async(e)=>{let i=g(kr,e);return{delivered:n.runtime.broadcast(n.requesterId,i.subject,i.body,{taskId:i.taskId,includeLead:i.includeLead}).length}}})),o.push(C({name:"team_read_mailbox",description:"Read the current agent mailbox.",inputSchema:O(Mr),execute:async(e)=>{let i=g(Mr,e);return n.runtime.listMailbox(n.requesterId,{unreadOnly:i.unreadOnly,limit:i.limit,markRead:!0})}})),o.push(C({name:"team_log_update",description:"Append a mission log update for this agent.",inputSchema:O(Xr),execute:async(e)=>{let i=g(Xr,e);return{id:n.runtime.appendMissionLog({agentId:n.requesterId,taskId:i.taskId,kind:i.kind,summary:i.summary,evidence:i.evidence,nextAction:i.nextAction}).id}}})),o.push(C({name:"team_cleanup",description:"Clean up the team runtime. Fails if teammates are still running.",inputSchema:O(Zr),execute:async(e)=>{if(g(Zr,e),n.runtime.getMemberRole(n.requesterId)!=="lead")throw Error("Only the lead agent can run cleanup.");return n.runtime.cleanup(),{status:"cleaned"}}})),o.push(C({name:"team_create_outcome",description:"Create a converged team outcome.",inputSchema:O(Wr),execute:async(e)=>{let i=g(Wr,e),E=n.runtime.createOutcome({title:i.title,requiredSections:i.requiredSections,createdBy:n.requesterId});return{outcomeId:E.id,status:E.status}}})),o.push(C({name:"team_attach_outcome_fragment",description:"Attach a fragment to an outcome section.",inputSchema:O(Ur),execute:async(e)=>{let i=g(Ur,e),E=n.runtime.attachOutcomeFragment({outcomeId:i.outcomeId,section:i.section,sourceAgentId:n.requesterId,sourceRunId:i.sourceRunId,content:i.content});return{fragmentId:E.id,status:E.status}}})),o.push(C({name:"team_review_outcome_fragment",description:"Review one outcome fragment.",inputSchema:O(Fr),execute:async(e)=>{let i=g(Fr,e),E=n.runtime.reviewOutcomeFragment({fragmentId:i.fragmentId,reviewedBy:n.requesterId,approved:i.approved});return{fragmentId:E.id,status:E.status}}})),o.push(C({name:"team_finalize_outcome",description:"Finalize one outcome.",inputSchema:O(jr),execute:async(e)=>{let i=g(jr,e),E=n.runtime.finalizeOutcome(i.outcomeId);return{outcomeId:E.id,status:E.status}}})),o.push(C({name:"team_list_outcomes",description:"List team outcomes.",inputSchema:O(Ir),execute:async(e)=>{return g(Ir,e),n.runtime.listOutcomes()}})),o}function xo(n){return`${n.serverName}__${n.toolName}`}function In(n){return{[(n.nameTransform??xo)({serverName:n.serverName,toolName:n.toolName})]:{enabled:!1}}}function ur(n){let r={};for(let o of n.toolNames)Object.assign(r,In({serverName:n.serverName,toolName:o,nameTransform:n.nameTransform}));return r}function ao(n){return`${n.serverName}__${n.toolName}`}function po(n,r){let o=r.description?.trim();if(o)return o;return`Execute MCP tool "${r.name}" from server "${n}".`}async function cr(n){let r=await n.provider.listTools(n.serverName),o=n.nameTransform??ao;return r.map((e)=>{let i=o({serverName:n.serverName,toolName:e.name});return C({name:i,description:po(n.serverName,e),inputSchema:e.inputSchema,timeoutMs:n.timeoutMs,retryable:n.retryable,maxRetries:n.maxRetries,execute:async(E,f)=>n.provider.callTool({serverName:n.serverName,toolName:e.name,arguments:E&&typeof E==="object"&&!Array.isArray(E)?E:void 0,context:f})})})}import{z as S}from"zod";var to=S.enum(["completed","max_iterations","aborted","error"]),zr=S.object({inputTokens:S.number(),outputTokens:S.number(),cacheReadTokens:S.number().optional(),cacheWriteTokens:S.number().optional(),totalCost:S.number().optional()}),ne=S.object({text:S.string(),usage:zr,messages:S.array(S.custom()),toolCalls:S.array(c),iterations:S.number(),finishReason:to,model:S.object({id:S.string(),provider:S.string(),info:S.custom().optional()}),startedAt:S.date(),endedAt:S.date(),durationMs:S.number()}),re=S.enum(["low","medium","high"]),oe=S.object({providerId:S.string(),modelId:S.string(),apiKey:S.string().optional(),baseUrl:S.string().url().optional(),headers:S.record(S.string(),S.string()).optional(),knownModels:S.record(S.string(),S.custom()).optional(),providerConfig:S.custom().optional(),initialMessages:S.array(S.custom()).optional(),systemPrompt:S.string(),tools:S.array(S.custom()),maxIterations:S.number().positive().optional(),maxParallelToolCalls:S.number().int().positive().default(8),maxTokensPerTurn:S.number().positive().optional(),apiTimeoutMs:S.number().positive().default(120000),userFileContentLoader:S.function().input([S.string()]).output(S.promise(S.string())).optional(),reminderAfterIterations:S.number().nonnegative().default(6),reminderText:S.string().optional(),reasoningEffort:re.optional(),thinkingBudgetTokens:S.number().positive().optional(),thinking:S.boolean().optional(),onEvent:S.function().input([S.custom()]).output(S.void()).optional(),hooks:S.custom().optional(),parentAgentId:S.string().optional(),extensions:S.array(S.custom()).optional(),hookErrorMode:S.enum(["ignore","throw"]).default("ignore"),hookPolicies:S.custom().optional(),toolPolicies:S.record(S.string(),S.object({enabled:S.boolean().optional(),autoApprove:S.boolean().optional()})).optional(),requestToolApproval:S.function().input([S.object({agentId:S.string(),conversationId:S.string(),iteration:S.number(),toolCallId:S.string(),toolName:S.string(),input:S.unknown(),policy:S.object({enabled:S.boolean().optional(),autoApprove:S.boolean().optional()}).default({})})]).output(S.union([S.object({approved:S.boolean(),reason:S.string().optional()}),S.promise(S.object({approved:S.boolean(),reason:S.string().optional()}))])).optional(),logger:S.custom().optional(),abortSignal:S.custom().optional()});export{en as toToolDefinitions,Gn as toToolDefinition,vn as runSubprocessEvent,dn as runHook,Cr as parseHookEventPayload,_n as getClineDefaultSystemPrompt,dr as formatFileContentBlock,C as createTool,Hr as createSubprocessHooks,Dr as createSpawnAgentTool,cr as createMcpTools,In as createDisabledMcpToolPolicy,ur as createDisabledMcpToolPolicies,Tr as createAskQuestionTool,Tn as createAgentTeamsTools,Wn as createAgent,br as bootstrapAgentTeams,On as ToolContextSchema,c as ToolCallRecordSchema,Fn as HookEventPayloadSchema,Un as HookEventNameSchema,u as HookEngine,fn as AskQuestionInputSchema,zr as AgentUsageSchema,jn as AgentTeamsRuntime,ne as AgentResultSchema,oe as AgentConfigSchema,a as Agent};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @clinebot/agents (Node entrypoint)
|
|
3
|
+
*/
|
|
4
|
+
export { createSubprocessHooks, type HookEventName, HookEventNameSchema, type HookEventPayload, HookEventPayloadSchema, parseHookEventPayload, type RunHookOptions, type RunHookResult, type RunSubprocessEventOptions, type RunSubprocessEventResult, runHook, runSubprocessEvent, type SubprocessHookControl, type SubprocessHooksOptions, } from "./hooks/node.js";
|
|
5
|
+
export * from "./index.js";
|