@directive-run/ai 0.1.1
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/LICENSE +21 -0
- package/README.md +146 -0
- package/dist/anthropic.cjs +3 -0
- package/dist/anthropic.cjs.map +1 -0
- package/dist/anthropic.d.cts +103 -0
- package/dist/anthropic.d.ts +103 -0
- package/dist/anthropic.js +3 -0
- package/dist/anthropic.js.map +1 -0
- package/dist/index.cjs +78 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +4663 -0
- package/dist/index.d.ts +4663 -0
- package/dist/index.js +78 -0
- package/dist/index.js.map +1 -0
- package/dist/ollama.cjs +3 -0
- package/dist/ollama.cjs.map +1 -0
- package/dist/ollama.d.cts +47 -0
- package/dist/ollama.d.ts +47 -0
- package/dist/ollama.js +3 -0
- package/dist/ollama.js.map +1 -0
- package/dist/openai.cjs +3 -0
- package/dist/openai.cjs.map +1 -0
- package/dist/openai.d.cts +127 -0
- package/dist/openai.d.ts +127 -0
- package/dist/openai.js +3 -0
- package/dist/openai.js.map +1 -0
- package/dist/testing.cjs +14 -0
- package/dist/testing.cjs.map +1 -0
- package/dist/testing.d.cts +345 -0
- package/dist/testing.d.ts +345 -0
- package/dist/testing.js +14 -0
- package/dist/testing.js.map +1 -0
- package/dist/types-BKCdgKC-.d.cts +300 -0
- package/dist/types-BKCdgKC-.d.ts +300 -0
- package/package.json +83 -0
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
'use strict';var adapterUtils=require('@directive-run/core/adapter-utils'),core=require('@directive-run/core'),plugins=require('@directive-run/core/plugins');var Z=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}}};function Ot(e){return e instanceof Z}var ae="__agent",ge="__approval",Te="__conversation",Ce="__toolCalls",at={facts:{[ae]:core.t.any(),[ge]:core.t.any(),[Te]:core.t.any(),[Ce]:core.t.any()}};var it=1e5;function ut(e){if(typeof e=="string")return e;try{let t=new WeakSet,r=JSON.stringify(e,(s,n)=>{if(typeof n=="object"&&n!==null){if(t.has(n))return "[Circular]";t.add(n);}return n});return r.length>it?r.slice(0,it)+"...[truncated]":r}catch{return String(e)}}function Dt(e){let{patterns:t=[/\b\d{3}-\d{2}-\d{4}\b/g,/\b\d{16}\b/g,/\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b/gi],redact:r=false,redactReplacement:s="[REDACTED]"}=e;return n=>{let a=n.input,o=false;for(let c of t)c.lastIndex=0,c.test(a)&&(o=true,r&&(c.lastIndex=0,a=a.replace(c,s)));return o&&!r?{passed:false,reason:"Input contains PII"}:{passed:true,transformed:r&&o?a:void 0}}}function Nt(e){let{checkFn:t,message:r="Content flagged by moderation"}=e;return async s=>{let n="output"in s?typeof s.output=="string"?s.output:JSON.stringify(s.output):s.input,a=await t(n);return {passed:!a,reason:a?r:void 0}}}function Gt(e){let{maxTokensPerMinute:t=1e5,maxRequestsPerMinute:r=60}=e,s=Math.max(r,1e3),n=[],a=[],o=6e4;function c(l,d){let u=0,m=l.length;for(;u<m;){let f=u+m>>>1;(l[f]??0)<d?u=f+1:m=f;}return u}let i=(l,d)=>{let u=Date.now(),m=u-o,f=c(n,m);f>0&&(n=n.slice(f));let R=c(a,m);R>0&&(a=a.slice(R));let y=d.facts[ae]?.tokenUsage??0,h=n.length,g=a.length;return h+y>t?{passed:false,reason:"Token rate limit exceeded"}:g>=r?{passed:false,reason:"Request rate limit exceeded"}:(a.length<s&&a.push(u),n.length<s&&n.push(u),{passed:true})};return i.reset=()=>{n=[],a=[];},i}function Ft(e){let{allowlist:t,denylist:r,caseSensitive:s=false}=e,n=t?.map(o=>s?o:o.toLowerCase()),a=r?.map(o=>s?o:o.toLowerCase());return o=>{let c=s?o.toolCall.name:o.toolCall.name.toLowerCase();return n&&!n.includes(c)?{passed:false,reason:`Tool "${o.toolCall.name}" not in allowlist`}:a&&a.includes(c)?{passed:false,reason:`Tool "${o.toolCall.name}" is blocked`}:{passed:true}}}function _t(e){let{validate:t,errorPrefix:r="Output schema validation failed"}=e;return s=>{let n=t(s.output);return typeof n=="boolean"?{passed:n,reason:n?void 0:r}:n.valid?{passed:true}:{passed:false,reason:n.errors?.length?`${r}: ${n.errors.join("; ")}`:r}}}function jt(e){let{type:t,requiredFields:r=[],minLength:s,maxLength:n,minStringLength:a,maxStringLength:o}=e;return c=>{let i=c.output;switch(t){case "string":return typeof i!="string"?{passed:false,reason:`Expected string, got ${typeof i}`}:a!==void 0&&i.length<a?{passed:false,reason:`String too short: ${i.length} < ${a}`}:o!==void 0&&i.length>o?{passed:false,reason:`String too long: ${i.length} > ${o}`}:{passed:true};case "number":return typeof i!="number"||Number.isNaN(i)?{passed:false,reason:`Expected number, got ${typeof i}`}:{passed:true};case "boolean":return typeof i!="boolean"?{passed:false,reason:`Expected boolean, got ${typeof i}`}:{passed:true};case "object":if(typeof i!="object"||i===null||Array.isArray(i))return {passed:false,reason:`Expected object, got ${Array.isArray(i)?"array":typeof i}`};for(let l of r)if(!(l in i))return {passed:false,reason:`Missing required field: ${l}`};return {passed:true};case "array":return Array.isArray(i)?s!==void 0&&i.length<s?{passed:false,reason:`Array too short: ${i.length} < ${s}`}:n!==void 0&&i.length>n?{passed:false,reason:`Array too long: ${i.length} > ${n}`}:{passed:true}:{passed:false,reason:`Expected array, got ${typeof i}`};default:return {passed:false,reason:`Unknown type: ${t}`}}}}function $t(e){let{maxCharacters:t,maxTokens:r,estimateTokens:s=n=>Math.ceil(n.length/4)}=e;return n=>{let a=ut(n.output);if(t!==void 0&&a.length>t)return {passed:false,reason:`Output too long: ${a.length} characters (max: ${t})`};if(r!==void 0){let o=s(a);if(o>r)return {passed:false,reason:`Output too long: ~${o} tokens (max: ${r})`}}return {passed:true}}}function Bt(e){let{blockedPatterns:t,caseSensitive:r=false}=e;t.length===0&&console.warn("[Directive] createContentFilterGuardrail: blockedPatterns is empty \u2014 no content will be filtered");let s=t.map(n=>{if(n instanceof RegExp)return n;let a=n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return new RegExp(a,r?"g":"gi")});return n=>{let a=ut(n.output);for(let o of s)if(o.lastIndex=0,o.test(a))return {passed:false,reason:`Output contains blocked content matching: ${o.source}`};return {passed:true}}}function Lt(e){return e.status==="running"}function qt(e){return e.pending.length>0}function se(e,t){return e/1e6*t}var Ut=new Set(["http:","https:"]);function Ht(e){try{let t=new URL(e);if(!Ut.has(t.protocol))throw new Error(`[Directive] Invalid baseURL protocol "${t.protocol}" \u2013 only http: and https: are allowed`)}catch(t){throw t instanceof Error&&t.message.startsWith("[Directive]")?t:new Error(`[Directive] Invalid baseURL "${e}" \u2013 must be a valid URL (e.g. "https://api.openai.com/v1")`)}}function zt(e){let{fetch:t=globalThis.fetch,buildRequest:r,parseResponse:s,parseOutput:n,hooks:a}=e,c=n??(i=>{try{return JSON.parse(i)}catch{return i}});return async(i,l,d)=>{let u=Date.now();a?.onBeforeCall?.({agent:i,input:l,timestamp:u});let m=[{role:"user",content:l}];try{let{url:f,init:R}=r(i,l,m),b=d?.signal?{...R,signal:d.signal}:R,v=await t(f,b);if(!v.ok){let S=await v.text().catch(()=>"");throw new Error(`[Directive] AgentRunner request failed: ${v.status} ${v.statusText}${S?` \u2013 ${S.slice(0,300)}`:""}`)}let y=await s(v,m),h={inputTokens:y.inputTokens??0,outputTokens:y.outputTokens??0},g={role:"assistant",content:y.text},T=[...m,g];d?.onMessage?.(g);let E=Date.now()-u;return a?.onAfterCall?.({agent:i,input:l,output:y.text,totalTokens:y.totalTokens,tokenUsage:h,durationMs:E,timestamp:Date.now()}),{output:c(y.text),messages:T,toolCalls:[],totalTokens:y.totalTokens,tokenUsage:h}}catch(f){let R=Date.now()-u;throw f instanceof Error&&a?.onError?.({agent:i,input:l,error:f,durationMs:R,timestamp:Date.now()}),f}}}function Wt(){return {when(e){return {require(t){let r=0,s={priority(n){return r=n,s},build(){return {when:e,require:t,priority:r}}};return s}}}}}function Vt(e){return {require(t){return {when:e,require:t,priority:0,withPriority(r){return {when:e,require:t,priority:r}}}}}}function pe(e,t){let r=typeof e.content=="string"?e.content:JSON.stringify(e.content);return Math.ceil(r.length/4)}function _e(e,t){return e.reduce((r,s)=>r+pe(s),0)}function ke(e={}){return (t,r={})=>{let s={...e,...r},n=s.maxMessages??100,a=s.preserveRecentCount??5;if(t.length<=n)return {keep:[...t],toSummarize:[],estimatedTokens:_e(t)};let o=t.slice(-a),c=t.slice(0,-a),i=Math.max(0,n-a),l=c.slice(-i),d=c.slice(0,-i||void 0),u=[...l,...o];return {keep:u,toSummarize:d.length>0?d:[],estimatedTokens:_e(u)}}}function ct(e={}){return (t,r={})=>{let s={...e,...r},n=s.maxTokens??4e3,a=s.preserveRecentCount??5,o=s.countSystemMessages??true,c=t.slice(-a),i=t.slice(0,-a),l=c.reduce((f,R)=>!o&&R.role==="system"?f:f+pe(R),0),d=[],u=[],m=l;for(let f=i.length-1;f>=0;f--){let R=i[f],b=!o&&R.role==="system"?0:pe(R);if(m+b<=n)d.unshift(R),m+=b;else {u.push(...i.slice(0,f+1));break}}return {keep:[...d,...c],toSummarize:u,estimatedTokens:m}}}function Jt(e={}){let t=ke(e),r=ct(e);return (s,n={})=>{let a={...e,...n},o=t(s,a),c=r(s,a);return o.keep.length<=c.keep.length?o:c}}function je(e){let{strategy:t,summarizer:r,strategyConfig:s={},autoManage:n=false,onMemoryManaged:a,onManageError:o,maxContextTokens:c}=e,i={messages:[],summaries:[],totalMessagesProcessed:0,estimatedTokens:0},l=false;async function d(){if(l)return {messagesBefore:i.messages.length,messagesAfter:i.messages.length,messagesSummarized:0,estimatedTokensBefore:i.estimatedTokens,estimatedTokensAfter:i.estimatedTokens};l=true;try{let m=i.messages.length,f=i.estimatedTokens,R=t(i.messages,s);if(R.toSummarize.length===0)return {messagesBefore:m,messagesAfter:m,messagesSummarized:0,estimatedTokensBefore:f,estimatedTokensAfter:R.estimatedTokens};let b;r&&R.toSummarize.length>0&&(b=await r(R.toSummarize),i.summaries.push({content:b,messagesCount:R.toSummarize.length,createdAt:Date.now()})),i.messages=R.keep,i.estimatedTokens=R.estimatedTokens;let v={messagesBefore:m,messagesAfter:i.messages.length,messagesSummarized:R.toSummarize.length,summary:b,estimatedTokensBefore:f,estimatedTokensAfter:R.estimatedTokens};return a?.(v),v}finally{l=false;}}function u(){if(l)return;t(i.messages,s).toSummarize.length>0&&d().catch(f=>{let R=f instanceof Error?f:new Error(String(f));o?o(R):console.error("[Directive Memory] Auto-manage error:",R);});}return {getState(){return {...i,messages:[...i.messages],summaries:i.summaries.map(m=>({...m}))}},addMessage(m){i.messages.push(m),i.totalMessagesProcessed++,i.estimatedTokens+=pe(m),n&&u();},addMessages(m){for(let f of m)i.messages.push(f),i.totalMessagesProcessed++,i.estimatedTokens+=pe(f);n&&u();},getContextMessages(){let m=[];if(i.summaries.length>0){let f=i.summaries.map(R=>R.content).join(`
|
|
2
|
+
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
`);m.push({role:"system",content:`[Previous conversation summary]
|
|
6
|
+
|
|
7
|
+
${f}`});}if(m.push(...i.messages),c){let f=_e(m);f>c&&console.warn(`[Directive Memory] Context messages (${f} tokens) exceed maxContextTokens (${c}). Consider calling manage() or reducing message count.`);}return m},manage:d,isManaging(){return l},clear(){i={messages:[],summaries:[],totalMessagesProcessed:0,estimatedTokens:0};},export(){return {...i,messages:[...i.messages],summaries:i.summaries.map(m=>({...m}))}},import(m){i={...m,messages:[...m.messages],summaries:m.summaries.map(f=>({...f}))};}}}function Kt(e=500){return async t=>{let r=t.filter(s=>s.role!=="system").map(s=>{let n=typeof s.content=="string"?s.content:JSON.stringify(s.content);return `${s.role}: ${n.slice(0,100)}${n.length>100?"...":""}`}).join(`
|
|
8
|
+
`);return r.length<=e?r:r.slice(0,e)+`
|
|
9
|
+
[truncated]`}}function Xt(){return async e=>{let t=[];for(let r of e)if(r.role==="user"){let n=(typeof r.content=="string"?r.content:JSON.stringify(r.content)).match(/[^.!?]*\?/g);n&&t.push(...n.map(a=>`Q: ${a.trim()}`));}return t.length===0?`[${e.length} messages processed - no key questions found]`:`Key topics discussed:
|
|
10
|
+
${t.join(`
|
|
11
|
+
`)}`}}function Qt(e,t={}){let{maxSummaryLength:r=500,preserveKeyFacts:s=true}=t;return async n=>{let a=n.filter(c=>c.role!=="system").map(c=>{let i=typeof c.content=="string"?c.content:JSON.stringify(c.content);return `${c.role.toUpperCase()}: ${i}`}).join(`
|
|
12
|
+
|
|
13
|
+
`),o=`Summarize the following conversation in ${r} characters or less.
|
|
14
|
+
${s?"Preserve key facts, decisions, and action items.":""}
|
|
15
|
+
Focus on information that would be useful context for continuing the conversation.
|
|
16
|
+
|
|
17
|
+
CONVERSATION:
|
|
18
|
+
${a}
|
|
19
|
+
|
|
20
|
+
SUMMARY:`;return e(o)}}var $e=class{buffer=[];maxSize;strategy;pullWaiters=[];pushWaiters=[];closed=false;droppedCount=0;constructor(t="buffer",r=1e3){this.strategy=t,this.maxSize=r;}async push(t){if(this.closed)return false;let r=this.pullWaiters.shift();if(r)return r(t),true;if(this.buffer.length>=this.maxSize)switch(this.strategy){case "drop":return this.droppedCount++,false;case "block":if(await new Promise(s=>{this.pushWaiters.push(s);}),this.closed)return false;break;}return this.buffer.push(t),true}async pull(){let t=this.pushWaiters.shift();return t&&t(),this.buffer.length>0?this.buffer.shift():this.closed?null:new Promise(r=>{this.pullWaiters.push(r);})}close(){this.closed=true;for(let t of this.pullWaiters)t(null);this.pullWaiters=[];for(let t of this.pushWaiters)t();this.pushWaiters=[];}getDroppedCount(){return this.droppedCount}};function Be(e,t={}){let{streamingGuardrails:r=[]}=t;return (s,n,a={})=>{let{signal:o,backpressure:c="buffer",bufferSize:i=1e3,guardrailCheckInterval:l=50,stopOnGuardrail:d=true}=a;if(l<=0||!Number.isFinite(l))throw new Error(`[Directive Streaming] guardrailCheckInterval must be a positive number, got ${l}`);let u=new $e(c,i),m=new AbortController,f="",R=0,b=false,v=Date.now(),y;o&&(y=()=>m.abort(),o.addEventListener("abort",y));let h=()=>{y&&o&&o.removeEventListener("abort",y);};async function g(){for(let S of r)try{let p=await S.check(f,R);if(!p.passed){let w=S.stopOnFail!==!1,C={type:"guardrail_triggered",guardrailName:S.name,reason:p.reason??"Guardrail check failed",partialOutput:f,stopped:w};return await u.push(C),w&&(typeof d=="function"?d:()=>d)(C)&&(b=!0,m.abort()),C}}catch(p){console.error(`Streaming guardrail "${S.name}" error:`,p);}return null}let T=(async()=>{await u.push({type:"progress",phase:"starting",message:"Starting agent"});try{let S=await e(s,n,{signal:m.signal,onToken:async C=>{b||(R++,f+=C,await u.push({type:"token",data:C,tokenCount:R}),R%l===0&&await g());},onToolStart:async(C,x,M)=>{await u.push({type:"progress",phase:"tool_calling",message:`Calling ${C}`}),await u.push({type:"tool_start",tool:C,toolCallId:x,arguments:M});},onToolEnd:async(C,x,M)=>{await u.push({type:"tool_end",tool:C,toolCallId:x,result:M}),await u.push({type:"progress",phase:"generating",message:"Continuing generation"});},onMessage:async C=>{await u.push({type:"message",message:C});}});await g();let p=Date.now()-v,w=u.getDroppedCount();return await u.push({type:"done",totalTokens:S.totalTokens,duration:p,droppedTokens:w}),u.close(),S}catch(S){let p={type:"error",error:S instanceof Error?S:new Error(String(S)),partialOutput:f||void 0};throw await u.push(p),u.close(),S}finally{h();}})();return {stream:{[Symbol.asyncIterator](){return {async next(){let S=await u.pull();return S===null?{done:true,value:void 0}:{done:false,value:S}}}}},result:T,abort:()=>m.abort()}}}function Yt(e){let{checkFn:t,threshold:r=.8,stopOnFail:s=true}=e;return {name:"toxicity-streaming",stopOnFail:s,async check(n){let a=await t(n);return a>r?{passed:false,reason:`Toxicity score ${a.toFixed(2)} exceeds threshold ${r}`,severity:"critical"}:{passed:true}}}}function Zt(e){let{maxTokens:t,warnAt:r,stopOnFail:s=true}=e,n=new Set;return {name:"length-streaming",stopOnFail:s,check(a,o){let c=`${a.length}-${o}`;if(o>=t)return {passed:false,reason:`Output exceeded maximum length of ${t} tokens`,severity:"error"};if(r&&o>=r&&!n.has(c)){if(n.add(c),n.size>100){let i=n.values().next().value;i&&n.delete(i);}return {passed:true,warning:`Approaching maximum length: ${o}/${t} tokens`,severity:"warning"}}return {passed:true}}}}function er(e){let{patterns:t,stopOnFail:r=true}=e;return {name:"pattern-streaming",stopOnFail:r,check(s){for(let{regex:n,name:a}of t)if(n.test(s))return {passed:false,reason:`Detected ${a} pattern in output`,severity:"error"};return {passed:true}}}}function tr(e,t={}){let{name:r="combined-streaming",stopOnFirstFail:s=true}=t;return {name:r,stopOnFail:s,async check(n,a){for(let o of e){let c=await o.check(n,a);if(!c.passed&&s)return {...c,reason:`[${o.name}] ${c.reason}`}}return {passed:true}}}}function rr(e,t,r={}){let{minTokens:s=0,stopOnFail:n=true}=r;return {name:e,stopOnFail:n,async check(a,o){if(o<s)return {passed:true};let c=await t({output:a,agentName:"streaming",input:"",messages:[]},{agentName:"streaming",input:"",facts:{}});return {passed:c.passed,reason:c.reason,severity:c.passed?void 0:"error"}}}}async function nr(e){let t="";for await(let r of e)r.type==="token"&&(t+=r.data);return t}async function*sr(e,t){for await(let r of e)await t(r),yield r;}async function*or(e,t){let r=new Set(t);for await(let s of e)r.has(s.type)&&(yield s);}async function*ar(e,t){for await(let r of e)yield await t(r);}var me=class{count;maxPermits;queue=[];constructor(t){this.maxPermits=t,this.count=t;}async acquire(){return this.count>0?(this.count--,()=>this.release()):new Promise((t,r)=>{this.queue.push({resolve:s=>t(s),reject:r});})}release(){this.count++;let t=this.queue.shift();t&&(this.count--,t.resolve(()=>this.release()));}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"),r=this.queue.splice(0,this.queue.length);for(let s of r)s.reject(t);this.count=this.maxPermits;}};function Le(e){let{runner:t,agents:r,patterns:s={},onHandoff:n,onHandoffComplete:a,maxHandoffHistory:o=1e3}=e,c=new Set(Object.keys(r)),i=[];for(let[S,p]of Object.entries(s)){let w=[];switch(p.type){case "parallel":w.push(...p.agents);break;case "sequential":w.push(...p.agents);break;case "supervisor":w.push(p.supervisor,...p.workers);break}for(let C of w)c.has(C)||i.push({patternId:S,agentId:C});}if(i.length>0){let S=i.map(({patternId:p,agentId:w})=>` - Pattern "${p}" references unknown agent "${w}"`).join(`
|
|
21
|
+
`);throw new Error(`[Directive MultiAgent] Pattern validation failed. The following agents are not registered:
|
|
22
|
+
${S}
|
|
23
|
+
|
|
24
|
+
Registered agents: ${[...c].join(", ")||"(none)"}`)}let l=new Map,d={};for(let S of Object.keys(r)){let p=r[S]?.maxConcurrent??1;d[S]={status:"idle",runCount:0,totalTokens:0},l.set(S,new me(p));}let m=[],R=0;async function b(S){let p=l.get(S);if(!p)throw new Error(`Unknown agent: ${S}`);return p.acquire()}function v(S){}async function y(S,p,w){let C=r[S];if(!C)throw new Error(`Unknown agent: ${S}`);let x=await b(S),M=d[S];M.status="running",M.lastInput=p;let L=new AbortController,A,P;try{C.timeout&&(A=setTimeout(()=>L.abort(),C.timeout)),w?.signal&&(P=()=>L.abort(),w.signal.addEventListener("abort",P));let O=await t(C.agent,p,{...C.runOptions,...w,signal:L.signal});return M.status="completed",M.lastOutput=O.output,M.runCount++,M.totalTokens+=O.totalTokens,O}catch(O){throw M.status="error",M.lastError=O instanceof Error?O.message:String(O),O}finally{A&&clearTimeout(A),P&&w?.signal&&w.signal.removeEventListener("abort",P),x();}}async function h(S,p){let w=new AbortController,C;S.timeout&&(C=setTimeout(()=>w.abort(),S.timeout));try{let x=S.agents.map(A=>y(A,p,{signal:w.signal}).catch(P=>{if(S.minSuccess===void 0)throw P;return null})),L=(await Promise.all(x)).filter(A=>A!==null);if(S.minSuccess&&L.length<S.minSuccess)throw new Error(`Not enough successful results: ${L.length}/${S.minSuccess}`);return S.merge(L)}finally{C&&clearTimeout(C);}}async function g(S,p){let w=p,C;for(let x=0;x<S.agents.length;x++){let M=S.agents[x];try{C=await y(M,w),x<S.agents.length-1&&(S.transform?w=S.transform(C.output,M,x):w=typeof C.output=="string"?C.output:JSON.stringify(C.output));}catch(L){if(!S.continueOnError)throw L}}if(!C)throw new Error("No successful results in sequential pattern");return S.extract?S.extract(C.output):C.output}async function T(S,p){let w=[],C=S.maxRounds??5,x=await y(S.supervisor,p);for(let M=0;M<C;M++){let L=x.output;if(L.action==="complete"||!L.worker)break;if(!S.workers.includes(L.worker))throw new Error(`Invalid worker: ${L.worker}`);let A=await y(L.worker,L.workerInput??"");w.push(A),x=await y(S.supervisor,`Worker ${L.worker} completed with result: ${JSON.stringify(A.output)}`);}return S.extract?S.extract(x.output,w):x.output}let E={runAgent:y,async runPattern(S,p){let w=s[S];if(!w)throw new Error(`Unknown pattern: ${S}`);switch(w.type){case "parallel":return h(w,p);case "sequential":return g(w,p);case "supervisor":return T(w,p);default:throw new Error(`Unknown pattern type: ${w.type}`)}},async runParallel(S,p,w){let C=Array.isArray(p)?p:S.map(()=>p);if(C.length!==S.length)throw new Error("Input count must match agent count");let x=S.map((L,A)=>y(L,C[A])),M=await Promise.all(x);return w(M)},async runSequential(S,p,w){let C=[],x=p;for(let M=0;M<S.length;M++){let L=S[M],A=await y(L,x);C.push(A),M<S.length-1&&(w?.transform?x=w.transform(A.output,L,M):x=typeof A.output=="string"?A.output:JSON.stringify(A.output));}return C},async handoff(S,p,w,C){let x={id:`handoff-${++R}`,fromAgent:S,toAgent:p,input:w,context:C,requestedAt:Date.now()};m.push(x),n?.(x);try{let M=await y(p,w),L={request:x,result:M,completedAt:Date.now()};v(L),a?.(L);let A=m.indexOf(x);return A>=0&&m.splice(A,1),M}catch(M){let L=m.indexOf(x);throw L>=0&&m.splice(L,1),M}},getAgentState(S){return d[S]},getAllAgentStates(){return {...d}},getPendingHandoffs(){return [...m]},reset(){for(let S of Object.keys(r)){let p=r[S]?.maxConcurrent??1;d[S]={status:"idle",runCount:0,totalTokens:0};let w=l.get(S);w&&w.drain(),l.set(S,new me(p));}m.length=0;},dispose(){E.reset();}};return E}function ir(e,t,r){return {type:"parallel",agents:e,merge:t,...r}}function ur(e,t){return {type:"sequential",agents:e,...t}}function cr(e,t,r){return {type:"supervisor",supervisor:e,workers:t,...r}}function lr(e,t,r,s){return {when:e,select:t,input:r,priority:s}}function dr(e,t,r){return {type:"RUN_AGENT",agent:e,input:t,context:r}}function gr(e,t=`
|
|
25
|
+
|
|
26
|
+
`){return e.map(r=>typeof r.output=="string"?r.output:JSON.stringify(r.output)).join(t)}function pr(e,t){if(e.length===0)throw new Error("No results to pick from");return e.reduce((r,s)=>t(s)>t(r)?s:r)}function mr(e){return e.map(t=>t.output)}function fr(e){return e.reduce((t,r)=>t+r.totalTokens,0)}function fe(){return globalThis.crypto?.randomUUID?.()??`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,11)}`}function qe(e={}){let{maxHistory:t=1e3,defaultTtlMs:r=36e5,maxPendingPerAgent:s=100,persistence:n,onDelivery:a,onDeliveryError:o}=e,c=new Map,i=[],l=new Map,d=new Map;function u(b,v){if(v.types&&!v.types.includes(b.type)||v.from&&!(Array.isArray(v.from)?v.from:[v.from]).includes(b.from))return false;if(v.topics){let y=b.topic;if(y&&!v.topics.includes(y))return false}return !(v.priority&&b.priority&&!v.priority.includes(b.priority)||v.custom&&!v.custom(b))}function m(b){return b.ttlMs?Date.now()-b.timestamp>b.ttlMs:false}function f(b){return b.to==="*"?Array.from(c.keys()):Array.isArray(b.to)?b.to:[b.to]}async function R(b){if(m(b))return;let v=f(b),y=[],h=[];for(let g of v){let T=c.get(g)??[];if(T.length===0){let E=d.get(g)??[];for(E.push(b);E.length>s;)E.shift();d.set(g,E);continue}for(let E of T)(!E.filter||u(b,E.filter))&&h.push(Promise.resolve(E.handler(b)).then(()=>{y.push(g);},S=>{o?.(b,S instanceof Error?S:new Error(String(S)));}));}h.length>0&&await Promise.allSettled(h),y.length>0&&a?.(b,y),n&&await n.save(b);}return {publish(b){let v={...b,id:fe(),timestamp:Date.now(),priority:b.priority??"normal",ttlMs:b.ttlMs??r};for(i.push(v),l.set(v.id,v);i.length>t;){let y=i.shift();y&&l.delete(y.id);}return R(v).catch(y=>{let h=y instanceof Error?y:new Error(String(y));o?o(v,h):console.error("[Directive MessageBus] Delivery error:",h);}),v.id},subscribe(b,v,y){let h=fe(),g={id:h,agentId:b,handler:v,filter:y,unsubscribe:()=>{let S=c.get(b)??[],p=S.findIndex(w=>w.id===h);p>=0&&S.splice(p,1);}},T=c.get(b)??[];T.push(g),c.set(b,T);let E=d.get(b)??[];d.delete(b);for(let S of E)if(!y||u(S,y)){let p=v(S);p instanceof Promise&&p.catch(w=>{let C=w instanceof Error?w:new Error(String(w));o?o(S,C):console.error("[Directive MessageBus] Pending delivery error:",C);});}return g},getHistory(b,v=100){let y=i.filter(h=>!m(h));return b&&(y=y.filter(h=>u(h,b))),y.slice(-v)},getMessage(b){let v=l.get(b);if(!(v&&m(v)))return v},getPending(b){return (d.get(b)??[]).filter(y=>!m(y))},clear(){i.length=0,l.clear(),d.clear();},dispose(){i.length=0,l.clear(),d.clear(),c.clear();}}}function yr(e){let{bus:t,agents:r={},defaultTimeout:s=3e4,onAgentOnline:n,onAgentOffline:a}=e,o=new Map,c=new Map;for(let[l,d]of Object.entries(r))o.set(l,{...d,id:l,status:"offline",lastSeen:Date.now()});function i(l){if(l.type!=="RESPONSE"&&l.type!=="DELEGATION_RESULT")return;let d=l.correlationId??l.replyTo;if(!d)return;let u=c.get(d);u&&(clearTimeout(u.timer),c.delete(d),u.resolve(l));}return {register(l,d){let u=!o.has(l)||o.get(l)?.status==="offline";o.set(l,{...d,id:l,status:"online",lastSeen:Date.now()}),u&&n?.(l);},unregister(l){let d=o.get(l);d&&(d.status="offline",a?.(l));},getAgent(l){return o.get(l)},getAgents(){return Array.from(o.values())},findByCapability(l){return Array.from(o.values()).filter(d=>d.capabilities.includes(l)&&d.status==="online")},send(l,d,u){let m=o.get(l);return m&&(m.lastSeen=Date.now(),m.status="online"),t.publish({...u,from:l,to:d,type:u.type??"CUSTOM"})},async request(l,d,u,m,f=s){return new Promise((R,b)=>{let v=fe(),y=t.subscribe(l,g=>{(g.correlationId===v||g.replyTo===v)&&(y.unsubscribe(),i(g));},{types:["RESPONSE"]}),h=setTimeout(()=>{y.unsubscribe(),c.delete(v),b(new Error(`[Directive Communication] Request timeout after ${f}ms`));},f);c.set(v,{resolve:R,reject:b,timer:h}),t.publish({type:"REQUEST",from:l,to:d,action:u,payload:m,timeout:f,correlationId:v});})},async delegate(l,d,u,m){return new Promise((f,R)=>{let b=fe(),v=t.subscribe(l,h=>{(h.correlationId===b||h.replyTo===b)&&(v.unsubscribe(),i(h));},{types:["DELEGATION_RESULT"]}),y=setTimeout(()=>{v.unsubscribe(),c.delete(b),R(new Error(`[Directive Communication] Delegation timeout after ${s}ms`));},s);c.set(b,{resolve:f,reject:R,timer:y}),t.publish({type:"DELEGATION",from:l,to:d,task:u,context:m,correlationId:b});})},async query(l,d,u,m){return new Promise((f,R)=>{let b=fe(),v=t.subscribe(l,h=>{(h.correlationId===b||h.replyTo===b)&&(v.unsubscribe(),i(h));},{types:["RESPONSE"]}),y=setTimeout(()=>{v.unsubscribe(),c.delete(b),R(new Error(`[Directive Communication] Query timeout after ${s}ms`));},s);c.set(b,{resolve:f,reject:R,timer:y}),t.publish({type:"QUERY",from:l,to:d,question:u,context:m,correlationId:b});})},broadcast(l,d){return t.publish({...d,from:l,to:"*",type:d.type??"INFORM"})},listen(l,d,u){let m=o.get(l);return m&&(m.status="online",m.lastSeen=Date.now(),n?.(l)),t.subscribe(l,d,u)},getBus(){return t},dispose(){for(let[,l]of c)clearTimeout(l.timer);c.clear(),o.clear();}}}function hr(e,t){let r=new Map,s=e.listen(t,async n=>{if(n.type==="REQUEST"){let a=n,o=r.get(a.action),c;if(o)try{let i=await o(a.payload);c={type:"RESPONSE",success:i.success,result:i.result,error:i.error};}catch(i){c={type:"RESPONSE",success:false,error:i instanceof Error?i.message:String(i)};}else c={type:"RESPONSE",success:false,error:`Unknown action: ${a.action}`};e.send(t,n.from,{...c,correlationId:n.correlationId??n.id,replyTo:n.correlationId??n.id});}},{types:["REQUEST"]});return {onRequest(n,a){r.set(n,a);},offRequest(n){r.delete(n);},dispose(){s.unsubscribe(),r.clear();}}}function br(e,t){let r=null,s=e.listen(t,async n=>{if(n.type==="DELEGATION"&&r){let a=n,o=Date.now(),c;try{let i=await r(a.task,a.context);c={type:"DELEGATION_RESULT",success:i.success,result:i.result,error:i.error,metrics:i.metrics??{durationMs:Date.now()-o}};}catch(i){c={type:"DELEGATION_RESULT",success:false,error:i instanceof Error?i.message:String(i),metrics:{durationMs:Date.now()-o}};}e.send(t,n.from,{...c,correlationId:n.correlationId??n.id,replyTo:n.correlationId??n.id});}},{types:["DELEGATION"]});return {onDelegation(n){r=n;},offDelegation(){r=null;},dispose(){s.unsubscribe(),r=null;}}}function Rr(e,t){let r=new Map,s=e.listen(t,n=>{if(n.type==="UPDATE"){let a=n,o=r.get(a.topic)??[];for(let c of o)c(a.content);}},{types:["UPDATE"]});return {subscribe(n,a){let o=new Map;for(let c of n){let i=r.get(c)??[],l=d=>a(c,d);o.set(c,l),i.push(l),r.set(c,i);}return e.broadcast(t,{type:"SUBSCRIBE",topics:n}),()=>{for(let[c,i]of o){let l=r.get(c);if(l){let d=l.indexOf(i);d>=0&&l.splice(d,1),l.length===0&&r.delete(c);}}o.clear(),e.broadcast(t,{type:"UNSUBSCRIBE",topics:n});}},publish(n,a){e.broadcast(t,{type:"UPDATE",topic:n,content:a});},dispose(){s.unsubscribe(),r.clear();}}}var vr=[{type:"ssn",pattern:/\b(\d{3}[-\s]?\d{2}[-\s]?\d{4})\b/g,validate:e=>{let t=e.replace(/[-\s]/g,"");return !(t.startsWith("000")||t.startsWith("666")||t.startsWith("9")||t.slice(3,5)==="00"||t.slice(5)==="0000")},confidence:.95},{type:"credit_card",pattern:/\b(\d{4}[-\s]?\d{4}[-\s]?\d{4}[-\s]?\d{4})\b|\b(\d{15,16})\b/g,validate:e=>{let t=e.replace(/[-\s]/g,"");if(t.length<13||t.length>19)return false;let r=0,s=false;for(let n=t.length-1;n>=0;n--){let a=t[n];if(!a)continue;let o=Number.parseInt(a,10);s&&(o*=2,o>9&&(o-=9)),r+=o,s=!s;}return r%10===0},confidence:.95},{type:"email",pattern:/\b([A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,})\b/gi,confidence:.9},{type:"phone",pattern:/\b(\+?1?[-.\s]?\(?[0-9]{3}\)?[-.\s]?[0-9]{3}[-.\s]?[0-9]{4})\b/g,validate:e=>{let t=e.replace(/\D/g,"");return t.length>=10&&t.length<=11},confidence:.8},{type:"date_of_birth",pattern:/\b(born|dob|birth.?date|date.?of.?birth)[:.\s]+(\d{1,4}[-/]\d{1,2}[-/]\d{1,4})\b/gi,confidence:.85},{type:"ip_address",pattern:/\b(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\b/g,validate:e=>e.split(".").every(r=>{let s=Number.parseInt(r,10);return s>=0&&s<=255}),confidence:.9},{type:"bank_account",pattern:/\b(account|acct)[\s#:]+(\d{8,17})\b/gi,confidence:.7},{type:"passport",pattern:/\b(passport)[\s#:]+([A-Z0-9]{6,9})\b/gi,confidence:.75},{type:"driver_license",pattern:/\b(driver'?s?\s*licen[cs]e|dl)[\s#:]+([A-Z0-9]{5,15})\b/gi,confidence:.7},{type:"medical_id",pattern:/\b(mrn|medical.?record|patient.?id)[\s#:]+([A-Z0-9-]{6,15})\b/gi,confidence:.7}];function wr(e){let t=[],r="street|st|avenue|ave|road|rd|drive|dr|lane|ln|court|ct|way|boulevard|blvd|circle|cir|place|pl",s=new RegExp(`\\b(\\d{1,5}\\s+(?:\\w+\\s+){1,4}(?:${r})\\b[^\\n]{0,50}\\b[A-Z]{2}\\s+\\d{5}(?:-\\d{4})?)\\b`,"gi"),n;for(;(n=s.exec(e))!==null;)t.push({type:"address",value:n[0],position:{start:n.index,end:n.index+n[0].length},confidence:.7});return t}var lt=["mr","mrs","ms","miss","dr","prof","sir","madam","name is","called","known as","signed by","from","dear","hi","hello","contact","recipient"];function Sr(e){let t=[],r=lt.join("|"),s=new RegExp(`\\b(${r})[.,:]?\\s+([A-Z][a-z]{1,20}(?:\\s[A-Z][a-z]{1,20}){0,2})\\b`,"gi"),n;for(;(n=s.exec(e))!==null;){let a=n[2],o=n[1];a&&(a.split(/\s+/).length>=2||o&<.some(c=>o.toLowerCase().includes(c)))&&t.push({type:"name",value:a,position:{start:n.index,end:n.index+n[0].length},confidence:.6,context:n[0]});}return t}var dt=1e5,xe={name:"regex",async detect(e,t){if(e.length>dt)throw new Error(`[Directive] Input exceeds maximum length of ${dt} characters for PII detection. Truncate input or process in chunks.`);let r=[],s=new Set(t);for(let n of vr){if(!s.has(n.type))continue;let a=new RegExp(n.pattern.source,n.pattern.flags),o;for(;(o=a.exec(e))!==null;){let c=o[1]||o[0],i=e.slice(Math.max(0,o.index-20),o.index+c.length+20);n.validate&&!n.validate(c,i)||r.push({type:n.type,value:c,position:{start:o.index,end:o.index+c.length},confidence:n.confidence,context:i});}}return s.has("address")&&r.push(...wr(e)),s.has("name")&&r.push(...Sr(e)),r}};function Ee(e,t,r="typed"){let s=[...t].sort((a,o)=>o.position.start-a.position.start),n=e;for(let a of s){let o;switch(r){case "placeholder":o="[REDACTED]";break;case "typed":o=`[${a.type.toUpperCase()}]`;break;case "masked":o="*".repeat(a.value.length);break;case "hashed":o=`[HASH:${Ar(a.value)}]`;break}n=n.slice(0,a.position.start)+o+n.slice(a.position.end);}return n}function Ar(e){let s=2166136261;for(let n=0;n<e.length;n++)s^=e.charCodeAt(n),s=Math.imul(s,16777619);return (s>>>0).toString(16).padStart(8,"0")}var gt=["ssn","credit_card","email","phone","date_of_birth","bank_account"];function pt(e={}){let{types:t=gt,detector:r="regex",redact:s=false,redactionStyle:n="typed",minConfidence:a=.7,onDetected:o,allowlist:c=[],minItemsToBlock:i=1,detectorTimeout:l=5e3}=e,d=r==="regex"?xe:r,u=new Set(c.map(f=>f.toLowerCase().trim()));async function m(f,R){if(d===xe)return d.detect(f,R);let b;try{return await Promise.race([d.detect(f,R),new Promise((v,y)=>{b=setTimeout(()=>y(new Error(`[Directive] PII detector '${d.name}' timed out after ${l}ms`)),l);})])}finally{clearTimeout(b);}}return async f=>{let b=(await m(f.input,t)).filter(v=>!(v.confidence<a||u.has(v.value.toLowerCase().trim())));if(b.length>0&&o?.(b),b.length>=i){if(s)return {passed:true,transformed:Ee(f.input,b,n)};let v={};for(let h of b)v[h.type]=(v[h.type]||0)+1;return {passed:false,reason:`PII detected (${Object.entries(v).map(([h,g])=>`${h}: ${g}`).join(", ")})`}}return {passed:true}}}function Tr(e={}){let t=pt(e);return async(r,s)=>{let n=typeof r.output=="string"?r.output:JSON.stringify(r.output);return t({input:n,agentName:r.agentName},s)}}async function Ue(e,t={}){let{types:r=gt,detector:s="regex",minConfidence:n=.7,timeout:a=5e3}=t,o=s==="regex"?xe:s,c;if(o===xe)c=await o.detect(e,r);else {let d;try{c=await Promise.race([o.detect(e,r),new Promise((u,m)=>{d=setTimeout(()=>m(new Error(`[Directive] PII detector '${o.name}' timed out after ${a}ms`)),a);})]);}finally{clearTimeout(d);}}let i=c.filter(d=>d.confidence>=n),l={};for(let d of i)l[d.type]=(l[d.type]||0)+1;return {detected:i.length>0,items:i,typeCounts:l}}var Cr=1e4,kr=10080*60*1e3,xr=6e4,mt="0".repeat(64);function Er(){return globalThis.crypto?.randomUUID?.()??`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,11)}`}function Mr(e){return new TextEncoder().encode(e)}function Pr(e){return Array.from(e).map(t=>t.toString(16).padStart(2,"0")).join("")}async function ft(e){let t=Mr(e),r=await globalThis.crypto.subtle.digest("SHA-256",t);return Pr(new Uint8Array(r))}function yt(e){let{id:t,timestamp:r,eventType:s,previousHash:n,payload:a,actorId:o,sessionId:c}=e;return JSON.stringify({id:t,timestamp:r,eventType:s,previousHash:n,payload:a,actorId:o,sessionId:c})}function Ir(e){return JSON.parse(JSON.stringify(e))}async function Or(e,t){let r=Ir(e);async function s(n){if(typeof n=="string"){let a=await Ue(n,{types:t.types,minConfidence:t.minConfidence??.7});if(a.detected){let o=t.allowlist?a.items.filter(c=>!t.allowlist.includes(c.value.toLowerCase())):a.items;if(o.length>0)return Ee(n,o,t.redactionStyle)}return n}if(Array.isArray(n))return Promise.all(n.map(s));if(n&&typeof n=="object"){let a={};for(let[o,c]of Object.entries(n))a[o]=await s(c);return a}return n}for(let[n,a]of Object.entries(r))r[n]=await s(a);return r}function Dr(e={}){let{maxEntries:t=Cr,retentionMs:r=kr,exportInterval:s=xr,exporter:n,piiMasking:a,signing:o,sessionId:c,actorId:i,events:l={}}=e,d=[],u=0,m=0,f=0,R=true,b;function v(){return d.length===0?mt:d[d.length-1].hash}async function y(h,g,T){let E={id:Er(),timestamp:Date.now(),eventType:h,previousHash:v(),payload:g,actorId:i,sessionId:c};a?.enabled&&(E.maskedPayload=await Or(g,a));let S=yt(E),p=await ft(S),w={...E,hash:p};for(o&&(w.signature=await o.signFn(p)),d.push(w);d.length>t;)d.shift(),m++,u>0&&u--;return l.onEntryAdded?.(w),w}return n&&s>0&&(b=setInterval(async()=>{try{let h=d.slice(u);h.length>0&&(await n(h),f+=h.length,u=d.length);}catch(h){l.onExportError?.(h instanceof Error?h:new Error(String(h)),d.slice(u));}},s)),{getEntries(h){let g=[...d];if(h){if(h.eventTypes?.length){let T=new Set(h.eventTypes);g=g.filter(E=>T.has(E.eventType));}h.actorId&&(g=g.filter(T=>T.actorId===h.actorId)),h.sessionId&&(g=g.filter(T=>T.sessionId===h.sessionId)),h.since!==void 0&&(g=g.filter(T=>T.timestamp>=h.since)),h.until!==void 0&&(g=g.filter(T=>T.timestamp<=h.until)),h.offset!==void 0&&(g=g.slice(h.offset)),h.limit!==void 0&&(g=g.slice(0,h.limit));}return g},async verifyChain(){if(d.length===0)return {valid:true,entriesVerified:0,verifiedAt:Date.now()};d[0].previousHash;for(let g=0;g<d.length;g++){let T=d[g],E=yt({id:T.id,timestamp:T.timestamp,eventType:T.eventType,previousHash:T.previousHash,payload:T.payload,actorId:T.actorId,sessionId:T.sessionId}),S=await ft(E);if(T.hash!==S){R=false;let p={valid:false,entriesVerified:g,brokenAt:{index:g,entryId:T.id,expectedHash:S,actualHash:T.hash},verifiedAt:Date.now()};return l.onChainBroken?.(p),p}if(g>0){let p=d[g-1];if(T.previousHash!==p.hash){R=false;let w={valid:false,entriesVerified:g,brokenAt:{index:g,entryId:T.id,expectedHash:p.hash,actualHash:T.previousHash},verifiedAt:Date.now()};return l.onChainBroken?.(w),w}}if(o?.verifyFn&&T.signature&&!await o.verifyFn(T.hash,T.signature)){R=false;let w={valid:false,entriesVerified:g,brokenAt:{index:g,entryId:T.id,expectedHash:"signature-invalid",actualHash:T.signature},verifiedAt:Date.now()};return l.onChainBroken?.(w),w}}return R=true,{valid:true,entriesVerified:d.length,verifiedAt:Date.now()}},async export(h){let g=[...d];return h!==void 0&&(g=g.filter(T=>T.timestamp>=h)),n&&g.length>0&&(await n(g),f+=g.length),g},prune(){let h=Date.now()-r,g=d.length;for(;d.length>0&&d[0].timestamp<h;)d.shift(),u>0&&u--;let T=g-d.length;return m+=T,T},getStats(){let h={};for(let g of d)h[g.eventType]=(h[g.eventType]??0)+1;return {totalEntries:d.length,byEventType:h,oldestEntry:d[0]?.timestamp,newestEntry:d[d.length-1]?.timestamp,entriesPruned:m,entriesExported:f,chainIntegrity:R}},async dispose(){if(b&&(clearInterval(b),b=void 0),n)try{let h=d.slice(u);h.length>0&&(await n(h),f+=h.length);}catch(h){l.onExportError?.(h instanceof Error?h:new Error(String(h)),d.slice(u));}},addEntry(h,g){return y(h,g)},createPlugin(){return {name:"audit-trail",onFactSet:(h,g,T)=>{y("fact.set",{key:h,value:g,prev:T}).catch(console.error);},onFactsBatch:h=>{y("fact.batch",{changes:h.map(g=>({key:g.key,value:g.value,prev:g.prev}))}).catch(console.error);},onRequirementCreated:h=>{y("requirement.created",{id:h.id,type:h.requirement.type,payload:h.requirement}).catch(console.error);},onRequirementMet:(h,g)=>{y("requirement.met",{id:h.id,type:h.requirement.type,byResolver:g}).catch(console.error);},onResolverStart:(h,g)=>{y("resolver.start",{resolver:h,requirementId:g.id,requirementType:g.requirement.type}).catch(console.error);},onResolverComplete:(h,g,T)=>{y("resolver.complete",{resolver:h,requirementId:g.id,requirementType:g.requirement.type,duration:T}).catch(console.error);},onResolverError:(h,g,T)=>{y("resolver.error",{resolver:h,requirementId:g.id,requirementType:g.requirement.type,error:T instanceof Error?T.message:String(T)}).catch(console.error);},onError:h=>{y("error.occurred",{source:h.source,sourceId:h.sourceId,message:h.message,context:h.context}).catch(console.error);},onErrorRecovery:(h,g)=>{y("error.recovery",{source:h.source,message:h.message,strategy:g}).catch(console.error);}}}}}function Nr(e){return {onAgentStart:(t,r)=>{e.addEntry("agent.run.start",{agentName:t,input:r});},onAgentComplete:(t,r,s,n)=>{e.addEntry("agent.run.complete",{agentName:t,output:r,tokens:s,cost:n});},onAgentError:(t,r)=>{e.addEntry("agent.run.error",{agentName:t,error:r.message,stack:r.stack});},onToolStart:(t,r,s)=>{e.addEntry("tool.call.start",{toolName:t,toolCallId:r,args:s});},onToolComplete:(t,r,s)=>{e.addEntry("tool.call.complete",{toolName:t,toolCallId:r,result:s});},onToolError:(t,r,s)=>{e.addEntry("tool.call.error",{toolName:t,toolCallId:r,error:s.message});},onApprovalRequested:(t,r,s)=>{e.addEntry("approval.requested",{toolName:t,toolCallId:r,args:s});},onApprovalGranted:(t,r)=>{e.addEntry("approval.granted",{toolName:t,toolCallId:r});},onApprovalDenied:(t,r,s)=>{e.addEntry("approval.denied",{toolName:t,toolCallId:r,reason:s});}}}var ye=[{pattern:/ignore\s+(all\s+)?(previous|prior|above|earlier)\s+(instructions?|prompts?|rules?|guidelines?)/i,name:"ignore-previous",severity:"critical",category:"instruction_override"},{pattern:/disregard\s+(all\s+)?(previous|prior|above|earlier)\s+(instructions?|prompts?)/i,name:"disregard-previous",severity:"critical",category:"instruction_override"},{pattern:/forget\s+(all\s+)?(previous|prior|above|earlier)\s+(instructions?|prompts?)/i,name:"forget-previous",severity:"critical",category:"instruction_override"},{pattern:/override\s+(the\s+)?(system|base)\s+(prompt|instructions?)/i,name:"override-system",severity:"critical",category:"instruction_override"},{pattern:/\bDAN\s+(mode|jailbreak)\b/i,name:"dan-mode",severity:"critical",category:"jailbreak"},{pattern:/\bjailbreak(ed)?\s*(mode)?\b/i,name:"jailbreak-keyword",severity:"high",category:"jailbreak"},{pattern:/developer\s+mode\s+(enabled|activated|on)/i,name:"developer-mode",severity:"critical",category:"jailbreak"},{pattern:/pretend\s+(you\s+)?(are|can|have)\s+(no\s+)?(restrictions?|limits?|boundaries?|ethics)/i,name:"pretend-no-restrictions",severity:"high",category:"jailbreak"},{pattern:/you\s+(now\s+)?have\s+no\s+(ethical\s+)?(restrictions?|guidelines?|boundaries?)/i,name:"no-restrictions",severity:"high",category:"jailbreak"},{pattern:/you\s+are\s+now\s+(a|an)\s+\w+\s+(that|who)\s+(can|will|must)/i,name:"role-assignment",severity:"medium",category:"role_manipulation"},{pattern:/from\s+now\s+on,?\s+(you\s+)?(will|must|should)\s+(only\s+)?/i,name:"from-now-on",severity:"medium",category:"role_manipulation"},{pattern:/^(system|assistant|user):\s*/im,name:"fake-role-marker",severity:"high",category:"context_manipulation"},{pattern:/<\|?(system|endofprompt|im_start|im_end)\|?>/i,name:"special-token-injection",severity:"critical",category:"context_manipulation"},{pattern:/```(system|assistant|instructions?)\n/i,name:"markdown-code-injection",severity:"medium",category:"delimiter_injection"},{pattern:/<system>|<\/system>|<instructions?>|<\/instructions?>/i,name:"xml-tag-injection",severity:"high",category:"delimiter_injection"},{pattern:/fetch\s+(content\s+)?(from|at)\s+(the\s+)?url/i,name:"url-fetch-instruction",severity:"medium",category:"indirect_injection"},{pattern:/execute\s+(the\s+)?(code|script|command)\s+(from|in|at)/i,name:"execute-from-source",severity:"high",category:"indirect_injection"}],He=[...ye,{pattern:/act\s+as\s+(if\s+)?(you\s+)?(were|are|can)/i,name:"act-as",severity:"low",category:"role_manipulation"},{pattern:/new\s+instructions?:/i,name:"new-instructions",severity:"medium",category:"instruction_override"},{pattern:/\[system\]|\[admin\]|\[developer\]/i,name:"bracket-role-marker",severity:"medium",category:"context_manipulation"},{pattern:/base64|rot13|decode\s+(this|the)/i,name:"encoding-reference",severity:"low",category:"encoding_evasion"},{pattern:/\u200b|\u200c|\u200d|\u2060|\ufeff/,name:"zero-width-chars",severity:"medium",category:"encoding_evasion"}],ht=1e5;function ze(e,t=ye){if(e.length>ht)throw new Error(`[Directive] Input exceeds maximum length of ${ht} characters for injection detection. Truncate input or process in chunks.`);let r=[];for(let{pattern:o,name:c,severity:i,category:l}of t){let u=new RegExp(o.source,o.flags).exec(e);u&&r.push({name:c,category:l,severity:i,match:u[0],position:u.index});}let s={low:10,medium:25,high:50,critical:100},n=r.reduce((o,c)=>o+s[c.severity],0),a=Math.min(100,n);return {detected:r.length>0,patterns:r,riskScore:a}}function bt(e,t=ye){let r=e.replace(/[\u200b\u200c\u200d\u2060\ufeff]/g,""),s=t.map(l=>`(${l.pattern.source})`);if(s.length===0)return r;let n=t.some(l=>l.pattern.flags.includes("g")),a=t.some(l=>l.pattern.flags.includes("i")),o=t.some(l=>l.pattern.flags.includes("m")),c=`${n?"g":""}${a?"i":""}${o?"m":""}`,i=new RegExp(s.join("|"),c||"gi");return r=r.replace(i,"[REDACTED]"),r}function Rt(e={}){let{additionalPatterns:t=[],replacePatterns:r,strictMode:s=false,blockThreshold:n=50,sanitize:a=false,onBlocked:o,ignoreCategories:c=[]}=e,i;if(r?i=r:i=s?[...He]:[...ye],i=[...i,...t],c.length>0){let l=new Set(c);i=i.filter(d=>!l.has(d.category));}return l=>{let d=ze(l.input,i);if(d.detected&&d.riskScore>=n){if(o?.(l.input,d),a)return {passed:true,transformed:bt(l.input,i)};let u=d.patterns.sort((m,f)=>{let R={critical:0,high:1,medium:2,low:3};return R[m.severity]-R[f.severity]}).slice(0,3).map(m=>m.name).join(", ");return {passed:false,reason:`Prompt injection detected (risk: ${d.riskScore}%, patterns: ${u})`}}return {passed:true}}}function Gr(e,t){return `[UNTRUSTED_CONTENT source="${t}"]
|
|
27
|
+
${e}
|
|
28
|
+
[/UNTRUSTED_CONTENT]`}function Fr(e){let{baseGuardrail:t=Rt({strictMode:true,blockThreshold:25}),additionalPatterns:r=[]}=e,s=/\[UNTRUSTED_CONTENT source="([^"]+)"\]([\s\S]*?)\[\/UNTRUSTED_CONTENT\]/g;return async(n,a)=>{let o=await t(n,a);if(!o.passed)return o;let c=n.input.matchAll(s);for(let i of c){let[,l,d]=i;if(!d)continue;let u=ze(d,[...He,...r]);if(u.detected&&u.riskScore>=25)return {passed:false,reason:`Untrusted content from "${l}" contains potential injection (risk: ${u.riskScore}%)`}}return {passed:true}}}function _r(){return globalThis.crypto?.randomUUID?.()??`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,11)}`}function jr(e){return new TextEncoder().encode(e)}function $r(e){return Array.from(e).map(t=>t.toString(16).padStart(2,"0")).join("")}async function vt(e){let t=jr(e),r=await globalThis.crypto.subtle.digest("SHA-256",t);return $r(new Uint8Array(r))}function Br(e){if(e.length===0)return "";let t=new Set;for(let n of e)for(let a of Object.keys(n))t.add(a);let r=Array.from(t),s=[r.join(",")];for(let n of e){let a=r.map(o=>{let c=n[o];if(c==null)return "";if(typeof c=="object")return JSON.stringify(c).replace(/"/g,'""');let i=String(c);return i.includes(",")||i.includes(`
|
|
29
|
+
`)||i.includes('"')?`"${i.replace(/"/g,'""')}"`:i});s.push(a.join(","));}return s.join(`
|
|
30
|
+
`)}function Lr(){let e=new Map,t=new Map,r=new Map;return {async getSubjectData(s,n){let a=[];for(let[o,c]of e){if(n&&!n.includes(o))continue;let i=c.get(s);i&&i.length>0&&a.push({category:o,records:[...i]});}return a},async deleteSubjectData(s,n){let a=0;for(let[o,c]of e){if(n&&!n.includes(o))continue;let i=c.get(s);i&&(a+=i.length,c.delete(s));}return a},async anonymizeSubjectData(s,n){let a=0;for(let[o,c]of e){if(n&&!n.includes(o))continue;let i=c.get(s);if(i)for(let l of i)l.data={...l.data,_anonymized:true,_anonymizedAt:Date.now()},a++;}return a},async getExpiredData(s,n){let a=[],o=e.get(s);if(o)for(let c of o.values())for(let i of c)i.createdAt<n&&a.push({id:i.id,createdAt:i.createdAt});return a},async deleteByIds(s){let n=new Set(s),a=0;for(let o of e.values())for(let[c,i]of o){let l=i.filter(d=>!n.has(d.id));l.length!==i.length&&(a+=i.length-l.length,l.length===0?o.delete(c):o.set(c,l));}return a},async storeConsent(s){t.set(`${s.subjectId}:${s.purpose}`,s);},async getConsent(s,n){return t.get(`${s}:${n}`)??null},async getConsentsBySubject(s){let n=[];for(let[a,o]of t)a.startsWith(`${s}:`)&&n.push(o);return n},async getConsentsByPurpose(s){let n=[];for(let[a,o]of t)a.endsWith(`:${s}`)&&n.push(o);return n},async storeDeletionCertificate(s){r.set(s.subjectId,s);}}}function qr(e){let{storage:t,retention:r,exportExpirationMs:s=864e5,events:n={}}=e,a={async grant(o,c,i={}){let l={subjectId:o,purpose:c,granted:true,grantedAt:Date.now(),expiresAt:i.expiresAt,source:i.source,version:i.version};return await t.storeConsent(l),n.onConsentChange?.(l),l},async revoke(o,c){let i=await t.getConsent(o,c);if(!i)return null;let l={...i,granted:false,revokedAt:Date.now()};return await t.storeConsent(l),n.onConsentChange?.(l),l},async check(o,c){let i=await t.getConsent(o,c);return !(!i||!i.granted||i.expiresAt&&i.expiresAt<Date.now())},async getForSubject(o){return t.getConsentsBySubject(o)},async getForPurpose(o){return t.getConsentsByPurpose(o)}};return {async exportData(o){try{let c=await t.getSubjectData(o.subjectId,o.categories),i=[],l=[];for(let{category:f,records:R}of c){l.push(f);for(let b of R)i.push({category:f,...b});}if(o.includeAudit&&t.getAuditEntries){let f=await t.getAuditEntries(o.subjectId);l.push("audit");for(let R of f)i.push({category:"audit",id:R.id,data:R.payload,createdAt:R.timestamp});}let d;o.format==="csv"?d=Br(i.map(f=>({category:f.category,id:f.id,createdAt:new Date(f.createdAt).toISOString(),...f.data}))):d=JSON.stringify({subjectId:o.subjectId,exportedAt:new Date().toISOString(),recordCount:i.length,categories:l,records:i},null,2);let u=await vt(d),m={success:!0,subjectId:o.subjectId,format:o.format,data:d,categories:l,recordCount:i.length,checksum:u,exportedAt:Date.now(),expiresAt:Date.now()+s};return n.onExport?.(m),m}catch(c){return {success:false,subjectId:o.subjectId,format:o.format,data:"",categories:[],recordCount:0,checksum:"",exportedAt:Date.now(),error:c instanceof Error?c.message:String(c)}}},async deleteData(o){try{let c=0,i=[];o.anonymize?c=await t.anonymizeSubjectData(o.subjectId,o.categories):c=await t.deleteSubjectData(o.subjectId,o.categories),o.categories?i.push(...o.categories):o.scope==="all"&&i.push("all");let l=JSON.stringify({subjectId:o.subjectId,type:o.anonymize?"anonymization":"hard",scope:o.scope,categories:i,recordCount:c,deletedAt:Date.now(),reason:o.reason}),d={id:_r(),subjectId:o.subjectId,type:o.anonymize?"anonymization":"hard",scope:o.scope,categories:i,recordCount:c,deletedAt:Date.now(),reason:o.reason,hash:await vt(l)};await t.storeDeletionCertificate(d);let u={success:!0,subjectId:o.subjectId,scope:o.scope,anonymized:o.anonymize??!1,recordsAffected:c,categoriesAffected:i,certificate:d,deletedAt:Date.now()};return n.onDelete?.(u),u}catch(c){return {success:false,subjectId:o.subjectId,scope:o.scope,anonymized:o.anonymize??false,recordsAffected:0,categoriesAffected:[],certificate:{id:"error",subjectId:o.subjectId,type:"hard",scope:o.scope,categories:[],recordCount:0,deletedAt:Date.now(),hash:""},deletedAt:Date.now(),error:c instanceof Error?c.message:String(c)}}},consent:a,async enforceRetention(){if(!r)return 0;let o=0,c=Date.now(),i=new Set;if(r.categoryRetention)for(let l of Object.keys(r.categoryRetention))i.add(l);i.add("default");for(let l of i){let d=r.categoryRetention?.[l]??r.defaultRetentionMs,u=c-d,m=await t.getExpiredData(l,u);if(m.length>0){await r.onBeforeDelete?.({category:l,count:m.length});let f=await t.deleteByIds(m.map(R=>R.id));o+=f,r.onAfterDelete?.({category:l,count:f}),n.onRetentionEnforced?.(l,f);}}return o},createConsentGuardrail(o){return async c=>{let l=c.input.match(/user[_-]?id[:\s]*([a-zA-Z0-9-]+)/i)?.[1];return l?await a.check(l,o)?{passed:true}:{passed:false,reason:`No consent for '${o}' from subject ${l}`}:{passed:true}}},async getDeletionCertificate(o){return null}}}function oe(e,t){if(e.length!==t.length)throw new Error(`Vector dimensions must match: ${e.length} vs ${t.length}`);let r=0,s=0,n=0;for(let a=0;a<e.length;a++){let o=e[a],c=t[a];r+=o*c,s+=o*o,n+=c*c;}return s=Math.sqrt(s),n=Math.sqrt(n),s===0||n===0?0:r/(s*n)}function Ur(e,t,r,s){let n=null;for(let a of t){if(s&&a.agentName&&a.agentName!==s)continue;let o=oe(e,a.queryEmbedding);o>=r&&(!n||o>n.similarity)&&(n={entry:a,similarity:o});}return n}function wt(){let e=new Map;function t(r){let s=e.get(r);return s||(s=new Map,e.set(r,s)),s}return {async getEntries(r){return Array.from(t(r).values())},async addEntry(r,s){t(r).set(s.id,s);},async updateEntry(r,s,n){let a=t(r),o=a.get(s);o&&a.set(s,{...o,...n});},async removeEntry(r,s){t(r).delete(s);},async clear(r){e.delete(r);}}}function We(e){let{embedder:t,similarityThreshold:r=.9,maxCacheSize:s=1e3,ttlMs:n=36e5,namespace:a="default",storage:o=wt(),onHit:c,onMiss:i,onError:l,perAgent:d=false}=e,u={totalEntries:0,totalHits:0,totalMisses:0,hitRate:0,avgSimilarityOnHit:0,oldestEntry:null,newestEntry:null},m=0;function f(b){if(u.totalEntries=b.length,u.hitRate=u.totalHits+u.totalMisses>0?u.totalHits/(u.totalHits+u.totalMisses):0,u.avgSimilarityOnHit=u.totalHits>0?m/u.totalHits:0,b.length>0){let v=b.map(y=>y.createdAt);u.oldestEntry=Math.min(...v),u.newestEntry=Math.max(...v);}else u.oldestEntry=null,u.newestEntry=null;}async function R(){let b=await o.getEntries(a),v=Date.now();for(let h of b)v-h.createdAt>n&&await o.removeEntry(a,h.id);let y=await o.getEntries(a);if(y.length>s){let g=y.sort((T,E)=>T.accessedAt-E.accessedAt).slice(0,y.length-s);for(let T of g)await o.removeEntry(a,T.id);}}return {async lookup(b,v){let y=Date.now();try{let h=await t(b),g=await o.getEntries(a),T=Ur(h,g,r,d?v:void 0);return T?(await o.updateEntry(a,T.entry.id,{accessedAt:Date.now(),accessCount:T.entry.accessCount+1}),u.totalHits++,m+=T.similarity,f(g),c?.(T.entry,T.similarity),{hit:!0,entry:T.entry,similarity:T.similarity,latencyMs:Date.now()-y}):(u.totalMisses++,f(g),i?.(b),{hit:!1,latencyMs:Date.now()-y})}catch(h){return u.totalMisses++,l?.(h instanceof Error?h:new Error(String(h))),{hit:false,latencyMs:Date.now()-y}}},async store(b,v,y,h={}){let g=await t(b),T={id:globalThis.crypto?.randomUUID?.()??`${Date.now()}-${Math.random().toString(36).slice(2,11)}`,query:b,queryEmbedding:g,response:v,metadata:h,createdAt:Date.now(),accessedAt:Date.now(),accessCount:0,agentName:d?y:void 0};await o.addEntry(a,T),await R();let E=await o.getEntries(a);f(E);},async invalidate(b){let v=await o.getEntries(a),y=0;for(let g of v)b(g)&&(await o.removeEntry(a,g.id),y++);let h=await o.getEntries(a);return f(h),y},async clear(){await o.clear(a),u={totalEntries:0,totalHits:0,totalMisses:0,hitRate:0,avgSimilarityOnHit:0,oldestEntry:null,newestEntry:null},m=0;},getStats(){return {...u}},async export(){return o.getEntries(a)},async import(b){for(let y of b)await o.addEntry(a,y);await R();let v=await o.getEntries(a);f(v);}}}function Hr(e){let{cache:t}=e;return async r=>{let s=await t.lookup(r.input,r.agentName);return s.hit&&s.entry?{passed:false,cacheHit:true,reason:`Cache hit (similarity: ${(s.similarity*100).toFixed(1)}%)`,cachedResponse:s.entry.response,similarity:s.similarity}:{passed:true,cacheHit:false}}}function Ve(e=128){return async t=>{let r=new Array(e).fill(0);for(let n=0;n<t.length;n++){let a=t.charCodeAt(n);r[n%e]+=a/256;}let s=Math.sqrt(r.reduce((n,a)=>n+a*a,0));if(s>0)for(let n=0;n<e;n++)r[n]/=s;return r}}function zr(e){let{batchSize:t=20,embedBatch:r,maxWaitMs:s=50}=e;if(t<1||!Number.isFinite(t))throw new Error(`[Directive SemanticCache] batchSize must be >= 1, got ${t}`);let n=[],a=null,o=false;async function c(){if(n.length===0)return;let i=n;n=[],a&&(clearTimeout(a),a=null);try{let l=i.map(u=>u.text),d=await r(l);if(d.length!==i.length)throw new Error(`[Directive SemanticCache] embedBatch returned ${d.length} embeddings for ${i.length} texts. The embedBatch function must return exactly one embedding per input text.`);for(let u=0;u<i.length;u++)i[u].resolve(d[u]);}catch(l){let d=l instanceof Error?l:new Error(String(l));for(let u of i)u.reject(d);}}return {async embed(i){if(o)throw new Error("BatchedEmbedder has been disposed");return new Promise((l,d)=>{n.push({text:i,resolve:l,reject:d}),n.length>=t?c():a||(a=setTimeout(c,s));})},async flush(){await c();},dispose(){o=true,a&&(clearTimeout(a),a=null);let i=n;n=[];let l=new Error("BatchedEmbedder disposed");for(let d of i)d.reject(l);}}}function Wr(){let e=new Map,t=null;function r(s){if(t===null)t=s.length;else if(s.length!==t)throw new Error(`[Directive ANNIndex] Dimension mismatch: expected ${t}, got ${s.length}`)}return {add(s,n){r(n),e.set(s,n);},remove(s){e.delete(s);},search(s,n,a=0){if(t!==null&&s.length!==t)throw new Error(`[Directive ANNIndex] Query dimension mismatch: expected ${t}, got ${s.length}`);let o=[];for(let[c,i]of e){let l=oe(s,i);l>=a&&o.push({id:c,similarity:l});}return o.sort((c,i)=>i.similarity-c.similarity),o.slice(0,n)},rebuild(){},size(){return e.size},clear(){e.clear(),t=null;},needsRebuild(){return false}}}function St(e,t){return 1-oe(e,t)}function Je(e,t){if(e.length===0)return null;let r=Math.floor(t()*e.length),s=e[r],n=e.filter((d,u)=>u!==r);if(n.length===0)return {id:s.id,embedding:s.embedding,mu:0,left:null,right:null};let a=n.map(d=>({item:d,distance:St(s.embedding,d.embedding)}));a.sort((d,u)=>d.distance-u.distance);let o=Math.floor(a.length/2),c=a[o].distance,i=a.slice(0,o).map(d=>d.item),l=a.slice(o).map(d=>d.item);return {id:s.id,embedding:s.embedding,mu:c,left:Je(i,t),right:Je(l,t)}}function he(e,t,r,s,n,a){if(!e)return;let o=St(t,e.embedding),c=1-o;c>=s&&(n.push({id:e.id,similarity:c}),n.sort((i,l)=>l.similarity-i.similarity),n.length>r&&n.pop(),n.length===r&&(a.value=1-n[n.length-1].similarity)),o<e.mu?(he(e.left,t,r,s,n,a),o+a.value>=e.mu&&he(e.right,t,r,s,n,a)):(he(e.right,t,r,s,n,a),o-a.value<=e.mu&&he(e.left,t,r,s,n,a));}function Vr(e={}){let{random:t=Math.random}=e,r=new Map,s=null,n=false,a=null;function o(c){if(a===null)a=c.length;else if(c.length!==a)throw new Error(`[Directive ANNIndex] Dimension mismatch: expected ${a}, got ${c.length}`)}return {add(c,i){o(i),r.set(c,i),n=true;},remove(c){r.delete(c),n=true;},search(c,i,l=0){if(a!==null&&c.length!==a)throw new Error(`[Directive ANNIndex] Query dimension mismatch: expected ${a}, got ${c.length}`);if(n||!s){let m=[];for(let[f,R]of r){let b=oe(c,R);b>=l&&m.push({id:f,similarity:b});}return m.sort((f,R)=>R.similarity-f.similarity),m.slice(0,i)}let d=[],u={value:Number.POSITIVE_INFINITY};return he(s,c,i,l,d,u),d},rebuild(){let c=Array.from(r.entries()).map(([i,l])=>({id:i,embedding:l}));s=Je(c,t),n=false;},size(){return r.size},clear(){r.clear(),s=null,n=false,a=null;},needsRebuild(){return n}}}function be(e={}){let{bufferSize:t=100}=e;if(t<1||!Number.isFinite(t))throw new Error(`[Directive StreamChannel] bufferSize must be >= 1, got ${t}`);let r=[],s="open",n=null,a=null,o=null,c=false;function i(f){if(a){let R=a;a=null,R.resolve({value:f,done:false});}}function l(){if(a){let f=a;a=null,f.resolve({value:void 0,done:true});}}function d(f){if(a){let R=a;a=null,c=false,R.reject(f);}}function u(){if(o){let f=o;o=null,f();}}return {async send(f){if(s!=="open")throw new Error(`[Directive StreamChannel] Cannot send to ${s} channel${e.name?` "${e.name}"`:""}`);if(a){i(f);return}if(r.length>=t){if(await new Promise(R=>{o=R;}),s!=="open")throw new Error(`[Directive StreamChannel] Cannot send to ${s} channel${e.name?` "${e.name}"`:""}`);if(a){i(f);return}}r.push(f);},end(){s==="open"&&(s="closed",l());},error(f){s==="open"&&(s="error",n=f,d(f),u());},getState(){return s},bufferedCount(){return r.length},[Symbol.asyncIterator](){if(c)throw new Error("[Directive StreamChannel] Channel only supports a single consumer. Create a separate channel for each consumer.");return c=true,{next(){if(s==="error"&&n)return c=false,Promise.reject(n);if(r.length>0){let f=r.shift();return u(),Promise.resolve({value:f,done:false})}return s==="closed"?(c=false,Promise.resolve({value:void 0,done:true})):new Promise((f,R)=>{a={resolve:f,reject:R};})},return(){return s="closed",r.length=0,c=false,u(),Promise.resolve({value:void 0,done:true})}}}}}function Jr(e){let t=be(e),r=be(e);return {sideA:{send:s=>t.send(s),receive:r,close(){t.end(),r.end();}},sideB:{send:s=>r.send(s),receive:t,close(){t.end(),r.end();}}}}async function Ke(e,t,r){try{for await(let s of e){let n=await r(s);await t.send(n);}t.end();}catch(s){t.error(s instanceof Error?s:new Error(String(s)));}}function Kr(...e){return {[Symbol.asyncIterator](){let r=[],s=0,n=null,a=null,o=false,c=false,i=[];function l(d){if(n){let u=n;return n=null,u(d),true}return false}for(let d of e){let u=d[Symbol.asyncIterator]();i.push(u),(async()=>{try{for(;!o;){let m=await u.next();if(m.done||o)break;l({value:m.value,done:!1})||(r.length<1e4?r.push(m.value):c||(c=!0,console.warn("[Directive mergeStreams] Buffer exceeded 10000 items. Values are being dropped. Ensure the consumer keeps up or use bounded StreamChannel sources.")));}}catch(m){o||(o=true,a=m instanceof Error?m:new Error(String(m)),l({value:void 0,done:true}));}s++,s>=e.length&&!o&&l({value:void 0,done:true});})();}return {next(){return a?Promise.reject(a):r.length>0?Promise.resolve({value:r.shift(),done:false}):s>=e.length?Promise.resolve({value:void 0,done:true}):new Promise(d=>{n=d;})},return(){o=true,r.length=0;for(let d of i)d.return?.({value:void 0,done:true});if(n){let d=n;n=null,d({value:void 0,done:true});}return Promise.resolve({value:void 0,done:true})}}}}}var Me=class extends Error{retryCount;lastError;constructor(t,r){super(`[Directive] All ${t} retries exhausted: ${r.message}`),this.name="RetryExhaustedError",this.retryCount=t,this.lastError=r,this.cause=r;}},Xr=new Set([400,401,403,404,422]);function Xe(e){let t=e;if(typeof t.status=="number"&&t.status>=100&&t.status<=599)return t.status;if(typeof t.statusCode=="number"&&t.statusCode>=100&&t.statusCode<=599)return t.statusCode;let s=(e.message.length>1e3?e.message.slice(0,1e3):e.message).match(/(?:failed|error|status|http)[:\s]+(\d{3})\b/i);if(!s)return null;let n=Number(s[1]);return n>=100&&n<=599?n:null}function At(e){let t=e;if(typeof t.retryAfter=="number"&&t.retryAfter>0)return t.retryAfter*1e3;let s=(e.message.length>1e3?e.message.slice(0,1e3):e.message).match(/retry[- ]?after[:\s]+(\d+)/i);if(!s)return null;let n=Number(s[1]);return n>0?n*1e3:null}function Qr(e,t,r){let s=t*Math.pow(2,e-1),n=Math.random()*t*.5,a=s+n;return Math.min(a,r)}function Yr(e,t,r,s){if(Xe(e)===429){let a=At(e);if(a!==null)return Math.min(a,s)}return Qr(t,r,s)}function Zr(e){let t=Xe(e);return t===null?true:!Xr.has(t)}function Qe(e,t={}){let{maxRetries:r=3,baseDelayMs:s=1e3,maxDelayMs:n=3e4,isRetryable:a,onRetry:o}=t;if(!Number.isFinite(r)||r<0)throw new Error("[Directive] withRetry: maxRetries must be a non-negative finite number.");if(!Number.isFinite(s)||s<0)throw new Error("[Directive] withRetry: baseDelayMs must be a non-negative finite number.");if(!Number.isFinite(n)||n<0)throw new Error("[Directive] withRetry: maxDelayMs must be a non-negative finite number.");return async(c,i,l)=>{let d;for(let u=0;u<=r;u++)try{return await e(c,i,l)}catch(m){if(d=m instanceof Error?m:new Error(String(m)),u>=r)break;if(a)try{if(!a(d))break}catch{break}if(!Zr(d))break;let f=Yr(d,u+1,s,n);try{o?.(u+1,d,f);}catch{}let R=l?.signal;if(R?.aborted)break;await new Promise((b,v)=>{let y=setTimeout(()=>{R?.removeEventListener("abort",h),b();},f);function h(){clearTimeout(y),v(R.reason??new Error("Aborted"));}R&&R.addEventListener("abort",h,{once:true});});}throw new Me(r,d)}}var Pe=class extends Error{errors;constructor(t){let r=t.map((s,n)=>` [${n}] ${s.message}`).join(`
|
|
31
|
+
`);super(`[Directive] All ${t.length} providers failed:
|
|
32
|
+
${r}`),this.name="AllProvidersFailedError",this.errors=Object.freeze([...t]),t.length>0&&(this.cause=t[t.length-1]);}};function Ye(e,t={}){if(e.length===0)throw new Error("[Directive] withFallback requires at least one runner.");let{shouldFallback:r,onFallback:s}=t;return async(n,a,o)=>{let c=[];for(let i=0;i<e.length;i++)try{return await e[i](n,a,o)}catch(l){let d=l instanceof Error?l:new Error(String(l));if(c.push(d),i<e.length-1){if(r)try{if(!r(d))break}catch{break}try{s?.(i,i+1,d);}catch{}}}throw new Pe(c)}}var Re=class extends Error{estimated;remaining;window;constructor(t){super(`[Directive] Budget exceeded (${t.window}): estimated $${t.estimated.toFixed(4)}, remaining $${t.remaining.toFixed(4)}`),this.name="BudgetExceededError",this.estimated=t.estimated,this.remaining=t.remaining,this.window=t.window;}},Ie=class{entries=[];record(t){this.entries.push({timestamp:Date.now(),cost:t});}getCostInWindow(t){let r=Date.now()-t;this.prune(r);let s=0;for(let n of this.entries)n.timestamp>=r&&(s+=n.cost);return s}prune(t){let r=0;for(;r<this.entries.length&&this.entries[r].timestamp<t;)r++;r>0&&this.entries.splice(0,r);}clear(){this.entries=[];}},Tt={hour:3600*1e3,day:1440*60*1e3};function en(e,t){return Math.ceil(e.length/t)}function Ct(e,t){return e.inputTokens/1e6*t.inputPerMillion+e.outputTokens/1e6*t.outputPerMillion}function kt(e,t,r=1){let s=Math.ceil(e*r);return e/1e6*t.inputPerMillion+s/1e6*t.outputPerMillion}function Ze(e,t){let{maxCostPerCall:r,budgets:s=[],pricing:n,charsPerToken:a=4,estimatedOutputMultiplier:o=1,onBudgetExceeded:c}=t;if(!Number.isFinite(a)||a<=0)throw new Error("[Directive] withBudget: charsPerToken must be a positive finite number.");if(r!=null&&(!Number.isFinite(r)||r<0))throw new Error("[Directive] withBudget: maxCostPerCall must be a non-negative finite number.");if(!Number.isFinite(o)||o<0)throw new Error("[Directive] withBudget: estimatedOutputMultiplier must be a non-negative finite number.");r!=null&&!n&&console.warn("[Directive] withBudget: maxCostPerCall has no effect without pricing. Provide a pricing config to enable per-call cost estimation.");for(let m of s)if(!Number.isFinite(m.maxCost)||m.maxCost<0)throw new Error(`[Directive] withBudget: budgets[${m.window}].maxCost must be a non-negative finite number.`);let i=new Map;for(let m of s)i.set(m.window,new Ie);let l=new Ie,d=async(m,f,R)=>{let b=en(f,a);if(r!=null&&n){let y=kt(b,n,o);if(y>r){let h={estimated:y,remaining:r,window:"per-call"};try{c?.(h);}catch{}throw new Re(h)}}for(let y of s){let h=Tt[y.window],T=i.get(y.window).getCostInWindow(h),E=y.maxCost-T,S=kt(b,y.pricing,o);if(S>E){let p={estimated:S,remaining:Math.max(0,E),window:y.window};try{c?.(p);}catch{}throw new Re(p)}}let v=await e(m,f,R);if(v.tokenUsage){for(let y of s){let h=i.get(y.window),g=Ct(v.tokenUsage,y.pricing);h.record(g);}if(n&&s.length===0){let y=Ct(v.tokenUsage,n);l.record(y);}}return v};function u(m){let f=i.get(m);if(!f)return 0;let R=Tt[m];return f.getCostInWindow(R)}return d.getSpent=u,d}function tn(e,t){return {match:(r,s)=>s.length<=e,model:t}}function rn(e,t){return {match:r=>r.name===e,model:t}}function nn(e,t){return {match:(r,s)=>(e.lastIndex=0,e.test(s)),model:t}}function et(e,t){let r=Array.isArray(t)?{rules:t}:t,{rules:s,onModelSelected:n}=r;return async(a,o,c)=>{let i=a.model;for(let d of s)try{if(d.match(a,o)){i=d.model;break}}catch{}try{n?.(a.model,i);}catch{}let l=i!==a.model?{...a,model:i}:a;return e(l,o,c)}}function xt(e){if(e.length>1048576)throw new Error(`[Directive] Output too large for JSON extraction (${e.length} chars, max 1048576).`);let t=e.trim();try{return JSON.parse(t)}catch{}let r=t.indexOf("{"),s=t.indexOf("["),n,a,o;if(r===-1&&s===-1)throw new Error("[Directive] No JSON object or array found in output");r===-1?(n=s,a="[",o="]"):s===-1?(n=r,a="{",o="}"):(n=Math.min(r,s),a=n===r?"{":"[",o=n===r?"}":"]");let c=0,i=false,l=false;for(let d=n;d<t.length;d++){let u=t[d];if(l){l=false;continue}if(u==="\\"){l=true;continue}if(u==='"'){i=!i;continue}if(!i){if(u===a)c++;else if(u===o&&(c--,c===0)){let m=t.slice(n,d+1);return JSON.parse(m)}}}throw new Error("[Directive] No valid JSON found in output")}function sn(e){return e?e.issues&&e.issues.length>0?e.issues.map(t=>t.message).join("; "):e.message??"Validation failed":"Validation failed"}function tt(e,t){let{schema:r,maxRetries:s=2,extractJson:n=xt,schemaDescription:a}=t;if(!Number.isFinite(s)||s<0)throw new Error("[Directive] withStructuredOutput: maxRetries must be a non-negative finite number.");let o=a??r.description??"the specified JSON schema";return async(c,i,l)=>{let d={...c,instructions:(c.instructions??"")+`
|
|
33
|
+
|
|
34
|
+
IMPORTANT: Respond with valid JSON matching `+o+". Output ONLY the JSON object, no additional text or markdown formatting."},u,m;for(let f=0;f<=s;f++){let R=f===0?i:`${i}
|
|
35
|
+
|
|
36
|
+
Your previous response was not valid JSON. Error: ${m}
|
|
37
|
+
Please try again with valid JSON only.`,b=await e(d,R,l);u=b;let v=typeof b.output=="string"?b.output:JSON.stringify(b.output);try{let y=n(v),h=r.safeParse(y);if(h.success)return {...b,output:h.data};m=sn(h.error);}catch(y){m=y instanceof Error?y.message:String(y);}}throw new Oe(`[Directive] Failed to get valid structured output after ${s+1} attempts: ${m}`,u)}}var Oe=class extends Error{lastResult;constructor(t,r){super(t),this.name="StructuredOutputError",this.lastResult=r;}};function ln(e){if(e==null||typeof e!="object")return false;let t=e;return typeof t.getState=="function"&&typeof t.addMessage=="function"&&typeof t.clear=="function"}function dn(e){return e?ln(e)?e:je({strategy:ke(),strategyConfig:{maxMessages:e.maxMessages??50,preserveRecentCount:e.preserveRecentCount??6},autoManage:true}):null}function gn(e){if(e==null||typeof e!="object")return false;let t=e;return typeof t.execute=="function"&&typeof t.getState=="function"&&typeof t.reset=="function"}function pn(e){if(!e)return null;if(gn(e))return e;let t=e;if(t.failureThreshold!=null&&t.failureThreshold<1)throw new Error("[AgentStack] circuitBreaker.failureThreshold must be at least 1.");if(t.recoveryTimeMs!=null&&t.recoveryTimeMs<0)throw new Error("[AgentStack] circuitBreaker.recoveryTimeMs must be non-negative.");return plugins.createCircuitBreaker(t)}function Et(e){if(e==null||typeof e!="object")return false;let t=e;return typeof t.startSpan=="function"&&typeof t.endSpan=="function"&&typeof t.getDashboard=="function"}function mn(e){return e?Et(e)?e:plugins.createObservability({serviceName:e.serviceName,metrics:{enabled:true},tracing:{enabled:true,sampleRate:1},alerts:e.alerts}):null}function fn(e){if(e==null||typeof e!="object")return false;let t=e;return typeof t.lookup=="function"&&typeof t.store=="function"&&typeof t.getStats=="function"}function yn(e){if(!e)return null;if(fn(e))return e;if(e.threshold!=null&&(e.threshold<0||e.threshold>1))throw new Error("[AgentStack] cache.threshold must be between 0 and 1.");if(e.maxSize!=null&&e.maxSize<1)throw new Error("[AgentStack] cache.maxSize must be at least 1.");return e.embedder||console.warn("[AgentStack] No cache embedder provided \u2014 using test embedder (character frequency). Provide a real embedder for production use."),We({embedder:e.embedder??Ve(),similarityThreshold:e.threshold??.95,maxCacheSize:e.maxSize??500,ttlMs:e.ttlMs??3e5})}function hn(e){if(e==null||typeof e!="object")return false;let t=e;return typeof t.publish=="function"&&typeof t.getHistory=="function"&&typeof t.clear=="function"}function bn(e){return e?hn(e)?e:qe({maxHistory:e.maxHistory??100}):null}var rt=class{result;abort;_channel;constructor(t,r,s){this._channel=t,this.result=r,this.abort=s;}[Symbol.asyncIterator](){return this._channel[Symbol.asyncIterator]()}};function Rn(e){let{streaming:t,agents:r,patterns:s,guardrails:n={},maxTokenBudget:a,debug:o=false}=e,c=e.costPerMillionTokens??e.costRatePerMillion??0;e.retry&&e.intelligentRetry&&console.warn("[AgentStack] Both 'retry' (orchestrator-level) and 'intelligentRetry' (HTTP-aware) are configured. This causes double-retry behavior. Use 'intelligentRetry' for HTTP status-aware retry, or 'retry' for orchestrator-level retry, but not both.");let i=e.runner;e.modelSelection&&e.modelSelection.length>0&&(i=et(i,e.modelSelection)),e.fallback&&(i=Ye([i,...e.fallback.runners],e.fallback.config)),e.intelligentRetry&&(i=Qe(i,e.intelligentRetry)),e.budget&&(i=Ze(i,e.budget)),e.structuredOutput&&(i=tt(i,e.structuredOutput));let l=dn(e.memory),d=pn(e.circuitBreaker),u=mn(e.observability),m=yn(e.cache),f=bn(e.messageBus??e.bus),R=u?plugins.createAgentMetrics(u):null,b=null,v=null,y=0;if(e.rateLimit){let{maxPerMinute:k}=e.rateLimit;if(k<1||!Number.isFinite(k))throw new Error("[AgentStack] rateLimit.maxPerMinute must be a positive finite number.");v=[];let B=v;b={name:"rate-limit",fn:()=>{let F=Date.now(),U=F-6e4;for(;y<B.length&&B[y]<U;)y++;return y>B.length/2&&y>100&&(B.splice(0,y),y=0),B.length-y>=k?{passed:false,reason:`Rate limit exceeded (${k}/min)`}:(B.push(F),{passed:true})}};}let h=[...b?[b]:[],...n.input??[]],g=nt({runner:i,maxTokenBudget:a,memory:l??void 0,circuitBreaker:d??void 0,guardrails:{input:h.length>0?h:void 0,output:n.output},constraints:e.constraints,resolvers:e.resolvers,autoApproveToolCalls:e.approvals?.autoApproveToolCalls,onApprovalRequest:e.approvals?.onRequest,approvalTimeoutMs:e.approvals?.timeoutMs,agentRetry:e.retry,hooks:e.hooks,debug:o}),T=null;r&&(T=Le({runner:i,agents:r,patterns:s}));let E=null;t&&(E=Be(t.runner,{streamingGuardrails:n.streaming}));let S=null,p=null;if(e.otlp&&u){if(e.otlp.intervalMs!=null&&(!Number.isFinite(e.otlp.intervalMs)||e.otlp.intervalMs<1e3))throw new Error("[AgentStack] otlp.intervalMs must be at least 1000ms.");S=plugins.createOTLPExporter({endpoint:e.otlp.endpoint,serviceName:e.observability&&!Et(e.observability)?e.observability.serviceName:"directive-agents",onError:e.otlp.onError});let k=e.otlp.onError,B=e.otlp.intervalMs??15e3;p=setInterval(()=>{if(!(!u||!S))try{let F=u.export();F.metrics.length>0&&S.exportMetrics(F.metrics),F.traces.length>0&&S.exportTraces(F.traces);}catch(F){k?.(F instanceof Error?F:new Error(String(F)),"metrics");}},B);}let w=0;function C(k){if(!r)throw new Error(`[AgentStack] No agents registered.
|
|
38
|
+
Add to config: agents: { myAgent: { agent: myAgentDef, description: '...' } }`);let B=r[k];if(!B){let F=Object.keys(r).join(", ");throw new Error(`[AgentStack] Agent "${k}" not found in registry. Available: ${F}`)}return B.agent}async function x(k,B,F={}){let U=C(k),z=F.cache===false;if(m&&!z)try{let _=await m.lookup(B,k);if(_.hit&&_.entry){u?.incrementCounter("cache.hits");try{return {output:JSON.parse(_.entry.response),messages:[],toolCalls:[],totalTokens:0,isCached:!0}}catch{o&&console.debug(`[AgentStack] Cache hit for "${k}" contained invalid JSON \u2014 falling through to fresh run.`);}}u?.incrementCounter("cache.misses");}catch{u?.incrementCounter("cache.lookup.errors");}let I=u?.startSpan(`agent.${k}`),D=Date.now();try{let _={};F.guardrails?.output?_.outputGuardrails=F.guardrails.output:r?.[k]?.guardrails?.output&&(_.outputGuardrails=[...n.output??[],...r[k].guardrails.output]),F.signal&&(_.signal=F.signal);let N=await g.run(U,B,_),$=Date.now()-D;if(w+=N.totalTokens,m&&!z&&N.output!=null)try{let G=typeof N.output=="string"?N.output:JSON.stringify(N.output);await m.store(B,G,k);}catch{u?.incrementCounter("cache.store.errors");}return f&&f.publish({type:"INFORM",from:k,to:"*",topic:`${k}.completed`,content:{tokenCount:N.totalTokens}}),R&&R.trackRun(k,{success:!0,latencyMs:$,cost:c>0?se(N.totalTokens,c):void 0}),I&&u?.endSpan(I.spanId,"ok"),N}catch(_){let N=Date.now()-D;throw I&&u?.endSpan(I.spanId,"error"),R&&R.trackRun(k,{success:false,latencyMs:N}),_}}async function M(k,B,F){let{validate:U,retries:z=1,...I}=F,D=null;for(let _=0;_<=z;_++){let N=_>0?{...I,cache:false}:I,$=await x(k,B,N),G=U($.output);if(typeof G=="boolean"?G:G.valid)return $;let H=typeof G=="object"&&G.errors?G.errors.join("; "):"Validation failed";D=new Z({message:`Output validation failed (attempt ${_+1}/${z+1}): ${H}`,code:"OUTPUT_GUARDRAIL_FAILED",guardrailName:"runStructured",guardrailType:"output",agentName:k,input:B,data:$.output}),o&&console.debug(`[AgentStack] runStructured validation failed (attempt ${_+1}):`,H);}throw D}async function L(k,B,F={}){if(!T)throw new Error("[AgentStack] No agents/patterns configured. Provide 'agents' and 'patterns' config.");let U=F.cache===false;if(m&&!U)try{let N=await m.lookup(B,k);if(N.hit&&N.entry){u?.incrementCounter("cache.hits");try{return JSON.parse(N.entry.response)}catch{o&&console.debug(`[AgentStack] Cache hit for pattern "${k}" contained invalid JSON \u2014 falling through to fresh run.`);}}u?.incrementCounter("cache.misses");}catch{u?.incrementCounter("cache.lookup.errors");}for(let N of h){let $=typeof N=="function"?N:N.fn,G=typeof N=="function"?"input-guardrail":N.name,J=await $({input:B,agentName:k},{agentName:k,input:B,facts:{}});if(J&&!J.passed)throw new Z({message:`Input guardrail "${G}" failed: ${J.reason??"unknown"}`,code:"INPUT_GUARDRAIL_FAILED",guardrailName:G,guardrailType:"input",agentName:k,input:B})}let z=u?.startSpan(`pattern.${k}`),I=Date.now(),D=T.getAllAgentStates(),_=0;for(let N of Object.values(D))_+=N.totalTokens;try{let N=await T.runPattern(k,B),$=Date.now()-I,G=T.getAllAgentStates(),J=0;for(let Y of Object.values(G))J+=Y.totalTokens;let H=J-_;if(w+=H,m&&!U&&N!=null)try{let Y=typeof N=="string"?N:JSON.stringify(N);await m.store(B,Y,k);}catch{u?.incrementCounter("cache.store.errors");}return f&&f.publish({type:"INFORM",from:k,to:"*",topic:`${k}.completed`,content:{patternTokens:H}}),R&&R.trackRun(k,{success:!0,latencyMs:$,cost:c>0?se(H,c):void 0}),z&&u?.endSpan(z.spanId,"ok"),N}catch(N){let $=Date.now()-I;throw z&&u?.endSpan(z.spanId,"error"),R&&R.trackRun(k,{success:false,latencyMs:$}),N}}function A(k,B,F={}){if(!E)throw new Error(`[AgentStack] Streaming not configured.
|
|
39
|
+
Add to config: streaming: { runner: createStreamingCallbackRunner(...) }`);if(d?.getState()==="OPEN")throw new Error("[AgentStack] Circuit breaker is OPEN. Streaming call rejected.");let U=C(k),z=be({bufferSize:100}),I=new AbortController,D=()=>I.abort();F.signal&&F.signal.addEventListener("abort",D,{once:true});let _=u?.startSpan(`stream.${k}`),N=Date.now(),{stream:$,result:G,abort:J}=E(U,B,{signal:I.signal}),H=Ke($,z,X=>X.type==="token"?X.data:""),Y=G.then(X=>{let j=Date.now()-N;return w+=X.totalTokens,F.signal?.removeEventListener("abort",D),_&&u?.endSpan(_.spanId,"ok"),f&&f.publish({type:"INFORM",from:k,to:"*",topic:`${k}.stream.completed`,content:{tokenCount:X.totalTokens}}),R&&R.trackRun(k,{success:true,latencyMs:j,cost:c>0?se(X.totalTokens,c):void 0}),X}).catch(X=>{let j=Date.now()-N;throw F.signal?.removeEventListener("abort",D),_&&u?.endSpan(_.spanId,"error"),R&&R.trackRun(k,{success:false,latencyMs:j}),X});return H.catch(X=>{o&&console.debug("[AgentStack] Pipe error:",X);}),new rt(z,Y,()=>{J(),I.abort(),F.signal?.removeEventListener("abort",D);})}function P(k,B,F={}){if(!E)throw new Error(`[AgentStack] Streaming not configured.
|
|
40
|
+
Add to config: streaming: { runner: createStreamingCallbackRunner(...) }`);if(d?.getState()==="OPEN")throw new Error("[AgentStack] Circuit breaker is OPEN. Streaming call rejected.");let U=C(k),z=new AbortController,I=()=>z.abort();F.signal&&F.signal.addEventListener("abort",I,{once:true});let D=u?.startSpan(`streamChunks.${k}`),_=Date.now(),{stream:N,result:$,abort:G}=E(U,B,{signal:z.signal}),J=$.then(Y=>{let X=Date.now()-_;return w+=Y.totalTokens,F.signal?.removeEventListener("abort",I),D&&u?.endSpan(D.spanId,"ok"),f&&f.publish({type:"INFORM",from:k,to:"*",topic:`${k}.streamChunks.completed`,content:{tokenCount:Y.totalTokens}}),R&&R.trackRun(k,{success:true,latencyMs:X,cost:c>0?se(Y.totalTokens,c):void 0}),Y}).catch(Y=>{let X=Date.now()-_;throw F.signal?.removeEventListener("abort",I),D&&u?.endSpan(D.spanId,"error"),R&&R.trackRun(k,{success:false,latencyMs:X}),Y}),H=false;return {stream:N,result:J,abort:()=>{H||(H=true,G(),z.abort(),F.signal?.removeEventListener("abort",I));}}}function O(){let k=null;if(e.rateLimit&&v){let F=Date.now()-6e4;for(;y<v.length&&v[y]<F;)y++;let U=v.length-y;k=Math.max(0,e.rateLimit.maxPerMinute-U);}return {totalTokens:w,estimatedCost:c>0?se(w,c):0,circuitState:d?.getState()??"CLOSED",cacheStats:m?.getStats()??{totalEntries:0,totalHits:0,totalMisses:0,hitRate:0,avgSimilarityOnHit:0,oldestEntry:null,newestEntry:null},memoryMessageCount:l?.getState()?.messages?.length??0,busMessageCount:f?.getHistory()?.length??0,rateLimitRemaining:k}}function q(){l?.clear(),d?.reset(),m?.clear(),u?.clear(),f?.clear(),T?.reset(),v&&(v.length=0,y=0),w=0;}let W=false;async function K(){if(!W){if(W=true,p&&u&&S){clearInterval(p),p=null;try{let k=u.export();k.metrics.length>0&&S.exportMetrics(k.metrics),k.traces.length>0&&S.exportTraces(k.traces);}catch{}}else p&&(clearInterval(p),p=null);g.dispose(),T?.dispose(),await u?.dispose();}}return {run:x,runStructured:M,runPattern:L,stream:A,streamChunks:P,approve:k=>g.approve(k),reject:(k,B)=>g.reject(k,B),getState:O,reset:q,dispose:K,get orchestrator(){return g},get observability(){return u},get messageBus(){return f},get coordinator(){return T},get cache(){return m},get memory(){return l},getTimeline(k=50){return {spans:u?.getTraces(k)??[],metrics:u?.getDashboard()?.metrics??{}}},get obs(){return u},get bus(){return f},get multi(){return T}}}function vn(e,t){return function(){t(e.getState());}}function wn(e,t){let r=e.metadata.title??"",s=e.metadata.section??"",n=e.metadata.url??"";return `${r&&s&&n?`[${r} \u2014 ${s}](${n})`:r||e.id}
|
|
41
|
+
${e.content}`}function Sn(e,t){return e.length===0?"":`Relevant documentation context:
|
|
42
|
+
|
|
43
|
+
${e.join(`
|
|
44
|
+
|
|
45
|
+
`)}`}function An(e,t,r){return Math.max(t,Math.min(r,e))}function Tn(e){let{embedder:t,storage:r,topK:s=5,minSimilarity:n=.3,formatChunk:a=wn,formatContext:o=Sn,onError:c}=e,i=An(n,0,1);typeof process<"u"&&process.env?.NODE_ENV==="development"&&n!==i&&console.warn(`[Directive] RAG: minSimilarity ${n} clamped to ${i} (valid range: 0-1)`);async function l(u,m){let f=Math.max(1,Math.floor(m??s));if(r.search)return r.search(await t(u),f,i);let R=await t(u),v=(await r.getChunks()).map(y=>({...y,similarity:oe(R,y.embedding)}));return v.sort((y,h)=>h.similarity-y.similarity),v.filter(y=>y.similarity>=i).slice(0,f)}async function d(u,m={}){let{prefix:f,history:R,topK:b,filter:v}=m,y=[];try{y=await l(u,b);}catch(E){c?.(E instanceof Error?E:new Error(String(E)));}v&&(y=y.filter(E=>v(E)));let h=y.map(E=>a(E,E.similarity)),g=o(h,u),T=[];if(f&&T.push(f),g&&T.push(g),R&&R.length>0){let E=R.map(S=>`${S.role.charAt(0).toUpperCase()+S.role.slice(1)}: ${S.content}`).join(`
|
|
46
|
+
|
|
47
|
+
`);T.push(`Previous conversation:
|
|
48
|
+
${E}`);}return T.push(u),T.join(`
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
`)}return {retrieve:l,enrich:d}}function Cn(e){let{filePath:t,mapEntry:r,ttlMs:s=0}=e,n=null,a=0;async function o(){if(n&&(s===0||Date.now()-a<s))return n;try{let i=await(await import('fs')).promises.readFile(t,"utf-8"),l=JSON.parse(i);return n=r?l.map(r):l,a=Date.now(),n}catch(c){return typeof process<"u"&&process.env?.NODE_ENV==="development"&&console.warn(`[Directive] JSONFileStore: failed to load ${t}:`,c),n=[],a=Date.now(),n}}return {async getChunks(){return o()},async size(){return (await o()).length},async reload(){n=null,a=0,await o();},dispose(){n=null,a=0;}}}var Mt="AI service temporarily unavailable. Please try again.";function kn(e={}){let{maxResponseChars:t=Number.POSITIVE_INFINITY,truncationMessage:r=`
|
|
53
|
+
|
|
54
|
+
*[Response truncated]*`,heartbeatIntervalMs:s=0,errorMessages:n,headers:a}=e;if(t<0)throw new RangeError("maxResponseChars must be non-negative");if(s<0)throw new RangeError("heartbeatIntervalMs must be non-negative");function o(l){if(typeof n=="function")try{return n(l)}catch{return Mt}if(n&&typeof n=="object"){let d=l!=null&&typeof l=="object"&&"code"in l&&typeof l.code=="string"?l.code:void 0;if(d&&d in n)return n[d]}return Mt}function c(l,d,u,m){let f=new TextEncoder;function R(b){return f.encode(`data: ${JSON.stringify(b)}
|
|
55
|
+
|
|
56
|
+
`)}return new ReadableStream({async start(b){let v=null,y=null;try{s>0&&(v=setInterval(()=>{try{b.enqueue(R({type:"heartbeat",timestamp:Date.now()}));}catch{}},s)),y=l.stream(d,u,{signal:m?.signal});let h=0,g=!1;for await(let T of y){if(h+=T.length,h>t){b.enqueue(R({type:"truncated",text:r})),b.enqueue(R({type:"done"})),g=!0,y.abort();break}b.enqueue(R({type:"text",text:T}));}try{await y.result;}catch{}g||b.enqueue(R({type:"done"}));}catch(h){let g=o(h);b.enqueue(R({type:"error",message:g}));}finally{v&&clearInterval(v),b.close();}}})}let i={"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive",...a};return {toResponse(l,d,u,m){let f=c(l,d,u,m);return new Response(f,{headers:i})},toStream(l,d,u,m){return c(l,d,u,m)}}}function xn(e,t={}){let{maxBatchSize:r=20,maxWaitMs:s=5e3,concurrency:n=5}=t;if(!Number.isFinite(r)||r<1)throw new Error("[Directive] createBatchQueue: maxBatchSize must be a positive finite number (>= 1).");if(!Number.isFinite(s)||s<0)throw new Error("[Directive] createBatchQueue: maxWaitMs must be a non-negative finite number.");if(!Number.isFinite(n)||n<1)throw new Error("[Directive] createBatchQueue: concurrency must be a positive finite number (>= 1).");let a=[],o=null,c=false,i=null;function l(){o===null&&(o=setTimeout(()=>{o=null,m().catch(()=>{});},s));}function d(){o!==null&&(clearTimeout(o),o=null);}async function u(f){let R=0;async function b(){for(;R<f.length;){let y=R++,h=f[y];try{let g=await e(h.agent,h.input,h.options);h.resolve(g);}catch(g){h.reject(g instanceof Error?g:new Error(String(g)));}}}let v=Array.from({length:Math.min(n,f.length)},()=>b());await Promise.all(v);}async function m(){if(i&&await i,a.length===0)return;d();let f=a.splice(0);i=u(f).finally(()=>{i=null,a.length>0&&l();}),await i;}return {submit(f,R,b){return c?Promise.reject(new Error("[Directive] BatchQueue has been disposed.")):new Promise((v,y)=>{a.push({agent:f,input:R,options:b,resolve:v,reject:y}),a.length>=r?(d(),m().catch(()=>{})):l();})},async flush(){await m();},get pending(){return a.length},async dispose(){c||(c=true,d(),a.length>0&&await m());}}}function Pt(){return {callCount:0,errorCount:0,totalCost:0,avgLatencyMs:0,lastErrorAt:null}}function En(e,t){return !e||!t?0:e.inputTokens/1e6*t.inputPerMillion+e.outputTokens/1e6*t.outputPerMillion}function Mn(e){let{providers:t,defaultProvider:r,constraints:s=[],onProviderSelected:n,errorCooldownMs:a=3e4,preferCheapest:o=false}=e;if(!Number.isFinite(a)||a<0)throw new Error("[Directive] createConstraintRouter: errorCooldownMs must be a non-negative finite number.");let c=new Map;for(let R of t)c.set(R.name,R);if(!c.has(r))throw new Error(`[Directive] Default provider "${r}" not found in providers list.`);let i={totalCost:0,callCount:0,errorCount:0,lastProvider:null,avgLatencyMs:0,providers:Object.create(null)};for(let R of t)i.providers[R.name]=Pt();let l=0,d=[...s].sort((R,b)=>(b.priority??0)-(R.priority??0));function u(){let R=Date.now();for(let v of d)try{if(v.when(i)){let y=c.get(v.provider);if(y)return {provider:y,reason:"constraint"}}}catch{}let b=t.filter(v=>{let y=i.providers[v.name];return y?!(y.lastErrorAt&&R-y.lastErrorAt<a):true});if(o&&b.length>0){let v=[...b].sort((y,h)=>{let g=y.pricing?y.pricing.inputPerMillion+y.pricing.outputPerMillion:1/0,T=h.pricing?h.pricing.inputPerMillion+h.pricing.outputPerMillion:1/0;return g!==T?g-T:y.name===r?-1:h.name===r?1:0});if(v[0]!==c.get(r))return {provider:v[0],reason:"cheapest"}}return b.length>0&&!b.some(v=>v.name===r)?{provider:b[0],reason:"default"}:{provider:c.get(r),reason:"default"}}function m(R,b,v,y,h){let g=i.providers[R]??Pt();if(g.callCount++,i.callCount++,h)g.errorCount++,i.errorCount++,g.lastErrorAt=Date.now();else {let E=En(v,y);g.totalCost+=E,i.totalCost+=E;}l+=b,i.avgLatencyMs=l/i.callCount;let T=g.callCount>0?(g.avgLatencyMs*(g.callCount-1)+b)/g.callCount:b;g.avgLatencyMs=T,i.providers[R]=g,i.lastProvider=R;}let f=async(R,b,v)=>{let{provider:y,reason:h}=u();try{n?.(y.name,h);}catch{}let g=Date.now();try{let T=await y.runner(R,b,v),E=Date.now()-g;return m(y.name,E,T.tokenUsage,y.pricing),T}catch(T){let E=Date.now()-g,S=T instanceof Error?T:new Error(String(T));throw m(y.name,E,void 0,y.pricing,S),S}};return Object.defineProperty(f,"facts",{get:()=>{let R=Object.create(null);for(let b of Object.keys(i.providers))R[b]={...i.providers[b]};return {...i,providers:R}},enumerable:true}),f}function Pn(e,t=false){let r=false,s=[],n=[],a=t?(o,...c)=>console.debug(`[MCP Stub] ${o}`,...c):()=>{};return {async connect(){a(`Connecting to ${e.name} (${e.transport})`),r=true;},async disconnect(){r=false;},isConnected(){return r},getCapabilities(){return {tools:true,resources:true,prompts:true}},async listTools(){return s},async callTool(o,c){return a(`Calling tool ${o}`,c),{content:[{type:"text",text:`Stub result for ${o}`}]}},async listResources(){return n},async readResource(o){return a(`Reading resource ${o}`),{contents:[{uri:o,text:`Stub content for ${o}`}]}},async listPrompts(){return []},async getPrompt(o){return {messages:[{role:"user",content:{type:"text",text:`Stub prompt ${o}`}}]}}}}function In(e,t,r){let s=Date.now(),n=e.get(t);return !n||s>n.resetTime?(e.set(t,{count:1,resetTime:s+6e4}),true):n.count>=r?false:(n.count++,true)}function On(e){let{servers:t,toolConstraints:r={},resourceMappings:s=[],events:n={},autoConnect:a=false,autoReconnect:o=true,debug:c=false}=e;!e.clientFactory&&(typeof process<"u"&&process.env?.NODE_ENV==="production"?console.warn(`[Directive MCP] WARNING: Using stub MCP client in production!
|
|
57
|
+
The stub client returns mock data and does not connect to real MCP servers.
|
|
58
|
+
Provide a real 'clientFactory' option to connect to actual MCP servers:
|
|
59
|
+
|
|
60
|
+
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
61
|
+
|
|
62
|
+
const adapter = createMCPAdapter({
|
|
63
|
+
servers: [...],
|
|
64
|
+
clientFactory: (config) => new Client(config),
|
|
65
|
+
});`):c&&console.debug("[Directive MCP] Using stub client for development. Provide 'clientFactory' for production use."));let l=e.clientFactory??(p=>Pn(p,c)),d=e.approvalTimeoutMs??3e5,u={servers:new Map,toolConstraints:new Map(Object.entries(r)),rateLimiters:new Map,pendingApprovals:new Map,approvedRequests:new Set,rejectedRequests:new Set},m=0,f=new Map,R=new Map;function b(p){return new Promise((w,C)=>{if(u.approvedRequests.has(p)){u.approvedRequests.delete(p),u.pendingApprovals.delete(p),n.onApprovalResolved?.(p,true),w();return}if(u.rejectedRequests.has(p)){u.rejectedRequests.delete(p),u.pendingApprovals.delete(p);let M=R.get(p);R.delete(p),n.onApprovalResolved?.(p,false),C(new Error(`[Directive MCP] Tool call request ${p} was rejected${M?`: ${M}`:""}`));return}let x=setTimeout(()=>{f.delete(p),u.pendingApprovals.delete(p),C(new Error(`[Directive MCP] Approval timeout: Request ${p} was not approved or rejected within ${d}ms. Call adapter.approve("${p}") or adapter.reject("${p}") to resolve.`));},d);f.set(p,{resolve:w,reject:C,timeoutId:x});})}function v(p,w,C){let x=f.get(p);x?(clearTimeout(x.timeoutId),f.delete(p),u.pendingApprovals.delete(p),n.onApprovalResolved?.(p,w),w?x.resolve():x.reject(new Error(`[Directive MCP] Tool call request ${p} was rejected${C?`: ${C}`:""}`))):(w?u.approvedRequests.add(p):(u.rejectedRequests.add(p),C&&R.set(p,C)),setTimeout(()=>{u.approvedRequests.delete(p),u.rejectedRequests.delete(p),R.delete(p),u.pendingApprovals.delete(p);},d));}let y=new Map;for(let p of t)u.servers.set(p.name,{config:p,client:null,tools:[],resources:[],status:"disconnected"}),y.set(p.name,{timer:null,attempts:0,maxAttempts:p.retry?.maxAttempts??10,baseDelay:p.retry?.backoffMs??5e3});async function h(p){let w=u.servers.get(p);if(!w)throw new Error(`Unknown MCP server: ${p}`);if(w.status!=="connected"){w.status="connecting";try{let C=l(w.config);await C.connect(),w.client=C,w.status="connected";let x=y.get(p);x&&(x.attempts=0,x.timer&&(clearTimeout(x.timer),x.timer=null)),C.getCapabilities().tools&&(w.tools=await C.listTools()),C.getCapabilities().resources&&(w.resources=await C.listResources()),w.lastSync=Date.now(),n.onConnect?.(p);}catch(C){if(w.status="error",w.error=C instanceof Error?C:new Error(String(C)),n.onError?.(p,w.error),o){let x=y.get(p);if(x&&x.attempts<x.maxAttempts){x.attempts++;let M=Math.min(x.baseDelay*Math.pow(2,x.attempts-1)+Math.random()*1e3,6e4);x.timer=setTimeout(()=>{x.timer=null,h(p).catch(()=>{});},M);}else x&&console.error(`[Directive MCP] Max reconnect attempts (${x.maxAttempts}) reached for server '${p}'. Call adapter.connectServer("${p}") to retry manually.`);}throw w.error}}}async function g(p){let w=y.get(p);w?.timer&&(clearTimeout(w.timer),w.timer=null,w.attempts=0);let C=u.servers.get(p);if(!(!C||!C.client))try{await C.client.disconnect();}finally{C.status="disconnected",C.client=null,n.onDisconnect?.(p);}}async function T(p,w,C,x){let M=u.servers.get(p);if(!M)throw new Error(`[Directive MCP] Unknown server '${p}'. Available servers: ${Array.from(u.servers.keys()).join(", ")||"(none)"}`);if(!M.client)throw new Error(`[Directive MCP] Server '${p}' is not connected. Call 'adapter.connect()' or 'adapter.connectServer("${p}")' first.`);let L=`${p}.${w}`,A=u.toolConstraints.get(L);if(A){if(A.rateLimit){let O=u.rateLimiters.get(L);if(!In(u.rateLimiters,L,A.rateLimit)){let q=O?.resetTime?new Date(O.resetTime).toISOString():"unknown";throw new Error(`[Directive MCP] Rate limit exceeded for '${L}': ${O?.count??0}/${A.rateLimit} requests per minute. Resets at ${q}.`)}}if(A.maxArgSize){let O=JSON.stringify(C).length;if(O>A.maxArgSize)throw new Error(`Arguments exceed max size (${O} > ${A.maxArgSize})`)}if(A.when&&!await A.when(x,C))throw new Error(`Constraint not satisfied for ${L}`);if(A.requireApproval){let O=`approval-${++m}-${Date.now()}`,q={id:O,server:p,tool:w,args:C,requestedAt:Date.now()};u.pendingApprovals.set(O,q),n.onApprovalRequest?.(q),await b(O);}}n.onToolCall?.(p,w,C);let P=await Promise.race([M.client.callTool(w,C),new Promise((O,q)=>setTimeout(()=>q(new Error(`Tool call timeout: ${L}`)),A?.timeout??3e4))]);return n.onToolResult?.(p,w,P),P}let E={name:"mcp-adapter",onInit:async()=>{a&&await Promise.all(Array.from(u.servers.keys()).map(p=>h(p).catch(w=>console.error(`Failed to connect to ${p}:`,w))));},onDestroy:async()=>{for(let p of y.values())p.timer&&(clearTimeout(p.timer),p.timer=null);for(let[,p]of f)clearTimeout(p.timeoutId),p.reject(new Error("[Directive MCP] Adapter destroyed while awaiting approval"));f.clear(),await Promise.all(Array.from(u.servers.keys()).map(p=>g(p).catch(w=>console.error(`Failed to disconnect from ${p}:`,w))));}};async function S(p){for(let w of s)for(let[C,x]of u.servers)if(x.client){for(let M of x.resources)if(typeof w.pattern=="string"?Nn(M.uri,w.pattern):w.pattern.test(M.uri))try{let A=await x.client.readResource(M.uri),P=A.contents[0]?.text??"",O=w.transform?w.transform(P):P;p[w.factKey]=O,n.onResourceUpdate?.(C,M.uri,A);}catch(A){console.error(`Failed to sync resource ${M.uri}:`,A);}}}return {plugin:E,async connect(){await Promise.all(Array.from(u.servers.keys()).map(h));},connectServer:h,async disconnect(){await Promise.all(Array.from(u.servers.keys()).map(g));},disconnectServer:g,getTools(){let p=new Map;for(let[w,C]of u.servers)p.set(w,C.tools);return p},getResources(){let p=new Map;for(let[w,C]of u.servers)p.set(w,C.resources);return p},async callTool(p,w,C,x){return T(p,w,C,x)},async callToolDirect(p,w,C){let x=u.servers.get(p);if(!x)throw new Error(`[Directive MCP] Unknown server '${p}'. Available servers: ${Array.from(u.servers.keys()).join(", ")||"(none)"}`);if(!x.client)throw new Error(`[Directive MCP] Server '${p}' is not connected. Call 'adapter.connect()' or 'adapter.connectServer("${p}")' first.`);n.onToolCall?.(p,w,C);let M=await x.client.callTool(w,C);return n.onToolResult?.(p,w,M),M},async readResource(p,w){let C=u.servers.get(p);if(!C)throw new Error(`[Directive MCP] Unknown server '${p}'. Available servers: ${Array.from(u.servers.keys()).join(", ")||"(none)"}`);if(!C.client)throw new Error(`[Directive MCP] Server '${p}' is not connected. Call 'adapter.connect()' or 'adapter.connectServer("${p}")' first.`);let x=await C.client.readResource(w);return n.onResourceUpdate?.(p,w,x),x},syncResources:S,getServerStatus(p){return u.servers.get(p)},getAllServerStatuses(){return new Map(u.servers)},approve(p){if(!u.pendingApprovals.get(p)&&!f.has(p))throw new Error(`[Directive MCP] No pending approval request with ID '${p}'. Pending requests: ${Array.from(u.pendingApprovals.keys()).join(", ")||"(none)"}`);v(p,true);},reject(p,w){if(!u.pendingApprovals.get(p)&&!f.has(p))throw new Error(`[Directive MCP] No pending approval request with ID '${p}'. Pending requests: ${Array.from(u.pendingApprovals.keys()).join(", ")||"(none)"}`);v(p,false,w);},getPendingApprovals(){return Array.from(u.pendingApprovals.values())},getRejectionReason(p){return R.get(p)}}}var ve=new Map,Dn=200;function Nn(e,t){let r=ve.get(t);if(!r){let s=t.replace(/\*\*/g,"\0GLOBSTAR\0").replace(/\*/g,"\0STAR\0").replace(/\?/g,"\0QUESTION\0").replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\0GLOBSTAR\0/g,".*").replace(/\0STAR\0/g,"[^/]*").replace(/\0QUESTION\0/g,".");if(r=new RegExp(`^${s}$`),ve.size>=Dn){let n=ve.keys().next().value;n!==void 0&&ve.delete(n);}ve.set(t,r);}return r.test(e)}function Gn(e){let t=[];for(let[r,s]of e)for(let n of s)t.push({type:"function",function:{name:`${r}.${n.name}`,description:n.description??`Tool: ${n.name}`,parameters:n.inputSchema}});return t}function Fn(e,t,r){return {type:"MCP_CALL_TOOL",server:e,tool:t,args:r}}function _n(e,t){return {type:"MCP_READ_RESOURCE",server:e,uri:t}}function jn(e,t,r){return {type:"MCP_GET_PROMPT",server:e,prompt:t,args:r}}function $n(e,t){return {type:"MCP_SYNC_RESOURCES",server:e,pattern:t}}function te(e){return adapterUtils.getBridgeFact(e,ae)}function ee(e,t){adapterUtils.setBridgeFact(e,ae,t);}function le(e){return adapterUtils.getBridgeFact(e,ge)}function ie(e,t){adapterUtils.setBridgeFact(e,ge,t);}function st(e){return adapterUtils.getBridgeFact(e,Te)}function De(e,t){adapterUtils.setBridgeFact(e,Te,t);}function ot(e){return adapterUtils.getBridgeFact(e,Ce)}function Ne(e,t){adapterUtils.setBridgeFact(e,Ce,t);}function de(e){return {agent:te(e),approval:le(e),conversation:st(e),toolCalls:ot(e)}}function Hn(e){let t={};for(let[r,s]of Object.entries(e))t[r]={priority:s.priority??0,when:n=>{let a=de(n),o={...n,...a};return s.when(o)},require:n=>{let a=de(n),o={...n,...a};return typeof s.require=="function"?s.require(o):s.require}};return t}function zn(e,t,r){let s={};for(let[n,a]of Object.entries(e))s[n]={requirement:a.requirement,key:a.key,resolve:async(o,c)=>{let i=de(c.facts),d={facts:{...c.facts,...i},runAgent:async(u,m,f)=>t(u,m,Wn(r()),f),signal:c.signal};await a.resolve(o,d);}};return s}function Wn(e){return de(e)}function ue(e,t,r){return typeof e=="function"?{name:`${r}-guardrail-${t}`,fn:e,critical:true}:e}function Vn(e,t){let{backoff:r="exponential",baseDelayMs:s=100,maxDelayMs:n=5e3}=t,a;switch(r){case "exponential":a=s*Math.pow(2,e-1);break;case "linear":a=s*e;break;default:a=s;}return Math.min(a,n)}async function ce(e,t,r){let{retry:s}=e,n=s?.attempts??1,a;for(let o=1;o<=n;o++)try{return await e.fn(t,r)}catch(c){if(a=c instanceof Error?c:new Error(String(c)),o<n){let i=Vn(o,s??{});await new Promise(l=>setTimeout(l,i));}}throw a}function Jn(e,t){let{backoff:r="exponential",baseDelayMs:s=1e3,maxDelayMs:n=3e4}=t,a;switch(r){case "exponential":a=s*Math.pow(2,e-1);break;case "linear":a=s*e;break;default:a=s;}return Math.min(a,n)}async function It(e,t,r,s,n){let a=n?.attempts??1,o=n?.isRetryable??(()=>true),c=n?.onRetry,i;for(let l=1;l<=a;l++)try{return await e(t,r,s)}catch(d){if(i=d instanceof Error?d:new Error(String(d)),l<a&&o(i)){let u=Jn(l,n??{});c?.(l,i,u),await new Promise(m=>setTimeout(m,u));}else break}throw i}function nt(e){let{runner:t,factsSchema:r={},init:s,constraints:n={},resolvers:a={},guardrails:o={},onApprovalRequest:c,autoApproveToolCalls:i=true,maxTokenBudget:l,plugins:d=[],debug:u=false,approvalTimeoutMs:m=3e5,agentRetry:f,hooks:R={},memory:b,circuitBreaker:v}=e;if(!i&&!c)throw new Error(`[Directive] Invalid approval configuration: autoApproveToolCalls is false but no onApprovalRequest callback provided. Tool calls would wait for approval indefinitely. Either:
|
|
66
|
+
- Set autoApproveToolCalls: true to auto-approve all tool calls
|
|
67
|
+
- Provide an onApprovalRequest callback to handle approvals programmatically`);let y={facts:{...at.facts,...r},derivations:{},events:{},requirements:{}},h,g,T=Hn(n);l&&(T.__budgetLimit={priority:100,when:A=>te(A).tokenUsage>l,require:{type:"__PAUSE_BUDGET_EXCEEDED"}});let E=zn(a,(A,P,O,q)=>h(A,P,O,q),()=>g.facts);E.__pause={requirement:adapterUtils.requirementGuard("__PAUSE_BUDGET_EXCEEDED"),resolve:async(A,P)=>{let O=te(P.facts);ee(P.facts,{...O,status:"paused"});}};let S=adapterUtils.createCallbackPlugin("openai-agents-callbacks",{}),p=core.createModule("openai-agents-orchestrator",{schema:y,init:A=>{if(ee(A,{status:"idle",currentAgent:null,input:null,output:null,error:null,tokenUsage:0,turnCount:0,startedAt:null,completedAt:null}),ie(A,{pending:[],approved:[],rejected:[]}),De(A,[]),Ne(A,[]),s){let P=de(A),O={...A,...P};s(O);}},constraints:T,resolvers:E});g=core.createSystem({module:p,plugins:[...d,S],debug:u?{timeTravel:true}:void 0}),g.start();async function w(A,P,O,q,W){return v?v.execute(()=>C(A,P,O,q,W)):C(A,P,O,q,W)}async function C(A,P,O,q,W){let K=Date.now();if(b){let I=b.getContextMessages();if(I.length>0){let D=I.map(_=>`${_.role}: ${_.content}`).join(`
|
|
68
|
+
`);A={...A,instructions:(A.instructions??"")+`
|
|
69
|
+
|
|
70
|
+
Conversation context:
|
|
71
|
+
`+D};}}R.onAgentStart?.({agentName:A.name,input:P,timestamp:K});let k=W?.inputGuardrails!==void 0?W.inputGuardrails:o.input??[],B=W?.outputGuardrails!==void 0?W.outputGuardrails:o.output??[],F=k.map((I,D)=>ue(I,D,"input"));for(let I of F){let{name:D}=I,_={agentName:A.name,input:P,facts:g.facts.$store.toObject()},N=Date.now(),$=await ce(I,{input:P,agentName:A.name},_);if(R.onGuardrailCheck?.({guardrailName:D,guardrailType:"input",passed:$.passed,reason:$.reason,durationMs:Date.now()-N,timestamp:Date.now()}),!$.passed)throw new Z({code:"INPUT_GUARDRAIL_FAILED",message:`Input guardrail "${D}" failed: ${$.reason}`,guardrailName:D,guardrailType:"input",userMessage:$.reason??"Input validation failed",agentName:A.name,input:P});$.transformed!==void 0&&(P=$.transformed);}g.batch(()=>{let I=te(g.facts);ee(g.facts,{...I,status:"running",currentAgent:A.name,input:P,startedAt:Date.now()});});let U=await It(t,A,P,{...q,signal:q?.signal,onMessage:I=>{let D=st(g.facts);De(g.facts,[...D,I]),q?.onMessage?.(I);},onToolCall:async I=>{let D=(o.toolCall??[]).map((N,$)=>ue(N,$,"toolCall"));for(let N of D){let{name:$}=N,G={agentName:A.name,input:P,facts:g.facts.$store.toObject()},J=Date.now(),H=await ce(N,{toolCall:I,agentName:A.name,input:P},G);if(R.onGuardrailCheck?.({guardrailName:$,guardrailType:"toolCall",passed:H.passed,reason:H.reason,durationMs:Date.now()-J,timestamp:Date.now()}),!H.passed)throw new Z({code:"TOOL_CALL_GUARDRAIL_FAILED",message:`Tool call guardrail "${$}" failed: ${H.reason}`,guardrailName:$,guardrailType:"toolCall",userMessage:H.reason??"Tool call blocked",data:{toolCall:I},agentName:A.name,input:P})}if(!i){let N=`tool-${I.id}`,$={id:N,type:"tool_call",agentName:A.name,description:`Tool call: ${I.name}`,data:I,requestedAt:Date.now()};g.batch(()=>{let G=le(g.facts);ie(g.facts,{...G,pending:[...G.pending,$]});}),c?.($),await x(N);}let _=ot(g.facts);Ne(g.facts,[..._,I]),q?.onToolCall?.(I);}},f?{...f,onRetry:(I,D,_)=>{f.onRetry?.(I,D,_),R.onAgentRetry?.({agentName:A.name,input:P,attempt:I,error:D,delayMs:_,timestamp:Date.now()});}}:void 0),z=B.map((I,D)=>ue(I,D,"output"));for(let I of z){let{name:D}=I,_={agentName:A.name,input:P,facts:g.facts.$store.toObject()},N=Date.now(),$=await ce(I,{output:U.output,agentName:A.name,input:P,messages:U.messages},_);if(R.onGuardrailCheck?.({guardrailName:D,guardrailType:"output",passed:$.passed,reason:$.reason,durationMs:Date.now()-N,timestamp:Date.now()}),!$.passed)throw new Z({code:"OUTPUT_GUARDRAIL_FAILED",message:`Output guardrail "${D}" failed: ${$.reason}`,guardrailName:D,guardrailType:"output",userMessage:$.reason??"Output validation failed",agentName:A.name,input:P});$.transformed!==void 0&&(U.output=$.transformed);}return g.batch(()=>{let I=te(g.facts);ee(g.facts,{...I,status:"completed",output:U.output,tokenUsage:I.tokenUsage+U.totalTokens,turnCount:I.turnCount+U.messages.length,completedAt:Date.now()});}),b&&U.messages.length>0&&b.addMessages(U.messages),R.onAgentComplete?.({agentName:A.name,input:P,output:U.output,tokenUsage:U.totalTokens,durationMs:Date.now()-K,timestamp:Date.now()}),U}h=w;function x(A){return new Promise((P,O)=>{let q=null,W=()=>{q&&(clearTimeout(q),q=null);},K=g.facts.$store.subscribe([ge],()=>{let k=le(g.facts);if(k.approved.includes(A))W(),K(),P();else {let B=k.rejected.find(F=>F.id===A);if(B){W(),K();let F=B.reason?`Request ${A} rejected: ${B.reason}`:`Request ${A} rejected`;O(new Error(F));}}});q=setTimeout(()=>{K();let k=Math.round(m/1e3);O(new Error(`[Directive] Approval timeout: Request ${A} not resolved within ${k}s.
|
|
72
|
+
Solutions:
|
|
73
|
+
1. Handle via onApprovalRequest callback and call orchestrator.approve()/reject()
|
|
74
|
+
2. Set autoApproveToolCalls: true to auto-approve
|
|
75
|
+
3. Increase approvalTimeoutMs (current: ${m}ms)
|
|
76
|
+
See: https://directive.run/docs/ai/running-agents`));},m);})}function M(){return {...de(g.facts)}}return {system:g,get facts(){return M()},async run(A,P,O){return w(A,P,M(),void 0,O)},runStream(A,P,O={}){let q=new AbortController,W=[],K=[],k=false,B=Date.now(),F=0,U="",z;O.signal&&(z=()=>q.abort(),O.signal.addEventListener("abort",z));let I=()=>{z&&O.signal&&O.signal.removeEventListener("abort",z);},D=G=>{if(k)return;let J=K.shift();J?J(G):W.push(G);},_=()=>{k=true,I();for(let G of K)G(null);K.length=0;},N=(async()=>{D({type:"progress",phase:"starting",message:"Running input guardrails"});try{let G=P,J=(o.input??[]).map((j,Q)=>ue(j,Q,"input"));for(let j of J){let{name:Q}=j,ne={agentName:A.name,input:G,facts:g.facts.$store.toObject()},V=await ce(j,{input:G,agentName:A.name},ne);if(!V.passed)throw D({type:"guardrail_triggered",guardrailName:Q,reason:V.reason??"Input validation failed",partialOutput:U,stopped:!0}),new Z({code:"INPUT_GUARDRAIL_FAILED",message:`Input guardrail "${Q}" failed: ${V.reason}`,guardrailName:Q,guardrailType:"input",userMessage:V.reason??"Input validation failed",agentName:A.name,input:G});V.transformed!==void 0&&(G=V.transformed);}D({type:"progress",phase:"generating",message:"Starting agent"}),g.batch(()=>{let j=te(g.facts);ee(g.facts,{...j,status:"running",currentAgent:A.name,input:G,startedAt:Date.now()});});let H=await It(t,A,G,{signal:q.signal,onMessage:j=>{let Q=st(g.facts);if(De(g.facts,[...Q,j]),D({type:"message",message:j}),j.role==="assistant"&&j.content){let ne=Math.ceil(j.content.length/4);F+=ne,U+=j.content,D({type:"token",data:j.content,tokenCount:F});}},onToolCall:async j=>{D({type:"tool_start",tool:j.name,toolCallId:j.id,arguments:j.arguments});let Q=(o.toolCall??[]).map((V,re)=>ue(V,re,"toolCall"));for(let V of Q){let{name:re}=V,we={agentName:A.name,input:G,facts:g.facts.$store.toObject()},Se=await ce(V,{toolCall:j,agentName:A.name,input:G},we);if(!Se.passed)throw D({type:"guardrail_triggered",guardrailName:re,reason:Se.reason??"Tool call blocked",partialOutput:U,stopped:!0}),new Z({code:"TOOL_CALL_GUARDRAIL_FAILED",message:`Tool call guardrail "${re}" failed: ${Se.reason}`,guardrailName:re,guardrailType:"toolCall",userMessage:Se.reason??"Tool call blocked",data:{toolCall:j},agentName:A.name,input:G})}if(!i){let V=`tool-${j.id}`;D({type:"approval_required",requestId:V,toolName:j.name});let re={id:V,type:"tool_call",agentName:A.name,description:`Tool call: ${j.name}`,data:j,requestedAt:Date.now()};g.batch(()=>{let we=le(g.facts);ie(g.facts,{...we,pending:[...we.pending,re]});}),c?.(re),await x(V),D({type:"approval_resolved",requestId:V,approved:!0});}let ne=ot(g.facts);Ne(g.facts,[...ne,j]),j.result&&D({type:"tool_end",tool:j.name,toolCallId:j.id,result:j.result});}},f);D({type:"progress",phase:"finishing",message:"Running output guardrails"});let Y=(o.output??[]).map((j,Q)=>ue(j,Q,"output"));for(let j of Y){let{name:Q}=j,ne={agentName:A.name,input:G,facts:g.facts.$store.toObject()},V=await ce(j,{output:H.output,agentName:A.name,input:G,messages:H.messages},ne);if(!V.passed)throw D({type:"guardrail_triggered",guardrailName:Q,reason:V.reason??"Output validation failed",partialOutput:typeof H.output=="string"?H.output:"",stopped:!0}),new Z({code:"OUTPUT_GUARDRAIL_FAILED",message:`Output guardrail "${Q}" failed: ${V.reason}`,guardrailName:Q,guardrailType:"output",userMessage:V.reason??"Output validation failed",agentName:A.name,input:G});V.transformed!==void 0&&(H.output=V.transformed);}g.batch(()=>{let j=te(g.facts);ee(g.facts,{...j,status:"completed",output:H.output,tokenUsage:j.tokenUsage+H.totalTokens,turnCount:j.turnCount+H.messages.length,completedAt:Date.now()});});let X=Date.now()-B;return D({type:"done",totalTokens:H.totalTokens,duration:X,droppedTokens:0}),_(),H}catch(G){throw D({type:"error",error:G instanceof Error?G:new Error(String(G))}),_(),G}})();return {stream:{[Symbol.asyncIterator](){return {async next(){return W.length>0?{done:false,value:W.shift()}:k?{done:true,value:void 0}:new Promise(G=>{K.push(J=>{G(J===null?{done:true,value:void 0}:{done:false,value:J});});})}}}},result:N,abort:()=>{q.abort(),_();}}},approve(A){g.batch(()=>{let P=le(g.facts);if(!P.pending.some(W=>W.id===A)){u&&console.debug(`[Directive] approve() ignored: no pending request "${A}"`);return}let O=200,q=[...P.approved,A];ie(g.facts,{...P,pending:P.pending.filter(W=>W.id!==A),approved:q.length>O?q.slice(-O):q});});},reject(A,P){g.batch(()=>{let O=le(g.facts);if(!O.pending.some(k=>k.id===A)){u&&console.debug(`[Directive] reject() ignored: no pending request "${A}"`);return}P&&u&&console.debug(`[Directive] Request ${A} rejected: ${P}`);let q={id:A,reason:P,rejectedAt:Date.now()},W=200,K=[...O.rejected,q];ie(g.facts,{...O,pending:O.pending.filter(k=>k.id!==A),rejected:K.length>W?K.slice(-W):K});});},pause(){let A=te(g.facts);ee(g.facts,{...A,status:"paused"});},resume(){let A=te(g.facts);A.status==="paused"&&ee(g.facts,{...A,status:A.currentAgent?"running":"idle"});},reset(){g.batch(()=>{ee(g.facts,{status:"idle",currentAgent:null,input:null,output:null,error:null,tokenUsage:0,turnCount:0,startedAt:null,completedAt:null}),ie(g.facts,{pending:[],approved:[],rejected:[]}),De(g.facts,[]),Ne(g.facts,[]);});},dispose(){g.destroy();}}}function Ks(){let e={},t={},r=[],s=[],n=[],a=[],o,c=false,i,l,d={withConstraint(u,m){return e[u]=m,d},withResolver(u,m){return t[u]=m,d},withInputGuardrail(u,m){return typeof u=="string"&&m?r.push({name:u,fn:m}):typeof u=="object"&&r.push(u),d},withOutputGuardrail(u,m){return typeof u=="string"&&m?s.push({name:u,fn:m}):typeof u=="object"&&s.push(u),d},withToolCallGuardrail(u,m){return typeof u=="string"&&m?n.push({name:u,fn:m}):typeof u=="object"&&n.push(u),d},withPlugin(u){return a.push(u),d},withMemory(u){return i=u,d},withCircuitBreaker(u){return l=u,d},withBudget(u){return o=u,d},withDebug(u=true){return c=u,d},build(u){return nt({runner:u.runner,autoApproveToolCalls:u.autoApproveToolCalls,onApprovalRequest:u.onApprovalRequest,constraints:e,resolvers:t,guardrails:{input:r,output:s,toolCall:n},plugins:a,maxTokenBudget:o,debug:c,memory:i,circuitBreaker:l})}};return d}
|
|
77
|
+
Object.defineProperty(exports,"CircuitBreakerOpenError",{enumerable:true,get:function(){return plugins.CircuitBreakerOpenError}});Object.defineProperty(exports,"createAgentMetrics",{enumerable:true,get:function(){return plugins.createAgentMetrics}});Object.defineProperty(exports,"createCircuitBreaker",{enumerable:true,get:function(){return plugins.createCircuitBreaker}});Object.defineProperty(exports,"createOTLPExporter",{enumerable:true,get:function(){return plugins.createOTLPExporter}});Object.defineProperty(exports,"createObservability",{enumerable:true,get:function(){return plugins.createObservability}});exports.AllProvidersFailedError=Pe;exports.BudgetExceededError=Re;exports.DEFAULT_INJECTION_PATTERNS=ye;exports.GuardrailError=Z;exports.RetryExhaustedError=Me;exports.STRICT_INJECTION_PATTERNS=He;exports.Semaphore=me;exports.StructuredOutputError=Oe;exports.adaptOutputGuardrail=rr;exports.aggregateTokens=fr;exports.byAgentName=rn;exports.byInputLength=tn;exports.byPattern=nn;exports.collectOutputs=mr;exports.collectTokens=nr;exports.combineStreamingGuardrails=tr;exports.concatResults=gr;exports.constraint=Wt;exports.convertToolsForLLM=Gn;exports.createAISyncer=vn;exports.createAgentAuditHandlers=Nr;exports.createAgentMemory=je;exports.createAgentNetwork=yr;exports.createAgentOrchestrator=nt;exports.createAgentStack=Rn;exports.createAuditTrail=Dr;exports.createBatchQueue=xn;exports.createBatchedEmbedder=zr;exports.createBidirectionalStream=Jr;exports.createBruteForceIndex=Wr;exports.createCompliance=qr;exports.createConstraintRouter=Mn;exports.createContentFilterGuardrail=Bt;exports.createDelegator=br;exports.createEnhancedPIIGuardrail=pt;exports.createHybridStrategy=Jt;exports.createInMemoryComplianceStorage=Lr;exports.createInMemoryStorage=wt;exports.createJSONFileStore=Cn;exports.createKeyPointsSummarizer=Xt;exports.createLLMSummarizer=Qt;exports.createLengthGuardrail=$t;exports.createLengthStreamingGuardrail=Zt;exports.createMCPAdapter=On;exports.createMessageBus=qe;exports.createModerationGuardrail=Nt;exports.createMultiAgentOrchestrator=Le;exports.createOrchestratorBuilder=Ks;exports.createOutputPIIGuardrail=Tr;exports.createOutputSchemaGuardrail=_t;exports.createOutputTypeGuardrail=jt;exports.createPIIGuardrail=Dt;exports.createPatternStreamingGuardrail=er;exports.createPromptInjectionGuardrail=Rt;exports.createPubSub=Rr;exports.createRAGEnricher=Tn;exports.createRateLimitGuardrail=Gt;exports.createResponder=hr;exports.createRunner=zt;exports.createSSETransport=kn;exports.createSemanticCache=We;exports.createSemanticCacheGuardrail=Hr;exports.createSlidingWindowStrategy=ke;exports.createStreamChannel=be;exports.createStreamingRunner=Be;exports.createTestEmbedder=Ve;exports.createTokenBasedStrategy=ct;exports.createToolGuardrail=Ft;exports.createToxicityStreamingGuardrail=Yt;exports.createTruncationSummarizer=Kt;exports.createUntrustedContentGuardrail=Fr;exports.createVPTreeIndex=Vr;exports.detectPII=Ue;exports.detectPromptInjection=ze;exports.estimateCost=se;exports.extractJsonFromOutput=xt;exports.filterStream=or;exports.hasPendingApprovals=qt;exports.isAgentRunning=Lt;exports.isGuardrailError=Ot;exports.mapStream=ar;exports.markUntrustedContent=Gr;exports.mcpCallTool=Fn;exports.mcpGetPrompt=jn;exports.mcpReadResource=_n;exports.mcpSyncResources=$n;exports.mergeStreams=Kr;exports.parallel=ir;exports.parseHttpStatus=Xe;exports.parseRetryAfter=At;exports.pickBestResult=pr;exports.pipeThrough=Ke;exports.redactPII=Ee;exports.runAgentRequirement=dr;exports.sanitizeInjection=bt;exports.selectAgent=lr;exports.sequential=ur;exports.supervisor=cr;exports.tapStream=sr;exports.validateBaseURL=Ht;exports.when=Vt;exports.withBudget=Ze;exports.withFallback=Ye;exports.withModelSelection=et;exports.withRetry=Qe;exports.withStructuredOutput=tt;//# sourceMappingURL=index.cjs.map
|
|
78
|
+
//# sourceMappingURL=index.cjs.map
|