@directive-run/ai 0.1.1 → 0.2.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.
@@ -1,5 +1,5 @@
1
1
  import { AgentOrchestrator, OrchestratorOptions } from './index.cjs';
2
- import { A as ApprovalRequest, I as InputGuardrailData, O as OutputGuardrailData, M as Message, T as ToolCallGuardrailData, a as ToolCall, G as GuardrailResult, b as AgentLike, c as AgentRunner, R as RunOptions, d as GuardrailFn, e as GuardrailContext } from './types-BKCdgKC-.cjs';
2
+ import { A as ApprovalRequest, I as InputGuardrailData, O as OutputGuardrailData, M as Message, T as ToolCallGuardrailData, a as ToolCall, G as GuardrailResult, b as AgentLike, c as AgentRunner, R as RunOptions, d as GuardrailFn, e as GuardrailContext } from './types-Bbar7yKz.cjs';
3
3
  import '@directive-run/core';
4
4
  import '@directive-run/core/plugins';
5
5
 
package/dist/testing.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { AgentOrchestrator, OrchestratorOptions } from './index.js';
2
- import { A as ApprovalRequest, I as InputGuardrailData, O as OutputGuardrailData, M as Message, T as ToolCallGuardrailData, a as ToolCall, G as GuardrailResult, b as AgentLike, c as AgentRunner, R as RunOptions, d as GuardrailFn, e as GuardrailContext } from './types-BKCdgKC-.js';
2
+ import { A as ApprovalRequest, I as InputGuardrailData, O as OutputGuardrailData, M as Message, T as ToolCallGuardrailData, a as ToolCall, G as GuardrailResult, b as AgentLike, c as AgentRunner, R as RunOptions, d as GuardrailFn, e as GuardrailContext } from './types-Bbar7yKz.js';
3
3
  import '@directive-run/core';
4
4
  import '@directive-run/core/plugins';
5
5
 
package/dist/testing.js CHANGED
@@ -1,14 +1,14 @@
1
- import {requirementGuard,createCallbackPlugin,getBridgeFact,setBridgeFact}from'@directive-run/core/adapter-utils';import {t,createModule,createSystem}from'@directive-run/core';import'@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]:t.any(),[Y]:t.any(),[ee]:t.any(),[te]:t.any()}};function L(r){return getBridgeFact(r,Z)}function I(r,t){setBridgeFact(r,Z,t);}function J(r){return getBridgeFact(r,Y)}function H(r,t){setBridgeFact(r,Y,t);}function se(r){return getBridgeFact(r,ee)}function re(r,t){setBridgeFact(r,ee,t);}function ie(r){return getBridgeFact(r,te)}function ae(r,t){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
+ import {requirementGuard,createCallbackPlugin,getBridgeFact,setBridgeFact}from'@directive-run/core/adapter-utils';import {t,createModule,createSystem}from'@directive-run/core';import'@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]:t.object(),[Y]:t.object(),[ee]:t.object(),[te]:t.object()}};function L(r){return getBridgeFact(r,Z)}function I(r,t){setBridgeFact(r,Z,t);}function J(r){return getBridgeFact(r,Y)}function H(r,t){setBridgeFact(r,Y,t);}function se(r){return getBridgeFact(r,ee)}function re(r,t){setBridgeFact(r,ee,t);}function ie(r){return getBridgeFact(r,te)}function ae(r,t){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:
2
2
  - Set autoApproveToolCalls: true to auto-approve all tool calls
3
3
  - Provide an onApprovalRequest callback to handle approvals programmatically`);let Ae={facts:{...ye.facts,...u},derivations:{},events:{},requirements:{}},le,o,ce=xe(i);d&&(ce.__budgetLimit={priority:100,when:e=>L(e).tokenUsage>d,require:{type:"__PAUSE_BUDGET_EXCEEDED"}});let pe=Ge(a,(e,c,y,A)=>le(e,c,y,A),()=>o.facts);pe.__pause={requirement:requirementGuard("__PAUSE_BUDGET_EXCEEDED"),resolve:async(e,c)=>{let y=L(c.facts);I(c.facts,{...y,status:"paused"});}};let ve=createCallbackPlugin("openai-agents-callbacks",{}),Ce=createModule("openai-agents-orchestrator",{schema:Ae,init:e=>{if(I(e,{status:"idle",currentAgent:null,input:null,output:null,error:null,tokenUsage:0,turnCount:0,startedAt:null,completedAt:null}),H(e,{pending:[],approved:[],rejected:[]}),re(e,[]),ae(e,[]),s){let c=W(e),y={...e,...c};s(y);}},constraints:ce,resolvers:pe});o=createSystem({module:Ce,plugins:[...T,ve],debug:b?{timeTravel:true}:void 0}),o.start();async function de(e,c,y,A,k){return ue?ue.execute(()=>ge(e,c,y,A,k)):ge(e,c,y,A,k)}async function ge(e,c,y,A,k){let w=Date.now();if(D){let m=D.getContextMessages();if(m.length>0){let g=m.map(x=>`${x.role}: ${x.content}`).join(`
4
4
  `);e={...e,instructions:(e.instructions??"")+`
5
5
 
6
6
  Conversation context:
7
- `+g};}}F.onAgentStart?.({agentName:e.name,input:c,timestamp:w});let E=k?.inputGuardrails!==void 0?k.inputGuardrails:n.input??[],$=k?.outputGuardrails!==void 0?k.outputGuardrails:n.output??[],_=E.map((m,g)=>V(m,g,"input"));for(let m of _){let{name:g}=m,x={agentName:e.name,input:c,facts:o.facts.$store.toObject()},M=Date.now(),h=await K(m,{input:c,agentName:e.name},x);if(F.onGuardrailCheck?.({guardrailName:g,guardrailType:"input",passed:h.passed,reason:h.reason,durationMs:Date.now()-M,timestamp:Date.now()}),!h.passed)throw new N({code:"INPUT_GUARDRAIL_FAILED",message:`Input guardrail "${g}" failed: ${h.reason}`,guardrailName:g,guardrailType:"input",userMessage:h.reason??"Input validation failed",agentName:e.name,input:c});h.transformed!==void 0&&(c=h.transformed);}o.batch(()=>{let m=L(o.facts);I(o.facts,{...m,status:"running",currentAgent:e.name,input:c,startedAt:Date.now()});});let O=await Re(t,e,c,{...A,signal:A?.signal,onMessage:m=>{let g=se(o.facts);re(o.facts,[...g,m]),A?.onMessage?.(m);},onToolCall:async m=>{let g=(n.toolCall??[]).map((M,h)=>V(M,h,"toolCall"));for(let M of g){let{name:h}=M,f={agentName:e.name,input:c,facts:o.facts.$store.toObject()},q=Date.now(),S=await K(M,{toolCall:m,agentName:e.name,input:c},f);if(F.onGuardrailCheck?.({guardrailName:h,guardrailType:"toolCall",passed:S.passed,reason:S.reason,durationMs:Date.now()-q,timestamp:Date.now()}),!S.passed)throw new N({code:"TOOL_CALL_GUARDRAIL_FAILED",message:`Tool call guardrail "${h}" failed: ${S.reason}`,guardrailName:h,guardrailType:"toolCall",userMessage:S.reason??"Tool call blocked",data:{toolCall:m},agentName:e.name,input:c})}if(!l){let M=`tool-${m.id}`,h={id:M,type:"tool_call",agentName:e.name,description:`Tool call: ${m.name}`,data:m,requestedAt:Date.now()};o.batch(()=>{let f=J(o.facts);H(o.facts,{...f,pending:[...f.pending,h]});}),R?.(h),await me(M);}let x=ie(o.facts);ae(o.facts,[...x,m]),A?.onToolCall?.(m);}},P?{...P,onRetry:(m,g,x)=>{P.onRetry?.(m,g,x),F.onAgentRetry?.({agentName:e.name,input:c,attempt:m,error:g,delayMs:x,timestamp:Date.now()});}}:void 0),U=$.map((m,g)=>V(m,g,"output"));for(let m of U){let{name:g}=m,x={agentName:e.name,input:c,facts:o.facts.$store.toObject()},M=Date.now(),h=await K(m,{output:O.output,agentName:e.name,input:c,messages:O.messages},x);if(F.onGuardrailCheck?.({guardrailName:g,guardrailType:"output",passed:h.passed,reason:h.reason,durationMs:Date.now()-M,timestamp:Date.now()}),!h.passed)throw new N({code:"OUTPUT_GUARDRAIL_FAILED",message:`Output guardrail "${g}" failed: ${h.reason}`,guardrailName:g,guardrailType:"output",userMessage:h.reason??"Output validation failed",agentName:e.name,input:c});h.transformed!==void 0&&(O.output=h.transformed);}return o.batch(()=>{let m=L(o.facts);I(o.facts,{...m,status:"completed",output:O.output,tokenUsage:m.tokenUsage+O.totalTokens,turnCount:m.turnCount+O.messages.length,completedAt:Date.now()});}),D&&O.messages.length>0&&D.addMessages(O.messages),F.onAgentComplete?.({agentName:e.name,input:c,output:O.output,tokenUsage:O.totalTokens,durationMs:Date.now()-w,timestamp:Date.now()}),O}le=de;function me(e){return new Promise((c,y)=>{let A=null,k=()=>{A&&(clearTimeout(A),A=null);},w=o.facts.$store.subscribe([Y],()=>{let E=J(o.facts);if(E.approved.includes(e))k(),w(),c();else {let $=E.rejected.find(_=>_.id===e);if($){k(),w();let _=$.reason?`Request ${e} rejected: ${$.reason}`:`Request ${e} rejected`;y(new Error(_));}}});A=setTimeout(()=>{w();let E=Math.round(v/1e3);y(new Error(`[Directive] Approval timeout: Request ${e} not resolved within ${E}s.
7
+ `+g};}}F.onAgentStart?.({agentName:e.name,input:c,timestamp:w});let E=k?.inputGuardrails!==void 0?k.inputGuardrails:n.input??[],j=k?.outputGuardrails!==void 0?k.outputGuardrails:n.output??[],_=E.map((m,g)=>V(m,g,"input"));for(let m of _){let{name:g}=m,x={agentName:e.name,input:c,facts:o.facts.$store.toObject()},M=Date.now(),h=await K(m,{input:c,agentName:e.name},x);if(F.onGuardrailCheck?.({guardrailName:g,guardrailType:"input",passed:h.passed,reason:h.reason,durationMs:Date.now()-M,timestamp:Date.now()}),!h.passed)throw new N({code:"INPUT_GUARDRAIL_FAILED",message:`Input guardrail "${g}" failed: ${h.reason}`,guardrailName:g,guardrailType:"input",userMessage:h.reason??"Input validation failed",agentName:e.name,input:c});h.transformed!==void 0&&(c=h.transformed);}o.batch(()=>{let m=L(o.facts);I(o.facts,{...m,status:"running",currentAgent:e.name,input:c,startedAt:Date.now()});});let O=await Re(t,e,c,{...A,signal:A?.signal,onMessage:m=>{let g=se(o.facts);re(o.facts,[...g,m]),A?.onMessage?.(m);},onToolCall:async m=>{let g=(n.toolCall??[]).map((M,h)=>V(M,h,"toolCall"));for(let M of g){let{name:h}=M,f={agentName:e.name,input:c,facts:o.facts.$store.toObject()},q=Date.now(),S=await K(M,{toolCall:m,agentName:e.name,input:c},f);if(F.onGuardrailCheck?.({guardrailName:h,guardrailType:"toolCall",passed:S.passed,reason:S.reason,durationMs:Date.now()-q,timestamp:Date.now()}),!S.passed)throw new N({code:"TOOL_CALL_GUARDRAIL_FAILED",message:`Tool call guardrail "${h}" failed: ${S.reason}`,guardrailName:h,guardrailType:"toolCall",userMessage:S.reason??"Tool call blocked",data:{toolCall:m},agentName:e.name,input:c})}if(!l){let M=`tool-${m.id}`,h={id:M,type:"tool_call",agentName:e.name,description:`Tool call: ${m.name}`,data:m,requestedAt:Date.now()};o.batch(()=>{let f=J(o.facts);H(o.facts,{...f,pending:[...f.pending,h]});}),R?.(h),await me(M);}let x=ie(o.facts);ae(o.facts,[...x,m]),A?.onToolCall?.(m);}},P?{...P,onRetry:(m,g,x)=>{P.onRetry?.(m,g,x),F.onAgentRetry?.({agentName:e.name,input:c,attempt:m,error:g,delayMs:x,timestamp:Date.now()});}}:void 0),U=j.map((m,g)=>V(m,g,"output"));for(let m of U){let{name:g}=m,x={agentName:e.name,input:c,facts:o.facts.$store.toObject()},M=Date.now(),h=await K(m,{output:O.output,agentName:e.name,input:c,messages:O.messages},x);if(F.onGuardrailCheck?.({guardrailName:g,guardrailType:"output",passed:h.passed,reason:h.reason,durationMs:Date.now()-M,timestamp:Date.now()}),!h.passed)throw new N({code:"OUTPUT_GUARDRAIL_FAILED",message:`Output guardrail "${g}" failed: ${h.reason}`,guardrailName:g,guardrailType:"output",userMessage:h.reason??"Output validation failed",agentName:e.name,input:c});h.transformed!==void 0&&(O.output=h.transformed);}return o.batch(()=>{let m=L(o.facts);I(o.facts,{...m,status:"completed",output:O.output,tokenUsage:m.tokenUsage+O.totalTokens,turnCount:m.turnCount+O.messages.length,completedAt:Date.now()});}),D&&O.messages.length>0&&D.addMessages(O.messages),F.onAgentComplete?.({agentName:e.name,input:c,output:O.output,tokenUsage:O.totalTokens,durationMs:Date.now()-w,timestamp:Date.now()}),O}le=de;function me(e){return new Promise((c,y)=>{let A=null,k=()=>{A&&(clearTimeout(A),A=null);},w=o.facts.$store.subscribe([Y],()=>{let E=J(o.facts);if(E.approved.includes(e))k(),w(),c();else {let j=E.rejected.find(_=>_.id===e);if(j){k(),w();let _=j.reason?`Request ${e} rejected: ${j.reason}`:`Request ${e} rejected`;y(new Error(_));}}});A=setTimeout(()=>{w();let E=Math.round(v/1e3);y(new Error(`[Directive] Approval timeout: Request ${e} not resolved within ${E}s.
8
8
  Solutions:
9
9
  1. Handle via onApprovalRequest callback and call orchestrator.approve()/reject()
10
10
  2. Set autoApproveToolCalls: true to auto-approve
11
11
  3. Increase approvalTimeoutMs (current: ${v}ms)
12
- See: https://directive.run/docs/ai/running-agents`));},v);})}function fe(){return {...W(o.facts)}}return {system:o,get facts(){return fe()},async run(e,c,y){return de(e,c,fe(),void 0,y)},runStream(e,c,y={}){let A=new AbortController,k=[],w=[],E=false,$=Date.now(),_=0,O="",U;y.signal&&(U=()=>A.abort(),y.signal.addEventListener("abort",U));let m=()=>{U&&y.signal&&y.signal.removeEventListener("abort",U);},g=f=>{if(E)return;let q=w.shift();q?q(f):k.push(f);},x=()=>{E=true,m();for(let f of w)f(null);w.length=0;},M=(async()=>{g({type:"progress",phase:"starting",message:"Running input guardrails"});try{let f=c,q=(n.input??[]).map((p,G)=>V(p,G,"input"));for(let p of q){let{name:G}=p,j={agentName:e.name,input:f,facts:o.facts.$store.toObject()},C=await K(p,{input:f,agentName:e.name},j);if(!C.passed)throw g({type:"guardrail_triggered",guardrailName:G,reason:C.reason??"Input validation failed",partialOutput:O,stopped:!0}),new N({code:"INPUT_GUARDRAIL_FAILED",message:`Input guardrail "${G}" failed: ${C.reason}`,guardrailName:G,guardrailType:"input",userMessage:C.reason??"Input validation failed",agentName:e.name,input:f});C.transformed!==void 0&&(f=C.transformed);}g({type:"progress",phase:"generating",message:"Starting agent"}),o.batch(()=>{let p=L(o.facts);I(o.facts,{...p,status:"running",currentAgent:e.name,input:f,startedAt:Date.now()});});let S=await Re(t,e,f,{signal:A.signal,onMessage:p=>{let G=se(o.facts);if(re(o.facts,[...G,p]),g({type:"message",message:p}),p.role==="assistant"&&p.content){let j=Math.ceil(p.content.length/4);_+=j,O+=p.content,g({type:"token",data:p.content,tokenCount:_});}},onToolCall:async p=>{g({type:"tool_start",tool:p.name,toolCallId:p.id,arguments:p.arguments});let G=(n.toolCall??[]).map((C,B)=>V(C,B,"toolCall"));for(let C of G){let{name:B}=C,X={agentName:e.name,input:f,facts:o.facts.$store.toObject()},z=await K(C,{toolCall:p,agentName:e.name,input:f},X);if(!z.passed)throw g({type:"guardrail_triggered",guardrailName:B,reason:z.reason??"Tool call blocked",partialOutput:O,stopped:!0}),new N({code:"TOOL_CALL_GUARDRAIL_FAILED",message:`Tool call guardrail "${B}" failed: ${z.reason}`,guardrailName:B,guardrailType:"toolCall",userMessage:z.reason??"Tool call blocked",data:{toolCall:p},agentName:e.name,input:f})}if(!l){let C=`tool-${p.id}`;g({type:"approval_required",requestId:C,toolName:p.name});let B={id:C,type:"tool_call",agentName:e.name,description:`Tool call: ${p.name}`,data:p,requestedAt:Date.now()};o.batch(()=>{let X=J(o.facts);H(o.facts,{...X,pending:[...X.pending,B]});}),R?.(B),await me(C),g({type:"approval_resolved",requestId:C,approved:!0});}let j=ie(o.facts);ae(o.facts,[...j,p]),p.result&&g({type:"tool_end",tool:p.name,toolCallId:p.id,result:p.result});}},P);g({type:"progress",phase:"finishing",message:"Running output guardrails"});let Te=(n.output??[]).map((p,G)=>V(p,G,"output"));for(let p of Te){let{name:G}=p,j={agentName:e.name,input:f,facts:o.facts.$store.toObject()},C=await K(p,{output:S.output,agentName:e.name,input:f,messages:S.messages},j);if(!C.passed)throw g({type:"guardrail_triggered",guardrailName:G,reason:C.reason??"Output validation failed",partialOutput:typeof S.output=="string"?S.output:"",stopped:!0}),new N({code:"OUTPUT_GUARDRAIL_FAILED",message:`Output guardrail "${G}" failed: ${C.reason}`,guardrailName:G,guardrailType:"output",userMessage:C.reason??"Output validation failed",agentName:e.name,input:f});C.transformed!==void 0&&(S.output=C.transformed);}o.batch(()=>{let p=L(o.facts);I(o.facts,{...p,status:"completed",output:S.output,tokenUsage:p.tokenUsage+S.totalTokens,turnCount:p.turnCount+S.messages.length,completedAt:Date.now()});});let ke=Date.now()-$;return g({type:"done",totalTokens:S.totalTokens,duration:ke,droppedTokens:0}),x(),S}catch(f){throw g({type:"error",error:f instanceof Error?f:new Error(String(f))}),x(),f}})();return {stream:{[Symbol.asyncIterator](){return {async next(){return k.length>0?{done:false,value:k.shift()}:E?{done:true,value:void 0}:new Promise(f=>{w.push(q=>{f(q===null?{done:true,value:void 0}:{done:false,value:q});});})}}}},result:M,abort:()=>{A.abort(),x();}}},approve(e){o.batch(()=>{let c=J(o.facts);if(!c.pending.some(k=>k.id===e)){b&&console.debug(`[Directive] approve() ignored: no pending request "${e}"`);return}let y=200,A=[...c.approved,e];H(o.facts,{...c,pending:c.pending.filter(k=>k.id!==e),approved:A.length>y?A.slice(-y):A});});},reject(e,c){o.batch(()=>{let y=J(o.facts);if(!y.pending.some(E=>E.id===e)){b&&console.debug(`[Directive] reject() ignored: no pending request "${e}"`);return}c&&b&&console.debug(`[Directive] Request ${e} rejected: ${c}`);let A={id:e,reason:c,rejectedAt:Date.now()},k=200,w=[...y.rejected,A];H(o.facts,{...y,pending:y.pending.filter(E=>E.id!==e),rejected:w.length>k?w.slice(-k):w});});},pause(){let e=L(o.facts);I(o.facts,{...e,status:"paused"});},resume(){let e=L(o.facts);e.status==="paused"&&I(o.facts,{...e,status:e.currentAgent?"running":"idle"});},reset(){o.batch(()=>{I(o.facts,{status:"idle",currentAgent:null,input:null,output:null,error:null,tokenUsage:0,turnCount:0,startedAt:null,completedAt:null}),H(o.facts,{pending:[],approved:[],rejected:[]}),re(o.facts,[]),ae(o.facts,[]);});},dispose(){o.destroy();}}}function Pe(r={}){let{defaultResponse:t={output:"mock response",totalTokens:10},responses:u={},recordCalls:s=true,onRun:i}=r,a=[],n=new Map(Object.entries(u)),R=t;return {run:async(d,T,b)=>{i?.(d,T),s&&a.push({agent:d,input:T,options:b,timestamp:Date.now()});let v=n.get(d.name)??R;if(v.generate){let D=v.generate(T,d);v={...v,...D};}if(v.error)throw v.error;v.delay&&v.delay>0&&await new Promise(D=>setTimeout(D,v.delay));let P=v.messages??[];for(let D of P)b?.onMessage?.(D);let F=v.toolCalls??[];for(let D of F)b?.onToolCall?.(D);return {output:v.output,messages:P,toolCalls:F,totalTokens:v.totalTokens??10}},getCalls:()=>[...a],getCallsFor:d=>a.filter(T=>T.agent.name===d),clearCalls:()=>a.length=0,setResponse:(d,T)=>n.set(d,T),setDefaultResponse:d=>R=d}}async function Fe(r,t,u){let s={agentName:"test-agent",input:"",...t},i={agentName:t.agentName??"test-agent",input:t.input??"",facts:u?.facts??{},...u},a=Date.now(),n=await r(s,i),R=Date.now()-a;return {...n,duration:R,testedData:s,assertPassed(){if(!n.passed)throw new Error(`Expected guardrail to pass, but it failed: ${n.reason}`)},assertFailed(l){if(n.passed)throw new Error("Expected guardrail to fail, but it passed");if(l!==void 0){if(typeof l=="string"&&!n.reason?.includes(l))throw new Error(`Expected failure reason to include "${l}", got: ${n.reason}`);if(l instanceof RegExp&&!l.test(n.reason??""))throw new Error(`Expected failure reason to match ${l}, got: ${n.reason}`)}},assertTransformed(l){if(n.transformed===void 0)throw new Error("Expected guardrail to transform input, but no transformation occurred");if(l!==void 0&&n.transformed!==l)throw new Error(`Expected transformation to be ${JSON.stringify(l)}, got: ${JSON.stringify(n.transformed)}`)}}}async function Ze(r,t){let u=[],s=[];for(let i=0;i<t.length;i++){let a=t[i],n=await Fe(r,a.input,a.context);u.push(n),(n.passed?n.transformed!==void 0?"transform":"pass":"fail")!==a.expect&&s.push({index:i,expected:a.expect,actual:n});}return {results:u,allPassed:()=>s.length===0,failures:()=>s}}function qe(r={}){let{autoApprove:t,autoReject:u,delay:s=0,recordRequests:i=true}=r,a=[],n=new Map,R=[];return {async handle(l){i&&a.push(l);for(let d of R)d.predicate(l)&&d.resolve(l);return s>0&&await new Promise(d=>setTimeout(d,s)),u&&u(l)?"rejected":t&&t(l)?"approved":new Promise(d=>{n.set(l.id,{request:l,resolve:d});})},getRequests:()=>[...a],clearRequests:()=>a.length=0,approve(l){let d=n.get(l);d&&(d.resolve("approved"),n.delete(l));},reject(l,d){let T=n.get(l);T&&(T.resolve("rejected"),n.delete(l));},waitForRequest(l,d=5e3){let T=a.find(l);return T?Promise.resolve(T):new Promise((b,v)=>{let P=setTimeout(()=>{v(new Error("Timeout waiting for approval request"));},d);R.push({predicate:l,resolve:F=>{clearTimeout(P),b(F);}});})}}}function et(r={}){let{mockResponses:t,defaultMockResponse:u,...s}=r,i=Pe({responses:t,defaultResponse:u}),a=qe(),n=he({...s,runner:i.run,onApprovalRequest:R=>{a.handle(R),s.onApprovalRequest?.(R);}});return {...n,mockRunner:i,approvalSimulator:a,getCalls:()=>i.getCalls(),getApprovalRequests:()=>a.getRequests(),resetAll(){n.reset(),i.clearCalls(),a.clearRequests();}}}function tt(){let r=[];return {plugin:{name:"constraint-recorder",onRequirementCreated(t){r.push({constraintId:t.constraintId,triggered:true,requirement:t.requirement,facts:t.facts,timestamp:Date.now()});}},getSnapshots:()=>[...r],clearSnapshots:()=>r.length=0}}function rt(r,t){let u=r.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:s,max:i,exact:a}=t.tokenUsage;if(a!==void 0&&u.agent.tokenUsage!==a)throw new Error(`Expected token usage to be exactly ${a}, got ${u.agent.tokenUsage}`);if(s!==void 0&&u.agent.tokenUsage<s)throw new Error(`Expected token usage to be at least ${s}, got ${u.agent.tokenUsage}`);if(i!==void 0&&u.agent.tokenUsage>i)throw new Error(`Expected token usage to be at most ${i}, 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:s,max:i,exact:a}=t.conversationLength,n=u.conversation.length;if(a!==void 0&&n!==a)throw new Error(`Expected conversation length to be exactly ${a}, got ${n}`);if(s!==void 0&&n<s)throw new Error(`Expected conversation length to be at least ${s}, got ${n}`);if(i!==void 0&&n>i)throw new Error(`Expected conversation length to be at most ${i}, got ${n}`)}}function at(r=Date.now()){let t=r,u=r;return {now:()=>t,advance:s=>{t+=s;},set:s=>{t=s;},reset:()=>{t=u;}}}
12
+ See: https://directive.run/docs/ai/running-agents`));},v);})}function fe(){return {...W(o.facts)}}return {system:o,get facts(){return fe()},async run(e,c,y){return de(e,c,fe(),void 0,y)},runStream(e,c,y={}){let A=new AbortController,k=[],w=[],E=false,j=Date.now(),_=0,O="",U;y.signal&&(U=()=>A.abort(),y.signal.addEventListener("abort",U));let m=()=>{U&&y.signal&&y.signal.removeEventListener("abort",U);},g=f=>{if(E)return;let q=w.shift();q?q(f):k.push(f);},x=()=>{E=true,m();for(let f of w)f(null);w.length=0;},M=(async()=>{g({type:"progress",phase:"starting",message:"Running input guardrails"});try{let f=c,q=(n.input??[]).map((p,G)=>V(p,G,"input"));for(let p of q){let{name:G}=p,$={agentName:e.name,input:f,facts:o.facts.$store.toObject()},C=await K(p,{input:f,agentName:e.name},$);if(!C.passed)throw g({type:"guardrail_triggered",guardrailName:G,reason:C.reason??"Input validation failed",partialOutput:O,stopped:!0}),new N({code:"INPUT_GUARDRAIL_FAILED",message:`Input guardrail "${G}" failed: ${C.reason}`,guardrailName:G,guardrailType:"input",userMessage:C.reason??"Input validation failed",agentName:e.name,input:f});C.transformed!==void 0&&(f=C.transformed);}g({type:"progress",phase:"generating",message:"Starting agent"}),o.batch(()=>{let p=L(o.facts);I(o.facts,{...p,status:"running",currentAgent:e.name,input:f,startedAt:Date.now()});});let S=await Re(t,e,f,{signal:A.signal,onMessage:p=>{let G=se(o.facts);if(re(o.facts,[...G,p]),g({type:"message",message:p}),p.role==="assistant"&&p.content){let $=Math.ceil(p.content.length/4);_+=$,O+=p.content,g({type:"token",data:p.content,tokenCount:_});}},onToolCall:async p=>{g({type:"tool_start",tool:p.name,toolCallId:p.id,arguments:p.arguments});let G=(n.toolCall??[]).map((C,B)=>V(C,B,"toolCall"));for(let C of G){let{name:B}=C,X={agentName:e.name,input:f,facts:o.facts.$store.toObject()},z=await K(C,{toolCall:p,agentName:e.name,input:f},X);if(!z.passed)throw g({type:"guardrail_triggered",guardrailName:B,reason:z.reason??"Tool call blocked",partialOutput:O,stopped:!0}),new N({code:"TOOL_CALL_GUARDRAIL_FAILED",message:`Tool call guardrail "${B}" failed: ${z.reason}`,guardrailName:B,guardrailType:"toolCall",userMessage:z.reason??"Tool call blocked",data:{toolCall:p},agentName:e.name,input:f})}if(!l){let C=`tool-${p.id}`;g({type:"approval_required",requestId:C,toolName:p.name});let B={id:C,type:"tool_call",agentName:e.name,description:`Tool call: ${p.name}`,data:p,requestedAt:Date.now()};o.batch(()=>{let X=J(o.facts);H(o.facts,{...X,pending:[...X.pending,B]});}),R?.(B),await me(C),g({type:"approval_resolved",requestId:C,approved:!0});}let $=ie(o.facts);ae(o.facts,[...$,p]),p.result&&g({type:"tool_end",tool:p.name,toolCallId:p.id,result:p.result});}},P);g({type:"progress",phase:"finishing",message:"Running output guardrails"});let Te=(n.output??[]).map((p,G)=>V(p,G,"output"));for(let p of Te){let{name:G}=p,$={agentName:e.name,input:f,facts:o.facts.$store.toObject()},C=await K(p,{output:S.output,agentName:e.name,input:f,messages:S.messages},$);if(!C.passed)throw g({type:"guardrail_triggered",guardrailName:G,reason:C.reason??"Output validation failed",partialOutput:typeof S.output=="string"?S.output:"",stopped:!0}),new N({code:"OUTPUT_GUARDRAIL_FAILED",message:`Output guardrail "${G}" failed: ${C.reason}`,guardrailName:G,guardrailType:"output",userMessage:C.reason??"Output validation failed",agentName:e.name,input:f});C.transformed!==void 0&&(S.output=C.transformed);}o.batch(()=>{let p=L(o.facts);I(o.facts,{...p,status:"completed",output:S.output,tokenUsage:p.tokenUsage+S.totalTokens,turnCount:p.turnCount+S.messages.length,completedAt:Date.now()});});let ke=Date.now()-j;return g({type:"done",totalTokens:S.totalTokens,duration:ke,droppedTokens:0}),x(),S}catch(f){throw g({type:"error",error:f instanceof Error?f:new Error(String(f))}),x(),f}})();return {stream:{[Symbol.asyncIterator](){return {async next(){return k.length>0?{done:false,value:k.shift()}:E?{done:true,value:void 0}:new Promise(f=>{w.push(q=>{f(q===null?{done:true,value:void 0}:{done:false,value:q});});})}}}},result:M,abort:()=>{A.abort(),x();}}},approve(e){o.batch(()=>{let c=J(o.facts);if(!c.pending.some(k=>k.id===e)){b&&console.debug(`[Directive] approve() ignored: no pending request "${e}"`);return}let y=200,A=[...c.approved,e];H(o.facts,{...c,pending:c.pending.filter(k=>k.id!==e),approved:A.length>y?A.slice(-y):A});});},reject(e,c){o.batch(()=>{let y=J(o.facts);if(!y.pending.some(E=>E.id===e)){b&&console.debug(`[Directive] reject() ignored: no pending request "${e}"`);return}c&&b&&console.debug(`[Directive] Request ${e} rejected: ${c}`);let A={id:e,reason:c,rejectedAt:Date.now()},k=200,w=[...y.rejected,A];H(o.facts,{...y,pending:y.pending.filter(E=>E.id!==e),rejected:w.length>k?w.slice(-k):w});});},pause(){let e=L(o.facts);I(o.facts,{...e,status:"paused"});},resume(){let e=L(o.facts);e.status==="paused"&&I(o.facts,{...e,status:e.currentAgent?"running":"idle"});},reset(){o.batch(()=>{I(o.facts,{status:"idle",currentAgent:null,input:null,output:null,error:null,tokenUsage:0,turnCount:0,startedAt:null,completedAt:null}),H(o.facts,{pending:[],approved:[],rejected:[]}),re(o.facts,[]),ae(o.facts,[]);});},dispose(){o.destroy();}}}function Pe(r={}){let{defaultResponse:t={output:"mock response",totalTokens:10},responses:u={},recordCalls:s=true,onRun:i}=r,a=[],n=new Map(Object.entries(u)),R=t;return {run:async(d,T,b)=>{i?.(d,T),s&&a.push({agent:d,input:T,options:b,timestamp:Date.now()});let v=n.get(d.name)??R;if(v.generate){let D=v.generate(T,d);v={...v,...D};}if(v.error)throw v.error;v.delay&&v.delay>0&&await new Promise(D=>setTimeout(D,v.delay));let P=v.messages??[];for(let D of P)b?.onMessage?.(D);let F=v.toolCalls??[];for(let D of F)b?.onToolCall?.(D);return {output:v.output,messages:P,toolCalls:F,totalTokens:v.totalTokens??10}},getCalls:()=>[...a],getCallsFor:d=>a.filter(T=>T.agent.name===d),clearCalls:()=>a.length=0,setResponse:(d,T)=>n.set(d,T),setDefaultResponse:d=>R=d}}async function Fe(r,t,u){let s={agentName:"test-agent",input:"",...t},i={agentName:t.agentName??"test-agent",input:t.input??"",facts:u?.facts??{},...u},a=Date.now(),n=await r(s,i),R=Date.now()-a;return {...n,duration:R,testedData:s,assertPassed(){if(!n.passed)throw new Error(`Expected guardrail to pass, but it failed: ${n.reason}`)},assertFailed(l){if(n.passed)throw new Error("Expected guardrail to fail, but it passed");if(l!==void 0){if(typeof l=="string"&&!n.reason?.includes(l))throw new Error(`Expected failure reason to include "${l}", got: ${n.reason}`);if(l instanceof RegExp&&!l.test(n.reason??""))throw new Error(`Expected failure reason to match ${l}, got: ${n.reason}`)}},assertTransformed(l){if(n.transformed===void 0)throw new Error("Expected guardrail to transform input, but no transformation occurred");if(l!==void 0&&n.transformed!==l)throw new Error(`Expected transformation to be ${JSON.stringify(l)}, got: ${JSON.stringify(n.transformed)}`)}}}async function Ze(r,t){let u=[],s=[];for(let i=0;i<t.length;i++){let a=t[i],n=await Fe(r,a.input,a.context);u.push(n),(n.passed?n.transformed!==void 0?"transform":"pass":"fail")!==a.expect&&s.push({index:i,expected:a.expect,actual:n});}return {results:u,allPassed:()=>s.length===0,failures:()=>s}}function qe(r={}){let{autoApprove:t,autoReject:u,delay:s=0,recordRequests:i=true}=r,a=[],n=new Map,R=[];return {async handle(l){i&&a.push(l);for(let d of R)d.predicate(l)&&d.resolve(l);return s>0&&await new Promise(d=>setTimeout(d,s)),u&&u(l)?"rejected":t&&t(l)?"approved":new Promise(d=>{n.set(l.id,{request:l,resolve:d});})},getRequests:()=>[...a],clearRequests:()=>a.length=0,approve(l){let d=n.get(l);d&&(d.resolve("approved"),n.delete(l));},reject(l,d){let T=n.get(l);T&&(T.resolve("rejected"),n.delete(l));},waitForRequest(l,d=5e3){let T=a.find(l);return T?Promise.resolve(T):new Promise((b,v)=>{let P=setTimeout(()=>{v(new Error("Timeout waiting for approval request"));},d);R.push({predicate:l,resolve:F=>{clearTimeout(P),b(F);}});})}}}function et(r={}){let{mockResponses:t,defaultMockResponse:u,...s}=r,i=Pe({responses:t,defaultResponse:u}),a=qe(),n=he({...s,runner:i.run,onApprovalRequest:R=>{a.handle(R),s.onApprovalRequest?.(R);}});return {...n,mockRunner:i,approvalSimulator:a,getCalls:()=>i.getCalls(),getApprovalRequests:()=>a.getRequests(),resetAll(){n.reset(),i.clearCalls(),a.clearRequests();}}}function tt(){let r=[];return {plugin:{name:"constraint-recorder",onRequirementCreated(t){r.push({constraintId:t.constraintId,triggered:true,requirement:t.requirement,facts:t.facts,timestamp:Date.now()});}},getSnapshots:()=>[...r],clearSnapshots:()=>r.length=0}}function rt(r,t){let u=r.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:s,max:i,exact:a}=t.tokenUsage;if(a!==void 0&&u.agent.tokenUsage!==a)throw new Error(`Expected token usage to be exactly ${a}, got ${u.agent.tokenUsage}`);if(s!==void 0&&u.agent.tokenUsage<s)throw new Error(`Expected token usage to be at least ${s}, got ${u.agent.tokenUsage}`);if(i!==void 0&&u.agent.tokenUsage>i)throw new Error(`Expected token usage to be at most ${i}, 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:s,max:i,exact:a}=t.conversationLength,n=u.conversation.length;if(a!==void 0&&n!==a)throw new Error(`Expected conversation length to be exactly ${a}, got ${n}`);if(s!==void 0&&n<s)throw new Error(`Expected conversation length to be at least ${s}, got ${n}`);if(i!==void 0&&n>i)throw new Error(`Expected conversation length to be at most ${i}, got ${n}`)}}function at(r=Date.now()){let t=r,u=r;return {now:()=>t,advance:s=>{t+=s;},set:s=>{t=s;},reset:()=>{t=u;}}}
13
13
  export{rt as assertOrchestratorState,qe as createApprovalSimulator,tt as createConstraintRecorder,Pe as createMockAgentRunner,et as createTestOrchestrator,at as createTimeController,Fe as testGuardrail,Ze as testGuardrailBatch};//# sourceMappingURL=testing.js.map
14
14
  //# sourceMappingURL=testing.js.map