@directive-run/ai 1.21.0 → 1.23.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.
Files changed (42) hide show
  1. package/dist/{chunk-IR3IHBVQ.cjs → chunk-7JTR4QBA.cjs} +2 -2
  2. package/dist/{chunk-IR3IHBVQ.cjs.map → chunk-7JTR4QBA.cjs.map} +1 -1
  3. package/dist/{chunk-G7CRWJT7.js → chunk-7KCLEIAG.js} +3 -3
  4. package/dist/chunk-7KCLEIAG.js.map +1 -0
  5. package/dist/{chunk-5JQ2A3JK.js → chunk-BZB3RDI2.js} +2 -2
  6. package/dist/{chunk-5JQ2A3JK.js.map → chunk-BZB3RDI2.js.map} +1 -1
  7. package/dist/{chunk-RHJAMXLS.js → chunk-CXWHLEBQ.js} +3 -3
  8. package/dist/{chunk-RHJAMXLS.js.map → chunk-CXWHLEBQ.js.map} +1 -1
  9. package/dist/{chunk-TH2D22JP.cjs → chunk-ESJQSOKJ.cjs} +7 -7
  10. package/dist/chunk-ESJQSOKJ.cjs.map +1 -0
  11. package/dist/{chunk-7EJN6TYX.cjs → chunk-GWWZXJOG.cjs} +3 -3
  12. package/dist/chunk-GWWZXJOG.cjs.map +1 -0
  13. package/dist/{chunk-QRDBUGPO.js → chunk-LOHC2KP5.js} +3 -3
  14. package/dist/chunk-LOHC2KP5.js.map +1 -0
  15. package/dist/{chunk-ZGJ2XHGI.cjs → chunk-MPMBFW2P.cjs} +2 -2
  16. package/dist/chunk-MPMBFW2P.cjs.map +1 -0
  17. package/dist/{chunk-XGHNOSXT.cjs → chunk-PEM2LPOC.cjs} +4 -4
  18. package/dist/{chunk-XGHNOSXT.cjs.map → chunk-PEM2LPOC.cjs.map} +1 -1
  19. package/dist/{chunk-VSVR4RFK.js → chunk-TEPEQE42.js} +2 -2
  20. package/dist/chunk-TEPEQE42.js.map +1 -0
  21. package/dist/devtools.cjs +1 -1
  22. package/dist/devtools.js +1 -1
  23. package/dist/guardrails.cjs +1 -1
  24. package/dist/guardrails.js +1 -1
  25. package/dist/index.cjs +4 -4
  26. package/dist/index.js +1 -1
  27. package/dist/{multi-agent-orchestrator-RMTLPKB4.js → multi-agent-orchestrator-FIF4GLVR.js} +2 -2
  28. package/dist/{multi-agent-orchestrator-RMTLPKB4.js.map → multi-agent-orchestrator-FIF4GLVR.js.map} +1 -1
  29. package/dist/multi-agent-orchestrator-PHDHFCW3.cjs +2 -0
  30. package/dist/{multi-agent-orchestrator-OX2TKD5Y.cjs.map → multi-agent-orchestrator-PHDHFCW3.cjs.map} +1 -1
  31. package/dist/multi-agent.cjs +1 -1
  32. package/dist/multi-agent.js +1 -1
  33. package/dist/testing.cjs +1 -1
  34. package/dist/testing.js +1 -1
  35. package/package.json +2 -2
  36. package/dist/chunk-7EJN6TYX.cjs.map +0 -1
  37. package/dist/chunk-G7CRWJT7.js.map +0 -1
  38. package/dist/chunk-QRDBUGPO.js.map +0 -1
  39. package/dist/chunk-TH2D22JP.cjs.map +0 -1
  40. package/dist/chunk-VSVR4RFK.js.map +0 -1
  41. package/dist/chunk-ZGJ2XHGI.cjs.map +0 -1
  42. package/dist/multi-agent-orchestrator-OX2TKD5Y.cjs +0 -2
@@ -1,2 +1,2 @@
1
- 'use strict';function L(o){let{transport:c,timeline:v,healthMonitor:i,getSnapshot:f,getBreakpointState:h,onResumeBreakpoint:p,onCancelBreakpoint:b,getScratchpadState:k,getDerivedState:T,onForkFromSnapshot:g,batchSize:M=1,batchIntervalMs:E=50,healthPushIntervalMs:O=0,authenticate:C}=o,w=o.maxClients??50,R=`devtools_${crypto.randomUUID()}`,s=new Set,d=new Set,y=[],D=null,_=null;function t(e,a){try{e.send(JSON.stringify(a));}catch{s.delete(e);}}function l(e){let a=JSON.stringify(e),n=[...s];for(let m of n)try{m.send(a);}catch{s.delete(m);}}function A(){y.length!==0&&(y.length===1?l({type:"event",event:y[0]}):l({type:"event_batch",events:y}),y=[]);}let N=v.subscribe(e=>{if(s.size!==0){if(M<=1){l({type:"event",event:e});return}y.push(e),y.length>=M&&A();}});M>1&&E>0&&(D=setInterval(A,E)),O>0&&i&&(_=setInterval(()=>{s.size>0&&l({type:"health",metrics:i.getAllMetrics()});},O));function B(e,a){let n;try{n=JSON.parse(a);}catch{t(e,{type:"error",code:"INVALID_JSON",message:"Could not parse message"});return}if(!n||typeof n!="object"||typeof n.type!="string"){t(e,{type:"error",code:"INVALID_MESSAGE",message:"Missing type field"});return}let m=Date.now(),x=I.get(e)??0;if(m-x<P){t(e,{type:"error",code:"RATE_LIMITED",message:"Too many requests"});return}if(I.set(e,m),n.type==="authenticate"){if(!C){t(e,{type:"error",code:"UNKNOWN_COMMAND",message:"Authentication not configured on this server"});return}if(!d.has(e)){t(e,{type:"error",code:"ALREADY_AUTHENTICATED",message:"Already authenticated"});return}if(typeof n.token!="string"){t(e,{type:"error",code:"AUTH_FAILED",message:"Missing token"}),e.close(),d.delete(e);return}let r=C(n.token),u=S=>{S?(d.delete(e),s.add(e),t(e,{type:"welcome",version:1,sessionId:R,timestamp:Date.now()})):(t(e,{type:"error",code:"AUTH_FAILED",message:"Invalid token"}),d.delete(e),e.close());};r instanceof Promise?r.then(u).catch(()=>{t(e,{type:"error",code:"AUTH_FAILED",message:"Authentication error"}),d.delete(e),e.close();}):u(r);return}if(d.has(e)){t(e,{type:"error",code:"AUTH_REQUIRED",message:"Authentication required"});return}switch(n.type){case "ping":t(e,{type:"pong",timestamp:Date.now()});break;case "request_snapshot":f?t(e,{type:"snapshot",data:f()}):t(e,{type:"error",code:"NO_SNAPSHOT",message:"Snapshot provider not configured"});break;case "request_health":i?t(e,{type:"health",metrics:i.getAllMetrics()}):t(e,{type:"error",code:"NO_HEALTH",message:"Health monitor not configured"});break;case "request_events":{let r=v.getEvents(),u=n.since,S=u!=null?r.filter(H=>H.id>u):r;t(e,{type:"event_batch",events:S});break}case "request_breakpoints":h?t(e,{type:"breakpoints",state:h()}):t(e,{type:"error",code:"NO_BREAKPOINTS",message:"Breakpoint provider not configured"});break;case "resume_breakpoint":if(p&&typeof n.breakpointId=="string"){let r=n.modifications?{input:n.modifications.input,skip:n.modifications.skip}:void 0;p(n.breakpointId,r);}else t(e,{type:"error",code:"NO_BREAKPOINTS",message:"Breakpoint resume not configured"});break;case "cancel_breakpoint":if(b&&typeof n.breakpointId=="string"){let r=typeof n.reason=="string"?n.reason:void 0;b(n.breakpointId,r);}else t(e,{type:"error",code:"NO_BREAKPOINTS",message:"Breakpoint cancel not configured"});break;case "export_session":t(e,{type:"event_batch",events:v.getEvents()});break;case "import_session":{if(typeof n.data!="string")t(e,{type:"error",code:"INVALID_DATA",message:"Missing data field for import"});else if(n.data.length>10485760)t(e,{type:"error",code:"IMPORT_TOO_LARGE",message:`Import data exceeds ${10485760/1024/1024} MB limit`});else try{v.import(n.data),t(e,{type:"event_batch",events:v.getEvents()});}catch(u){let S=u instanceof Error?u.message:String(u);t(e,{type:"error",code:"IMPORT_FAILED",message:S});}break}case "request_scratchpad":k?t(e,{type:"scratchpad_state",data:k()}):t(e,{type:"error",code:"NO_SCRATCHPAD",message:"Scratchpad provider not configured"});break;case "request_derived":T?t(e,{type:"derived_state",data:T()}):t(e,{type:"error",code:"NO_DERIVED",message:"Derived state provider not configured"});break;case "fork_from_snapshot":{if(g&&typeof n.eventId=="number")try{let r=g(n.eventId);t(e,{type:"fork_complete",eventId:n.eventId,newEventCount:r.newEventCount});}catch(r){let u=r instanceof Error?r.message:String(r);t(e,{type:"error",code:"FORK_FAILED",message:u});}else t(e,{type:"error",code:"NO_FORK",message:"Fork provider not configured"});break}default:t(e,{type:"error",code:"UNKNOWN_COMMAND",message:`Unknown message type: ${String(n.type).slice(0,100)}`});}}let I=new Map,P=50;return c.onConnection((e,a,n)=>{if(s.size+d.size>=w){try{let m={type:"error",code:"MAX_CLIENTS",message:"Connection limit reached"};e.send(JSON.stringify(m));}catch{}e.close();return}C?d.add(e):(s.add(e),t(e,{type:"welcome",version:1,sessionId:R,timestamp:Date.now()})),a(m=>B(e,m)),n(()=>{s.delete(e),d.delete(e),I.delete(e);});}),{get clientCount(){return s.size},broadcast(e){l(e);},pushHealth(){i&&s.size>0&&l({type:"health",metrics:i.getAllMetrics()});},pushBreakpoints(){h&&s.size>0&&l({type:"breakpoints",state:h()});},pushScratchpadUpdate(e,a){s.size>0&&l({type:"scratchpad_update",key:e,value:a});},pushDerivedUpdate(e,a){s.size>0&&l({type:"derived_update",id:e,value:a});},pushTokenStream(e,a,n){s.size>0&&l({type:"token_stream",agentId:e,tokens:a,tokenCount:n});},pushStreamDone(e,a){s.size>0&&l({type:"stream_done",agentId:e,totalTokens:a});},close(){N(),D&&(clearInterval(D),D=null),_&&(clearInterval(_),_=null),A();for(let e of s)try{e.close();}catch{}for(let e of d)try{e.close();}catch{}s.clear(),d.clear(),I.clear(),c.close();}}}async function z(o,c={}){if(!o.timeline)throw new Error("[Directive DevTools] Orchestrator must have debug: true to use DevTools");let v=await F({port:c.port??4040,host:c.host??"localhost"});return L({transport:v,timeline:o.timeline,healthMonitor:o.healthMonitor,healthPushIntervalMs:c.healthPushIntervalMs??5e3,batchSize:c.batchSize,authenticate:c.authenticate,getSnapshot:o.getAllAgentStates?()=>{let i=o.getAllAgentStates();return {timestamp:Date.now(),agents:i,eventCount:o.timeline.getEvents().length}}:void 0,getBreakpointState:o.getPendingBreakpoints?()=>({pending:o.getPendingBreakpoints(),resolved:[],cancelled:[]}):void 0,onResumeBreakpoint:o.resumeBreakpoint,onCancelBreakpoint:o.cancelBreakpoint,getScratchpadState:o.getScratchpadState,getDerivedState:o.getDerivedState,onForkFromSnapshot:o.timeline?.forkFrom?i=>(o.timeline.forkFrom(i),{newEventCount:o.timeline.getEvents().length}):void 0})}async function F(o={}){let c=o.port??4040,v=o.host??"localhost",{WebSocketServer:i}=await import('ws'),f=new i({port:c,host:v,maxPayload:o.maxPayloadBytes??1048576}),h=null;return f.on("connection",p=>{let b=null,k=null,T={send(g){p.readyState===p.OPEN&&p.send(g);},close(){p.close();}};p.on("message",g=>{b&&b(g.toString());}),p.on("close",()=>{k&&k();}),h?.(T,g=>{b=g;},g=>{k=g;});}),{onConnection(p){h=p;},close(){f.close();}}}exports.a=L;exports.b=z;exports.c=F;//# sourceMappingURL=chunk-IR3IHBVQ.cjs.map
2
- //# sourceMappingURL=chunk-IR3IHBVQ.cjs.map
1
+ 'use strict';function L(o){let{transport:c,timeline:v,healthMonitor:i,getSnapshot:f,getBreakpointState:h,onResumeBreakpoint:p,onCancelBreakpoint:b,getScratchpadState:k,getDerivedState:T,onForkFromSnapshot:g,batchSize:M=1,batchIntervalMs:E=50,healthPushIntervalMs:O=0,authenticate:C}=o,w=o.maxClients??50,R=`devtools_${crypto.randomUUID()}`,s=new Set,d=new Set,y=[],D=null,_=null;function t(e,a){try{e.send(JSON.stringify(a));}catch{s.delete(e);}}function l(e){let a=JSON.stringify(e),n=[...s];for(let m of n)try{m.send(a);}catch{s.delete(m);}}function A(){y.length!==0&&(y.length===1?l({type:"event",event:y[0]}):l({type:"event_batch",events:y}),y=[]);}let N=v.subscribe(e=>{if(s.size!==0){if(M<=1){l({type:"event",event:e});return}y.push(e),y.length>=M&&A();}});M>1&&E>0&&(D=setInterval(A,E)),O>0&&i&&(_=setInterval(()=>{s.size>0&&l({type:"health",metrics:i.getAllMetrics()});},O));function B(e,a){let n;try{n=JSON.parse(a);}catch{t(e,{type:"error",code:"INVALID_JSON",message:"Could not parse message"});return}if(!n||typeof n!="object"||typeof n.type!="string"){t(e,{type:"error",code:"INVALID_MESSAGE",message:"Missing type field"});return}let m=Date.now(),x=I.get(e)??0;if(m-x<P){t(e,{type:"error",code:"RATE_LIMITED",message:"Too many requests"});return}if(I.set(e,m),n.type==="authenticate"){if(!C){t(e,{type:"error",code:"UNKNOWN_COMMAND",message:"Authentication not configured on this server"});return}if(!d.has(e)){t(e,{type:"error",code:"ALREADY_AUTHENTICATED",message:"Already authenticated"});return}if(typeof n.token!="string"){t(e,{type:"error",code:"AUTH_FAILED",message:"Missing token"}),e.close(),d.delete(e);return}let r=C(n.token),u=S=>{S?(d.delete(e),s.add(e),t(e,{type:"welcome",version:1,sessionId:R,timestamp:Date.now()})):(t(e,{type:"error",code:"AUTH_FAILED",message:"Invalid token"}),d.delete(e),e.close());};r instanceof Promise?r.then(u).catch(()=>{t(e,{type:"error",code:"AUTH_FAILED",message:"Authentication error"}),d.delete(e),e.close();}):u(r);return}if(d.has(e)){t(e,{type:"error",code:"AUTH_REQUIRED",message:"Authentication required"});return}switch(n.type){case "ping":t(e,{type:"pong",timestamp:Date.now()});break;case "request_snapshot":f?t(e,{type:"snapshot",data:f()}):t(e,{type:"error",code:"NO_SNAPSHOT",message:"Snapshot provider not configured"});break;case "request_health":i?t(e,{type:"health",metrics:i.getAllMetrics()}):t(e,{type:"error",code:"NO_HEALTH",message:"Health monitor not configured"});break;case "request_events":{let r=v.getEvents(),u=n.since,S=u!=null?r.filter(H=>H.id>u):r;t(e,{type:"event_batch",events:S});break}case "request_breakpoints":h?t(e,{type:"breakpoints",state:h()}):t(e,{type:"error",code:"NO_BREAKPOINTS",message:"Breakpoint provider not configured"});break;case "resume_breakpoint":if(p&&typeof n.breakpointId=="string"){let r=n.modifications?{input:n.modifications.input,skip:n.modifications.skip}:void 0;p(n.breakpointId,r);}else t(e,{type:"error",code:"NO_BREAKPOINTS",message:"Breakpoint resume not configured"});break;case "cancel_breakpoint":if(b&&typeof n.breakpointId=="string"){let r=typeof n.reason=="string"?n.reason:void 0;b(n.breakpointId,r);}else t(e,{type:"error",code:"NO_BREAKPOINTS",message:"Breakpoint cancel not configured"});break;case "export_session":t(e,{type:"event_batch",events:v.getEvents()});break;case "import_session":{if(typeof n.data!="string")t(e,{type:"error",code:"INVALID_DATA",message:"Missing data field for import"});else if(n.data.length>10485760)t(e,{type:"error",code:"IMPORT_TOO_LARGE",message:`Import data exceeds ${10485760/1024/1024} MB limit`});else try{v.import(n.data),t(e,{type:"event_batch",events:v.getEvents()});}catch(u){let S=u instanceof Error?u.message:String(u);t(e,{type:"error",code:"IMPORT_FAILED",message:S});}break}case "request_scratchpad":k?t(e,{type:"scratchpad_state",data:k()}):t(e,{type:"error",code:"NO_SCRATCHPAD",message:"Scratchpad provider not configured"});break;case "request_derived":T?t(e,{type:"derived_state",data:T()}):t(e,{type:"error",code:"NO_DERIVED",message:"Derived state provider not configured"});break;case "fork_from_snapshot":{if(g&&typeof n.eventId=="number")try{let r=g(n.eventId);t(e,{type:"fork_complete",eventId:n.eventId,newEventCount:r.newEventCount});}catch(r){let u=r instanceof Error?r.message:String(r);t(e,{type:"error",code:"FORK_FAILED",message:u});}else t(e,{type:"error",code:"NO_FORK",message:"Fork provider not configured"});break}default:t(e,{type:"error",code:"UNKNOWN_COMMAND",message:`Unknown message type: ${String(n.type).slice(0,100)}`});}}let I=new Map,P=50;return c.onConnection((e,a,n)=>{if(s.size+d.size>=w){try{let m={type:"error",code:"MAX_CLIENTS",message:"Connection limit reached"};e.send(JSON.stringify(m));}catch{}e.close();return}C?d.add(e):(s.add(e),t(e,{type:"welcome",version:1,sessionId:R,timestamp:Date.now()})),a(m=>B(e,m)),n(()=>{s.delete(e),d.delete(e),I.delete(e);});}),{get clientCount(){return s.size},broadcast(e){l(e);},pushHealth(){i&&s.size>0&&l({type:"health",metrics:i.getAllMetrics()});},pushBreakpoints(){h&&s.size>0&&l({type:"breakpoints",state:h()});},pushScratchpadUpdate(e,a){s.size>0&&l({type:"scratchpad_update",key:e,value:a});},pushDerivedUpdate(e,a){s.size>0&&l({type:"derived_update",id:e,value:a});},pushTokenStream(e,a,n){s.size>0&&l({type:"token_stream",agentId:e,tokens:a,tokenCount:n});},pushStreamDone(e,a){s.size>0&&l({type:"stream_done",agentId:e,totalTokens:a});},close(){N(),D&&(clearInterval(D),D=null),_&&(clearInterval(_),_=null),A();for(let e of s)try{e.close();}catch{}for(let e of d)try{e.close();}catch{}s.clear(),d.clear(),I.clear(),c.close();}}}async function z(o,c={}){if(!o.timeline)throw new Error("[Directive DevTools] Orchestrator must have debug: true to use DevTools");let v=await F({port:c.port??4040,host:c.host??"localhost"});return L({transport:v,timeline:o.timeline,healthMonitor:o.healthMonitor,healthPushIntervalMs:c.healthPushIntervalMs??5e3,batchSize:c.batchSize,authenticate:c.authenticate,getSnapshot:o.getAllAgentStates?()=>{let i=o.getAllAgentStates();return {timestamp:Date.now(),agents:i,eventCount:o.timeline.getEvents().length}}:void 0,getBreakpointState:o.getPendingBreakpoints?()=>({pending:o.getPendingBreakpoints(),resolved:[],cancelled:[]}):void 0,onResumeBreakpoint:o.resumeBreakpoint,onCancelBreakpoint:o.cancelBreakpoint,getScratchpadState:o.getScratchpadState,getDerivedState:o.getDerivedState,onForkFromSnapshot:o.timeline?.forkFrom?i=>(o.timeline.forkFrom(i),{newEventCount:o.timeline.getEvents().length}):void 0})}async function F(o={}){let c=o.port??4040,v=o.host??"localhost",{WebSocketServer:i}=await import('ws'),f=new i({port:c,host:v,maxPayload:o.maxPayloadBytes??1048576}),h=null;return f.on("connection",p=>{let b=null,k=null,T={send(g){p.readyState===p.OPEN&&p.send(g);},close(){p.close();}};p.on("message",g=>{b&&b(g.toString());}),p.on("close",()=>{k&&k();}),h?.(T,g=>{b=g;},g=>{k=g;});}),{onConnection(p){h=p;},close(){f.close();}}}exports.a=L;exports.b=z;exports.c=F;//# sourceMappingURL=chunk-7JTR4QBA.cjs.map
2
+ //# sourceMappingURL=chunk-7JTR4QBA.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/devtools-server.ts"],"names":["createDevToolsServer","config","transport","timeline","healthMonitor","getSnapshot","getBreakpointState","onResumeBreakpoint","onCancelBreakpoint","getScratchpadState","getDerivedState","onForkFromSnapshot","batchSize","batchIntervalMs","healthPushIntervalMs","authenticate","maxClients","sessionId","clients","pendingAuthClients","batchBuffer","batchTimer","healthTimer","sendToClient","client","message","broadcastMessage","data","snapshot","flushBatch","unsubscribeTimeline","event","handleClientMessage","raw","msg","now","last","clientLastMessage","MIN_MESSAGE_INTERVAL_MS","result","handleResult","valid","events","since","filtered","e","mods","safeReason","err","errMsg","onMessage","onClose","key","value","id","agentId","tokens","tokenCount","totalTokens","connectDevTools","orchestrator","options","createWsTransport","agents","eventId","port","host","WebSocketServer","wss","connectionHandler","ws","messageHandler","closeHandler","handler"],"mappings":"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","file":"chunk-IR3IHBVQ.cjs","sourcesContent":["/**\n * DevTools Server — WebSocket-based bridge between orchestrators and DevTools UI.\n *\n * Streams debug timeline events, health metrics, breakpoint state, and system\n * snapshots in real-time to connected DevTools clients. Accepts commands from\n * clients to resume/cancel breakpoints and request snapshots.\n *\n * Transport-agnostic: works with any WebSocket implementation (ws, Bun, Deno)\n * via the {@link DevToolsTransport} interface.\n *\n * @module\n */\n\nimport type { DebugTimeline } from \"./debug-timeline.js\";\nimport type { AgentHealthMetrics, HealthMonitor } from \"./health-monitor.js\";\nimport type { BreakpointState, DebugEvent } from \"./types.js\";\n\n// ============================================================================\n// Transport Interface (WebSocket abstraction)\n// ============================================================================\n\n/** A connected DevTools client */\nexport interface DevToolsClient {\n /** Send a JSON-serializable message to this client */\n send(data: string): void;\n /** Close the connection */\n close(): void;\n}\n\n/**\n * Transport layer for the DevTools server.\n *\n * Implement this interface to bridge any WebSocket library (ws, Bun.serve, Deno.serve).\n *\n * @example Node.js with `ws`:\n * ```typescript\n * import { WebSocketServer } from \"ws\";\n *\n * function createWsTransport(port: number): DevToolsTransport {\n * const wss = new WebSocketServer({ port });\n * let onConnect: ((client: DevToolsClient) => void) | null = null;\n *\n * wss.on(\"connection\", (ws) => {\n * const client: DevToolsClient = {\n * send: (data) => { if (ws.readyState === ws.OPEN) ws.send(data); },\n * close: () => ws.close(),\n * };\n * ws.on(\"message\", (raw) => {\n * if (client._onMessage) client._onMessage(raw.toString());\n * });\n * ws.on(\"close\", () => {\n * if (client._onClose) client._onClose();\n * });\n * onConnect?.(client);\n * });\n *\n * return {\n * onConnection(handler) { onConnect = handler; },\n * close() { wss.close(); },\n * };\n * }\n * ```\n */\nexport interface DevToolsTransport {\n /** Register a handler for new client connections */\n onConnection(\n handler: (\n client: DevToolsClient,\n onMessage: (handler: (data: string) => void) => void,\n onClose: (handler: () => void) => void,\n ) => void,\n ): void;\n /** Shut down the transport */\n close(): void;\n}\n\n// ============================================================================\n// Protocol Messages\n// ============================================================================\n\n/** Messages sent FROM the server TO clients */\nexport type DevToolsServerMessage =\n | { type: \"welcome\"; version: number; sessionId: string; timestamp: number }\n | { type: \"event\"; event: DebugEvent }\n | { type: \"event_batch\"; events: DebugEvent[] }\n | { type: \"snapshot\"; data: DevToolsSnapshot }\n | { type: \"health\"; metrics: Record<string, AgentHealthMetrics> }\n | { type: \"breakpoints\"; state: BreakpointState }\n | { type: \"pong\"; timestamp: number }\n // Scratchpad & derived state\n | { type: \"scratchpad_state\"; data: Record<string, unknown> }\n | { type: \"scratchpad_update\"; key: string; value: unknown }\n | { type: \"derived_state\"; data: Record<string, unknown> }\n | { type: \"derived_update\"; id: string; value: unknown }\n // Fork\n | { type: \"fork_complete\"; eventId: number; newEventCount: number }\n // Token streaming\n | {\n type: \"token_stream\";\n agentId: string;\n tokens: string;\n tokenCount: number;\n }\n | { type: \"stream_done\"; agentId: string; totalTokens: number }\n | { type: \"error\"; code: string; message: string };\n\n/** Messages sent FROM clients TO the server */\nexport type DevToolsClientMessage =\n | { type: \"authenticate\"; token: string }\n | { type: \"request_snapshot\" }\n | { type: \"request_health\" }\n | { type: \"request_events\"; since?: number }\n | { type: \"request_breakpoints\" }\n | {\n type: \"resume_breakpoint\";\n breakpointId: string;\n modifications?: { input?: string; skip?: boolean };\n }\n | { type: \"cancel_breakpoint\"; breakpointId: string; reason?: string }\n | { type: \"export_session\" }\n | { type: \"import_session\"; data: string }\n // Scratchpad & derived requests\n | { type: \"request_scratchpad\" }\n | { type: \"request_derived\" }\n // Fork\n | { type: \"fork_from_snapshot\"; eventId: number }\n | { type: \"ping\" };\n\n/** System snapshot sent to clients on demand */\nexport interface DevToolsSnapshot {\n timestamp: number;\n agents: Record<\n string,\n {\n status: string;\n lastInput?: string;\n lastOutput?: unknown;\n totalTokens: number;\n runCount: number;\n }\n >;\n coordinator?: { globalTokens: number; status: string };\n derived?: Record<string, unknown>;\n eventCount: number;\n}\n\n// ============================================================================\n// Server Configuration\n// ============================================================================\n\n/** Configuration for the DevTools server */\nexport interface DevToolsServerConfig {\n /** Transport to use for WebSocket connections */\n transport: DevToolsTransport;\n /** Debug timeline to subscribe to */\n timeline: DebugTimeline;\n /** Health monitor for metrics (optional) */\n healthMonitor?: HealthMonitor | null;\n /** Callback to get current agent states for snapshots */\n getSnapshot?: () => DevToolsSnapshot;\n /** Callback to get current breakpoint state */\n getBreakpointState?: () => BreakpointState;\n /** Callback to resume a breakpoint */\n onResumeBreakpoint?: (\n id: string,\n modifications?: { input?: string; skip?: boolean },\n ) => void;\n /** Callback to cancel a breakpoint */\n onCancelBreakpoint?: (id: string, reason?: string) => void;\n /** Callback to get current scratchpad state */\n getScratchpadState?: () => Record<string, unknown>;\n /** Callback to get current derived state */\n getDerivedState?: () => Record<string, unknown>;\n /** Callback to fork from a snapshot event */\n onForkFromSnapshot?: (eventId: number) => { newEventCount: number };\n /** Maximum events to batch before flushing. Default: 1 (no batching) */\n batchSize?: number;\n /** Flush interval for batched events (ms). Default: 50 */\n batchIntervalMs?: number;\n /** Health metrics push interval (ms). 0 = no auto-push. Default: 0 */\n healthPushIntervalMs?: number;\n /** Maximum connected clients. Default: 50 */\n maxClients?: number;\n /** Token authentication callback. When set, new connections must send an `authenticate` message before receiving data. */\n authenticate?: (token: string) => boolean | Promise<boolean>;\n}\n\n// ============================================================================\n// Server Instance\n// ============================================================================\n\n/** DevTools server instance */\nexport interface DevToolsServer {\n /** Number of connected clients */\n readonly clientCount: number;\n /** Broadcast a message to all connected clients */\n broadcast(message: DevToolsServerMessage): void;\n /** Push current health metrics to all clients */\n pushHealth(): void;\n /** Push current breakpoint state to all clients */\n pushBreakpoints(): void;\n /** Push a scratchpad key update to all clients */\n pushScratchpadUpdate(key: string, value: unknown): void;\n /** Push a derived value update to all clients */\n pushDerivedUpdate(id: string, value: unknown): void;\n /** Push streaming tokens to all clients */\n pushTokenStream(agentId: string, tokens: string, tokenCount: number): void;\n /** Signal stream completion to all clients */\n pushStreamDone(agentId: string, totalTokens: number): void;\n /** Shut down the server and disconnect all clients */\n close(): void;\n}\n\nconst PROTOCOL_VERSION = 1;\n\n/**\n * Create a DevTools server that bridges orchestrator state to DevTools UI clients.\n *\n * @example\n * ```typescript\n * const server = createDevToolsServer({\n * transport: createWsTransport(4040),\n * timeline: orchestrator.timeline!,\n * healthMonitor: orchestrator.healthMonitor,\n * getSnapshot: () => buildSnapshot(orchestrator),\n * getBreakpointState: () => orchestrator.getBreakpointState(),\n * onResumeBreakpoint: (id, mods) => orchestrator.resumeBreakpoint(id, mods),\n * onCancelBreakpoint: (id, reason) => orchestrator.cancelBreakpoint(id, reason),\n * });\n * ```\n */\nexport function createDevToolsServer(\n config: DevToolsServerConfig,\n): DevToolsServer {\n const {\n transport,\n timeline,\n healthMonitor,\n getSnapshot,\n getBreakpointState,\n onResumeBreakpoint,\n onCancelBreakpoint,\n getScratchpadState,\n getDerivedState,\n onForkFromSnapshot,\n batchSize = 1,\n batchIntervalMs = 50,\n healthPushIntervalMs = 0,\n authenticate,\n } = config;\n const maxClients = config.maxClients ?? 50;\n\n const sessionId = `devtools_${crypto.randomUUID()}`;\n const clients = new Set<DevToolsClient>();\n const pendingAuthClients = new Set<DevToolsClient>();\n let batchBuffer: DebugEvent[] = [];\n let batchTimer: ReturnType<typeof setInterval> | null = null;\n let healthTimer: ReturnType<typeof setInterval> | null = null;\n\n // ------------------------------------------------------------------\n // Helpers\n // ------------------------------------------------------------------\n\n function sendToClient(\n client: DevToolsClient,\n message: DevToolsServerMessage,\n ): void {\n try {\n client.send(JSON.stringify(message));\n } catch {\n // Client may have disconnected — remove silently\n clients.delete(client);\n }\n }\n\n function broadcastMessage(message: DevToolsServerMessage): void {\n const data = JSON.stringify(message);\n const snapshot = [...clients];\n for (const client of snapshot) {\n try {\n client.send(data);\n } catch {\n clients.delete(client);\n }\n }\n }\n\n function flushBatch(): void {\n if (batchBuffer.length === 0) {\n return;\n }\n\n if (batchBuffer.length === 1) {\n broadcastMessage({ type: \"event\", event: batchBuffer[0]! });\n } else {\n broadcastMessage({ type: \"event_batch\", events: batchBuffer });\n }\n\n batchBuffer = [];\n }\n\n // ------------------------------------------------------------------\n // Timeline subscription\n // ------------------------------------------------------------------\n\n const unsubscribeTimeline: () => void = timeline.subscribe(\n (event: DebugEvent) => {\n if (clients.size === 0) {\n return;\n }\n\n if (batchSize <= 1) {\n broadcastMessage({ type: \"event\", event });\n\n return;\n }\n\n batchBuffer.push(event);\n if (batchBuffer.length >= batchSize) {\n flushBatch();\n }\n },\n );\n\n // Start batch flush timer if batching enabled\n if (batchSize > 1 && batchIntervalMs > 0) {\n batchTimer = setInterval(flushBatch, batchIntervalMs);\n }\n\n // Start health push timer if configured\n if (healthPushIntervalMs > 0 && healthMonitor) {\n healthTimer = setInterval(() => {\n if (clients.size > 0) {\n broadcastMessage({\n type: \"health\",\n metrics: healthMonitor.getAllMetrics(),\n });\n }\n }, healthPushIntervalMs);\n }\n\n // ------------------------------------------------------------------\n // Client message handler\n // ------------------------------------------------------------------\n\n function handleClientMessage(client: DevToolsClient, raw: string): void {\n let msg: DevToolsClientMessage;\n try {\n msg = JSON.parse(raw) as DevToolsClientMessage;\n } catch {\n sendToClient(client, {\n type: \"error\",\n code: \"INVALID_JSON\",\n message: \"Could not parse message\",\n });\n\n return;\n }\n\n if (!msg || typeof msg !== \"object\" || typeof msg.type !== \"string\") {\n sendToClient(client, {\n type: \"error\",\n code: \"INVALID_MESSAGE\",\n message: \"Missing type field\",\n });\n\n return;\n }\n\n const now = Date.now();\n const last = clientLastMessage.get(client) ?? 0;\n if (now - last < MIN_MESSAGE_INTERVAL_MS) {\n sendToClient(client, {\n type: \"error\",\n code: \"RATE_LIMITED\",\n message: \"Too many requests\",\n });\n\n return;\n }\n clientLastMessage.set(client, now);\n\n // Handle authenticate message\n if (msg.type === \"authenticate\") {\n if (!authenticate) {\n // No auth configured — treat as unknown command\n sendToClient(client, {\n type: \"error\",\n code: \"UNKNOWN_COMMAND\",\n message: \"Authentication not configured on this server\",\n });\n\n return;\n }\n\n if (!pendingAuthClients.has(client)) {\n // Already authenticated\n sendToClient(client, {\n type: \"error\",\n code: \"ALREADY_AUTHENTICATED\",\n message: \"Already authenticated\",\n });\n\n return;\n }\n\n if (typeof msg.token !== \"string\") {\n sendToClient(client, {\n type: \"error\",\n code: \"AUTH_FAILED\",\n message: \"Missing token\",\n });\n client.close();\n pendingAuthClients.delete(client);\n\n return;\n }\n\n const result = authenticate(msg.token);\n const handleResult = (valid: boolean) => {\n if (valid) {\n pendingAuthClients.delete(client);\n clients.add(client);\n sendToClient(client, {\n type: \"welcome\",\n version: PROTOCOL_VERSION,\n sessionId,\n timestamp: Date.now(),\n });\n } else {\n sendToClient(client, {\n type: \"error\",\n code: \"AUTH_FAILED\",\n message: \"Invalid token\",\n });\n pendingAuthClients.delete(client);\n client.close();\n }\n };\n\n if (result instanceof Promise) {\n result.then(handleResult).catch(() => {\n sendToClient(client, {\n type: \"error\",\n code: \"AUTH_FAILED\",\n message: \"Authentication error\",\n });\n pendingAuthClients.delete(client);\n client.close();\n });\n } else {\n handleResult(result);\n }\n\n return;\n }\n\n // Reject commands from clients pending authentication\n if (pendingAuthClients.has(client)) {\n sendToClient(client, {\n type: \"error\",\n code: \"AUTH_REQUIRED\",\n message: \"Authentication required\",\n });\n\n return;\n }\n\n switch (msg.type) {\n case \"ping\":\n sendToClient(client, { type: \"pong\", timestamp: Date.now() });\n break;\n\n case \"request_snapshot\":\n if (getSnapshot) {\n sendToClient(client, { type: \"snapshot\", data: getSnapshot() });\n } else {\n sendToClient(client, {\n type: \"error\",\n code: \"NO_SNAPSHOT\",\n message: \"Snapshot provider not configured\",\n });\n }\n break;\n\n case \"request_health\":\n if (healthMonitor) {\n sendToClient(client, {\n type: \"health\",\n metrics: healthMonitor.getAllMetrics(),\n });\n } else {\n sendToClient(client, {\n type: \"error\",\n code: \"NO_HEALTH\",\n message: \"Health monitor not configured\",\n });\n }\n break;\n\n case \"request_events\": {\n const events = timeline.getEvents();\n const since = msg.since;\n const filtered =\n since != null ? events.filter((e) => e.id > since) : events;\n sendToClient(client, { type: \"event_batch\", events: filtered });\n break;\n }\n\n case \"request_breakpoints\":\n if (getBreakpointState) {\n sendToClient(client, {\n type: \"breakpoints\",\n state: getBreakpointState(),\n });\n } else {\n sendToClient(client, {\n type: \"error\",\n code: \"NO_BREAKPOINTS\",\n message: \"Breakpoint provider not configured\",\n });\n }\n break;\n\n case \"resume_breakpoint\":\n if (onResumeBreakpoint && typeof msg.breakpointId === \"string\") {\n // Sanitize: only extract known fields to prevent prototype pollution\n const mods = msg.modifications\n ? { input: msg.modifications.input, skip: msg.modifications.skip }\n : undefined;\n onResumeBreakpoint(msg.breakpointId, mods);\n } else {\n sendToClient(client, {\n type: \"error\",\n code: \"NO_BREAKPOINTS\",\n message: \"Breakpoint resume not configured\",\n });\n }\n break;\n\n case \"cancel_breakpoint\":\n if (onCancelBreakpoint && typeof msg.breakpointId === \"string\") {\n const safeReason =\n typeof msg.reason === \"string\" ? msg.reason : undefined;\n onCancelBreakpoint(msg.breakpointId, safeReason);\n } else {\n sendToClient(client, {\n type: \"error\",\n code: \"NO_BREAKPOINTS\",\n message: \"Breakpoint cancel not configured\",\n });\n }\n break;\n\n case \"export_session\":\n sendToClient(client, {\n type: \"event_batch\",\n events: timeline.getEvents(),\n });\n break;\n\n case \"import_session\": {\n const MAX_IMPORT_SIZE = 10 * 1024 * 1024; // ~10M characters (string .length check, not byte size)\n if (typeof msg.data !== \"string\") {\n sendToClient(client, {\n type: \"error\",\n code: \"INVALID_DATA\",\n message: \"Missing data field for import\",\n });\n } else if (msg.data.length > MAX_IMPORT_SIZE) {\n sendToClient(client, {\n type: \"error\",\n code: \"IMPORT_TOO_LARGE\",\n message: `Import data exceeds ${MAX_IMPORT_SIZE / 1024 / 1024} MB limit`,\n });\n } else {\n try {\n timeline.import(msg.data);\n sendToClient(client, {\n type: \"event_batch\",\n events: timeline.getEvents(),\n });\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n sendToClient(client, {\n type: \"error\",\n code: \"IMPORT_FAILED\",\n message: errMsg,\n });\n }\n }\n break;\n }\n\n case \"request_scratchpad\":\n if (getScratchpadState) {\n sendToClient(client, {\n type: \"scratchpad_state\",\n data: getScratchpadState(),\n });\n } else {\n sendToClient(client, {\n type: \"error\",\n code: \"NO_SCRATCHPAD\",\n message: \"Scratchpad provider not configured\",\n });\n }\n break;\n\n case \"request_derived\":\n if (getDerivedState) {\n sendToClient(client, {\n type: \"derived_state\",\n data: getDerivedState(),\n });\n } else {\n sendToClient(client, {\n type: \"error\",\n code: \"NO_DERIVED\",\n message: \"Derived state provider not configured\",\n });\n }\n break;\n\n case \"fork_from_snapshot\": {\n if (onForkFromSnapshot && typeof msg.eventId === \"number\") {\n try {\n const result = onForkFromSnapshot(msg.eventId);\n sendToClient(client, {\n type: \"fork_complete\",\n eventId: msg.eventId,\n newEventCount: result.newEventCount,\n });\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n sendToClient(client, {\n type: \"error\",\n code: \"FORK_FAILED\",\n message: errMsg,\n });\n }\n } else {\n sendToClient(client, {\n type: \"error\",\n code: \"NO_FORK\",\n message: \"Fork provider not configured\",\n });\n }\n break;\n }\n\n default:\n sendToClient(client, {\n type: \"error\",\n code: \"UNKNOWN_COMMAND\",\n message: `Unknown message type: ${String((msg as { type: string }).type).slice(0, 100)}`,\n });\n }\n }\n\n // ------------------------------------------------------------------\n // Rate limiting\n // ------------------------------------------------------------------\n\n const clientLastMessage = new Map<DevToolsClient, number>();\n const MIN_MESSAGE_INTERVAL_MS = 50;\n\n // ------------------------------------------------------------------\n // Connection handler\n // ------------------------------------------------------------------\n\n transport.onConnection((client, onMessage, onClose) => {\n if (clients.size + pendingAuthClients.size >= maxClients) {\n try {\n const msg: DevToolsServerMessage = {\n type: \"error\",\n code: \"MAX_CLIENTS\",\n message: \"Connection limit reached\",\n };\n client.send(JSON.stringify(msg));\n } catch {\n /* ignore */\n }\n client.close();\n\n return;\n }\n\n if (authenticate) {\n // Hold in pending state until client sends authenticate message\n pendingAuthClients.add(client);\n } else {\n // No auth — add directly and send welcome\n clients.add(client);\n sendToClient(client, {\n type: \"welcome\",\n version: PROTOCOL_VERSION,\n sessionId,\n timestamp: Date.now(),\n });\n }\n\n onMessage((data) => handleClientMessage(client, data));\n onClose(() => {\n clients.delete(client);\n pendingAuthClients.delete(client);\n clientLastMessage.delete(client);\n });\n });\n\n // ------------------------------------------------------------------\n // Public interface\n // ------------------------------------------------------------------\n\n return {\n get clientCount(): number {\n return clients.size;\n },\n\n broadcast(message: DevToolsServerMessage): void {\n broadcastMessage(message);\n },\n\n pushHealth(): void {\n if (healthMonitor && clients.size > 0) {\n broadcastMessage({\n type: \"health\",\n metrics: healthMonitor.getAllMetrics(),\n });\n }\n },\n\n pushBreakpoints(): void {\n if (getBreakpointState && clients.size > 0) {\n broadcastMessage({ type: \"breakpoints\", state: getBreakpointState() });\n }\n },\n\n pushScratchpadUpdate(key: string, value: unknown): void {\n if (clients.size > 0) {\n broadcastMessage({ type: \"scratchpad_update\", key, value });\n }\n },\n\n pushDerivedUpdate(id: string, value: unknown): void {\n if (clients.size > 0) {\n broadcastMessage({ type: \"derived_update\", id, value });\n }\n },\n\n pushTokenStream(agentId: string, tokens: string, tokenCount: number): void {\n if (clients.size > 0) {\n broadcastMessage({ type: \"token_stream\", agentId, tokens, tokenCount });\n }\n },\n\n pushStreamDone(agentId: string, totalTokens: number): void {\n if (clients.size > 0) {\n broadcastMessage({ type: \"stream_done\", agentId, totalTokens });\n }\n },\n\n close(): void {\n unsubscribeTimeline();\n\n if (batchTimer) {\n clearInterval(batchTimer);\n batchTimer = null;\n }\n\n if (healthTimer) {\n clearInterval(healthTimer);\n healthTimer = null;\n }\n\n flushBatch();\n\n for (const client of clients) {\n try {\n client.close();\n } catch {\n // Ignore close errors\n }\n }\n for (const client of pendingAuthClients) {\n try {\n client.close();\n } catch {\n // Ignore close errors\n }\n }\n clients.clear();\n pendingAuthClients.clear();\n clientLastMessage.clear();\n\n transport.close();\n },\n };\n}\n\n// ============================================================================\n// Orchestrator Connector\n// ============================================================================\n\n/** Options for connecting DevTools to an orchestrator */\nexport interface ConnectDevToolsOptions {\n /** Port for the WebSocket server. Default: 4040 */\n port?: number;\n /** Host to bind to. Default: \"localhost\" */\n host?: string;\n /** Health metrics push interval (ms). Default: 5000 */\n healthPushIntervalMs?: number;\n /** Event batching size. Default: 1 (no batching) */\n batchSize?: number;\n /** Token authentication callback. When set, clients must authenticate before receiving data. */\n authenticate?: (token: string) => boolean | Promise<boolean>;\n}\n\n/** Minimal orchestrator interface for DevTools connection */\nexport interface DevToolsCompatibleOrchestrator {\n timeline: {\n subscribe: (listener: (event: DebugEvent) => void) => () => void;\n getEvents: () => DebugEvent[];\n import: (json: string) => void;\n export: () => string;\n forkFrom?: (eventId: number) => void;\n } | null;\n healthMonitor?: {\n getAllMetrics: () => Record<string, AgentHealthMetrics>;\n } | null;\n getPendingBreakpoints?: () => Array<{\n id: string;\n type: string;\n agentId: string;\n input: string;\n label?: string;\n requestedAt: number;\n }>;\n resumeBreakpoint?: (\n id: string,\n modifications?: { input?: string; skip?: boolean },\n ) => void;\n cancelBreakpoint?: (id: string, reason?: string) => void;\n getAllAgentStates?: () => Record<\n string,\n {\n status: string;\n lastInput?: string;\n lastOutput?: unknown;\n totalTokens: number;\n runCount: number;\n }\n >;\n /** Get current scratchpad state (multi-agent only) */\n getScratchpadState?: () => Record<string, unknown>;\n /** Get current derived values (multi-agent only) */\n getDerivedState?: () => Record<string, unknown>;\n}\n\n/**\n * Connect DevTools to an orchestrator instance.\n *\n * Convenience function that creates a WebSocket transport and DevTools server,\n * automatically wiring up the orchestrator's timeline, health monitor, and breakpoint system.\n *\n * Requires the `ws` package: `npm install ws`\n *\n * **Security:** Binding to `0.0.0.0` exposes the server to all network interfaces.\n * Only do this behind a firewall or with proper authentication.\n *\n * @example\n * ```typescript\n * const orchestrator = createMultiAgentOrchestrator({ debug: true, ... });\n * const devtools = await connectDevTools(orchestrator, { port: 4040 });\n *\n * // Later, clean up:\n * devtools.close();\n * ```\n */\nexport async function connectDevTools(\n orchestrator: DevToolsCompatibleOrchestrator,\n options: ConnectDevToolsOptions = {},\n): Promise<DevToolsServer> {\n if (!orchestrator.timeline) {\n throw new Error(\n \"[Directive DevTools] Orchestrator must have debug: true to use DevTools\",\n );\n }\n\n const transport = await createWsTransport({\n port: options.port ?? 4040,\n host: options.host ?? \"localhost\",\n });\n\n return createDevToolsServer({\n transport,\n timeline: orchestrator.timeline as unknown as DebugTimeline,\n healthMonitor: orchestrator.healthMonitor as HealthMonitor | undefined,\n healthPushIntervalMs: options.healthPushIntervalMs ?? 5000,\n batchSize: options.batchSize,\n authenticate: options.authenticate,\n getSnapshot: orchestrator.getAllAgentStates\n ? () => {\n const agents = orchestrator.getAllAgentStates!();\n\n return {\n timestamp: Date.now(),\n agents,\n eventCount: orchestrator.timeline!.getEvents().length,\n };\n }\n : undefined,\n getBreakpointState: orchestrator.getPendingBreakpoints\n ? () => ({\n pending: orchestrator.getPendingBreakpoints!(),\n resolved: [],\n cancelled: [],\n })\n : undefined,\n onResumeBreakpoint: orchestrator.resumeBreakpoint,\n onCancelBreakpoint: orchestrator.cancelBreakpoint,\n getScratchpadState: orchestrator.getScratchpadState,\n getDerivedState: orchestrator.getDerivedState,\n onForkFromSnapshot: orchestrator.timeline?.forkFrom\n ? (eventId: number) => {\n orchestrator.timeline!.forkFrom!(eventId);\n const newEventCount = orchestrator.timeline!.getEvents().length;\n\n return { newEventCount };\n }\n : undefined,\n });\n}\n\n// ============================================================================\n// Node.js ws Transport Helper\n// ============================================================================\n\n/**\n * Configuration for the built-in Node.js `ws` transport.\n *\n * Requires the `ws` package to be installed: `npm install ws`\n */\nexport interface WsTransportConfig {\n /** Port to listen on. Default: 4040 */\n port?: number;\n /** Host to bind to. Default: \"localhost\" */\n host?: string;\n /** Maximum incoming message size in bytes. Default: 1048576 (1MB) */\n maxPayloadBytes?: number;\n}\n\n/**\n * Create a DevTools transport using the Node.js `ws` WebSocket library.\n *\n * This is a convenience helper — you can implement {@link DevToolsTransport}\n * with any WebSocket library.\n *\n * @example\n * ```typescript\n * const transport = await createWsTransport({ port: 4040 });\n * const server = createDevToolsServer({ transport, timeline });\n * ```\n */\nexport async function createWsTransport(\n config: WsTransportConfig = {},\n): Promise<DevToolsTransport> {\n const port = config.port ?? 4040;\n const host = config.host ?? \"localhost\";\n\n // Dynamic import so ws is not a hard dependency\n const { WebSocketServer } = await import(\"ws\");\n // maxPayload is supported at runtime but missing from @types/ws ServerOptions\n const wss = new WebSocketServer({\n port,\n host,\n ...{ maxPayload: config.maxPayloadBytes ?? 1_048_576 },\n });\n\n let connectionHandler:\n | ((\n client: DevToolsClient,\n onMessage: (handler: (data: string) => void) => void,\n onClose: (handler: () => void) => void,\n ) => void)\n | null = null;\n\n // biome-ignore lint/suspicious/noExplicitAny: ws types resolved at runtime via dynamic import\n wss.on(\"connection\", (ws: any) => {\n let messageHandler: ((data: string) => void) | null = null;\n let closeHandler: (() => void) | null = null;\n\n const client: DevToolsClient = {\n send(data: string) {\n if (ws.readyState === ws.OPEN) {\n ws.send(data);\n }\n },\n close() {\n ws.close();\n },\n };\n\n ws.on(\"message\", (raw: any) => {\n if (messageHandler) {\n messageHandler(raw.toString());\n }\n });\n\n ws.on(\"close\", () => {\n if (closeHandler) {\n closeHandler();\n }\n });\n\n connectionHandler?.(\n client,\n (handler) => {\n messageHandler = handler;\n },\n (handler) => {\n closeHandler = handler;\n },\n );\n });\n\n return {\n onConnection(handler) {\n connectionHandler = handler;\n },\n close() {\n wss.close();\n },\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/devtools-server.ts"],"names":["createDevToolsServer","config","transport","timeline","healthMonitor","getSnapshot","getBreakpointState","onResumeBreakpoint","onCancelBreakpoint","getScratchpadState","getDerivedState","onForkFromSnapshot","batchSize","batchIntervalMs","healthPushIntervalMs","authenticate","maxClients","sessionId","clients","pendingAuthClients","batchBuffer","batchTimer","healthTimer","sendToClient","client","message","broadcastMessage","data","snapshot","flushBatch","unsubscribeTimeline","event","handleClientMessage","raw","msg","now","last","clientLastMessage","MIN_MESSAGE_INTERVAL_MS","result","handleResult","valid","events","since","filtered","e","mods","safeReason","err","errMsg","onMessage","onClose","key","value","id","agentId","tokens","tokenCount","totalTokens","connectDevTools","orchestrator","options","createWsTransport","agents","eventId","port","host","WebSocketServer","wss","connectionHandler","ws","messageHandler","closeHandler","handler"],"mappings":"aAuOO,SAASA,EACdC,CAAAA,CACgB,CAChB,GAAM,CACJ,SAAA,CAAAC,EACA,QAAA,CAAAC,CAAAA,CACA,aAAA,CAAAC,CAAAA,CACA,YAAAC,CAAAA,CACA,kBAAA,CAAAC,EACA,kBAAA,CAAAC,CAAAA,CACA,mBAAAC,CAAAA,CACA,kBAAA,CAAAC,CAAAA,CACA,eAAA,CAAAC,EACA,kBAAA,CAAAC,CAAAA,CACA,UAAAC,CAAAA,CAAY,CAAA,CACZ,gBAAAC,CAAAA,CAAkB,EAAA,CAClB,qBAAAC,CAAAA,CAAuB,CAAA,CACvB,aAAAC,CACF,CAAA,CAAId,EACEe,CAAAA,CAAaf,CAAAA,CAAO,YAAc,EAAA,CAElCgB,CAAAA,CAAY,CAAA,SAAA,EAAY,MAAA,CAAO,YAAY,CAAA,CAAA,CAC3CC,EAAU,IAAI,GAAA,CACdC,EAAqB,IAAI,GAAA,CAC3BC,CAAAA,CAA4B,GAC5BC,CAAAA,CAAoD,IAAA,CACpDC,EAAqD,IAAA,CAMzD,SAASC,EACPC,CAAAA,CACAC,CAAAA,CACM,CACN,GAAI,CACFD,CAAAA,CAAO,IAAA,CAAK,KAAK,SAAA,CAAUC,CAAO,CAAC,EACrC,CAAA,KAAQ,CAENP,CAAAA,CAAQ,MAAA,CAAOM,CAAM,EACvB,CACF,CAEA,SAASE,CAAAA,CAAiBD,EAAsC,CAC9D,IAAME,CAAAA,CAAO,IAAA,CAAK,UAAUF,CAAO,CAAA,CAC7BG,EAAW,CAAC,GAAGV,CAAO,CAAA,CAC5B,IAAA,IAAWM,CAAAA,IAAUI,CAAAA,CACnB,GAAI,CACFJ,CAAAA,CAAO,KAAKG,CAAI,EAClB,MAAQ,CACNT,CAAAA,CAAQ,MAAA,CAAOM,CAAM,EACvB,CAEJ,CAEA,SAASK,CAAAA,EAAmB,CACtBT,EAAY,MAAA,GAAW,CAAA,GAIvBA,EAAY,MAAA,GAAW,CAAA,CACzBM,EAAiB,CAAE,IAAA,CAAM,QAAS,KAAA,CAAON,CAAAA,CAAY,CAAC,CAAG,CAAC,CAAA,CAE1DM,CAAAA,CAAiB,CAAE,IAAA,CAAM,aAAA,CAAe,OAAQN,CAAY,CAAC,EAG/DA,CAAAA,CAAc,EAAC,EACjB,CAMA,IAAMU,CAAAA,CAAkC3B,CAAAA,CAAS,UAC9C4B,CAAAA,EAAsB,CACrB,GAAIb,CAAAA,CAAQ,IAAA,GAAS,CAAA,CAIrB,CAAA,GAAIN,GAAa,CAAA,CAAG,CAClBc,EAAiB,CAAE,IAAA,CAAM,QAAS,KAAA,CAAAK,CAAM,CAAC,CAAA,CAEzC,MACF,CAEAX,CAAAA,CAAY,IAAA,CAAKW,CAAK,CAAA,CAClBX,CAAAA,CAAY,QAAUR,CAAAA,EACxBiB,CAAAA,GAAW,CAEf,CACF,EAGIjB,CAAAA,CAAY,CAAA,EAAKC,EAAkB,CAAA,GACrCQ,CAAAA,CAAa,YAAYQ,CAAAA,CAAYhB,CAAe,CAAA,CAAA,CAIlDC,CAAAA,CAAuB,GAAKV,CAAAA,GAC9BkB,CAAAA,CAAc,YAAY,IAAM,CAC1BJ,EAAQ,IAAA,CAAO,CAAA,EACjBQ,CAAAA,CAAiB,CACf,KAAM,QAAA,CACN,OAAA,CAAStB,EAAc,aAAA,EACzB,CAAC,EAEL,CAAA,CAAGU,CAAoB,CAAA,CAAA,CAOzB,SAASkB,EAAoBR,CAAAA,CAAwBS,CAAAA,CAAmB,CACtE,IAAIC,CAAAA,CACJ,GAAI,CACFA,CAAAA,CAAM,IAAA,CAAK,KAAA,CAAMD,CAAG,EACtB,CAAA,KAAQ,CACNV,CAAAA,CAAaC,CAAAA,CAAQ,CACnB,IAAA,CAAM,OAAA,CACN,IAAA,CAAM,cAAA,CACN,QAAS,yBACX,CAAC,EAED,MACF,CAEA,GAAI,CAACU,CAAAA,EAAO,OAAOA,CAAAA,EAAQ,UAAY,OAAOA,CAAAA,CAAI,MAAS,QAAA,CAAU,CACnEX,EAAaC,CAAAA,CAAQ,CACnB,KAAM,OAAA,CACN,IAAA,CAAM,kBACN,OAAA,CAAS,oBACX,CAAC,CAAA,CAED,MACF,CAEA,IAAMW,CAAAA,CAAM,IAAA,CAAK,GAAA,GACXC,CAAAA,CAAOC,CAAAA,CAAkB,IAAIb,CAAM,CAAA,EAAK,EAC9C,GAAIW,CAAAA,CAAMC,CAAAA,CAAOE,CAAAA,CAAyB,CACxCf,CAAAA,CAAaC,CAAAA,CAAQ,CACnB,IAAA,CAAM,OAAA,CACN,KAAM,cAAA,CACN,OAAA,CAAS,mBACX,CAAC,EAED,MACF,CAIA,GAHAa,CAAAA,CAAkB,GAAA,CAAIb,EAAQW,CAAG,CAAA,CAG7BD,EAAI,IAAA,GAAS,cAAA,CAAgB,CAC/B,GAAI,CAACnB,EAAc,CAEjBQ,CAAAA,CAAaC,EAAQ,CACnB,IAAA,CAAM,OAAA,CACN,IAAA,CAAM,kBACN,OAAA,CAAS,8CACX,CAAC,CAAA,CAED,MACF,CAEA,GAAI,CAACL,EAAmB,GAAA,CAAIK,CAAM,EAAG,CAEnCD,CAAAA,CAAaC,EAAQ,CACnB,IAAA,CAAM,QACN,IAAA,CAAM,uBAAA,CACN,OAAA,CAAS,uBACX,CAAC,CAAA,CAED,MACF,CAEA,GAAI,OAAOU,EAAI,KAAA,EAAU,QAAA,CAAU,CACjCX,CAAAA,CAAaC,CAAAA,CAAQ,CACnB,IAAA,CAAM,OAAA,CACN,KAAM,aAAA,CACN,OAAA,CAAS,eACX,CAAC,CAAA,CACDA,CAAAA,CAAO,KAAA,GACPL,CAAAA,CAAmB,MAAA,CAAOK,CAAM,CAAA,CAEhC,MACF,CAEA,IAAMe,CAAAA,CAASxB,CAAAA,CAAamB,CAAAA,CAAI,KAAK,CAAA,CAC/BM,CAAAA,CAAgBC,GAAmB,CACnCA,CAAAA,EACFtB,EAAmB,MAAA,CAAOK,CAAM,CAAA,CAChCN,CAAAA,CAAQ,IAAIM,CAAM,CAAA,CAClBD,EAAaC,CAAAA,CAAQ,CACnB,KAAM,SAAA,CACN,OAAA,CAAS,EACT,SAAA,CAAAP,CAAAA,CACA,UAAW,IAAA,CAAK,GAAA,EAClB,CAAC,CAAA,GAEDM,EAAaC,CAAAA,CAAQ,CACnB,IAAA,CAAM,OAAA,CACN,KAAM,aAAA,CACN,OAAA,CAAS,eACX,CAAC,CAAA,CACDL,EAAmB,MAAA,CAAOK,CAAM,CAAA,CAChCA,CAAAA,CAAO,OAAM,EAEjB,CAAA,CAEIe,aAAkB,OAAA,CACpBA,CAAAA,CAAO,KAAKC,CAAY,CAAA,CAAE,KAAA,CAAM,IAAM,CACpCjB,CAAAA,CAAaC,CAAAA,CAAQ,CACnB,IAAA,CAAM,OAAA,CACN,KAAM,aAAA,CACN,OAAA,CAAS,sBACX,CAAC,CAAA,CACDL,EAAmB,MAAA,CAAOK,CAAM,EAChCA,CAAAA,CAAO,KAAA,GACT,CAAC,CAAA,CAEDgB,CAAAA,CAAaD,CAAM,EAGrB,MACF,CAGA,GAAIpB,CAAAA,CAAmB,GAAA,CAAIK,CAAM,CAAA,CAAG,CAClCD,CAAAA,CAAaC,CAAAA,CAAQ,CACnB,IAAA,CAAM,OAAA,CACN,KAAM,eAAA,CACN,OAAA,CAAS,yBACX,CAAC,CAAA,CAED,MACF,CAEA,OAAQU,CAAAA,CAAI,IAAA,EACV,KAAK,MAAA,CACHX,EAAaC,CAAAA,CAAQ,CAAE,KAAM,MAAA,CAAQ,SAAA,CAAW,KAAK,GAAA,EAAM,CAAC,CAAA,CAC5D,MAEF,KAAK,kBAAA,CACCnB,CAAAA,CACFkB,CAAAA,CAAaC,CAAAA,CAAQ,CAAE,IAAA,CAAM,UAAA,CAAY,KAAMnB,CAAAA,EAAc,CAAC,CAAA,CAE9DkB,CAAAA,CAAaC,EAAQ,CACnB,IAAA,CAAM,QACN,IAAA,CAAM,aAAA,CACN,QAAS,kCACX,CAAC,EAEH,MAEF,KAAK,gBAAA,CACCpB,CAAAA,CACFmB,EAAaC,CAAAA,CAAQ,CACnB,KAAM,QAAA,CACN,OAAA,CAASpB,EAAc,aAAA,EACzB,CAAC,CAAA,CAEDmB,CAAAA,CAAaC,EAAQ,CACnB,IAAA,CAAM,QACN,IAAA,CAAM,WAAA,CACN,QAAS,+BACX,CAAC,CAAA,CAEH,MAEF,KAAK,gBAAA,CAAkB,CACrB,IAAMkB,CAAAA,CAASvC,CAAAA,CAAS,WAAU,CAC5BwC,CAAAA,CAAQT,CAAAA,CAAI,KAAA,CACZU,EACJD,CAAAA,EAAS,IAAA,CAAOD,EAAO,MAAA,CAAQG,CAAAA,EAAMA,EAAE,EAAA,CAAKF,CAAK,CAAA,CAAID,CAAAA,CACvDnB,EAAaC,CAAAA,CAAQ,CAAE,KAAM,aAAA,CAAe,MAAA,CAAQoB,CAAS,CAAC,CAAA,CAC9D,KACF,CAEA,KAAK,sBACCtC,CAAAA,CACFiB,CAAAA,CAAaC,EAAQ,CACnB,IAAA,CAAM,cACN,KAAA,CAAOlB,CAAAA,EACT,CAAC,EAEDiB,CAAAA,CAAaC,CAAAA,CAAQ,CACnB,IAAA,CAAM,OAAA,CACN,KAAM,gBAAA,CACN,OAAA,CAAS,oCACX,CAAC,EAEH,MAEF,KAAK,oBACH,GAAIjB,CAAAA,EAAsB,OAAO2B,CAAAA,CAAI,YAAA,EAAiB,QAAA,CAAU,CAE9D,IAAMY,CAAAA,CAAOZ,CAAAA,CAAI,cACb,CAAE,KAAA,CAAOA,EAAI,aAAA,CAAc,KAAA,CAAO,KAAMA,CAAAA,CAAI,aAAA,CAAc,IAAK,CAAA,CAC/D,MAAA,CACJ3B,EAAmB2B,CAAAA,CAAI,YAAA,CAAcY,CAAI,EAC3C,CAAA,KACEvB,CAAAA,CAAaC,CAAAA,CAAQ,CACnB,IAAA,CAAM,OAAA,CACN,KAAM,gBAAA,CACN,OAAA,CAAS,kCACX,CAAC,CAAA,CAEH,MAEF,KAAK,oBACH,GAAIhB,CAAAA,EAAsB,OAAO0B,CAAAA,CAAI,YAAA,EAAiB,SAAU,CAC9D,IAAMa,CAAAA,CACJ,OAAOb,EAAI,MAAA,EAAW,QAAA,CAAWA,EAAI,MAAA,CAAS,MAAA,CAChD1B,EAAmB0B,CAAAA,CAAI,YAAA,CAAca,CAAU,EACjD,CAAA,KACExB,EAAaC,CAAAA,CAAQ,CACnB,KAAM,OAAA,CACN,IAAA,CAAM,iBACN,OAAA,CAAS,kCACX,CAAC,CAAA,CAEH,MAEF,KAAK,gBAAA,CACHD,EAAaC,CAAAA,CAAQ,CACnB,KAAM,aAAA,CACN,MAAA,CAAQrB,EAAS,SAAA,EACnB,CAAC,CAAA,CACD,MAEF,KAAK,gBAAA,CAAkB,CAErB,GAAI,OAAO+B,CAAAA,CAAI,IAAA,EAAS,QAAA,CACtBX,EAAaC,CAAAA,CAAQ,CACnB,KAAM,OAAA,CACN,IAAA,CAAM,eACN,OAAA,CAAS,+BACX,CAAC,CAAA,CAAA,KAAA,GACQU,CAAAA,CAAI,KAAK,MAAA,CAAS,QAAA,CAC3BX,EAAaC,CAAAA,CAAQ,CACnB,KAAM,OAAA,CACN,IAAA,CAAM,kBAAA,CACN,OAAA,CAAS,uBAAuB,QAAA,CAAkB,IAAA,CAAO,IAAI,CAAA,SAAA,CAC/D,CAAC,OAED,GAAI,CACFrB,CAAAA,CAAS,MAAA,CAAO+B,EAAI,IAAI,CAAA,CACxBX,EAAaC,CAAAA,CAAQ,CACnB,KAAM,aAAA,CACN,MAAA,CAAQrB,CAAAA,CAAS,SAAA,EACnB,CAAC,EACH,OAAS6C,CAAAA,CAAK,CACZ,IAAMC,CAAAA,CAASD,CAAAA,YAAe,MAAQA,CAAAA,CAAI,OAAA,CAAU,OAAOA,CAAG,CAAA,CAC9DzB,EAAaC,CAAAA,CAAQ,CACnB,KAAM,OAAA,CACN,IAAA,CAAM,eAAA,CACN,OAAA,CAASyB,CACX,CAAC,EACH,CAEF,KACF,CAEA,KAAK,oBAAA,CACCxC,CAAAA,CACFc,CAAAA,CAAaC,CAAAA,CAAQ,CACnB,IAAA,CAAM,kBAAA,CACN,KAAMf,CAAAA,EACR,CAAC,CAAA,CAEDc,CAAAA,CAAaC,CAAAA,CAAQ,CACnB,KAAM,OAAA,CACN,IAAA,CAAM,gBACN,OAAA,CAAS,oCACX,CAAC,CAAA,CAEH,MAEF,KAAK,iBAAA,CACCd,CAAAA,CACFa,EAAaC,CAAAA,CAAQ,CACnB,KAAM,eAAA,CACN,IAAA,CAAMd,GACR,CAAC,CAAA,CAEDa,CAAAA,CAAaC,EAAQ,CACnB,IAAA,CAAM,QACN,IAAA,CAAM,YAAA,CACN,QAAS,uCACX,CAAC,CAAA,CAEH,MAEF,KAAK,oBAAA,CAAsB,CACzB,GAAIb,CAAAA,EAAsB,OAAOuB,EAAI,OAAA,EAAY,QAAA,CAC/C,GAAI,CACF,IAAMK,CAAAA,CAAS5B,CAAAA,CAAmBuB,EAAI,OAAO,CAAA,CAC7CX,EAAaC,CAAAA,CAAQ,CACnB,KAAM,eAAA,CACN,OAAA,CAASU,EAAI,OAAA,CACb,aAAA,CAAeK,EAAO,aACxB,CAAC,EACH,CAAA,MAASS,CAAAA,CAAK,CACZ,IAAMC,EAASD,CAAAA,YAAe,KAAA,CAAQA,EAAI,OAAA,CAAU,MAAA,CAAOA,CAAG,CAAA,CAC9DzB,CAAAA,CAAaC,CAAAA,CAAQ,CACnB,KAAM,OAAA,CACN,IAAA,CAAM,cACN,OAAA,CAASyB,CACX,CAAC,EACH,CAAA,KAEA1B,CAAAA,CAAaC,CAAAA,CAAQ,CACnB,IAAA,CAAM,OAAA,CACN,KAAM,SAAA,CACN,OAAA,CAAS,8BACX,CAAC,CAAA,CAEH,KACF,CAEA,QACED,EAAaC,CAAAA,CAAQ,CACnB,KAAM,OAAA,CACN,IAAA,CAAM,kBACN,OAAA,CAAS,CAAA,sBAAA,EAAyB,MAAA,CAAQU,CAAAA,CAAyB,IAAI,CAAA,CAAE,KAAA,CAAM,EAAG,GAAG,CAAC,EACxF,CAAC,EACL,CACF,CAMA,IAAMG,CAAAA,CAAoB,IAAI,IACxBC,CAAAA,CAA0B,EAAA,CAMhC,OAAApC,CAAAA,CAAU,YAAA,CAAa,CAACsB,CAAAA,CAAQ0B,EAAWC,CAAAA,GAAY,CACrD,GAAIjC,CAAAA,CAAQ,IAAA,CAAOC,EAAmB,IAAA,EAAQH,CAAAA,CAAY,CACxD,GAAI,CACF,IAAMkB,CAAAA,CAA6B,CACjC,KAAM,OAAA,CACN,IAAA,CAAM,cACN,OAAA,CAAS,0BACX,CAAA,CACAV,CAAAA,CAAO,KAAK,IAAA,CAAK,SAAA,CAAUU,CAAG,CAAC,EACjC,MAAQ,CAER,CACAV,CAAAA,CAAO,KAAA,GAEP,MACF,CAEIT,EAEFI,CAAAA,CAAmB,GAAA,CAAIK,CAAM,CAAA,EAG7BN,CAAAA,CAAQ,GAAA,CAAIM,CAAM,EAClBD,CAAAA,CAAaC,CAAAA,CAAQ,CACnB,IAAA,CAAM,SAAA,CACN,QAAS,CAAA,CACT,SAAA,CAAAP,EACA,SAAA,CAAW,IAAA,CAAK,KAClB,CAAC,GAGHiC,CAAAA,CAAWvB,CAAAA,EAASK,EAAoBR,CAAAA,CAAQG,CAAI,CAAC,CAAA,CACrDwB,EAAQ,IAAM,CACZjC,EAAQ,MAAA,CAAOM,CAAM,EACrBL,CAAAA,CAAmB,MAAA,CAAOK,CAAM,CAAA,CAChCa,EAAkB,MAAA,CAAOb,CAAM,EACjC,CAAC,EACH,CAAC,CAAA,CAMM,CACL,IAAI,WAAA,EAAsB,CACxB,OAAON,CAAAA,CAAQ,IACjB,CAAA,CAEA,SAAA,CAAUO,EAAsC,CAC9CC,CAAAA,CAAiBD,CAAO,EAC1B,CAAA,CAEA,YAAmB,CACbrB,CAAAA,EAAiBc,EAAQ,IAAA,CAAO,CAAA,EAClCQ,EAAiB,CACf,IAAA,CAAM,QAAA,CACN,OAAA,CAAStB,EAAc,aAAA,EACzB,CAAC,EAEL,CAAA,CAEA,iBAAwB,CAClBE,CAAAA,EAAsBY,EAAQ,IAAA,CAAO,CAAA,EACvCQ,EAAiB,CAAE,IAAA,CAAM,cAAe,KAAA,CAAOpB,CAAAA,EAAqB,CAAC,EAEzE,CAAA,CAEA,oBAAA,CAAqB8C,EAAaC,CAAAA,CAAsB,CAClDnC,EAAQ,IAAA,CAAO,CAAA,EACjBQ,EAAiB,CAAE,IAAA,CAAM,oBAAqB,GAAA,CAAA0B,CAAAA,CAAK,MAAAC,CAAM,CAAC,EAE9D,CAAA,CAEA,iBAAA,CAAkBC,EAAYD,CAAAA,CAAsB,CAC9CnC,CAAAA,CAAQ,IAAA,CAAO,GACjBQ,CAAAA,CAAiB,CAAE,KAAM,gBAAA,CAAkB,EAAA,CAAA4B,EAAI,KAAA,CAAAD,CAAM,CAAC,EAE1D,EAEA,eAAA,CAAgBE,CAAAA,CAAiBC,EAAgBC,CAAAA,CAA0B,CACrEvC,EAAQ,IAAA,CAAO,CAAA,EACjBQ,CAAAA,CAAiB,CAAE,KAAM,cAAA,CAAgB,OAAA,CAAA6B,EAAS,MAAA,CAAAC,CAAAA,CAAQ,WAAAC,CAAW,CAAC,EAE1E,CAAA,CAEA,cAAA,CAAeF,EAAiBG,CAAAA,CAA2B,CACrDxC,EAAQ,IAAA,CAAO,CAAA,EACjBQ,EAAiB,CAAE,IAAA,CAAM,aAAA,CAAe,OAAA,CAAA6B,EAAS,WAAA,CAAAG,CAAY,CAAC,EAElE,CAAA,CAEA,OAAc,CACZ5B,CAAAA,EAAoB,CAEhBT,CAAAA,GACF,cAAcA,CAAU,CAAA,CACxBA,EAAa,IAAA,CAAA,CAGXC,CAAAA,GACF,cAAcA,CAAW,CAAA,CACzBA,CAAAA,CAAc,IAAA,CAAA,CAGhBO,GAAW,CAEX,IAAA,IAAWL,KAAUN,CAAAA,CACnB,GAAI,CACFM,CAAAA,CAAO,KAAA,GACT,CAAA,KAAQ,CAER,CAEF,IAAA,IAAWA,CAAAA,IAAUL,EACnB,GAAI,CACFK,EAAO,KAAA,GACT,CAAA,KAAQ,CAER,CAEFN,CAAAA,CAAQ,KAAA,GACRC,CAAAA,CAAmB,KAAA,GACnBkB,CAAAA,CAAkB,KAAA,EAAM,CAExBnC,CAAAA,CAAU,QACZ,CACF,CACF,CAiFA,eAAsByD,EACpBC,CAAAA,CACAC,CAAAA,CAAkC,EAAC,CACV,CACzB,GAAI,CAACD,EAAa,QAAA,CAChB,MAAM,IAAI,KAAA,CACR,yEACF,EAGF,IAAM1D,CAAAA,CAAY,MAAM4D,CAAAA,CAAkB,CACxC,KAAMD,CAAAA,CAAQ,IAAA,EAAQ,KACtB,IAAA,CAAMA,CAAAA,CAAQ,IAAA,EAAQ,WACxB,CAAC,CAAA,CAED,OAAO7D,EAAqB,CAC1B,SAAA,CAAAE,EACA,QAAA,CAAU0D,CAAAA,CAAa,SACvB,aAAA,CAAeA,CAAAA,CAAa,cAC5B,oBAAA,CAAsBC,CAAAA,CAAQ,sBAAwB,GAAA,CACtD,SAAA,CAAWA,EAAQ,SAAA,CACnB,YAAA,CAAcA,CAAAA,CAAQ,YAAA,CACtB,YAAaD,CAAAA,CAAa,iBAAA,CACtB,IAAM,CACJ,IAAMG,EAASH,CAAAA,CAAa,iBAAA,GAE5B,OAAO,CACL,UAAW,IAAA,CAAK,GAAA,GAChB,MAAA,CAAAG,CAAAA,CACA,WAAYH,CAAAA,CAAa,QAAA,CAAU,SAAA,EAAU,CAAE,MACjD,CACF,CAAA,CACA,OACJ,kBAAA,CAAoBA,CAAAA,CAAa,sBAC7B,KAAO,CACL,OAAA,CAASA,CAAAA,CAAa,uBAAuB,CAC7C,QAAA,CAAU,EAAC,CACX,SAAA,CAAW,EACb,CAAA,CAAA,CACA,MAAA,CACJ,kBAAA,CAAoBA,EAAa,gBAAA,CACjC,kBAAA,CAAoBA,EAAa,gBAAA,CACjC,kBAAA,CAAoBA,EAAa,kBAAA,CACjC,eAAA,CAAiBA,EAAa,eAAA,CAC9B,kBAAA,CAAoBA,EAAa,QAAA,EAAU,QAAA,CACtCI,IACCJ,CAAAA,CAAa,QAAA,CAAU,SAAUI,CAAO,CAAA,CAGjC,CAAE,aAAA,CAFaJ,EAAa,QAAA,CAAU,SAAA,GAAY,MAElC,CAAA,CAAA,CAEzB,MACN,CAAC,CACH,CAgCA,eAAsBE,EACpB7D,CAAAA,CAA4B,GACA,CAC5B,IAAMgE,EAAOhE,CAAAA,CAAO,IAAA,EAAQ,IAAA,CACtBiE,CAAAA,CAAOjE,EAAO,IAAA,EAAQ,WAAA,CAGtB,CAAE,eAAA,CAAAkE,CAAgB,EAAI,MAAM,OAAO,IAAI,CAAA,CAEvCC,CAAAA,CAAM,IAAID,CAAAA,CAAgB,CAC9B,KAAAF,CAAAA,CACA,IAAA,CAAAC,EACK,UAAA,CAAYjE,CAAAA,CAAO,eAAA,EAAmB,OAC7C,CAAC,CAAA,CAEGoE,CAAAA,CAMO,KAEX,OAAAD,CAAAA,CAAI,GAAG,YAAA,CAAeE,CAAAA,EAAY,CAChC,IAAIC,EAAkD,IAAA,CAClDC,CAAAA,CAAoC,KAElChD,CAAAA,CAAyB,CAC7B,KAAKG,CAAAA,CAAc,CACb2C,CAAAA,CAAG,UAAA,GAAeA,EAAG,IAAA,EACvBA,CAAAA,CAAG,KAAK3C,CAAI,EAEhB,EACA,KAAA,EAAQ,CACN2C,EAAG,KAAA,GACL,CACF,CAAA,CAEAA,CAAAA,CAAG,GAAG,SAAA,CAAYrC,CAAAA,EAAa,CACzBsC,CAAAA,EACFA,CAAAA,CAAetC,CAAAA,CAAI,QAAA,EAAU,EAEjC,CAAC,EAEDqC,CAAAA,CAAG,EAAA,CAAG,QAAS,IAAM,CACfE,GACFA,CAAAA,GAEJ,CAAC,CAAA,CAEDH,CAAAA,GACE7C,EACCiD,CAAAA,EAAY,CACXF,EAAiBE,EACnB,CAAA,CACCA,CAAAA,EAAY,CACXD,EAAeC,EACjB,CACF,EACF,CAAC,CAAA,CAEM,CACL,YAAA,CAAaA,CAAAA,CAAS,CACpBJ,CAAAA,CAAoBI,EACtB,EACA,KAAA,EAAQ,CACNL,EAAI,KAAA,GACN,CACF,CACF","file":"chunk-7JTR4QBA.cjs","sourcesContent":["/**\n * DevTools Server — WebSocket-based bridge between orchestrators and DevTools UI.\n *\n * Streams debug timeline events, health metrics, breakpoint state, and system\n * snapshots in real-time to connected DevTools clients. Accepts commands from\n * clients to resume/cancel breakpoints and request snapshots.\n *\n * Transport-agnostic: works with any WebSocket implementation (ws, Bun, Deno)\n * via the {@link DevToolsTransport} interface.\n *\n * @module\n */\n\nimport type { DebugTimeline } from \"./debug-timeline.js\";\nimport type { AgentHealthMetrics, HealthMonitor } from \"./health-monitor.js\";\nimport type { BreakpointState, DebugEvent } from \"./types.js\";\n\n// ============================================================================\n// Transport Interface (WebSocket abstraction)\n// ============================================================================\n\n/** A connected DevTools client */\nexport interface DevToolsClient {\n /** Send a JSON-serializable message to this client */\n send(data: string): void;\n /** Close the connection */\n close(): void;\n}\n\n/**\n * Transport layer for the DevTools server.\n *\n * Implement this interface to bridge any WebSocket library (ws, Bun.serve, Deno.serve).\n *\n * @example Node.js with `ws`:\n * ```typescript\n * import { WebSocketServer } from \"ws\";\n *\n * function createWsTransport(port: number): DevToolsTransport {\n * const wss = new WebSocketServer({ port });\n * let onConnect: ((client: DevToolsClient) => void) | null = null;\n *\n * wss.on(\"connection\", (ws) => {\n * const client: DevToolsClient = {\n * send: (data) => { if (ws.readyState === ws.OPEN) ws.send(data); },\n * close: () => ws.close(),\n * };\n * ws.on(\"message\", (raw) => {\n * if (client._onMessage) client._onMessage(raw.toString());\n * });\n * ws.on(\"close\", () => {\n * if (client._onClose) client._onClose();\n * });\n * onConnect?.(client);\n * });\n *\n * return {\n * onConnection(handler) { onConnect = handler; },\n * close() { wss.close(); },\n * };\n * }\n * ```\n */\nexport interface DevToolsTransport {\n /** Register a handler for new client connections */\n onConnection(\n handler: (\n client: DevToolsClient,\n onMessage: (handler: (data: string) => void) => void,\n onClose: (handler: () => void) => void,\n ) => void,\n ): void;\n /** Shut down the transport */\n close(): void;\n}\n\n// ============================================================================\n// Protocol Messages\n// ============================================================================\n\n/** Messages sent FROM the server TO clients */\nexport type DevToolsServerMessage =\n | { type: \"welcome\"; version: number; sessionId: string; timestamp: number }\n | { type: \"event\"; event: DebugEvent }\n | { type: \"event_batch\"; events: DebugEvent[] }\n | { type: \"snapshot\"; data: DevToolsSnapshot }\n | { type: \"health\"; metrics: Record<string, AgentHealthMetrics> }\n | { type: \"breakpoints\"; state: BreakpointState }\n | { type: \"pong\"; timestamp: number }\n // Scratchpad & derived state\n | { type: \"scratchpad_state\"; data: Record<string, unknown> }\n | { type: \"scratchpad_update\"; key: string; value: unknown }\n | { type: \"derived_state\"; data: Record<string, unknown> }\n | { type: \"derived_update\"; id: string; value: unknown }\n // Fork\n | { type: \"fork_complete\"; eventId: number; newEventCount: number }\n // Token streaming\n | {\n type: \"token_stream\";\n agentId: string;\n tokens: string;\n tokenCount: number;\n }\n | { type: \"stream_done\"; agentId: string; totalTokens: number }\n | { type: \"error\"; code: string; message: string };\n\n/** Messages sent FROM clients TO the server */\nexport type DevToolsClientMessage =\n | { type: \"authenticate\"; token: string }\n | { type: \"request_snapshot\" }\n | { type: \"request_health\" }\n | { type: \"request_events\"; since?: number }\n | { type: \"request_breakpoints\" }\n | {\n type: \"resume_breakpoint\";\n breakpointId: string;\n modifications?: { input?: string; skip?: boolean };\n }\n | { type: \"cancel_breakpoint\"; breakpointId: string; reason?: string }\n | { type: \"export_session\" }\n | { type: \"import_session\"; data: string }\n // Scratchpad & derived requests\n | { type: \"request_scratchpad\" }\n | { type: \"request_derived\" }\n // Fork\n | { type: \"fork_from_snapshot\"; eventId: number }\n | { type: \"ping\" };\n\n/** System snapshot sent to clients on demand */\nexport interface DevToolsSnapshot {\n timestamp: number;\n agents: Record<\n string,\n {\n status: string;\n lastInput?: string;\n lastOutput?: unknown;\n totalTokens: number;\n runCount: number;\n }\n >;\n coordinator?: { globalTokens: number; status: string };\n derived?: Record<string, unknown>;\n eventCount: number;\n}\n\n// ============================================================================\n// Server Configuration\n// ============================================================================\n\n/** Configuration for the DevTools server */\nexport interface DevToolsServerConfig {\n /** Transport to use for WebSocket connections */\n transport: DevToolsTransport;\n /** Debug timeline to subscribe to */\n timeline: DebugTimeline;\n /** Health monitor for metrics (optional) */\n healthMonitor?: HealthMonitor | null;\n /** Callback to get current agent states for snapshots */\n getSnapshot?: () => DevToolsSnapshot;\n /** Callback to get current breakpoint state */\n getBreakpointState?: () => BreakpointState;\n /** Callback to resume a breakpoint */\n onResumeBreakpoint?: (\n id: string,\n modifications?: { input?: string; skip?: boolean },\n ) => void;\n /** Callback to cancel a breakpoint */\n onCancelBreakpoint?: (id: string, reason?: string) => void;\n /** Callback to get current scratchpad state */\n getScratchpadState?: () => Record<string, unknown>;\n /** Callback to get current derived state */\n getDerivedState?: () => Record<string, unknown>;\n /** Callback to fork from a snapshot event */\n onForkFromSnapshot?: (eventId: number) => { newEventCount: number };\n /** Maximum events to batch before flushing. Default: 1 (no batching) */\n batchSize?: number;\n /** Flush interval for batched events (ms). Default: 50 */\n batchIntervalMs?: number;\n /** Health metrics push interval (ms). 0 = no auto-push. Default: 0 */\n healthPushIntervalMs?: number;\n /** Maximum connected clients. Default: 50 */\n maxClients?: number;\n /** Token authentication callback. When set, new connections must send an `authenticate` message before receiving data. */\n authenticate?: (token: string) => boolean | Promise<boolean>;\n}\n\n// ============================================================================\n// Server Instance\n// ============================================================================\n\n/** DevTools server instance */\nexport interface DevToolsServer {\n /** Number of connected clients */\n readonly clientCount: number;\n /** Broadcast a message to all connected clients */\n broadcast(message: DevToolsServerMessage): void;\n /** Push current health metrics to all clients */\n pushHealth(): void;\n /** Push current breakpoint state to all clients */\n pushBreakpoints(): void;\n /** Push a scratchpad key update to all clients */\n pushScratchpadUpdate(key: string, value: unknown): void;\n /** Push a derived value update to all clients */\n pushDerivedUpdate(id: string, value: unknown): void;\n /** Push streaming tokens to all clients */\n pushTokenStream(agentId: string, tokens: string, tokenCount: number): void;\n /** Signal stream completion to all clients */\n pushStreamDone(agentId: string, totalTokens: number): void;\n /** Shut down the server and disconnect all clients */\n close(): void;\n}\n\nconst PROTOCOL_VERSION = 1;\n\n/**\n * Create a DevTools server that bridges orchestrator state to DevTools UI clients.\n *\n * @example\n * ```typescript\n * const server = createDevToolsServer({\n * transport: createWsTransport(4040),\n * timeline: orchestrator.timeline!,\n * healthMonitor: orchestrator.healthMonitor,\n * getSnapshot: () => buildSnapshot(orchestrator),\n * getBreakpointState: () => orchestrator.getBreakpointState(),\n * onResumeBreakpoint: (id, mods) => orchestrator.resumeBreakpoint(id, mods),\n * onCancelBreakpoint: (id, reason) => orchestrator.cancelBreakpoint(id, reason),\n * });\n * ```\n */\nexport function createDevToolsServer(\n config: DevToolsServerConfig,\n): DevToolsServer {\n const {\n transport,\n timeline,\n healthMonitor,\n getSnapshot,\n getBreakpointState,\n onResumeBreakpoint,\n onCancelBreakpoint,\n getScratchpadState,\n getDerivedState,\n onForkFromSnapshot,\n batchSize = 1,\n batchIntervalMs = 50,\n healthPushIntervalMs = 0,\n authenticate,\n } = config;\n const maxClients = config.maxClients ?? 50;\n\n const sessionId = `devtools_${crypto.randomUUID()}`;\n const clients = new Set<DevToolsClient>();\n const pendingAuthClients = new Set<DevToolsClient>();\n let batchBuffer: DebugEvent[] = [];\n let batchTimer: ReturnType<typeof setInterval> | null = null;\n let healthTimer: ReturnType<typeof setInterval> | null = null;\n\n // ------------------------------------------------------------------\n // Helpers\n // ------------------------------------------------------------------\n\n function sendToClient(\n client: DevToolsClient,\n message: DevToolsServerMessage,\n ): void {\n try {\n client.send(JSON.stringify(message));\n } catch {\n // Client may have disconnected — remove silently\n clients.delete(client);\n }\n }\n\n function broadcastMessage(message: DevToolsServerMessage): void {\n const data = JSON.stringify(message);\n const snapshot = [...clients];\n for (const client of snapshot) {\n try {\n client.send(data);\n } catch {\n clients.delete(client);\n }\n }\n }\n\n function flushBatch(): void {\n if (batchBuffer.length === 0) {\n return;\n }\n\n if (batchBuffer.length === 1) {\n broadcastMessage({ type: \"event\", event: batchBuffer[0]! });\n } else {\n broadcastMessage({ type: \"event_batch\", events: batchBuffer });\n }\n\n batchBuffer = [];\n }\n\n // ------------------------------------------------------------------\n // Timeline subscription\n // ------------------------------------------------------------------\n\n const unsubscribeTimeline: () => void = timeline.subscribe(\n (event: DebugEvent) => {\n if (clients.size === 0) {\n return;\n }\n\n if (batchSize <= 1) {\n broadcastMessage({ type: \"event\", event });\n\n return;\n }\n\n batchBuffer.push(event);\n if (batchBuffer.length >= batchSize) {\n flushBatch();\n }\n },\n );\n\n // Start batch flush timer if batching enabled\n if (batchSize > 1 && batchIntervalMs > 0) {\n batchTimer = setInterval(flushBatch, batchIntervalMs);\n }\n\n // Start health push timer if configured\n if (healthPushIntervalMs > 0 && healthMonitor) {\n healthTimer = setInterval(() => {\n if (clients.size > 0) {\n broadcastMessage({\n type: \"health\",\n metrics: healthMonitor.getAllMetrics(),\n });\n }\n }, healthPushIntervalMs);\n }\n\n // ------------------------------------------------------------------\n // Client message handler\n // ------------------------------------------------------------------\n\n function handleClientMessage(client: DevToolsClient, raw: string): void {\n let msg: DevToolsClientMessage;\n try {\n msg = JSON.parse(raw) as DevToolsClientMessage;\n } catch {\n sendToClient(client, {\n type: \"error\",\n code: \"INVALID_JSON\",\n message: \"Could not parse message\",\n });\n\n return;\n }\n\n if (!msg || typeof msg !== \"object\" || typeof msg.type !== \"string\") {\n sendToClient(client, {\n type: \"error\",\n code: \"INVALID_MESSAGE\",\n message: \"Missing type field\",\n });\n\n return;\n }\n\n const now = Date.now();\n const last = clientLastMessage.get(client) ?? 0;\n if (now - last < MIN_MESSAGE_INTERVAL_MS) {\n sendToClient(client, {\n type: \"error\",\n code: \"RATE_LIMITED\",\n message: \"Too many requests\",\n });\n\n return;\n }\n clientLastMessage.set(client, now);\n\n // Handle authenticate message\n if (msg.type === \"authenticate\") {\n if (!authenticate) {\n // No auth configured — treat as unknown command\n sendToClient(client, {\n type: \"error\",\n code: \"UNKNOWN_COMMAND\",\n message: \"Authentication not configured on this server\",\n });\n\n return;\n }\n\n if (!pendingAuthClients.has(client)) {\n // Already authenticated\n sendToClient(client, {\n type: \"error\",\n code: \"ALREADY_AUTHENTICATED\",\n message: \"Already authenticated\",\n });\n\n return;\n }\n\n if (typeof msg.token !== \"string\") {\n sendToClient(client, {\n type: \"error\",\n code: \"AUTH_FAILED\",\n message: \"Missing token\",\n });\n client.close();\n pendingAuthClients.delete(client);\n\n return;\n }\n\n const result = authenticate(msg.token);\n const handleResult = (valid: boolean) => {\n if (valid) {\n pendingAuthClients.delete(client);\n clients.add(client);\n sendToClient(client, {\n type: \"welcome\",\n version: PROTOCOL_VERSION,\n sessionId,\n timestamp: Date.now(),\n });\n } else {\n sendToClient(client, {\n type: \"error\",\n code: \"AUTH_FAILED\",\n message: \"Invalid token\",\n });\n pendingAuthClients.delete(client);\n client.close();\n }\n };\n\n if (result instanceof Promise) {\n result.then(handleResult).catch(() => {\n sendToClient(client, {\n type: \"error\",\n code: \"AUTH_FAILED\",\n message: \"Authentication error\",\n });\n pendingAuthClients.delete(client);\n client.close();\n });\n } else {\n handleResult(result);\n }\n\n return;\n }\n\n // Reject commands from clients pending authentication\n if (pendingAuthClients.has(client)) {\n sendToClient(client, {\n type: \"error\",\n code: \"AUTH_REQUIRED\",\n message: \"Authentication required\",\n });\n\n return;\n }\n\n switch (msg.type) {\n case \"ping\":\n sendToClient(client, { type: \"pong\", timestamp: Date.now() });\n break;\n\n case \"request_snapshot\":\n if (getSnapshot) {\n sendToClient(client, { type: \"snapshot\", data: getSnapshot() });\n } else {\n sendToClient(client, {\n type: \"error\",\n code: \"NO_SNAPSHOT\",\n message: \"Snapshot provider not configured\",\n });\n }\n break;\n\n case \"request_health\":\n if (healthMonitor) {\n sendToClient(client, {\n type: \"health\",\n metrics: healthMonitor.getAllMetrics(),\n });\n } else {\n sendToClient(client, {\n type: \"error\",\n code: \"NO_HEALTH\",\n message: \"Health monitor not configured\",\n });\n }\n break;\n\n case \"request_events\": {\n const events = timeline.getEvents();\n const since = msg.since;\n const filtered =\n since != null ? events.filter((e) => e.id > since) : events;\n sendToClient(client, { type: \"event_batch\", events: filtered });\n break;\n }\n\n case \"request_breakpoints\":\n if (getBreakpointState) {\n sendToClient(client, {\n type: \"breakpoints\",\n state: getBreakpointState(),\n });\n } else {\n sendToClient(client, {\n type: \"error\",\n code: \"NO_BREAKPOINTS\",\n message: \"Breakpoint provider not configured\",\n });\n }\n break;\n\n case \"resume_breakpoint\":\n if (onResumeBreakpoint && typeof msg.breakpointId === \"string\") {\n // Sanitize: only extract known fields to prevent prototype pollution\n const mods = msg.modifications\n ? { input: msg.modifications.input, skip: msg.modifications.skip }\n : undefined;\n onResumeBreakpoint(msg.breakpointId, mods);\n } else {\n sendToClient(client, {\n type: \"error\",\n code: \"NO_BREAKPOINTS\",\n message: \"Breakpoint resume not configured\",\n });\n }\n break;\n\n case \"cancel_breakpoint\":\n if (onCancelBreakpoint && typeof msg.breakpointId === \"string\") {\n const safeReason =\n typeof msg.reason === \"string\" ? msg.reason : undefined;\n onCancelBreakpoint(msg.breakpointId, safeReason);\n } else {\n sendToClient(client, {\n type: \"error\",\n code: \"NO_BREAKPOINTS\",\n message: \"Breakpoint cancel not configured\",\n });\n }\n break;\n\n case \"export_session\":\n sendToClient(client, {\n type: \"event_batch\",\n events: timeline.getEvents(),\n });\n break;\n\n case \"import_session\": {\n const MAX_IMPORT_SIZE = 10 * 1024 * 1024; // ~10M characters (string .length check, not byte size)\n if (typeof msg.data !== \"string\") {\n sendToClient(client, {\n type: \"error\",\n code: \"INVALID_DATA\",\n message: \"Missing data field for import\",\n });\n } else if (msg.data.length > MAX_IMPORT_SIZE) {\n sendToClient(client, {\n type: \"error\",\n code: \"IMPORT_TOO_LARGE\",\n message: `Import data exceeds ${MAX_IMPORT_SIZE / 1024 / 1024} MB limit`,\n });\n } else {\n try {\n timeline.import(msg.data);\n sendToClient(client, {\n type: \"event_batch\",\n events: timeline.getEvents(),\n });\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n sendToClient(client, {\n type: \"error\",\n code: \"IMPORT_FAILED\",\n message: errMsg,\n });\n }\n }\n break;\n }\n\n case \"request_scratchpad\":\n if (getScratchpadState) {\n sendToClient(client, {\n type: \"scratchpad_state\",\n data: getScratchpadState(),\n });\n } else {\n sendToClient(client, {\n type: \"error\",\n code: \"NO_SCRATCHPAD\",\n message: \"Scratchpad provider not configured\",\n });\n }\n break;\n\n case \"request_derived\":\n if (getDerivedState) {\n sendToClient(client, {\n type: \"derived_state\",\n data: getDerivedState(),\n });\n } else {\n sendToClient(client, {\n type: \"error\",\n code: \"NO_DERIVED\",\n message: \"Derived state provider not configured\",\n });\n }\n break;\n\n case \"fork_from_snapshot\": {\n if (onForkFromSnapshot && typeof msg.eventId === \"number\") {\n try {\n const result = onForkFromSnapshot(msg.eventId);\n sendToClient(client, {\n type: \"fork_complete\",\n eventId: msg.eventId,\n newEventCount: result.newEventCount,\n });\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n sendToClient(client, {\n type: \"error\",\n code: \"FORK_FAILED\",\n message: errMsg,\n });\n }\n } else {\n sendToClient(client, {\n type: \"error\",\n code: \"NO_FORK\",\n message: \"Fork provider not configured\",\n });\n }\n break;\n }\n\n default:\n sendToClient(client, {\n type: \"error\",\n code: \"UNKNOWN_COMMAND\",\n message: `Unknown message type: ${String((msg as { type: string }).type).slice(0, 100)}`,\n });\n }\n }\n\n // ------------------------------------------------------------------\n // Rate limiting\n // ------------------------------------------------------------------\n\n const clientLastMessage = new Map<DevToolsClient, number>();\n const MIN_MESSAGE_INTERVAL_MS = 50;\n\n // ------------------------------------------------------------------\n // Connection handler\n // ------------------------------------------------------------------\n\n transport.onConnection((client, onMessage, onClose) => {\n if (clients.size + pendingAuthClients.size >= maxClients) {\n try {\n const msg: DevToolsServerMessage = {\n type: \"error\",\n code: \"MAX_CLIENTS\",\n message: \"Connection limit reached\",\n };\n client.send(JSON.stringify(msg));\n } catch {\n /* ignore */\n }\n client.close();\n\n return;\n }\n\n if (authenticate) {\n // Hold in pending state until client sends authenticate message\n pendingAuthClients.add(client);\n } else {\n // No auth — add directly and send welcome\n clients.add(client);\n sendToClient(client, {\n type: \"welcome\",\n version: PROTOCOL_VERSION,\n sessionId,\n timestamp: Date.now(),\n });\n }\n\n onMessage((data) => handleClientMessage(client, data));\n onClose(() => {\n clients.delete(client);\n pendingAuthClients.delete(client);\n clientLastMessage.delete(client);\n });\n });\n\n // ------------------------------------------------------------------\n // Public interface\n // ------------------------------------------------------------------\n\n return {\n get clientCount(): number {\n return clients.size;\n },\n\n broadcast(message: DevToolsServerMessage): void {\n broadcastMessage(message);\n },\n\n pushHealth(): void {\n if (healthMonitor && clients.size > 0) {\n broadcastMessage({\n type: \"health\",\n metrics: healthMonitor.getAllMetrics(),\n });\n }\n },\n\n pushBreakpoints(): void {\n if (getBreakpointState && clients.size > 0) {\n broadcastMessage({ type: \"breakpoints\", state: getBreakpointState() });\n }\n },\n\n pushScratchpadUpdate(key: string, value: unknown): void {\n if (clients.size > 0) {\n broadcastMessage({ type: \"scratchpad_update\", key, value });\n }\n },\n\n pushDerivedUpdate(id: string, value: unknown): void {\n if (clients.size > 0) {\n broadcastMessage({ type: \"derived_update\", id, value });\n }\n },\n\n pushTokenStream(agentId: string, tokens: string, tokenCount: number): void {\n if (clients.size > 0) {\n broadcastMessage({ type: \"token_stream\", agentId, tokens, tokenCount });\n }\n },\n\n pushStreamDone(agentId: string, totalTokens: number): void {\n if (clients.size > 0) {\n broadcastMessage({ type: \"stream_done\", agentId, totalTokens });\n }\n },\n\n close(): void {\n unsubscribeTimeline();\n\n if (batchTimer) {\n clearInterval(batchTimer);\n batchTimer = null;\n }\n\n if (healthTimer) {\n clearInterval(healthTimer);\n healthTimer = null;\n }\n\n flushBatch();\n\n for (const client of clients) {\n try {\n client.close();\n } catch {\n // Ignore close errors\n }\n }\n for (const client of pendingAuthClients) {\n try {\n client.close();\n } catch {\n // Ignore close errors\n }\n }\n clients.clear();\n pendingAuthClients.clear();\n clientLastMessage.clear();\n\n transport.close();\n },\n };\n}\n\n// ============================================================================\n// Orchestrator Connector\n// ============================================================================\n\n/** Options for connecting DevTools to an orchestrator */\nexport interface ConnectDevToolsOptions {\n /** Port for the WebSocket server. Default: 4040 */\n port?: number;\n /** Host to bind to. Default: \"localhost\" */\n host?: string;\n /** Health metrics push interval (ms). Default: 5000 */\n healthPushIntervalMs?: number;\n /** Event batching size. Default: 1 (no batching) */\n batchSize?: number;\n /** Token authentication callback. When set, clients must authenticate before receiving data. */\n authenticate?: (token: string) => boolean | Promise<boolean>;\n}\n\n/** Minimal orchestrator interface for DevTools connection */\nexport interface DevToolsCompatibleOrchestrator {\n timeline: {\n subscribe: (listener: (event: DebugEvent) => void) => () => void;\n getEvents: () => DebugEvent[];\n import: (json: string) => void;\n export: () => string;\n forkFrom?: (eventId: number) => void;\n } | null;\n healthMonitor?: {\n getAllMetrics: () => Record<string, AgentHealthMetrics>;\n } | null;\n getPendingBreakpoints?: () => Array<{\n id: string;\n type: string;\n agentId: string;\n input: string;\n label?: string;\n requestedAt: number;\n }>;\n resumeBreakpoint?: (\n id: string,\n modifications?: { input?: string; skip?: boolean },\n ) => void;\n cancelBreakpoint?: (id: string, reason?: string) => void;\n getAllAgentStates?: () => Record<\n string,\n {\n status: string;\n lastInput?: string;\n lastOutput?: unknown;\n totalTokens: number;\n runCount: number;\n }\n >;\n /** Get current scratchpad state (multi-agent only) */\n getScratchpadState?: () => Record<string, unknown>;\n /** Get current derived values (multi-agent only) */\n getDerivedState?: () => Record<string, unknown>;\n}\n\n/**\n * Connect DevTools to an orchestrator instance.\n *\n * Convenience function that creates a WebSocket transport and DevTools server,\n * automatically wiring up the orchestrator's timeline, health monitor, and breakpoint system.\n *\n * Requires the `ws` package: `npm install ws`\n *\n * **Security:** Binding to `0.0.0.0` exposes the server to all network interfaces.\n * Only do this behind a firewall or with proper authentication.\n *\n * @example\n * ```typescript\n * const orchestrator = createMultiAgentOrchestrator({ debug: true, ... });\n * const devtools = await connectDevTools(orchestrator, { port: 4040 });\n *\n * // Later, clean up:\n * devtools.close();\n * ```\n */\nexport async function connectDevTools(\n orchestrator: DevToolsCompatibleOrchestrator,\n options: ConnectDevToolsOptions = {},\n): Promise<DevToolsServer> {\n if (!orchestrator.timeline) {\n throw new Error(\n \"[Directive DevTools] Orchestrator must have debug: true to use DevTools\",\n );\n }\n\n const transport = await createWsTransport({\n port: options.port ?? 4040,\n host: options.host ?? \"localhost\",\n });\n\n return createDevToolsServer({\n transport,\n timeline: orchestrator.timeline as unknown as DebugTimeline,\n healthMonitor: orchestrator.healthMonitor as HealthMonitor | undefined,\n healthPushIntervalMs: options.healthPushIntervalMs ?? 5000,\n batchSize: options.batchSize,\n authenticate: options.authenticate,\n getSnapshot: orchestrator.getAllAgentStates\n ? () => {\n const agents = orchestrator.getAllAgentStates!();\n\n return {\n timestamp: Date.now(),\n agents,\n eventCount: orchestrator.timeline!.getEvents().length,\n };\n }\n : undefined,\n getBreakpointState: orchestrator.getPendingBreakpoints\n ? () => ({\n pending: orchestrator.getPendingBreakpoints!(),\n resolved: [],\n cancelled: [],\n })\n : undefined,\n onResumeBreakpoint: orchestrator.resumeBreakpoint,\n onCancelBreakpoint: orchestrator.cancelBreakpoint,\n getScratchpadState: orchestrator.getScratchpadState,\n getDerivedState: orchestrator.getDerivedState,\n onForkFromSnapshot: orchestrator.timeline?.forkFrom\n ? (eventId: number) => {\n orchestrator.timeline!.forkFrom!(eventId);\n const newEventCount = orchestrator.timeline!.getEvents().length;\n\n return { newEventCount };\n }\n : undefined,\n });\n}\n\n// ============================================================================\n// Node.js ws Transport Helper\n// ============================================================================\n\n/**\n * Configuration for the built-in Node.js `ws` transport.\n *\n * Requires the `ws` package to be installed: `npm install ws`\n */\nexport interface WsTransportConfig {\n /** Port to listen on. Default: 4040 */\n port?: number;\n /** Host to bind to. Default: \"localhost\" */\n host?: string;\n /** Maximum incoming message size in bytes. Default: 1048576 (1MB) */\n maxPayloadBytes?: number;\n}\n\n/**\n * Create a DevTools transport using the Node.js `ws` WebSocket library.\n *\n * This is a convenience helper — you can implement {@link DevToolsTransport}\n * with any WebSocket library.\n *\n * @example\n * ```typescript\n * const transport = await createWsTransport({ port: 4040 });\n * const server = createDevToolsServer({ transport, timeline });\n * ```\n */\nexport async function createWsTransport(\n config: WsTransportConfig = {},\n): Promise<DevToolsTransport> {\n const port = config.port ?? 4040;\n const host = config.host ?? \"localhost\";\n\n // Dynamic import so ws is not a hard dependency\n const { WebSocketServer } = await import(\"ws\");\n // maxPayload is supported at runtime but missing from @types/ws ServerOptions\n const wss = new WebSocketServer({\n port,\n host,\n ...{ maxPayload: config.maxPayloadBytes ?? 1_048_576 },\n });\n\n let connectionHandler:\n | ((\n client: DevToolsClient,\n onMessage: (handler: (data: string) => void) => void,\n onClose: (handler: () => void) => void,\n ) => void)\n | null = null;\n\n wss.on(\"connection\", (ws: any) => {\n let messageHandler: ((data: string) => void) | null = null;\n let closeHandler: (() => void) | null = null;\n\n const client: DevToolsClient = {\n send(data: string) {\n if (ws.readyState === ws.OPEN) {\n ws.send(data);\n }\n },\n close() {\n ws.close();\n },\n };\n\n ws.on(\"message\", (raw: any) => {\n if (messageHandler) {\n messageHandler(raw.toString());\n }\n });\n\n ws.on(\"close\", () => {\n if (closeHandler) {\n closeHandler();\n }\n });\n\n connectionHandler?.(\n client,\n (handler) => {\n messageHandler = handler;\n },\n (handler) => {\n closeHandler = handler;\n },\n );\n });\n\n return {\n onConnection(handler) {\n connectionHandler = handler;\n },\n close() {\n wss.close();\n },\n };\n}\n"]}
@@ -23,7 +23,7 @@ ${r.join(`
23
23
  Feedback on your previous response:
24
24
  ${r}
25
25
 
26
- Please improve your response.`}function Br(s,r){let i=r.maxIterations??2,d=r.buildRetryInput??Rr,f=r.onExhausted??"accept-last";if(i<1)throw new Error("[Directive Reflection] maxIterations must be >= 1");return typeof process<"u"&&process.env?.NODE_ENV!=="production"&&i>3&&console.warn("[Directive Reflection] maxIterations > 3 rarely improves quality. Consider using maxIterations <= 3 to avoid unbounded token burn."),async(g,c,R)=>{let O=[],y=c,_=0,I=null;for(let L=0;L<i;L++){let he=Date.now(),ce=await s(g,y,R);I=ce,_+=ce.totalTokens;let Se={input:c,iteration:L,result:ce,history:[...O]},ke=await r.evaluate(ce.output,Se);O.push(ke);let Le=Date.now()-he;try{r.onIteration?.({iteration:L,passed:ke.passed,feedback:ke.feedback,score:ke.score,durationMs:Le});}catch{}if(ke.passed)return {...ce,totalTokens:_};if(r.budgetThreshold!==void 0&&_>=r.budgetThreshold)break;L<i-1&&ke.feedback&&(y=d(c,ke.feedback,L));}if(f==="throw")throw new xt({iterations:i,history:O,lastResult:I,totalTokens:_});return {...I,totalTokens:_}}}var At=200,Tr=0;function Gn(){return `bp_${Date.now().toString(36)}_${(++Tr).toString(36)}`}function Ln(s,r,i){for(let d of s)if(d.type===r){if(!d.when)return d;try{if(d.when(i))return d}catch{}}return null}function Ct(){return {pending:[],resolved:[],cancelled:[]}}var Bn=new Set(["__proto__","constructor","prototype","toString","valueOf","hasOwnProperty"]);function Ke(){let s=Date.now().toString(36),r=crypto.randomUUID().slice(0,8);return `ckpt_${s}_${r}`}function fn(s){if(!s||typeof s!="object")return false;for(let d of Object.keys(s))if(Bn.has(d))return false;let r=s;if(r.version!==1||typeof r.id!="string"||r.id.length===0||typeof r.createdAt!="string"||typeof r.systemExport!="string"||r.timelineExport!==null&&typeof r.timelineExport!="string"||!r.localState||typeof r.localState!="object")return false;for(let d of Object.keys(r.localState))if(Bn.has(d))return false;let i=r.localState;return !(i.type!=="single"&&i.type!=="multi"||r.orchestratorType!=="single"&&r.orchestratorType!=="multi")}var Fn=class{store=new Map;order=[];maxCheckpoints;retentionMs;preserveLabeled;constructor(r){if(this.maxCheckpoints=r?.maxCheckpoints??100,this.retentionMs=r?.retentionMs??Number.POSITIVE_INFINITY,this.preserveLabeled=r?.preserveLabeled??false,!Number.isFinite(this.maxCheckpoints)||this.maxCheckpoints<1)throw new Error(`[Directive Checkpoint] maxCheckpoints must be >= 1, got ${this.maxCheckpoints}`)}async save(r){if(!fn(r))throw new Error("[Directive Checkpoint] Invalid checkpoint data");for(;this.order.length>=this.maxCheckpoints&&this.evictOldest(););let i=this.order.indexOf(r.id);return i>=0&&this.order.splice(i,1),this.store.set(r.id,r),this.order.push(r.id),r.id}async load(r){return this.store.get(r)??null}async list(){return this.order.map(r=>{let i=this.store.get(r);return {id:i.id,label:i.label,createdAt:i.createdAt}})}async delete(r){if(!this.store.has(r))return false;this.store.delete(r);let i=this.order.indexOf(r);return i>=0&&this.order.splice(i,1),true}async clear(){this.store.clear(),this.order.length=0;}async prune(){if(!Number.isFinite(this.retentionMs))return 0;let r=Date.now()-this.retentionMs,i=0,d=[];for(let f of this.order){let g=this.store.get(f);if(!g)continue;if(new Date(g.createdAt).getTime()>=r)break;this.preserveLabeled&&g.label||d.push(f);}for(let f of d){this.store.delete(f);let g=this.order.indexOf(f);g>=0&&this.order.splice(g,1),i++;}return i}evictOldest(){if(this.preserveLabeled)for(let i=0;i<this.order.length;i++){let d=this.order[i],f=this.store.get(d);if(f&&!f.label)return this.order.splice(i,1),this.store.delete(d),true}let r=this.order.shift();return r?(this.store.delete(r),true):false}};var gn=class{buffer=[];maxSize;strategy;pullWaiters=[];pushWaiters=[];closed=false;droppedCount=0;constructor(r="buffer",i=1e3){this.strategy=r,this.maxSize=i;}async push(r){if(this.closed)return false;let i=this.pullWaiters.shift();if(i)return i(r),true;if(this.buffer.length>=this.maxSize)switch(this.strategy){case "drop":return this.droppedCount++,false;case "block":if(await new Promise(d=>{this.pushWaiters.push(d);}),this.closed)return false;break;}return this.buffer.push(r),true}async pull(){let r=this.pushWaiters.shift();return r&&r(),this.buffer.length>0?this.buffer.shift():this.closed?null:new Promise(i=>{this.pullWaiters.push(i);})}close(){this.closed=true;for(let r of this.pullWaiters)r(null);this.pullWaiters=[];for(let r of this.pushWaiters)r();this.pushWaiters=[];}getDroppedCount(){return this.droppedCount}};function Kr(s,r={}){let{streamingGuardrails:i=[]}=r;return (d,f,g={})=>{let{signal:c,backpressure:R="buffer",bufferSize:O=1e3,guardrailCheckInterval:y=50,stopOnGuardrail:_=true}=g;if(y<=0||!Number.isFinite(y))throw new Error(`[Directive Streaming] guardrailCheckInterval must be a positive number, got ${y}`);let I=new gn(R,O),L=new AbortController,he="",ce=0,Se=false,ke=Date.now(),Le;c&&(Le=()=>L.abort(),c.addEventListener("abort",Le));let Wt=()=>{Le&&c&&c.removeEventListener("abort",Le);};async function Et(){for(let Z of i)try{let we=await Z.check(he,ce);if(!we.passed){let Be=Z.stopOnFail!==!1,Re={type:"guardrail_triggered",guardrailName:Z.name,reason:we.reason??"Guardrail check failed",partialOutput:he,stopped:Be};return await I.push(Re),Be&&(typeof _=="function"?_:()=>_)(Re)&&(Se=!0,L.abort()),Re}}catch{}return null}let at=(async()=>{await I.push({type:"progress",phase:"starting",message:"Starting agent"});try{let Z=await s(d,f,{signal:L.signal,onToken:async Re=>{Se||(ce++,he+=Re,await I.push({type:"token",data:Re,tokenCount:ce}),ce%y===0&&await Et());},onToolStart:async(Re,Ye,Fe)=>{await I.push({type:"progress",phase:"tool_calling",message:`Calling ${Re}`}),await I.push({type:"tool_start",tool:Re,toolCallId:Ye,arguments:Fe});},onToolEnd:async(Re,Ye,Fe)=>{await I.push({type:"tool_end",tool:Re,toolCallId:Ye,result:Fe}),await I.push({type:"progress",phase:"generating",message:"Continuing generation"});},onMessage:async Re=>{await I.push({type:"message",message:Re});}});await Et();let we=Date.now()-ke,Be=I.getDroppedCount();return await I.push({type:"done",totalTokens:Z.totalTokens,duration:we,droppedTokens:Be}),I.close(),Z}catch(Z){let we={type:"error",error:Z instanceof Error?Z:new Error(String(Z)),partialOutput:he||void 0};throw await I.push(we),I.close(),Z}finally{Wt();}})();return {stream:{[Symbol.asyncIterator](){return {async next(){let Z=await I.pull();return Z===null?{done:true,value:void 0}:{done:false,value:Z}}}}},result:at,abort:()=>L.abort()}}}function Vr(s){let{checkFn:r,threshold:i=.8,stopOnFail:d=true}=s;return {name:"toxicity-streaming",stopOnFail:d,async check(f){let g=await r(f);return g>i?{passed:false,reason:`Toxicity score ${g.toFixed(2)} exceeds threshold ${i}`,severity:"critical"}:{passed:true}}}}function Yr(s){let{maxTokens:r,warnAt:i,stopOnFail:d=true}=s,f=false;return {name:"length-streaming",stopOnFail:d,check(g,c){return c>=r?{passed:false,reason:`Output exceeded maximum length of ${r} tokens`,severity:"error"}:i&&c>=i&&!f?(f=true,{passed:true,warning:`Approaching maximum length: ${c}/${r} tokens`,severity:"warning"}):{passed:true}}}}function Xr(s){let{patterns:r,stopOnFail:i=true}=s;return {name:"pattern-streaming",stopOnFail:i,check(d){for(let{regex:f,name:g}of r)if(f.lastIndex=0,f.test(d))return {passed:false,reason:`Detected ${g} pattern in output`,severity:"error"};return {passed:true}}}}function Zr(s,r={}){let{name:i="combined-streaming",stopOnFirstFail:d=true}=r;return {name:i,stopOnFail:d,async check(f,g){let c=[];for(let R of s){let O=await R.check(f,g);if(!O.passed){if(d)return {...O,reason:`[${R.name}] ${O.reason}`};c.push(`[${R.name}] ${O.reason??"failed"}`);}}return c.length>0?{passed:false,reason:c.join("; ")}:{passed:true}}}}function Qr(s,r,i={}){let{minTokens:d=0,stopOnFail:f=true}=i;return {name:s,stopOnFail:f,async check(g,c){if(c<d)return {passed:true};let R=await r({output:g,agentName:"streaming",input:"",messages:[]},{agentName:"streaming",input:"",facts:{}});return {passed:R.passed,reason:R.reason,severity:R.passed?void 0:"error"}}}}async function eo(s){let r="";for await(let i of s)i.type==="token"&&(r+=i.data);return r}async function*to(s,r){for await(let i of s)await r(i),yield i;}async function*no(s,r){let i=new Set(r);for await(let d of s)i.has(d.type)&&(yield d);}async function*ro(s,r){for await(let i of s)yield await r(i);}var Sr=1e4;function Hn(s){if(s.length===0)return {stream:{[Symbol.asyncIterator](){let _={done:true,value:void 0};return {async next(){return _},async return(){return _}}}},getDroppedCount:()=>0};let r=[],i=[],d=s.length,f=false,g=0;function c(y){if(f)return;let _=i.shift();if(_){_(y);return}r.length<Sr?r.push(y):g++;}function R(){if(d--,d<=0){f=true;for(let y of i)y(null);i.length=0;}}for(let y of s)(async()=>{try{for await(let _ of y.stream)c({chunk:_,agentId:y.agentId});}catch(_){c({chunk:{type:"error",error:_ instanceof Error?_:new Error(String(_))},agentId:y.agentId});}finally{R();}})();return {stream:{[Symbol.asyncIterator](){return {async next(){return r.length>0?{done:false,value:r.shift()}:f?{done:true,value:void 0}:new Promise(y=>{i.push(_=>{y(_===null?{done:true,value:void 0}:{done:false,value:_});});})},return(){f=true,r.length=0;for(let y of i)y(null);return i.length=0,Promise.resolve({done:true,value:void 0})}}}},getDroppedCount:()=>g}}function mn(s,r){if(Object.is(s,r))return true;if(typeof s!=typeof r||s===null||r===null||typeof s!="object")return false;if(Array.isArray(s)){if(!Array.isArray(r)||s.length!==r.length)return false;for(let c=0;c<s.length;c++)if(s[c]!==r[c])return false;return true}let i=s,d=r,f=Object.keys(i),g=Object.keys(d);if(f.length!==g.length)return false;for(let c of f)if(i[c]!==d[c])return false;return true}var Ee=class{count;maxPermits;queue=[];constructor(r){if(r<1||!Number.isFinite(r))throw new Error(`[Directive Semaphore] Invalid max permits: ${r}. Must be a finite number >= 1.`);this.maxPermits=r,this.count=r;}createReleaseFn(){let r=false;return ()=>{r||(r=true,this.release());}}async acquire(r){if(r?.aborted)throw new Error("[Directive Semaphore] Aborted before acquiring permit");return this.count>0?(this.count--,this.createReleaseFn()):new Promise((i,d)=>{let f,g={resolve:c=>{f&&r&&r.removeEventListener("abort",f),i(c);},reject:d};this.queue.push(g),r&&(f=()=>{let c=this.queue.indexOf(g);c>=0&&(this.queue.splice(c,1),d(new Error("[Directive Semaphore] Aborted while waiting for permit")));},r.addEventListener("abort",f,{once:true}));})}tryAcquire(){return this.count>0?(this.count--,this.createReleaseFn()):null}release(){this.count++;let r=this.queue.shift();r&&(this.count--,r.resolve(this.createReleaseFn()));}get available(){return this.count}get waiting(){return this.queue.length}get max(){return this.maxPermits}drain(){let r=new Error("[Directive Semaphore] Semaphore drained - all pending acquisitions rejected"),i=this.queue.splice(0,this.queue.length);for(let d of i)d.reject(r);this.count=this.maxPermits;}};function ot(s){switch(s.type){case "sequential":return s.step;case "supervisor":return s.round;case "reflect":return s.iteration;case "debate":return s.round;case "dag":return s.completedCount;case "goal":return s.step}}function xr(s){let r=ot(s),i=s.stepsTotal??null;switch(s.type){case "sequential":{let d=s.results.reduce((c,R)=>c+R.totalTokens,0),f=s.results.length>0?d/s.results.length:0,g=i!=null?i-r:null;return {percentage:i!=null&&i>0?Math.round(r/i*100):0,stepsCompleted:r,stepsTotal:i,tokensConsumed:d,estimatedTokensRemaining:f>0&&g!=null?Math.round(f*g):null,estimatedStepsRemaining:g}}case "supervisor":{let d=s.workerResults.reduce((g,c)=>g+c.totalTokens,0),f=i!=null?i-r:null;return {percentage:i!=null&&i>0?Math.round(r/i*100):0,stepsCompleted:r,stepsTotal:i,tokensConsumed:d,estimatedTokensRemaining:null,estimatedStepsRemaining:f}}case "reflect":{let d=s.history.reduce((g,c)=>g+c.producerTokens+c.evaluatorTokens,0),f=i!=null?i-r:null;return {percentage:i!=null&&i>0?Math.round(r/i*100):0,stepsCompleted:r,stepsTotal:i,tokensConsumed:d,estimatedTokensRemaining:null,estimatedStepsRemaining:f}}case "debate":{let d=s.tokensConsumed,f=i!=null?i-r:null;return {percentage:i!=null&&i>0?Math.round(r/i*100):0,stepsCompleted:r,stepsTotal:i,tokensConsumed:d,estimatedTokensRemaining:null,estimatedStepsRemaining:f}}case "dag":{let d=i??Object.keys(s.statuses).length,f=s.completedCount,g=Object.values(s.nodeResults).reduce((O,y)=>O+y.totalTokens,0),c=f>0?g/f:0,R=d-f;return {percentage:d>0?Math.round(f/d*100):0,stepsCompleted:f,stepsTotal:d,tokensConsumed:g,estimatedTokensRemaining:R>0?Math.round(c*R):0,estimatedStepsRemaining:R}}case "goal":{let d=Object.values(s.nodeOutputs).reduce((g,c)=>g+c.totalTokens,0),f=s.lastSatisfaction;return {percentage:Math.round(f*100),stepsCompleted:r,stepsTotal:i??null,tokensConsumed:d,estimatedTokensRemaining:null,estimatedStepsRemaining:s.stepMetrics.length>0?Ar(s):null}}}}function Ar(s){let r=s.stepMetrics;if(r.length<2)return null;let i=1-s.lastSatisfaction;if(i<=0)return 0;let f=r.reduce((g,c)=>g+Math.max(0,c.satisfactionDelta),0)/r.length;return f<=0?null:Math.ceil(i/f)}function Cr(s,r){if(s.type!==r.type)throw new Error(`[Directive Checkpoint] Cannot diff different pattern types: ${s.type} vs ${r.type}`);let i=f=>{switch(f.type){case "sequential":return f.results.reduce((g,c)=>g+c.totalTokens,0);case "supervisor":return f.workerResults.reduce((g,c)=>g+c.totalTokens,0);case "reflect":return f.history.reduce((g,c)=>g+c.producerTokens+c.evaluatorTokens,0);case "debate":return f.tokensConsumed;case "dag":return Object.values(f.nodeResults).reduce((g,c)=>g+c.totalTokens,0);case "goal":return Object.values(f.nodeOutputs).reduce((g,c)=>g+c.totalTokens,0)}},d={patternType:s.type,stepDelta:ot(r)-ot(s),tokensDelta:i(r)-i(s)};if(s.type==="goal"&&r.type==="goal"){let f=new Set(Object.keys(s.facts)),g=new Set(Object.keys(r.facts)),c=[],R=[],O=[];for(let y of g)f.has(y)?JSON.stringify(s.facts[y])!==JSON.stringify(r.facts[y])&&O.push({key:y,before:s.facts[y],after:r.facts[y]}):c.push(y);for(let y of f)g.has(y)||R.push(y);d.facts={added:c,removed:R,changed:O};}if(s.type==="dag"&&r.type==="dag"){let f=new Set(Object.entries(s.statuses).filter(([,g])=>g==="completed").map(([g])=>g));d.nodesCompleted=Object.entries(r.statuses).filter(([g,c])=>c==="completed"&&!f.has(g)).map(([g])=>g);}if(s.type==="goal"&&r.type==="goal"){let f=new Set(s.completedNodes);d.nodesCompleted=r.completedNodes.filter(g=>!f.has(g));}return d}async function Er(s,r,i){let{createMultiAgentOrchestrator:d}=await import('./multi-agent-orchestrator-RMTLPKB4.js'),f=await r.load(i);if(!f)throw new Error(`[Directive MultiAgent] Checkpoint not found: ${i}`);let g=structuredClone(f),c=d({...s,checkpointStore:r});return c.restore(g),c}function hn(s,r){let i=Object.keys(r);for(let[O,y]of Object.entries(r))for(let _ of y.deps??[])if(!r[_])throw new Error(`[Directive MultiAgent] DAG pattern "${s}": node "${O}" depends on unknown node "${_}"`);if(!i.some(O=>{let y=r[O]?.deps;return !y||y.length===0}))throw new Error(`[Directive MultiAgent] DAG pattern "${s}": no root nodes (every node has dependencies)`);let f=Object.create(null),g=Object.create(null);for(let O of i)g[O]=[];for(let[O,y]of Object.entries(r)){f[O]=(y.deps??[]).length;for(let _ of y.deps??[])g[_].push(O);}let c=[];for(let O of i)f[O]===0&&c.push(O);let R=0;for(;c.length>0;){let O=c.shift();R++;for(let y of g[O]??[])f[y]--,f[y]===0&&c.push(y);}if(R!==i.length)throw new Error(`[Directive MultiAgent] DAG pattern "${s}": cycle detected. Visited ${R}/${i.length} nodes.`)}function ao(s,r,i){return {type:"parallel",handlers:s,merge:r,...i}}function io(s,r){return {type:"sequential",handlers:s,...r}}function uo(s,r,i){return {type:"supervisor",supervisor:s,workers:r,...i}}function lo(s,r,i){return {type:"dag",nodes:s,merge:r??(d=>d.outputs),...i}}function co(s,r,i){return {type:"reflect",handler:s,evaluator:r,...i}}function po(s,r){return {type:"race",handlers:s,...r}}function fo(s,r,i){return {type:"goal",nodes:s,when:r,...i}}function go(){return {select:s=>s}}function mo(s){let r=s?.topN??3;return {select:(i,d)=>[...i].sort((g,c)=>{let R=d[g]?.avgSatisfactionDelta??0;return (d[c]?.avgSatisfactionDelta??0)-R}).slice(0,r)}}function ho(){return {select:(s,r)=>[...s].sort((d,f)=>{let g=r[d],c=r[f];if(!g||g.runs===0)return -1;if(!c||c.runs===0)return 1;let R=g.avgSatisfactionDelta>0?g.tokens/g.runs/g.avgSatisfactionDelta:Number.POSITIVE_INFINITY,O=c.avgSatisfactionDelta>0?c.tokens/c.runs/c.avgSatisfactionDelta:Number.POSITIVE_INFINITY;return R-O})}}function yo(s){switch(s.type){case "parallel":return {type:"parallel",handlers:s.handlers,minSuccess:s.minSuccess,timeout:s.timeout};case "sequential":return {type:"sequential",handlers:s.handlers,continueOnError:s.continueOnError};case "supervisor":return {type:"supervisor",supervisor:s.supervisor,workers:s.workers,maxRounds:s.maxRounds};case "dag":{let r=Object.create(null);for(let[i,d]of Object.entries(s.nodes))r[i]={handler:d.handler,deps:d.deps,timeout:d.timeout,priority:d.priority};return {type:"dag",nodes:r,timeout:s.timeout,maxConcurrent:s.maxConcurrent,onNodeError:s.onNodeError}}case "reflect":return {type:"reflect",handler:s.handler,evaluator:s.evaluator,maxIterations:s.maxIterations,onExhausted:s.onExhausted,timeout:s.timeout,threshold:typeof s.threshold=="number"?s.threshold:void 0};case "race":return {type:"race",handlers:s.handlers,timeout:s.timeout,minSuccess:s.minSuccess};case "debate":return {type:"debate",handlers:s.handlers,evaluator:s.evaluator,maxRounds:s.maxRounds,timeout:s.timeout};case "goal":{let r=Object.create(null);for(let[i,d]of Object.entries(s.nodes))r[i]={handler:d.handler,produces:d.produces,requires:d.requires,allowRerun:d.allowRerun,priority:d.priority};return {type:"goal",nodes:r,maxSteps:s.maxSteps,timeout:s.timeout}}}}var Dr=new Set(["parallel","sequential","supervisor","dag","reflect","race","debate","goal"]);function ko(s,r){if(!s||typeof s!="object"||!Dr.has(s.type))throw new Error(`[Directive] patternFromJSON: invalid or unknown pattern type "${s?.type}"`);let i=Object.create(null);for(let[d,f]of Object.entries(s))d!=="__proto__"&&d!=="constructor"&&d!=="prototype"&&(i[d]=f);return {...i,...r}}function To(s,r,i,d){return {when:s,require:f=>{let g=typeof r=="function"?r(f):r,c=typeof i=="function"?i(f):i;return {type:"RUN_AGENT",agent:g,input:c}},priority:d}}function So(s,r,i){return {type:"RUN_AGENT",agent:s,input:r,context:i}}function xo(s,r=`
26
+ Please improve your response.`}function Br(s,r){let i=r.maxIterations??2,d=r.buildRetryInput??Rr,f=r.onExhausted??"accept-last";if(i<1)throw new Error("[Directive Reflection] maxIterations must be >= 1");return typeof process<"u"&&process.env?.NODE_ENV!=="production"&&i>3&&console.warn("[Directive Reflection] maxIterations > 3 rarely improves quality. Consider using maxIterations <= 3 to avoid unbounded token burn."),async(g,c,R)=>{let O=[],y=c,_=0,I=null;for(let L=0;L<i;L++){let he=Date.now(),ce=await s(g,y,R);I=ce,_+=ce.totalTokens;let Se={input:c,iteration:L,result:ce,history:[...O]},ke=await r.evaluate(ce.output,Se);O.push(ke);let Le=Date.now()-he;try{r.onIteration?.({iteration:L,passed:ke.passed,feedback:ke.feedback,score:ke.score,durationMs:Le});}catch{}if(ke.passed)return {...ce,totalTokens:_};if(r.budgetThreshold!==void 0&&_>=r.budgetThreshold)break;L<i-1&&ke.feedback&&(y=d(c,ke.feedback,L));}if(f==="throw")throw new xt({iterations:i,history:O,lastResult:I,totalTokens:_});return {...I,totalTokens:_}}}var At=200,Tr=0;function Gn(){return `bp_${Date.now().toString(36)}_${(++Tr).toString(36)}`}function Ln(s,r,i){for(let d of s)if(d.type===r){if(!d.when)return d;try{if(d.when(i))return d}catch{}}return null}function Ct(){return {pending:[],resolved:[],cancelled:[]}}var Bn=new Set(["__proto__","constructor","prototype","toString","valueOf","hasOwnProperty"]);function Ke(){let s=Date.now().toString(36),r=crypto.randomUUID().slice(0,8);return `ckpt_${s}_${r}`}function fn(s){if(!s||typeof s!="object")return false;for(let d of Object.keys(s))if(Bn.has(d))return false;let r=s;if(r.version!==1||typeof r.id!="string"||r.id.length===0||typeof r.createdAt!="string"||typeof r.systemExport!="string"||r.timelineExport!==null&&typeof r.timelineExport!="string"||!r.localState||typeof r.localState!="object")return false;for(let d of Object.keys(r.localState))if(Bn.has(d))return false;let i=r.localState;return !(i.type!=="single"&&i.type!=="multi"||r.orchestratorType!=="single"&&r.orchestratorType!=="multi")}var Fn=class{store=new Map;order=[];maxCheckpoints;retentionMs;preserveLabeled;constructor(r){if(this.maxCheckpoints=r?.maxCheckpoints??100,this.retentionMs=r?.retentionMs??Number.POSITIVE_INFINITY,this.preserveLabeled=r?.preserveLabeled??false,!Number.isFinite(this.maxCheckpoints)||this.maxCheckpoints<1)throw new Error(`[Directive Checkpoint] maxCheckpoints must be >= 1, got ${this.maxCheckpoints}`)}async save(r){if(!fn(r))throw new Error("[Directive Checkpoint] Invalid checkpoint data");for(;this.order.length>=this.maxCheckpoints&&this.evictOldest(););let i=this.order.indexOf(r.id);return i>=0&&this.order.splice(i,1),this.store.set(r.id,r),this.order.push(r.id),r.id}async load(r){return this.store.get(r)??null}async list(){return this.order.map(r=>{let i=this.store.get(r);return {id:i.id,label:i.label,createdAt:i.createdAt}})}async delete(r){if(!this.store.has(r))return false;this.store.delete(r);let i=this.order.indexOf(r);return i>=0&&this.order.splice(i,1),true}async clear(){this.store.clear(),this.order.length=0;}async prune(){if(!Number.isFinite(this.retentionMs))return 0;let r=Date.now()-this.retentionMs,i=0,d=[];for(let f of this.order){let g=this.store.get(f);if(!g)continue;if(new Date(g.createdAt).getTime()>=r)break;this.preserveLabeled&&g.label||d.push(f);}for(let f of d){this.store.delete(f);let g=this.order.indexOf(f);g>=0&&this.order.splice(g,1),i++;}return i}evictOldest(){if(this.preserveLabeled)for(let i=0;i<this.order.length;i++){let d=this.order[i],f=this.store.get(d);if(f&&!f.label)return this.order.splice(i,1),this.store.delete(d),true}let r=this.order.shift();return r?(this.store.delete(r),true):false}};var gn=class{buffer=[];maxSize;strategy;pullWaiters=[];pushWaiters=[];closed=false;droppedCount=0;constructor(r="buffer",i=1e3){this.strategy=r,this.maxSize=i;}async push(r){if(this.closed)return false;let i=this.pullWaiters.shift();if(i)return i(r),true;if(this.buffer.length>=this.maxSize)switch(this.strategy){case "drop":return this.droppedCount++,false;case "block":if(await new Promise(d=>{this.pushWaiters.push(d);}),this.closed)return false;break;}return this.buffer.push(r),true}async pull(){let r=this.pushWaiters.shift();return r&&r(),this.buffer.length>0?this.buffer.shift():this.closed?null:new Promise(i=>{this.pullWaiters.push(i);})}close(){this.closed=true;for(let r of this.pullWaiters)r(null);this.pullWaiters=[];for(let r of this.pushWaiters)r();this.pushWaiters=[];}getDroppedCount(){return this.droppedCount}};function Kr(s,r={}){let{streamingGuardrails:i=[]}=r;return (d,f,g={})=>{let{signal:c,backpressure:R="buffer",bufferSize:O=1e3,guardrailCheckInterval:y=50,stopOnGuardrail:_=true}=g;if(y<=0||!Number.isFinite(y))throw new Error(`[Directive Streaming] guardrailCheckInterval must be a positive number, got ${y}`);let I=new gn(R,O),L=new AbortController,he="",ce=0,Se=false,ke=Date.now(),Le;c&&(Le=()=>L.abort(),c.addEventListener("abort",Le));let Wt=()=>{Le&&c&&c.removeEventListener("abort",Le);};async function Et(){for(let Z of i)try{let we=await Z.check(he,ce);if(!we.passed){let Be=Z.stopOnFail!==!1,Re={type:"guardrail_triggered",guardrailName:Z.name,reason:we.reason??"Guardrail check failed",partialOutput:he,stopped:Be};return await I.push(Re),Be&&(typeof _=="function"?_:()=>_)(Re)&&(Se=!0,L.abort()),Re}}catch{}return null}let at=(async()=>{await I.push({type:"progress",phase:"starting",message:"Starting agent"});try{let Z=await s(d,f,{signal:L.signal,onToken:async Re=>{Se||(ce++,he+=Re,await I.push({type:"token",data:Re,tokenCount:ce}),ce%y===0&&await Et());},onToolStart:async(Re,Ye,Fe)=>{await I.push({type:"progress",phase:"tool_calling",message:`Calling ${Re}`}),await I.push({type:"tool_start",tool:Re,toolCallId:Ye,arguments:Fe});},onToolEnd:async(Re,Ye,Fe)=>{await I.push({type:"tool_end",tool:Re,toolCallId:Ye,result:Fe}),await I.push({type:"progress",phase:"generating",message:"Continuing generation"});},onMessage:async Re=>{await I.push({type:"message",message:Re});}});await Et();let we=Date.now()-ke,Be=I.getDroppedCount();return await I.push({type:"done",totalTokens:Z.totalTokens,duration:we,droppedTokens:Be}),I.close(),Z}catch(Z){let we={type:"error",error:Z instanceof Error?Z:new Error(String(Z)),partialOutput:he||void 0};throw await I.push(we),I.close(),Z}finally{Wt();}})();return {stream:{[Symbol.asyncIterator](){return {async next(){let Z=await I.pull();return Z===null?{done:true,value:void 0}:{done:false,value:Z}}}}},result:at,abort:()=>L.abort()}}}function Vr(s){let{checkFn:r,threshold:i=.8,stopOnFail:d=true}=s;return {name:"toxicity-streaming",stopOnFail:d,async check(f){let g=await r(f);return g>i?{passed:false,reason:`Toxicity score ${g.toFixed(2)} exceeds threshold ${i}`,severity:"critical"}:{passed:true}}}}function Yr(s){let{maxTokens:r,warnAt:i,stopOnFail:d=true}=s,f=false;return {name:"length-streaming",stopOnFail:d,check(g,c){return c>=r?{passed:false,reason:`Output exceeded maximum length of ${r} tokens`,severity:"error"}:i&&c>=i&&!f?(f=true,{passed:true,warning:`Approaching maximum length: ${c}/${r} tokens`,severity:"warning"}):{passed:true}}}}function Xr(s){let{patterns:r,stopOnFail:i=true}=s;return {name:"pattern-streaming",stopOnFail:i,check(d){for(let{regex:f,name:g}of r)if(f.lastIndex=0,f.test(d))return {passed:false,reason:`Detected ${g} pattern in output`,severity:"error"};return {passed:true}}}}function Zr(s,r={}){let{name:i="combined-streaming",stopOnFirstFail:d=true}=r;return {name:i,stopOnFail:d,async check(f,g){let c=[];for(let R of s){let O=await R.check(f,g);if(!O.passed){if(d)return {...O,reason:`[${R.name}] ${O.reason}`};c.push(`[${R.name}] ${O.reason??"failed"}`);}}return c.length>0?{passed:false,reason:c.join("; ")}:{passed:true}}}}function Qr(s,r,i={}){let{minTokens:d=0,stopOnFail:f=true}=i;return {name:s,stopOnFail:f,async check(g,c){if(c<d)return {passed:true};let R=await r({output:g,agentName:"streaming",input:"",messages:[]},{agentName:"streaming",input:"",facts:{}});return {passed:R.passed,reason:R.reason,severity:R.passed?void 0:"error"}}}}async function eo(s){let r="";for await(let i of s)i.type==="token"&&(r+=i.data);return r}async function*to(s,r){for await(let i of s)await r(i),yield i;}async function*no(s,r){let i=new Set(r);for await(let d of s)i.has(d.type)&&(yield d);}async function*ro(s,r){for await(let i of s)yield await r(i);}var Sr=1e4;function Hn(s){if(s.length===0)return {stream:{[Symbol.asyncIterator](){let _={done:true,value:void 0};return {async next(){return _},async return(){return _}}}},getDroppedCount:()=>0};let r=[],i=[],d=s.length,f=false,g=0;function c(y){if(f)return;let _=i.shift();if(_){_(y);return}r.length<Sr?r.push(y):g++;}function R(){if(d--,d<=0){f=true;for(let y of i)y(null);i.length=0;}}for(let y of s)(async()=>{try{for await(let _ of y.stream)c({chunk:_,agentId:y.agentId});}catch(_){c({chunk:{type:"error",error:_ instanceof Error?_:new Error(String(_))},agentId:y.agentId});}finally{R();}})();return {stream:{[Symbol.asyncIterator](){return {async next(){return r.length>0?{done:false,value:r.shift()}:f?{done:true,value:void 0}:new Promise(y=>{i.push(_=>{y(_===null?{done:true,value:void 0}:{done:false,value:_});});})},return(){f=true,r.length=0;for(let y of i)y(null);return i.length=0,Promise.resolve({done:true,value:void 0})}}}},getDroppedCount:()=>g}}function mn(s,r){if(Object.is(s,r))return true;if(typeof s!=typeof r||s===null||r===null||typeof s!="object")return false;if(Array.isArray(s)){if(!Array.isArray(r)||s.length!==r.length)return false;for(let c=0;c<s.length;c++)if(s[c]!==r[c])return false;return true}let i=s,d=r,f=Object.keys(i),g=Object.keys(d);if(f.length!==g.length)return false;for(let c of f)if(i[c]!==d[c])return false;return true}var Ee=class{count;maxPermits;queue=[];constructor(r){if(r<1||!Number.isFinite(r))throw new Error(`[Directive Semaphore] Invalid max permits: ${r}. Must be a finite number >= 1.`);this.maxPermits=r,this.count=r;}createReleaseFn(){let r=false;return ()=>{r||(r=true,this.release());}}async acquire(r){if(r?.aborted)throw new Error("[Directive Semaphore] Aborted before acquiring permit");return this.count>0?(this.count--,this.createReleaseFn()):new Promise((i,d)=>{let f,g={resolve:c=>{f&&r&&r.removeEventListener("abort",f),i(c);},reject:d};this.queue.push(g),r&&(f=()=>{let c=this.queue.indexOf(g);c>=0&&(this.queue.splice(c,1),d(new Error("[Directive Semaphore] Aborted while waiting for permit")));},r.addEventListener("abort",f,{once:true}));})}tryAcquire(){return this.count>0?(this.count--,this.createReleaseFn()):null}release(){this.count++;let r=this.queue.shift();r&&(this.count--,r.resolve(this.createReleaseFn()));}get available(){return this.count}get waiting(){return this.queue.length}get max(){return this.maxPermits}drain(){let r=new Error("[Directive Semaphore] Semaphore drained - all pending acquisitions rejected"),i=this.queue.splice(0,this.queue.length);for(let d of i)d.reject(r);this.count=this.maxPermits;}};function ot(s){switch(s.type){case "sequential":return s.step;case "supervisor":return s.round;case "reflect":return s.iteration;case "debate":return s.round;case "dag":return s.completedCount;case "goal":return s.step}}function xr(s){let r=ot(s),i=s.stepsTotal??null;switch(s.type){case "sequential":{let d=s.results.reduce((c,R)=>c+R.totalTokens,0),f=s.results.length>0?d/s.results.length:0,g=i!=null?i-r:null;return {percentage:i!=null&&i>0?Math.round(r/i*100):0,stepsCompleted:r,stepsTotal:i,tokensConsumed:d,estimatedTokensRemaining:f>0&&g!=null?Math.round(f*g):null,estimatedStepsRemaining:g}}case "supervisor":{let d=s.workerResults.reduce((g,c)=>g+c.totalTokens,0),f=i!=null?i-r:null;return {percentage:i!=null&&i>0?Math.round(r/i*100):0,stepsCompleted:r,stepsTotal:i,tokensConsumed:d,estimatedTokensRemaining:null,estimatedStepsRemaining:f}}case "reflect":{let d=s.history.reduce((g,c)=>g+c.producerTokens+c.evaluatorTokens,0),f=i!=null?i-r:null;return {percentage:i!=null&&i>0?Math.round(r/i*100):0,stepsCompleted:r,stepsTotal:i,tokensConsumed:d,estimatedTokensRemaining:null,estimatedStepsRemaining:f}}case "debate":{let d=s.tokensConsumed,f=i!=null?i-r:null;return {percentage:i!=null&&i>0?Math.round(r/i*100):0,stepsCompleted:r,stepsTotal:i,tokensConsumed:d,estimatedTokensRemaining:null,estimatedStepsRemaining:f}}case "dag":{let d=i??Object.keys(s.statuses).length,f=s.completedCount,g=Object.values(s.nodeResults).reduce((O,y)=>O+y.totalTokens,0),c=f>0?g/f:0,R=d-f;return {percentage:d>0?Math.round(f/d*100):0,stepsCompleted:f,stepsTotal:d,tokensConsumed:g,estimatedTokensRemaining:R>0?Math.round(c*R):0,estimatedStepsRemaining:R}}case "goal":{let d=Object.values(s.nodeOutputs).reduce((g,c)=>g+c.totalTokens,0),f=s.lastSatisfaction;return {percentage:Math.round(f*100),stepsCompleted:r,stepsTotal:i??null,tokensConsumed:d,estimatedTokensRemaining:null,estimatedStepsRemaining:s.stepMetrics.length>0?Ar(s):null}}}}function Ar(s){let r=s.stepMetrics;if(r.length<2)return null;let i=1-s.lastSatisfaction;if(i<=0)return 0;let f=r.reduce((g,c)=>g+Math.max(0,c.satisfactionDelta),0)/r.length;return f<=0?null:Math.ceil(i/f)}function Cr(s,r){if(s.type!==r.type)throw new Error(`[Directive Checkpoint] Cannot diff different pattern types: ${s.type} vs ${r.type}`);let i=f=>{switch(f.type){case "sequential":return f.results.reduce((g,c)=>g+c.totalTokens,0);case "supervisor":return f.workerResults.reduce((g,c)=>g+c.totalTokens,0);case "reflect":return f.history.reduce((g,c)=>g+c.producerTokens+c.evaluatorTokens,0);case "debate":return f.tokensConsumed;case "dag":return Object.values(f.nodeResults).reduce((g,c)=>g+c.totalTokens,0);case "goal":return Object.values(f.nodeOutputs).reduce((g,c)=>g+c.totalTokens,0)}},d={patternType:s.type,stepDelta:ot(r)-ot(s),tokensDelta:i(r)-i(s)};if(s.type==="goal"&&r.type==="goal"){let f=new Set(Object.keys(s.facts)),g=new Set(Object.keys(r.facts)),c=[],R=[],O=[];for(let y of g)f.has(y)?JSON.stringify(s.facts[y])!==JSON.stringify(r.facts[y])&&O.push({key:y,before:s.facts[y],after:r.facts[y]}):c.push(y);for(let y of f)g.has(y)||R.push(y);d.facts={added:c,removed:R,changed:O};}if(s.type==="dag"&&r.type==="dag"){let f=new Set(Object.entries(s.statuses).filter(([,g])=>g==="completed").map(([g])=>g));d.nodesCompleted=Object.entries(r.statuses).filter(([g,c])=>c==="completed"&&!f.has(g)).map(([g])=>g);}if(s.type==="goal"&&r.type==="goal"){let f=new Set(s.completedNodes);d.nodesCompleted=r.completedNodes.filter(g=>!f.has(g));}return d}async function Er(s,r,i){let{createMultiAgentOrchestrator:d}=await import('./multi-agent-orchestrator-FIF4GLVR.js'),f=await r.load(i);if(!f)throw new Error(`[Directive MultiAgent] Checkpoint not found: ${i}`);let g=structuredClone(f),c=d({...s,checkpointStore:r});return c.restore(g),c}function hn(s,r){let i=Object.keys(r);for(let[O,y]of Object.entries(r))for(let _ of y.deps??[])if(!r[_])throw new Error(`[Directive MultiAgent] DAG pattern "${s}": node "${O}" depends on unknown node "${_}"`);if(!i.some(O=>{let y=r[O]?.deps;return !y||y.length===0}))throw new Error(`[Directive MultiAgent] DAG pattern "${s}": no root nodes (every node has dependencies)`);let f=Object.create(null),g=Object.create(null);for(let O of i)g[O]=[];for(let[O,y]of Object.entries(r)){f[O]=(y.deps??[]).length;for(let _ of y.deps??[])g[_].push(O);}let c=[];for(let O of i)f[O]===0&&c.push(O);let R=0;for(;c.length>0;){let O=c.shift();R++;for(let y of g[O]??[])f[y]--,f[y]===0&&c.push(y);}if(R!==i.length)throw new Error(`[Directive MultiAgent] DAG pattern "${s}": cycle detected. Visited ${R}/${i.length} nodes.`)}function ao(s,r,i){return {type:"parallel",handlers:s,merge:r,...i}}function io(s,r){return {type:"sequential",handlers:s,...r}}function uo(s,r,i){return {type:"supervisor",supervisor:s,workers:r,...i}}function lo(s,r,i){return {type:"dag",nodes:s,merge:r??(d=>d.outputs),...i}}function co(s,r,i){return {type:"reflect",handler:s,evaluator:r,...i}}function po(s,r){return {type:"race",handlers:s,...r}}function fo(s,r,i){return {type:"goal",nodes:s,when:r,...i}}function go(){return {select:s=>s}}function mo(s){let r=s?.topN??3;return {select:(i,d)=>[...i].sort((g,c)=>{let R=d[g]?.avgSatisfactionDelta??0;return (d[c]?.avgSatisfactionDelta??0)-R}).slice(0,r)}}function ho(){return {select:(s,r)=>[...s].sort((d,f)=>{let g=r[d],c=r[f];if(!g||g.runs===0)return -1;if(!c||c.runs===0)return 1;let R=g.avgSatisfactionDelta>0?g.tokens/g.runs/g.avgSatisfactionDelta:Number.POSITIVE_INFINITY,O=c.avgSatisfactionDelta>0?c.tokens/c.runs/c.avgSatisfactionDelta:Number.POSITIVE_INFINITY;return R-O})}}function yo(s){switch(s.type){case "parallel":return {type:"parallel",handlers:s.handlers,minSuccess:s.minSuccess,timeout:s.timeout};case "sequential":return {type:"sequential",handlers:s.handlers,continueOnError:s.continueOnError};case "supervisor":return {type:"supervisor",supervisor:s.supervisor,workers:s.workers,maxRounds:s.maxRounds};case "dag":{let r=Object.create(null);for(let[i,d]of Object.entries(s.nodes))r[i]={handler:d.handler,deps:d.deps,timeout:d.timeout,priority:d.priority};return {type:"dag",nodes:r,timeout:s.timeout,maxConcurrent:s.maxConcurrent,onNodeError:s.onNodeError}}case "reflect":return {type:"reflect",handler:s.handler,evaluator:s.evaluator,maxIterations:s.maxIterations,onExhausted:s.onExhausted,timeout:s.timeout,threshold:typeof s.threshold=="number"?s.threshold:void 0};case "race":return {type:"race",handlers:s.handlers,timeout:s.timeout,minSuccess:s.minSuccess};case "debate":return {type:"debate",handlers:s.handlers,evaluator:s.evaluator,maxRounds:s.maxRounds,timeout:s.timeout};case "goal":{let r=Object.create(null);for(let[i,d]of Object.entries(s.nodes))r[i]={handler:d.handler,produces:d.produces,requires:d.requires,allowRerun:d.allowRerun,priority:d.priority};return {type:"goal",nodes:r,maxSteps:s.maxSteps,timeout:s.timeout}}}}var Dr=new Set(["parallel","sequential","supervisor","dag","reflect","race","debate","goal"]);function ko(s,r){if(!s||typeof s!="object"||!Dr.has(s.type))throw new Error(`[Directive] patternFromJSON: invalid or unknown pattern type "${s?.type}"`);let i=Object.create(null);for(let[d,f]of Object.entries(s))d!=="__proto__"&&d!=="constructor"&&d!=="prototype"&&(i[d]=f);return {...i,...r}}function To(s,r,i,d){return {when:s,require:f=>{let g=typeof r=="function"?r(f):r,c=typeof i=="function"?i(f):i;return {type:"RUN_AGENT",agent:g,input:c}},priority:d}}function So(s,r,i){return {type:"RUN_AGENT",agent:s,input:r,context:i}}function xo(s,r=`
27
27
 
28
28
  `){return s.map(i=>typeof i.output=="string"?i.output:safeStringify(i.output)).join(r)}function Ao(s,r){if(s.length===0)throw new Error("[Directive MultiAgent] No results to pick from");return s.reduce((i,d)=>r(d)>r(i)?d:i)}function Co(s){return s.map(r=>r.output)}function Eo(s){return s.reduce((r,i)=>r+i.totalTokens,0)}function Do(...s){if(s.length===0)throw new Error("[Directive MultiAgent] composePatterns requires at least one pattern");return async(r,i)=>{let d=i,f;for(let g of s){switch(g.type){case "parallel":{let c=g,R=c.handlers.map(()=>d);f=await r.runParallel(c.handlers,R,c.merge,{minSuccess:c.minSuccess,timeout:c.timeout});break}case "sequential":{let c=g,R=await r.runSequential(c.handlers,d,{transform:c.transform}),O=R[R.length-1];f=c.extract?c.extract(O?.output):O?.output;break}case "supervisor":{let c=g,R=c.maxRounds??5;if(R<1||!Number.isFinite(R))throw new Error("[Directive MultiAgent] supervisor maxRounds must be >= 1");let O=[],y=await r.runAgent(c.supervisor,d);for(let _=0;_<R;_++){let I=y.output,L;if(typeof I=="string")try{L=JSON.parse(I);}catch{try{let ce=I.replace(/```(?:json|JSON)?\s*\n?/g,"").replace(/<[^>]+>/g," "),Se=a(ce);if(Se&&typeof Se=="object"&&"action"in Se)L=Se;else break}catch{break}}else if(I&&typeof I=="object"&&"action"in I)L=I;else break;if(L.action==="complete"||!L.worker||!c.workers.includes(L.worker))break;let he=await r.runAgent(L.worker,L.workerInput??"");O.push(he),y=await r.runAgent(c.supervisor,`Worker ${L.worker} completed with result: ${safeStringify(he.output)}`);}f=c.extract?c.extract(y.output,O):y.output;break}case "dag":{let c=g,R={input:d,outputs:Object.create(null),statuses:Object.create(null),errors:Object.create(null),results:Object.create(null)};typeof process<"u"&&process.env?.NODE_ENV!=="production"&&console.debug("[Directive MultiAgent] composePatterns: DAG nodes executed sequentially \u2014 use runPattern() for full parallel DAG execution");let O=Object.keys(c.nodes);for(let y of O){let _=c.nodes[y];R.statuses[y]="running";try{let I=d;if(_.transform)I=_.transform(R);else if(_.deps&&_.deps.length>0){let he=Object.create(null);for(let ce of _.deps)R.outputs[ce]!==void 0&&(he[ce]=R.outputs[ce]);I=JSON.stringify(he);}let L=await r.runAgent(_.handler,I);R.outputs[y]=L.output,R.results[y]=L,R.statuses[y]="completed";}catch(I){if(R.statuses[y]="error",R.errors[y]=I instanceof Error?I.message:String(I),c.onNodeError==="fail")throw I}}f=await c.merge(R);break}case "reflect":{let c=g,R=c.maxIterations??2,O=c.parseEvaluation??(L=>{if(typeof L=="string")try{return JSON.parse(L)}catch{return {passed:false,feedback:L}}return L&&typeof L=="object"&&"passed"in L?L:{passed:false,feedback:"Invalid evaluator output"}}),y=c.buildRetryInput??((L,he)=>`${L}
29
29
 
@@ -63,5 +63,5 @@ ${Object.entries(S).map(([$,ue])=>` - ${$}: ${ue}`).join(`
63
63
  ${Object.entries(S).map(([$,ue])=>` - ${$}: ${ue}`).join(`
64
64
  `)}`)));});});await Promise.all(q).catch(()=>{});let F=x[0],M=F.agentId,N=new Set(x.map(v=>v.agentId)),G=D.filter(v=>!N.has(v)&&!(v in S));P&&(P.record({type:"race_winner",timestamp:Date.now(),snapshotId:null,patternId:l,winnerId:M,durationMs:Date.now()-a}),G.length>0&&P.record({type:"race_cancelled",timestamp:Date.now(),snapshotId:null,patternId:l,cancelledIds:G,reason:"winner_found"}));let A=e.extract?e.extract(F.result):F.result.output,m=n>1?x.map(v=>({agentId:v.agentId,result:e.extract?e.extract(v.result):v.result.output})):void 0;return {winnerId:M,result:A,allResults:m}}catch(E){throw T=E instanceof Error?E:new Error(String(E)),P&&P.record({type:"race_cancelled",timestamp:Date.now(),snapshotId:null,patternId:l,cancelledIds:D,reason:u.signal.aborted?"timeout":"all_failed"}),E}finally{p&&clearTimeout(p),h&&e.signal&&e.signal.removeEventListener("abort",h),o&&J("onPatternComplete",{patternId:l,patternType:"race",durationMs:Date.now()-a,timestamp:Date.now(),error:T});}}async function qt(e,t,o,n){let{handlers:a,evaluator:l,maxRounds:u=2,extract:p,parseJudgement:h}=e;if(a.length<2)throw new Error("[Directive MultiAgent] debate requires at least 2 handlers");if(u<1||!Number.isFinite(u))throw new Error("[Directive MultiAgent] debate maxRounds must be >= 1");let T=e.signal,S,D;if(e.timeout&&!T){let w=new AbortController;S=setTimeout(()=>w.abort(),e.timeout),T=w.signal;}else if(e.timeout&&T){let w=new AbortController;S=setTimeout(()=>w.abort(),e.timeout),D=()=>w.abort(),T.addEventListener("abort",D,{once:true}),T=w.signal;}let q=h??(w=>{if(typeof w=="string")try{let C=JSON.parse(w);return C&&typeof C=="object"&&typeof C.winnerId=="string"?C:(ee&&console.warn("[Directive MultiAgent] defaultParseJudgement: parsed JSON missing winnerId, falling back to first agent"),{winnerId:a[0]})}catch{return ee&&console.warn("[Directive MultiAgent] defaultParseJudgement: output is not valid JSON, falling back to first agent"),{winnerId:a[0]}}return w&&typeof w=="object"&&"winnerId"in w&&typeof w.winnerId=="string"?w:(ee&&console.warn("[Directive MultiAgent] defaultParseJudgement: unrecognized output format, falling back to first agent"),{winnerId:a[0]})}),k=n?.rounds?[...n.rounds]:[],x=n?.currentInput??t,F=n?.lastWinnerId??a[0],M=n?.lastWinnerOutput??void 0,N=n?.round??0,G=e.checkpoint,A=G?.store??we,m=G?.everyN??5,v=G?.labelPrefix??"debate",B=o??"__inline_debate",H=Date.now(),j=n?.tokensConsumed??0;o&&J("onPatternStart",{patternId:B,patternType:"debate",input:t,timestamp:H});let b;try{for(let C=N;C<u&&!T?.aborted;C++){let U=a.map(async pe=>{let De=await de(pe,x,{signal:T,patternId:B});return j+=De.totalTokens,{agentId:pe,output:De.output}}),$=await Promise.all(U);if(T?.aborted)break;let ue=JSON.stringify({round:C+1,totalRounds:u,proposals:$.map(pe=>({agentId:pe.agentId,proposal:pe.output}))}),te=await de(l,ue,{signal:T,patternId:B});j+=te.totalTokens;let re=q(te.output);if(a.includes(re.winnerId)||(re.winnerId=a[0]),k.push({proposals:$,judgement:re}),P&&P.record({type:"debate_round",timestamp:Date.now(),snapshotId:null,patternId:B,round:C+1,totalRounds:u,winnerId:re.winnerId,score:re.score,agentCount:a.length}),F=re.winnerId,M=$.find(pe=>pe.agentId===re.winnerId)?.output??$[0].output,G&&A&&C>N&&(C-N)%m===0){let pe={type:"debate",version:1,id:Ke(),createdAt:new Date().toISOString(),label:`${v}:round-${C+1}`,patternId:B,stepsTotal:u,round:C+1,currentInput:x,rounds:[...k],lastWinnerId:F,lastWinnerOutput:M,tokensConsumed:j};await dt(pe,A,G);}C<u-1&&re.feedback&&(x=`Previous round feedback: ${re.feedback}
65
65
 
66
- Original task: ${t}`);}if(k.length===0)throw new Error("[Directive MultiAgent] Debate aborted before any round completed");let w=p?p(M):M;return {winnerId:F,result:w,rounds:k}}catch(w){throw b=w instanceof Error?w:new Error(String(w)),w}finally{S&&clearTimeout(S),D&&e.signal&&e.signal.removeEventListener("abort",D),o&&J("onPatternComplete",{patternId:B,patternType:"debate",durationMs:Date.now()-H,timestamp:Date.now(),error:b});}}let or=new Set(["__proto__","constructor","prototype","toString","valueOf","hasOwnProperty"]);function pt(e,t){for(let o of Object.keys(t))or.has(o)||(e[o]=t[o]);}function sr(e,t){let o=Object.create(null);for(let[h,T]of Object.entries(t))for(let S of T.produces)o[S]||(o[S]=[]),o[S].push(h);let n=Object.keys(t),a=Object.create(null),l=Object.create(null);for(let h of n)a[h]=0,l[h]=[];for(let[h,T]of Object.entries(t))for(let S of T.requires??[]){let D=o[S];if(D)for(let E of D)E!==h&&(l[E].push(h),a[h]=(a[h]??0)+1);}let u=[];for(let h of n)a[h]===0&&u.push(h);let p=0;for(;u.length>0;){let h=u.shift();p++;for(let T of l[h]??[])a[T]--,a[T]===0&&u.push(T);}if(p!==n.length)throw new Error(`[Directive MultiAgent] goal pattern "${e}": cycle detected in produces/requires graph. Visited ${p}/${n.length} nodes.`)}function ar(e,t){let o=Object.create(null);for(let[n,a]of Object.entries(t))for(let l of a.produces)o[l]||(o[l]=[]),o[l].push(n);for(let[n,a]of Object.entries(o))a.length>1&&console.warn(`[Directive MultiAgent] goal pattern "${e}": fact key "${n}" is produced by multiple nodes: ${a.join(", ")}. Last writer wins.`);}function be(e,...t){if(e)try{return e(...t)}catch(o){console.error("[Directive MultiAgent] goal: user callback threw:",o);return}}async function ir(e,...t){if(e)try{return await e(...t)}catch(o){console.error("[Directive MultiAgent] goal: user callback threw:",o);return}}function on(e,t,o){let n=t.slice(-3),a=n.length>0?n.reduce((p,h)=>p+h.satisfactionDelta,0)/n.length:0,l=null;a>0&&e<1&&(l=Math.ceil((1-e)/a));let u=false;if(t.length>=6){let p=t.slice(-3),h=t.slice(-6,-3),T=p.reduce((D,E)=>D+E.satisfactionDelta,0)/3,S=h.reduce((D,E)=>D+E.satisfactionDelta,0)/3;u=T<S*.5;}return {satisfaction:e,progressRate:a,estimatedStepsRemaining:l,decelerating:u}}function yt(e){return e==null||!Number.isFinite(e)?0:Math.max(0,Math.min(1,e))}async function Gt(e,t,o,n){let{nodes:a,when:l,satisfaction:u,maxSteps:p=50,extract:h,selectionStrategy:T,relaxation:S,onStep:D,onStall:E}=e,q=Object.create(null);for(let[Q,ne]of Object.entries(a))q[Q]={...ne};if(Object.keys(q).length===0)throw new Error("[Directive MultiAgent] goal requires at least one node");let x=o??"__goal";for(let[Q,ne]of Object.entries(q))if(!W[ne.handler]&&!Y[ne.handler])throw new Error(`[Directive MultiAgent] goal node "${Q}" references unregistered handler "${ne.handler}"`);sr(x,q),ar(x,q);for(let[Q,ne]of Object.entries(q))ne.extractOutput||console.warn(`[Directive MultiAgent] goal node "${Q}": no extractOutput defined. Output will be auto-parsed from agent response. Define extractOutput for reliable fact extraction.`);let F=e.signal,M,N,G=e.timeout??3e5;if(G&&!F){let Q=new AbortController;M=setTimeout(()=>Q.abort(),G),F=Q.signal;}else if(G&&F){let Q=new AbortController;M=setTimeout(()=>Q.abort(),G),N=()=>Q.abort(),F.addEventListener("abort",N,{once:true}),F=Q.signal;}let A=Date.now();if(P){let Q=Object.values(q).map(ne=>ne.handler);P.record({type:"pattern_start",timestamp:A,snapshotId:null,patternId:x,patternType:"goal",handlers:Q,taskIds:Q.filter(ne=>Y[ne]!=null)});}J("onPatternStart",{patternId:x,patternType:"goal",input:typeof t=="string"?t:JSON.stringify(t),timestamp:A});let m=Object.create(null);n?pt(m,n.facts):typeof t=="string"?m.input=t:pt(m,t);let v=n?[...n.executionOrder]:[],B=Object.create(null);if(n)for(let[Q,ne]of Object.entries(n.nodeOutputs))B[Q]={output:ne.output,totalTokens:ne.totalTokens};let H=n?[...n.stepMetrics]:[],j=n?[...n.relaxations]:[],b=new Set(n?.completedNodes??[]),w=new Map(n?Object.entries(n.failedNodes).map(([Q,ne])=>[Q,ne]):[]),C=new Map(n?Object.entries(n.nodeInputHashes):[]),U=Object.create(null);if(n)for(let[Q,ne]of Object.entries(n.agentMetrics))U[Q]={runs:ne.runs,avgSatisfactionDelta:ne.runs>0?ne.totalDelta/ne.runs:0,tokens:ne.tokens,totalDelta:ne.totalDelta};let $=n?.stallSteps??0,ue=n?.appliedRelaxationTiers??0,te=n?.lastSatisfaction??0,re,tt=false,pe=n?.step??0,De=e.checkpoint,dr=De?.everyN??5,En=De?.store??we,pr=De?.labelPrefix??"goal",Dn,fr=3;try{for(let ae=pe;ae<p;ae++){if(be(l,m)===!0){tt=!0;let V=Date.now()-A,z=Object.values(B).reduce((oe,fe)=>oe+fe.totalTokens,0);return {achieved:!0,result:be(h,m)??m,facts:{...m},executionOrder:v,nodeResults:B,steps:ae,totalTokens:z,durationMs:V,stepMetrics:H,relaxations:j}}if(F?.aborted){let V=Date.now()-A,z=Object.values(B).reduce((oe,fe)=>oe+fe.totalTokens,0);return {achieved:!1,result:be(h,m)??m,facts:{...m},executionOrder:v,nodeResults:B,steps:ae,totalTokens:z,durationMs:V,stepMetrics:H,relaxations:j,error:"Aborted or timed out"}}let nt=[];for(let[V,z]of Object.entries(q)){if((w.get(V)??0)>=fr)continue;let oe=z.requires??[];if(oe.every(le=>m[le]!=null)){if(b.has(V)){if(!z.allowRerun)continue;let le=JSON.stringify(oe.map(ye=>m[ye]));if(C.get(V)===le)continue}nt.push(V);}}let He=nt;if(T&&nt.length>0){let V=u?be(u,m)??0:be(l,m)===!0?1:0,z=yt(V),oe=on(z,H,ae),fe=Object.create(null);for(let[ye,se]of Object.entries(U))fe[ye]={runs:se.runs,avgSatisfactionDelta:se.runs>0?se.totalDelta/se.runs:0,tokens:se.tokens};let le=T.select(nt,fe,oe);He=le&&le.length>0?le:nt;}if(He.sort((V,z)=>(q[z].priority??0)-(q[V].priority??0)),be(D,ae,{...m},He),He.length===0){$++;let V=!1;if(S)for(let z=ue;z<S.length;z++){let oe=S[z],fe=oe.afterStallSteps??3;if($>=fe){let le=oe.strategy;switch(le.type){case "allow_rerun":for(let ye of le.nodes)b.delete(ye),C.delete(ye);break;case "alternative_nodes":for(let ye of le.nodes){let se=`__relaxation_${z}_${ye.handler}`;q[se]={...ye};}break;case "inject_facts":pt(m,le.facts);break;case "accept_partial":{let ye=Date.now()-A,se=Object.values(B).reduce((ge,_e)=>ge+_e.totalTokens,0);return {achieved:!1,result:be(h,m)??m,facts:{...m},executionOrder:v,nodeResults:B,steps:ae,totalTokens:se,durationMs:ye,stepMetrics:H,relaxations:j,error:`Accepted partial result via relaxation tier "${oe.label}"`}}case "custom":{let ye=be(u,m)??0,se={step:ae,facts:{...m},metrics:on(yt(ye),H,ae),completedNodes:new Set(b),failedNodes:new Map(w)};await ir(le.apply,se);break}}j.push({step:ae,tierIndex:z,label:oe.label,strategy:le.type}),ue=z+1,$=0,V=!0;break}}if(!V){let z=be(u,m)??0,oe=on(yt(z),H,ae);if(be(E,ae,oe),!S||ue>=S.length){let fe=Date.now()-A,le=Object.values(B).reduce((ye,se)=>ye+se.totalTokens,0);return {achieved:!1,result:be(h,m)??m,facts:{...m},executionOrder:v,nodeResults:B,steps:ae,totalTokens:le,durationMs:fe,stepMetrics:H,relaxations:j,error:"Goal stalled: no ready nodes and no remaining relaxation tiers"}}}continue}$=0;let gr=Date.now(),mr=u?be(u,m)??0:be(l,m)===!0?1:0,hr=yt(mr),On=0,ft=[],br=He.map(async V=>{let z=q[V],oe=z.requires??[],fe=JSON.stringify(oe.map(se=>m[se]));C.set(V,fe);let le,ye=be(z.buildInput,m);if(ye!=null)le=ye;else {let se=Object.create(null);for(let ge of oe)m[ge]!=null&&(se[ge]=m[ge]);Object.keys(se).length>0?le=JSON.stringify(se):m.input!=null?le=String(m.input):le=JSON.stringify(m);}try{let se=await de(z.handler,le,{signal:F??void 0,patternId:x});if(B[V]=se,v.push(V),b.add(V),w.delete(V),z.extractOutput){let ge=be(z.extractOutput,se);ge&&(pt(m,ge),ft.push(...Object.keys(ge)));}else {let ge=se.output;if(ge&&typeof ge=="object")pt(m,ge),ft.push(...Object.keys(ge));else if(typeof ge=="string")try{let _e=JSON.parse(ge);if(_e&&typeof _e=="object"&&!Array.isArray(_e))pt(m,_e),ft.push(...Object.keys(_e));else for(let Pn of z.produces)m[Pn]=ge,ft.push(Pn);}catch{for(let _e of z.produces)m[_e]=ge,ft.push(_e);}}return On+=se.totalTokens,{nodeId:V,success:!0}}catch(se){let ge=(w.get(V)??0)+1;return w.set(V,ge),{nodeId:V,success:!1,error:se}}});await Promise.allSettled(br);let yr=u?be(u,m)??0:be(l,m)===!0?1:0,Lt=yt(yr),Bt=Lt-hr;if(H.push({step:ae,durationMs:Date.now()-gr,nodesRun:[...He],factsProduced:ft,satisfaction:Lt,satisfactionDelta:Bt,tokensConsumed:On}),P)for(let V of He){let z=q[V];P.record({type:"goal_step",timestamp:Date.now(),snapshotId:null,agentId:z.handler,step:ae,nodeId:V,satisfaction:Lt,satisfactionDelta:Bt});}for(let V of He){let z=q[V];U[z.handler]||(U[z.handler]={runs:0,avgSatisfactionDelta:0,tokens:0,totalDelta:0});let oe=U[z.handler];oe.runs++,oe.totalDelta+=Bt,oe.tokens+=B[V]?.totalTokens??0;}if(te=Lt,Bt<=0?$++:$=0,De&&En&&ae>pe&&(ae-pe)%dr===0){let V={type:"goal",version:1,id:Ke(),createdAt:new Date().toISOString(),label:`${pr}:step-${ae}`,patternId:x,stepsTotal:p,step:ae+1,facts:structuredClone(m),completedNodes:[...b],failedNodes:Object.fromEntries(w),nodeInputHashes:Object.fromEntries(C),nodeOutputs:Object.fromEntries(Object.entries(B).map(([oe,fe])=>[oe,{output:fe.output,totalTokens:fe.totalTokens}])),executionOrder:[...v],stepMetrics:[...H],relaxations:[...j],appliedRelaxationTiers:ue,stallSteps:$,lastSatisfaction:te,agentMetrics:Object.fromEntries(Object.entries(U).map(([oe,fe])=>[oe,{runs:fe.runs,totalDelta:fe.totalDelta,tokens:fe.tokens}]))},z=await dt(V,En,De);z&&(Dn=z);}}let Q=Date.now()-A,ne=Object.values(B).reduce((ae,nt)=>ae+nt.totalTokens,0);return {achieved:!1,result:be(h,m)??m,facts:{...m},executionOrder:v,nodeResults:B,steps:p,totalTokens:ne,durationMs:Q,stepMetrics:H,relaxations:j,error:`Max steps (${p}) exhausted without achieving goal`}}catch(Q){throw re=Q instanceof Error?Q:new Error(String(Q)),Q}finally{if(M!=null&&clearTimeout(M),N&&e.signal&&e.signal.removeEventListener("abort",N),P){let Q=Object.values(B).reduce((ne,ae)=>ne+ae.totalTokens,0);P.record({type:"pattern_complete",timestamp:Date.now(),snapshotId:null,patternId:x,patternType:"goal",durationMs:Date.now()-A,achieved:tt,stepMetrics:H,relaxations:j,totalTokens:Q,...re?{error:re.message}:{}});}J("onPatternComplete",{patternId:x,patternType:"goal",durationMs:Date.now()-A,timestamp:Date.now(),error:re});}}function ur(e){if(!Z)return [];let t=[],o=new Set;if(o.add(e),Z.equivalencyGroups){for(let n of Object.values(Z.equivalencyGroups))if(n.includes(e))for(let a of n)!o.has(a)&&W[a]&&(t.push(a),o.add(a));}if(Z.useCapabilities!==false){let n=W[e];if(n?.capabilities&&n.capabilities.length>0)for(let[a,l]of Object.entries(W)){if(o.has(a))continue;let u=l.capabilities??[];n.capabilities.every(p=>u.includes(p))&&(t.push(a),o.add(a));}}if(Ae){let n=Z.healthThreshold??30;return t.filter(a=>Ae.getHealthScore(a)>n)}return t}function lr(e){if(e.length===0)return null;if(!Z||!Ae)return e[0]??null;if(Z.selectionStrategy==="round-robin"&&Ne){let n=[...e].sort().join(","),a=Ne.get(n)??0,l=e[a%e.length];return Ne.set(n,a+1),l}let t=e[0],o=Ae.getHealthScore(t);for(let n=1;n<e.length;n++){let a=Ae.getHealthScore(e[n]);a>o&&(t=e[n],o=a);}return t}function cr(e){switch(e.type){case "parallel":return e.handlers;case "sequential":return e.handlers;case "supervisor":return [e.supervisor,...e.workers];case "dag":return Object.values(e.nodes).map(t=>t.handler);case "reflect":return [e.handler,e.evaluator];case "race":return e.handlers;case "debate":return [...e.handlers,e.evaluator];case "goal":return Object.values(e.nodes).map(t=>t.handler);default:return []}}let Cn={system:K,get facts(){return K.facts},get timeline(){return P},get healthMonitor(){return Ae},get derived(){return Object.freeze({...ut})},onDerivedChange(e){return It.add(e),()=>{It.delete(e);}},get scratchpad(){return Zt},runAgent:de,runAgentStream:en,async runPattern(e,t){X();let o=d$1[e];if(!o){let l=Object.keys(d$1).join(", ")||"(none)";throw new Error(`[Directive MultiAgent] Unknown pattern "${e}". Available patterns: ${l}`)}let n=Date.now();if(P){let l=cr(o);P.record({type:"pattern_start",timestamp:n,snapshotId:null,patternId:e,patternType:o.type,handlers:l,taskIds:l.filter(u=>Y[u]!=null)});}let a;try{switch(o.type){case "parallel":return await rr(o,t,e);case "sequential":return await tn(o,t,e);case "supervisor":return await nn(o,t,e);case "dag":return await rn(o,t,e);case "reflect":return await Nt(o,t,e);case "race":return (await An(o,t,e)).result;case "debate":return (await qt(o,t,e)).result;case "goal":return (await Gt(o,t,e)).result;default:throw new Error(`[Directive MultiAgent] Unknown pattern type: ${o.type}`)}}catch(l){throw a=l instanceof Error?l:new Error(String(l)),l}finally{P&&P.record({type:"pattern_complete",timestamp:Date.now(),snapshotId:null,patternId:e,patternType:o.type,durationMs:Date.now()-n,...a?{error:a.message}:{}});}},async runParallel(e,t,o,n){X();let a=Array.isArray(t)?t:e.map(()=>t);if(a.length!==e.length)throw new Error(`[Directive MultiAgent] Input count (${a.length}) must match agent count (${e.length})`);let l=new AbortController,u;n?.timeout&&(u=setTimeout(()=>l.abort(),n.timeout));try{let p=e.map((S,D)=>de(S,a[D],{signal:l.signal}).catch(E=>{if(n?.minSuccess!==void 0)return null;throw E})),h=await Promise.all(p),T=h.filter(S=>S!==null);if(n?.minSuccess!==void 0&&T.length<n.minSuccess){let S=h.length-T.length;throw new Error(`[Directive MultiAgent] runParallel: Only ${T.length}/${e.length} agents succeeded (minimum required: ${n.minSuccess}, failed: ${S})`)}return o(T)}finally{u&&clearTimeout(u);}},async runSequential(e,t,o){X();let n=[],a=t;for(let l=0;l<e.length;l++){let u=e[l],p=await de(u,a);n.push(p),l<e.length-1&&(o?.transform?a=o.transform(p.output,u,l):a=typeof p.output=="string"?p.output:safeStringify(p.output));}return n},async handoff(e,t,o,n){if(X(),!W[e]){let u=Object.keys(W).join(", ")||"(none)";throw new Error(`[Directive MultiAgent] Handoff source agent "${e}" not found. Registered: ${u}`)}if(!W[t]){let u=Object.keys(W).join(", ")||"(none)";throw new Error(`[Directive MultiAgent] Handoff target agent "${t}" not found. Registered: ${u}`)}{let u=await et("pre_handoff",e,W[e].agent.name,o,void 0,{handoff:{fromAgent:e,toAgent:t}});if(u.skip)return {output:void 0,messages:[],toolCalls:[],totalTokens:0};o=u.input;}let a={id:`handoff-${++_t}`,fromAgent:e,toAgent:t,input:o,context:n,requestedAt:Date.now()};Pe.push(a);try{f?.(a);}catch(u){ee&&console.debug("[Directive MultiAgent] onHandoff threw:",u);}J("onHandoff",a),P&&P.record({type:"handoff_start",timestamp:Date.now(),snapshotId:null,fromAgent:e,toAgent:t});let l=W[t].memory??_;if(l&&n)try{let u=Object.entries(n).map(([p,h])=>`${p}: ${safeStringify(h)}`).join(", ");l.addMessages([{role:"system",content:`[Handoff from ${e}] Context: ${u}`}]);}catch(u){ee&&console.debug("[Directive MultiAgent] Handoff addMessages failed:",u);}try{let u=await de(t,o),p={request:a,result:u,completedAt:Date.now()};Zn(p);try{g$1?.(p);}catch(T){ee&&console.debug("[Directive MultiAgent] onHandoffComplete threw:",T);}J("onHandoffComplete",p),P&&P.record({type:"handoff_complete",timestamp:Date.now(),snapshotId:null,fromAgent:e,toAgent:t,durationMs:p.completedAt-a.requestedAt});let h=Pe.indexOf(a);return h>=0&&Pe.splice(h,1),u}catch(u){let p=Pe.indexOf(a);throw p>=0&&Pe.splice(p,1),u}},approve(e){X();let t=it.get(e);if(t){it.delete(e);let o=ie(t);K.batch(()=>{let n=gt(o),a=200,l=[...n.approved,e];Je(o,{...n,pending:n.pending.filter(u=>u.id!==e),approved:l.length>a?l.slice(-a):l});});return}ee&&console.debug(`[Directive MultiAgent] approve() ignored: no pending request "${e}"`);},reject(e,t){X();let o=it.get(e);if(o){it.delete(e);let n=ie(o);K.batch(()=>{let a=gt(n);t&&ee&&console.debug(`[Directive MultiAgent] Request ${e} rejected: ${t}`);let l={id:e,reason:t,rejectedAt:Date.now()},u=200,p=[...a.rejected,l];Je(n,{...a,pending:a.pending.filter(h=>h.id!==e),rejected:p.length>u?p.slice(-u):p});});return}ee&&console.debug(`[Directive MultiAgent] reject() ignored: no pending request "${e}"`);},pause(){X(),qe="paused",ee&&console.debug("[Directive MultiAgent] Orchestrator paused");},resume(){X(),qe==="paused"&&(qe="idle",ee&&console.debug("[Directive MultiAgent] Orchestrator resumed"));},getAgentState(e){let t=ve[e];return t?{...t}:void 0},getAllAgentStates(){return Object.fromEntries(Object.entries(ve).map(([e,t])=>[e,{...t}]))},getPendingHandoffs(){return [...Pe]},get totalTokens(){return Xe},waitForIdle(e){let t=()=>Mt===0&&Object.values(ve).every(o=>o.status==="idle"||o.status==="completed"||o.status==="error");return t()?Promise.resolve():new Promise((o,n)=>{let a=null,l=()=>{jt.delete(u),a&&clearTimeout(a);},u=()=>{t()&&(l(),o());};jt.add(u),e!==void 0&&(a=setTimeout(()=>{l(),n(new Error(`[Directive MultiAgent] waitForIdle timed out after ${e}ms`));},e));})},run(e,t,o){return de(e,t,o)},runStream(e,t,o){return en(e,t,o)},registerAgent(e,t){if(X(),Ot.has(e))throw new Error(`[Directive MultiAgent] Agent ID "${e}" is reserved and cannot be used`);if(W[e])throw new Error(`[Directive MultiAgent] Agent "${e}" is already registered. Unregister first.`);if(Y[e])throw new Error(`[Directive MultiAgent] ID "${e}" is already registered as a task`);let o=t.constraints?Jt(t.constraints):{},n=Object.create(null);if(t.resolvers)for(let[l,u]of Object.entries(t.resolvers))n[l]={requirement:u.requirement,key:u.key,resolve:async(p,h)=>{let T=Ce(h.facts),D={facts:{...h.facts,...T},runAgent:async(E,q,k)=>r(E,q,k),signal:h.signal};return u.resolve(p,D)}};let a=createModule(e,{schema:i,init:l=>{Ue(l,{status:"idle",currentAgent:t.agent.name,input:null,output:null,error:null,tokenUsage:0,turnCount:0,startedAt:null,completedAt:null}),Je(l,{pending:[],approved:[],rejected:[]}),mt(l,[]),ht(l,[]),ze(l,Ct());},constraints:o,resolvers:Object.keys(n).length>0?n:void 0});K.registerModule(e,a),W[e]=t,Ge.set(e,new Ee(t.maxConcurrent??1)),ve[e]={status:"idle",runCount:0,totalTokens:0},ee&&console.debug(`[Directive MultiAgent] Registered agent "${e}" (${t.agent.name})`),Me();},unregisterAgent(e){if(X(),!W[e])throw new Error(`[Directive MultiAgent] Agent "${e}" is not registered`);if(ve[e]?.status==="running")throw new Error(`[Directive MultiAgent] Cannot unregister agent "${e}" while it is running`);for(let[a,l]of Object.entries(d$1)){let u;switch(l.type){case "supervisor":u=[l.supervisor,...l.workers];break;case "dag":u=Object.values(l.nodes).map(p=>p.handler);break;case "reflect":u=[l.handler,l.evaluator];break;case "parallel":case "sequential":case "race":u=l.handlers;break;case "debate":u=[...l.handlers,l.evaluator];break;default:u=[];}u.includes(e)&&console.warn(`[Directive MultiAgent] Warning: Pattern "${a}" references unregistered agent "${e}"`);}let o=Ge.get(e);o&&(o.drain(),Ge.delete(e));let n=ie(e);n&&K.batch(()=>{Ue(n,{status:"idle",currentAgent:null,input:null,output:null,error:null,tokenUsage:0,turnCount:0,startedAt:null,completedAt:null}),Je(n,{pending:[],approved:[],rejected:[]}),mt(n,[]),ht(n,[]),ze(n,Ct());}),delete W[e],delete ve[e],ee&&console.debug(`[Directive MultiAgent] Unregistered agent "${e}"`),Me();},getAgentIds(){return Object.keys(W)},registerTask(e,t){if(X(),Ot.has(e))throw new Error(`[Directive MultiAgent] Task ID "${e}" is reserved and cannot be used`);if(!e||typeof e!="string"||e.trim()!==e||e.length===0)throw new Error("[Directive MultiAgent] Task ID must be a non-empty trimmed string");if(W[e])throw new Error(`[Directive MultiAgent] ID "${e}" is already registered as an agent`);if(Y[e])throw new Error(`[Directive MultiAgent] Task "${e}" is already registered`);if(t.timeout!==void 0&&(!Number.isFinite(t.timeout)||t.timeout<=0))throw new Error(`[Directive MultiAgent] Task "${e}" timeout must be a finite number > 0`);if(t.maxConcurrent!==void 0&&(!Number.isFinite(t.maxConcurrent)||t.maxConcurrent<1||!Number.isInteger(t.maxConcurrent)))throw new Error(`[Directive MultiAgent] Task "${e}" maxConcurrent must be a finite integer >= 1`);if(t.retry){let{attempts:o,delayMs:n}=t.retry;if(!Number.isFinite(o)||o<1)throw new Error(`[Directive MultiAgent] Task "${e}" retry attempts must be a finite number >= 1`);if(n!==void 0&&(!Number.isFinite(n)||n<0))throw new Error(`[Directive MultiAgent] Task "${e}" retry delayMs must be a finite number >= 0`)}Y[e]=t,xe[e]={status:"idle"},$e.set(e,new Ee(t.maxConcurrent??1)),ee&&console.debug(`[Directive MultiAgent] Registered task "${e}" (${t.label??e})`);},unregisterTask(e){if(X(),!Y[e])throw new Error(`[Directive MultiAgent] Task "${e}" is not registered`);if(xe[e]?.status==="running")throw new Error(`[Directive MultiAgent] Cannot unregister task "${e}" while it is running`);let o=$e.get(e);o&&(o.drain(),$e.delete(e)),delete Y[e],delete xe[e],ee&&console.debug(`[Directive MultiAgent] Unregistered task "${e}"`);},getTaskIds(){return Object.keys(Y)},getTaskRegistry(){let e=Object.create(null);for(let[t,o]of Object.entries(Y))e[t]={label:o.label,description:o.description};return e},getTaskState(e){let t=xe[e];return t?Object.freeze(structuredClone(t)):void 0},getAllTaskStates(){let e=Object.create(null);for(let[t,o]of Object.entries(xe))e[t]=Object.freeze(structuredClone(o));return e},getNodeIds(){return [...Object.keys(W),...Object.keys(Y)]},reset(){X();for(let t of Object.keys(W)){let o=W[t]?.maxConcurrent??1;ve[t]={status:"idle",runCount:0,totalTokens:0};let n=Ge.get(t);n&&n.drain(),Ge.set(t,new Ee(o));let a=ie(t);K.batch(()=>{Ue(a,{status:"idle",currentAgent:W[t].agent.name,input:null,output:null,error:null,tokenUsage:0,turnCount:0,startedAt:null,completedAt:null}),Je(a,{pending:[],approved:[],rejected:[]}),mt(a,[]),ht(a,[]),ze(a,Ct());});}for(let t of Object.keys(Y)){xe[t]={status:"idle"};let o=$e.get(t);o&&o.drain(),$e.set(t,new Ee(Y[t].maxConcurrent??1));}ct.clear(),bt.clear(),it.clear(),Pe.length=0,Ze.length=0,_t=0,Xe=0,qe="idle",Mt=0,Qe();let e=ie("__coord");K.batch(()=>{setBridgeFact(e,"__globalTokens",0),setBridgeFact(e,"__status","idle"),setBridgeFact(e,"__handoffs",[]),setBridgeFact(e,"__handoffResults",[]),setBridgeFact(e,"__budgetWarningFired",false),Ie&&setBridgeFact(e,h,{...Ie.init});}),Ae&&Ae.reset(),Oe=null;for(let t of Object.keys(ut))delete ut[t];Me();},async checkpoint(e){X();for(let[o,n]of Object.entries(ve))if(n.status==="running")throw new Error(`[Directive MultiAgent] Cannot checkpoint while agent "${o}" is running`);for(let[o,n]of Object.entries(xe))if(n.status==="running")throw new Error(`[Directive MultiAgent] Cannot checkpoint while task "${o}" is running`);if(!K.history?.export)throw new Error("[Directive MultiAgent] Checkpointing requires history. Set `debug: true` in orchestrator options.");let t={version:1,id:Ke(),createdAt:new Date().toISOString(),label:e?.label,systemExport:K.history.export(),timelineExport:P?.export()??null,localState:{type:"multi",globalTokenCount:Xe,globalStatus:qe,agentStates:Object.fromEntries(Object.entries(ve).map(([o,n])=>[o,structuredClone(n)])),handoffCounter:_t,pendingHandoffs:[...Pe],handoffResults:[...Ze],roundRobinCounters:Ne?Object.fromEntries(Ne):null,taskStates:Object.fromEntries(Object.entries(xe).map(([o,n])=>[o,{lastOutput:n.lastOutput!=null?String(n.lastOutput):void 0,lastError:n.lastError}]))},memoryExport:_?_.export?.()??null:null,orchestratorType:"multi"};return we&&await we.save(t),t},restore(e,t){if(X(),!fn(e))throw new Error("[Directive MultiAgent] Invalid checkpoint data");if(e.orchestratorType!=="multi")throw new Error(`[Directive MultiAgent] Expected multi-agent checkpoint, got "${e.orchestratorType}"`);if(!K.history?.import)throw new Error("[Directive MultiAgent] Restoring a checkpoint requires history. Set `debug: true` in orchestrator options.");K.history.import(e.systemExport),t?.restoreTimeline!==false&&e.timelineExport&&P&&P.import(e.timelineExport),e.memoryExport&&_&&_.import&&_.import(e.memoryExport);let o=e.localState;Xe=o.globalTokenCount,qe=o.globalStatus,_t=o.handoffCounter,Pe.length=0,Pe.push(...o.pendingHandoffs),Ze.length=0,Ze.push(...o.handoffResults);for(let[n,a]of Object.entries(o.agentStates))ve[n]&&(ve[n]={...a});if(o.roundRobinCounters&&Ne){Ne.clear();for(let[n,a]of Object.entries(o.roundRobinCounters))Ne.set(n,a);}for(let[n,a]of Object.entries(W)){let l=Ge.get(n);l&&l.drain(),Ge.set(n,new Ee(a.maxConcurrent??1));}if(o.taskStates){for(let[n,a]of Object.entries(o.taskStates)){if(!Y[n])throw new Error(`[Directive MultiAgent] Checkpoint references task "${n}" which is not registered. Task run functions cannot be serialized \u2014 re-provide the task registration.`);xe[n]={status:"idle",lastOutput:a.lastOutput,lastError:a.lastError};}for(let[n,a]of Object.entries(Y)){let l=$e.get(n);l&&l.drain(),$e.set(n,new Ee(a.maxConcurrent??1));}}Me();},runParallelStream(e,t,o,n){X();let a=Array.isArray(t)?t:e.map(()=>t);if(a.length!==e.length)throw new Error(`[Directive MultiAgent] Input count (${a.length}) must match agent count (${e.length})`);let l=new AbortController,u;n?.timeout&&(u=setTimeout(()=>l.abort(),n.timeout));let p=e.map((k,x)=>{let F=en(k,a[x],{signal:l.signal});return {agentId:k,streamResult:F}}),h=p.map(({agentId:k,streamResult:x})=>({agentId:k,stream:x.stream})),{stream:T,getDroppedCount:S}=Hn(h),D;n?.signal&&(D=()=>l.abort(),n.signal.addEventListener("abort",D,{once:true}));let E=Promise.allSettled(p.map(({streamResult:k})=>k.result)).then(k=>{u&&clearTimeout(u),D&&n?.signal&&n.signal.removeEventListener("abort",D);let x=[];for(let F of k)F.status==="fulfilled"&&x.push(F.value);if(n?.minSuccess!==void 0&&x.length<n.minSuccess)throw new Error(`[Directive MultiAgent] runParallelStream: Only ${x.length}/${e.length} agents succeeded (minimum required: ${n.minSuccess})`);return x}),q=E.then(k=>o(k));return E.catch(()=>{}),q.catch(()=>{}),{stream:T,results:E,merge:q,getDroppedCount:S,abort:()=>{l.abort(),D&&n?.signal&&n.signal.removeEventListener("abort",D);for(let{streamResult:k}of p)k.abort();}}},async runRace(e,t,o){X();let n={type:"race",handlers:e,extract:o?.extract,timeout:o?.timeout,minSuccess:o?.minSuccess,signal:o?.signal};return An(n,t,"__imperative_race")},async runReflect(e,t,o,n){X();let a={type:"reflect",handler:e,evaluator:t,maxIterations:n?.maxIterations,parseEvaluation:n?.parseEvaluation,buildRetryInput:n?.buildRetryInput,extract:n?.extract,onExhausted:n?.onExhausted,onIteration:n?.onIteration,signal:n?.signal,timeout:n?.timeout,threshold:n?.threshold},l=await Nt(a,o,"__imperative_reflect"),u=Oe?[...Oe]:[],p=n?.maxIterations??2,h=u.length>0&&!u[u.length-1].passed&&u.length>=p;return {result:l,iterations:u.length,history:u,exhausted:h}},async runDebate(e,t,o,n){return X(),qt({handlers:e,evaluator:t,maxRounds:n?.maxRounds,extract:n?.extract,parseJudgement:n?.parseJudgement,signal:n?.signal,timeout:n?.timeout},o,"__imperative_debate")},async runGoal(e,t,o,n){return X(),Gt({nodes:e,when:o,satisfaction:n?.satisfaction,maxSteps:n?.maxSteps,extract:n?.extract,timeout:n?.timeout,signal:n?.signal,selectionStrategy:n?.selectionStrategy,relaxation:n?.relaxation,onStep:n?.onStep,onStall:n?.onStall,checkpoint:n?.checkpoint},t,"__imperative_goal")},async resumeGoal(e,t){if(X(),!e||e.version!==1||e.type!=="goal")throw new Error("[Directive MultiAgent] Invalid goal checkpoint state");return Gt(t,{},e.patternId,e)},async resumeSequential(e,t){if(X(),!e||e.version!==1||e.type!=="sequential")throw new Error("[Directive MultiAgent] Invalid sequential checkpoint state");return tn(t,e.currentInput,e.patternId,e)},async resumeSupervisor(e,t,o){if(X(),!e||e.version!==1||e.type!=="supervisor")throw new Error("[Directive MultiAgent] Invalid supervisor checkpoint state");let n=o?.input??e.currentInput;return nn(t,n,e.patternId,e)},async resumeReflect(e,t,o){if(X(),!e||e.version!==1||e.type!=="reflect")throw new Error("[Directive MultiAgent] Invalid reflect checkpoint state");let n=o?.input??e.effectiveInput;return Nt(t,n,e.patternId,e)},async resumeDebate(e,t){if(X(),!e||e.version!==1||e.type!=="debate")throw new Error("[Directive MultiAgent] Invalid debate checkpoint state");return qt(t,e.currentInput,e.patternId,e)},async resumeDag(e,t,o){if(X(),!e||e.version!==1||e.type!=="dag")throw new Error("[Directive MultiAgent] Invalid DAG checkpoint state");let n=o?.input??e.input;return rn(t,n,e.patternId,e)},async replay(e,t,o){if(X(),!we)throw new Error("[Directive MultiAgent] No checkpoint store configured");let n=await we.load(e);if(!n)throw new Error(`[Directive MultiAgent] Checkpoint not found: ${e}`);let a;try{let p=JSON.parse(n.systemExport);if(!p||typeof p!="object")throw new Error("Parsed checkpoint state is not an object");let h=new Set(["__proto__","constructor","prototype"]);for(let S of Object.keys(p))if(h.has(S))throw new Error(`Checkpoint state contains blocked key: ${S}`);if(!new Set(["sequential","supervisor","reflect","debate","dag","goal"]).has(p.type))throw new Error(`Unknown checkpoint pattern type: ${p.type}`);if(p.version!==1)throw new Error(`Unsupported checkpoint version: ${p.version}`);a=p;}catch(p){throw new Error(`[Directive MultiAgent] Invalid checkpoint state: ${p instanceof Error?p.message:String(p)}`)}let l=ot(a),u=o?.input??("currentInput"in a?a.currentInput:"");switch(P&&P.record({type:"checkpoint_restore",timestamp:Date.now(),snapshotId:null,checkpointId:e,patternType:a.type,step:l}),a.type){case "sequential":return tn(t,u,a.patternId,a);case "supervisor":return nn(t,u,a.patternId,a);case "reflect":return Nt(t,u,a.patternId,a);case "debate":return qt(t,u,a.patternId,a);case "dag":return rn(t,u,a.patternId,a);case "goal":return Gt(t,a.facts,a.patternId,a)}},resumeBreakpoint(e,t){X(),t&&ct.set(e,t);for(let o of Object.keys(W)){let n=ie(o);if(We(n).pending.some(l=>l.id===e)){K.batch(()=>{let l=We(n),u=[...l.resolved,e];ze(n,{...l,pending:l.pending.filter(p=>p.id!==e),resolved:u.length>At?u.slice(-At):u});});return}}ee&&console.debug(`[Directive MultiAgent] resumeBreakpoint() ignored: no pending breakpoint "${e}"`);},cancelBreakpoint(e,t){X(),t&&bt.set(e,t);for(let o of Object.keys(W)){let n=ie(o);if(We(n).pending.some(l=>l.id===e)){K.batch(()=>{let l=We(n),u=[...l.cancelled,e];ze(n,{...l,pending:l.pending.filter(p=>p.id!==e),cancelled:u.length>At?u.slice(-At):u});});return}}ee&&console.debug(`[Directive MultiAgent] cancelBreakpoint() ignored: no pending breakpoint "${e}"`);},getPendingBreakpoints(){let e=[];for(let t of Object.keys(W)){let o=ie(t),n=We(o);e.push(...n.pending);}return e},getLastReflectionHistory(){return Oe?[...Oe]:null},destroy(){Xt||(Cn.reset(),$t.clear(),lt.clear(),It.clear(),jt.clear(),Xt=true,K.destroy());}};return Me(),Cn}export{mo as $,Vr as A,Yr as B,Xr as C,Zr as D,Qr as E,eo as F,to as G,no as H,ro as I,Hn as J,xt as K,Br as L,mn as M,Ee as N,ot as O,xr as P,Cr as Q,Er as R,hn as S,ao as T,io as U,uo as V,lo as W,co as X,po as Y,fo as Z,go as _,cn as a,ho as aa,jr as b,yo as ba,Ht as c,ko as ca,Ut as d,To as da,qn as e,So as ea,St as f,xo as fa,Ue as g,Ao as ga,gt as h,Co as ha,Je as i,Eo as ia,dn as j,Do as ja,mt as k,Un as ka,pn as l,Oo as la,ht as m,Po as ma,We as n,Mo as na,ze as o,_o as oa,Ce as p,jo as pa,Jt as q,Io as qa,Gr as r,Zo as ra,At as s,Gn as t,Ln as u,Ct as v,Ke as w,fn as x,Fn as y,Kr as z};//# sourceMappingURL=chunk-G7CRWJT7.js.map
67
- //# sourceMappingURL=chunk-G7CRWJT7.js.map
66
+ Original task: ${t}`);}if(k.length===0)throw new Error("[Directive MultiAgent] Debate aborted before any round completed");let w=p?p(M):M;return {winnerId:F,result:w,rounds:k}}catch(w){throw b=w instanceof Error?w:new Error(String(w)),w}finally{S&&clearTimeout(S),D&&e.signal&&e.signal.removeEventListener("abort",D),o&&J("onPatternComplete",{patternId:B,patternType:"debate",durationMs:Date.now()-H,timestamp:Date.now(),error:b});}}let or=new Set(["__proto__","constructor","prototype","toString","valueOf","hasOwnProperty"]);function pt(e,t){for(let o of Object.keys(t))or.has(o)||(e[o]=t[o]);}function sr(e,t){let o=Object.create(null);for(let[h,T]of Object.entries(t))for(let S of T.produces)o[S]||(o[S]=[]),o[S].push(h);let n=Object.keys(t),a=Object.create(null),l=Object.create(null);for(let h of n)a[h]=0,l[h]=[];for(let[h,T]of Object.entries(t))for(let S of T.requires??[]){let D=o[S];if(D)for(let E of D)E!==h&&(l[E].push(h),a[h]=(a[h]??0)+1);}let u=[];for(let h of n)a[h]===0&&u.push(h);let p=0;for(;u.length>0;){let h=u.shift();p++;for(let T of l[h]??[])a[T]--,a[T]===0&&u.push(T);}if(p!==n.length)throw new Error(`[Directive MultiAgent] goal pattern "${e}": cycle detected in produces/requires graph. Visited ${p}/${n.length} nodes.`)}function ar(e,t){let o=Object.create(null);for(let[n,a]of Object.entries(t))for(let l of a.produces)o[l]||(o[l]=[]),o[l].push(n);for(let[n,a]of Object.entries(o))a.length>1&&console.warn(`[Directive MultiAgent] goal pattern "${e}": fact key "${n}" is produced by multiple nodes: ${a.join(", ")}. Last writer wins.`);}function be(e,...t){if(e)try{return e(...t)}catch(o){console.error("[Directive MultiAgent] goal: user callback threw:",o);return}}async function ir(e,...t){if(e)try{return await e(...t)}catch(o){console.error("[Directive MultiAgent] goal: user callback threw:",o);return}}function on(e,t,o){let n=t.slice(-3),a=n.length>0?n.reduce((p,h)=>p+h.satisfactionDelta,0)/n.length:0,l=null;a>0&&e<1&&(l=Math.ceil((1-e)/a));let u=false;if(t.length>=6){let p=t.slice(-3),h=t.slice(-6,-3),T=p.reduce((D,E)=>D+E.satisfactionDelta,0)/3,S=h.reduce((D,E)=>D+E.satisfactionDelta,0)/3;u=T<S*.5;}return {satisfaction:e,progressRate:a,estimatedStepsRemaining:l,decelerating:u}}function yt(e){return e==null||!Number.isFinite(e)?0:Math.max(0,Math.min(1,e))}async function Gt(e,t,o,n){let{nodes:a,when:l,satisfaction:u,maxSteps:p=50,extract:h,selectionStrategy:T,relaxation:S,onStep:D,onStall:E}=e,q=Object.create(null);for(let[Q,ne]of Object.entries(a))q[Q]={...ne};if(Object.keys(q).length===0)throw new Error("[Directive MultiAgent] goal requires at least one node");let x=o??"__goal";for(let[Q,ne]of Object.entries(q))if(!W[ne.handler]&&!Y[ne.handler])throw new Error(`[Directive MultiAgent] goal node "${Q}" references unregistered handler "${ne.handler}"`);sr(x,q),ar(x,q);for(let[Q,ne]of Object.entries(q))ne.extractOutput||console.warn(`[Directive MultiAgent] goal node "${Q}": no extractOutput defined. Output will be auto-parsed from agent response. Define extractOutput for reliable fact extraction.`);let F=e.signal,M,N,G=e.timeout??3e5;if(G&&!F){let Q=new AbortController;M=setTimeout(()=>Q.abort(),G),F=Q.signal;}else if(G&&F){let Q=new AbortController;M=setTimeout(()=>Q.abort(),G),N=()=>Q.abort(),F.addEventListener("abort",N,{once:true}),F=Q.signal;}let A=Date.now();if(P){let Q=Object.values(q).map(ne=>ne.handler);P.record({type:"pattern_start",timestamp:A,snapshotId:null,patternId:x,patternType:"goal",handlers:Q,taskIds:Q.filter(ne=>Y[ne]!=null)});}J("onPatternStart",{patternId:x,patternType:"goal",input:typeof t=="string"?t:JSON.stringify(t),timestamp:A});let m=Object.create(null);n?pt(m,n.facts):typeof t=="string"?m.input=t:pt(m,t);let v=n?[...n.executionOrder]:[],B=Object.create(null);if(n)for(let[Q,ne]of Object.entries(n.nodeOutputs))B[Q]={output:ne.output,totalTokens:ne.totalTokens};let H=n?[...n.stepMetrics]:[],j=n?[...n.relaxations]:[],b=new Set(n?.completedNodes??[]),w=new Map(n?Object.entries(n.failedNodes).map(([Q,ne])=>[Q,ne]):[]),C=new Map(n?Object.entries(n.nodeInputHashes):[]),U=Object.create(null);if(n)for(let[Q,ne]of Object.entries(n.agentMetrics))U[Q]={runs:ne.runs,avgSatisfactionDelta:ne.runs>0?ne.totalDelta/ne.runs:0,tokens:ne.tokens,totalDelta:ne.totalDelta};let $=n?.stallSteps??0,ue=n?.appliedRelaxationTiers??0,te=n?.lastSatisfaction??0,re,tt=false,pe=n?.step??0,De=e.checkpoint,dr=De?.everyN??5,En=De?.store??we,pr=De?.labelPrefix??"goal",Dn,fr=3;try{for(let ae=pe;ae<p;ae++){if(be(l,m)===!0){tt=!0;let V=Date.now()-A,z=Object.values(B).reduce((oe,fe)=>oe+fe.totalTokens,0);return {achieved:!0,result:be(h,m)??m,facts:{...m},executionOrder:v,nodeResults:B,steps:ae,totalTokens:z,durationMs:V,stepMetrics:H,relaxations:j}}if(F?.aborted){let V=Date.now()-A,z=Object.values(B).reduce((oe,fe)=>oe+fe.totalTokens,0);return {achieved:!1,result:be(h,m)??m,facts:{...m},executionOrder:v,nodeResults:B,steps:ae,totalTokens:z,durationMs:V,stepMetrics:H,relaxations:j,error:"Aborted or timed out"}}let nt=[];for(let[V,z]of Object.entries(q)){if((w.get(V)??0)>=fr)continue;let oe=z.requires??[];if(oe.every(le=>m[le]!=null)){if(b.has(V)){if(!z.allowRerun)continue;let le=JSON.stringify(oe.map(ye=>m[ye]));if(C.get(V)===le)continue}nt.push(V);}}let He=nt;if(T&&nt.length>0){let V=u?be(u,m)??0:be(l,m)===!0?1:0,z=yt(V),oe=on(z,H,ae),fe=Object.create(null);for(let[ye,se]of Object.entries(U))fe[ye]={runs:se.runs,avgSatisfactionDelta:se.runs>0?se.totalDelta/se.runs:0,tokens:se.tokens};let le=T.select(nt,fe,oe);He=le&&le.length>0?le:nt;}if(He.sort((V,z)=>(q[z].priority??0)-(q[V].priority??0)),be(D,ae,{...m},He),He.length===0){$++;let V=!1;if(S)for(let z=ue;z<S.length;z++){let oe=S[z],fe=oe.afterStallSteps??3;if($>=fe){let le=oe.strategy;switch(le.type){case "allow_rerun":for(let ye of le.nodes)b.delete(ye),C.delete(ye);break;case "alternative_nodes":for(let ye of le.nodes){let se=`__relaxation_${z}_${ye.handler}`;q[se]={...ye};}break;case "inject_facts":pt(m,le.facts);break;case "accept_partial":{let ye=Date.now()-A,se=Object.values(B).reduce((ge,_e)=>ge+_e.totalTokens,0);return {achieved:!1,result:be(h,m)??m,facts:{...m},executionOrder:v,nodeResults:B,steps:ae,totalTokens:se,durationMs:ye,stepMetrics:H,relaxations:j,error:`Accepted partial result via relaxation tier "${oe.label}"`}}case "custom":{let ye=be(u,m)??0,se={step:ae,facts:{...m},metrics:on(yt(ye),H,ae),completedNodes:new Set(b),failedNodes:new Map(w)};await ir(le.apply,se);break}}j.push({step:ae,tierIndex:z,label:oe.label,strategy:le.type}),ue=z+1,$=0,V=!0;break}}if(!V){let z=be(u,m)??0,oe=on(yt(z),H,ae);if(be(E,ae,oe),!S||ue>=S.length){let fe=Date.now()-A,le=Object.values(B).reduce((ye,se)=>ye+se.totalTokens,0);return {achieved:!1,result:be(h,m)??m,facts:{...m},executionOrder:v,nodeResults:B,steps:ae,totalTokens:le,durationMs:fe,stepMetrics:H,relaxations:j,error:"Goal stalled: no ready nodes and no remaining relaxation tiers"}}}continue}$=0;let gr=Date.now(),mr=u?be(u,m)??0:be(l,m)===!0?1:0,hr=yt(mr),On=0,ft=[],br=He.map(async V=>{let z=q[V],oe=z.requires??[],fe=JSON.stringify(oe.map(se=>m[se]));C.set(V,fe);let le,ye=be(z.buildInput,m);if(ye!=null)le=ye;else {let se=Object.create(null);for(let ge of oe)m[ge]!=null&&(se[ge]=m[ge]);Object.keys(se).length>0?le=JSON.stringify(se):m.input!=null?le=String(m.input):le=JSON.stringify(m);}try{let se=await de(z.handler,le,{signal:F??void 0,patternId:x});if(B[V]=se,v.push(V),b.add(V),w.delete(V),z.extractOutput){let ge=be(z.extractOutput,se);ge&&(pt(m,ge),ft.push(...Object.keys(ge)));}else {let ge=se.output;if(ge&&typeof ge=="object")pt(m,ge),ft.push(...Object.keys(ge));else if(typeof ge=="string")try{let _e=JSON.parse(ge);if(_e&&typeof _e=="object"&&!Array.isArray(_e))pt(m,_e),ft.push(...Object.keys(_e));else for(let Pn of z.produces)m[Pn]=ge,ft.push(Pn);}catch{for(let _e of z.produces)m[_e]=ge,ft.push(_e);}}return On+=se.totalTokens,{nodeId:V,success:!0}}catch(se){let ge=(w.get(V)??0)+1;return w.set(V,ge),{nodeId:V,success:!1,error:se}}});await Promise.allSettled(br);let yr=u?be(u,m)??0:be(l,m)===!0?1:0,Lt=yt(yr),Bt=Lt-hr;if(H.push({step:ae,durationMs:Date.now()-gr,nodesRun:[...He],factsProduced:ft,satisfaction:Lt,satisfactionDelta:Bt,tokensConsumed:On}),P)for(let V of He){let z=q[V];P.record({type:"goal_step",timestamp:Date.now(),snapshotId:null,agentId:z.handler,step:ae,nodeId:V,satisfaction:Lt,satisfactionDelta:Bt});}for(let V of He){let z=q[V];U[z.handler]||(U[z.handler]={runs:0,avgSatisfactionDelta:0,tokens:0,totalDelta:0});let oe=U[z.handler];oe.runs++,oe.totalDelta+=Bt,oe.tokens+=B[V]?.totalTokens??0;}if(te=Lt,Bt<=0?$++:$=0,De&&En&&ae>pe&&(ae-pe)%dr===0){let V={type:"goal",version:1,id:Ke(),createdAt:new Date().toISOString(),label:`${pr}:step-${ae}`,patternId:x,stepsTotal:p,step:ae+1,facts:structuredClone(m),completedNodes:[...b],failedNodes:Object.fromEntries(w),nodeInputHashes:Object.fromEntries(C),nodeOutputs:Object.fromEntries(Object.entries(B).map(([oe,fe])=>[oe,{output:fe.output,totalTokens:fe.totalTokens}])),executionOrder:[...v],stepMetrics:[...H],relaxations:[...j],appliedRelaxationTiers:ue,stallSteps:$,lastSatisfaction:te,agentMetrics:Object.fromEntries(Object.entries(U).map(([oe,fe])=>[oe,{runs:fe.runs,totalDelta:fe.totalDelta,tokens:fe.tokens}]))},z=await dt(V,En,De);z&&(Dn=z);}}let Q=Date.now()-A,ne=Object.values(B).reduce((ae,nt)=>ae+nt.totalTokens,0);return {achieved:!1,result:be(h,m)??m,facts:{...m},executionOrder:v,nodeResults:B,steps:p,totalTokens:ne,durationMs:Q,stepMetrics:H,relaxations:j,error:`Max steps (${p}) exhausted without achieving goal`}}catch(Q){throw re=Q instanceof Error?Q:new Error(String(Q)),Q}finally{if(M!=null&&clearTimeout(M),N&&e.signal&&e.signal.removeEventListener("abort",N),P){let Q=Object.values(B).reduce((ne,ae)=>ne+ae.totalTokens,0);P.record({type:"pattern_complete",timestamp:Date.now(),snapshotId:null,patternId:x,patternType:"goal",durationMs:Date.now()-A,achieved:tt,stepMetrics:H,relaxations:j,totalTokens:Q,...re?{error:re.message}:{}});}J("onPatternComplete",{patternId:x,patternType:"goal",durationMs:Date.now()-A,timestamp:Date.now(),error:re});}}function ur(e){if(!Z)return [];let t=[],o=new Set;if(o.add(e),Z.equivalencyGroups){for(let n of Object.values(Z.equivalencyGroups))if(n.includes(e))for(let a of n)!o.has(a)&&W[a]&&(t.push(a),o.add(a));}if(Z.useCapabilities!==false){let n=W[e];if(n?.capabilities&&n.capabilities.length>0)for(let[a,l]of Object.entries(W)){if(o.has(a))continue;let u=l.capabilities??[];n.capabilities.every(p=>u.includes(p))&&(t.push(a),o.add(a));}}if(Ae){let n=Z.healthThreshold??30;return t.filter(a=>Ae.getHealthScore(a)>n)}return t}function lr(e){if(e.length===0)return null;if(!Z||!Ae)return e[0]??null;if(Z.selectionStrategy==="round-robin"&&Ne){let n=[...e].sort().join(","),a=Ne.get(n)??0,l=e[a%e.length];return Ne.set(n,a+1),l}let t=e[0],o=Ae.getHealthScore(t);for(let n=1;n<e.length;n++){let a=Ae.getHealthScore(e[n]);a>o&&(t=e[n],o=a);}return t}function cr(e){switch(e.type){case "parallel":return e.handlers;case "sequential":return e.handlers;case "supervisor":return [e.supervisor,...e.workers];case "dag":return Object.values(e.nodes).map(t=>t.handler);case "reflect":return [e.handler,e.evaluator];case "race":return e.handlers;case "debate":return [...e.handlers,e.evaluator];case "goal":return Object.values(e.nodes).map(t=>t.handler);default:return []}}let Cn={system:K,get facts(){return K.facts},get timeline(){return P},get healthMonitor(){return Ae},get derived(){return Object.freeze({...ut})},onDerivedChange(e){return It.add(e),()=>{It.delete(e);}},get scratchpad(){return Zt},runAgent:de,runAgentStream:en,async runPattern(e,t){X();let o=d$1[e];if(!o){let l=Object.keys(d$1).join(", ")||"(none)";throw new Error(`[Directive MultiAgent] Unknown pattern "${e}". Available patterns: ${l}`)}let n=Date.now();if(P){let l=cr(o);P.record({type:"pattern_start",timestamp:n,snapshotId:null,patternId:e,patternType:o.type,handlers:l,taskIds:l.filter(u=>Y[u]!=null)});}let a;try{switch(o.type){case "parallel":return await rr(o,t,e);case "sequential":return await tn(o,t,e);case "supervisor":return await nn(o,t,e);case "dag":return await rn(o,t,e);case "reflect":return await Nt(o,t,e);case "race":return (await An(o,t,e)).result;case "debate":return (await qt(o,t,e)).result;case "goal":return (await Gt(o,t,e)).result;default:throw new Error(`[Directive MultiAgent] Unknown pattern type: ${o.type}`)}}catch(l){throw a=l instanceof Error?l:new Error(String(l)),l}finally{P&&P.record({type:"pattern_complete",timestamp:Date.now(),snapshotId:null,patternId:e,patternType:o.type,durationMs:Date.now()-n,...a?{error:a.message}:{}});}},async runParallel(e,t,o,n){X();let a=Array.isArray(t)?t:e.map(()=>t);if(a.length!==e.length)throw new Error(`[Directive MultiAgent] Input count (${a.length}) must match agent count (${e.length})`);let l=new AbortController,u;n?.timeout&&(u=setTimeout(()=>l.abort(),n.timeout));try{let p=e.map((S,D)=>de(S,a[D],{signal:l.signal}).catch(E=>{if(n?.minSuccess!==void 0)return null;throw E})),h=await Promise.all(p),T=h.filter(S=>S!==null);if(n?.minSuccess!==void 0&&T.length<n.minSuccess){let S=h.length-T.length;throw new Error(`[Directive MultiAgent] runParallel: Only ${T.length}/${e.length} agents succeeded (minimum required: ${n.minSuccess}, failed: ${S})`)}return o(T)}finally{u&&clearTimeout(u);}},async runSequential(e,t,o){X();let n=[],a=t;for(let l=0;l<e.length;l++){let u=e[l],p=await de(u,a);n.push(p),l<e.length-1&&(o?.transform?a=o.transform(p.output,u,l):a=typeof p.output=="string"?p.output:safeStringify(p.output));}return n},async handoff(e,t,o,n){if(X(),!W[e]){let u=Object.keys(W).join(", ")||"(none)";throw new Error(`[Directive MultiAgent] Handoff source agent "${e}" not found. Registered: ${u}`)}if(!W[t]){let u=Object.keys(W).join(", ")||"(none)";throw new Error(`[Directive MultiAgent] Handoff target agent "${t}" not found. Registered: ${u}`)}{let u=await et("pre_handoff",e,W[e].agent.name,o,void 0,{handoff:{fromAgent:e,toAgent:t}});if(u.skip)return {output:void 0,messages:[],toolCalls:[],totalTokens:0};o=u.input;}let a={id:`handoff-${++_t}`,fromAgent:e,toAgent:t,input:o,context:n,requestedAt:Date.now()};Pe.push(a);try{f?.(a);}catch(u){ee&&console.debug("[Directive MultiAgent] onHandoff threw:",u);}J("onHandoff",a),P&&P.record({type:"handoff_start",timestamp:Date.now(),snapshotId:null,fromAgent:e,toAgent:t});let l=W[t].memory??_;if(l&&n)try{let u=Object.entries(n).map(([p,h])=>`${p}: ${safeStringify(h)}`).join(", ");l.addMessages([{role:"system",content:`[Handoff from ${e}] Context: ${u}`}]);}catch(u){ee&&console.debug("[Directive MultiAgent] Handoff addMessages failed:",u);}try{let u=await de(t,o),p={request:a,result:u,completedAt:Date.now()};Zn(p);try{g$1?.(p);}catch(T){ee&&console.debug("[Directive MultiAgent] onHandoffComplete threw:",T);}J("onHandoffComplete",p),P&&P.record({type:"handoff_complete",timestamp:Date.now(),snapshotId:null,fromAgent:e,toAgent:t,durationMs:p.completedAt-a.requestedAt});let h=Pe.indexOf(a);return h>=0&&Pe.splice(h,1),u}catch(u){let p=Pe.indexOf(a);throw p>=0&&Pe.splice(p,1),u}},approve(e){X();let t=it.get(e);if(t){it.delete(e);let o=ie(t);K.batch(()=>{let n=gt(o),a=200,l=[...n.approved,e];Je(o,{...n,pending:n.pending.filter(u=>u.id!==e),approved:l.length>a?l.slice(-a):l});});return}ee&&console.debug(`[Directive MultiAgent] approve() ignored: no pending request "${e}"`);},reject(e,t){X();let o=it.get(e);if(o){it.delete(e);let n=ie(o);K.batch(()=>{let a=gt(n);t&&ee&&console.debug(`[Directive MultiAgent] Request ${e} rejected: ${t}`);let l={id:e,reason:t,rejectedAt:Date.now()},u=200,p=[...a.rejected,l];Je(n,{...a,pending:a.pending.filter(h=>h.id!==e),rejected:p.length>u?p.slice(-u):p});});return}ee&&console.debug(`[Directive MultiAgent] reject() ignored: no pending request "${e}"`);},pause(){X(),qe="paused",ee&&console.debug("[Directive MultiAgent] Orchestrator paused");},resume(){X(),qe==="paused"&&(qe="idle",ee&&console.debug("[Directive MultiAgent] Orchestrator resumed"));},getAgentState(e){let t=ve[e];return t?{...t}:void 0},getAllAgentStates(){return Object.fromEntries(Object.entries(ve).map(([e,t])=>[e,{...t}]))},getPendingHandoffs(){return [...Pe]},get totalTokens(){return Xe},waitForIdle(e){let t=()=>Mt===0&&Object.values(ve).every(o=>o.status==="idle"||o.status==="completed"||o.status==="error");return t()?Promise.resolve():new Promise((o,n)=>{let a=null,l=()=>{jt.delete(u),a&&clearTimeout(a);},u=()=>{t()&&(l(),o());};jt.add(u),e!==void 0&&(a=setTimeout(()=>{l(),n(new Error(`[Directive MultiAgent] waitForIdle timed out after ${e}ms`));},e));})},run(e,t,o){return de(e,t,o)},runStream(e,t,o){return en(e,t,o)},registerAgent(e,t){if(X(),Ot.has(e))throw new Error(`[Directive MultiAgent] Agent ID "${e}" is reserved and cannot be used`);if(W[e])throw new Error(`[Directive MultiAgent] Agent "${e}" is already registered. Unregister first.`);if(Y[e])throw new Error(`[Directive MultiAgent] ID "${e}" is already registered as a task`);let o=t.constraints?Jt(t.constraints):{},n=Object.create(null);if(t.resolvers)for(let[l,u]of Object.entries(t.resolvers))n[l]={requirement:u.requirement,key:u.key,resolve:async(p,h)=>{let T=Ce(h.facts),D={facts:{...h.facts,...T},runAgent:async(E,q,k)=>r(E,q,k),signal:h.signal};return u.resolve(p,D)}};let a=createModule(e,{schema:i,init:l=>{Ue(l,{status:"idle",currentAgent:t.agent.name,input:null,output:null,error:null,tokenUsage:0,turnCount:0,startedAt:null,completedAt:null}),Je(l,{pending:[],approved:[],rejected:[]}),mt(l,[]),ht(l,[]),ze(l,Ct());},constraints:o,resolvers:Object.keys(n).length>0?n:void 0});K.registerModule(e,a),W[e]=t,Ge.set(e,new Ee(t.maxConcurrent??1)),ve[e]={status:"idle",runCount:0,totalTokens:0},ee&&console.debug(`[Directive MultiAgent] Registered agent "${e}" (${t.agent.name})`),Me();},unregisterAgent(e){if(X(),!W[e])throw new Error(`[Directive MultiAgent] Agent "${e}" is not registered`);if(ve[e]?.status==="running")throw new Error(`[Directive MultiAgent] Cannot unregister agent "${e}" while it is running`);for(let[a,l]of Object.entries(d$1)){let u;switch(l.type){case "supervisor":u=[l.supervisor,...l.workers];break;case "dag":u=Object.values(l.nodes).map(p=>p.handler);break;case "reflect":u=[l.handler,l.evaluator];break;case "parallel":case "sequential":case "race":u=l.handlers;break;case "debate":u=[...l.handlers,l.evaluator];break;default:u=[];}u.includes(e)&&console.warn(`[Directive MultiAgent] Warning: Pattern "${a}" references unregistered agent "${e}"`);}let o=Ge.get(e);o&&(o.drain(),Ge.delete(e));let n=ie(e);n&&K.batch(()=>{Ue(n,{status:"idle",currentAgent:null,input:null,output:null,error:null,tokenUsage:0,turnCount:0,startedAt:null,completedAt:null}),Je(n,{pending:[],approved:[],rejected:[]}),mt(n,[]),ht(n,[]),ze(n,Ct());}),delete W[e],delete ve[e],ee&&console.debug(`[Directive MultiAgent] Unregistered agent "${e}"`),Me();},getAgentIds(){return Object.keys(W)},registerTask(e,t){if(X(),Ot.has(e))throw new Error(`[Directive MultiAgent] Task ID "${e}" is reserved and cannot be used`);if(!e||typeof e!="string"||e.trim()!==e||e.length===0)throw new Error("[Directive MultiAgent] Task ID must be a non-empty trimmed string");if(W[e])throw new Error(`[Directive MultiAgent] ID "${e}" is already registered as an agent`);if(Y[e])throw new Error(`[Directive MultiAgent] Task "${e}" is already registered`);if(t.timeout!==void 0&&(!Number.isFinite(t.timeout)||t.timeout<=0))throw new Error(`[Directive MultiAgent] Task "${e}" timeout must be a finite number > 0`);if(t.maxConcurrent!==void 0&&(!Number.isFinite(t.maxConcurrent)||t.maxConcurrent<1||!Number.isInteger(t.maxConcurrent)))throw new Error(`[Directive MultiAgent] Task "${e}" maxConcurrent must be a finite integer >= 1`);if(t.retry){let{attempts:o,delayMs:n}=t.retry;if(!Number.isFinite(o)||o<1)throw new Error(`[Directive MultiAgent] Task "${e}" retry attempts must be a finite number >= 1`);if(n!==void 0&&(!Number.isFinite(n)||n<0))throw new Error(`[Directive MultiAgent] Task "${e}" retry delayMs must be a finite number >= 0`)}Y[e]=t,xe[e]={status:"idle"},$e.set(e,new Ee(t.maxConcurrent??1)),ee&&console.debug(`[Directive MultiAgent] Registered task "${e}" (${t.label??e})`);},unregisterTask(e){if(X(),!Y[e])throw new Error(`[Directive MultiAgent] Task "${e}" is not registered`);if(xe[e]?.status==="running")throw new Error(`[Directive MultiAgent] Cannot unregister task "${e}" while it is running`);let o=$e.get(e);o&&(o.drain(),$e.delete(e)),delete Y[e],delete xe[e],ee&&console.debug(`[Directive MultiAgent] Unregistered task "${e}"`);},getTaskIds(){return Object.keys(Y)},getTaskRegistry(){let e=Object.create(null);for(let[t,o]of Object.entries(Y))e[t]={label:o.label,description:o.description};return e},getTaskState(e){let t=xe[e];return t?Object.freeze(structuredClone(t)):void 0},getAllTaskStates(){let e=Object.create(null);for(let[t,o]of Object.entries(xe))e[t]=Object.freeze(structuredClone(o));return e},getNodeIds(){return [...Object.keys(W),...Object.keys(Y)]},reset(){X();for(let t of Object.keys(W)){let o=W[t]?.maxConcurrent??1;ve[t]={status:"idle",runCount:0,totalTokens:0};let n=Ge.get(t);n&&n.drain(),Ge.set(t,new Ee(o));let a=ie(t);K.batch(()=>{Ue(a,{status:"idle",currentAgent:W[t].agent.name,input:null,output:null,error:null,tokenUsage:0,turnCount:0,startedAt:null,completedAt:null}),Je(a,{pending:[],approved:[],rejected:[]}),mt(a,[]),ht(a,[]),ze(a,Ct());});}for(let t of Object.keys(Y)){xe[t]={status:"idle"};let o=$e.get(t);o&&o.drain(),$e.set(t,new Ee(Y[t].maxConcurrent??1));}ct.clear(),bt.clear(),it.clear(),Pe.length=0,Ze.length=0,_t=0,Xe=0,qe="idle",Mt=0,Qe();let e=ie("__coord");K.batch(()=>{setBridgeFact(e,"__globalTokens",0),setBridgeFact(e,"__status","idle"),setBridgeFact(e,"__handoffs",[]),setBridgeFact(e,"__handoffResults",[]),setBridgeFact(e,"__budgetWarningFired",false),Ie&&setBridgeFact(e,h,{...Ie.init});}),Ae&&Ae.reset(),Oe=null;for(let t of Object.keys(ut))delete ut[t];Me();},async checkpoint(e){X();for(let[o,n]of Object.entries(ve))if(n.status==="running")throw new Error(`[Directive MultiAgent] Cannot checkpoint while agent "${o}" is running`);for(let[o,n]of Object.entries(xe))if(n.status==="running")throw new Error(`[Directive MultiAgent] Cannot checkpoint while task "${o}" is running`);if(!K.history?.export)throw new Error("[Directive MultiAgent] Checkpointing requires history. Set `debug: true` in orchestrator options.");let t={version:1,id:Ke(),createdAt:new Date().toISOString(),label:e?.label,systemExport:K.history.export(),timelineExport:P?.export()??null,localState:{type:"multi",globalTokenCount:Xe,globalStatus:qe,agentStates:Object.fromEntries(Object.entries(ve).map(([o,n])=>[o,structuredClone(n)])),handoffCounter:_t,pendingHandoffs:[...Pe],handoffResults:[...Ze],roundRobinCounters:Ne?Object.fromEntries(Ne):null,taskStates:Object.fromEntries(Object.entries(xe).map(([o,n])=>[o,{lastOutput:n.lastOutput!=null?String(n.lastOutput):void 0,lastError:n.lastError}]))},memoryExport:_?_.export?.()??null:null,orchestratorType:"multi"};return we&&await we.save(t),t},restore(e,t){if(X(),!fn(e))throw new Error("[Directive MultiAgent] Invalid checkpoint data");if(e.orchestratorType!=="multi")throw new Error(`[Directive MultiAgent] Expected multi-agent checkpoint, got "${e.orchestratorType}"`);if(!K.history?.import)throw new Error("[Directive MultiAgent] Restoring a checkpoint requires history. Set `debug: true` in orchestrator options.");K.history.import(e.systemExport),t?.restoreTimeline!==false&&e.timelineExport&&P&&P.import(e.timelineExport),e.memoryExport&&_&&_.import&&_.import(e.memoryExport);let o=e.localState;Xe=o.globalTokenCount,qe=o.globalStatus,_t=o.handoffCounter,Pe.length=0,Pe.push(...o.pendingHandoffs),Ze.length=0,Ze.push(...o.handoffResults);for(let[n,a]of Object.entries(o.agentStates))ve[n]&&(ve[n]={...a});if(o.roundRobinCounters&&Ne){Ne.clear();for(let[n,a]of Object.entries(o.roundRobinCounters))Ne.set(n,a);}for(let[n,a]of Object.entries(W)){let l=Ge.get(n);l&&l.drain(),Ge.set(n,new Ee(a.maxConcurrent??1));}if(o.taskStates){for(let[n,a]of Object.entries(o.taskStates)){if(!Y[n])throw new Error(`[Directive MultiAgent] Checkpoint references task "${n}" which is not registered. Task run functions cannot be serialized \u2014 re-provide the task registration.`);xe[n]={status:"idle",lastOutput:a.lastOutput,lastError:a.lastError};}for(let[n,a]of Object.entries(Y)){let l=$e.get(n);l&&l.drain(),$e.set(n,new Ee(a.maxConcurrent??1));}}Me();},runParallelStream(e,t,o,n){X();let a=Array.isArray(t)?t:e.map(()=>t);if(a.length!==e.length)throw new Error(`[Directive MultiAgent] Input count (${a.length}) must match agent count (${e.length})`);let l=new AbortController,u;n?.timeout&&(u=setTimeout(()=>l.abort(),n.timeout));let p=e.map((k,x)=>{let F=en(k,a[x],{signal:l.signal});return {agentId:k,streamResult:F}}),h=p.map(({agentId:k,streamResult:x})=>({agentId:k,stream:x.stream})),{stream:T,getDroppedCount:S}=Hn(h),D;n?.signal&&(D=()=>l.abort(),n.signal.addEventListener("abort",D,{once:true}));let E=Promise.allSettled(p.map(({streamResult:k})=>k.result)).then(k=>{u&&clearTimeout(u),D&&n?.signal&&n.signal.removeEventListener("abort",D);let x=[];for(let F of k)F.status==="fulfilled"&&x.push(F.value);if(n?.minSuccess!==void 0&&x.length<n.minSuccess)throw new Error(`[Directive MultiAgent] runParallelStream: Only ${x.length}/${e.length} agents succeeded (minimum required: ${n.minSuccess})`);return x}),q=E.then(k=>o(k));return E.catch(()=>{}),q.catch(()=>{}),{stream:T,results:E,merge:q,getDroppedCount:S,abort:()=>{l.abort(),D&&n?.signal&&n.signal.removeEventListener("abort",D);for(let{streamResult:k}of p)k.abort();}}},async runRace(e,t,o){X();let n={type:"race",handlers:e,extract:o?.extract,timeout:o?.timeout,minSuccess:o?.minSuccess,signal:o?.signal};return An(n,t,"__imperative_race")},async runReflect(e,t,o,n){X();let a={type:"reflect",handler:e,evaluator:t,maxIterations:n?.maxIterations,parseEvaluation:n?.parseEvaluation,buildRetryInput:n?.buildRetryInput,extract:n?.extract,onExhausted:n?.onExhausted,onIteration:n?.onIteration,signal:n?.signal,timeout:n?.timeout,threshold:n?.threshold},l=await Nt(a,o,"__imperative_reflect"),u=Oe?[...Oe]:[],p=n?.maxIterations??2,h=u.length>0&&!u[u.length-1].passed&&u.length>=p;return {result:l,iterations:u.length,history:u,exhausted:h}},async runDebate(e,t,o,n){return X(),qt({handlers:e,evaluator:t,maxRounds:n?.maxRounds,extract:n?.extract,parseJudgement:n?.parseJudgement,signal:n?.signal,timeout:n?.timeout},o,"__imperative_debate")},async runGoal(e,t,o,n){return X(),Gt({nodes:e,when:o,satisfaction:n?.satisfaction,maxSteps:n?.maxSteps,extract:n?.extract,timeout:n?.timeout,signal:n?.signal,selectionStrategy:n?.selectionStrategy,relaxation:n?.relaxation,onStep:n?.onStep,onStall:n?.onStall,checkpoint:n?.checkpoint},t,"__imperative_goal")},async resumeGoal(e,t){if(X(),!e||e.version!==1||e.type!=="goal")throw new Error("[Directive MultiAgent] Invalid goal checkpoint state");return Gt(t,{},e.patternId,e)},async resumeSequential(e,t){if(X(),!e||e.version!==1||e.type!=="sequential")throw new Error("[Directive MultiAgent] Invalid sequential checkpoint state");return tn(t,e.currentInput,e.patternId,e)},async resumeSupervisor(e,t,o){if(X(),!e||e.version!==1||e.type!=="supervisor")throw new Error("[Directive MultiAgent] Invalid supervisor checkpoint state");let n=o?.input??e.currentInput;return nn(t,n,e.patternId,e)},async resumeReflect(e,t,o){if(X(),!e||e.version!==1||e.type!=="reflect")throw new Error("[Directive MultiAgent] Invalid reflect checkpoint state");let n=o?.input??e.effectiveInput;return Nt(t,n,e.patternId,e)},async resumeDebate(e,t){if(X(),!e||e.version!==1||e.type!=="debate")throw new Error("[Directive MultiAgent] Invalid debate checkpoint state");return qt(t,e.currentInput,e.patternId,e)},async resumeDag(e,t,o){if(X(),!e||e.version!==1||e.type!=="dag")throw new Error("[Directive MultiAgent] Invalid DAG checkpoint state");let n=o?.input??e.input;return rn(t,n,e.patternId,e)},async replay(e,t,o){if(X(),!we)throw new Error("[Directive MultiAgent] No checkpoint store configured");let n=await we.load(e);if(!n)throw new Error(`[Directive MultiAgent] Checkpoint not found: ${e}`);let a;try{let p=JSON.parse(n.systemExport);if(!p||typeof p!="object")throw new Error("Parsed checkpoint state is not an object");let h=new Set(["__proto__","constructor","prototype"]);for(let S of Object.keys(p))if(h.has(S))throw new Error(`Checkpoint state contains blocked key: ${S}`);if(!new Set(["sequential","supervisor","reflect","debate","dag","goal"]).has(p.type))throw new Error(`Unknown checkpoint pattern type: ${p.type}`);if(p.version!==1)throw new Error(`Unsupported checkpoint version: ${p.version}`);a=p;}catch(p){throw new Error(`[Directive MultiAgent] Invalid checkpoint state: ${p instanceof Error?p.message:String(p)}`)}let l=ot(a),u=o?.input??("currentInput"in a?a.currentInput:"");switch(P&&P.record({type:"checkpoint_restore",timestamp:Date.now(),snapshotId:null,checkpointId:e,patternType:a.type,step:l}),a.type){case "sequential":return tn(t,u,a.patternId,a);case "supervisor":return nn(t,u,a.patternId,a);case "reflect":return Nt(t,u,a.patternId,a);case "debate":return qt(t,u,a.patternId,a);case "dag":return rn(t,u,a.patternId,a);case "goal":return Gt(t,a.facts,a.patternId,a)}},resumeBreakpoint(e,t){X(),t&&ct.set(e,t);for(let o of Object.keys(W)){let n=ie(o);if(We(n).pending.some(l=>l.id===e)){K.batch(()=>{let l=We(n),u=[...l.resolved,e];ze(n,{...l,pending:l.pending.filter(p=>p.id!==e),resolved:u.length>At?u.slice(-At):u});});return}}ee&&console.debug(`[Directive MultiAgent] resumeBreakpoint() ignored: no pending breakpoint "${e}"`);},cancelBreakpoint(e,t){X(),t&&bt.set(e,t);for(let o of Object.keys(W)){let n=ie(o);if(We(n).pending.some(l=>l.id===e)){K.batch(()=>{let l=We(n),u=[...l.cancelled,e];ze(n,{...l,pending:l.pending.filter(p=>p.id!==e),cancelled:u.length>At?u.slice(-At):u});});return}}ee&&console.debug(`[Directive MultiAgent] cancelBreakpoint() ignored: no pending breakpoint "${e}"`);},getPendingBreakpoints(){let e=[];for(let t of Object.keys(W)){let o=ie(t),n=We(o);e.push(...n.pending);}return e},getLastReflectionHistory(){return Oe?[...Oe]:null},destroy(){Xt||(Cn.reset(),$t.clear(),lt.clear(),It.clear(),jt.clear(),Xt=true,K.destroy());}};return Me(),Cn}export{mo as $,Vr as A,Yr as B,Xr as C,Zr as D,Qr as E,eo as F,to as G,no as H,ro as I,Hn as J,xt as K,Br as L,mn as M,Ee as N,ot as O,xr as P,Cr as Q,Er as R,hn as S,ao as T,io as U,uo as V,lo as W,co as X,po as Y,fo as Z,go as _,cn as a,ho as aa,jr as b,yo as ba,Ht as c,ko as ca,Ut as d,To as da,qn as e,So as ea,St as f,xo as fa,Ue as g,Ao as ga,gt as h,Co as ha,Je as i,Eo as ia,dn as j,Do as ja,mt as k,Un as ka,pn as l,Oo as la,ht as m,Po as ma,We as n,Mo as na,ze as o,_o as oa,Ce as p,jo as pa,Jt as q,Io as qa,Gr as r,Zo as ra,At as s,Gn as t,Ln as u,Ct as v,Ke as w,fn as x,Fn as y,Kr as z};//# sourceMappingURL=chunk-7KCLEIAG.js.map
67
+ //# sourceMappingURL=chunk-7KCLEIAG.js.map