@directive-run/ai 0.1.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +97 -73
- package/dist/anthropic.cjs +1 -1
- package/dist/anthropic.cjs.map +1 -1
- package/dist/anthropic.d.cts +5 -9
- package/dist/anthropic.d.ts +5 -9
- package/dist/anthropic.js +1 -1
- package/dist/anthropic.js.map +1 -1
- package/dist/gemini.cjs +3 -0
- package/dist/gemini.cjs.map +1 -0
- package/dist/gemini.d.cts +93 -0
- package/dist/gemini.d.ts +93 -0
- package/dist/gemini.js +3 -0
- package/dist/gemini.js.map +1 -0
- package/dist/index.cjs +117 -45
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1376 -2118
- package/dist/index.d.ts +1376 -2118
- package/dist/index.js +117 -45
- package/dist/index.js.map +1 -1
- package/dist/multi-agent-orchestrator-CxL8ycw_.d.cts +2290 -0
- package/dist/multi-agent-orchestrator-uMp8bLfV.d.ts +2290 -0
- package/dist/ollama.cjs.map +1 -1
- package/dist/ollama.d.cts +3 -2
- package/dist/ollama.d.ts +3 -2
- package/dist/ollama.js.map +1 -1
- package/dist/openai.cjs +2 -2
- package/dist/openai.cjs.map +1 -1
- package/dist/openai.d.cts +4 -8
- package/dist/openai.d.ts +4 -8
- package/dist/openai.js +2 -2
- package/dist/openai.js.map +1 -1
- package/dist/semantic-cache-F0psCRuz.d.cts +271 -0
- package/dist/semantic-cache-F0psCRuz.d.ts +271 -0
- package/dist/testing.cjs +42 -7
- package/dist/testing.cjs.map +1 -1
- package/dist/testing.d.cts +365 -5
- package/dist/testing.d.ts +365 -5
- package/dist/testing.js +42 -7
- package/dist/testing.js.map +1 -1
- package/dist/types-Co4BzMiH.d.cts +1373 -0
- package/dist/types-Co4BzMiH.d.ts +1373 -0
- package/package.json +8 -3
- package/dist/types-BKCdgKC-.d.cts +0 -300
- package/dist/types-BKCdgKC-.d.ts +0 -300
package/dist/testing.cjs
CHANGED
|
@@ -1,14 +1,49 @@
|
|
|
1
|
-
'use strict';var adapterUtils=require('@directive-run/core/adapter-utils'),core=require('@directive-run/core');require('@directive-run/core/plugins');var N=class extends Error{code;guardrailName;guardrailType;userMessage;agentName;constructor(t){super(t.message,{cause:t.cause}),this.name="GuardrailError",this.code=t.code,this.guardrailName=t.guardrailName,this.guardrailType=t.guardrailType,this.userMessage=t.userMessage??t.message,this.agentName=t.agentName,Object.defineProperty(this,"input",{value:t.input,enumerable:false,writable:false,configurable:false}),Object.defineProperty(this,"data",{value:t.data,enumerable:false,writable:false,configurable:false});}toJSON(){return {name:this.name,code:this.code,message:this.message,guardrailName:this.guardrailName,guardrailType:this.guardrailType,userMessage:this.userMessage,agentName:this.agentName}}};var Z="__agent",Y="__approval",ee="__conversation",te="__toolCalls",ye={facts:{[Z]:core.t.any(),[Y]:core.t.any(),[ee]:core.t.any(),[te]:core.t.any()}};function L(r){return adapterUtils.getBridgeFact(r,Z)}function I(r,t){adapterUtils.setBridgeFact(r,Z,t);}function J(r){return adapterUtils.getBridgeFact(r,Y)}function H(r,t){adapterUtils.setBridgeFact(r,Y,t);}function se(r){return adapterUtils.getBridgeFact(r,ee)}function re(r,t){adapterUtils.setBridgeFact(r,ee,t);}function ie(r){return adapterUtils.getBridgeFact(r,te)}function ae(r,t){adapterUtils.setBridgeFact(r,te,t);}function W(r){return {agent:L(r),approval:J(r),conversation:se(r),toolCalls:ie(r)}}function xe(r){let t={};for(let[u,s]of Object.entries(r))t[u]={priority:s.priority??0,when:i=>{let a=W(i),n={...i,...a};return s.when(n)},require:i=>{let a=W(i),n={...i,...a};return typeof s.require=="function"?s.require(n):s.require}};return t}function Ge(r,t,u){let s={};for(let[i,a]of Object.entries(r))s[i]={requirement:a.requirement,key:a.key,resolve:async(n,R)=>{let l=W(R.facts),T={facts:{...R.facts,...l},runAgent:async(b,v,P)=>t(b,v,Ee(u()),P),signal:R.signal};await a.resolve(n,T);}};return s}function Ee(r){return W(r)}function V(r,t,u){return typeof r=="function"?{name:`${u}-guardrail-${t}`,fn:r,critical:true}:r}function Me(r,t){let{backoff:u="exponential",baseDelayMs:s=100,maxDelayMs:i=5e3}=t,a;switch(u){case "exponential":a=s*Math.pow(2,r-1);break;case "linear":a=s*r;break;default:a=s;}return Math.min(a,i)}async function K(r,t,u){let{retry:s}=r,i=s?.attempts??1,a;for(let n=1;n<=i;n++)try{return await r.fn(t,u)}catch(R){if(a=R instanceof Error?R:new Error(String(R)),n<i){let l=Me(n,s??{});await new Promise(d=>setTimeout(d,l));}}throw a}function De(r,t){let{backoff:u="exponential",baseDelayMs:s=1e3,maxDelayMs:i=3e4}=t,a;switch(u){case "exponential":a=s*Math.pow(2,r-1);break;case "linear":a=s*r;break;default:a=s;}return Math.min(a,i)}async function Re(r,t,u,s,i){let a=i?.attempts??1,n=i?.isRetryable??(()=>true),R=i?.onRetry,l;for(let d=1;d<=a;d++)try{return await r(t,u,s)}catch(T){if(l=T instanceof Error?T:new Error(String(T)),d<a&&n(l)){let b=De(d,i??{});R?.(d,l,b),await new Promise(v=>setTimeout(v,b));}else break}throw l}function he(r){let{runner:t,factsSchema:u={},init:s,constraints:i={},resolvers:a={},guardrails:n={},onApprovalRequest:R,autoApproveToolCalls:l=true,maxTokenBudget:d,plugins:T=[],debug:b=false,approvalTimeoutMs:v=3e5,agentRetry:P,hooks:F={},memory:D,circuitBreaker:ue}=r;if(!l&&!R)throw new Error(`[Directive] Invalid approval configuration: autoApproveToolCalls is false but no onApprovalRequest callback provided. Tool calls would wait for approval indefinitely. Either:
|
|
1
|
+
'use strict';var adapterUtils=require('@directive-run/core/adapter-utils'),core=require('@directive-run/core');var Bn=new Set(["__proto__","constructor","prototype","toString","valueOf","hasOwnProperty"]);function mt(){let i=Date.now().toString(36),t=crypto.randomUUID().slice(0,8);return `ckpt_${i}_${t}`}function Qt(i){if(!i||typeof i!="object")return false;for(let a of Object.keys(i))if(Bn.has(a))return false;let t=i;if(t.version!==1||typeof t.id!="string"||t.id.length===0||typeof t.createdAt!="string"||typeof t.systemExport!="string"||t.timelineExport!==null&&typeof t.timelineExport!="string"||!t.localState||typeof t.localState!="object")return false;for(let a of Object.keys(t.localState))if(Bn.has(a))return false;let u=t.localState;return !(u.type!=="single"&&u.type!=="multi"||t.orchestratorType!=="single"&&t.orchestratorType!=="multi")}var pn=class{store=new Map;order=[];maxCheckpoints;retentionMs;preserveLabeled;constructor(t){if(this.maxCheckpoints=t?.maxCheckpoints??100,this.retentionMs=t?.retentionMs??1/0,this.preserveLabeled=t?.preserveLabeled??false,!Number.isFinite(this.maxCheckpoints)||this.maxCheckpoints<1)throw new Error(`[Directive Checkpoint] maxCheckpoints must be >= 1, got ${this.maxCheckpoints}`)}async save(t){if(!Qt(t))throw new Error("[Directive Checkpoint] Invalid checkpoint data");for(;this.order.length>=this.maxCheckpoints&&this.evictOldest(););let u=this.order.indexOf(t.id);return u>=0&&this.order.splice(u,1),this.store.set(t.id,t),this.order.push(t.id),t.id}async load(t){return this.store.get(t)??null}async list(){return this.order.map(t=>{let u=this.store.get(t);return {id:u.id,label:u.label,createdAt:u.createdAt}})}async delete(t){if(!this.store.has(t))return false;this.store.delete(t);let u=this.order.indexOf(t);return u>=0&&this.order.splice(u,1),true}async clear(){this.store.clear(),this.order.length=0;}async prune(){if(!Number.isFinite(this.retentionMs))return 0;let t=Date.now()-this.retentionMs,u=0,a=[];for(let p of this.order){let f=this.store.get(p);if(!f)continue;if(new Date(f.createdAt).getTime()>=t)break;this.preserveLabeled&&f.label||a.push(p);}for(let p of a){this.store.delete(p);let f=this.order.indexOf(p);f>=0&&this.order.splice(f,1),u++;}return u}evictOldest(){if(this.preserveLabeled)for(let u=0;u<this.order.length;u++){let a=this.order[u],p=this.store.get(a);if(p&&!p.label)return this.order.splice(u,1),this.store.delete(a),true}let t=this.order.shift();return t?(this.store.delete(t),true):false}};var tt=class extends Error{code;guardrailName;guardrailType;userMessage;agentName;constructor(t){super(t.message,{cause:t.cause}),this.name="GuardrailError",this.code=t.code,this.guardrailName=t.guardrailName,this.guardrailType=t.guardrailType,this.userMessage=t.userMessage??t.message,this.agentName=t.agentName,Object.defineProperty(this,"input",{value:t.input,enumerable:false,writable:false,configurable:false}),Object.defineProperty(this,"data",{value:t.data,enumerable:false,writable:false,configurable:false});}toJSON(){return {name:this.name,code:this.code,message:this.message,guardrailName:this.guardrailName,guardrailType:this.guardrailType,userMessage:this.userMessage,agentName:this.agentName}}};var gn="__agent",Et="__approval",fn="__conversation",mn="__toolCalls",At="__breakpoints";var ze="__scratchpad",tn={facts:{[gn]:core.t.object(),[Et]:core.t.object(),[fn]:core.t.array(),[mn]:core.t.array(),[At]:core.t.object()},derivations:{},events:{},requirements:{}};var hr=new Set(["agent_start","agent_complete","agent_error","agent_retry","guardrail_check","constraint_evaluate","resolver_start","resolver_complete","resolver_error","approval_request","approval_response","handoff_start","handoff_complete","pattern_start","pattern_complete","dag_node_update","breakpoint_hit","breakpoint_resumed","derivation_update","scratchpad_update","reflection_iteration","race_start","race_winner","race_cancelled","debate_round","reroute","checkpoint_save","checkpoint_restore"]),Ln=new Set(["__proto__","constructor","prototype","toString","valueOf","hasOwnProperty"]);function Ht(i={}){let t=i.maxEvents??2e3,u=i.goToSnapshot;if(!Number.isFinite(t)||t<1)throw new Error("[Directive DebugTimeline] maxEvents must be >= 1");let a=[],p=0,f=new Set;return {record(R){let k={...R,id:p++};a.push(k);let v=a.length-t;v>0&&a.splice(0,v);for(let A of f)try{A(k);}catch(Y){typeof process<"u"&&process.env?.NODE_ENV!=="production"&&console.error("[Directive DebugTimeline] Listener threw:",Y instanceof Error?Y.message:Y);}return k},getEvents(){return [...a]},getEventsForAgent(R){return a.filter(k=>k.agentId===R)},getEventsByType(R){return a.filter(k=>k.type===R)},getEventsAtSnapshot(R){return a.filter(k=>k.snapshotId===R)},getEventsInRange(R,k){return a.filter(v=>v.timestamp>=R&&v.timestamp<=k)},forkFrom(R){let k=-1;for(let v=a.length-1;v>=0;v--)if(a[v].snapshotId!==null&&a[v].snapshotId<=R){k=a[v].id;break}if(k>=0){let v=a.length;for(let A=a.length-1;A>=0;A--)if(a[A].id<=k){v=A+1;break}a=a.slice(0,v);}else a=[];u&&u(R);},export(){return JSON.stringify({version:1,events:a,nextId:p})},import(R){let k;try{k=JSON.parse(R);}catch{throw new Error("[Directive DebugTimeline] Invalid JSON")}if(!k||typeof k!="object")throw new Error("[Directive DebugTimeline] Invalid timeline data");for(let Y of Object.keys(k))if(Ln.has(Y))throw new Error(`[Directive DebugTimeline] Blocked key in import: ${Y}`);let v=k;if(!Array.isArray(v.events))throw new Error("[Directive DebugTimeline] Missing events array");let A=[];for(let Y of v.events){if(!Y||typeof Y!="object")continue;for(let Ee of Object.keys(Y))if(Ln.has(Ee))throw new Error(`[Directive DebugTimeline] Blocked key in event: ${Ee}`);let X=Y;typeof X.id=="number"&&typeof X.type=="string"&&hr.has(X.type)&&typeof X.timestamp=="number"&&A.push(Y);}a=A.length>t?A.slice(-t):A,p=typeof v.nextId=="number"?v.nextId:A.length;},clear(){a=[],p=0;},subscribe(R){return f.add(R),()=>{f.delete(R);}},get length(){return a.length}}}function hn(i,t){let u=new Map;return {name:"directive-ai-debug-timeline",onConstraintEvaluate(a,p){i.record({type:"constraint_evaluate",timestamp:Date.now(),snapshotId:t(),constraintId:a,fired:p});},onResolverStart(a,p){u.set(a,Date.now()),i.record({type:"resolver_start",timestamp:Date.now(),snapshotId:t(),resolverId:a,requirementType:p.requirement.type});},onResolverComplete(a){let p=u.get(a);u.delete(a),i.record({type:"resolver_complete",timestamp:Date.now(),snapshotId:t(),resolverId:a,durationMs:p?Date.now()-p:0});},onResolverError(a,p,f){let b=u.get(a);u.delete(a);let R=f instanceof Error?f.message:String(f);i.record({type:"resolver_error",timestamp:Date.now(),snapshotId:t(),resolverId:a,errorMessage:R,durationMs:b?Date.now()-b:0});}}}function ut(i,t,u){return typeof i=="function"?{name:`${u}-guardrail-${t}`,fn:i,critical:true}:i}function br(i,t){let{backoff:u="exponential",baseDelayMs:a=100,maxDelayMs:p=5e3}=t,f;switch(u){case "exponential":f=a*Math.pow(2,i-1);break;case "linear":f=a*i;break;default:f=a;}return Math.min(f,p)}function Fn(i,t){return t?.aborted?Promise.reject(t.reason??new Error("Aborted")):new Promise((u,a)=>{if(!t){setTimeout(u,i);return}let p=()=>{clearTimeout(f),a(t.reason??new Error("Aborted"));},f=setTimeout(()=>{t.removeEventListener("abort",p),u();},i);t.addEventListener("abort",p,{once:true});})}async function lt(i,t,u,a){let{retry:p}=i,f=Math.max(p?.attempts??1,1),b;for(let R=1;R<=f;R++)try{return await i.fn(t,u)}catch(k){if(b=k instanceof Error?k:new Error(String(k)),R<f){let v=br(R,p??{});await Fn(v,a);}}return {passed:false,reason:`Guardrail "${i.name}" failed after ${f} attempt(s): ${b.message}`}}function kr(i,t){let{backoff:u="exponential",baseDelayMs:a=1e3,maxDelayMs:p=3e4}=t,f;switch(u){case "exponential":f=a*Math.pow(2,i-1);break;case "linear":f=a*i;break;default:f=a;}return Math.min(f,p)}async function nn(i,t,u,a,p){let f=Math.max(p?.attempts??1,1),b=p?.isRetryable??(()=>true),R=p?.onRetry,k;for(let v=1;v<=f;v++)try{return await i(t,u,a)}catch(A){if(k=A instanceof Error?A:new Error(String(A)),v<f){let Y=true;try{Y=b(k);}catch{break}if(!Y)break;let X=kr(v,p??{});try{R?.(v,k,X);}catch{}await Fn(X,a?.signal);}else break}throw k}function Ue(i){return adapterUtils.getBridgeFact(i,gn)}function Je(i,t){adapterUtils.setBridgeFact(i,gn,t);}function it(i){return adapterUtils.getBridgeFact(i,Et)}function Qe(i,t){adapterUtils.setBridgeFact(i,Et,t);}function Ut(i){return adapterUtils.getBridgeFact(i,fn)}function ct(i,t){adapterUtils.setBridgeFact(i,fn,t);}function Jt(i){return adapterUtils.getBridgeFact(i,mn)}function dt(i,t){adapterUtils.setBridgeFact(i,mn,t);}function nt(i){return adapterUtils.getBridgeFact(i,At)}function rt(i,t){adapterUtils.setBridgeFact(i,At,t);}function Ze(i){return {agent:Ue(i),approval:it(i),conversation:Ut(i),toolCalls:Jt(i)}}function Wt(i){let t=Object.create(null);for(let[u,a]of Object.entries(i))t[u]={priority:a.priority??0,when:p=>{let f=Ze(p),b={...p,...f};return a.when(b)},require:p=>{let f=Ze(p),b={...p,...f};return typeof a.require=="function"?a.require(b):a.require}};return t}function Hn(i,t,u){let a=Object.create(null);for(let[p,f]of Object.entries(i))a[p]={requirement:f.requirement,key:f.key,resolve:async(b,R)=>{let k=Ze(R.facts),A={facts:{...R.facts,...k},runAgent:async(Y,X,Ee)=>t(Y,X,Ze(u()),Ee),signal:R.signal};await f.resolve(b,A);}};return a}function vr(i){if(i.length>1048576)throw new Error(`[Directive] Output too large for JSON extraction (${i.length} chars, max 1048576).`);let t=i.trim();try{return JSON.parse(t)}catch{}let u=t.indexOf("{"),a=t.indexOf("["),p,f,b;if(u===-1&&a===-1)throw new Error("[Directive] No JSON object or array found in output");u===-1?(p=a,f="[",b="]"):a===-1?(p=u,f="{",b="}"):(p=Math.min(u,a),f=p===u?"{":"[",b=p===u?"}":"]");let R=0,k=false,v=false;for(let A=p;A<t.length;A++){let Y=t[A];if(v){v=false;continue}if(Y==="\\"){v=true;continue}if(Y==='"'){k=!k;continue}if(!k){if(Y===f)R++;else if(Y===b&&(R--,R===0)){let X=t.slice(p,A+1);return JSON.parse(X)}}}throw new Error("[Directive] No valid JSON found in output")}function yr(i){return i?i.issues&&i.issues.length>0?i.issues.map(t=>t.message).join("; "):i.message??"Validation failed":"Validation failed"}function bn(i,t){let{schema:u,maxRetries:a=2,extractJson:p=vr,schemaDescription:f}=t;if(!Number.isFinite(a)||a<0)throw new Error("[Directive] withStructuredOutput: maxRetries must be a non-negative finite number.");let b=f??u.description??"the specified JSON schema";return async(R,k,v)=>{let A={...R,instructions:(R.instructions??"")+`
|
|
2
|
+
|
|
3
|
+
IMPORTANT: Respond with valid JSON matching `+b+". Output ONLY the JSON object, no additional text or markdown formatting."},Y,X;for(let Ee=0;Ee<=a;Ee++){let Ke=Ee===0?k:`${k}
|
|
4
|
+
|
|
5
|
+
Your previous response was not valid JSON. Error: ${X}
|
|
6
|
+
Please try again with valid JSON only.`,N=await i(A,Ke,v);Y=N;let U=typeof N.output=="string"?N.output:JSON.stringify(N.output);try{let ge=p(U),Re=u.safeParse(ge);if(Re.success)return {...N,output:Re.data};X=yr(Re.error);}catch(ge){X=ge instanceof Error?ge.message:String(ge);}}throw new Dn(`[Directive] Failed to get valid structured output after ${a+1} attempts: ${X}`,Y)}}var Dn=class extends Error{lastResult;constructor(t,u){super(t),this.name="StructuredOutputError",this.lastResult=u;}};var ht=200,wr=0;function kn(){return `bp_${Date.now().toString(36)}_${(++wr).toString(36)}`}function vn(i,t,u){for(let a of i)if(a.type===t){if(!a.when)return a;try{if(a.when(u))return a}catch{}}return null}function an(){return {pending:[],resolved:[],cancelled:[]}}var Un=500,Jn=200;function Wn(i){let{runner:t,factsSchema:u={},init:a,constraints:p={},resolvers:f={},guardrails:b={},onApprovalRequest:R,autoApproveToolCalls:k=true,maxTokenBudget:v,budgetWarningThreshold:A=.8,onBudgetWarning:Y,plugins:X=[],debug:Ee=false,approvalTimeoutMs:Ke=3e5,agentRetry:N,hooks:U={},memory:ge,circuitBreaker:Re,selfHealing:Oe,outputSchema:pt,maxSchemaRetries:vt,checkpointStore:Te,breakpoints:ce,onBreakpoint:yt,breakpointTimeoutMs:xt}=i,Ve=typeof Ee=="object"?true:!!Ee,Ct=typeof Ee=="object"?!!Ee.verboseTimeline:false,ot=5e3;if(Ve&&Oe&&!Re&&console.warn("[Directive] selfHealing config has no effect without a circuitBreaker \u2014 fallback behavior requires the circuit breaker to detect failures."),A<0||A>1)throw new Error(`[Directive Orchestrator] budgetWarningThreshold must be between 0 and 1, got ${A}`);if(!k&&!R)throw new Error(`[Directive] Invalid approval configuration: autoApproveToolCalls is false but no onApprovalRequest callback provided. Tool calls would wait for approval indefinitely. Either:
|
|
2
7
|
- Set autoApproveToolCalls: true to auto-approve all tool calls
|
|
3
|
-
- Provide an onApprovalRequest callback to handle approvals programmatically`);let
|
|
4
|
-
`);
|
|
8
|
+
- Provide an onApprovalRequest callback to handle approvals programmatically`);function ue(l,E){try{U[l]?.(E);}catch(K){Ve&&console.debug(`[Directive] hooks.${l} threw:`,K);}}let Xt=["agent","approval","conversation","toolCalls"];for(let l of Object.keys(u))if(Xt.includes(l))throw new Error(`[Directive] Facts schema key "${l}" conflicts with orchestrator state. Reserved keys: ${Xt.join(", ")}. Rename your fact to avoid the collision.`);let Yt={facts:{...tn.facts,...u,__budgetWarningFired:core.t.boolean()},derivations:{},events:{},requirements:{}},oe,S,zt=Wt(p);v&&(zt.__budgetLimit={priority:100,when:l=>Ue(l).tokenUsage>v,require:{type:"__PAUSE_BUDGET_EXCEEDED"}});let Pt=Hn(f,(l,E,K,$)=>oe(l,E,K,$),()=>S.facts);Pt.__pause={requirement:adapterUtils.requirementGuard("__PAUSE_BUDGET_EXCEEDED"),resolve:async(l,E)=>{let K=Ue(E.facts);Je(E.facts,{...K,status:"paused"});}};let x=null;Ve&&(x=Ht({goToSnapshot:l=>{try{S.debug?.goTo?.(l);}catch{}}}));let sn=adapterUtils.createCallbackPlugin("directive-ai-callbacks",{}),Xe=core.createModule("directive-ai-orchestrator",{schema:Yt,init:l=>{if(Je(l,{status:"idle",currentAgent:null,input:null,output:null,error:null,tokenUsage:0,turnCount:0,startedAt:null,completedAt:null}),Qe(l,{pending:[],approved:[],rejected:[]}),ct(l,[]),dt(l,[]),rt(l,{pending:[],resolved:[],cancelled:[]}),adapterUtils.setBridgeFact(l,"__budgetWarningFired",false),a){let E=Ze(l),K={...l,...E};a(K);}},constraints:zt,resolvers:Pt}),at=[...X,sn];Ve&&x&&at.push(hn(x,()=>{try{return S.debug?.currentIndex??null}catch{return null}})),S=core.createSystem({module:Xe,plugins:at,debug:Ve?{timeTravel:true}:void 0}),S.start();async function ee(l,E,K,$,q){if(Re)try{return await Re.execute(()=>It(l,E,K,$,q))}catch(z){if(Oe){if(Oe.fallbackRunners)for(let de of Oe.fallbackRunners)try{let be={originalAgent:l.name,reroutedTo:"fallback-runner",reason:z instanceof Error?z.message:String(z),timestamp:Date.now()};try{Oe.onReroute?.(be);}catch{}return x&&x.record({type:"reroute",timestamp:Date.now(),agentId:l.name,snapshotId:null,from:l.name,to:"fallback-runner",reason:z instanceof Error?z.message:String(z)}),await de(l,E,$)}catch{}if(Oe.fallbackAgent)try{let de={originalAgent:l.name,reroutedTo:Oe.fallbackAgent.name,reason:z instanceof Error?z.message:String(z),timestamp:Date.now()};try{Oe.onReroute?.(de);}catch{}return x&&x.record({type:"reroute",timestamp:Date.now(),agentId:l.name,snapshotId:null,from:l.name,to:Oe.fallbackAgent.name,reason:z instanceof Error?z.message:String(z)}),await t(Oe.fallbackAgent,E,$)}catch{}if(Oe.degradation==="fallback-response"&&Oe.fallbackResponse!==void 0)return {output:Oe.fallbackResponse,messages:[],toolCalls:[],totalTokens:0}}throw z}return It(l,E,K,$,q)}async function It(l,E,K,$,q){let z=Date.now();if(ge){let G=ge.getContextMessages();if(G.length>0){let V=G.map(_e=>`${_e.role}: ${_e.content}`).join(`
|
|
9
|
+
`);l={...l,instructions:(l.instructions??"")+`
|
|
5
10
|
|
|
6
11
|
Conversation context:
|
|
7
|
-
`+
|
|
12
|
+
`+V};}}if(ce&&ce.length>0){let G={agentId:l.name,agentName:l.name,input:E,state:S.facts.$store.toObject(),breakpointType:"pre_input_guardrails"},V=await $t("pre_input_guardrails",G,q?.signal??$?.signal);if(V?.skip)return {output:void 0,messages:[],toolCalls:[],totalTokens:0};V?.input&&(E=V.input);}let de=q?.inputGuardrails!==void 0?q.inputGuardrails:b.input??[],be=q?.outputGuardrails!==void 0?q.outputGuardrails:b.output??[],ae=de.map((G,V)=>ut(G,V,"input"));for(let G of ae){let{name:V}=G,_e={agentName:l.name,input:E,facts:S.facts.$store.toObject()},Q=Date.now(),ne=await lt(G,{input:E,agentName:l.name},_e);if(ue("onGuardrailCheck",{agentId:l.name,guardrailName:V,guardrailType:"input",passed:ne.passed,reason:ne.reason,durationMs:Date.now()-Q,timestamp:Date.now()}),!ne.passed)throw new tt({code:"INPUT_GUARDRAIL_FAILED",message:`Input guardrail "${V}" failed: ${ne.reason}`,guardrailName:V,guardrailType:"input",userMessage:ne.reason??"Input validation failed",agentName:l.name,input:E});ne.transformed!==void 0&&(E=ne.transformed);}if(ue("onAgentStart",{agentName:l.name,input:E,timestamp:z}),x&&x.record({type:"agent_start",timestamp:Date.now(),agentId:l.name,snapshotId:null,inputLength:E.length,modelId:l.model??void 0,...l.instructions?{instructions:l.instructions.slice(0,ot)}:{},...Ct?{input:E.slice(0,ot)}:{}}),S.batch(()=>{let G=Ue(S.facts);Je(S.facts,{...G,status:"running",currentAgent:l.name,input:E,startedAt:Date.now()});}),ce&&ce.length>0){let G={agentId:l.name,agentName:l.name,input:E,state:S.facts.$store.toObject(),breakpointType:"pre_agent_run"},V=await $t("pre_agent_run",G,q?.signal??$?.signal);if(V?.skip)return {output:void 0,messages:[],toolCalls:[],totalTokens:0};V?.input&&(E=V.input);}let xe=q?.outputSchema!==void 0?q.outputSchema:pt,fe=t;xe&&(fe=bn(t,{schema:xe,maxRetries:q?.maxSchemaRetries??vt??2}));let ie=await nn(fe,l,E,{...$,signal:$?.signal,onMessage:G=>{let _e=[...Ut(S.facts),G];ct(S.facts,_e.length>Un?_e.slice(-Un):_e),$?.onMessage?.(G);},onToolCall:async G=>{let V=(b.toolCall??[]).map((ne,Ae)=>ut(ne,Ae,"toolCall"));for(let ne of V){let{name:Ae}=ne,Tt={agentName:l.name,input:E,facts:S.facts.$store.toObject()},et=Date.now(),J=await lt(ne,{toolCall:G,agentName:l.name,input:E},Tt);if(ue("onGuardrailCheck",{agentId:l.name,guardrailName:Ae,guardrailType:"toolCall",passed:J.passed,reason:J.reason,durationMs:Date.now()-et,timestamp:Date.now()}),!J.passed)throw new tt({code:"TOOL_CALL_GUARDRAIL_FAILED",message:`Tool call guardrail "${Ae}" failed: ${J.reason}`,guardrailName:Ae,guardrailType:"toolCall",userMessage:J.reason??"Tool call blocked",data:{toolCall:G},agentName:l.name,input:E})}if(!k){let ne=`tool-${G.id}`,Ae={id:ne,type:"tool_call",agentName:l.name,description:`Tool call: ${G.name}`,data:G,requestedAt:Date.now()};S.batch(()=>{let Tt=it(S.facts);Qe(S.facts,{...Tt,pending:[...Tt.pending,Ae]});}),R?.(Ae),await jt(ne,q?.signal??$?.signal);}let Q=[...Jt(S.facts),G];dt(S.facts,Q.length>Jn?Q.slice(-Jn):Q),$?.onToolCall?.(G);}},N?{...N,onRetry:(G,V,_e)=>{N.onRetry?.(G,V,_e),ue("onAgentRetry",{agentName:l.name,input:E,attempt:G,error:V,delayMs:_e,timestamp:Date.now()});}}:void 0);if(ce&&ce.length>0){let G={agentId:l.name,agentName:l.name,input:E,state:S.facts.$store.toObject(),breakpointType:"pre_output_guardrails"},V=await $t("pre_output_guardrails",G,q?.signal??$?.signal);if(V?.skip)return {output:void 0,messages:[],toolCalls:[],totalTokens:0};V?.input&&(E=V.input);}let We=be.map((G,V)=>ut(G,V,"output"));for(let G of We){let{name:V}=G,_e={agentName:l.name,input:E,facts:S.facts.$store.toObject()},Q=Date.now(),ne=await lt(G,{output:ie.output,agentName:l.name,input:E,messages:ie.messages},_e);if(ue("onGuardrailCheck",{agentId:l.name,guardrailName:V,guardrailType:"output",passed:ne.passed,reason:ne.reason,durationMs:Date.now()-Q,timestamp:Date.now()}),!ne.passed)throw new tt({code:"OUTPUT_GUARDRAIL_FAILED",message:`Output guardrail "${V}" failed: ${ne.reason}`,guardrailName:V,guardrailType:"output",userMessage:ne.reason??"Output validation failed",agentName:l.name,input:E});ne.transformed!==void 0&&(ie.output=ne.transformed);}let st=false,Ce=0;if(S.batch(()=>{let G=Ue(S.facts),V=G.tokenUsage+ie.totalTokens;if(Je(S.facts,{...G,status:"completed",output:ie.output,tokenUsage:V,turnCount:G.turnCount+ie.messages.length,completedAt:Date.now()}),v&&Y){Ce=V/v;let _e=adapterUtils.getBridgeFact(S.facts,"__budgetWarningFired");Ce>=A&&!_e&&(adapterUtils.setBridgeFact(S.facts,"__budgetWarningFired",true),st=true);}}),st)try{Y({currentTokens:Ue(S.facts).tokenUsage,maxBudget:v,percentage:Ce});}catch(G){Ve&&console.debug("[Directive Orchestrator] onBudgetWarning threw:",G);}if(ge&&ie.messages.length>0)try{ge.addMessages(ie.messages);}catch(G){Ve&&console.debug("[Directive] Memory addMessages failed:",G);}if(ue("onAgentComplete",{agentName:l.name,input:E,output:ie.output,tokenUsage:ie.totalTokens,durationMs:Date.now()-z,timestamp:Date.now()}),x){let G=typeof ie.output=="string"?ie.output:JSON.stringify(ie.output);x.record({type:"agent_complete",timestamp:Date.now(),agentId:l.name,snapshotId:null,outputLength:G?.length??0,totalTokens:ie.totalTokens,inputTokens:ie.tokenUsage?.inputTokens??0,outputTokens:ie.tokenUsage?.outputTokens??0,durationMs:Date.now()-z,modelId:l.model??void 0,...Ct?{output:G.slice(0,ot)}:{}});}if(ce&&ce.length>0){let G={agentId:l.name,agentName:l.name,input:E,state:S.facts.$store.toObject(),breakpointType:"post_run"},V=await $t("post_run",G,q?.signal??$?.signal);if(V?.skip)return {output:void 0,messages:[],toolCalls:[],totalTokens:0};V?.input&&(E=V.input);}return ie}oe=ee;let wt=new Map,Rt=new Map;function Nt(l,E){return E?.aborted?Promise.reject(E.reason??new Error("Aborted while waiting for breakpoint")):new Promise((K,$)=>{let q=false,z=null,de=()=>{q||(q=true,z&&(clearTimeout(z),z=null),E&&E.removeEventListener("abort",be),ae());},be=()=>{de(),$(E.reason??new Error(`Breakpoint wait for ${l} aborted`));};E&&E.addEventListener("abort",be,{once:true});let ae=S.facts.$store.subscribe([At],()=>{if(q)return;let fe=nt(S.facts);if(fe.resolved.includes(l)){de();let ie=wt.get(l)??null;wt.delete(l),K(ie);}else if(fe.cancelled.includes(l)){de(),wt.delete(l);let ie=Rt.get(l);Rt.delete(l),$(new Error(ie?`Breakpoint ${l} was cancelled: ${ie}`:`Breakpoint ${l} was cancelled`));}}),xe=xt??3e5;z=setTimeout(()=>{q||(de(),wt.delete(l),Rt.delete(l),$(new Error(`[Directive] Breakpoint timeout: ${l} not resolved within ${Math.round(xe/1e3)}s`)));},xe);})}async function $t(l,E,K){if(!ce||ce.length===0)return null;let $=vn(ce,l,E);if(!$)return null;let q=kn(),z={id:q,type:l,agentId:E.agentId,input:E.input,label:$.label,requestedAt:Date.now()};S.batch(()=>{let be=nt(S.facts);rt(S.facts,{...be,pending:[...be.pending,z]});});try{yt?.(z);}catch{}try{U.onBreakpoint?.(z);}catch{}x&&x.record({type:"breakpoint_hit",timestamp:Date.now(),snapshotId:null,agentId:E.agentId,breakpointId:q,breakpointType:l,label:$.label});let de=await Nt(q,K);return x&&x.record({type:"breakpoint_resumed",timestamp:Date.now(),snapshotId:null,agentId:E.agentId,breakpointId:q,modified:!!de?.input,skipped:!!de?.skip}),de}function jt(l,E){return E?.aborted?Promise.reject(E.reason??new Error("Aborted while waiting for approval")):new Promise((K,$)=>{let q=false,z=null,de=()=>{q||(q=true,z&&(clearTimeout(z),z=null),E&&E.removeEventListener("abort",be),ae());},be=()=>{de(),$(E.reason??new Error(`Approval wait for ${l} aborted`));};E&&E.addEventListener("abort",be,{once:true});let ae=S.facts.$store.subscribe([Et],()=>{if(q)return;let xe=it(S.facts);if(xe.approved.includes(l))de(),K();else {let fe=xe.rejected.find(ie=>ie.id===l);if(fe){de();let ie=fe.reason?`Request ${l} rejected: ${fe.reason}`:`Request ${l} rejected`;$(new Error(ie));}}});z=setTimeout(()=>{if(q)return;de();let xe=Math.round(Ke/1e3);$(new Error(`[Directive] Approval timeout: Request ${l} not resolved within ${xe}s.
|
|
13
|
+
Solutions:
|
|
14
|
+
1. Handle via onApprovalRequest callback and call orchestrator.approve()/reject()
|
|
15
|
+
2. Set autoApproveToolCalls: true to auto-approve
|
|
16
|
+
3. Increase approvalTimeoutMs (current: ${Ke}ms)
|
|
17
|
+
See: https://directive.run/docs/ai/running-agents`));},Ke);})}function un(){return {...Ze(S.facts)}}return {system:S,get facts(){return un()},get totalTokens(){return Ue(S.facts).tokenUsage},get timeline(){return x},async run(l,E,K){return ee(l,E,un(),void 0,K)},runStream(l,E,K={}){let $=new AbortController,q=1e4,z=[],de=[],be=false,ae=Date.now(),xe=0,fe=1e5,ie="",We;K.signal&&(We=()=>$.abort(),K.signal.addEventListener("abort",We,{once:true}));let st=()=>{We&&K.signal&&K.signal.removeEventListener("abort",We);},Ce=Q=>{if(be)return;let ne=de.shift();ne?ne(Q):(z.push(Q),z.length>q&&z.shift());},G=()=>{be=true,st();for(let Q of de)Q(null);de.length=0;},V=(async()=>{Ce({type:"progress",phase:"starting",message:"Running input guardrails"});try{let Q=E,ne=(b.input??[]).map((J,Me)=>ut(J,Me,"input"));for(let J of ne){let{name:Me}=J,kt={agentName:l.name,input:Q,facts:S.facts.$store.toObject()},ke=await lt(J,{input:Q,agentName:l.name},kt);if(!ke.passed)throw Ce({type:"guardrail_triggered",guardrailName:Me,reason:ke.reason??"Input validation failed",partialOutput:ie,stopped:!0}),new tt({code:"INPUT_GUARDRAIL_FAILED",message:`Input guardrail "${Me}" failed: ${ke.reason}`,guardrailName:Me,guardrailType:"input",userMessage:ke.reason??"Input validation failed",agentName:l.name,input:Q});ke.transformed!==void 0&&(Q=ke.transformed);}Ce({type:"progress",phase:"generating",message:"Starting agent"}),S.batch(()=>{let J=Ue(S.facts);Je(S.facts,{...J,status:"running",currentAgent:l.name,input:Q,startedAt:Date.now()});});let Ae=await nn(t,l,Q,{signal:$.signal,onMessage:J=>{let Me=Ut(S.facts);if(ct(S.facts,[...Me,J]),Ce({type:"message",message:J}),J.role==="assistant"&&J.content){let kt=Math.ceil(J.content.length/4);xe+=kt,ie+=J.content,ie.length>fe&&(ie=ie.slice(-fe)),Ce({type:"token",data:J.content,tokenCount:xe});}},onToolCall:async J=>{Ce({type:"tool_start",tool:J.name,toolCallId:J.id,arguments:J.arguments});let Me=(b.toolCall??[]).map((ke,Ye)=>ut(ke,Ye,"toolCall"));for(let ke of Me){let{name:Ye}=ke,gt={agentName:l.name,input:Q,facts:S.facts.$store.toObject()},qt=await lt(ke,{toolCall:J,agentName:l.name,input:Q},gt);if(!qt.passed)throw Ce({type:"guardrail_triggered",guardrailName:Ye,reason:qt.reason??"Tool call blocked",partialOutput:ie,stopped:!0}),new tt({code:"TOOL_CALL_GUARDRAIL_FAILED",message:`Tool call guardrail "${Ye}" failed: ${qt.reason}`,guardrailName:Ye,guardrailType:"toolCall",userMessage:qt.reason??"Tool call blocked",data:{toolCall:J},agentName:l.name,input:Q})}if(!k){let ke=`tool-${J.id}`;Ce({type:"approval_required",requestId:ke,toolName:J.name});let Ye={id:ke,type:"tool_call",agentName:l.name,description:`Tool call: ${J.name}`,data:J,requestedAt:Date.now()};S.batch(()=>{let gt=it(S.facts);Qe(S.facts,{...gt,pending:[...gt.pending,Ye]});}),R?.(Ye),await jt(ke,$.signal),Ce({type:"approval_resolved",requestId:ke,approved:!0});}let kt=Jt(S.facts);dt(S.facts,[...kt,J]),J.result&&Ce({type:"tool_end",tool:J.name,toolCallId:J.id,result:J.result});}},N);Ce({type:"progress",phase:"finishing",message:"Running output guardrails"});let Tt=(b.output??[]).map((J,Me)=>ut(J,Me,"output"));for(let J of Tt){let{name:Me}=J,kt={agentName:l.name,input:Q,facts:S.facts.$store.toObject()},ke=await lt(J,{output:Ae.output,agentName:l.name,input:Q,messages:Ae.messages},kt);if(!ke.passed)throw Ce({type:"guardrail_triggered",guardrailName:Me,reason:ke.reason??"Output validation failed",partialOutput:typeof Ae.output=="string"?Ae.output:"",stopped:!0}),new tt({code:"OUTPUT_GUARDRAIL_FAILED",message:`Output guardrail "${Me}" failed: ${ke.reason}`,guardrailName:Me,guardrailType:"output",userMessage:ke.reason??"Output validation failed",agentName:l.name,input:Q});ke.transformed!==void 0&&(Ae.output=ke.transformed);}S.batch(()=>{let J=Ue(S.facts);Je(S.facts,{...J,status:"completed",output:Ae.output,tokenUsage:J.tokenUsage+Ae.totalTokens,turnCount:J.turnCount+Ae.messages.length,completedAt:Date.now()});});let et=Date.now()-ae;return Ce({type:"done",totalTokens:Ae.totalTokens,duration:et,droppedTokens:0}),G(),Ae}catch(Q){throw Ce({type:"error",error:Q instanceof Error?Q:new Error(String(Q))}),G(),Q}})();return V.catch(()=>{}),{stream:{[Symbol.asyncIterator](){return {async next(){return z.length>0?{done:false,value:z.shift()}:be?{done:true,value:void 0}:new Promise(Q=>{de.push(ne=>{Q(ne===null?{done:true,value:void 0}:{done:false,value:ne});});})}}}},result:V,abort:()=>{$.abort(),G();}}},async waitForIdle(l){let E=()=>Ue(S.facts).status!=="running";if(E())return;let K=Date.now();for(;!E();){if(l!==void 0&&Date.now()-K>l)throw new Error("[Directive Orchestrator] waitForIdle timed out");await new Promise($=>setTimeout($,50));}},approve(l){S.batch(()=>{let E=it(S.facts);if(!E.pending.some(q=>q.id===l)){Ve&&console.debug(`[Directive] approve() ignored: no pending request "${l}"`);return}let K=200,$=[...E.approved,l];Qe(S.facts,{...E,pending:E.pending.filter(q=>q.id!==l),approved:$.length>K?$.slice(-K):$});});},reject(l,E){S.batch(()=>{let K=it(S.facts);if(!K.pending.some(de=>de.id===l)){Ve&&console.debug(`[Directive] reject() ignored: no pending request "${l}"`);return}E&&Ve&&console.debug(`[Directive] Request ${l} rejected: ${E}`);let $={id:l,reason:E,rejectedAt:Date.now()},q=200,z=[...K.rejected,$];Qe(S.facts,{...K,pending:K.pending.filter(de=>de.id!==l),rejected:z.length>q?z.slice(-q):z});});},pause(){let l=Ue(S.facts);Je(S.facts,{...l,status:"paused"});},resume(){let l=Ue(S.facts);l.status==="paused"&&Je(S.facts,{...l,status:l.currentAgent?"running":"idle"});},reset(){S.batch(()=>{Je(S.facts,{status:"idle",currentAgent:null,input:null,output:null,error:null,tokenUsage:0,turnCount:0,startedAt:null,completedAt:null}),Qe(S.facts,{pending:[],approved:[],rejected:[]}),ct(S.facts,[]),dt(S.facts,[]),rt(S.facts,{pending:[],resolved:[],cancelled:[]}),adapterUtils.setBridgeFact(S.facts,"__budgetWarningFired",false);}),wt.clear(),Rt.clear();},async checkpoint(l){if(Ue(S.facts).status==="running")throw new Error("[Directive] Cannot checkpoint while agent is running");if(!S.debug?.export)throw new Error("[Directive] Checkpointing requires debug mode. Set `debug: true` in orchestrator options.");let K={version:1,id:mt(),createdAt:new Date().toISOString(),label:l?.label,systemExport:S.debug.export(),timelineExport:x?.export()??null,localState:{type:"single"},memoryExport:ge?ge.export?.()??null:null,orchestratorType:"single"};return Te&&await Te.save(K),K},restore(l,E){if(!Qt(l))throw new Error("[Directive] Invalid checkpoint data");if(l.orchestratorType!=="single")throw new Error("[Directive] Cannot restore multi-agent checkpoint in single-agent orchestrator");if(!S.debug?.import)throw new Error("[Directive] Restoring a checkpoint requires debug mode. Set `debug: true` in orchestrator options.");S.debug.import(l.systemExport),E?.restoreTimeline!==false&&l.timelineExport&&x&&x.import(l.timelineExport),l.memoryExport!==null&&ge&&ge.import&&ge.import(l.memoryExport);},resumeBreakpoint(l,E){E&&wt.set(l,E),S.batch(()=>{let K=nt(S.facts),$=[...K.resolved,l];rt(S.facts,{...K,pending:K.pending.filter(q=>q.id!==l),resolved:$.length>ht?$.slice(-ht):$});});},cancelBreakpoint(l,E){E&&Rt.set(l,E),S.batch(()=>{let K=nt(S.facts),$=[...K.cancelled,l];rt(S.facts,{...K,pending:K.pending.filter(q=>q.id!==l),cancelled:$.length>ht?$.slice(-ht):$});});},getPendingBreakpoints(){return [...nt(S.facts).pending]},dispose(){S.destroy();}}}var yn=class extends Error{iterations;history;lastResult;totalTokens;constructor(t){super(`[Directive Reflection] Exhausted ${t.iterations} iterations without passing evaluation. Last feedback: ${t.history[t.history.length-1]?.feedback??"(none)"}`),this.name="ReflectionExhaustedError",this.iterations=t.iterations,this.history=t.history,this.lastResult=t.lastResult,this.totalTokens=t.totalTokens;}};var _n={successRate:.5,latency:.3,circuitState:.2};function Kn(i={}){let t=i.windowMs??6e4,u=i.maxNormalLatencyMs??5e3,a=i.maxEventsPerAgent??1e3,p={successRate:i.weights?.successRate??_n.successRate,latency:i.weights?.latency??_n.latency,circuitState:i.weights?.circuitState??_n.circuitState};if(!Number.isFinite(t)||t<=0)throw new Error("[Directive HealthMonitor] windowMs must be a positive number");if(!Number.isFinite(u)||u<=0)throw new Error("[Directive HealthMonitor] maxNormalLatencyMs must be a positive number");if(!Number.isFinite(a)||a<1)throw new Error("[Directive HealthMonitor] maxEventsPerAgent must be >= 1");for(let[N,U]of Object.entries(p))if(U<0||U>1)throw new Error(`[Directive HealthMonitor] weight "${N}" must be between 0 and 1 (got ${U})`);let f=p.successRate+p.latency+p.circuitState;if(Math.abs(f-1)>.01)throw new Error(`[Directive HealthMonitor] weights must sum to ~1.0 (tolerance: \xB10.01, got ${f.toFixed(4)})`);let b=new Map,R=new Map,k=0,v=null,A=-1;function Y(N){let U=b.get(N);return U||(U=[],b.set(N,U)),U}function X(N,U){let ge=U-t,Re=0;for(;Re<N.length&&N[Re].timestamp<ge;)Re++;let Oe=N.length-Re-a;Oe>0&&(Re+=Oe),Re>0&&N.splice(0,Re);}function Ee(N){let U=b.get(N);if(!U||U.length===0)return 50;let ge=Date.now();if(X(U,ge),U.length===0)return 50;let Oe=U.filter(xt=>xt.success).length/U.length,pt=U.reduce((xt,Ve)=>xt+Ve.latencyMs,0)/U.length,vt=Math.min(pt/u,1),Te=R.get(N)??"CLOSED",ce=Te==="CLOSED"?1:Te==="HALF_OPEN"?.5:0,yt=Oe*p.successRate+(1-vt)*p.latency+ce*p.circuitState;return Math.round(yt*100)}function Ke(N){let U=Y(N),ge=Date.now();X(U,ge);let Re=U.filter(ce=>ce.success).length,Oe=U.length-Re,pt=U.length>0?Re/U.length:0,vt=U.length>0?U.reduce((ce,yt)=>ce+yt.latencyMs,0)/U.length:0,Te=[];for(let ce=U.length-1;ce>=0&&Te.length<5;ce--)U[ce].errorMessage&&Te.unshift(U[ce].errorMessage);return {agentId:N,circuitState:R.get(N)??"CLOSED",successRate:pt,avgLatencyMs:vt,recentFailures:Oe,recentSuccesses:Re,healthScore:Ee(N),lastErrors:Te}}return {recordSuccess(N,U){let ge=Y(N);ge.push({success:true,latencyMs:U,timestamp:Date.now()}),X(ge,Date.now()),k++;},recordFailure(N,U,ge){let Re=Y(N);Re.push({success:false,latencyMs:U,timestamp:Date.now(),errorMessage:ge?.message}),X(Re,Date.now()),k++;},getMetrics(N){return Ke(N)},getAllMetrics(){if(k===A&&v)return v;let N=Object.create(null);for(let U of b.keys())N[U]=Ke(U);return v=N,A=k,N},getHealthScore(N){return Ee(N)},updateCircuitState(N,U){R.set(N,U),k++;},reset(){b.clear(),R.clear(),k++,v=null,A=-1;}}}var Cr=1e4;function Vn(i){if(i.length===0)return {stream:{[Symbol.asyncIterator](){let A={done:true,value:void 0};return {async next(){return A},async return(){return A}}}},getDroppedCount:()=>0};let t=[],u=[],a=i.length,p=false,f=0;function b(v){if(p)return;let A=u.shift();if(A){A(v);return}t.length<Cr?t.push(v):f++;}function R(){if(a--,a<=0){p=true;for(let v of u)v(null);u.length=0;}}for(let v of i)(async()=>{try{for await(let A of v.stream)b({chunk:A,agentId:v.agentId});}catch(A){b({chunk:{type:"error",error:A instanceof Error?A:new Error(String(A))},agentId:v.agentId});}finally{R();}})();return {stream:{[Symbol.asyncIterator](){return {async next(){return t.length>0?{done:false,value:t.shift()}:p?{done:true,value:void 0}:new Promise(v=>{u.push(A=>{v(A===null?{done:true,value:void 0}:{done:false,value:A});});})},return(){p=true,t.length=0;for(let v of u)v(null);return u.length=0,Promise.resolve({done:true,value:void 0})}}}},getDroppedCount:()=>f}}function Kt(i){if(typeof i=="string")return i;try{return JSON.stringify(i)}catch{return String(i)}}function _r(i,t){if(Object.is(i,t))return true;if(typeof i!=typeof t||i===null||t===null||typeof i!="object")return false;if(Array.isArray(i)){if(!Array.isArray(t)||i.length!==t.length)return false;for(let b=0;b<i.length;b++)if(i[b]!==t[b])return false;return true}let u=i,a=t,p=Object.keys(u),f=Object.keys(a);if(p.length!==f.length)return false;for(let b of p)if(u[b]!==a[b])return false;return true}function Xn(i){switch(i.type){case "sequential":return i.step;case "supervisor":return i.round;case "reflect":return i.iteration;case "debate":return i.round;case "dag":return i.completedCount;case "goal":return i.step}}var Vt=class{count;maxPermits;queue=[];constructor(t){if(t<1||!Number.isFinite(t))throw new Error(`[Directive Semaphore] Invalid max permits: ${t}. Must be a finite number >= 1.`);this.maxPermits=t,this.count=t;}createReleaseFn(){let t=false;return ()=>{t||(t=true,this.release());}}async acquire(t){if(t?.aborted)throw new Error("[Directive Semaphore] Aborted before acquiring permit");return this.count>0?(this.count--,this.createReleaseFn()):new Promise((u,a)=>{let p,f={resolve:b=>{p&&t&&t.removeEventListener("abort",p),u(b);},reject:a};this.queue.push(f),t&&(p=()=>{let b=this.queue.indexOf(f);b>=0&&(this.queue.splice(b,1),a(new Error("[Directive Semaphore] Aborted while waiting for permit")));},t.addEventListener("abort",p,{once:true}));})}tryAcquire(){return this.count>0?(this.count--,this.createReleaseFn()):null}release(){this.count++;let t=this.queue.shift();t&&(this.count--,t.resolve(this.createReleaseFn()));}get available(){return this.count}get waiting(){return this.queue.length}get max(){return this.maxPermits}drain(){let t=new Error("[Directive Semaphore] Semaphore drained - all pending acquisitions rejected"),u=this.queue.splice(0,this.queue.length);for(let a of u)a.reject(t);this.count=this.maxPermits;}},Mr=adapterUtils.requirementGuard("RUN_AGENT");function zn(i){let{runner:t,agents:u,patterns:a={},onHandoff:p,onHandoffComplete:f,maxHandoffHistory:b=1e3,debug:R=false,guardrails:k={},hooks:v={},memory:A,agentRetry:Y,maxTokenBudget:X,plugins:Ee=[],onApprovalRequest:Ke,autoApproveToolCalls:N=true,approvalTimeoutMs:U=3e5,constraints:ge={},resolvers:Re={},circuitBreaker:Oe,budgetWarningThreshold:pt=.8,onBudgetWarning:vt,selfHealing:Te,checkpointStore:ce,breakpoints:yt=[],onBreakpoint:xt,breakpointTimeoutMs:Ve=3e5,derive:Ct,scratchpad:ot}=i,ue=typeof R=="object"?true:!!R,Xt=typeof R=="object"?!!R.verboseTimeline:false,Yt=5e3,oe={...u};if(!N&&!Ke)throw new Error(`[Directive MultiAgent] Invalid approval configuration: autoApproveToolCalls is false but no onApprovalRequest callback provided. Tool calls would wait for approval indefinitely. Either:
|
|
18
|
+
- Set autoApproveToolCalls: true to auto-approve all tool calls
|
|
19
|
+
- Provide an onApprovalRequest callback to handle approvals programmatically`);if(pt<0||pt>1)throw new Error(`[Directive MultiAgent] budgetWarningThreshold must be between 0 and 1, got ${pt}`);let S=new Set(["__coord","__proto__","constructor","prototype","toString","valueOf","hasOwnProperty"]);for(let e of Object.keys(oe))if(S.has(e))throw new Error(`[Directive MultiAgent] Agent ID "${e}" is reserved and cannot be used`);let zt=new Set(Object.keys(oe)),Pt=[];for(let[e,r]of Object.entries(a)){let s=[];switch(r.type){case "parallel":s.push(...r.agents);break;case "sequential":s.push(...r.agents);break;case "supervisor":s.push(r.supervisor,...r.workers);break;case "dag":for(let n of Object.values(r.nodes))s.push(n.agent);break;case "reflect":s.push(r.agent,r.evaluator);break;case "race":s.push(...r.agents);break;case "debate":s.push(...r.agents,r.evaluator);break}for(let n of s)zt.has(n)||Pt.push({patternId:e,agentId:n});}if(Pt.length>0){let e=Pt.map(({patternId:r,agentId:s})=>` - Pattern "${r}" references unknown agent "${s}"`).join(`
|
|
20
|
+
`);throw new Error(`[Directive MultiAgent] Pattern validation failed. The following agents are not registered:
|
|
21
|
+
${e}
|
|
22
|
+
|
|
23
|
+
Registered agents: ${[...zt].join(", ")||"(none)"}`)}for(let[e,r]of Object.entries(a))r.type==="dag"&&Pr(e,r.nodes);let x=null,sn=null;ue&&(x=Ht({goToSnapshot:e=>{try{l.debug?.goTo?.(e);}catch{}}}));let Xe=null,at=null;Te&&(Xe=Kn(Te.healthMonitor),Te.selectionStrategy==="round-robin"&&(at=new Map));function ee(e,r){try{v[e]?.(r);}catch(s){ue&&console.debug(`[Directive MultiAgent] hooks.${e} threw:`,s);}}let It={__globalTokens:core.t.number(),__status:core.t.string(),__handoffs:core.t.array(),__handoffResults:core.t.array(),__budgetWarningFired:core.t.boolean()};ot&&(It[ze]=core.t.object()),Ct&&Object.keys(Ct).length>0&&(It.__derived=core.t.object());let wt={facts:It,derivations:{},events:{},requirements:{}},Rt=Wt(ge);X&&(Rt.__budgetLimit={priority:100,when:e=>adapterUtils.getBridgeFact(e,"__globalTokens")>X,require:{type:"__PAUSE_BUDGET_EXCEEDED"}});let Nt=Object.create(null);for(let[e,r]of Object.entries(Re))Nt[e]={requirement:r.requirement,key:r.key,resolve:async(s,n)=>{let o=Ze(n.facts),d={facts:{...n.facts,...o},runAgent:async(g,h,C)=>t(g,h,C),signal:n.signal};return r.resolve(s,d)}};Nt.__pause={requirement:adapterUtils.requirementGuard("__PAUSE_BUDGET_EXCEEDED"),resolve:async()=>{q="paused",ue&&console.debug("[Directive MultiAgent] Budget exceeded \u2014 all agents paused");}},Nt.__runAgent={requirement:Mr,resolve:async e=>{await $e(e.agent,e.input);}};let $t=core.createModule("__coord",{schema:wt,init:e=>{adapterUtils.setBridgeFact(e,"__globalTokens",0),adapterUtils.setBridgeFact(e,"__status","idle"),adapterUtils.setBridgeFact(e,"__handoffs",[]),adapterUtils.setBridgeFact(e,"__handoffResults",[]),adapterUtils.setBridgeFact(e,"__budgetWarningFired",false),ot&&adapterUtils.setBridgeFact(e,ze,{...ot.init});},constraints:Rt,resolvers:Nt}),jt=Object.create(null);jt.__coord=$t;for(let[e,r]of Object.entries(oe)){let s=r.constraints?Wt(r.constraints):{},n=Object.create(null);if(r.resolvers)for(let[o,c]of Object.entries(r.resolvers))n[o]={requirement:c.requirement,key:c.key,resolve:async(d,g)=>{let h=Ze(g.facts),O={facts:{...g.facts,...h},runAgent:async(M,_,W)=>t(M,_,W),signal:g.signal};return c.resolve(d,O)}};jt[e]=core.createModule(e,{schema:tn,init:o=>{Je(o,{status:"idle",currentAgent:r.agent.name,input:null,output:null,error:null,tokenUsage:0,turnCount:0,startedAt:null,completedAt:null}),Qe(o,{pending:[],approved:[],rejected:[]}),ct(o,[]),dt(o,[]),rt(o,an());},constraints:s,resolvers:Object.keys(n).length>0?n:void 0});}let un=adapterUtils.createCallbackPlugin("directive-multi-agent-callbacks",{}),wn=[...Ee,un];ue&&x&&(sn=hn(x,()=>{try{return l.debug?.currentIndex??null}catch{return null}}),wn.push(sn));let l=core.createSystem({modules:jt,plugins:wn,debug:ue?{timeTravel:true}:void 0});l.start();let E=500,K=200,$=0,q="idle",z=false,de=0,be=null;function ae(){if(z)throw new Error("[Directive MultiAgent] Orchestrator has been disposed")}let xe=new Map;for(let[e,r]of Object.entries(oe))xe.set(e,new Vt(r.maxConcurrent??1));let fe=Object.create(null);for(let e of Object.keys(oe))fe[e]={status:"idle",runCount:0,totalTokens:0};let ie=b,We=[],st=[],Ce=0;function G(e){for(st.push(e);st.length>ie;)st.shift();}let V=new Map,_e=new Set;function Q(){for(let e of _e)e();}let ne=Object.create(null),Ae=new Set;function Tt(){let e=Object.create(null);for(let[n,o]of Object.entries(fe))e[n]={status:o.status,lastInput:o.lastInput,lastOutput:o.lastOutput,lastError:o.lastError,runCount:o.runCount,totalTokens:o.totalTokens};let r=Pe("__coord"),s={agents:e,coordinator:{globalTokens:$,status:q}};return ot&&r&&(s.scratchpad=adapterUtils.getBridgeFact(r,ze)??{}),s}function et(){if(!Ct)return;let e=Tt(),r=[],s=[];l.batch(()=>{for(let[o,c]of Object.entries(Ct))try{let d=c(e),g=ne[o],h=!_r(d,g);ne[o]=d,h&&r.push({derivId:o,newValue:d});}catch(d){s.push({derivId:o,derivError:d});}let n=Pe("__coord");n&&adapterUtils.setBridgeFact(n,"__derived",{...ne});});for(let{derivId:n,newValue:o}of r){x&&x.record({type:"derivation_update",timestamp:Date.now(),snapshotId:null,derivationId:n,valueType:typeof o}),ee("onDerivationUpdate",{derivationId:n,value:o,timestamp:Date.now()});for(let c of Ae)try{c(n,o);}catch{}}for(let{derivId:n,derivError:o}of s)ue&&console.warn(`[Directive MultiAgent] Derivation "${n}" threw:`,o),ee("onDerivationError",{derivationId:n,error:o instanceof Error?o:new Error(String(o)),timestamp:Date.now()});}let J=new Set,Me=new Map,kt=ot?{get(e){let r=Pe("__coord"),s=adapterUtils.getBridgeFact(r,ze);if(!(s==null||!Object.hasOwn(s,e)))return s[e]},set(e,r){if(e==="__proto__"||e==="constructor"||e==="prototype")return;let s=Pe("__coord"),n=[e];l.batch(()=>{let o=adapterUtils.getBridgeFact(s,ze)??{};adapterUtils.setBridgeFact(s,ze,{...o,[e]:r});}),ke(n,e,r),et();},has(e){let r=Pe("__coord"),s=adapterUtils.getBridgeFact(r,ze);return s!=null&&Object.hasOwn(s,e)},delete(e){if(e==="__proto__"||e==="constructor"||e==="prototype")return;let r=Pe("__coord");l.batch(()=>{let s=adapterUtils.getBridgeFact(r,ze)??{},{[e]:n,...o}=s;adapterUtils.setBridgeFact(r,ze,o);}),ke([e],e,void 0),et();},update(e){let r=Object.create(null);for(let o of Object.keys(e))o==="__proto__"||o==="constructor"||o==="prototype"||(r[o]=e[o]);let s=Pe("__coord"),n=Object.keys(r);if(n.length!==0){l.batch(()=>{let o=adapterUtils.getBridgeFact(s,ze)??{};adapterUtils.setBridgeFact(s,ze,{...o,...r});});for(let[o,c]of Object.entries(r))ke(n,o,c);et();}},getAll(){let e=Pe("__coord");return {...adapterUtils.getBridgeFact(e,ze)??{}}},subscribe(e,r){for(let s of e)Me.has(s)||Me.set(s,new Set),Me.get(s).add(r);return ()=>{for(let s of e)Me.get(s)?.delete(r);}},onChange(e){return J.add(e),()=>{J.delete(e);}},reset(){if(!ot)return;let e=Pe("__coord");l.batch(()=>{adapterUtils.setBridgeFact(e,ze,{...ot.init});});}}:null;function ke(e,r,s){let n=Me.get(r);if(n)for(let o of n)try{o(r,s);}catch{}for(let o of J)try{o(r,s);}catch{}x&&r===e[e.length-1]&&x.record({type:"scratchpad_update",timestamp:Date.now(),snapshotId:null,keys:e}),r===e[e.length-1]&&ee("onScratchpadUpdate",{keys:e,timestamp:Date.now()});}let Ye=new Map,gt=new Map;function qt(e,r,s){return new Promise((n,o)=>{let c=null,d=false,g,h=Pe(e),C=()=>{d||(d=true,c&&(clearTimeout(c),c=null),g&&s&&s.removeEventListener("abort",g),O());},O=l.subscribe([`${e}.${At}`],()=>{let M=nt(h);if(M.resolved.includes(r)){C();let _=Ye.get(r)??null;Ye.delete(r),n(_);}else if(M.cancelled.includes(r)){C(),Ye.delete(r);let _=gt.get(r);gt.delete(r),o(new Error(_?`[Directive MultiAgent] Breakpoint ${r} cancelled: ${_}`:`[Directive MultiAgent] Breakpoint ${r} cancelled`));}});if(s){if(g=()=>{C(),o(new Error(`[Directive MultiAgent] Breakpoint wait aborted for ${r}`));},s.aborted){C(),o(new Error(`[Directive MultiAgent] Breakpoint wait aborted for ${r}`));return}s.addEventListener("abort",g,{once:true});}c=setTimeout(()=>{C(),Ye.delete(r),gt.delete(r),o(new Error(`[Directive MultiAgent] Breakpoint timeout: ${r} not resolved within ${Math.round(Ve/1e3)}s`));},Ve);})}async function Gt(e,r,s,n,o,c){if(yt.length===0)return {input:n,skip:false};let d=Pe(r),g={agentId:r,agentName:s,input:n,state:Ze(d),breakpointType:e,patternId:c?.patternId,handoff:c?.handoff},h=vn(yt,e,g);if(!h)return {input:n,skip:false};let C=kn(),O={id:C,type:e,agentId:r,input:n,label:h.label,requestedAt:Date.now()};l.batch(()=>{let _=nt(d);rt(d,{..._,pending:[..._.pending,O]});});try{xt?.(O);}catch{}try{v.onBreakpoint?.(O);}catch{}x&&x.record({type:"breakpoint_hit",timestamp:Date.now(),agentId:r,snapshotId:null,breakpointId:C,breakpointType:e,label:h.label});let M=await qt(r,C,o);return x&&x.record({type:"breakpoint_resumed",timestamp:Date.now(),agentId:r,snapshotId:null,breakpointId:C,modified:!!M?.input,skipped:!!M?.skip}),{input:M?.input??n,skip:M?.skip??false}}function Pe(e){return l.facts[e]}function tr(e,r,s){return new Promise((n,o)=>{let c=null,d=false,g,h=Pe(e),C=()=>{d||(d=true,c&&(clearTimeout(c),c=null),g&&s&&s.removeEventListener("abort",g),O());},O=l.subscribe([`${e}.${Et}`],()=>{let M=it(h);if(M.approved.includes(r))C(),n();else {let _=M.rejected.find(W=>W.id===r);if(_){C();let W=_.reason?`Request ${r} rejected: ${_.reason}`:`Request ${r} rejected`;o(new Error(W));}}});if(s){if(g=()=>{C(),o(new Error(`[Directive MultiAgent] Approval wait aborted for request ${r}`));},s.aborted){C(),o(new Error(`[Directive MultiAgent] Approval wait aborted for request ${r}`));return}s.addEventListener("abort",g,{once:true});}c=setTimeout(()=>{C();let M=Math.round(U/1e3);o(new Error(`[Directive MultiAgent] Approval timeout: Request ${r} not resolved within ${M}s.
|
|
8
24
|
Solutions:
|
|
9
25
|
1. Handle via onApprovalRequest callback and call orchestrator.approve()/reject()
|
|
10
26
|
2. Set autoApproveToolCalls: true to auto-approve
|
|
11
|
-
3. Increase approvalTimeoutMs (current: ${
|
|
12
|
-
See: https://directive.run/docs/ai/
|
|
13
|
-
|
|
27
|
+
3. Increase approvalTimeoutMs (current: ${U}ms)
|
|
28
|
+
See: https://directive.run/docs/ai/multi-agent`));},U);})}async function $e(e,r,s){ae();let n=oe[e];if(!n){let o=Object.keys(oe).join(", ")||"(none)";throw new Error(`[Directive MultiAgent] Unknown agent "${e}". Registered agents: ${o}`)}if(s?.signal?.aborted)throw new Error(`[Directive MultiAgent] Agent "${e}" run aborted before starting`);if(q==="paused")throw new Error("[Directive MultiAgent] Orchestrator is paused (budget exceeded or manual pause)");de++;try{let o=n.circuitBreaker??Oe;return o?await o.execute(()=>Pn(e,n,r,s)):await Pn(e,n,r,s)}catch(o){if(Te&&!s?.__isReroute){let d=ir(e),g=ur(d);if(g){let h={originalAgent:e,reroutedTo:g,reason:o instanceof Error?o.message:String(o),timestamp:Date.now()};try{Te.onReroute?.(h);}catch{}return ee("onReroute",h),x&&x.record({type:"reroute",timestamp:Date.now(),agentId:e,snapshotId:null,from:e,to:g,reason:o instanceof Error?o.message:String(o)}),$e(g,r,{...s,__isReroute:true})}if(Te.degradation==="fallback-response"&&Te.fallbackResponse!==void 0)return {output:Te.fallbackResponse,messages:[],toolCalls:[],totalTokens:0}}let c=fe[e];throw c&&c.status!=="error"&&(c.status="error",c.lastError=o instanceof Error?o.message:String(o)),o}finally{de--,Q();}}async function Pn(e,r,s,n){let o=Date.now(),c=Pe(e),d=fe[e],g=r.agent,h=s,C=xe.get(e);if(!C){let T=Object.keys(oe).join(", ")||"(none)";throw new Error(`[Directive MultiAgent] Unknown agent "${e}". Registered agents: ${T}`)}let O=await C.acquire(n?.signal),M=new AbortController,_,W;try{r.timeout&&(_=setTimeout(()=>M.abort(),r.timeout)),n?.signal&&(W=()=>M.abort(),n.signal.addEventListener("abort",W,{once:!0}));let T=r.memory??A;if(T){let y=T.getContextMessages();if(y.length>0){let w=y.map(L=>`${L.role}: ${L.content}`).join(`
|
|
29
|
+
`);g={...g,instructions:(g.instructions??"")+`
|
|
30
|
+
|
|
31
|
+
Conversation context:
|
|
32
|
+
`+w};}}{let y=await Gt("pre_input_guardrails",e,g.name,h,n?.signal);if(y.skip)return d.status="completed",Q(),{output:void 0,messages:[],toolCalls:[],totalTokens:0};h=y.input;}let Z=[...k.input??[],...r.guardrails?.input??[]].map((y,w)=>ut(y,w,"input"));for(let y of Z){let{name:w}=y,L={agentName:g.name,input:h,facts:Ze(c)},me=Date.now(),F=await lt(y,{input:h,agentName:g.name},L);if(ee("onGuardrailCheck",{agentId:e,guardrailName:w,guardrailType:"input",passed:F.passed,reason:F.reason,durationMs:Date.now()-me,timestamp:Date.now()}),!F.passed)throw new tt({code:"INPUT_GUARDRAIL_FAILED",message:`Input guardrail "${w}" failed: ${F.reason}`,guardrailName:w,guardrailType:"input",userMessage:F.reason??"Input validation failed",agentName:g.name,input:h});F.transformed!==void 0&&(h=F.transformed);}ee("onAgentStart",{agentId:e,agentName:g.name,input:h,timestamp:o}),x&&x.record({type:"agent_start",timestamp:Date.now(),agentId:e,snapshotId:null,inputLength:h.length,...g.instructions?{instructions:g.instructions.slice(0,Yt)}:{},...Xt?{input:h.slice(0,Yt)}:{}}),l.batch(()=>{let y=Ue(c);Je(c,{...y,status:"running",input:h,startedAt:Date.now()});}),d.status="running",d.lastInput=h;{let y=await Gt("pre_agent_run",e,g.name,h,n?.signal);if(y.skip)return d.status="completed",Q(),{output:void 0,messages:[],toolCalls:[],totalTokens:0};h=y.input;}let H=t,se=n?.outputSchema!==void 0?n.outputSchema:r.outputSchema;se&&(H=bn(t,{schema:se,maxRetries:n?.maxSchemaRetries??r.maxSchemaRetries??2,extractJson:r.extractJson,schemaDescription:r.schemaDescription}));let I=r.retry??Y,j=await nn(H,g,h,{...r.runOptions,...n,signal:M.signal,onMessage:y=>{let L=[...Ut(c),y];ct(c,L.length>E?L.slice(-E):L),n?.onMessage?.(y);},onToolCall:async y=>{let L=[...k.toolCall??[],...r.guardrails?.toolCall??[]].map((Ie,he)=>ut(Ie,he,"toolCall"));for(let Ie of L){let{name:he}=Ie,ve={agentName:g.name,input:h,facts:Ze(c)},St=Date.now(),De=await lt(Ie,{toolCall:y,agentName:g.name,input:h},ve);if(ee("onGuardrailCheck",{agentId:e,guardrailName:he,guardrailType:"toolCall",passed:De.passed,reason:De.reason,durationMs:Date.now()-St,timestamp:Date.now()}),!De.passed)throw new tt({code:"TOOL_CALL_GUARDRAIL_FAILED",message:`Tool call guardrail "${he}" failed: ${De.reason}`,guardrailName:he,guardrailType:"toolCall",userMessage:De.reason??"Tool call blocked",data:{toolCall:y},agentName:g.name,input:h})}if(!N){let Ie=`tool-${e}-${y.id}`,he={id:Ie,type:"tool_call",agentName:g.name,description:`Tool call: ${y.name}`,data:y,requestedAt:Date.now()};V.set(Ie,e),l.batch(()=>{let ve=it(c);Qe(c,{...ve,pending:[...ve.pending,he]});}),Ke?.(he),await tr(e,Ie,n?.signal);}let F=[...Jt(c),y];dt(c,F.length>K?F.slice(-K):F),n?.onToolCall?.(y);}},I?{...I,onRetry:(y,w,L)=>{I.onRetry?.(y,w,L),ee("onAgentRetry",{agentId:e,agentName:g.name,input:h,attempt:y,error:w,delayMs:L,timestamp:Date.now()});}}:void 0);if((await Gt("pre_output_guardrails",e,g.name,h,n?.signal)).skip)return d.status="completed",Q(),j;let P=[...k.output??[],...r.guardrails?.output??[]].map((y,w)=>ut(y,w,"output"));for(let y of P){let{name:w}=y,L={agentName:g.name,input:h,facts:Ze(c)},me=Date.now(),F=await lt(y,{output:j.output,agentName:g.name,input:h,messages:j.messages},L);if(ee("onGuardrailCheck",{agentId:e,guardrailName:w,guardrailType:"output",passed:F.passed,reason:F.reason,durationMs:Date.now()-me,timestamp:Date.now()}),!F.passed)throw new tt({code:"OUTPUT_GUARDRAIL_FAILED",message:`Output guardrail "${w}" failed: ${F.reason}`,guardrailName:w,guardrailType:"output",userMessage:F.reason??"Output validation failed",agentName:g.name,input:h});F.transformed!==void 0&&(j.output=F.transformed);}l.batch(()=>{let y=Ue(c);Je(c,{...y,status:"completed",output:j.output,tokenUsage:y.tokenUsage+j.totalTokens,turnCount:y.turnCount+j.messages.length,completedAt:Date.now()});}),d.status="completed",d.lastOutput=j.output,d.runCount++,d.totalTokens+=j.totalTokens,Q();let re=Pe("__coord"),te=!1,B=0;if(l.batch(()=>{let w=adapterUtils.getBridgeFact(re,"__globalTokens")+j.totalTokens;if($=w,adapterUtils.setBridgeFact(re,"__globalTokens",w),X&&vt){B=w/X;let L=adapterUtils.getBridgeFact(re,"__budgetWarningFired");B>=pt&&!L&&(adapterUtils.setBridgeFact(re,"__budgetWarningFired",!0),te=!0);}}),te)try{vt({currentTokens:$,maxBudget:X,percentage:B});}catch(y){ue&&console.debug("[Directive MultiAgent] onBudgetWarning threw:",y);}if(T&&j.messages.length>0)try{T.addMessages(j.messages);}catch(y){ue&&console.debug("[Directive MultiAgent] Memory addMessages failed:",y);}if(ee("onAgentComplete",{agentId:e,agentName:g.name,input:h,output:j.output,tokenUsage:j.totalTokens,durationMs:Date.now()-o,timestamp:Date.now()}),x){let y=typeof j.output=="string"?j.output:Kt(j.output);x.record({type:"agent_complete",timestamp:Date.now(),agentId:e,snapshotId:null,outputLength:y.length,totalTokens:j.totalTokens,inputTokens:j.tokenUsage?.inputTokens??0,outputTokens:j.tokenUsage?.outputTokens??0,durationMs:Date.now()-o,modelId:r.agent.model??void 0,...Xt?{output:y.slice(0,Yt)}:{}});}return Xe&&Xe.recordSuccess(e,Date.now()-o),et(),await Gt("post_run",e,g.name,h,n?.signal),j}catch(T){throw d.status="error",d.lastError=T instanceof Error?T.message:String(T),Q(),l.batch(()=>{let D=Ue(c);Je(c,{...D,status:"error",error:T instanceof Error?T.message:String(T),completedAt:Date.now()});}),ee("onAgentError",{agentId:e,agentName:g.name,input:h,error:T instanceof Error?T:new Error(String(T)),durationMs:Date.now()-o,timestamp:Date.now()}),x&&x.record({type:"agent_error",timestamp:Date.now(),agentId:e,snapshotId:null,errorMessage:T instanceof Error?T.message:String(T),durationMs:Date.now()-o}),Xe&&Xe.recordFailure(e,Date.now()-o,T instanceof Error?T:new Error(String(T))),et(),T}finally{_&&clearTimeout(_),W&&n?.signal&&n.signal.removeEventListener("abort",W),O();}}function Rn(e,r,s={}){if(ae(),!oe[e]){let I=Object.keys(oe).join(", ")||"(none)";throw new Error(`[Directive MultiAgent] Unknown agent "${e}". Registered agents: ${I}`)}let o=1e4,c=1e5,d=new AbortController,g=[],h=[],C=false,O=Date.now(),M=0,_="",W;s.signal&&(W=()=>d.abort(),s.signal.addEventListener("abort",W,{once:true}));let T=()=>{W&&s.signal&&s.signal.removeEventListener("abort",W);},D=I=>{if(C)return;let j=h.shift();j?j(I):(g.length>=o&&g.shift(),g.push(I));},Z=()=>{C=true,T();for(let I of h)I(null);h.length=0;},H=(async()=>{D({type:"progress",phase:"starting",message:"Running input guardrails"});try{let I=await $e(e,r,{signal:d.signal,onMessage:m=>{if(D({type:"message",message:m}),m.role==="assistant"&&m.content){let P=Math.ceil(m.content.length/4);M+=P,_+=m.content,_.length>c&&(_=_.slice(-c)),D({type:"token",data:m.content,tokenCount:M});}},onToolCall:async m=>{D({type:"tool_start",tool:m.name,toolCallId:m.id,arguments:m.arguments}),m.result&&D({type:"tool_end",tool:m.name,toolCallId:m.id,result:m.result});}}),j=Date.now()-O;return D({type:"done",totalTokens:I.totalTokens,duration:j,droppedTokens:0}),Z(),I}catch(I){throw I instanceof tt&&D({type:"guardrail_triggered",guardrailName:I.guardrailName,reason:I.message,partialOutput:_,stopped:true}),D({type:"error",error:I instanceof Error?I:new Error(String(I))}),Z(),I}})(),se={[Symbol.asyncIterator](){return {async next(){return g.length>0?{done:false,value:g.shift()}:C?{done:true,value:void 0}:new Promise(I=>{h.push(j=>{I(j===null?{done:true,value:void 0}:{done:false,value:j});});})}}}};return H.catch(()=>{}),{stream:se,result:H,abort:()=>{d.abort(),Z();}}}async function nr(e,r,s){let n=Date.now();s&&ee("onPatternStart",{patternId:s,patternType:"parallel",input:r,timestamp:n});let o=new AbortController,c;e.timeout&&(c=setTimeout(()=>o.abort(),e.timeout));let d;try{let g=e.agents.map(O=>$e(O,r,{signal:o.signal}).catch(M=>{if(e.minSuccess===void 0)throw M;return null})),h=await Promise.all(g),C=h.filter(O=>O!==null);if(e.minSuccess!==void 0&&C.length<e.minSuccess){let O=h.length-C.length;throw new Error(`[Directive MultiAgent] Parallel pattern: Only ${C.length}/${e.agents.length} agents succeeded (minimum required: ${e.minSuccess}, failed: ${O})`)}return e.merge(C)}catch(g){throw d=g instanceof Error?g:new Error(String(g)),g}finally{c&&clearTimeout(c),s&&ee("onPatternComplete",{patternId:s,patternType:"parallel",durationMs:Date.now()-n,timestamp:Date.now(),error:d});}}async function Bt(e,r,s){let n=Xn(e);if(s?.when)try{if(!s.when({step:n,patternType:e.type,facts:e.type==="goal"?e.facts:void 0,satisfaction:e.type==="goal"?e.lastSatisfaction:void 0}))return null}catch{return null}try{let o={version:1,id:e.id,createdAt:e.createdAt,label:e.label,systemExport:JSON.stringify(e),timelineExport:null,localState:{type:"multi",globalTokenCount:0,globalStatus:"idle",agentStates:{},handoffCounter:0,pendingHandoffs:[],handoffResults:[],roundRobinCounters:null},memoryExport:null,orchestratorType:"multi",metadata:{patternType:e.type}};return await r.save(o),x&&x.record({type:"checkpoint_save",timestamp:Date.now(),snapshotId:null,checkpointId:e.id,patternType:e.type,step:n}),ee("onCheckpointSave",{checkpointId:e.id,patternType:e.type,step:n,timestamp:Date.now()}),e.id}catch(o){let c=o instanceof Error?o:new Error(String(o));return console.error(`[Directive MultiAgent] ${e.type}: checkpoint save failed:`,c),ee("onCheckpointError",{patternType:e.type,step:n,error:c,timestamp:Date.now()}),null}}async function Tn(e,r,s,n){let o=Date.now(),c=s??"__inline_sequential";s&&ee("onPatternStart",{patternId:s,patternType:"sequential",input:r,timestamp:o});let d=e.checkpoint,g=d?.store??ce,h=d?.everyN??5,C=d?.labelPrefix??"sequential",O=n?.currentInput??r,M,_=n?.results?[...n.results]:[],W=n?.step??0,T;if(n&&_.length>0){let D=_[_.length-1];M={output:D.output,totalTokens:D.totalTokens,messages:[],toolCalls:[]};}try{for(let D=W;D<e.agents.length;D++){let Z=e.agents[D];{let H=await Gt("pre_pattern_step",Z,oe[Z]?.agent.name??Z,O,void 0,{patternId:s});if(H.skip)continue;O=H.input;}try{if(M=await $e(Z,O),_.push({agentId:Z,output:M.output,totalTokens:M.totalTokens}),D<e.agents.length-1&&(e.transform?O=e.transform(M.output,Z,D):O=typeof M.output=="string"?M.output:Kt(M.output)),d&&g&&D>W&&(D-W)%h===0){let H=D<e.agents.length-1?O:r;await Bt({type:"sequential",version:1,id:mt(),createdAt:new Date().toISOString(),label:`${C}:step-${D+1}`,patternId:c,stepsTotal:e.agents.length,step:D+1,currentInput:H,results:[..._]},g,d);}}catch(H){if(!e.continueOnError)throw H}}if(!M)throw new Error("[Directive MultiAgent] No successful results in sequential pattern");return e.extract?e.extract(M.output):M.output}catch(D){throw T=D instanceof Error?D:new Error(String(D)),D}finally{s&&ee("onPatternComplete",{patternId:s,patternType:"sequential",durationMs:Date.now()-o,timestamp:Date.now(),error:T});}}async function Sn(e,r,s,n){let o=Date.now(),c=s??"__inline_supervisor";s&&ee("onPatternStart",{patternId:s,patternType:"supervisor",input:r,timestamp:o});let d=e.checkpoint,g=d?.store??ce,h=d?.everyN??5,C=d?.labelPrefix??"supervisor",O=[],M=n?.workerResults?[...n.workerResults]:[],_=e.maxRounds??5;if(_<1||!Number.isFinite(_))throw new Error("[Directive MultiAgent] supervisor maxRounds must be >= 1");let W;if(n)for(let D of n.workerResults)O.push({output:D.output,totalTokens:D.totalTokens,messages:[],toolCalls:[]});let T=n?.round??0;try{let D;n?D={output:n.supervisorOutput,totalTokens:0,messages:[],toolCalls:[]}:D=await $e(e.supervisor,r);let Z=n?.currentInput??r;for(let H=T;H<_;H++){let se=D.output,I;if(typeof se=="string")try{I=JSON.parse(se);}catch{throw new Error(`[Directive MultiAgent] Supervisor "${e.supervisor}" returned unparseable output (round ${H+1}). Expected JSON with { action, worker?, workerInput? } but got: ${se.slice(0,200)}`)}else if(se&&typeof se=="object"&&"action"in se)I=se;else throw new Error(`[Directive MultiAgent] Supervisor "${e.supervisor}" returned invalid output (round ${H+1}). Expected { action: "delegate"|"complete", worker?, workerInput? }`);if(I.action==="complete"||!I.worker)break;if(!e.workers.includes(I.worker)){let m=e.workers.join(", ");throw new Error(`[Directive MultiAgent] Supervisor delegated to unknown worker "${I.worker}". Available workers: ${m}`)}let j=await $e(I.worker,I.workerInput??"");O.push(j),M.push({output:j.output,totalTokens:j.totalTokens}),Z=`Worker ${I.worker} completed with result: ${Kt(j.output)}`,D=await $e(e.supervisor,Z),d&&g&&H>T&&(H-T)%h===0&&await Bt({type:"supervisor",version:1,id:mt(),createdAt:new Date().toISOString(),label:`${C}:round-${H+1}`,patternId:c,stepsTotal:e.maxRounds??10,round:H+1,supervisorOutput:D.output,workerResults:[...M],currentInput:Z},g,d);}return e.extract?e.extract(D.output,O):D.output}catch(D){throw W=D instanceof Error?D:new Error(String(D)),D}finally{s&&ee("onPatternComplete",{patternId:s,patternType:"supervisor",durationMs:Date.now()-o,timestamp:Date.now(),error:W});}}async function En(e,r,s,n){let o=Date.now(),c=s??"__inline_dag";s&&ee("onPatternStart",{patternId:s,patternType:"dag",input:r,timestamp:o});let d=e.checkpoint,g=d?.store??ce,h=d?.everyN??5,C=d?.labelPrefix??"dag",O=n?.completedCount??0,M=0,_=Promise.resolve(),W=Object.keys(e.nodes).length,T={input:n?.input??r,outputs:Object.create(null),statuses:Object.create(null),errors:Object.create(null),results:Object.create(null)};for(let m of Object.keys(e.nodes))T.statuses[m]="pending";if(n){for(let[m,P]of Object.entries(n.statuses))T.statuses[m]=P;for(let[m,P]of Object.entries(n.outputs))T.outputs[m]=P;for(let[m,P]of Object.entries(n.errors))T.errors[m]=P;for(let[m,P]of Object.entries(n.nodeResults))T.results[m]={output:P.output,totalTokens:P.totalTokens,messages:[],toolCalls:[]};}let D=e.onNodeError??"fail",Z=e.maxConcurrent??1/0,H=new AbortController,se,I;e.timeout&&(se=setTimeout(()=>H.abort(),e.timeout));try{let re=function(){for(let[B,y]of Object.entries(e.nodes)){if(T.statuses[B]!=="pending")continue;let w=D==="fail"?new Set(["completed","skipped"]):new Set(["completed","skipped","error"]);if((y.deps??[]).every(me=>w.has(T.statuses[me]))){if(D==="skip-downstream"&&(y.deps??[]).some(F=>T.statuses[F]==="error"||T.statuses[F]==="skipped")){T.statuses[B]="skipped",x&&x.record({type:"dag_node_update",timestamp:Date.now(),snapshotId:null,nodeId:B,status:"skipped",deps:y.deps??[]}),ee("onDagNodeSkipped",{patternId:c,nodeId:B,agentId:y.agent,reason:"upstream dependency errored",timestamp:Date.now()});continue}if(y.when)try{if(!y.when(T)){T.statuses[B]="skipped",x&&x.record({type:"dag_node_update",timestamp:Date.now(),snapshotId:null,nodeId:B,status:"skipped",deps:y.deps??[]}),ee("onDagNodeSkipped",{patternId:c,nodeId:B,agentId:y.agent,reason:"when() returned false",timestamp:Date.now()});continue}}catch{T.statuses[B]="skipped";continue}T.statuses[B]="ready";}}};var j=re;if(!n)for(let[B,y]of Object.entries(e.nodes))(!y.deps||y.deps.length===0)&&(T.statuses[B]="ready");let m=new Set,P=0;async function te(B,y){let w=Date.now();T.statuses[B]="running",x&&x.record({type:"dag_node_update",timestamp:w,snapshotId:null,nodeId:B,status:"running",deps:y.deps??[]}),ee("onDagNodeStart",{patternId:c,nodeId:B,agentId:y.agent,timestamp:w});let L;if(y.transform)L=y.transform(T);else if(y.deps&&y.deps.length>0){let he=Object.create(null);for(let ve of y.deps)T.outputs[ve]!==void 0&&(he[ve]=T.outputs[ve]);L=JSON.stringify(he);}else L=r;let me=new AbortController,F;y.timeout&&(F=setTimeout(()=>me.abort(),y.timeout));let Ie=()=>me.abort();H.signal.addEventListener("abort",Ie,{once:!0});try{let he=await $e(y.agent,L,{signal:me.signal});if(T.outputs[B]=he.output,T.results[B]=he,T.statuses[B]="completed",x&&x.record({type:"dag_node_update",timestamp:Date.now(),snapshotId:null,nodeId:B,status:"completed",deps:y.deps??[]}),ee("onDagNodeComplete",{patternId:c,nodeId:B,agentId:y.agent,durationMs:Date.now()-w,timestamp:Date.now()}),O++,d&&g&&O>M&&O-M>=h){M=O;let ve=Object.create(null);for(let[De,Dt]of Object.entries(T.results))ve[De]={output:Dt.output,totalTokens:Dt.totalTokens};let St={type:"dag",version:1,id:mt(),createdAt:new Date().toISOString(),label:`${C}:node-${O}`,patternId:c,stepsTotal:W,statuses:{...T.statuses},outputs:{...T.outputs},errors:{...T.errors},completedCount:O,nodeResults:ve,input:T.input};_=_.then(()=>Bt(St,g,d)),await _;}}catch(he){if(T.statuses[B]="error",T.errors[B]=he instanceof Error?he.message:String(he),x&&x.record({type:"dag_node_update",timestamp:Date.now(),snapshotId:null,nodeId:B,status:"error",deps:y.deps??[]}),ee("onDagNodeError",{patternId:c,nodeId:B,agentId:y.agent,error:he instanceof Error?he:new Error(String(he)),durationMs:Date.now()-w,timestamp:Date.now()}),D==="fail")throw H.abort(),he}finally{F&&clearTimeout(F),H.signal.removeEventListener("abort",Ie),P--;}}for(;!H.signal.aborted;){re();let B=Object.entries(e.nodes).filter(([w])=>T.statuses[w]==="ready").sort(([,w],[,L])=>(L.priority??0)-(w.priority??0));for(let[w,L]of B){if(P>=Z)break;P++;let me=te(w,L).finally(()=>{m.delete(me);});m.add(me);}if(!Object.values(T.statuses).some(w=>w==="pending"||w==="running"||w==="ready"))break;if(m.size>0)await Promise.race(m);else break}return m.size>0&&await Promise.allSettled(m),await e.merge(T)}catch(m){throw I=m instanceof Error?m:new Error(String(m)),m}finally{se&&clearTimeout(se),s&&ee("onPatternComplete",{patternId:s,patternType:"dag",durationMs:Date.now()-o,timestamp:Date.now(),error:I});}}async function ln(e,r,s,n){let o=Date.now(),c=s??"__inline_reflect",d=e.maxIterations??2;if(d<1)throw new Error("[Directive MultiAgent] Reflect pattern maxIterations must be >= 1");ue&&d>3&&console.warn("[Directive MultiAgent] Reflection loops > 3 iterations rarely improve quality. Consider reducing maxIterations.");let g=e.signal,h,C;if(e.timeout&&!g){let m=new AbortController;h=setTimeout(()=>m.abort(),e.timeout),g=m.signal;}else if(e.timeout&&g){let m=new AbortController;h=setTimeout(()=>m.abort(),e.timeout),C=()=>m.abort(),g.addEventListener("abort",C,{once:true}),g=m.signal;}let O=e.parseEvaluation??(m=>{if(typeof m=="string")try{return JSON.parse(m)}catch{return {passed:false,feedback:`Evaluator returned unparseable output: ${m.slice(0,200)}`}}return m&&typeof m=="object"&&"passed"in m?m:{passed:false,feedback:"Evaluator returned invalid format"}}),M=e.buildRetryInput??((m,P,re)=>`${m}
|
|
33
|
+
|
|
34
|
+
Feedback on your previous response:
|
|
35
|
+
${P}
|
|
36
|
+
|
|
37
|
+
Please improve your response.`);s&&ee("onPatternStart",{patternId:c,patternType:"reflect",input:r,timestamp:o});let _=e.checkpoint,W=_?.store??ce,T=_?.everyN??5,D=_?.labelPrefix??"reflect",Z,H,se=n?.history?[...n.history]:[],I=n?.producerOutputs?[...n.producerOutputs]:[],j=n?.iteration??0;n?.lastProducerOutput!=null&&(H={output:n.lastProducerOutput,totalTokens:0,messages:[],toolCalls:[]});try{let m=n?.effectiveInput??r;for(let P=j;P<d;P++){if(g?.aborted){if(H)return be=se,e.extract?e.extract(H.output):H.output;throw new DOMException("Reflect pattern aborted","AbortError")}let re=Date.now(),te=await $e(e.agent,m,{signal:g});H=te;let B=typeof te.output=="string"?te.output:Kt(te.output);if(g?.aborted)return be=se,e.extract?e.extract(te.output):te.output;let y=await $e(e.evaluator,B,{signal:g}),w;try{w=O(y.output);}catch(F){w={passed:!1,feedback:`Evaluation parse error: ${F instanceof Error?F.message:String(F)}`};}if(!w.passed&&e.threshold!=null&&w.score!=null){let F=typeof e.threshold=="function"?e.threshold(P):e.threshold;w.score>=F&&(w={...w,passed:!0});}let L=Date.now()-re;I.push({output:te.output,score:w.score});let me={iteration:P,passed:w.passed,score:w.score,feedback:w.feedback,durationMs:L,producerTokens:te.totalTokens??0,evaluatorTokens:y.totalTokens??0};if(se.push(me),e.onIteration)try{e.onIteration(me);}catch(F){ue&&console.warn("[Directive MultiAgent] onIteration callback threw:",F);}if(x&&x.record({type:"reflection_iteration",timestamp:Date.now(),snapshotId:null,iteration:P,passed:w.passed,score:w.score,durationMs:L,producerTokens:te.totalTokens,evaluatorTokens:y.totalTokens}),w.passed)return be=se,e.extract?e.extract(te.output):te.output;if(P<d-1&&w.feedback)try{m=M(r,w.feedback,P);}catch(F){ue&&console.warn("[Directive MultiAgent] buildRetryInput threw, using default format:",F),m=`${r}
|
|
38
|
+
|
|
39
|
+
Feedback on your previous response:
|
|
40
|
+
${w.feedback}
|
|
41
|
+
|
|
42
|
+
Please improve your response.`;}_&&W&&P>=j&&(P-j+1)%T===0&&await Bt({type:"reflect",version:1,id:mt(),createdAt:new Date().toISOString(),label:`${D}:iter-${P+1}`,patternId:c,stepsTotal:d,iteration:P+1,effectiveInput:m,history:[...se],producerOutputs:[...I],lastProducerOutput:te.output},W,_);}if(be=se,e.onExhausted==="throw")throw new yn({iterations:d,history:se.map(P=>({passed:P.passed,feedback:P.feedback,score:P.score})),lastResult:H,totalTokens:H.totalTokens??0});if(e.onExhausted==="accept-best"&&I.length>0){!I.some(y=>y.score!=null)&&ue&&console.warn("[Directive MultiAgent] accept-best exhaustion strategy used but no iterations returned scores. Falling back to last output.");let re=I.length-1,te=-1/0;for(let y=0;y<I.length;y++){let w=I[y].score;w!=null&&w>te&&(te=w,re=y);}let B=I[re].output;return e.extract?e.extract(B):B}return e.extract?e.extract(H.output):H.output}catch(m){throw be=se,Z=m instanceof Error?m:new Error(String(m)),m}finally{h&&clearTimeout(h),C&&e.signal&&e.signal.removeEventListener("abort",C),s&&ee("onPatternComplete",{patternId:c,patternType:"reflect",durationMs:Date.now()-o,timestamp:Date.now(),error:Z});}}async function In(e,r,s){if(e.agents.length===0)throw new Error("[Directive MultiAgent] Race pattern requires at least one agent");let n=e.minSuccess??1;if(!Number.isInteger(n)||n<1)throw new Error("[Directive MultiAgent] Race pattern minSuccess must be a positive integer");if(n>e.agents.length)throw new Error(`[Directive MultiAgent] Race pattern minSuccess (${n}) exceeds agent count (${e.agents.length})`);for(let _ of e.agents)if(!oe[_])throw new Error(`[Directive MultiAgent] Race: unknown agent "${_}"`);let o=Date.now(),c=s??"__inline_race",d=new AbortController,g,h;e.signal&&(e.signal.aborted?d.abort():(h=()=>d.abort(),e.signal.addEventListener("abort",h,{once:true}))),s&&ee("onPatternStart",{patternId:c,patternType:"race",input:r,timestamp:o}),x&&x.record({type:"race_start",timestamp:o,snapshotId:null,patternId:c,agents:e.agents}),e.timeout&&(g=setTimeout(()=>d.abort(),e.timeout));let C,O=Object.create(null),M=[...e.agents];try{let _=e.agents.map(P=>({agentId:P,promise:$e(P,r,{signal:d.signal}).then(re=>({agentId:P,result:re}))})),W=_.map(P=>P.promise.catch(()=>{})),T=[],D=await new Promise((P,re)=>{let te=0,B=!1;for(let y of _)y.promise.then(w=>{te++,!B&&(T.push(w),T.length>=n&&(B=!0,d.abort(),P([...T])));}).catch(w=>{if(O[y.agentId]=w instanceof Error?w.message:String(w),te++,B)return;let L=Object.keys(O).length,me=T.length+(_.length-te);te===_.length&&L===_.length?(B=!0,re(new Error(`[Directive MultiAgent] Race: all ${_.length} agents failed.
|
|
43
|
+
`+Object.entries(O).map(([F,Ie])=>` - ${F}: ${Ie}`).join(`
|
|
44
|
+
`)))):me<n&&(B=!0,re(new Error(`[Directive MultiAgent] Race: cannot reach minSuccess (${n}). ${L} agent(s) failed.
|
|
45
|
+
`+Object.entries(O).map(([F,Ie])=>` - ${F}: ${Ie}`).join(`
|
|
46
|
+
`))));});});await Promise.all(W).catch(()=>{});let Z=D[0],H=Z.agentId,se=new Set(D.map(P=>P.agentId)),I=M.filter(P=>!se.has(P)&&!(P in O));x&&(x.record({type:"race_winner",timestamp:Date.now(),snapshotId:null,patternId:c,winnerId:H,durationMs:Date.now()-o}),I.length>0&&x.record({type:"race_cancelled",timestamp:Date.now(),snapshotId:null,patternId:c,cancelledIds:I,reason:"winner_found"}));let j=e.extract?e.extract(Z.result):Z.result.output,m=n>1?D.map(P=>({agentId:P.agentId,result:e.extract?e.extract(P.result):P.result.output})):void 0;return {winnerId:H,result:j,allResults:m}}catch(_){throw C=_ instanceof Error?_:new Error(String(_)),x&&x.record({type:"race_cancelled",timestamp:Date.now(),snapshotId:null,patternId:c,cancelledIds:M,reason:d.signal.aborted?"timeout":"all_failed"}),_}finally{g&&clearTimeout(g),h&&e.signal&&e.signal.removeEventListener("abort",h),s&&ee("onPatternComplete",{patternId:c,patternType:"race",durationMs:Date.now()-o,timestamp:Date.now(),error:C});}}async function cn(e,r,s,n){let{agents:o,evaluator:c,maxRounds:d=2,extract:g,parseJudgement:h}=e;if(o.length<2)throw new Error("[Directive MultiAgent] debate requires at least 2 agents");if(d<1||!Number.isFinite(d))throw new Error("[Directive MultiAgent] debate maxRounds must be >= 1");let C=e.signal,O,M;if(e.timeout&&!C){let w=new AbortController;O=setTimeout(()=>w.abort(),e.timeout),C=w.signal;}else if(e.timeout&&C){let w=new AbortController;O=setTimeout(()=>w.abort(),e.timeout),M=()=>w.abort(),C.addEventListener("abort",M,{once:true}),C=w.signal;}let W=h??(w=>{if(typeof w=="string")try{let L=JSON.parse(w);return L&&typeof L=="object"&&typeof L.winnerId=="string"?L:(ue&&console.warn("[Directive MultiAgent] defaultParseJudgement: parsed JSON missing winnerId, falling back to first agent"),{winnerId:o[0]})}catch{return ue&&console.warn("[Directive MultiAgent] defaultParseJudgement: output is not valid JSON, falling back to first agent"),{winnerId:o[0]}}return w&&typeof w=="object"&&"winnerId"in w&&typeof w.winnerId=="string"?w:(ue&&console.warn("[Directive MultiAgent] defaultParseJudgement: unrecognized output format, falling back to first agent"),{winnerId:o[0]})}),T=n?.rounds?[...n.rounds]:[],D=n?.currentInput??r,Z=n?.lastWinnerId??o[0],H=n?.lastWinnerOutput??void 0,se=n?.round??0,I=e.checkpoint,j=I?.store??ce,m=I?.everyN??5,P=I?.labelPrefix??"debate",re=s??"__inline_debate",te=Date.now(),B=n?.tokensConsumed??0;s&&ee("onPatternStart",{patternId:re,patternType:"debate",input:r,timestamp:te});let y;try{for(let L=se;L<d&&!C?.aborted;L++){let me=o.map(async De=>{let Dt=await $e(De,D,{signal:C});return B+=Dt.totalTokens,{agentId:De,output:Dt.output}}),F=await Promise.all(me);if(C?.aborted)break;let Ie=JSON.stringify({round:L+1,totalRounds:d,proposals:F.map(De=>({agentId:De.agentId,proposal:De.output}))}),he=await $e(c,Ie,{signal:C});B+=he.totalTokens;let ve=W(he.output);if(o.includes(ve.winnerId)||(ve.winnerId=o[0]),T.push({proposals:F,judgement:ve}),x&&x.record({type:"debate_round",timestamp:Date.now(),snapshotId:null,patternId:re,round:L+1,totalRounds:d,winnerId:ve.winnerId,score:ve.score,agentCount:o.length}),Z=ve.winnerId,H=F.find(De=>De.agentId===ve.winnerId)?.output??F[0].output,I&&j&&L>se&&(L-se)%m===0){let De={type:"debate",version:1,id:mt(),createdAt:new Date().toISOString(),label:`${P}:round-${L+1}`,patternId:re,stepsTotal:d,round:L+1,currentInput:D,rounds:[...T],lastWinnerId:Z,lastWinnerOutput:H,tokensConsumed:B};await Bt(De,j,I);}L<d-1&&ve.feedback&&(D=`Previous round feedback: ${ve.feedback}
|
|
47
|
+
|
|
48
|
+
Original task: ${r}`);}if(T.length===0)throw new Error("[Directive MultiAgent] Debate aborted before any round completed");let w=g?g(H):H;return {winnerId:Z,result:w,rounds:T}}catch(w){throw y=w instanceof Error?w:new Error(String(w)),w}finally{O&&clearTimeout(O),M&&e.signal&&e.signal.removeEventListener("abort",M),s&&ee("onPatternComplete",{patternId:re,patternType:"debate",durationMs:Date.now()-te,timestamp:Date.now(),error:y});}}let rr=new Set(["__proto__","constructor","prototype","toString","valueOf","hasOwnProperty"]);function Lt(e,r){for(let s of Object.keys(r))rr.has(s)||(e[s]=r[s]);}function or(e,r){let s=Object.create(null);for(let[h,C]of Object.entries(r))for(let O of C.produces)s[O]||(s[O]=[]),s[O].push(h);let n=Object.keys(r),o=Object.create(null),c=Object.create(null);for(let h of n)o[h]=0,c[h]=[];for(let[h,C]of Object.entries(r))for(let O of C.requires??[]){let M=s[O];if(M)for(let _ of M)_!==h&&(c[_].push(h),o[h]=(o[h]??0)+1);}let d=[];for(let h of n)o[h]===0&&d.push(h);let g=0;for(;d.length>0;){let h=d.shift();g++;for(let C of c[h]??[])o[C]--,o[C]===0&&d.push(C);}if(g!==n.length)throw new Error(`[Directive MultiAgent] goal pattern "${e}": cycle detected in produces/requires graph. Visited ${g}/${n.length} nodes.`)}function ar(e,r){let s=Object.create(null);for(let[n,o]of Object.entries(r))for(let c of o.produces)s[c]||(s[c]=[]),s[c].push(n);for(let[n,o]of Object.entries(s))o.length>1&&console.warn(`[Directive MultiAgent] goal pattern "${e}": fact key "${n}" is produced by multiple nodes: ${o.join(", ")}. Last writer wins.`);}function Fe(e,...r){if(e)try{return e(...r)}catch(s){console.error("[Directive MultiAgent] goal: user callback threw:",s);return}}async function sr(e,...r){if(e)try{return await e(...r)}catch(s){console.error("[Directive MultiAgent] goal: user callback threw:",s);return}}function An(e,r,s){let n=r.slice(-3),o=n.length>0?n.reduce((g,h)=>g+h.satisfactionDelta,0)/n.length:0,c=null;o>0&&e<1&&(c=Math.ceil((1-e)/o));let d=false;if(r.length>=6){let g=r.slice(-3),h=r.slice(-6,-3),C=g.reduce((M,_)=>M+_.satisfactionDelta,0)/3,O=h.reduce((M,_)=>M+_.satisfactionDelta,0)/3;d=C<O*.5;}return {satisfaction:e,progressRate:o,estimatedStepsRemaining:c,decelerating:d}}function Zt(e){return e==null||!Number.isFinite(e)?0:Math.max(0,Math.min(1,e))}async function dn(e,r,s,n){let{nodes:o,when:c,satisfaction:d,maxSteps:g=50,extract:h,selectionStrategy:C,relaxation:O,onStep:M,onStall:_}=e,W=Object.create(null);for(let[Se,je]of Object.entries(o))W[Se]={...je};if(Object.keys(W).length===0)throw new Error("[Directive MultiAgent] goal requires at least one node");let D=s??"__goal";for(let[Se,je]of Object.entries(W))if(!oe[je.agent])throw new Error(`[Directive MultiAgent] goal node "${Se}" references unregistered agent "${je.agent}"`);or(D,W),ar(D,W);for(let[Se,je]of Object.entries(W))je.extractOutput||console.warn(`[Directive MultiAgent] goal node "${Se}": no extractOutput defined. Output will be auto-parsed from agent response. Define extractOutput for reliable fact extraction.`);let Z=e.signal,H,se,I=e.timeout??3e5;if(I&&!Z){let Se=new AbortController;H=setTimeout(()=>Se.abort(),I),Z=Se.signal;}else if(I&&Z){let Se=new AbortController;H=setTimeout(()=>Se.abort(),I),se=()=>Se.abort(),Z.addEventListener("abort",se,{once:true}),Z=Se.signal;}let j=Date.now();x&&x.record({type:"pattern_start",timestamp:j,snapshotId:null,patternId:D,patternType:"goal"}),ee("onPatternStart",{patternId:D,patternType:"goal",input:typeof r=="string"?r:JSON.stringify(r),timestamp:j});let m=Object.create(null);n?Lt(m,n.facts):typeof r=="string"?m.input=r:Lt(m,r);let P=n?[...n.executionOrder]:[],re=Object.create(null);if(n)for(let[Se,je]of Object.entries(n.nodeOutputs))re[Se]={output:je.output,totalTokens:je.totalTokens};let te=n?[...n.stepMetrics]:[],B=n?[...n.relaxations]:[],y=new Set(n?.completedNodes??[]),w=new Map(n?Object.entries(n.failedNodes).map(([Se,je])=>[Se,je]):[]),L=new Map(n?Object.entries(n.nodeInputHashes):[]),me=Object.create(null);if(n)for(let[Se,je]of Object.entries(n.agentMetrics))me[Se]={runs:je.runs,avgSatisfactionDelta:je.runs>0?je.totalDelta/je.runs:0,tokens:je.tokens,totalDelta:je.totalDelta};let F=n?.stallSteps??0,Ie=n?.appliedRelaxationTiers??0,he=n?.lastSatisfaction??0,ve,St=n?.step??0,De=e.checkpoint,Dt=De?.everyN??5,$n=De?.store??ce,lr=De?.labelPrefix??"goal",jn,cr=3;try{for(let qe=St;qe<g;qe++){if(Fe(c,m)===!0){let pe=Date.now()-j,le=Object.values(re).reduce((ye,Ge)=>ye+Ge.totalTokens,0);return {achieved:!0,result:Fe(h,m)??m,facts:{...m},executionOrder:P,nodeResults:re,steps:qe,totalTokens:le,durationMs:pe,stepMetrics:te,relaxations:B}}if(Z?.aborted){let pe=Date.now()-j,le=Object.values(re).reduce((ye,Ge)=>ye+Ge.totalTokens,0);return {achieved:!1,result:Fe(h,m)??m,facts:{...m},executionOrder:P,nodeResults:re,steps:qe,totalTokens:le,durationMs:pe,stepMetrics:te,relaxations:B,error:"Aborted or timed out"}}let Ot=[];for(let[pe,le]of Object.entries(W)){if((w.get(pe)??0)>=cr)continue;let ye=le.requires??[];if(ye.every(Ne=>m[Ne]!=null)){if(y.has(pe)){if(!le.allowRerun)continue;let Ne=JSON.stringify(ye.map(He=>m[He]));if(L.get(pe)===Ne)continue}Ot.push(pe);}}let _t=Ot;if(C&&Ot.length>0){let pe=d?Fe(d,m)??0:Fe(c,m)===!0?1:0,le=Zt(pe),ye=An(le,te,qe),Ge=Object.create(null);for(let[He,we]of Object.entries(me))Ge[He]={runs:we.runs,avgSatisfactionDelta:we.runs>0?we.totalDelta/we.runs:0,tokens:we.tokens};let Ne=C.select(Ot,Ge,ye);_t=Ne&&Ne.length>0?Ne:Ot;}if(_t.sort((pe,le)=>(W[le].priority??0)-(W[pe].priority??0)),Fe(M,qe,{...m},_t),_t.length===0){F++;let pe=!1;if(O)for(let le=Ie;le<O.length;le++){let ye=O[le],Ge=ye.afterStallSteps??3;if(F>=Ge){let Ne=ye.strategy;switch(Ne.type){case "allow_rerun":for(let He of Ne.nodes)y.delete(He),L.delete(He);break;case "alternative_nodes":for(let He of Ne.nodes){let we=`__relaxation_${le}_${He.agent}`;W[we]={...He};}break;case "inject_facts":Lt(m,Ne.facts);break;case "accept_partial":{let He=Date.now()-j,we=Object.values(re).reduce((Be,ft)=>Be+ft.totalTokens,0);return {achieved:!1,result:Fe(h,m)??m,facts:{...m},executionOrder:P,nodeResults:re,steps:qe,totalTokens:we,durationMs:He,stepMetrics:te,relaxations:B,error:`Accepted partial result via relaxation tier "${ye.label}"`}}case "custom":{let He=Fe(d,m)??0,we={step:qe,facts:{...m},metrics:An(Zt(He),te,qe),completedNodes:new Set(y),failedNodes:new Map(w)};await sr(Ne.apply,we);break}}B.push({step:qe,tierIndex:le,label:ye.label,strategy:Ne.type}),Ie=le+1,F=0,pe=!0;break}}if(!pe){let le=Fe(d,m)??0,ye=An(Zt(le),te,qe);if(Fe(_,qe,ye),!O||Ie>=O.length){let Ge=Date.now()-j,Ne=Object.values(re).reduce((He,we)=>He+we.totalTokens,0);return {achieved:!1,result:Fe(h,m)??m,facts:{...m},executionOrder:P,nodeResults:re,steps:qe,totalTokens:Ne,durationMs:Ge,stepMetrics:te,relaxations:B,error:"Goal stalled: no ready nodes and no remaining relaxation tiers"}}}continue}F=0;let dr=Date.now(),pr=d?Fe(d,m)??0:Fe(c,m)===!0?1:0,gr=Zt(pr),qn=0,Ft=[],fr=_t.map(async pe=>{let le=W[pe],ye=le.requires??[],Ge=JSON.stringify(ye.map(we=>m[we]));L.set(pe,Ge);let Ne,He=Fe(le.buildInput,m);if(He!=null)Ne=He;else {let we=Object.create(null);for(let Be of ye)m[Be]!=null&&(we[Be]=m[Be]);Object.keys(we).length>0?Ne=JSON.stringify(we):m.input!=null?Ne=String(m.input):Ne=JSON.stringify(m);}try{let we=await $e(le.agent,Ne,{signal:Z??void 0});if(re[pe]=we,P.push(pe),y.add(pe),w.delete(pe),le.extractOutput){let Be=Fe(le.extractOutput,we);Be&&(Lt(m,Be),Ft.push(...Object.keys(Be)));}else {let Be=we.output;if(Be&&typeof Be=="object")Lt(m,Be),Ft.push(...Object.keys(Be));else if(typeof Be=="string")try{let ft=JSON.parse(Be);if(ft&&typeof ft=="object"&&!Array.isArray(ft))Lt(m,ft),Ft.push(...Object.keys(ft));else for(let Gn of le.produces)m[Gn]=Be,Ft.push(Gn);}catch{for(let ft of le.produces)m[ft]=Be,Ft.push(ft);}}return qn+=we.totalTokens,{nodeId:pe,success:!0}}catch(we){let Be=(w.get(pe)??0)+1;return w.set(pe,Be),{nodeId:pe,success:!1,error:we}}});await Promise.allSettled(fr);let mr=d?Fe(d,m)??0:Fe(c,m)===!0?1:0,xn=Zt(mr),Cn=xn-gr;te.push({step:qe,durationMs:Date.now()-dr,nodesRun:[..._t],factsProduced:Ft,satisfaction:xn,satisfactionDelta:Cn,tokensConsumed:qn});for(let pe of _t){let le=W[pe];me[le.agent]||(me[le.agent]={runs:0,avgSatisfactionDelta:0,tokens:0,totalDelta:0});let ye=me[le.agent];ye.runs++,ye.totalDelta+=Cn,ye.tokens+=re[pe]?.totalTokens??0;}if(he=xn,Cn<=0?F++:F=0,De&&$n&&qe>St&&(qe-St)%Dt===0){let pe={type:"goal",version:1,id:mt(),createdAt:new Date().toISOString(),label:`${lr}:step-${qe}`,patternId:D,stepsTotal:g,step:qe+1,facts:structuredClone(m),completedNodes:[...y],failedNodes:Object.fromEntries(w),nodeInputHashes:Object.fromEntries(L),nodeOutputs:Object.fromEntries(Object.entries(re).map(([ye,Ge])=>[ye,{output:Ge.output,totalTokens:Ge.totalTokens}])),executionOrder:[...P],stepMetrics:[...te],relaxations:[...B],appliedRelaxationTiers:Ie,stallSteps:F,lastSatisfaction:he,agentMetrics:Object.fromEntries(Object.entries(me).map(([ye,Ge])=>[ye,{runs:Ge.runs,totalDelta:Ge.totalDelta,tokens:Ge.tokens}]))},le=await Bt(pe,$n,De);le&&(jn=le);}}let Se=Date.now()-j,je=Object.values(re).reduce((qe,Ot)=>qe+Ot.totalTokens,0);return {achieved:!1,result:Fe(h,m)??m,facts:{...m},executionOrder:P,nodeResults:re,steps:g,totalTokens:je,durationMs:Se,stepMetrics:te,relaxations:B,error:`Max steps (${g}) exhausted without achieving goal`}}catch(Se){throw ve=Se instanceof Error?Se:new Error(String(Se)),Se}finally{H!=null&&clearTimeout(H),se&&e.signal&&e.signal.removeEventListener("abort",se),x&&x.record({type:"pattern_complete",timestamp:Date.now(),snapshotId:null,patternId:D,patternType:"goal",durationMs:Date.now()-j,...ve?{error:ve.message}:{}}),ee("onPatternComplete",{patternId:D,patternType:"goal",durationMs:Date.now()-j,timestamp:Date.now(),error:ve});}}function ir(e){if(!Te)return [];let r=[],s=new Set;if(s.add(e),Te.equivalencyGroups){for(let n of Object.values(Te.equivalencyGroups))if(n.includes(e))for(let o of n)!s.has(o)&&oe[o]&&(r.push(o),s.add(o));}if(Te.useCapabilities!==false){let n=oe[e];if(n?.capabilities&&n.capabilities.length>0)for(let[o,c]of Object.entries(oe)){if(s.has(o))continue;let d=c.capabilities??[];n.capabilities.every(g=>d.includes(g))&&(r.push(o),s.add(o));}}if(Xe){let n=Te.healthThreshold??30;return r.filter(o=>Xe.getHealthScore(o)>n)}return r}function ur(e){if(e.length===0)return null;if(!Te||!Xe)return e[0]??null;if(Te.selectionStrategy==="round-robin"&&at){let n=[...e].sort().join(","),o=at.get(n)??0,c=e[o%e.length];return at.set(n,o+1),c}let r=e[0],s=Xe.getHealthScore(r);for(let n=1;n<e.length;n++){let o=Xe.getHealthScore(e[n]);o>s&&(r=e[n],s=o);}return r}let Nn={system:l,get facts(){return l.facts},get timeline(){return x},get healthMonitor(){return Xe},get derived(){return Object.freeze({...ne})},onDerivedChange(e){return Ae.add(e),()=>{Ae.delete(e);}},get scratchpad(){return kt},runAgent:$e,runAgentStream:Rn,async runPattern(e,r){ae();let s=a[e];if(!s){let c=Object.keys(a).join(", ")||"(none)";throw new Error(`[Directive MultiAgent] Unknown pattern "${e}". Available patterns: ${c}`)}let n=Date.now();x&&x.record({type:"pattern_start",timestamp:n,snapshotId:null,patternId:e,patternType:s.type});let o;try{switch(s.type){case "parallel":return await nr(s,r,e);case "sequential":return await Tn(s,r,e);case "supervisor":return await Sn(s,r,e);case "dag":return await En(s,r,e);case "reflect":return await ln(s,r,e);case "race":return (await In(s,r,e)).result;case "debate":return (await cn(s,r,e)).result;case "goal":return (await dn(s,r,e)).result;default:throw new Error(`[Directive MultiAgent] Unknown pattern type: ${s.type}`)}}catch(c){throw o=c instanceof Error?c:new Error(String(c)),c}finally{x&&x.record({type:"pattern_complete",timestamp:Date.now(),snapshotId:null,patternId:e,patternType:s.type,durationMs:Date.now()-n,...o?{error:o.message}:{}});}},async runParallel(e,r,s,n){ae();let o=Array.isArray(r)?r:e.map(()=>r);if(o.length!==e.length)throw new Error(`[Directive MultiAgent] Input count (${o.length}) must match agent count (${e.length})`);let c=new AbortController,d;n?.timeout&&(d=setTimeout(()=>c.abort(),n.timeout));try{let g=e.map((O,M)=>$e(O,o[M],{signal:c.signal}).catch(_=>{if(n?.minSuccess!==void 0)return null;throw _})),h=await Promise.all(g),C=h.filter(O=>O!==null);if(n?.minSuccess!==void 0&&C.length<n.minSuccess){let O=h.length-C.length;throw new Error(`[Directive MultiAgent] runParallel: Only ${C.length}/${e.length} agents succeeded (minimum required: ${n.minSuccess}, failed: ${O})`)}return s(C)}finally{d&&clearTimeout(d);}},async runSequential(e,r,s){ae();let n=[],o=r;for(let c=0;c<e.length;c++){let d=e[c],g=await $e(d,o);n.push(g),c<e.length-1&&(s?.transform?o=s.transform(g.output,d,c):o=typeof g.output=="string"?g.output:Kt(g.output));}return n},async handoff(e,r,s,n){if(ae(),!oe[e]){let d=Object.keys(oe).join(", ")||"(none)";throw new Error(`[Directive MultiAgent] Handoff source agent "${e}" not found. Registered: ${d}`)}if(!oe[r]){let d=Object.keys(oe).join(", ")||"(none)";throw new Error(`[Directive MultiAgent] Handoff target agent "${r}" not found. Registered: ${d}`)}{let d=await Gt("pre_handoff",e,oe[e].agent.name,s,void 0,{handoff:{fromAgent:e,toAgent:r}});if(d.skip)return {output:void 0,messages:[],toolCalls:[],totalTokens:0};s=d.input;}let o={id:`handoff-${++Ce}`,fromAgent:e,toAgent:r,input:s,context:n,requestedAt:Date.now()};We.push(o);try{p?.(o);}catch(d){ue&&console.debug("[Directive MultiAgent] onHandoff threw:",d);}ee("onHandoff",o),x&&x.record({type:"handoff_start",timestamp:Date.now(),snapshotId:null,fromAgent:e,toAgent:r});let c=oe[r].memory??A;if(c&&n)try{let d=Object.entries(n).map(([g,h])=>`${g}: ${Kt(h)}`).join(", ");c.addMessages([{role:"system",content:`[Handoff from ${e}] Context: ${d}`}]);}catch(d){ue&&console.debug("[Directive MultiAgent] Handoff addMessages failed:",d);}try{let d=await $e(r,s),g={request:o,result:d,completedAt:Date.now()};G(g);try{f?.(g);}catch(C){ue&&console.debug("[Directive MultiAgent] onHandoffComplete threw:",C);}ee("onHandoffComplete",g),x&&x.record({type:"handoff_complete",timestamp:Date.now(),snapshotId:null,fromAgent:e,toAgent:r,durationMs:g.completedAt-o.requestedAt});let h=We.indexOf(o);return h>=0&&We.splice(h,1),d}catch(d){let g=We.indexOf(o);throw g>=0&&We.splice(g,1),d}},approve(e){ae();let r=V.get(e);if(r){V.delete(e);let s=Pe(r);l.batch(()=>{let n=it(s),o=200,c=[...n.approved,e];Qe(s,{...n,pending:n.pending.filter(d=>d.id!==e),approved:c.length>o?c.slice(-o):c});});return}ue&&console.debug(`[Directive MultiAgent] approve() ignored: no pending request "${e}"`);},reject(e,r){ae();let s=V.get(e);if(s){V.delete(e);let n=Pe(s);l.batch(()=>{let o=it(n);r&&ue&&console.debug(`[Directive MultiAgent] Request ${e} rejected: ${r}`);let c={id:e,reason:r,rejectedAt:Date.now()},d=200,g=[...o.rejected,c];Qe(n,{...o,pending:o.pending.filter(h=>h.id!==e),rejected:g.length>d?g.slice(-d):g});});return}ue&&console.debug(`[Directive MultiAgent] reject() ignored: no pending request "${e}"`);},pause(){ae(),q="paused",ue&&console.debug("[Directive MultiAgent] Orchestrator paused");},resume(){ae(),q==="paused"&&(q="idle",ue&&console.debug("[Directive MultiAgent] Orchestrator resumed"));},getAgentState(e){let r=fe[e];return r?{...r}:void 0},getAllAgentStates(){return Object.fromEntries(Object.entries(fe).map(([e,r])=>[e,{...r}]))},getPendingHandoffs(){return [...We]},get totalTokens(){return $},waitForIdle(e){let r=()=>de===0&&Object.values(fe).every(s=>s.status==="idle"||s.status==="completed"||s.status==="error");return r()?Promise.resolve():new Promise((s,n)=>{let o=null,c=()=>{_e.delete(d),o&&clearTimeout(o);},d=()=>{r()&&(c(),s());};_e.add(d),e!==void 0&&(o=setTimeout(()=>{c(),n(new Error(`[Directive MultiAgent] waitForIdle timed out after ${e}ms`));},e));})},run(e,r,s){return $e(e,r,s)},runStream(e,r,s){return Rn(e,r,s)},registerAgent(e,r){if(ae(),S.has(e))throw new Error(`[Directive MultiAgent] Agent ID "${e}" is reserved and cannot be used`);if(oe[e])throw new Error(`[Directive MultiAgent] Agent "${e}" is already registered. Unregister first.`);let s=r.constraints?Wt(r.constraints):{},n=Object.create(null);if(r.resolvers)for(let[c,d]of Object.entries(r.resolvers))n[c]={requirement:d.requirement,key:d.key,resolve:async(g,h)=>{let C=Ze(h.facts),M={facts:{...h.facts,...C},runAgent:async(_,W,T)=>t(_,W,T),signal:h.signal};return d.resolve(g,M)}};let o=core.createModule(e,{schema:tn,init:c=>{Je(c,{status:"idle",currentAgent:r.agent.name,input:null,output:null,error:null,tokenUsage:0,turnCount:0,startedAt:null,completedAt:null}),Qe(c,{pending:[],approved:[],rejected:[]}),ct(c,[]),dt(c,[]),rt(c,an());},constraints:s,resolvers:Object.keys(n).length>0?n:void 0});l.registerModule(e,o),oe[e]=r,xe.set(e,new Vt(r.maxConcurrent??1)),fe[e]={status:"idle",runCount:0,totalTokens:0},ue&&console.debug(`[Directive MultiAgent] Registered agent "${e}" (${r.agent.name})`),et();},unregisterAgent(e){if(ae(),!oe[e])throw new Error(`[Directive MultiAgent] Agent "${e}" is not registered`);if(fe[e]?.status==="running")throw new Error(`[Directive MultiAgent] Cannot unregister agent "${e}" while it is running`);for(let[o,c]of Object.entries(a)){let d;switch(c.type){case "supervisor":d=[c.supervisor,...c.workers];break;case "dag":d=Object.values(c.nodes).map(g=>g.agent);break;case "reflect":d=[c.agent,c.evaluator];break;case "parallel":case "sequential":case "race":d=c.agents;break;case "debate":d=[...c.agents,c.evaluator];break;default:d=[];}d.includes(e)&&console.warn(`[Directive MultiAgent] Warning: Pattern "${o}" references unregistered agent "${e}"`);}let s=xe.get(e);s&&(s.drain(),xe.delete(e));let n=Pe(e);n&&l.batch(()=>{Je(n,{status:"idle",currentAgent:null,input:null,output:null,error:null,tokenUsage:0,turnCount:0,startedAt:null,completedAt:null}),Qe(n,{pending:[],approved:[],rejected:[]}),ct(n,[]),dt(n,[]),rt(n,an());}),delete oe[e],delete fe[e],ue&&console.debug(`[Directive MultiAgent] Unregistered agent "${e}"`),et();},getAgentIds(){return Object.keys(oe)},reset(){ae();for(let r of Object.keys(oe)){let s=oe[r]?.maxConcurrent??1;fe[r]={status:"idle",runCount:0,totalTokens:0};let n=xe.get(r);n&&n.drain(),xe.set(r,new Vt(s));let o=Pe(r);l.batch(()=>{Je(o,{status:"idle",currentAgent:oe[r].agent.name,input:null,output:null,error:null,tokenUsage:0,turnCount:0,startedAt:null,completedAt:null}),Qe(o,{pending:[],approved:[],rejected:[]}),ct(o,[]),dt(o,[]),rt(o,an());});}Ye.clear(),gt.clear(),V.clear(),We.length=0,st.length=0,Ce=0,$=0,q="idle",de=0,Q();let e=Pe("__coord");l.batch(()=>{adapterUtils.setBridgeFact(e,"__globalTokens",0),adapterUtils.setBridgeFact(e,"__status","idle"),adapterUtils.setBridgeFact(e,"__handoffs",[]),adapterUtils.setBridgeFact(e,"__handoffResults",[]),adapterUtils.setBridgeFact(e,"__budgetWarningFired",false),ot&&adapterUtils.setBridgeFact(e,ze,{...ot.init});}),Xe&&Xe.reset(),be=null;for(let r of Object.keys(ne))delete ne[r];et();},async checkpoint(e){ae();for(let[s,n]of Object.entries(fe))if(n.status==="running")throw new Error(`[Directive MultiAgent] Cannot checkpoint while agent "${s}" is running`);if(!l.debug?.export)throw new Error("[Directive MultiAgent] Checkpointing requires debug mode. Set `debug: true` in orchestrator options.");let r={version:1,id:mt(),createdAt:new Date().toISOString(),label:e?.label,systemExport:l.debug.export(),timelineExport:x?.export()??null,localState:{type:"multi",globalTokenCount:$,globalStatus:q,agentStates:Object.fromEntries(Object.entries(fe).map(([s,n])=>[s,structuredClone(n)])),handoffCounter:Ce,pendingHandoffs:[...We],handoffResults:[...st],roundRobinCounters:at?Object.fromEntries(at):null},memoryExport:A?A.export?.()??null:null,orchestratorType:"multi"};return ce&&await ce.save(r),r},restore(e,r){if(ae(),!Qt(e))throw new Error("[Directive MultiAgent] Invalid checkpoint data");if(e.orchestratorType!=="multi")throw new Error(`[Directive MultiAgent] Expected multi-agent checkpoint, got "${e.orchestratorType}"`);if(!l.debug?.import)throw new Error("[Directive MultiAgent] Restoring a checkpoint requires debug mode. Set `debug: true` in orchestrator options.");l.debug.import(e.systemExport),r?.restoreTimeline!==false&&e.timelineExport&&x&&x.import(e.timelineExport),e.memoryExport&&A&&A.import&&A.import(e.memoryExport);let s=e.localState;$=s.globalTokenCount,q=s.globalStatus,Ce=s.handoffCounter,We.length=0,We.push(...s.pendingHandoffs),st.length=0,st.push(...s.handoffResults);for(let[n,o]of Object.entries(s.agentStates))fe[n]&&(fe[n]={...o});if(s.roundRobinCounters&&at){at.clear();for(let[n,o]of Object.entries(s.roundRobinCounters))at.set(n,o);}for(let[n,o]of Object.entries(oe)){let c=xe.get(n);c&&c.drain(),xe.set(n,new Vt(o.maxConcurrent??1));}et();},runParallelStream(e,r,s,n){ae();let o=Array.isArray(r)?r:e.map(()=>r);if(o.length!==e.length)throw new Error(`[Directive MultiAgent] Input count (${o.length}) must match agent count (${e.length})`);let c=new AbortController,d;n?.timeout&&(d=setTimeout(()=>c.abort(),n.timeout));let g=e.map((T,D)=>{let Z=Rn(T,o[D],{signal:c.signal});return {agentId:T,streamResult:Z}}),h=g.map(({agentId:T,streamResult:D})=>({agentId:T,stream:D.stream})),{stream:C,getDroppedCount:O}=Vn(h),M;n?.signal&&(M=()=>c.abort(),n.signal.addEventListener("abort",M,{once:true}));let _=Promise.allSettled(g.map(({streamResult:T})=>T.result)).then(T=>{d&&clearTimeout(d),M&&n?.signal&&n.signal.removeEventListener("abort",M);let D=[];for(let Z of T)Z.status==="fulfilled"&&D.push(Z.value);if(n?.minSuccess!==void 0&&D.length<n.minSuccess)throw new Error(`[Directive MultiAgent] runParallelStream: Only ${D.length}/${e.length} agents succeeded (minimum required: ${n.minSuccess})`);return D}),W=_.then(T=>s(T));return _.catch(()=>{}),W.catch(()=>{}),{stream:C,results:_,merge:W,getDroppedCount:O,abort:()=>{c.abort(),M&&n?.signal&&n.signal.removeEventListener("abort",M);for(let{streamResult:T}of g)T.abort();}}},async runRace(e,r,s){ae();let n={type:"race",agents:e,extract:s?.extract,timeout:s?.timeout,minSuccess:s?.minSuccess,signal:s?.signal};return In(n,r,"__imperative_race")},async runReflect(e,r,s,n){ae();let o={type:"reflect",agent:e,evaluator:r,maxIterations:n?.maxIterations,parseEvaluation:n?.parseEvaluation,buildRetryInput:n?.buildRetryInput,extract:n?.extract,onExhausted:n?.onExhausted,onIteration:n?.onIteration,signal:n?.signal,timeout:n?.timeout,threshold:n?.threshold},c=await ln(o,s,"__imperative_reflect"),d=be?[...be]:[],g=n?.maxIterations??2,h=d.length>0&&!d[d.length-1].passed&&d.length>=g;return {result:c,iterations:d.length,history:d,exhausted:h}},async runDebate(e,r,s,n){return ae(),cn({agents:e,evaluator:r,maxRounds:n?.maxRounds,extract:n?.extract,parseJudgement:n?.parseJudgement,signal:n?.signal,timeout:n?.timeout},s,"__imperative_debate")},async runGoal(e,r,s,n){return ae(),dn({nodes:e,when:s,satisfaction:n?.satisfaction,maxSteps:n?.maxSteps,extract:n?.extract,timeout:n?.timeout,signal:n?.signal,selectionStrategy:n?.selectionStrategy,relaxation:n?.relaxation,onStep:n?.onStep,onStall:n?.onStall,checkpoint:n?.checkpoint},r,"__imperative_goal")},async resumeGoal(e,r){if(ae(),!e||e.version!==1||e.type!=="goal"&&e.type!=="converge")throw new Error("[Directive MultiAgent] Invalid goal checkpoint state");let s=e.type==="converge"?{...e}:e;return dn(r,{},s.patternId,s)},async resumeSequential(e,r){if(ae(),!e||e.version!==1||e.type!=="sequential")throw new Error("[Directive MultiAgent] Invalid sequential checkpoint state");return Tn(r,e.currentInput,e.patternId,e)},async resumeSupervisor(e,r,s){if(ae(),!e||e.version!==1||e.type!=="supervisor")throw new Error("[Directive MultiAgent] Invalid supervisor checkpoint state");let n=s?.input??e.currentInput;return Sn(r,n,e.patternId,e)},async resumeReflect(e,r,s){if(ae(),!e||e.version!==1||e.type!=="reflect")throw new Error("[Directive MultiAgent] Invalid reflect checkpoint state");let n=s?.input??e.effectiveInput;return ln(r,n,e.patternId,e)},async resumeDebate(e,r){if(ae(),!e||e.version!==1||e.type!=="debate")throw new Error("[Directive MultiAgent] Invalid debate checkpoint state");return cn(r,e.currentInput,e.patternId,e)},async resumeDag(e,r,s){if(ae(),!e||e.version!==1||e.type!=="dag")throw new Error("[Directive MultiAgent] Invalid DAG checkpoint state");let n=s?.input??e.input;return En(r,n,e.patternId,e)},async replay(e,r,s){if(ae(),!ce)throw new Error("[Directive MultiAgent] No checkpoint store configured");let n=await ce.load(e);if(!n)throw new Error(`[Directive MultiAgent] Checkpoint not found: ${e}`);let o;try{let g=JSON.parse(n.systemExport);if(!g||typeof g!="object")throw new Error("Parsed checkpoint state is not an object");let h=new Set(["__proto__","constructor","prototype"]);for(let O of Object.keys(g))if(h.has(O))throw new Error(`Checkpoint state contains blocked key: ${O}`);if(!new Set(["sequential","supervisor","reflect","debate","dag","goal","converge"]).has(g.type))throw new Error(`Unknown checkpoint pattern type: ${g.type}`);if(g.version!==1)throw new Error(`Unsupported checkpoint version: ${g.version}`);o=g;}catch(g){throw new Error(`[Directive MultiAgent] Invalid checkpoint state: ${g instanceof Error?g.message:String(g)}`)}let c=Xn(o),d=s?.input??("currentInput"in o?o.currentInput:"");switch(x&&x.record({type:"checkpoint_restore",timestamp:Date.now(),snapshotId:null,checkpointId:e,patternType:o.type,step:c}),o.type){case "sequential":return Tn(r,d,o.patternId,o);case "supervisor":return Sn(r,d,o.patternId,o);case "reflect":return ln(r,d,o.patternId,o);case "debate":return cn(r,d,o.patternId,o);case "dag":return En(r,d,o.patternId,o);case "goal":return dn(r,o.facts,o.patternId,o)}},resumeBreakpoint(e,r){ae(),r&&Ye.set(e,r);for(let s of Object.keys(oe)){let n=Pe(s);if(nt(n).pending.some(c=>c.id===e)){l.batch(()=>{let c=nt(n),d=[...c.resolved,e];rt(n,{...c,pending:c.pending.filter(g=>g.id!==e),resolved:d.length>ht?d.slice(-ht):d});});return}}ue&&console.debug(`[Directive MultiAgent] resumeBreakpoint() ignored: no pending breakpoint "${e}"`);},cancelBreakpoint(e,r){ae(),r&>.set(e,r);for(let s of Object.keys(oe)){let n=Pe(s);if(nt(n).pending.some(c=>c.id===e)){l.batch(()=>{let c=nt(n),d=[...c.cancelled,e];rt(n,{...c,pending:c.pending.filter(g=>g.id!==e),cancelled:d.length>ht?d.slice(-ht):d});});return}}ue&&console.debug(`[Directive MultiAgent] cancelBreakpoint() ignored: no pending breakpoint "${e}"`);},getPendingBreakpoints(){let e=[];for(let r of Object.keys(oe)){let s=Pe(r),n=nt(s);e.push(...n.pending);}return e},getLastReflectionHistory(){return be?[...be]:null},dispose(){z||(Nn.reset(),J.clear(),Me.clear(),Ae.clear(),_e.clear(),z=true,l.destroy());}};return et(),Nn}function Zn(i,t,u){return {type:"dag",nodes:i,merge:t??(a=>a.outputs),...u}}function Pr(i,t){let u=Object.keys(t);for(let[k,v]of Object.entries(t))for(let A of v.deps??[])if(!t[A])throw new Error(`[Directive MultiAgent] DAG pattern "${i}": node "${k}" depends on unknown node "${A}"`);if(!u.some(k=>{let v=t[k]?.deps;return !v||v.length===0}))throw new Error(`[Directive MultiAgent] DAG pattern "${i}": no root nodes (every node has dependencies)`);let p=Object.create(null),f=Object.create(null);for(let k of u)f[k]=[];for(let[k,v]of Object.entries(t)){p[k]=(v.deps??[]).length;for(let A of v.deps??[])f[A].push(k);}let b=[];for(let k of u)p[k]===0&&b.push(k);let R=0;for(;b.length>0;){let k=b.shift();R++;for(let v of f[k]??[])p[v]--,p[v]===0&&b.push(v);}if(R!==u.length)throw new Error(`[Directive MultiAgent] DAG pattern "${i}": cycle detected. Visited ${R}/${u.length} nodes.`)}function Qn(i={}){let{defaultResponse:t={output:"mock response",totalTokens:10},responses:u={},recordCalls:a=true,onRun:p}=i,f=[],b=new Map(Object.entries(u)),R=t;return {run:async(v,A,Y)=>{p?.(v,A),a&&f.push({agent:v,input:A,options:Y,timestamp:Date.now()});let X=b.get(v.name)??R;if(X.generate){let N=X.generate(A,v);X={...X,...N};}if(X.error)throw X.error;X.delay&&X.delay>0&&await new Promise(N=>setTimeout(N,X.delay));let Ee=X.messages??[];for(let N of Ee)Y?.onMessage?.(N);let Ke=X.toolCalls??[];for(let N of Ke)Y?.onToolCall?.(N);return {output:X.output,messages:Ee,toolCalls:Ke,totalTokens:X.totalTokens??10}},getCalls:()=>[...f],getCallsFor:v=>f.filter(A=>A.agent.name===v),clearCalls:()=>f.length=0,setResponse:(v,A)=>b.set(v,A),setDefaultResponse:v=>R=v}}async function Ir(i,t,u){let a={agentName:"test-agent",input:"",...t},p={agentName:t.agentName??"test-agent",input:t.input??"",facts:u?.facts??{},...u},f=Date.now(),b=await i(a,p),R=Date.now()-f;return {...b,duration:R,testedData:a,assertPassed(){if(!b.passed)throw new Error(`Expected guardrail to pass, but it failed: ${b.reason}`)},assertFailed(k){if(b.passed)throw new Error("Expected guardrail to fail, but it passed");if(k!==void 0){if(typeof k=="string"&&!b.reason?.includes(k))throw new Error(`Expected failure reason to include "${k}", got: ${b.reason}`);if(k instanceof RegExp&&!k.test(b.reason??""))throw new Error(`Expected failure reason to match ${k}, got: ${b.reason}`)}},assertTransformed(k){if(b.transformed===void 0)throw new Error("Expected guardrail to transform input, but no transformation occurred");if(k!==void 0&&b.transformed!==k)throw new Error(`Expected transformation to be ${JSON.stringify(k)}, got: ${JSON.stringify(b.transformed)}`)}}}async function Ao(i,t){let u=[],a=[];for(let p=0;p<t.length;p++){let f=t[p],b=await Ir(i,f.input,f.context);u.push(b),(b.passed?b.transformed!==void 0?"transform":"pass":"fail")!==f.expect&&a.push({index:p,expected:f.expect,actual:b});}return {results:u,allPassed:()=>a.length===0,failures:()=>a}}function er(i={}){let{autoApprove:t,autoReject:u,delay:a=0,recordRequests:p=true}=i,f=[],b=new Map,R=[];return {async handle(k){p&&f.push(k);for(let v=R.length-1;v>=0;v--){let A=R[v];A.predicate(k)&&(R.splice(v,1),A.resolve(k));}return a>0&&await new Promise(v=>setTimeout(v,a)),u&&u(k)?"rejected":t&&t(k)?"approved":new Promise(v=>{b.set(k.id,{request:k,resolve:v});})},getRequests:()=>[...f],clearRequests:()=>f.length=0,approve(k){let v=b.get(k);v&&(v.resolve("approved"),b.delete(k));},reject(k,v){let A=b.get(k);if(A){A.resolve("rejected"),b.delete(k);let Y=f.find(X=>X.id===k);Y&&(Y.rejectionReason=v);}},waitForRequest(k,v=5e3){let A=f.find(k);return A?Promise.resolve(A):new Promise((Y,X)=>{let Ee={predicate:k,resolve:N=>{clearTimeout(Ke),Y(N);}},Ke=setTimeout(()=>{let N=R.indexOf(Ee);N>=0&&R.splice(N,1),X(new Error("Timeout waiting for approval request"));},v);R.push(Ee);})}}}function xo(i={}){let{mockResponses:t,defaultMockResponse:u,...a}=i,p=Qn({responses:t,defaultResponse:u}),f=er(),b=Wn({...a,runner:p.run,onApprovalRequest:k=>{f.handle(k),a.onApprovalRequest?.(k);}}),R=Object.create(b);return R.mockRunner=p,R.approvalSimulator=f,R.getCalls=()=>p.getCalls(),R.getApprovalRequests=()=>f.getRequests(),R.resetAll=()=>{b.reset(),p.clearCalls(),f.clearRequests();},R}function Co(){let i=[];return {plugin:{name:"constraint-recorder",onRequirementCreated(t){i.push({constraintId:t.constraintId,triggered:true,requirement:t.requirement,facts:t.facts,timestamp:Date.now()});}},getSnapshots:()=>[...i],clearSnapshots:()=>i.length=0}}function Do(i,t){let u=i.facts;if(t.agentStatus!==void 0&&u.agent.status!==t.agentStatus)throw new Error(`Expected agent status to be "${t.agentStatus}", got "${u.agent.status}"`);if(t.tokenUsage!==void 0){let{min:a,max:p,exact:f}=t.tokenUsage;if(f!==void 0&&u.agent.tokenUsage!==f)throw new Error(`Expected token usage to be exactly ${f}, got ${u.agent.tokenUsage}`);if(a!==void 0&&u.agent.tokenUsage<a)throw new Error(`Expected token usage to be at least ${a}, got ${u.agent.tokenUsage}`);if(p!==void 0&&u.agent.tokenUsage>p)throw new Error(`Expected token usage to be at most ${p}, got ${u.agent.tokenUsage}`)}if(t.pendingApprovals!==void 0&&u.approval.pending.length!==t.pendingApprovals)throw new Error(`Expected ${t.pendingApprovals} pending approvals, got ${u.approval.pending.length}`);if(t.conversationLength!==void 0){let{min:a,max:p,exact:f}=t.conversationLength,b=u.conversation.length;if(f!==void 0&&b!==f)throw new Error(`Expected conversation length to be exactly ${f}, got ${b}`);if(a!==void 0&&b<a)throw new Error(`Expected conversation length to be at least ${a}, got ${b}`);if(p!==void 0&&b>p)throw new Error(`Expected conversation length to be at most ${p}, got ${b}`)}}function Oo(i=Date.now()){let t=i,u=i;return {now:()=>t,advance:a=>{t+=a;},set:a=>{t=a;},reset:()=>{t=u;}}}function _o(i){let{mockResponses:t={},defaultMockResponse:u,...a}=i,p={};for(let[v,A]of Object.entries(t)){let Y=a.agents[v];Y&&(p[Y.agent.name]=A);}let f=Qn({responses:p,defaultResponse:u}),b=er(),R=zn({...a,runner:f.run,onApprovalRequest:v=>{b.handle(v),a.onApprovalRequest?.(v);}}),k=Object.create(R);return k.mockRunner=f,k.approvalSimulator=b,k.getCalls=()=>f.getCalls(),k.getApprovalRequests=()=>b.getRequests(),k.resetAll=()=>{R.reset(),f.clearCalls(),b.clearRequests();},k}function Mo(i,t){if(t.agentStatus)for(let[u,a]of Object.entries(t.agentStatus)){let p=i.getAgentState(u);if(!p)throw new Error(`Expected agent "${u}" to exist, but it was not found`);if(p.status!==a)throw new Error(`Expected agent "${u}" status to be "${a}", got "${p.status}"`)}if(t.totalTokens){let{agentId:u,min:a,max:p}=t.totalTokens;if(u){let f=i.getAgentState(u);if(!f)throw new Error(`Expected agent "${u}" to exist, but it was not found`);if(a!==void 0&&f.totalTokens<a)throw new Error(`Expected agent "${u}" tokens to be at least ${a}, got ${f.totalTokens}`);if(p!==void 0&&f.totalTokens>p)throw new Error(`Expected agent "${u}" tokens to be at most ${p}, got ${f.totalTokens}`)}else {let f=i.getAllAgentStates(),b=Object.values(f).reduce((R,k)=>R+k.totalTokens,0);if(a!==void 0&&b<a)throw new Error(`Expected total tokens to be at least ${a}, got ${b}`);if(p!==void 0&&b>p)throw new Error(`Expected total tokens to be at most ${p}, got ${b}`)}}if(t.globalTokens){let{min:u,max:a}=t.globalTokens,p=i.totalTokens;if(u!==void 0&&p<u)throw new Error(`Expected global tokens to be at least ${u}, got ${p}`);if(a!==void 0&&p>a)throw new Error(`Expected global tokens to be at most ${a}, got ${p}`)}if(t.pendingHandoffs!==void 0){let u=i.getPendingHandoffs().length;if(u!==t.pendingHandoffs)throw new Error(`Expected ${t.pendingHandoffs} pending handoffs, got ${u}`)}}function Io(i,t,u){return Zn(i,t??(p=>p.outputs),u)}function No(i,t){if(t.nodeStatuses)for(let[u,a]of Object.entries(t.nodeStatuses)){let p=i.statuses[u];if(p!==a)throw new Error(`Expected node "${u}" status to be "${a}", got "${p}"`)}if(t.completedNodes){for(let u of t.completedNodes)if(i.statuses[u]!=="completed")throw new Error(`Expected node "${u}" to be completed, got "${i.statuses[u]}"`)}if(t.skippedNodes){for(let u of t.skippedNodes)if(i.statuses[u]!=="skipped")throw new Error(`Expected node "${u}" to be skipped, got "${i.statuses[u]}"`)}if(t.errorNodes){for(let u of t.errorNodes)if(i.statuses[u]!=="error")throw new Error(`Expected node "${u}" to be error, got "${i.statuses[u]}"`)}if(t.outputContains)for(let[u,a]of Object.entries(t.outputContains)){let p=i.outputs[u];if(p!==a)throw new Error(`Expected node "${u}" output to be ${JSON.stringify(a)}, got ${JSON.stringify(p)}`)}}function jo(i,t){let u=Ht({maxEvents:t?.maxEvents??500});if(i)for(let a of i)u.record({timestamp:Date.now(),snapshotId:null,agentId:"",...a});return u}function qo(i,t){let u=i.getEvents();if(t.totalEvents!==void 0&&u.length!==t.totalEvents)throw new Error(`Expected ${t.totalEvents} timeline events, got ${u.length}`);if(t.minEvents!==void 0&&u.length<t.minEvents)throw new Error(`Expected at least ${t.minEvents} timeline events, got ${u.length}`);if(t.maxEvents!==void 0&&u.length>t.maxEvents)throw new Error(`Expected at most ${t.maxEvents} timeline events, got ${u.length}`);if(t.eventTypes){for(let a of t.eventTypes)if(!u.some(f=>f.type===a))throw new Error(`Expected timeline to contain event of type "${a}", but none found`)}if(t.agentEvents)for(let[a,p]of Object.entries(t.agentEvents)){let f=i.getEventsForAgent(a).length;if(f!==p)throw new Error(`Expected ${p} events for agent "${a}", got ${f}`)}if(t.hasType&&!u.some(p=>p.type===t.hasType))throw new Error(`Expected timeline to contain event of type "${t.hasType}"`);if(t.doesNotHaveType&&u.some(p=>p.type===t.doesNotHaveType))throw new Error(`Expected timeline NOT to contain event of type "${t.doesNotHaveType}"`)}function Go(i,t){let u=0,a=t?.failAfter??0;return async(p,f,b)=>{if(u++,a>0&&u<=a)return {output:"success",messages:[],toolCalls:[],totalTokens:10};throw t?.delay&&t.delay>0&&await new Promise(R=>setTimeout(R,t.delay)),i??new Error("Runner failed")}}function Bo(i,t){if(i.length===0)throw new Error("Expected at least one reroute event, but none occurred");if(t.minReroutes!==void 0&&i.length<t.minReroutes)throw new Error(`Expected at least ${t.minReroutes} reroute events, got ${i.length}`);if(t.fromAgent&&!i.some(a=>a.originalAgent===t.fromAgent))throw new Error(`Expected reroute from agent "${t.fromAgent}", but no matching event found`);if(t.toAgent&&!i.some(a=>a.reroutedTo===t.toAgent))throw new Error(`Expected reroute to agent "${t.toAgent}", but no matching event found`);if(t.reason&&!i.some(a=>typeof t.reason=="string"?a.reason.includes(t.reason):t.reason.test(a.reason)))throw new Error(`Expected reroute reason matching ${t.reason}, but no matching event found`)}function Lo(i,t,u){let a=i.getMetrics(t);if(u.minScore!==void 0&&a.healthScore<u.minScore)throw new Error(`Expected agent "${t}" health score to be at least ${u.minScore}, got ${a.healthScore}`);if(u.maxScore!==void 0&&a.healthScore>u.maxScore)throw new Error(`Expected agent "${t}" health score to be at most ${u.maxScore}, got ${a.healthScore}`);if(u.circuitState!==void 0&&a.circuitState!==u.circuitState)throw new Error(`Expected agent "${t}" circuit state to be "${u.circuitState}", got "${a.circuitState}"`);if(u.minSuccessRate!==void 0&&a.successRate<u.minSuccessRate)throw new Error(`Expected agent "${t}" success rate to be at least ${u.minSuccessRate}, got ${a.successRate}`)}function Fo(i=100){let t=new pn({maxCheckpoints:i}),u=[];return {inner:t,saved:u,getLatest:()=>u[u.length-1],async save(a){return u.push(a),t.save(a)},load:a=>t.load(a),list:()=>t.list(),delete:a=>t.delete(a),clear:()=>t.clear(),prune:()=>t.prune()}}function Ho(i,t){if(t.orchestratorType!==void 0&&i.orchestratorType!==t.orchestratorType)throw new Error(`Expected checkpoint orchestratorType "${t.orchestratorType}", got "${i.orchestratorType}"`);if(t.hasSystemExport===true&&(!i.systemExport||i.systemExport===""))throw new Error("Expected checkpoint to have non-empty systemExport, but it was empty");if(t.hasTimeline===true&&i.timelineExport===null)throw new Error("Expected checkpoint to have timeline export, but it was null");if(t.hasTimeline===false&&i.timelineExport!==null)throw new Error("Expected checkpoint to have no timeline export, but it was present");if(t.hasMemory===true&&i.memoryExport===null)throw new Error("Expected checkpoint to have memory export, but it was null");if(t.hasMemory===false&&i.memoryExport!==null)throw new Error("Expected checkpoint to have no memory export, but it was present");if(t.label!==void 0&&i.label!==t.label)throw new Error(`Expected checkpoint label "${t.label}", got "${i.label}"`)}function Uo(i={}){let t=[],u=null,a=false;return {handler:f=>{if(t.push(f),!a)throw new Error("[Directive] BreakpointSimulator: handler called but attachTo() was never called. Breakpoints will not be resolved. Call simulator.attachTo(orchestrator) after creation.");let b=i.autoResumeDelay??0,R=()=>{u&&(i.cancel?u.cancelBreakpoint(f.id,i.cancelReason):u.resumeBreakpoint(f.id,i.modifications));};b>0?setTimeout(R,b):queueMicrotask(R);},hits:t,attachTo:f=>{u=f,a=true;}}}function Jo(i,t){if(t.count!==void 0&&i.length!==t.count)throw new Error(`Expected ${t.count} breakpoint hits, got ${i.length}`);if(t.type&&!i.some(a=>a.type===t.type)){let a=i.map(p=>p.type).join(", ");throw new Error(`Expected breakpoint of type "${t.type}", found types: [${a}]`)}if(t.agentId&&!i.some(a=>a.agentId===t.agentId)){let a=i.map(p=>p.agentId).join(", ");throw new Error(`Expected breakpoint for agent "${t.agentId}", found agents: [${a}]`)}}function Wo(i,t){return {safeParse:u=>i(u)?{success:true,data:u}:{success:false,error:{message:"Validation failed"}},description:t}}async function Ko(i){let t=[];for await(let u of i)t.push(u);return t}function Vo(i,t){if(t.minChunks!==void 0&&i.length<t.minChunks)throw new Error(`Expected at least ${t.minChunks} chunks, got ${i.length}`);if(t.agentIds){let u=new Set(i.map(a=>a.agentId));for(let a of t.agentIds)if(!u.has(a))throw new Error(`Expected chunks from agent "${a}", found agents: [${[...u].join(", ")}]`)}if(t.hasDone===true&&!i.some(a=>a.chunk.type==="done"))throw new Error("Expected at least one 'done' chunk, found none");if(t.hasErrors===true&&!i.some(a=>a.chunk.type==="error"))throw new Error("Expected at least one 'error' chunk, found none");if(t.hasErrors===false&&i.some(a=>a.chunk.type==="error"))throw new Error("Expected no 'error' chunks, but found some")}function Xo(i){let t=i?.passAfter??1,u=i?.feedback??"Needs improvement",a=i?.score,p=0;return (f,b)=>{p++;let R=p>=t;return {passed:R,feedback:R?void 0:u,score:a??(R?1:.5)}}}function Yo(i,t){let u=i.getAll();for(let[a,p]of Object.entries(t)){let f=u[a];if(f!==p)throw new Error(`Expected scratchpad key "${a}" to be ${JSON.stringify(p)}, got ${JSON.stringify(f)}`)}}function zo(i,t){let u=i.derived;for(let[a,p]of Object.entries(t)){let f=u[a];if(typeof p=="object"&&p!==null){let b=R=>JSON.stringify(R,Object.keys(R).sort());if(b(f)!==b(p))throw new Error(`Expected derived value "${a}" to be ${JSON.stringify(p)}, got ${JSON.stringify(f)}`)}else if(f!==p)throw new Error(`Expected derived value "${a}" to be ${JSON.stringify(p)}, got ${JSON.stringify(f)}`)}}exports.assertAgentHealth=Lo;exports.assertBreakpointHit=Jo;exports.assertCheckpoint=Ho;exports.assertDagExecution=No;exports.assertDerivedValues=zo;exports.assertMultiAgentState=Mo;exports.assertMultiplexedStream=Vo;exports.assertOrchestratorState=Do;exports.assertRerouted=Bo;exports.assertScratchpadState=Yo;exports.assertTimelineEvents=qo;exports.collectMultiplexedStream=Ko;exports.createApprovalSimulator=er;exports.createBreakpointSimulator=Uo;exports.createConstraintRecorder=Co;exports.createFailingRunner=Go;exports.createMockAgentRunner=Qn;exports.createMockSchema=Wo;exports.createTestCheckpointStore=Fo;exports.createTestDag=Io;exports.createTestMultiAgentOrchestrator=_o;exports.createTestOrchestrator=xo;exports.createTestReflectionEvaluator=Xo;exports.createTestTimeline=jo;exports.createTimeController=Oo;exports.testGuardrail=Ir;exports.testGuardrailBatch=Ao;//# sourceMappingURL=testing.cjs.map
|
|
14
49
|
//# sourceMappingURL=testing.cjs.map
|