@directive-run/ai 1.13.0 → 1.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/anthropic.d.cts +1 -1
- package/dist/anthropic.d.ts +1 -1
- package/dist/chunk-56LYSE63.js +6 -0
- package/dist/chunk-56LYSE63.js.map +1 -0
- package/dist/chunk-5JQ2A3JK.js +2 -0
- package/dist/chunk-5JQ2A3JK.js.map +1 -0
- package/dist/chunk-7DPTXZZI.cjs +67 -0
- package/dist/chunk-7DPTXZZI.cjs.map +1 -0
- package/dist/chunk-BFSRYCOS.js +4 -0
- package/dist/chunk-BFSRYCOS.js.map +1 -0
- package/dist/chunk-C6MQ4WL6.cjs +11 -0
- package/dist/chunk-C6MQ4WL6.cjs.map +1 -0
- package/dist/chunk-CAA6Q4YY.cjs +4 -0
- package/dist/chunk-CAA6Q4YY.cjs.map +1 -0
- package/dist/chunk-D5APTMCT.cjs +16 -0
- package/dist/chunk-D5APTMCT.cjs.map +1 -0
- package/dist/chunk-FBT73WFY.js +2 -0
- package/dist/chunk-FBT73WFY.js.map +1 -0
- package/dist/chunk-FN4GUZAI.js +67 -0
- package/dist/chunk-FN4GUZAI.js.map +1 -0
- package/dist/chunk-GTB6HTZV.js +30 -0
- package/dist/chunk-GTB6HTZV.js.map +1 -0
- package/dist/chunk-HRR45JZX.js +7 -0
- package/dist/chunk-HRR45JZX.js.map +1 -0
- package/dist/chunk-IR3IHBVQ.cjs +2 -0
- package/dist/chunk-IR3IHBVQ.cjs.map +1 -0
- package/dist/chunk-J2Q5KKPN.js +37 -0
- package/dist/chunk-J2Q5KKPN.js.map +1 -0
- package/dist/chunk-K64WKZ22.cjs +2 -0
- package/dist/chunk-K64WKZ22.cjs.map +1 -0
- package/dist/chunk-MDXDPECP.cjs +30 -0
- package/dist/chunk-MDXDPECP.cjs.map +1 -0
- package/dist/chunk-PB276BX2.cjs +6 -0
- package/dist/chunk-PB276BX2.cjs.map +1 -0
- package/dist/chunk-UR5BMWEN.js +2 -0
- package/dist/chunk-UR5BMWEN.js.map +1 -0
- package/dist/chunk-V2FCPNPP.js +11 -0
- package/dist/chunk-V2FCPNPP.js.map +1 -0
- package/dist/chunk-WCQK3JOR.cjs +7 -0
- package/dist/chunk-WCQK3JOR.cjs.map +1 -0
- package/dist/chunk-WOFIBIPW.cjs +2 -0
- package/dist/chunk-WOFIBIPW.cjs.map +1 -0
- package/dist/chunk-XN5LUOVS.cjs +37 -0
- package/dist/chunk-XN5LUOVS.cjs.map +1 -0
- package/dist/chunk-YT4QN3KO.js +16 -0
- package/dist/chunk-YT4QN3KO.js.map +1 -0
- package/dist/debug-timeline-DpnRMnLU.d.cts +87 -0
- package/dist/debug-timeline-L13P-U2I.d.ts +87 -0
- package/dist/devtools.cjs +2 -0
- package/dist/devtools.cjs.map +1 -0
- package/dist/devtools.d.cts +354 -0
- package/dist/devtools.d.ts +354 -0
- package/dist/devtools.js +2 -0
- package/dist/devtools.js.map +1 -0
- package/dist/evals.cjs +2 -0
- package/dist/evals.cjs.map +1 -0
- package/dist/evals.d.cts +361 -0
- package/dist/evals.d.ts +361 -0
- package/dist/evals.js +2 -0
- package/dist/evals.js.map +1 -0
- package/dist/gemini.cjs +1 -1
- package/dist/gemini.cjs.map +1 -1
- package/dist/gemini.d.cts +1 -1
- package/dist/gemini.d.ts +1 -1
- package/dist/gemini.js +1 -1
- package/dist/gemini.js.map +1 -1
- package/dist/guardrails.cjs +2 -0
- package/dist/guardrails.cjs.map +1 -0
- package/dist/guardrails.d.cts +618 -0
- package/dist/guardrails.d.ts +618 -0
- package/dist/guardrails.js +2 -0
- package/dist/guardrails.js.map +1 -0
- package/dist/health-monitor-C6xoXrQz.d.cts +55 -0
- package/dist/health-monitor-qL9RNMH3.d.ts +55 -0
- package/dist/index.cjs +21 -99
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1197 -4735
- package/dist/index.d.ts +1197 -4735
- package/dist/index.js +21 -99
- package/dist/index.js.map +1 -1
- package/dist/mcp.cjs +2 -0
- package/dist/mcp.cjs.map +1 -0
- package/dist/mcp.d.cts +450 -0
- package/dist/mcp.d.ts +450 -0
- package/dist/mcp.js +2 -0
- package/dist/mcp.js.map +1 -0
- package/dist/multi-agent-orchestrator-KFYIDKTF.cjs +2 -0
- package/dist/{multi-agent-orchestrator-KFGTEGE5.cjs.map → multi-agent-orchestrator-KFYIDKTF.cjs.map} +1 -1
- package/dist/multi-agent-orchestrator-ZHSMWIKP.js +2 -0
- package/dist/{multi-agent-orchestrator-4PXNYRHB.js.map → multi-agent-orchestrator-ZHSMWIKP.js.map} +1 -1
- package/dist/multi-agent.cjs +2 -0
- package/dist/multi-agent.cjs.map +1 -0
- package/dist/multi-agent.d.cts +1429 -0
- package/dist/multi-agent.d.ts +1429 -0
- package/dist/multi-agent.js +2 -0
- package/dist/multi-agent.js.map +1 -0
- package/dist/ollama.d.cts +1 -1
- package/dist/ollama.d.ts +1 -1
- package/dist/openai.cjs +1 -1
- package/dist/openai.cjs.map +1 -1
- package/dist/openai.d.cts +2 -2
- package/dist/openai.d.ts +2 -2
- package/dist/openai.js +1 -1
- package/dist/openai.js.map +1 -1
- package/dist/{orchestrator-types-CTfIKk0W.d.ts → orchestrator-types-CbNE7Rjp.d.cts} +6 -139
- package/dist/{orchestrator-types-Bh8r3_Sq.d.cts → orchestrator-types-ZK9lv5Sm.d.ts} +6 -139
- package/dist/predicate.cjs +2 -0
- package/dist/predicate.cjs.map +1 -0
- package/dist/predicate.d.cts +371 -0
- package/dist/predicate.d.ts +371 -0
- package/dist/predicate.js +2 -0
- package/dist/predicate.js.map +1 -0
- package/dist/{semantic-cache-nBpQqILc.d.cts → semantic-cache-DM7ev7NQ.d.cts} +1 -1
- package/dist/{semantic-cache-nBpQqILc.d.ts → semantic-cache-DM7ev7NQ.d.ts} +1 -1
- package/dist/testing.cjs +1 -1
- package/dist/testing.cjs.map +1 -1
- package/dist/testing.d.cts +4 -2
- package/dist/testing.d.ts +4 -2
- package/dist/testing.js +1 -1
- package/dist/testing.js.map +1 -1
- package/dist/{types-CRmwFnVk.d.cts → types-DJ09LjZX.d.cts} +1 -1
- package/dist/{types-CRmwFnVk.d.ts → types-DJ09LjZX.d.ts} +1 -1
- package/package.json +32 -2
- package/dist/chunk-Q3PQLWBR.js +0 -16
- package/dist/chunk-Q3PQLWBR.js.map +0 -1
- package/dist/chunk-RW4R3O5P.js +0 -72
- package/dist/chunk-RW4R3O5P.js.map +0 -1
- package/dist/chunk-X3VQ5F7D.cjs +0 -72
- package/dist/chunk-X3VQ5F7D.cjs.map +0 -1
- package/dist/chunk-XV2QSBBE.cjs +0 -16
- package/dist/chunk-XV2QSBBE.cjs.map +0 -1
- package/dist/multi-agent-orchestrator-4PXNYRHB.js +0 -2
- package/dist/multi-agent-orchestrator-KFGTEGE5.cjs +0 -2
package/dist/anthropic.d.cts
CHANGED
package/dist/anthropic.d.ts
CHANGED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import {ba}from'./chunk-FN4GUZAI.js';function w(s){return s.replace(/[^a-zA-Z0-9]/g,"_")}function N(s){return s.replace(/[\r\n]+/g," ").replace(/[[\](){}|<>"]/g,e=>`#${e.charCodeAt(0)};`)}var O={square:["[","]"],round:["(",")"],stadium:["([","])"],hexagon:["{{","}}"],circle:["((","))"]};function M(s,e,c,l){let n;c==="task"?n=l?.task??"hexagon":c==="agent"?n=l?.agent??"square":n=l?.virtual??"circle";let[o,a]=O[n];return `${s}${o}${N(e)}${a}`}function P(s){let e=new Map;for(let n of s)e.set(n,(e.get(n)??0)+1);let c=new Map,l=[];for(let n of s){let o=w(n);if(e.get(n)>1){let a=(c.get(n)??0)+1;c.set(n,a),l.push({id:`${o}_${a}`,label:`${n} #${a}`});}else l.push({id:o,label:n});}return l}function G(s){let e=new Map,c=new Map;for(let o of Object.keys(s))e.has(o)||e.set(o,0),c.has(o)||c.set(o,[]);for(let[o,a]of Object.entries(s))for(let r of a.deps??[])c.get(r).push(o),e.set(o,(e.get(o)??0)+1);let l=[];for(let[o,a]of e)a===0&&l.push(o);l.sort();let n=[];for(;l.length>0;){let o=l.shift();n.push(o);let a=c.get(o)??[];a.sort();for(let r of a){let g=e.get(r)-1;if(e.set(r,g),g===0){let t=l.findIndex(i=>i>r);t===-1?l.push(r):l.splice(t,0,r);}}}return n}function U(s){let e=s;if(e.type==="parallel"&&typeof e.merge=="function"||e.type==="sequential"&&typeof e.transform=="function"||e.type==="supervisor"&&typeof e.extract=="function"||e.type==="dag"&&typeof e.merge=="function"||e.type==="reflect"&&typeof e.parseEvaluation=="function"||e.type==="race"&&typeof e.extract=="function"||e.type==="debate"&&typeof e.extract=="function"||e.type==="goal"&&(typeof e.when=="function"||typeof e.satisfaction=="function"||typeof e.extract=="function"))return false;if(e.type==="dag"&&e.nodes)for(let c of Object.values(e.nodes)){let l=c;if(typeof l.when=="function"||typeof l.transform=="function")return false}if(e.type==="goal"&&e.nodes)for(let c of Object.values(e.nodes)){let l=c;if(typeof l.buildInput=="function"||typeof l.extractOutput=="function")return false}return true}function q(s,e){let c=[];return e&&c.push(`%%{init: {'theme': '${e}'}}%%`),c.push(`graph ${s}`),c.join(`
|
|
2
|
+
`)}var C=new Set(["parallel","sequential","supervisor","dag","reflect","race","debate","goal"]);function B(s,e,c){let l=P(s.handlers),n=M("__input","Input","virtual",e),o=M("__merge","Merge","virtual",e),a=[];for(let r of l){let g=c?.has(r.label)?"task":"agent",t=M(r.id,r.label,g,e);a.push(` ${n} --> ${t}`),a.push(` ${t} --> ${o}`);}return a}function L(s,e,c){return s.handlers.length===0?[]:[` ${s.handlers.map(o=>({id:w(o),label:o})).map(o=>M(o.id,o.label,c?.has(o.label)?"task":"agent",e)).join(" --> ")}`]}function j(s,e){let c=w(s.supervisor),l=M(c,s.supervisor,"agent",e),n=[];for(let o of s.workers){let a=w(o),r=M(a,o,"agent",e);n.push(` ${l} -->|delegate| ${r}`),n.push(` ${r} -->|result| ${l}`);}return n}function F(s,e,c){let l=G(s.nodes),n=[],o=new Set;for(let a of l){let r=s.nodes[a],g=w(a),t=r.handler,i=c?.has(r.handler)?"task":"agent";(!r.deps||r.deps.length===0)&&(o.has(g)||(n.push(` ${M(g,t,i,e)}`),o.add(g)));let f=[...r.deps??[]].sort();for(let u of f){let b=w(u),y=s.nodes[u],d=y.handler,p=c?.has(y.handler)?"task":"agent",h=M(b,d,p,e),m=M(g,t,i,e);n.push(` ${h} --> ${m}`),o.add(b),o.add(g);}}return n}function _(s,e,c){let l=P(s.handlers),n=M("__input","Input","virtual",e),o=M("__output","Output","virtual",e),a=[];for(let r of l){let g=c?.has(r.label)?"task":"agent",t=M(r.id,r.label,g,e);a.push(` ${n} --> ${t}`),a.push(` ${t} -.-> ${o}`);}return a}function z(s,e,c){let l=w(s.handler),n=w(s.evaluator),o=c?.has(s.handler)?"task":"agent",a=M(l,s.handler,o,e),r=M(n,s.evaluator,"agent",e),g=M("__output","Output","virtual",e);return [` ${a} --> ${r}`,` ${r} -->|feedback| ${a}`,` ${r} -->|pass| ${g}`]}function H(s,e,c){let l=Object.entries(s.nodes),n=[],o=new Map;for(let[t,i]of l)for(let f of i.produces)o.set(f,t);let a=new Set,r=new Set,g=[...l].sort(([t],[i])=>t.localeCompare(i));for(let[t,i]of g){let f=w(t),u=[...i.requires??[]].sort();if(u.length===0&&!a.has(f)){let b=c?.has(i.handler)?"task":"agent";n.push(` ${M(f,i.handler,b,e)}`),a.add(f);}for(let b of u){let y=o.get(b);if(y&&y!==t){let d=s.nodes[y];if(!d)continue;let p=`${y}->${t}`;if(!r.has(p)){let h=w(y),m=c?.has(d.handler)?"task":"agent",S=c?.has(i.handler)?"task":"agent",v=M(h,d.handler,m,e),A=M(f,i.handler,S,e);n.push(` ${v} -->|${N(b)}| ${A}`),a.add(h),a.add(f),r.add(p);}}}}for(let[t,i]of g){let f=w(t);if(!a.has(f)){let u=c?.has(i.handler)?"task":"agent";n.push(` ${M(f,i.handler,u,e)}`),a.add(f);}}return n}function Q(s,e,c){let l=P(s.handlers),n=w(s.evaluator),o=M(n,s.evaluator,"agent",e),a=M("__output","Output","virtual",e),r=[];for(let g of l){let t=c?.has(g.label)?"task":"agent",i=M(g.id,g.label,t,e);r.push(` ${i} --> ${o}`),r.push(` ${o} -->|next round| ${i}`);}return r.push(` ${o} --> ${a}`),r}function Y(s,e){let c=e?.direction??"LR",l=e?.shapes,n=e?.taskIds,o=U(s)?s:ba(s);if(!C.has(o.type))throw new Error(`[Directive] patternToMermaid: unknown pattern type "${o.type}"`);let a=q(c,e?.theme),r=[];switch(o.type){case "parallel":r=B(o,l,n);break;case "sequential":r=L(o,l,n);break;case "supervisor":r=j(o,l);break;case "dag":r=F(o,l,n);break;case "race":r=_(o,l,n);break;case "reflect":r=z(o,l,n);break;case "debate":r=Q(o,l,n);break;case "goal":r=H(o,l,n);break}return `${a}
|
|
3
|
+
${r.join(`
|
|
4
|
+
`)}
|
|
5
|
+
`}function k(){return globalThis.crypto?.randomUUID?.()??`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,11)}`}function V(s={}){let{maxHistory:e=1e3,defaultTtlMs:c=36e5,maxPendingPerAgent:l=100,persistence:n,onDelivery:o,onDeliveryError:a}=s,r=new Map,g=[],t=new Map,i=new Map;function f(d,p){if(p.types&&!p.types.includes(d.type)||p.from&&!(Array.isArray(p.from)?p.from:[p.from]).includes(d.from))return false;if(p.topics){let h=d.topic;if(h&&!p.topics.includes(h))return false}return !(p.priority&&d.priority&&!p.priority.includes(d.priority)||p.custom&&!p.custom(d))}function u(d){return d.ttlMs?Date.now()-d.timestamp>d.ttlMs:false}function b(d){return d.to==="*"?Array.from(r.keys()):Array.isArray(d.to)?d.to:[d.to]}async function y(d){if(u(d))return;let p=b(d),h=[],m=[];for(let S of p){let v=r.get(S)??[];if(v.length===0){let A=i.get(S)??[];for(A.push(d);A.length>l;)A.shift();i.set(S,A);continue}for(let A of v)(!A.filter||f(d,A.filter))&&m.push(Promise.resolve(A.handler(d)).then(()=>{h.push(S);},x=>{a?.(d,x instanceof Error?x:new Error(String(x)));}));}m.length>0&&await Promise.allSettled(m),h.length>0&&o?.(d,h),n&&await n.save(d);}return {publish(d){let p={...d,id:k(),timestamp:Date.now(),priority:d.priority??"normal",ttlMs:d.ttlMs??c};for(g.push(p),t.set(p.id,p);g.length>e;){let h=g.shift();h&&t.delete(h.id);}return y(p).catch(h=>{let m=h instanceof Error?h:new Error(String(h));a?a(p,m):console.error("[Directive MessageBus] Delivery error:",m);}),p.id},subscribe(d,p,h){let m=k(),S={id:m,agentId:d,handler:p,filter:h,unsubscribe:()=>{let x=r.get(d)??[],E=x.findIndex(R=>R.id===m);E>=0&&x.splice(E,1);}},v=r.get(d)??[];v.push(S),r.set(d,v);let A=i.get(d)??[];i.delete(d);for(let x of A)if(!h||f(x,h)){let E=p(x);E instanceof Promise&&E.catch(R=>{let D=R instanceof Error?R:new Error(String(R));a?a(x,D):console.error("[Directive MessageBus] Pending delivery error:",D);});}return S},getHistory(d,p=100){let h=g.filter(m=>!u(m));return d&&(h=h.filter(m=>f(m,d))),h.slice(-p)},getMessage(d){let p=t.get(d);if(!(p&&u(p)))return p},getPending(d){return (i.get(d)??[]).filter(h=>!u(h))},clear(){g.length=0,t.clear(),i.clear();},destroy(){g.length=0,t.clear(),i.clear(),r.clear();}}}function J(s){let{bus:e,agents:c={},defaultTimeout:l=3e4,onAgentOnline:n,onAgentOffline:o}=s,a=new Map,r=new Map;for(let[t,i]of Object.entries(c))a.set(t,{...i,id:t,status:"offline",lastSeen:Date.now()});function g(t){if(t.type!=="RESPONSE"&&t.type!=="DELEGATION_RESULT")return;let i=t.correlationId??t.replyTo;if(!i)return;let f=r.get(i);f&&(clearTimeout(f.timer),r.delete(i),f.resolve(t));}return {register(t,i){let f=!a.has(t)||a.get(t)?.status==="offline";a.set(t,{...i,id:t,status:"online",lastSeen:Date.now()}),f&&n?.(t);},unregister(t){let i=a.get(t);i&&(i.status="offline",o?.(t));},getAgent(t){return a.get(t)},getAgents(){return Array.from(a.values())},findByCapability(t){return Array.from(a.values()).filter(i=>i.capabilities.includes(t)&&i.status==="online")},send(t,i,f){let u=a.get(t);return u&&(u.lastSeen=Date.now(),u.status="online"),e.publish({...f,from:t,to:i,type:f.type??"CUSTOM"})},async request(t,i,f,u,b=l){return new Promise((y,d)=>{let p=k(),h=e.subscribe(t,S=>{(S.correlationId===p||S.replyTo===p)&&(h.unsubscribe(),g(S));},{types:["RESPONSE"]}),m=setTimeout(()=>{h.unsubscribe(),r.delete(p),d(new Error(`[Directive Communication] Request timeout after ${b}ms`));},b);r.set(p,{resolve:y,reject:d,timer:m}),e.publish({type:"REQUEST",from:t,to:i,action:f,payload:u,timeout:b,correlationId:p});})},async delegate(t,i,f,u){return new Promise((b,y)=>{let d=k(),p=e.subscribe(t,m=>{(m.correlationId===d||m.replyTo===d)&&(p.unsubscribe(),g(m));},{types:["DELEGATION_RESULT"]}),h=setTimeout(()=>{p.unsubscribe(),r.delete(d),y(new Error(`[Directive Communication] Delegation timeout after ${l}ms`));},l);r.set(d,{resolve:b,reject:y,timer:h}),e.publish({type:"DELEGATION",from:t,to:i,task:f,context:u,correlationId:d});})},async query(t,i,f,u){return new Promise((b,y)=>{let d=k(),p=e.subscribe(t,m=>{(m.correlationId===d||m.replyTo===d)&&(p.unsubscribe(),g(m));},{types:["RESPONSE"]}),h=setTimeout(()=>{p.unsubscribe(),r.delete(d),y(new Error(`[Directive Communication] Query timeout after ${l}ms`));},l);r.set(d,{resolve:b,reject:y,timer:h}),e.publish({type:"QUERY",from:t,to:i,question:f,context:u,correlationId:d});})},broadcast(t,i){return e.publish({...i,from:t,to:"*",type:i.type??"INFORM"})},listen(t,i,f){let u=a.get(t);return u&&(u.status="online",u.lastSeen=Date.now(),n?.(t)),e.subscribe(t,i,f)},getBus(){return e},destroy(){for(let[,t]of r)clearTimeout(t.timer);r.clear(),a.clear();}}}function Z(s,e){let c=new Map,l=s.listen(e,async n=>{if(n.type==="REQUEST"){let o=n,a=c.get(o.action),r;if(a)try{let g=await a(o.payload);r={type:"RESPONSE",success:g.success,result:g.result,error:g.error};}catch(g){r={type:"RESPONSE",success:false,error:g instanceof Error?g.message:String(g)};}else r={type:"RESPONSE",success:false,error:`Unknown action: ${o.action}`};s.send(e,n.from,{...r,correlationId:n.correlationId??n.id,replyTo:n.correlationId??n.id});}},{types:["REQUEST"]});return {onRequest(n,o){c.set(n,o);},offRequest(n){c.delete(n);},destroy(){l.unsubscribe(),c.clear();}}}function X(s,e){let c=null,l=s.listen(e,async n=>{if(n.type==="DELEGATION"&&c){let o=n,a=Date.now(),r;try{let g=await c(o.task,o.context);r={type:"DELEGATION_RESULT",success:g.success,result:g.result,error:g.error,metrics:g.metrics??{durationMs:Date.now()-a}};}catch(g){r={type:"DELEGATION_RESULT",success:false,error:g instanceof Error?g.message:String(g),metrics:{durationMs:Date.now()-a}};}s.send(e,n.from,{...r,correlationId:n.correlationId??n.id,replyTo:n.correlationId??n.id});}},{types:["DELEGATION"]});return {onDelegation(n){c=n;},offDelegation(){c=null;},destroy(){l.unsubscribe(),c=null;}}}function ee(s,e){let c=new Map,l=s.listen(e,n=>{if(n.type==="UPDATE"){let o=n,a=c.get(o.topic)??[];for(let r of a)r(o.content);}},{types:["UPDATE"]});return {subscribe(n,o){let a=new Map;for(let r of n){let g=c.get(r)??[],t=i=>o(r,i);a.set(r,t),g.push(t),c.set(r,g);}return s.broadcast(e,{type:"SUBSCRIBE",topics:n}),()=>{for(let[r,g]of a){let t=c.get(r);if(t){let i=t.indexOf(g);i>=0&&t.splice(i,1),t.length===0&&c.delete(r);}}a.clear(),s.broadcast(e,{type:"UNSUBSCRIBE",topics:n});}},publish(n,o){s.broadcast(e,{type:"UPDATE",topic:n,content:o});},destroy(){l.unsubscribe(),c.clear();}}}function T(s){return Number.isFinite(s)?s:0}function $(s){let e=Object.keys(s),c=new Map;for(let[u,b]of Object.entries(s))for(let y of b.produces){if(c.has(y))throw new Error(`[Directive Goal] Fact key "${y}" is produced by both "${c.get(y)}" and "${u}". Each fact key must have exactly one producer.`);c.set(y,u);}let l=[],n=new Map,o=new Map;for(let u of e)n.set(u,0),o.set(u,[]);for(let[u,b]of Object.entries(s))for(let y of b.requires??[]){let d=c.get(y);d&&d!==u&&(l.push({from:d,to:u,factKey:y}),o.get(d).push(u),n.set(u,(n.get(u)??0)+1));}let a=[];for(let[u,b]of n)b===0&&a.push(u);let r=[],g=0;for(;g<a.length;){let u=a[g++];r.push(u);for(let b of o.get(u)??[]){let y=(n.get(b)??1)-1;n.set(b,y),y===0&&a.push(b);}}if(r.length!==e.length){let u=new Set(r),b=e.filter(y=>!u.has(y));throw new Error(`[Directive Goal] Circular dependency detected among agents: ${b.join(", ")}. Review their produces/requires declarations.`)}let t=r.filter(u=>(s[u].requires??[]).every(d=>!c.has(d)||c.get(d)===u)),i=new Set;for(let u of l)i.add(u.from);let f=e.filter(u=>!i.has(u));return {order:r,edges:l,roots:t,leaves:f,producers:c}}function ne(s){let e=$(s);return {order:[...e.order],edges:[...e.edges],roots:[...e.roots],leaves:[...e.leaves],producers:new Map(e.producers)}}function se(s){let e=[],c=[];Object.keys(s).length===0&&e.push("No agents declared");for(let[n,o]of Object.entries(s))o.produces.length===0&&c.push(`Agent "${n}" has no produces \u2014 it will never contribute`);let l=new Set;for(let n of Object.values(s))for(let o of n.produces)l.add(o);for(let[n,o]of Object.entries(s))for(let a of o.requires??[])l.has(a)||c.push(`Agent "${n}" requires "${a}" which no agent produces \u2014 must be in initial facts`);try{$(s);}catch(n){e.push(n instanceof Error?n.message:String(n));}return {valid:e.length===0,errors:e,warnings:c}}function re(s,e=[],c=50){let l=$(s),n=new Set;for(let i of Object.values(s))for(let f of i.produces)n.add(f);let o=[];for(let i of Object.values(s))for(let f of i.requires??[])n.has(f)||o.push(f);let a=new Set(e),r=new Set,g=[];for(let i=1;i<=c;i++){let f=l.order.filter(b=>r.has(b)?false:(s[b].requires??[]).every(p=>a.has(p)));if(f.length===0)break;let u=[];for(let b of f){r.add(b);for(let y of s[b].produces)a.has(y)||(u.push(y),a.add(y));}g.push({step:i,agents:f,availableFacts:[...a],producedFacts:u});}let t=Object.keys(s).filter(i=>!r.has(i));return {steps:g,unreachableAgents:t,externalDeps:[...new Set(o)],feasible:t.length===0}}function oe(s){let e=s.stepMetrics.map(t=>{let i=T(t.satisfaction),f=T(t.satisfactionDelta),u=t.nodesRun.join(", "),b=t.factsProduced.length>0?t.factsProduced.join(", "):"none",y=+T(i-f).toFixed(3),d=f>=0?`+${f.toFixed(3)}`:f.toFixed(3),p=`Step ${t.step}: Ran ${u}. Produced: ${b}. Satisfaction: ${y} \u2192 ${i.toFixed(3)} (${d}). ${t.tokensConsumed} tokens, ${t.durationMs}ms.`;return {step:t.step,agents:t.nodesRun,factsProduced:t.factsProduced,satisfaction:i,satisfactionDelta:f,durationMs:t.durationMs,tokensConsumed:t.tokensConsumed,description:p}}),c=s.relaxations.map(t=>{let i;switch(t.strategy){case "allow_rerun":i=`Step ${t.step}: Applied relaxation "${t.label}" \u2014 re-enabled completed nodes for another run.`;break;case "inject_facts":i=`Step ${t.step}: Applied relaxation "${t.label}" \u2014 injected fact values to unblock dependencies.`;break;case "accept_partial":i=`Step ${t.step}: Applied relaxation "${t.label}" \u2014 accepted current facts as partial result.`;break;case "alternative_nodes":i=`Step ${t.step}: Applied relaxation "${t.label}" \u2014 added alternative nodes to the graph.`;break;case "custom":i=`Step ${t.step}: Applied relaxation "${t.label}" \u2014 ran custom recovery logic.`;break;default:i=`Step ${t.step}: Applied relaxation "${t.label}" (${t.strategy}).`;}return {step:t.step,label:t.label,strategy:t.strategy,description:i}}),l=s.stepMetrics.length>0?T(s.stepMetrics[0].satisfaction-s.stepMetrics[0].satisfactionDelta).toFixed(3):"0",n=s.stepMetrics.length>0?T(s.stepMetrics[s.stepMetrics.length-1].satisfaction).toFixed(3):"0",o=s.achieved?"Goal achieved":"Goal not achieved",a=s.relaxations.length>0?` ${s.relaxations.length} relaxation(s) applied.`:"",r=s.error?` Error: ${s.error}`:"",g=`${o} in ${s.steps} step(s) (${s.totalTokens.toLocaleString()} tokens, ${s.durationMs}ms). Satisfaction: ${l} \u2192 ${n}.${a}${r}`;return {achieved:s.achieved,summary:g,steps:e,relaxations:c,totalTokens:s.totalTokens,durationMs:s.durationMs}}export{Y as a,V as b,J as c,Z as d,X as e,ee as f,ne as g,se as h,re as i,oe as j};//# sourceMappingURL=chunk-56LYSE63.js.map
|
|
6
|
+
//# sourceMappingURL=chunk-56LYSE63.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/pattern-mermaid.ts","../src/communication.ts","../src/goal-utils.ts"],"names":["sanitizeId","name","sanitizeLabel","ch","SHAPE_WRAPPERS","wrapNode","id","label","type","shapes","shape","open","close","deduplicateAgents","agents","counts","a","indices","result","sanitized","idx","topoSort","nodes","inDegree","adjacency","key","node","dep","queue","deg","ordered","current","neighbors","neighbor","newDeg","insertIdx","q","isSerializedPattern","p","obj","n","buildPreamble","direction","theme","lines","ALLOWED_TYPES","renderParallel","taskIds","handlers","inputNode","mergeNode","handler","nodeType","handlerNode","renderSequential","renderSupervisor","supId","supNode","worker","wId","wNode","renderDag","sorted","rendered","nodeId","nodeLabel","deps","depId","depNode","depLabel","depType","from","to","renderRace","outputNode","renderReflect","producerId","evalId","producerType","producerNode","evalNode","renderGoal","nodeEntries","producerMap","edgeSet","sortedEntries","b","requires","producer","fromNode","edgeKey","fromId","fromType","toType","renderDebate","judgeId","judgeNode","patternToMermaid","pattern","options","serialized","patternToJSON","preamble","body","generateId","createMessageBus","config","maxHistory","defaultTtlMs","maxPendingPerAgent","persistence","onDelivery","onDeliveryError","subscriptions","messageHistory","messageIndex","pendingMessages","matchesFilter","message","filter","topic","isExpired","getRecipients","deliverMessage","recipients","deliveredTo","deliveryPromises","recipientId","recipientSubs","pending","sub","error","partial","removed","err","agentId","subId","subscription","subs","index","s","existing","msg","limit","messages","m","createAgentNetwork","bus","initialAgents","defaultTimeout","onAgentOnline","onAgentOffline","responseWaiters","info","handleResponse","correlationId","waiter","wasOffline","agent","capability","sender","action","payload","timeout","resolve","reject","timer","task","context","question","createResponder","network","request","response","createDelegator","delegationHandler","delegation","start","createPubSub","topicHandlers","update","topics","wrappedHandlers","wrappedHandler","content","safeSatisfaction","val","buildGraph","agentIds","decl","edges","order","queueIdx","orderSet","inCycle","roots","consumedBy","edge","leaves","getDependencyGraph","graph","validateGoal","errors","warnings","allProduced","planGoal","initialFactKeys","maxSteps","externalDeps","availableFacts","completedAgents","steps","stepNum","readyAgents","producedFacts","unreachableAgents","explainGoal","metric","sat","satDelta","agentList","factList","prevSatisfaction","delta","description","relaxations","r","firstSatisfaction","lastSatisfaction","status","relaxationNote","errorNote","summary"],"mappings":"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","file":"chunk-56LYSE63.js","sourcesContent":["import { patternToJSON } from \"./multi-agent-orchestrator.js\";\nimport type {\n ExecutionPattern,\n SerializedDagNode,\n SerializedPattern,\n} from \"./multi-agent-orchestrator.js\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type MermaidDirection = \"LR\" | \"TD\" | \"TB\" | \"RL\" | \"BT\";\n\nexport interface MermaidNodeShapes {\n /** Shape for agent nodes. @default \"square\" */\n agent?: \"square\" | \"round\" | \"stadium\" | \"hexagon\";\n /** Shape for task nodes. @default \"hexagon\" */\n task?: \"square\" | \"round\" | \"stadium\" | \"hexagon\";\n /** Shape for virtual nodes (Input, Output, Merge). @default \"circle\" */\n virtual?: \"circle\" | \"square\" | \"round\" | \"stadium\";\n}\n\nexport interface MermaidOptions {\n /** Graph flow direction. @default \"LR\" */\n direction?: MermaidDirection;\n /** Emits %%{init}%% preamble when set. */\n theme?: \"default\" | \"dark\" | \"forest\" | \"neutral\";\n /** Node shape overrides. */\n shapes?: MermaidNodeShapes;\n /** Set of task IDs — used to render task nodes with distinct shapes. */\n taskIds?: ReadonlySet<string>;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Replace non-alphanumeric chars with `_` for Mermaid-safe node IDs. */\nfunction sanitizeId(name: string): string {\n return name.replace(/[^a-zA-Z0-9]/g, \"_\");\n}\n\n/** Escape characters that have special meaning in Mermaid labels. */\nfunction sanitizeLabel(name: string): string {\n return name\n .replace(/[\\r\\n]+/g, \" \")\n .replace(/[[\\](){}|<>\"]/g, (ch) => `#${ch.charCodeAt(0)};`);\n}\n\nconst SHAPE_WRAPPERS: Record<string, [string, string]> = {\n square: [\"[\", \"]\"],\n round: [\"(\", \")\"],\n stadium: [\"([\", \"])\"],\n hexagon: [\"{{\", \"}}\"],\n circle: [\"((\", \"))\"],\n};\n\n/** Produce `id[label]` or `id((label))` etc. based on shape config. */\nfunction wrapNode(\n id: string,\n label: string,\n type: \"agent\" | \"virtual\" | \"task\",\n shapes?: MermaidNodeShapes,\n): string {\n let shape: string;\n if (type === \"task\") {\n shape = shapes?.task ?? \"hexagon\";\n } else if (type === \"agent\") {\n shape = shapes?.agent ?? \"square\";\n } else {\n shape = shapes?.virtual ?? \"circle\";\n }\n const [open, close] = SHAPE_WRAPPERS[shape]!;\n\n return `${id}${open}${sanitizeLabel(label)}${close}`;\n}\n\n/**\n * When the same agent appears multiple times (parallel/race), append `_1`, `_2`\n * suffixes to IDs and adjust labels to `agent #1`, etc.\n */\nfunction deduplicateAgents(\n agents: string[],\n): Array<{ id: string; label: string }> {\n const counts = new Map<string, number>();\n for (const a of agents) {\n counts.set(a, (counts.get(a) ?? 0) + 1);\n }\n\n const indices = new Map<string, number>();\n const result: Array<{ id: string; label: string }> = [];\n\n for (const a of agents) {\n const sanitized = sanitizeId(a);\n if (counts.get(a)! > 1) {\n const idx = (indices.get(a) ?? 0) + 1;\n indices.set(a, idx);\n result.push({ id: `${sanitized}_${idx}`, label: `${a} #${idx}` });\n } else {\n result.push({ id: sanitized, label: a });\n }\n }\n\n return result;\n}\n\n/**\n * Kahn's algorithm with alphabetical tie-breaking for deterministic DAG ordering.\n * Returns node keys in topological order.\n */\nfunction topoSort(nodes: Record<string, SerializedDagNode>): string[] {\n const inDegree = new Map<string, number>();\n const adjacency = new Map<string, string[]>();\n\n for (const key of Object.keys(nodes)) {\n if (!inDegree.has(key)) {\n inDegree.set(key, 0);\n }\n if (!adjacency.has(key)) {\n adjacency.set(key, []);\n }\n }\n\n for (const [key, node] of Object.entries(nodes)) {\n for (const dep of node.deps ?? []) {\n adjacency.get(dep)!.push(key);\n inDegree.set(key, (inDegree.get(key) ?? 0) + 1);\n }\n }\n\n // Seed queue with zero-indegree nodes, sorted alphabetically\n const queue: string[] = [];\n for (const [key, deg] of inDegree) {\n if (deg === 0) {\n queue.push(key);\n }\n }\n queue.sort();\n\n const ordered: string[] = [];\n while (queue.length > 0) {\n const current = queue.shift()!;\n ordered.push(current);\n\n const neighbors = adjacency.get(current) ?? [];\n // Sort to maintain determinism\n neighbors.sort();\n\n for (const neighbor of neighbors) {\n const newDeg = inDegree.get(neighbor)! - 1;\n inDegree.set(neighbor, newDeg);\n if (newDeg === 0) {\n // Insert in sorted position\n const insertIdx = queue.findIndex((q) => q > neighbor);\n if (insertIdx === -1) {\n queue.push(neighbor);\n } else {\n queue.splice(insertIdx, 0, neighbor);\n }\n }\n }\n }\n\n return ordered;\n}\n\n/** Check if input is already serialized (no function fields). */\nfunction isSerializedPattern(\n p: ExecutionPattern<unknown> | SerializedPattern,\n): p is SerializedPattern {\n // SerializedPattern never has function-valued fields.\n // Check a few known function fields to distinguish.\n const obj = p as Record<string, unknown>;\n if (obj.type === \"parallel\" && typeof obj.merge === \"function\") {\n return false;\n }\n if (obj.type === \"sequential\" && typeof obj.transform === \"function\") {\n return false;\n }\n if (obj.type === \"supervisor\" && typeof obj.extract === \"function\") {\n return false;\n }\n if (obj.type === \"dag\" && typeof obj.merge === \"function\") {\n return false;\n }\n if (obj.type === \"reflect\" && typeof obj.parseEvaluation === \"function\") {\n return false;\n }\n if (obj.type === \"race\" && typeof obj.extract === \"function\") {\n return false;\n }\n if (obj.type === \"debate\" && typeof obj.extract === \"function\") {\n return false;\n }\n if (\n obj.type === \"goal\" &&\n (typeof obj.when === \"function\" ||\n typeof obj.satisfaction === \"function\" ||\n typeof obj.extract === \"function\")\n ) {\n return false;\n }\n\n // Also check: if a dag node has `when` or `transform` functions, not serialized\n if (obj.type === \"dag\" && obj.nodes) {\n for (const node of Object.values(obj.nodes as Record<string, unknown>)) {\n const n = node as Record<string, unknown>;\n if (typeof n.when === \"function\" || typeof n.transform === \"function\") {\n return false;\n }\n }\n }\n\n // Also check: if a goal node has `buildInput` or `extractOutput` functions, not serialized\n if (obj.type === \"goal\" && obj.nodes) {\n for (const node of Object.values(obj.nodes as Record<string, unknown>)) {\n const n = node as Record<string, unknown>;\n if (\n typeof n.buildInput === \"function\" ||\n typeof n.extractOutput === \"function\"\n ) {\n return false;\n }\n }\n }\n\n return true;\n}\n\n/** Build the preamble: optional %%{init}%% + graph directive. */\nfunction buildPreamble(direction: MermaidDirection, theme?: string): string {\n const lines: string[] = [];\n if (theme) {\n lines.push(`%%{init: {'theme': '${theme}'}}%%`);\n }\n lines.push(`graph ${direction}`);\n\n return lines.join(\"\\n\");\n}\n\nconst ALLOWED_TYPES = new Set([\n \"parallel\",\n \"sequential\",\n \"supervisor\",\n \"dag\",\n \"reflect\",\n \"race\",\n \"debate\",\n \"goal\",\n]);\n\n// ---------------------------------------------------------------------------\n// Renderers\n// ---------------------------------------------------------------------------\n\nfunction renderParallel(\n p: Extract<SerializedPattern, { type: \"parallel\" }>,\n shapes?: MermaidNodeShapes,\n taskIds?: ReadonlySet<string>,\n): string[] {\n const handlers = deduplicateAgents(p.handlers);\n const inputNode = wrapNode(\"__input\", \"Input\", \"virtual\", shapes);\n const mergeNode = wrapNode(\"__merge\", \"Merge\", \"virtual\", shapes);\n const lines: string[] = [];\n\n for (const handler of handlers) {\n const nodeType = taskIds?.has(handler.label)\n ? (\"task\" as const)\n : (\"agent\" as const);\n const handlerNode = wrapNode(handler.id, handler.label, nodeType, shapes);\n lines.push(` ${inputNode} --> ${handlerNode}`);\n lines.push(` ${handlerNode} --> ${mergeNode}`);\n }\n\n return lines;\n}\n\nfunction renderSequential(\n p: Extract<SerializedPattern, { type: \"sequential\" }>,\n shapes?: MermaidNodeShapes,\n taskIds?: ReadonlySet<string>,\n): string[] {\n if (p.handlers.length === 0) {\n return [];\n }\n\n const handlers = p.handlers.map((a) => ({\n id: sanitizeId(a),\n label: a,\n }));\n\n const nodes = handlers.map((a) =>\n wrapNode(a.id, a.label, taskIds?.has(a.label) ? \"task\" : \"agent\", shapes),\n );\n\n return [` ${nodes.join(\" --> \")}`];\n}\n\nfunction renderSupervisor(\n p: Extract<SerializedPattern, { type: \"supervisor\" }>,\n shapes?: MermaidNodeShapes,\n): string[] {\n const supId = sanitizeId(p.supervisor);\n const supNode = wrapNode(supId, p.supervisor, \"agent\", shapes);\n const lines: string[] = [];\n\n for (const worker of p.workers) {\n const wId = sanitizeId(worker);\n const wNode = wrapNode(wId, worker, \"agent\", shapes);\n lines.push(` ${supNode} -->|delegate| ${wNode}`);\n lines.push(` ${wNode} -->|result| ${supNode}`);\n }\n\n return lines;\n}\n\nfunction renderDag(\n p: Extract<SerializedPattern, { type: \"dag\" }>,\n shapes?: MermaidNodeShapes,\n taskIds?: ReadonlySet<string>,\n): string[] {\n const sorted = topoSort(p.nodes);\n const lines: string[] = [];\n const rendered = new Set<string>();\n\n for (const key of sorted) {\n const node = p.nodes[key]!;\n const nodeId = sanitizeId(key);\n const nodeLabel = node.handler;\n const nodeType = taskIds?.has(node.handler)\n ? (\"task\" as const)\n : (\"agent\" as const);\n\n if (!node.deps || node.deps.length === 0) {\n if (!rendered.has(nodeId)) {\n lines.push(` ${wrapNode(nodeId, nodeLabel, nodeType, shapes)}`);\n rendered.add(nodeId);\n }\n }\n\n const deps = [...(node.deps ?? [])].sort();\n for (const dep of deps) {\n const depId = sanitizeId(dep);\n const depNode = p.nodes[dep]!;\n const depLabel = depNode.handler;\n const depType = taskIds?.has(depNode.handler)\n ? (\"task\" as const)\n : (\"agent\" as const);\n const from = wrapNode(depId, depLabel, depType, shapes);\n const to = wrapNode(nodeId, nodeLabel, nodeType, shapes);\n lines.push(` ${from} --> ${to}`);\n rendered.add(depId);\n rendered.add(nodeId);\n }\n }\n\n return lines;\n}\n\nfunction renderRace(\n p: Extract<SerializedPattern, { type: \"race\" }>,\n shapes?: MermaidNodeShapes,\n taskIds?: ReadonlySet<string>,\n): string[] {\n const handlers = deduplicateAgents(p.handlers);\n const inputNode = wrapNode(\"__input\", \"Input\", \"virtual\", shapes);\n const outputNode = wrapNode(\"__output\", \"Output\", \"virtual\", shapes);\n const lines: string[] = [];\n\n for (const handler of handlers) {\n const nodeType = taskIds?.has(handler.label)\n ? (\"task\" as const)\n : (\"agent\" as const);\n const handlerNode = wrapNode(handler.id, handler.label, nodeType, shapes);\n lines.push(` ${inputNode} --> ${handlerNode}`);\n lines.push(` ${handlerNode} -.-> ${outputNode}`);\n }\n\n return lines;\n}\n\nfunction renderReflect(\n p: Extract<SerializedPattern, { type: \"reflect\" }>,\n shapes?: MermaidNodeShapes,\n taskIds?: ReadonlySet<string>,\n): string[] {\n const producerId = sanitizeId(p.handler);\n const evalId = sanitizeId(p.evaluator);\n const producerType = taskIds?.has(p.handler)\n ? (\"task\" as const)\n : (\"agent\" as const);\n const producerNode = wrapNode(producerId, p.handler, producerType, shapes);\n const evalNode = wrapNode(evalId, p.evaluator, \"agent\", shapes);\n const outputNode = wrapNode(\"__output\", \"Output\", \"virtual\", shapes);\n\n return [\n ` ${producerNode} --> ${evalNode}`,\n ` ${evalNode} -->|feedback| ${producerNode}`,\n ` ${evalNode} -->|pass| ${outputNode}`,\n ];\n}\n\nfunction renderGoal(\n p: Extract<SerializedPattern, { type: \"goal\" }>,\n shapes?: MermaidNodeShapes,\n taskIds?: ReadonlySet<string>,\n): string[] {\n const nodeEntries = Object.entries(p.nodes);\n const lines: string[] = [];\n\n // Build a map: factKey → nodeId that produces it\n const producerMap = new Map<string, string>();\n for (const [nodeId, node] of nodeEntries) {\n for (const key of node.produces) {\n producerMap.set(key, nodeId);\n }\n }\n\n // Build edges from produces/requires declarations\n const rendered = new Set<string>();\n const edgeSet = new Set<string>();\n\n // Sort node entries for determinism\n const sortedEntries = [...nodeEntries].sort(([a], [b]) => a.localeCompare(b));\n\n for (const [nodeId, node] of sortedEntries) {\n const id = sanitizeId(nodeId);\n const requires = [...(node.requires ?? [])].sort();\n\n if (requires.length === 0) {\n if (!rendered.has(id)) {\n const nodeType = taskIds?.has(node.handler)\n ? (\"task\" as const)\n : (\"agent\" as const);\n lines.push(` ${wrapNode(id, node.handler, nodeType, shapes)}`);\n rendered.add(id);\n }\n }\n\n for (const key of requires) {\n const producer = producerMap.get(key);\n if (producer && producer !== nodeId) {\n const fromNode = p.nodes[producer];\n if (!fromNode) {\n continue;\n }\n const edgeKey = `${producer}->${nodeId}`;\n if (!edgeSet.has(edgeKey)) {\n const fromId = sanitizeId(producer);\n const fromType = taskIds?.has(fromNode.handler)\n ? (\"task\" as const)\n : (\"agent\" as const);\n const toType = taskIds?.has(node.handler)\n ? (\"task\" as const)\n : (\"agent\" as const);\n const from = wrapNode(fromId, fromNode.handler, fromType, shapes);\n const to = wrapNode(id, node.handler, toType, shapes);\n lines.push(` ${from} -->|${sanitizeLabel(key)}| ${to}`);\n rendered.add(fromId);\n rendered.add(id);\n edgeSet.add(edgeKey);\n }\n }\n }\n }\n\n // Render any isolated nodes (no incoming or outgoing edges)\n for (const [nodeId, node] of sortedEntries) {\n const id = sanitizeId(nodeId);\n if (!rendered.has(id)) {\n const nodeType = taskIds?.has(node.handler)\n ? (\"task\" as const)\n : (\"agent\" as const);\n lines.push(` ${wrapNode(id, node.handler, nodeType, shapes)}`);\n rendered.add(id);\n }\n }\n\n return lines;\n}\n\nfunction renderDebate(\n p: Extract<SerializedPattern, { type: \"debate\" }>,\n shapes?: MermaidNodeShapes,\n taskIds?: ReadonlySet<string>,\n): string[] {\n const handlers = deduplicateAgents(p.handlers);\n const judgeId = sanitizeId(p.evaluator);\n const judgeNode = wrapNode(judgeId, p.evaluator, \"agent\", shapes);\n const outputNode = wrapNode(\"__output\", \"Output\", \"virtual\", shapes);\n const lines: string[] = [];\n\n for (const handler of handlers) {\n const nodeType = taskIds?.has(handler.label)\n ? (\"task\" as const)\n : (\"agent\" as const);\n const handlerNode = wrapNode(handler.id, handler.label, nodeType, shapes);\n lines.push(` ${handlerNode} --> ${judgeNode}`);\n lines.push(` ${judgeNode} -->|next round| ${handlerNode}`);\n }\n\n lines.push(` ${judgeNode} --> ${outputNode}`);\n\n return lines;\n}\n\n// ---------------------------------------------------------------------------\n// Main\n// ---------------------------------------------------------------------------\n\n/**\n * Convert an execution pattern to a Mermaid diagram string.\n *\n * Accepts both runtime `ExecutionPattern` (with function callbacks) and\n * pre-serialized `SerializedPattern`. Normalizes internally via `patternToJSON()`\n * when it detects function-valued fields.\n *\n * @example\n * ```typescript\n * const p = dag({ fetch: { handler: \"fetcher\" }, report: { handler: \"reporter\", deps: [\"fetch\"] } });\n * console.log(patternToMermaid(p, { direction: \"TD\" }));\n * // graph TD\n * // fetch[fetcher]\n * // fetch[fetcher] --> report[reporter]\n * ```\n *\n * @throws If pattern type is not one of the 8 known types.\n */\nexport function patternToMermaid(\n pattern: ExecutionPattern<unknown> | SerializedPattern,\n options?: MermaidOptions,\n): string {\n const direction = options?.direction ?? \"LR\";\n const shapes = options?.shapes;\n const taskIds = options?.taskIds;\n\n // Normalize to SerializedPattern\n const serialized: SerializedPattern = isSerializedPattern(pattern)\n ? pattern\n : patternToJSON(pattern as ExecutionPattern<unknown>);\n\n if (!ALLOWED_TYPES.has(serialized.type)) {\n throw new Error(\n `[Directive] patternToMermaid: unknown pattern type \"${serialized.type}\"`,\n );\n }\n\n const preamble = buildPreamble(direction, options?.theme);\n let body: string[] = [];\n\n switch (serialized.type) {\n case \"parallel\":\n body = renderParallel(serialized, shapes, taskIds);\n break;\n case \"sequential\":\n body = renderSequential(serialized, shapes, taskIds);\n break;\n case \"supervisor\":\n body = renderSupervisor(serialized, shapes);\n break;\n case \"dag\":\n body = renderDag(serialized, shapes, taskIds);\n break;\n case \"race\":\n body = renderRace(serialized, shapes, taskIds);\n break;\n case \"reflect\":\n body = renderReflect(serialized, shapes, taskIds);\n break;\n case \"debate\":\n body = renderDebate(serialized, shapes, taskIds);\n break;\n case \"goal\":\n body = renderGoal(serialized, shapes, taskIds);\n break;\n }\n\n return `${preamble}\\n${body.join(\"\\n\")}\\n`;\n}\n","/**\n * Agent-to-Agent Communication Protocol\n *\n * Provides structured communication channels between agents for coordination,\n * delegation, and knowledge sharing without central orchestration.\n *\n * @example\n * ```typescript\n * import { createAgentNetwork, createMessageBus } from '@directive-run/ai';\n *\n * const messageBus = createMessageBus();\n *\n * const network = createAgentNetwork({\n * bus: messageBus,\n * agents: {\n * researcher: { capabilities: ['search', 'analyze'] },\n * writer: { capabilities: ['draft', 'edit'] },\n * reviewer: { capabilities: ['review', 'approve'] },\n * },\n * });\n *\n * // Agents can send messages to each other\n * await network.send('researcher', 'writer', {\n * type: 'DELEGATION',\n * task: 'Draft an article based on this research',\n * context: { findings: [...] },\n * });\n * ```\n */\n\n// ============================================================================\n// Message Types\n// ============================================================================\n\n/** Base message structure */\nexport interface AgentMessage {\n id: string;\n type: AgentMessageType;\n from: string;\n to: string | string[] | \"*\"; // Single agent, multiple agents, or broadcast\n timestamp: number;\n correlationId?: string; // For request-response patterns\n replyTo?: string; // Message ID this is replying to\n priority?: \"low\" | \"normal\" | \"high\" | \"urgent\";\n ttlMs?: number; // Time-to-live\n metadata?: Record<string, unknown>;\n}\n\n/** Message types for agent communication */\nexport type AgentMessageType =\n | \"REQUEST\" // Request another agent to do something\n | \"RESPONSE\" // Response to a request\n | \"DELEGATION\" // Delegate a task to another agent\n | \"DELEGATION_RESULT\" // Result of a delegated task\n | \"QUERY\" // Ask for information\n | \"INFORM\" // Share information without expecting response\n | \"SUBSCRIBE\" // Subscribe to updates\n | \"UNSUBSCRIBE\" // Unsubscribe from updates\n | \"UPDATE\" // Push update to subscribers\n | \"ACK\" // Acknowledgment\n | \"NACK\" // Negative acknowledgment (rejection)\n | \"PING\" // Health check\n | \"PONG\" // Health check response\n | \"CUSTOM\"; // Custom message type\n\n/** Request message */\nexport interface RequestMessage extends AgentMessage {\n type: \"REQUEST\";\n action: string;\n payload: Record<string, unknown>;\n timeout?: number;\n}\n\n/** Response message */\nexport interface ResponseMessage extends AgentMessage {\n type: \"RESPONSE\";\n success: boolean;\n result?: unknown;\n error?: string;\n}\n\n/** Delegation message */\nexport interface DelegationMessage extends AgentMessage {\n type: \"DELEGATION\";\n task: string;\n context: Record<string, unknown>;\n constraints?: {\n deadline?: number;\n maxCost?: number;\n requiredCapabilities?: string[];\n };\n}\n\n/** Delegation result message */\nexport interface DelegationResultMessage extends AgentMessage {\n type: \"DELEGATION_RESULT\";\n success: boolean;\n result?: unknown;\n error?: string;\n metrics?: {\n durationMs: number;\n tokensUsed?: number;\n cost?: number;\n };\n}\n\n/** Query message */\nexport interface QueryMessage extends AgentMessage {\n type: \"QUERY\";\n question: string;\n context?: Record<string, unknown>;\n}\n\n/** Inform message */\nexport interface InformMessage extends AgentMessage {\n type: \"INFORM\";\n topic: string;\n content: unknown;\n}\n\n/** Subscribe message */\nexport interface SubscribeMessage extends AgentMessage {\n type: \"SUBSCRIBE\";\n topics: string[];\n}\n\n/** Update message */\nexport interface UpdateMessage extends AgentMessage {\n type: \"UPDATE\";\n topic: string;\n content: unknown;\n}\n\n/** Union of all message types */\nexport type TypedAgentMessage =\n | RequestMessage\n | ResponseMessage\n | DelegationMessage\n | DelegationResultMessage\n | QueryMessage\n | InformMessage\n | SubscribeMessage\n | UpdateMessage\n | (AgentMessage & {\n type: \"UNSUBSCRIBE\" | \"ACK\" | \"NACK\" | \"PING\" | \"PONG\" | \"CUSTOM\";\n });\n\n// ============================================================================\n// Message Bus Types\n// ============================================================================\n\n/** Message handler function */\nexport type MessageHandler = (\n message: TypedAgentMessage,\n) => void | Promise<void>;\n\n/** Subscription to messages */\nexport interface Subscription {\n id: string;\n agentId: string;\n handler: MessageHandler;\n filter?: MessageFilter;\n unsubscribe: () => void;\n}\n\n/** Message filter criteria */\nexport interface MessageFilter {\n types?: AgentMessageType[];\n from?: string | string[];\n topics?: string[];\n priority?: (\"low\" | \"normal\" | \"high\" | \"urgent\")[];\n custom?: (message: TypedAgentMessage) => boolean;\n}\n\n/** Message bus configuration */\nexport interface MessageBusConfig {\n /** Maximum messages to retain in history */\n maxHistory?: number;\n /** Default TTL for messages */\n defaultTtlMs?: number;\n /** Maximum pending messages per offline agent (prevents unbounded queue growth) */\n maxPendingPerAgent?: number;\n /** Enable message persistence */\n persistence?: MessagePersistence;\n /** Callback when message is delivered */\n onDelivery?: (message: TypedAgentMessage, recipients: string[]) => void;\n /** Callback when message delivery fails */\n onDeliveryError?: (message: TypedAgentMessage, error: Error) => void;\n}\n\n/** Message persistence interface */\nexport interface MessagePersistence {\n save(message: TypedAgentMessage): Promise<void>;\n load(agentId: string, since?: number): Promise<TypedAgentMessage[]>;\n delete(messageId: string): Promise<void>;\n clear(agentId?: string): Promise<void>;\n}\n\n/** Message bus instance */\nexport interface MessageBus {\n /** Publish a message */\n publish(message: Omit<TypedAgentMessage, \"id\" | \"timestamp\">): string;\n /** Subscribe to messages */\n subscribe(\n agentId: string,\n handler: MessageHandler,\n filter?: MessageFilter,\n ): Subscription;\n /** Get message history */\n getHistory(filter?: MessageFilter, limit?: number): TypedAgentMessage[];\n /** Get a specific message by ID */\n getMessage(id: string): TypedAgentMessage | undefined;\n /** Get pending messages for an agent */\n getPending(agentId: string): TypedAgentMessage[];\n /** Clear all messages and data */\n clear(): void;\n /** Destroy the message bus, clearing all data and subscriptions */\n destroy(): void;\n}\n\n// ============================================================================\n// Message Bus Factory\n// ============================================================================\n\nfunction generateId(): string {\n return (\n globalThis.crypto?.randomUUID?.() ??\n `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 11)}`\n );\n}\n\n/**\n * Create a message bus for agent communication.\n *\n * @example\n * ```typescript\n * const bus = createMessageBus({ maxHistory: 1000 });\n *\n * // Subscribe to messages\n * bus.subscribe('writer', (msg) => {\n * console.log(`Writer received: ${msg.type}`);\n * });\n *\n * // Publish a message\n * bus.publish({\n * type: 'DELEGATION',\n * from: 'researcher',\n * to: 'writer',\n * task: 'Write summary',\n * context: { data: '...' },\n * });\n * ```\n */\n/**\n * Note: `publish()` is fire-and-forget -- it returns the message ID synchronously\n * before delivery completes. Use `onDelivery` / `onDeliveryError` callbacks in\n * config to track delivery status if needed.\n */\nexport function createMessageBus(config: MessageBusConfig = {}): MessageBus {\n const {\n maxHistory = 1000,\n defaultTtlMs = 3600000, // 1 hour\n maxPendingPerAgent = 100,\n persistence,\n onDelivery,\n onDeliveryError,\n } = config;\n\n const subscriptions = new Map<string, Subscription[]>();\n const messageHistory: TypedAgentMessage[] = [];\n const messageIndex = new Map<string, TypedAgentMessage>(); // O(1) lookup by ID\n const pendingMessages = new Map<string, TypedAgentMessage[]>();\n\n function matchesFilter(\n message: TypedAgentMessage,\n filter: MessageFilter,\n ): boolean {\n if (filter.types && !filter.types.includes(message.type)) {\n return false;\n }\n if (filter.from) {\n const fromList = Array.isArray(filter.from) ? filter.from : [filter.from];\n if (!fromList.includes(message.from)) {\n return false;\n }\n }\n if (filter.topics) {\n const topic = (message as InformMessage | UpdateMessage).topic;\n if (topic && !filter.topics.includes(topic)) {\n return false;\n }\n }\n if (\n filter.priority &&\n message.priority &&\n !filter.priority.includes(message.priority)\n ) {\n return false;\n }\n if (filter.custom && !filter.custom(message)) {\n return false;\n }\n return true;\n }\n\n function isExpired(message: TypedAgentMessage): boolean {\n if (!message.ttlMs) return false;\n return Date.now() - message.timestamp > message.ttlMs;\n }\n\n function getRecipients(message: TypedAgentMessage): string[] {\n if (message.to === \"*\") {\n return Array.from(subscriptions.keys());\n }\n if (Array.isArray(message.to)) {\n return message.to;\n }\n return [message.to];\n }\n\n async function deliverMessage(message: TypedAgentMessage): Promise<void> {\n // Skip expired messages\n if (isExpired(message)) return;\n\n const recipients = getRecipients(message);\n const deliveredTo: string[] = [];\n\n // Build delivery promises for all recipients in parallel\n const deliveryPromises: Promise<void>[] = [];\n\n for (const recipientId of recipients) {\n const recipientSubs = subscriptions.get(recipientId) ?? [];\n\n if (recipientSubs.length === 0) {\n // Queue message for offline agent (bounded)\n const pending = pendingMessages.get(recipientId) ?? [];\n pending.push(message);\n // Drop oldest if over limit\n while (pending.length > maxPendingPerAgent) {\n pending.shift();\n }\n pendingMessages.set(recipientId, pending);\n continue;\n }\n\n for (const sub of recipientSubs) {\n if (!sub.filter || matchesFilter(message, sub.filter)) {\n deliveryPromises.push(\n Promise.resolve(sub.handler(message)).then(\n () => {\n deliveredTo.push(recipientId);\n },\n (error) => {\n onDeliveryError?.(\n message,\n error instanceof Error ? error : new Error(String(error)),\n );\n },\n ),\n );\n }\n }\n }\n\n // Wait for all deliveries to settle in parallel\n if (deliveryPromises.length > 0) {\n await Promise.allSettled(deliveryPromises);\n }\n\n if (deliveredTo.length > 0) {\n onDelivery?.(message, deliveredTo);\n }\n\n // Persist if configured\n if (persistence) {\n await persistence.save(message);\n }\n }\n\n return {\n publish(partial: Omit<TypedAgentMessage, \"id\" | \"timestamp\">): string {\n const message: TypedAgentMessage = {\n ...partial,\n id: generateId(),\n timestamp: Date.now(),\n priority: partial.priority ?? \"normal\",\n ttlMs: partial.ttlMs ?? defaultTtlMs,\n } as TypedAgentMessage;\n\n // Add to history and index\n messageHistory.push(message);\n messageIndex.set(message.id, message);\n\n // Trim old messages (remove from both history and index)\n while (messageHistory.length > maxHistory) {\n const removed = messageHistory.shift();\n if (removed) {\n messageIndex.delete(removed.id);\n }\n }\n\n // Deliver asynchronously\n deliverMessage(message).catch((error) => {\n const err = error instanceof Error ? error : new Error(String(error));\n if (onDeliveryError) {\n onDeliveryError(message, err);\n } else {\n console.error(\"[Directive MessageBus] Delivery error:\", err);\n }\n });\n\n return message.id;\n },\n\n subscribe(\n agentId: string,\n handler: MessageHandler,\n filter?: MessageFilter,\n ): Subscription {\n const subId = generateId();\n\n const subscription: Subscription = {\n id: subId,\n agentId,\n handler,\n filter,\n unsubscribe: () => {\n const subs = subscriptions.get(agentId) ?? [];\n const index = subs.findIndex((s) => s.id === subId);\n if (index >= 0) {\n subs.splice(index, 1);\n }\n },\n };\n\n const existing = subscriptions.get(agentId) ?? [];\n existing.push(subscription);\n subscriptions.set(agentId, existing);\n\n // Deliver pending messages\n const pending = pendingMessages.get(agentId) ?? [];\n pendingMessages.delete(agentId);\n for (const msg of pending) {\n if (!filter || matchesFilter(msg, filter)) {\n const result = handler(msg);\n if (result instanceof Promise) {\n result.catch((error) => {\n const err =\n error instanceof Error ? error : new Error(String(error));\n if (onDeliveryError) {\n onDeliveryError(msg, err);\n } else {\n console.error(\n \"[Directive MessageBus] Pending delivery error:\",\n err,\n );\n }\n });\n }\n }\n }\n\n return subscription;\n },\n\n getHistory(filter?: MessageFilter, limit = 100): TypedAgentMessage[] {\n let messages = messageHistory.filter((m) => !isExpired(m));\n\n if (filter) {\n messages = messages.filter((m) => matchesFilter(m, filter));\n }\n\n return messages.slice(-limit);\n },\n\n getMessage(id: string): TypedAgentMessage | undefined {\n const msg = messageIndex.get(id);\n if (msg && isExpired(msg)) return undefined;\n return msg;\n },\n\n getPending(agentId: string): TypedAgentMessage[] {\n const pending = pendingMessages.get(agentId) ?? [];\n return pending.filter((m) => !isExpired(m));\n },\n\n clear(): void {\n messageHistory.length = 0;\n messageIndex.clear();\n pendingMessages.clear();\n },\n\n destroy(): void {\n messageHistory.length = 0;\n messageIndex.clear();\n pendingMessages.clear();\n subscriptions.clear();\n },\n };\n}\n\n// ============================================================================\n// Agent Network Types\n// ============================================================================\n\n/** Agent registration info */\nexport interface AgentInfo {\n id: string;\n capabilities: string[];\n status: \"online\" | \"offline\" | \"busy\";\n lastSeen: number;\n metadata?: Record<string, unknown>;\n}\n\n/** Agent network configuration */\nexport interface AgentNetworkConfig {\n /** Message bus to use */\n bus: MessageBus;\n /** Registered agents */\n agents?: Record<string, Omit<AgentInfo, \"id\" | \"lastSeen\" | \"status\">>;\n /** Timeout for request-response patterns */\n defaultTimeout?: number;\n /** Callback when agent comes online */\n onAgentOnline?: (agentId: string) => void;\n /** Callback when agent goes offline */\n onAgentOffline?: (agentId: string) => void;\n}\n\n/** Agent network instance */\nexport interface AgentNetwork {\n /** Register an agent */\n register(\n id: string,\n info: Omit<AgentInfo, \"id\" | \"lastSeen\" | \"status\">,\n ): void;\n /** Unregister an agent */\n unregister(id: string): void;\n /** Get agent info */\n getAgent(id: string): AgentInfo | undefined;\n /** Get all agents */\n getAgents(): AgentInfo[];\n /** Find agents by capability */\n findByCapability(capability: string): AgentInfo[];\n /** Send a message */\n send(\n from: string,\n to: string | string[],\n message: Partial<TypedAgentMessage>,\n ): string;\n /** Send a request and wait for response */\n request(\n from: string,\n to: string,\n action: string,\n payload: Record<string, unknown>,\n timeout?: number,\n ): Promise<ResponseMessage>;\n /** Delegate a task */\n delegate(\n from: string,\n to: string,\n task: string,\n context: Record<string, unknown>,\n ): Promise<DelegationResultMessage>;\n /** Query an agent */\n query(\n from: string,\n to: string,\n question: string,\n context?: Record<string, unknown>,\n ): Promise<ResponseMessage>;\n /** Broadcast to all agents */\n broadcast(from: string, message: Partial<TypedAgentMessage>): string;\n /** Subscribe an agent to messages */\n listen(\n agentId: string,\n handler: MessageHandler,\n filter?: MessageFilter,\n ): Subscription;\n /** Get the message bus */\n getBus(): MessageBus;\n /** Destroy the network, clearing pending waiters and timers */\n destroy(): void;\n}\n\n// ============================================================================\n// Agent Network Factory\n// ============================================================================\n\n/**\n * Create an agent network for coordinated communication.\n *\n * @example\n * ```typescript\n * const network = createAgentNetwork({\n * bus: createMessageBus(),\n * agents: {\n * researcher: { capabilities: ['search', 'summarize'] },\n * writer: { capabilities: ['draft', 'edit'] },\n * reviewer: { capabilities: ['review', 'approve'] },\n * },\n * });\n *\n * // Delegate a task\n * const result = await network.delegate(\n * 'researcher',\n * 'writer',\n * 'Write an article about AI safety',\n * { research: findingsData }\n * );\n *\n * // Query for information\n * const answer = await network.query(\n * 'writer',\n * 'reviewer',\n * 'Is this paragraph technically accurate?',\n * { text: '...' }\n * );\n * ```\n */\nexport function createAgentNetwork(config: AgentNetworkConfig): AgentNetwork {\n const {\n bus,\n agents: initialAgents = {},\n defaultTimeout = 30000,\n onAgentOnline,\n onAgentOffline,\n } = config;\n\n const agents = new Map<string, AgentInfo>();\n const responseWaiters = new Map<\n string,\n {\n resolve: (msg: ResponseMessage | DelegationResultMessage) => void;\n reject: (error: Error) => void;\n timer: ReturnType<typeof setTimeout>;\n }\n >();\n\n // Initialize agents\n for (const [id, info] of Object.entries(initialAgents)) {\n agents.set(id, {\n ...info,\n id,\n status: \"offline\",\n lastSeen: Date.now(),\n });\n }\n\n // Handle response messages\n function handleResponse(message: TypedAgentMessage): void {\n if (message.type !== \"RESPONSE\" && message.type !== \"DELEGATION_RESULT\") {\n return;\n }\n\n const correlationId = message.correlationId ?? message.replyTo;\n if (!correlationId) return;\n\n const waiter = responseWaiters.get(correlationId);\n if (waiter) {\n clearTimeout(waiter.timer);\n responseWaiters.delete(correlationId);\n waiter.resolve(message as ResponseMessage | DelegationResultMessage);\n }\n }\n\n return {\n register(\n id: string,\n info: Omit<AgentInfo, \"id\" | \"lastSeen\" | \"status\">,\n ): void {\n const wasOffline =\n !agents.has(id) || agents.get(id)?.status === \"offline\";\n\n agents.set(id, {\n ...info,\n id,\n status: \"online\",\n lastSeen: Date.now(),\n });\n\n if (wasOffline) {\n onAgentOnline?.(id);\n }\n },\n\n unregister(id: string): void {\n const agent = agents.get(id);\n if (agent) {\n agent.status = \"offline\";\n onAgentOffline?.(id);\n }\n },\n\n getAgent(id: string): AgentInfo | undefined {\n return agents.get(id);\n },\n\n getAgents(): AgentInfo[] {\n return Array.from(agents.values());\n },\n\n findByCapability(capability: string): AgentInfo[] {\n return Array.from(agents.values()).filter(\n (agent) =>\n agent.capabilities.includes(capability) && agent.status === \"online\",\n );\n },\n\n send(\n from: string,\n to: string | string[],\n message: Partial<TypedAgentMessage>,\n ): string {\n // Update sender's lastSeen\n const sender = agents.get(from);\n if (sender) {\n sender.lastSeen = Date.now();\n sender.status = \"online\";\n }\n\n return bus.publish({\n ...message,\n from,\n to,\n type: message.type ?? \"CUSTOM\",\n } as Omit<TypedAgentMessage, \"id\" | \"timestamp\">);\n },\n\n async request(\n from: string,\n to: string,\n action: string,\n payload: Record<string, unknown>,\n timeout = defaultTimeout,\n ): Promise<ResponseMessage> {\n return new Promise((resolve, reject) => {\n // Generate a correlation ID upfront so subscription can listen before publish\n const correlationId = generateId();\n\n // Subscribe BEFORE publishing to avoid race condition with fast responders\n const sub = bus.subscribe(\n from,\n (msg) => {\n if (\n msg.correlationId === correlationId ||\n msg.replyTo === correlationId\n ) {\n sub.unsubscribe();\n handleResponse(msg);\n }\n },\n { types: [\"RESPONSE\"] },\n );\n\n const timer = setTimeout(() => {\n sub.unsubscribe(); // Clean up subscription on timeout\n responseWaiters.delete(correlationId);\n reject(\n new Error(\n `[Directive Communication] Request timeout after ${timeout}ms`,\n ),\n );\n }, timeout);\n\n responseWaiters.set(correlationId, {\n resolve: resolve as (\n msg: ResponseMessage | DelegationResultMessage,\n ) => void,\n reject,\n timer,\n });\n\n bus.publish({\n type: \"REQUEST\",\n from,\n to,\n action,\n payload,\n timeout,\n correlationId,\n } as Omit<RequestMessage, \"id\" | \"timestamp\"> & {\n correlationId: string;\n });\n });\n },\n\n async delegate(\n from: string,\n to: string,\n task: string,\n context: Record<string, unknown>,\n ): Promise<DelegationResultMessage> {\n return new Promise((resolve, reject) => {\n const correlationId = generateId();\n\n // Subscribe BEFORE publishing to avoid race condition\n const sub = bus.subscribe(\n from,\n (msg) => {\n if (\n msg.correlationId === correlationId ||\n msg.replyTo === correlationId\n ) {\n sub.unsubscribe();\n handleResponse(msg);\n }\n },\n { types: [\"DELEGATION_RESULT\"] },\n );\n\n const timer = setTimeout(() => {\n sub.unsubscribe();\n responseWaiters.delete(correlationId);\n reject(\n new Error(\n `[Directive Communication] Delegation timeout after ${defaultTimeout}ms`,\n ),\n );\n }, defaultTimeout);\n\n responseWaiters.set(correlationId, {\n resolve: resolve as (\n msg: ResponseMessage | DelegationResultMessage,\n ) => void,\n reject,\n timer,\n });\n\n bus.publish({\n type: \"DELEGATION\",\n from,\n to,\n task,\n context,\n correlationId,\n } as Omit<DelegationMessage, \"id\" | \"timestamp\"> & {\n correlationId: string;\n });\n });\n },\n\n async query(\n from: string,\n to: string,\n question: string,\n context?: Record<string, unknown>,\n ): Promise<ResponseMessage> {\n return new Promise((resolve, reject) => {\n const correlationId = generateId();\n\n // Subscribe BEFORE publishing to avoid race condition\n const sub = bus.subscribe(\n from,\n (msg) => {\n if (\n msg.correlationId === correlationId ||\n msg.replyTo === correlationId\n ) {\n sub.unsubscribe();\n handleResponse(msg);\n }\n },\n { types: [\"RESPONSE\"] },\n );\n\n const timer = setTimeout(() => {\n sub.unsubscribe();\n responseWaiters.delete(correlationId);\n reject(\n new Error(\n `[Directive Communication] Query timeout after ${defaultTimeout}ms`,\n ),\n );\n }, defaultTimeout);\n\n responseWaiters.set(correlationId, {\n resolve: resolve as (\n msg: ResponseMessage | DelegationResultMessage,\n ) => void,\n reject,\n timer,\n });\n\n bus.publish({\n type: \"QUERY\",\n from,\n to,\n question,\n context,\n correlationId,\n } as Omit<QueryMessage, \"id\" | \"timestamp\"> & {\n correlationId: string;\n });\n });\n },\n\n broadcast(from: string, message: Partial<TypedAgentMessage>): string {\n return bus.publish({\n ...message,\n from,\n to: \"*\",\n type: message.type ?? \"INFORM\",\n } as Omit<TypedAgentMessage, \"id\" | \"timestamp\">);\n },\n\n listen(\n agentId: string,\n handler: MessageHandler,\n filter?: MessageFilter,\n ): Subscription {\n // Mark agent as online\n const agent = agents.get(agentId);\n if (agent) {\n agent.status = \"online\";\n agent.lastSeen = Date.now();\n onAgentOnline?.(agentId);\n }\n\n return bus.subscribe(agentId, handler, filter);\n },\n\n getBus(): MessageBus {\n return bus;\n },\n\n destroy(): void {\n // Clear all pending response waiters and their timers\n for (const [, waiter] of responseWaiters) {\n clearTimeout(waiter.timer);\n }\n responseWaiters.clear();\n agents.clear();\n },\n };\n}\n\n// ============================================================================\n// Communication Patterns\n// ============================================================================\n\n/**\n * Create a request-response helper for handling incoming requests.\n *\n * @example\n * ```typescript\n * const responder = createResponder(network, 'writer');\n *\n * responder.onRequest('draft', async (payload) => {\n * const draft = await generateDraft(payload.topic);\n * return { success: true, result: draft };\n * });\n * ```\n */\nexport function createResponder(network: AgentNetwork, agentId: string) {\n const handlers = new Map<\n string,\n (\n payload: Record<string, unknown>,\n ) => Promise<{ success: boolean; result?: unknown; error?: string }>\n >();\n\n const subscription = network.listen(\n agentId,\n async (message) => {\n if (message.type === \"REQUEST\") {\n const request = message as RequestMessage;\n const handler = handlers.get(request.action);\n\n let response: Partial<ResponseMessage>;\n if (handler) {\n try {\n const result = await handler(request.payload);\n response = {\n type: \"RESPONSE\",\n success: result.success,\n result: result.result,\n error: result.error,\n };\n } catch (error) {\n response = {\n type: \"RESPONSE\",\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n } else {\n response = {\n type: \"RESPONSE\",\n success: false,\n error: `Unknown action: ${request.action}`,\n };\n }\n\n network.send(agentId, message.from, {\n ...response,\n correlationId: message.correlationId ?? message.id,\n replyTo: message.correlationId ?? message.id,\n });\n }\n },\n { types: [\"REQUEST\"] },\n );\n\n return {\n onRequest(\n action: string,\n handler: (\n payload: Record<string, unknown>,\n ) => Promise<{ success: boolean; result?: unknown; error?: string }>,\n ): void {\n handlers.set(action, handler);\n },\n\n /** Remove a request handler */\n offRequest(action: string): void {\n handlers.delete(action);\n },\n\n /** Destroy this responder, unsubscribing from network */\n destroy(): void {\n subscription.unsubscribe();\n handlers.clear();\n },\n };\n}\n\n/**\n * Create a task delegator for handling incoming delegations.\n *\n * @example\n * ```typescript\n * const delegator = createDelegator(network, 'writer');\n *\n * delegator.onDelegation(async (task, context) => {\n * const result = await executeTask(task, context);\n * return {\n * success: true,\n * result,\n * metrics: { durationMs: 1500, tokensUsed: 500 },\n * };\n * });\n * ```\n */\nexport function createDelegator(network: AgentNetwork, agentId: string) {\n let delegationHandler:\n | ((\n task: string,\n context: Record<string, unknown>,\n ) => Promise<{\n success: boolean;\n result?: unknown;\n error?: string;\n metrics?: { durationMs: number; tokensUsed?: number; cost?: number };\n }>)\n | null = null;\n\n const subscription = network.listen(\n agentId,\n async (message) => {\n if (message.type === \"DELEGATION\" && delegationHandler) {\n const delegation = message as DelegationMessage;\n const start = Date.now();\n\n let result: Partial<DelegationResultMessage>;\n try {\n const response = await delegationHandler(\n delegation.task,\n delegation.context,\n );\n result = {\n type: \"DELEGATION_RESULT\",\n success: response.success,\n result: response.result,\n error: response.error,\n metrics: response.metrics ?? { durationMs: Date.now() - start },\n };\n } catch (error) {\n result = {\n type: \"DELEGATION_RESULT\",\n success: false,\n error: error instanceof Error ? error.message : String(error),\n metrics: { durationMs: Date.now() - start },\n };\n }\n\n network.send(agentId, message.from, {\n ...result,\n correlationId: message.correlationId ?? message.id,\n replyTo: message.correlationId ?? message.id,\n });\n }\n },\n { types: [\"DELEGATION\"] },\n );\n\n return {\n onDelegation(\n handler: (\n task: string,\n context: Record<string, unknown>,\n ) => Promise<{\n success: boolean;\n result?: unknown;\n error?: string;\n metrics?: { durationMs: number; tokensUsed?: number; cost?: number };\n }>,\n ): void {\n delegationHandler = handler;\n },\n\n /** Remove the delegation handler */\n offDelegation(): void {\n delegationHandler = null;\n },\n\n /** Destroy this delegator, unsubscribing from network */\n destroy(): void {\n subscription.unsubscribe();\n delegationHandler = null;\n },\n };\n}\n\n/**\n * Create a pub/sub helper for topic-based communication.\n *\n * @example\n * ```typescript\n * const pubsub = createPubSub(network, 'analyst');\n *\n * // Subscribe to topics\n * pubsub.subscribe(['market-updates', 'alerts'], (topic, content) => {\n * console.log(`Received ${topic}:`, content);\n * });\n *\n * // Publish to topics\n * pubsub.publish('market-updates', { price: 100, change: 5 });\n * ```\n */\nexport function createPubSub(network: AgentNetwork, agentId: string) {\n const topicHandlers = new Map<string, Array<(content: unknown) => void>>();\n\n const subscription = network.listen(\n agentId,\n (message) => {\n if (message.type === \"UPDATE\") {\n const update = message as UpdateMessage;\n const handlers = topicHandlers.get(update.topic) ?? [];\n for (const handler of handlers) {\n handler(update.content);\n }\n }\n },\n { types: [\"UPDATE\"] },\n );\n\n return {\n subscribe(\n topics: string[],\n handler: (topic: string, content: unknown) => void,\n ): () => void {\n // Track wrapped handlers per-subscribe call for proper cleanup\n const wrappedHandlers = new Map<string, (content: unknown) => void>();\n\n for (const topic of topics) {\n const handlers = topicHandlers.get(topic) ?? [];\n const wrappedHandler = (content: unknown) => handler(topic, content);\n wrappedHandlers.set(topic, wrappedHandler);\n handlers.push(wrappedHandler);\n topicHandlers.set(topic, handlers);\n }\n\n // Announce subscription\n network.broadcast(agentId, {\n type: \"SUBSCRIBE\",\n topics,\n } as Partial<SubscribeMessage>);\n\n return () => {\n // Only remove this subscription's handlers, not all handlers for the topic\n for (const [topic, wrappedHandler] of wrappedHandlers) {\n const handlers = topicHandlers.get(topic);\n if (handlers) {\n const idx = handlers.indexOf(wrappedHandler);\n if (idx >= 0) handlers.splice(idx, 1);\n if (handlers.length === 0) topicHandlers.delete(topic);\n }\n }\n wrappedHandlers.clear();\n network.broadcast(agentId, {\n type: \"UNSUBSCRIBE\",\n topics,\n } as Partial<AgentMessage & { type: \"UNSUBSCRIBE\"; topics: string[] }>);\n };\n },\n\n publish(topic: string, content: unknown): void {\n network.broadcast(agentId, {\n type: \"UPDATE\",\n topic,\n content,\n } as Partial<UpdateMessage>);\n },\n\n /** Destroy this pub/sub, unsubscribing from network and clearing handlers */\n destroy(): void {\n subscription.unsubscribe();\n topicHandlers.clear();\n },\n };\n}\n","/**\n * Standalone utilities for goal planning and validation.\n *\n * These functions work with the same `produces` / `requires` agent\n * declarations used by the goal pattern, without requiring an\n * orchestrator instance.\n *\n * @example\n * ```typescript\n * import { validateGoal, planGoal, getDependencyGraph } from '@directive-run/ai';\n *\n * const agents = {\n * fetcher: { produces: ['data'], requires: [] },\n * analyzer: { produces: ['analysis'], requires: ['data'] },\n * reporter: { produces: ['report'], requires: ['analysis'] },\n * };\n *\n * // Validate — cycle detection, missing deps, warnings\n * const validation = validateGoal(agents);\n *\n * // Plan — dry-run without executing agents\n * const plan = planGoal(agents, ['query']);\n *\n * // Graph — topological order, roots, leaves, edges\n * const graph = getDependencyGraph(agents);\n * ```\n *\n * @module\n */\n\nimport type { GoalResult, GoalStepMetrics, RelaxationRecord } from \"./types.js\";\n\n/** Clamp non-finite satisfaction values to 0 */\nfunction safeSatisfaction(val: number): number {\n if (!Number.isFinite(val)) {\n return 0;\n }\n\n return val;\n}\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Minimal agent declaration for goal utilities (subset of GoalNode) */\nexport interface GoalAgentDeclaration {\n /** Fact keys this agent writes as output */\n produces: string[];\n /** Fact keys this agent reads as input */\n requires?: string[];\n}\n\n/** Edge in the inferred dependency graph */\nexport interface GoalDependencyEdge {\n from: string;\n to: string;\n /** Fact key that creates this dependency */\n factKey: string;\n}\n\n/** Inferred dependency graph from produces/requires analysis */\nexport interface GoalDependencyGraph {\n /** Agent IDs in topological order (roots first) */\n order: string[];\n /** Edges between agents */\n edges: GoalDependencyEdge[];\n /** Root agents (no unfulfilled requires from other agents) */\n roots: string[];\n /** Leaf agents (nothing depends on their produces) */\n leaves: string[];\n /** Map of fact key to agent ID that produces it */\n producers: Map<string, string>;\n}\n\n/** Validation result */\nexport interface GoalValidationResult {\n valid: boolean;\n errors: string[];\n warnings: string[];\n}\n\n/** A single step in an execution plan */\nexport interface GoalPlanStep {\n /** Step number (1-based) */\n step: number;\n /** Agent IDs that would run in this step (parallel) */\n agents: string[];\n /** Fact keys available at the start of this step */\n availableFacts: string[];\n /** Fact keys produced after this step completes */\n producedFacts: string[];\n}\n\n/** Result of a planGoal() dry-run */\nexport interface GoalExecutionPlan {\n /** Ordered steps showing which agents run when */\n steps: GoalPlanStep[];\n /** Agents that can never run (requires never satisfiable) */\n unreachableAgents: string[];\n /** Required fact keys that no agent produces (must be in initial facts) */\n externalDeps: string[];\n /** Whether the plan can potentially reach all agents */\n feasible: boolean;\n}\n\n// ============================================================================\n// Internal: Topological Sort (Kahn's Algorithm)\n// ============================================================================\n\nfunction buildGraph(\n agents: Record<string, GoalAgentDeclaration>,\n): GoalDependencyGraph {\n const agentIds = Object.keys(agents);\n\n // Build a map: factKey → agentId that produces it\n const producerMap = new Map<string, string>();\n for (const [agentId, decl] of Object.entries(agents)) {\n for (const key of decl.produces) {\n if (producerMap.has(key)) {\n throw new Error(\n `[Directive Goal] Fact key \"${key}\" is produced by both \"${producerMap.get(key)}\" and \"${agentId}\". Each fact key must have exactly one producer.`,\n );\n }\n producerMap.set(key, agentId);\n }\n }\n\n // Build edges: agent B requires fact X → agent A produces fact X → edge A→B\n const edges: GoalDependencyEdge[] = [];\n const inDegree = new Map<string, number>();\n const adjacency = new Map<string, string[]>();\n\n for (const id of agentIds) {\n inDegree.set(id, 0);\n adjacency.set(id, []);\n }\n\n for (const [agentId, decl] of Object.entries(agents)) {\n for (const key of decl.requires ?? []) {\n const producer = producerMap.get(key);\n if (producer && producer !== agentId) {\n edges.push({ from: producer, to: agentId, factKey: key });\n adjacency.get(producer)!.push(agentId);\n inDegree.set(agentId, (inDegree.get(agentId) ?? 0) + 1);\n }\n }\n }\n\n // Topological sort (Kahn's algorithm)\n const queue: string[] = [];\n for (const [id, deg] of inDegree) {\n if (deg === 0) {\n queue.push(id);\n }\n }\n\n const order: string[] = [];\n let queueIdx = 0;\n while (queueIdx < queue.length) {\n const current = queue[queueIdx++]!;\n order.push(current);\n\n for (const neighbor of adjacency.get(current) ?? []) {\n const newDeg = (inDegree.get(neighbor) ?? 1) - 1;\n inDegree.set(neighbor, newDeg);\n if (newDeg === 0) {\n queue.push(neighbor);\n }\n }\n }\n\n if (order.length !== agentIds.length) {\n const orderSet = new Set(order);\n const inCycle = agentIds.filter((id) => !orderSet.has(id));\n\n throw new Error(\n `[Directive Goal] Circular dependency detected among agents: ${inCycle.join(\", \")}. Review their produces/requires declarations.`,\n );\n }\n\n // Identify roots and leaves\n const roots = order.filter((id) => {\n const decl = agents[id]!;\n const requires = decl.requires ?? [];\n\n return requires.every(\n (key) => !producerMap.has(key) || producerMap.get(key) === id,\n );\n });\n\n const consumedBy = new Set<string>();\n for (const edge of edges) {\n consumedBy.add(edge.from);\n }\n const leaves = agentIds.filter((id) => !consumedBy.has(id));\n\n return { order, edges, roots, leaves, producers: producerMap };\n}\n\n// ============================================================================\n// Public API\n// ============================================================================\n\n/**\n * Get the dependency graph for a set of agent declarations.\n *\n * Uses Kahn's algorithm (topological sort) to compute execution order\n * and detect circular dependencies.\n *\n * @throws If agents form a circular dependency or a fact key has multiple producers.\n *\n * @example\n * ```typescript\n * const graph = getDependencyGraph({\n * fetcher: { produces: ['data'], requires: [] },\n * analyzer: { produces: ['analysis'], requires: ['data'] },\n * });\n *\n * console.log(graph.order); // ['fetcher', 'analyzer']\n * console.log(graph.roots); // ['fetcher']\n * console.log(graph.leaves); // ['analyzer']\n * ```\n */\nexport function getDependencyGraph(\n agents: Record<string, GoalAgentDeclaration>,\n): GoalDependencyGraph {\n const graph = buildGraph(agents);\n\n return {\n order: [...graph.order],\n edges: [...graph.edges],\n roots: [...graph.roots],\n leaves: [...graph.leaves],\n producers: new Map(graph.producers),\n };\n}\n\n/**\n * Validate a set of agent declarations for goal execution.\n *\n * Checks for:\n * - Circular dependencies\n * - Duplicate producers (same fact key produced by multiple agents)\n * - Agents with no `produces` (will never contribute)\n * - Required fact keys that no agent produces (must be in initial facts)\n *\n * @example\n * ```typescript\n * const result = validateGoal({\n * fetcher: { produces: ['data'] },\n * analyzer: { produces: ['analysis'], requires: ['data'] },\n * });\n *\n * if (!result.valid) {\n * console.error(result.errors);\n * }\n * ```\n */\nexport function validateGoal(\n agents: Record<string, GoalAgentDeclaration>,\n): GoalValidationResult {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (Object.keys(agents).length === 0) {\n errors.push(\"No agents declared\");\n }\n\n for (const [id, decl] of Object.entries(agents)) {\n if (decl.produces.length === 0) {\n warnings.push(`Agent \"${id}\" has no produces — it will never contribute`);\n }\n }\n\n const allProduced = new Set<string>();\n for (const decl of Object.values(agents)) {\n for (const key of decl.produces) {\n allProduced.add(key);\n }\n }\n\n for (const [id, decl] of Object.entries(agents)) {\n for (const key of decl.requires ?? []) {\n if (!allProduced.has(key)) {\n warnings.push(\n `Agent \"${id}\" requires \"${key}\" which no agent produces — must be in initial facts`,\n );\n }\n }\n }\n\n try {\n buildGraph(agents);\n } catch (err) {\n errors.push(err instanceof Error ? err.message : String(err));\n }\n\n return { valid: errors.length === 0, errors, warnings };\n}\n\n/**\n * Dry-run goal execution to preview the plan without running agents.\n *\n * Shows which agents would run in each step, which facts would be produced,\n * and whether any agents are unreachable.\n *\n * @param agents - Agent declarations with produces/requires\n * @param initialFactKeys - Fact keys available at the start (not values, just keys)\n * @param maxSteps - Maximum steps to simulate (default: 50)\n *\n * @example\n * ```typescript\n * const plan = planGoal(\n * {\n * fetcher: { produces: ['data'] },\n * analyzer: { produces: ['analysis'], requires: ['data'] },\n * reporter: { produces: ['report'], requires: ['analysis'] },\n * },\n * ['query'],\n * );\n *\n * console.log(plan.feasible); // true\n * console.log(plan.steps); // 3 steps: fetcher → analyzer → reporter\n * ```\n */\nexport function planGoal(\n agents: Record<string, GoalAgentDeclaration>,\n initialFactKeys: string[] = [],\n maxSteps = 50,\n): GoalExecutionPlan {\n const graph = buildGraph(agents);\n\n const allProduced = new Set<string>();\n for (const decl of Object.values(agents)) {\n for (const key of decl.produces) {\n allProduced.add(key);\n }\n }\n\n // External deps: fact keys required by agents that no agent produces\n const externalDeps: string[] = [];\n for (const decl of Object.values(agents)) {\n for (const key of decl.requires ?? []) {\n if (!allProduced.has(key)) {\n externalDeps.push(key);\n }\n }\n }\n\n const availableFacts = new Set(initialFactKeys);\n const completedAgents = new Set<string>();\n const steps: GoalPlanStep[] = [];\n\n for (let stepNum = 1; stepNum <= maxSteps; stepNum++) {\n const readyAgents = graph.order.filter((agentId) => {\n if (completedAgents.has(agentId)) {\n return false;\n }\n const decl = agents[agentId]!;\n const requires = decl.requires ?? [];\n\n return requires.every((key) => availableFacts.has(key));\n });\n\n if (readyAgents.length === 0) {\n break;\n }\n\n const producedFacts: string[] = [];\n for (const agentId of readyAgents) {\n completedAgents.add(agentId);\n for (const key of agents[agentId]!.produces) {\n if (!availableFacts.has(key)) {\n producedFacts.push(key);\n availableFacts.add(key);\n }\n }\n }\n\n steps.push({\n step: stepNum,\n agents: readyAgents,\n availableFacts: [...availableFacts],\n producedFacts,\n });\n }\n\n const unreachableAgents = Object.keys(agents).filter(\n (id) => !completedAgents.has(id),\n );\n\n return {\n steps,\n unreachableAgents,\n externalDeps: [...new Set(externalDeps)],\n feasible: unreachableAgents.length === 0,\n };\n}\n\n// ============================================================================\n// Explain Goal\n// ============================================================================\n\n/** A single line in a goal execution explanation */\nexport interface GoalExplanationStep {\n step: number;\n agents: string[];\n factsProduced: string[];\n satisfaction: number;\n satisfactionDelta: number;\n durationMs: number;\n tokensConsumed: number;\n /** Human-readable description of what happened */\n description: string;\n}\n\n/** Structured explanation of a goal execution */\nexport interface GoalExplanation {\n /** Whether the goal was achieved */\n achieved: boolean;\n /** Human-readable summary */\n summary: string;\n /** Per-step explanations */\n steps: GoalExplanationStep[];\n /** Relaxation events with descriptions */\n relaxations: Array<{\n step: number;\n label: string;\n strategy: string;\n description: string;\n }>;\n /** Total tokens consumed */\n totalTokens: number;\n /** Total duration (ms) */\n durationMs: number;\n}\n\n/**\n * Generate a human-readable explanation of a goal execution result.\n *\n * Takes a `GoalResult` and returns a structured explanation of why each\n * agent ran, how satisfaction progressed, and what relaxations were applied.\n *\n * @example\n * ```typescript\n * const result = await orchestrator.runGoal(nodes, input, when, options);\n * const explanation = explainGoal(result);\n *\n * console.log(explanation.summary);\n * // \"Goal achieved in 3 steps (1,247 tokens, 892ms). Satisfaction: 0 → 1.\"\n *\n * for (const step of explanation.steps) {\n * console.log(step.description);\n * // \"Step 1: Ran fetcher. Produced: data. Satisfaction: 0 → 0.3 (+0.3).\"\n * }\n * ```\n */\nexport function explainGoal<T = unknown>(\n result: GoalResult<T>,\n): GoalExplanation {\n const steps: GoalExplanationStep[] = result.stepMetrics.map(\n (metric: GoalStepMetrics) => {\n const sat = safeSatisfaction(metric.satisfaction);\n const satDelta = safeSatisfaction(metric.satisfactionDelta);\n const agentList = metric.nodesRun.join(\", \");\n const factList =\n metric.factsProduced.length > 0\n ? metric.factsProduced.join(\", \")\n : \"none\";\n const prevSatisfaction = +safeSatisfaction(sat - satDelta).toFixed(3);\n const delta =\n satDelta >= 0 ? `+${satDelta.toFixed(3)}` : satDelta.toFixed(3);\n\n const description =\n `Step ${metric.step}: Ran ${agentList}. ` +\n `Produced: ${factList}. ` +\n `Satisfaction: ${prevSatisfaction} → ${sat.toFixed(3)} (${delta}). ` +\n `${metric.tokensConsumed} tokens, ${metric.durationMs}ms.`;\n\n return {\n step: metric.step,\n agents: metric.nodesRun,\n factsProduced: metric.factsProduced,\n satisfaction: sat,\n satisfactionDelta: satDelta,\n durationMs: metric.durationMs,\n tokensConsumed: metric.tokensConsumed,\n description,\n };\n },\n );\n\n const relaxations = result.relaxations.map((r: RelaxationRecord) => {\n let description: string;\n switch (r.strategy) {\n case \"allow_rerun\":\n description = `Step ${r.step}: Applied relaxation \"${r.label}\" — re-enabled completed nodes for another run.`;\n break;\n case \"inject_facts\":\n description = `Step ${r.step}: Applied relaxation \"${r.label}\" — injected fact values to unblock dependencies.`;\n break;\n case \"accept_partial\":\n description = `Step ${r.step}: Applied relaxation \"${r.label}\" — accepted current facts as partial result.`;\n break;\n case \"alternative_nodes\":\n description = `Step ${r.step}: Applied relaxation \"${r.label}\" — added alternative nodes to the graph.`;\n break;\n case \"custom\":\n description = `Step ${r.step}: Applied relaxation \"${r.label}\" — ran custom recovery logic.`;\n break;\n default:\n description = `Step ${r.step}: Applied relaxation \"${r.label}\" (${r.strategy}).`;\n }\n\n return {\n step: r.step,\n label: r.label,\n strategy: r.strategy,\n description,\n };\n });\n\n const firstSatisfaction =\n result.stepMetrics.length > 0\n ? safeSatisfaction(\n result.stepMetrics[0]!.satisfaction -\n result.stepMetrics[0]!.satisfactionDelta,\n ).toFixed(3)\n : \"0\";\n const lastSatisfaction =\n result.stepMetrics.length > 0\n ? safeSatisfaction(\n result.stepMetrics[result.stepMetrics.length - 1]!.satisfaction,\n ).toFixed(3)\n : \"0\";\n\n const status = result.achieved ? \"Goal achieved\" : \"Goal not achieved\";\n const relaxationNote =\n result.relaxations.length > 0\n ? ` ${result.relaxations.length} relaxation(s) applied.`\n : \"\";\n const errorNote = result.error ? ` Error: ${result.error}` : \"\";\n\n const summary = `${status} in ${result.steps} step(s) (${result.totalTokens.toLocaleString()} tokens, ${result.durationMs}ms). Satisfaction: ${firstSatisfaction} → ${lastSatisfaction}.${relaxationNote}${errorNote}`;\n\n return {\n achieved: result.achieved,\n summary,\n steps,\n relaxations,\n totalTokens: result.totalTokens,\n durationMs: result.durationMs,\n };\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
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();}}}export{L as a,z as b,F as c};//# sourceMappingURL=chunk-5JQ2A3JK.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-5JQ2A3JK.js.map
|
|
@@ -0,0 +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-5JQ2A3JK.js","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"]}
|