@directive-run/ai 0.4.0 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,4 +1,4 @@
1
- 'use strict';var core=require('@directive-run/core'),adapterUtils=require('@directive-run/core/adapter-utils'),plugins=require('@directive-run/core/plugins');var lt=class extends Error{code;guardrailName;guardrailType;userMessage;agentName;constructor(e){super(e.message,{cause:e.cause}),this.name="GuardrailError",this.code=e.code,this.guardrailName=e.guardrailName,this.guardrailType=e.guardrailType,this.userMessage=e.userMessage??e.message,this.agentName=e.agentName,Object.defineProperty(this,"input",{value:e.input,enumerable:false,writable:false,configurable:false}),Object.defineProperty(this,"data",{value:e.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 Xn(t){return t instanceof lt}var en="__agent",Ut="__approval",Nn="__conversation",$n="__toolCalls",Ht="__breakpoints";var pt="__scratchpad",gn={facts:{[en]:core.t.object(),[Ut]:core.t.object(),[Nn]:core.t.array(),[$n]:core.t.array(),[Ht]:core.t.object()},derivations:{},events:{},requirements:{}};var Ao=new Set(["agent_start","agent_complete","agent_error","agent_retry","guardrail_check","constraint_evaluate","resolver_start","resolver_complete","resolver_error","approval_request","approval_response","handoff_start","handoff_complete","pattern_start","pattern_complete","dag_node_update","breakpoint_hit","breakpoint_resumed","derivation_update","scratchpad_update","reflection_iteration","race_start","race_winner","race_cancelled","debate_round","reroute","checkpoint_save","checkpoint_restore","task_start","task_complete","task_error","task_progress","goal_step"]),Tr=new Set(["__proto__","constructor","prototype","toString","valueOf","hasOwnProperty"]);function mn(t={}){let e=t.maxEvents??2e3,r=t.goToSnapshot;if(!Number.isFinite(e)||e<1)throw new Error("[Directive DebugTimeline] maxEvents must be >= 1");let o=[],n=0,a=new Set;return {record(c){let u={...c,id:n++};o.push(u);let l=o.length-e;l>0&&o.splice(0,l);for(let d of a)try{d(u);}catch(m){typeof process<"u"&&process.env?.NODE_ENV!=="production"&&console.error("[Directive DebugTimeline] Listener threw:",m instanceof Error?m.message:m);}return u},getEvents(){return [...o]},getEventsForAgent(c){return o.filter(u=>u.agentId===c)},getEventsByType(c){return o.filter(u=>u.type===c)},getEventsAtSnapshot(c){return o.filter(u=>u.snapshotId===c)},getEventsInRange(c,u){return o.filter(l=>l.timestamp>=c&&l.timestamp<=u)},forkFrom(c){let u=-1;for(let l=o.length-1;l>=0;l--)if(o[l].snapshotId!==null&&o[l].snapshotId<=c){u=o[l].id;break}if(u>=0){let l=o.length;for(let d=o.length-1;d>=0;d--)if(o[d].id<=u){l=d+1;break}o=o.slice(0,l);}else o=[];r&&r(c);},export(){return JSON.stringify({version:1,events:o,nextId:n})},import(c){let u;try{u=JSON.parse(c);}catch{throw new Error("[Directive DebugTimeline] Invalid JSON")}if(!u||typeof u!="object")throw new Error("[Directive DebugTimeline] Invalid timeline data");for(let m of Object.keys(u))if(Tr.has(m))throw new Error(`[Directive DebugTimeline] Blocked key in import: ${m}`);let l=u;if(!Array.isArray(l.events))throw new Error("[Directive DebugTimeline] Missing events array");let d=[];for(let m of l.events){if(!m||typeof m!="object")continue;for(let v of Object.keys(m))if(Tr.has(v))throw new Error(`[Directive DebugTimeline] Blocked key in event: ${v}`);let h=m;typeof h.id=="number"&&typeof h.type=="string"&&Ao.has(h.type)&&typeof h.timestamp=="number"&&d.push(m);}o=d.length>e?d.slice(-e):d,n=typeof l.nextId=="number"?l.nextId:d.length;},clear(){o=[],n=0;},subscribe(c){return a.add(c),()=>{a.delete(c);}},get length(){return o.length}}}function fn(t,e){let r=new Map;return {name:"directive-ai-debug-timeline",onConstraintEvaluate(o,n){t.record({type:"constraint_evaluate",timestamp:Date.now(),snapshotId:e(),constraintId:o,fired:n});},onResolverStart(o,n){r.set(o,Date.now()),t.record({type:"resolver_start",timestamp:Date.now(),snapshotId:e(),resolverId:o,requirementType:n.requirement.type});},onResolverComplete(o){let n=r.get(o);r.delete(o),t.record({type:"resolver_complete",timestamp:Date.now(),snapshotId:e(),resolverId:o,durationMs:n?Date.now()-n:0});},onResolverError(o,n,a){let s=r.get(o);r.delete(o);let c=a instanceof Error?a.message:String(a);t.record({type:"resolver_error",timestamp:Date.now(),snapshotId:e(),resolverId:o,errorMessage:c,durationMs:s?Date.now()-s:0});}}}function At(t,e,r){return typeof t=="function"?{name:`${r}-guardrail-${e}`,fn:t,critical:true}:t}function xo(t,e){let{backoff:r="exponential",baseDelayMs:o=100,maxDelayMs:n=5e3}=e,a;switch(r){case "exponential":a=o*Math.pow(2,t-1);break;case "linear":a=o*t;break;default:a=o;}return Math.min(a,n)}function Er(t,e){return e?.aborted?Promise.reject(e.reason??new Error("Aborted")):new Promise((r,o)=>{if(!e){setTimeout(r,t);return}let n=()=>{clearTimeout(a),o(e.reason??new Error("Aborted"));},a=setTimeout(()=>{e.removeEventListener("abort",n),r();},t);e.addEventListener("abort",n,{once:true});})}async function xt(t,e,r,o){let{retry:n}=t,a=Math.max(n?.attempts??1,1),s;for(let c=1;c<=a;c++)try{return await t.fn(e,r)}catch(u){if(s=u instanceof Error?u:new Error(String(u)),c<a){let l=xo(c,n??{});await Er(l,o);}}return {passed:false,reason:`Guardrail "${t.name}" failed after ${a} attempt(s): ${s.message}`}}function Co(t,e){let{backoff:r="exponential",baseDelayMs:o=1e3,maxDelayMs:n=3e4}=e,a;switch(r){case "exponential":a=o*Math.pow(2,t-1);break;case "linear":a=o*t;break;default:a=o;}return Math.min(a,n)}async function hn(t,e,r,o,n){let a=Math.max(n?.attempts??1,1),s=n?.isRetryable??(()=>true),c=n?.onRetry,u;for(let l=1;l<=a;l++)try{return await t(e,r,o)}catch(d){if(u=d instanceof Error?d:new Error(String(d)),l<a){let m=true;try{m=s(u);}catch{break}if(!m)break;let h=Co(l,n??{});try{c?.(l,u,h);}catch{}await Er(h,o?.signal);}else break}throw u}function ot(t){return adapterUtils.getBridgeFact(t,en)}function st(t,e){adapterUtils.setBridgeFact(t,en,e);}function kt(t){return adapterUtils.getBridgeFact(t,Ut)}function mt(t,e){adapterUtils.setBridgeFact(t,Ut,e);}function tn(t){return adapterUtils.getBridgeFact(t,Nn)}function Ct(t,e){adapterUtils.setBridgeFact(t,Nn,e);}function nn(t){return adapterUtils.getBridgeFact(t,$n)}function Mt(t,e){adapterUtils.setBridgeFact(t,$n,e);}function yt(t){return adapterUtils.getBridgeFact(t,Ht)}function bt(t,e){adapterUtils.setBridgeFact(t,Ht,e);}function gt(t){return {agent:ot(t),approval:kt(t),conversation:tn(t),toolCalls:nn(t)}}function rn(t){let e=Object.create(null);for(let[r,o]of Object.entries(t))e[r]={priority:o.priority??0,when:n=>{let a=gt(n),s={...n,...a};return o.when(s)},require:n=>{let a=gt(n),s={...n,...a};return typeof o.require=="function"?o.require(s):o.require}};return e}function Ar(t,e,r){let o=Object.create(null);for(let[n,a]of Object.entries(t))o[n]={requirement:a.requirement,key:a.key,resolve:async(s,c)=>{let u=gt(c.facts),d={facts:{...c.facts,...u},runAgent:async(m,h,v)=>e(m,h,gt(r()),v),signal:c.signal};await a.resolve(s,d);}};return o}var Dt=200,Mo=0;function vn(){return `bp_${Date.now().toString(36)}_${(++Mo).toString(36)}`}function kn(t,e,r){for(let o of t)if(o.type===e){if(!o.when)return o;try{if(o.when(r))return o}catch{}}return null}function on(){return {pending:[],resolved:[],cancelled:[]}}var xr=new Set(["__proto__","constructor","prototype","toString","valueOf","hasOwnProperty"]);function Pt(){let t=Date.now().toString(36),e=crypto.randomUUID().slice(0,8);return `ckpt_${t}_${e}`}function sn(t){if(!t||typeof t!="object")return false;for(let o of Object.keys(t))if(xr.has(o))return false;let e=t;if(e.version!==1||typeof e.id!="string"||e.id.length===0||typeof e.createdAt!="string"||typeof e.systemExport!="string"||e.timelineExport!==null&&typeof e.timelineExport!="string"||!e.localState||typeof e.localState!="object")return false;for(let o of Object.keys(e.localState))if(xr.has(o))return false;let r=e.localState;return !(r.type!=="single"&&r.type!=="multi"||e.orchestratorType!=="single"&&e.orchestratorType!=="multi")}var Yn=class{store=new Map;order=[];maxCheckpoints;retentionMs;preserveLabeled;constructor(e){if(this.maxCheckpoints=e?.maxCheckpoints??100,this.retentionMs=e?.retentionMs??Number.POSITIVE_INFINITY,this.preserveLabeled=e?.preserveLabeled??false,!Number.isFinite(this.maxCheckpoints)||this.maxCheckpoints<1)throw new Error(`[Directive Checkpoint] maxCheckpoints must be >= 1, got ${this.maxCheckpoints}`)}async save(e){if(!sn(e))throw new Error("[Directive Checkpoint] Invalid checkpoint data");for(;this.order.length>=this.maxCheckpoints&&this.evictOldest(););let r=this.order.indexOf(e.id);return r>=0&&this.order.splice(r,1),this.store.set(e.id,e),this.order.push(e.id),e.id}async load(e){return this.store.get(e)??null}async list(){return this.order.map(e=>{let r=this.store.get(e);return {id:r.id,label:r.label,createdAt:r.createdAt}})}async delete(e){if(!this.store.has(e))return false;this.store.delete(e);let r=this.order.indexOf(e);return r>=0&&this.order.splice(r,1),true}async clear(){this.store.clear(),this.order.length=0;}async prune(){if(!Number.isFinite(this.retentionMs))return 0;let e=Date.now()-this.retentionMs,r=0,o=[];for(let n of this.order){let a=this.store.get(n);if(!a)continue;if(new Date(a.createdAt).getTime()>=e)break;this.preserveLabeled&&a.label||o.push(n);}for(let n of o){this.store.delete(n);let a=this.order.indexOf(n);a>=0&&this.order.splice(a,1),r++;}return r}evictOldest(){if(this.preserveLabeled)for(let r=0;r<this.order.length;r++){let o=this.order[r],n=this.store.get(o);if(n&&!n.label)return this.order.splice(r,1),this.store.delete(o),true}let e=this.order.shift();return e?(this.store.delete(e),true):false}};function wn(t){if(t.length>1048576)throw new Error(`[Directive] Output too large for JSON extraction (${t.length} chars, max 1048576).`);let e=t.trim();try{return JSON.parse(e)}catch{}let r=e.indexOf("{"),o=e.indexOf("["),n,a,s;if(r===-1&&o===-1)throw new Error("[Directive] No JSON object or array found in output");r===-1?(n=o,a="[",s="]"):o===-1?(n=r,a="{",s="}"):(n=Math.min(r,o),a=n===r?"{":"[",s=n===r?"}":"]");let c=0,u=false,l=false;for(let d=n;d<e.length;d++){let m=e[d];if(l){l=false;continue}if(m==="\\"){l=true;continue}if(m==='"'){u=!u;continue}if(!u){if(m===a)c++;else if(m===s&&(c--,c===0)){let h=e.slice(n,d+1);try{return JSON.parse(h)}catch{let v=h.replace(/"(?:[^"\\]|\\.)*"/g,R=>R.replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\t/g,"\\t"));return JSON.parse(v)}}}}throw new Error("[Directive] No valid JSON found in output")}function Do(t){return t?t.issues&&t.issues.length>0?t.issues.map(e=>e.message).join("; "):t.message??"Validation failed":"Validation failed"}function Rn(t,e){let{schema:r,maxRetries:o=2,extractJson:n=wn,schemaDescription:a}=e;if(!Number.isFinite(o)||o<0)throw new Error("[Directive] withStructuredOutput: maxRetries must be a non-negative finite number.");let s=a??r.description??"the specified JSON schema";return async(c,u,l)=>{let d={...c,instructions:(c.instructions??"")+`
1
+ 'use strict';var core=require('@directive-run/core'),adapterUtils=require('@directive-run/core/adapter-utils'),plugins=require('@directive-run/core/plugins');var lt=class extends Error{code;guardrailName;guardrailType;userMessage;agentName;constructor(e){super(e.message,{cause:e.cause}),this.name="GuardrailError",this.code=e.code,this.guardrailName=e.guardrailName,this.guardrailType=e.guardrailType,this.userMessage=e.userMessage??e.message,this.agentName=e.agentName,Object.defineProperty(this,"input",{value:e.input,enumerable:false,writable:false,configurable:false}),Object.defineProperty(this,"data",{value:e.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 Xn(t){return t instanceof lt}var en="__agent",Ut="__approval",Nn="__conversation",$n="__toolCalls",Ht="__breakpoints";var pt="__scratchpad",gn={facts:{[en]:core.t.object(),[Ut]:core.t.object(),[Nn]:core.t.array(),[$n]:core.t.array(),[Ht]:core.t.object()},derivations:{},events:{},requirements:{}};var Ao=new Set(["agent_start","agent_complete","agent_error","agent_retry","guardrail_check","constraint_evaluate","resolver_start","resolver_complete","resolver_error","approval_request","approval_response","handoff_start","handoff_complete","pattern_start","pattern_complete","dag_node_update","breakpoint_hit","breakpoint_resumed","derivation_update","scratchpad_update","reflection_iteration","race_start","race_winner","race_cancelled","debate_round","reroute","checkpoint_save","checkpoint_restore","task_start","task_complete","task_error","task_progress","goal_step"]),Tr=new Set(["__proto__","constructor","prototype","toString","valueOf","hasOwnProperty"]);function mn(t={}){let e=t.maxEvents??2e3,r=t.goToSnapshot;if(!Number.isFinite(e)||e<1)throw new Error("[Directive DebugTimeline] maxEvents must be >= 1");let o=[],n=0,a=new Set;return {record(c){let u={...c,id:n++};o.push(u);let l=o.length-e;l>0&&o.splice(0,l);for(let d of a)try{d(u);}catch(m){typeof process<"u"&&process.env?.NODE_ENV!=="production"&&console.error("[Directive DebugTimeline] Listener threw:",m instanceof Error?m.message:m);}return u},getEvents(){return [...o]},getEventsForAgent(c){return o.filter(u=>u.agentId===c)},getEventsByType(c){return o.filter(u=>u.type===c)},getEventsAtSnapshot(c){return o.filter(u=>u.snapshotId===c)},getEventsInRange(c,u){return o.filter(l=>l.timestamp>=c&&l.timestamp<=u)},forkFrom(c){let u=-1;for(let l=o.length-1;l>=0;l--)if(o[l].snapshotId!==null&&o[l].snapshotId<=c){u=o[l].id;break}if(u>=0){let l=o.length;for(let d=o.length-1;d>=0;d--)if(o[d].id<=u){l=d+1;break}o=o.slice(0,l);}else o=[];r&&r(c);},export(){return JSON.stringify({version:1,events:o,nextId:n})},import(c){let u;try{u=JSON.parse(c);}catch{throw new Error("[Directive DebugTimeline] Invalid JSON")}if(!u||typeof u!="object")throw new Error("[Directive DebugTimeline] Invalid timeline data");for(let m of Object.keys(u))if(Tr.has(m))throw new Error(`[Directive DebugTimeline] Blocked key in import: ${m}`);let l=u;if(!Array.isArray(l.events))throw new Error("[Directive DebugTimeline] Missing events array");let d=[];for(let m of l.events){if(!m||typeof m!="object")continue;for(let v of Object.keys(m))if(Tr.has(v))throw new Error(`[Directive DebugTimeline] Blocked key in event: ${v}`);let h=m;typeof h.id=="number"&&typeof h.type=="string"&&Ao.has(h.type)&&typeof h.timestamp=="number"&&d.push(m);}o=d.length>e?d.slice(-e):d,n=typeof l.nextId=="number"?l.nextId:d.length;},clear(){o=[],n=0;},subscribe(c){return a.add(c),()=>{a.delete(c);}},get length(){return o.length}}}function fn(t,e){let r=new Map;return {name:"directive-ai-debug-timeline",onConstraintEvaluate(o,n){t.record({type:"constraint_evaluate",timestamp:Date.now(),snapshotId:e(),constraintId:o,fired:n});},onResolverStart(o,n){r.set(o,Date.now()),t.record({type:"resolver_start",timestamp:Date.now(),snapshotId:e(),resolverId:o,requirementType:n.requirement.type});},onResolverComplete(o){let n=r.get(o);r.delete(o),t.record({type:"resolver_complete",timestamp:Date.now(),snapshotId:e(),resolverId:o,durationMs:n?Date.now()-n:0});},onResolverError(o,n,a){let s=r.get(o);r.delete(o);let c=a instanceof Error?a.message:String(a);t.record({type:"resolver_error",timestamp:Date.now(),snapshotId:e(),resolverId:o,errorMessage:c,durationMs:s?Date.now()-s:0});}}}function At(t,e,r){return typeof t=="function"?{name:`${r}-guardrail-${e}`,fn:t,critical:true}:t}function xo(t,e){let{backoff:r="exponential",baseDelayMs:o=100,maxDelayMs:n=5e3}=e,a;switch(r){case "exponential":a=o*2**(t-1);break;case "linear":a=o*t;break;default:a=o;}return Math.min(a,n)}function Er(t,e){return e?.aborted?Promise.reject(e.reason??new Error("Aborted")):new Promise((r,o)=>{if(!e){setTimeout(r,t);return}let n=()=>{clearTimeout(a),o(e.reason??new Error("Aborted"));},a=setTimeout(()=>{e.removeEventListener("abort",n),r();},t);e.addEventListener("abort",n,{once:true});})}async function xt(t,e,r,o){let{retry:n}=t,a=Math.max(n?.attempts??1,1),s;for(let c=1;c<=a;c++)try{return await t.fn(e,r)}catch(u){if(s=u instanceof Error?u:new Error(String(u)),c<a){let l=xo(c,n??{});await Er(l,o);}}return {passed:false,reason:`Guardrail "${t.name}" failed after ${a} attempt(s): ${s.message}`}}function Co(t,e){let{backoff:r="exponential",baseDelayMs:o=1e3,maxDelayMs:n=3e4}=e,a;switch(r){case "exponential":a=o*2**(t-1);break;case "linear":a=o*t;break;default:a=o;}return Math.min(a,n)}async function hn(t,e,r,o,n){let a=Math.max(n?.attempts??1,1),s=n?.isRetryable??(()=>true),c=n?.onRetry,u;for(let l=1;l<=a;l++)try{return await t(e,r,o)}catch(d){if(u=d instanceof Error?d:new Error(String(d)),l<a){let m=true;try{m=s(u);}catch{break}if(!m)break;let h=Co(l,n??{});try{c?.(l,u,h);}catch{}await Er(h,o?.signal);}else break}throw u}function ot(t){return adapterUtils.getBridgeFact(t,en)}function st(t,e){adapterUtils.setBridgeFact(t,en,e);}function kt(t){return adapterUtils.getBridgeFact(t,Ut)}function mt(t,e){adapterUtils.setBridgeFact(t,Ut,e);}function tn(t){return adapterUtils.getBridgeFact(t,Nn)}function Ct(t,e){adapterUtils.setBridgeFact(t,Nn,e);}function nn(t){return adapterUtils.getBridgeFact(t,$n)}function Mt(t,e){adapterUtils.setBridgeFact(t,$n,e);}function yt(t){return adapterUtils.getBridgeFact(t,Ht)}function bt(t,e){adapterUtils.setBridgeFact(t,Ht,e);}function gt(t){return {agent:ot(t),approval:kt(t),conversation:tn(t),toolCalls:nn(t)}}function rn(t){let e=Object.create(null);for(let[r,o]of Object.entries(t))e[r]={priority:o.priority??0,when:n=>{let a=gt(n),s={...n,...a};return o.when(s)},require:n=>{let a=gt(n),s={...n,...a};return typeof o.require=="function"?o.require(s):o.require}};return e}function Ar(t,e,r){let o=Object.create(null);for(let[n,a]of Object.entries(t))o[n]={requirement:a.requirement,key:a.key,resolve:async(s,c)=>{let u=gt(c.facts),d={facts:{...c.facts,...u},runAgent:async(m,h,v)=>e(m,h,gt(r()),v),signal:c.signal};await a.resolve(s,d);}};return o}var Dt=200,Mo=0;function vn(){return `bp_${Date.now().toString(36)}_${(++Mo).toString(36)}`}function kn(t,e,r){for(let o of t)if(o.type===e){if(!o.when)return o;try{if(o.when(r))return o}catch{}}return null}function on(){return {pending:[],resolved:[],cancelled:[]}}var xr=new Set(["__proto__","constructor","prototype","toString","valueOf","hasOwnProperty"]);function Pt(){let t=Date.now().toString(36),e=crypto.randomUUID().slice(0,8);return `ckpt_${t}_${e}`}function sn(t){if(!t||typeof t!="object")return false;for(let o of Object.keys(t))if(xr.has(o))return false;let e=t;if(e.version!==1||typeof e.id!="string"||e.id.length===0||typeof e.createdAt!="string"||typeof e.systemExport!="string"||e.timelineExport!==null&&typeof e.timelineExport!="string"||!e.localState||typeof e.localState!="object")return false;for(let o of Object.keys(e.localState))if(xr.has(o))return false;let r=e.localState;return !(r.type!=="single"&&r.type!=="multi"||e.orchestratorType!=="single"&&e.orchestratorType!=="multi")}var Yn=class{store=new Map;order=[];maxCheckpoints;retentionMs;preserveLabeled;constructor(e){if(this.maxCheckpoints=e?.maxCheckpoints??100,this.retentionMs=e?.retentionMs??Number.POSITIVE_INFINITY,this.preserveLabeled=e?.preserveLabeled??false,!Number.isFinite(this.maxCheckpoints)||this.maxCheckpoints<1)throw new Error(`[Directive Checkpoint] maxCheckpoints must be >= 1, got ${this.maxCheckpoints}`)}async save(e){if(!sn(e))throw new Error("[Directive Checkpoint] Invalid checkpoint data");for(;this.order.length>=this.maxCheckpoints&&this.evictOldest(););let r=this.order.indexOf(e.id);return r>=0&&this.order.splice(r,1),this.store.set(e.id,e),this.order.push(e.id),e.id}async load(e){return this.store.get(e)??null}async list(){return this.order.map(e=>{let r=this.store.get(e);return {id:r.id,label:r.label,createdAt:r.createdAt}})}async delete(e){if(!this.store.has(e))return false;this.store.delete(e);let r=this.order.indexOf(e);return r>=0&&this.order.splice(r,1),true}async clear(){this.store.clear(),this.order.length=0;}async prune(){if(!Number.isFinite(this.retentionMs))return 0;let e=Date.now()-this.retentionMs,r=0,o=[];for(let n of this.order){let a=this.store.get(n);if(!a)continue;if(new Date(a.createdAt).getTime()>=e)break;this.preserveLabeled&&a.label||o.push(n);}for(let n of o){this.store.delete(n);let a=this.order.indexOf(n);a>=0&&this.order.splice(a,1),r++;}return r}evictOldest(){if(this.preserveLabeled)for(let r=0;r<this.order.length;r++){let o=this.order[r],n=this.store.get(o);if(n&&!n.label)return this.order.splice(r,1),this.store.delete(o),true}let e=this.order.shift();return e?(this.store.delete(e),true):false}};function wn(t){if(t.length>1048576)throw new Error(`[Directive] Output too large for JSON extraction (${t.length} chars, max 1048576).`);let e=t.trim();try{return JSON.parse(e)}catch{}let r=e.indexOf("{"),o=e.indexOf("["),n,a,s;if(r===-1&&o===-1)throw new Error("[Directive] No JSON object or array found in output");r===-1?(n=o,a="[",s="]"):o===-1?(n=r,a="{",s="}"):(n=Math.min(r,o),a=n===r?"{":"[",s=n===r?"}":"]");let c=0,u=false,l=false;for(let d=n;d<e.length;d++){let m=e[d];if(l){l=false;continue}if(m==="\\"){l=true;continue}if(m==='"'){u=!u;continue}if(!u){if(m===a)c++;else if(m===s&&(c--,c===0)){let h=e.slice(n,d+1);try{return JSON.parse(h)}catch{let v=h.replace(/"(?:[^"\\]|\\.)*"/g,R=>R.replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\t/g,"\\t"));return JSON.parse(v)}}}}throw new Error("[Directive] No valid JSON found in output")}function Do(t){return t?t.issues&&t.issues.length>0?t.issues.map(e=>e.message).join("; "):t.message??"Validation failed":"Validation failed"}function Rn(t,e){let{schema:r,maxRetries:o=2,extractJson:n=wn,schemaDescription:a}=e;if(!Number.isFinite(o)||o<0)throw new Error("[Directive] withStructuredOutput: maxRetries must be a non-negative finite number.");let s=a??r.description??"the specified JSON schema";return async(c,u,l)=>{let d={...c,instructions:(c.instructions??"")+`
2
2
 
3
3
  IMPORTANT: Respond with valid JSON matching `+s+". Output ONLY the JSON object, no additional text or markdown formatting."},m,h;for(let v=0;v<=o;v++){let R=v===0?u:`${u}
4
4
 
@@ -100,7 +100,7 @@ ${z}`);}return I.push(m),I.join(`
100
100
 
101
101
  *[Response truncated]*`,heartbeatIntervalMs:o=0,errorMessages:n,headers:a}=t;if(e<0)throw new RangeError("maxResponseChars must be non-negative");if(o<0)throw new RangeError("heartbeatIntervalMs must be non-negative");function s(l){if(typeof n=="function")try{return n(l)}catch{return Yr}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 Yr}function c(l,d,m,h){let v=new TextEncoder;function R(y){return v.encode(`data: ${JSON.stringify(y)}
102
102
 
103
- `)}return new ReadableStream({async start(y){let T=null,w=null;try{o>0&&(T=setInterval(()=>{try{y.enqueue(R({type:"heartbeat",timestamp:Date.now()}));}catch{}},o)),w=l.stream(d,m,{signal:h?.signal});let k=0,C=!1;for await(let I of w){if(k+=I.length,k>e){y.enqueue(R({type:"truncated",text:r})),y.enqueue(R({type:"done"})),C=!0,w.abort();break}y.enqueue(R({type:"text",text:I}));}try{await w.result;}catch{}C||y.enqueue(R({type:"done"}));}catch(k){let C=s(k);y.enqueue(R({type:"error",message:C}));}finally{T&&clearInterval(T),y.close();}}})}let u={"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive",...a};return {toResponse(l,d,m,h){let v=c(l,d,m,h);return new Response(v,{headers:u})},toStream(l,d,m,h){return c(l,d,m,h)}}}var Ln=class extends Error{retryCount;lastError;constructor(e,r){super(`[Directive] All ${e} retries exhausted: ${r.message}`),this.name="RetryExhaustedError",this.retryCount=e,this.lastError=r,this.cause=r;}},ti=new Set([400,401,403,404,422]);function gr(t){let e=t;if(typeof e.status=="number"&&e.status>=100&&e.status<=599)return e.status;if(typeof e.statusCode=="number"&&e.statusCode>=100&&e.statusCode<=599)return e.statusCode;let o=(t.message.length>1e3?t.message.slice(0,1e3):t.message).match(/(?:failed|error|status|http)[:\s]+(\d{3})\b/i);if(!o)return null;let n=Number(o[1]);return n>=100&&n<=599?n:null}function Qr(t){let e=t;if(typeof e.retryAfter=="number"&&e.retryAfter>0)return e.retryAfter*1e3;let o=(t.message.length>1e3?t.message.slice(0,1e3):t.message).match(/retry[- ]?after[:\s]+(\d+)/i);if(!o)return null;let n=Number(o[1]);return n>0?n*1e3:null}function ni(t,e,r){let o=e*Math.pow(2,t-1),n=Math.random()*e*.5,a=o+n;return Math.min(a,r)}function ri(t,e,r,o){if(gr(t)===429){let a=Qr(t);if(a!==null)return Math.min(a,o)}return ni(e,r,o)}function oi(t){let e=gr(t);return e===null?true:!ti.has(e)}function si(t,e={}){let{maxRetries:r=3,baseDelayMs:o=1e3,maxDelayMs:n=3e4,isRetryable:a,onRetry:s}=e;if(!Number.isFinite(r)||r<0)throw new Error("[Directive] withRetry: maxRetries must be a non-negative finite number.");if(!Number.isFinite(o)||o<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,u,l)=>{let d;for(let m=0;m<=r;m++)try{return await t(c,u,l)}catch(h){if(d=h instanceof Error?h:new Error(String(h)),m>=r)break;if(a)try{if(!a(d))break}catch{break}if(!oi(d))break;let v=ri(d,m+1,o,n);try{s?.(m+1,d,v);}catch{}let R=l?.signal;if(R?.aborted)break;await new Promise((y,T)=>{let w=setTimeout(()=>{R?.removeEventListener("abort",k),y();},v);function k(){clearTimeout(w),T(R.reason??new Error("Aborted"));}R&&R.addEventListener("abort",k,{once:true});});}throw new Ln(r,d)}}var Fn=class extends Error{errors;constructor(e){let r=e.map((o,n)=>` [${n}] ${o.message}`).join(`
103
+ `)}return new ReadableStream({async start(y){let T=null,w=null;try{o>0&&(T=setInterval(()=>{try{y.enqueue(R({type:"heartbeat",timestamp:Date.now()}));}catch{}},o)),w=l.stream(d,m,{signal:h?.signal});let k=0,C=!1;for await(let I of w){if(k+=I.length,k>e){y.enqueue(R({type:"truncated",text:r})),y.enqueue(R({type:"done"})),C=!0,w.abort();break}y.enqueue(R({type:"text",text:I}));}try{await w.result;}catch{}C||y.enqueue(R({type:"done"}));}catch(k){let C=s(k);y.enqueue(R({type:"error",message:C}));}finally{T&&clearInterval(T),y.close();}}})}let u={"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive",...a};return {toResponse(l,d,m,h){let v=c(l,d,m,h);return new Response(v,{headers:u})},toStream(l,d,m,h){return c(l,d,m,h)}}}var Ln=class extends Error{retryCount;lastError;constructor(e,r){super(`[Directive] All ${e} retries exhausted: ${r.message}`),this.name="RetryExhaustedError",this.retryCount=e,this.lastError=r,this.cause=r;}},ti=new Set([400,401,403,404,422]);function gr(t){let e=t;if(typeof e.status=="number"&&e.status>=100&&e.status<=599)return e.status;if(typeof e.statusCode=="number"&&e.statusCode>=100&&e.statusCode<=599)return e.statusCode;let o=(t.message.length>1e3?t.message.slice(0,1e3):t.message).match(/(?:failed|error|status|http)[:\s]+(\d{3})\b/i);if(!o)return null;let n=Number(o[1]);return n>=100&&n<=599?n:null}function Qr(t){let e=t;if(typeof e.retryAfter=="number"&&e.retryAfter>0)return e.retryAfter*1e3;let o=(t.message.length>1e3?t.message.slice(0,1e3):t.message).match(/retry[- ]?after[:\s]+(\d+)/i);if(!o)return null;let n=Number(o[1]);return n>0?n*1e3:null}function ni(t,e,r){let o=e*2**(t-1),n=Math.random()*e*.5,a=o+n;return Math.min(a,r)}function ri(t,e,r,o){if(gr(t)===429){let a=Qr(t);if(a!==null)return Math.min(a,o)}return ni(e,r,o)}function oi(t){let e=gr(t);return e===null?true:!ti.has(e)}function si(t,e={}){let{maxRetries:r=3,baseDelayMs:o=1e3,maxDelayMs:n=3e4,isRetryable:a,onRetry:s}=e;if(!Number.isFinite(r)||r<0)throw new Error("[Directive] withRetry: maxRetries must be a non-negative finite number.");if(!Number.isFinite(o)||o<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,u,l)=>{let d;for(let m=0;m<=r;m++)try{return await t(c,u,l)}catch(h){if(d=h instanceof Error?h:new Error(String(h)),m>=r)break;if(a)try{if(!a(d))break}catch{break}if(!oi(d))break;let v=ri(d,m+1,o,n);try{s?.(m+1,d,v);}catch{}let R=l?.signal;if(R?.aborted)break;await new Promise((y,T)=>{let w=setTimeout(()=>{R?.removeEventListener("abort",k),y();},v);function k(){clearTimeout(w),T(R.reason??new Error("Aborted"));}R&&R.addEventListener("abort",k,{once:true});});}throw new Ln(r,d)}}var Fn=class extends Error{errors;constructor(e){let r=e.map((o,n)=>` [${n}] ${o.message}`).join(`
104
104
  `);super(`[Directive] All ${e.length} providers failed:
105
105
  ${r}`),this.name="AllProvidersFailedError",this.errors=Object.freeze([...e]),e.length>0&&(this.cause=e[e.length-1]);}};function ai(t,e={}){if(t.length===0)throw new Error("[Directive] withFallback requires at least one runner.");let{shouldFallback:r,onFallback:o}=e;return async(n,a,s)=>{let c=[];for(let u=0;u<t.length;u++)try{return await t[u](n,a,s)}catch(l){let d=l instanceof Error?l:new Error(String(l));if(c.push(d),u<t.length-1){if(r)try{if(!r(d))break}catch{break}try{o?.(u,u+1,d);}catch{}}}throw new Fn(c)}}var xn=class extends Error{estimated;remaining;window;constructor(e){super(`[Directive] Budget exceeded (${e.window}): estimated $${e.estimated.toFixed(4)}, remaining $${e.remaining.toFixed(4)}`),this.name="BudgetExceededError",this.estimated=e.estimated,this.remaining=e.remaining,this.window=e.window;}},qn=class{entries=[];record(e){this.entries.push({timestamp:Date.now(),cost:e});}getCostInWindow(e){let r=Date.now()-e;this.prune(r);let o=0;for(let n of this.entries)n.timestamp>=r&&(o+=n.cost);return o}prune(e){let r=0;for(;r<this.entries.length&&this.entries[r].timestamp<e;)r++;r>0&&this.entries.splice(0,r);}clear(){this.entries=[];}},Zr={hour:3600*1e3,day:1440*60*1e3};function ii(t,e){return Math.ceil(t.length/e)}function eo(t,e){return t.inputTokens/1e6*e.inputPerMillion+t.outputTokens/1e6*e.outputPerMillion}function to(t,e,r=1){let o=Math.ceil(t*r);return t/1e6*e.inputPerMillion+o/1e6*e.outputPerMillion}function ui(t,e){let{maxCostPerCall:r,budgets:o=[],pricing:n,charsPerToken:a=4,estimatedOutputMultiplier:s=1,onBudgetExceeded:c}=e;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(s)||s<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 h of o)if(!Number.isFinite(h.maxCost)||h.maxCost<0)throw new Error(`[Directive] withBudget: budgets[${h.window}].maxCost must be a non-negative finite number.`);let u=new Map;for(let h of o)u.set(h.window,new qn);let l=new qn,d=async(h,v,R)=>{let y=ii(v,a);if(r!=null&&n){let w=to(y,n,s);if(w>r){let k={estimated:w,remaining:r,window:"per-call"};try{c?.(k);}catch{}throw new xn(k)}}for(let w of o){let k=Zr[w.window],I=u.get(w.window).getCostInWindow(k),z=w.maxCost-I,_=to(y,w.pricing,s);if(_>z){let E={estimated:_,remaining:Math.max(0,z),window:w.window};try{c?.(E);}catch{}throw new xn(E)}}let T=await t(h,v,R);if(T.tokenUsage){for(let w of o){let k=u.get(w.window),C=eo(T.tokenUsage,w.pricing);k.record(C);}if(n&&o.length===0){let w=eo(T.tokenUsage,n);l.record(w);}}return T};function m(h){let v=u.get(h);if(!v)return 0;let R=Zr[h];return v.getCostInWindow(R)}return d.getSpent=m,d}function ci(t,e){return {match:(r,o)=>o.length<=t,model:e}}function li(t,e){return {match:r=>r.name===t,model:e}}function di(t,e){return {match:(r,o)=>(t.lastIndex=0,t.test(o)),model:e}}function pi(t,e){let r=Array.isArray(e)?{rules:e}:e,{rules:o,onModelSelected:n}=r;return async(a,s,c)=>{let u=a.model;for(let d of o)try{if(d.match(a,s)){u=d.model;break}}catch{}try{n?.(a.model,u);}catch{}let l=u!==a.model?{...a,model:u}:a;return t(l,s,c)}}function gi(t,e={}){let{maxBatchSize:r=20,maxWaitMs:o=5e3,concurrency:n=5}=e;if(!Number.isFinite(r)||r<1)throw new Error("[Directive] createBatchQueue: maxBatchSize must be a positive finite number (>= 1).");if(!Number.isFinite(o)||o<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=[],s=null,c=false,u=null;function l(){s===null&&(s=setTimeout(()=>{s=null,h().catch(()=>{});},o));}function d(){s!==null&&(clearTimeout(s),s=null);}async function m(v){let R=0;async function y(){for(;R<v.length;){let w=R++,k=v[w];try{let C=await t(k.agent,k.input,k.options);k.resolve(C);}catch(C){k.reject(C instanceof Error?C:new Error(String(C)));}}}let T=Array.from({length:Math.min(n,v.length)},()=>y());await Promise.all(T);}async function h(){if(u&&await u,a.length===0)return;d();let v=a.splice(0);u=m(v).finally(()=>{u=null,a.length>0&&l();}),await u;}return {submit(v,R,y){return c?Promise.reject(new Error("[Directive] BatchQueue has been disposed.")):new Promise((T,w)=>{a.push({agent:v,input:R,options:y,resolve:T,reject:w}),a.length>=r?(d(),h().catch(()=>{})):l();})},async flush(){await h();},get pending(){return a.length},async dispose(){c||(c=true,d(),a.length>0&&await h());}}}function no(){return {callCount:0,errorCount:0,totalCost:0,avgLatencyMs:0,lastErrorAt:null}}function mi(t,e){return !t||!e?0:t.inputTokens/1e6*e.inputPerMillion+t.outputTokens/1e6*e.outputPerMillion}function fi(t){let{providers:e,defaultProvider:r,constraints:o=[],onProviderSelected:n,errorCooldownMs:a=3e4,preferCheapest:s=false}=t;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 e)c.set(R.name,R);if(!c.has(r))throw new Error(`[Directive] Default provider "${r}" not found in providers list.`);let u={totalCost:0,callCount:0,errorCount:0,lastProvider:null,avgLatencyMs:0,providers:Object.create(null)};for(let R of e)u.providers[R.name]=no();let l=0,d=[...o].sort((R,y)=>(y.priority??0)-(R.priority??0));function m(){let R=Date.now();for(let T of d)try{if(T.when(u)){let w=c.get(T.provider);if(w)return {provider:w,reason:"constraint"}}}catch{}let y=e.filter(T=>{let w=u.providers[T.name];return w?!(w.lastErrorAt&&R-w.lastErrorAt<a):true});if(s&&y.length>0){let T=[...y].sort((w,k)=>{let C=w.pricing?w.pricing.inputPerMillion+w.pricing.outputPerMillion:Number.POSITIVE_INFINITY,I=k.pricing?k.pricing.inputPerMillion+k.pricing.outputPerMillion:Number.POSITIVE_INFINITY;return C!==I?C-I:w.name===r?-1:k.name===r?1:0});if(T[0]!==c.get(r))return {provider:T[0],reason:"cheapest"}}return y.length>0&&!y.some(T=>T.name===r)?{provider:y[0],reason:"default"}:{provider:c.get(r),reason:"default"}}function h(R,y,T,w,k){let C=u.providers[R]??no();if(C.callCount++,u.callCount++,k)C.errorCount++,u.errorCount++,C.lastErrorAt=Date.now();else {let z=mi(T,w);C.totalCost+=z,u.totalCost+=z;}l+=y,u.avgLatencyMs=l/u.callCount;let I=C.callCount>0?(C.avgLatencyMs*(C.callCount-1)+y)/C.callCount:y;C.avgLatencyMs=I,u.providers[R]=C,u.lastProvider=R;}let v=async(R,y,T)=>{let{provider:w,reason:k}=m();try{n?.(w.name,k);}catch{}let C=Date.now();try{let I=await w.runner(R,y,T),z=Date.now()-C;return h(w.name,z,I.tokenUsage,w.pricing),I}catch(I){let z=Date.now()-C,_=I instanceof Error?I:new Error(String(I));throw h(w.name,z,void 0,w.pricing,_),_}};return Object.defineProperty(v,"facts",{get:()=>{let R=Object.create(null);for(let y of Object.keys(u.providers))R[y]={...u.providers[y]};return {...u,providers:R}},enumerable:true}),v}function ro(t){let{transport:e,timeline:r,healthMonitor:o,getSnapshot:n,getBreakpointState:a,onResumeBreakpoint:s,onCancelBreakpoint:c,getScratchpadState:u,getDerivedState:l,onForkFromSnapshot:d,batchSize:m=1,batchIntervalMs:h=50,healthPushIntervalMs:v=0,authenticate:R}=t,y=t.maxClients??50,T=`devtools_${crypto.randomUUID()}`,w=new Set,k=new Set,C=[],I=null,z=null;function _(F,ue){try{F.send(JSON.stringify(ue));}catch{w.delete(F);}}function E(F){let ue=JSON.stringify(F),ae=[...w];for(let P of ae)try{P.send(ue);}catch{w.delete(P);}}function G(){C.length!==0&&(C.length===1?E({type:"event",event:C[0]}):E({type:"event_batch",events:C}),C=[]);}let j=r.subscribe(F=>{if(w.size!==0){if(m<=1){E({type:"event",event:F});return}C.push(F),C.length>=m&&G();}});m>1&&h>0&&(I=setInterval(G,h)),v>0&&o&&(z=setInterval(()=>{w.size>0&&E({type:"health",metrics:o.getAllMetrics()});},v));function W(F,ue){let ae;try{ae=JSON.parse(ue);}catch{_(F,{type:"error",code:"INVALID_JSON",message:"Could not parse message"});return}if(!ae||typeof ae!="object"||typeof ae.type!="string"){_(F,{type:"error",code:"INVALID_MESSAGE",message:"Missing type field"});return}let P=Date.now(),Ee=ge.get(F)??0;if(P-Ee<$e){_(F,{type:"error",code:"RATE_LIMITED",message:"Too many requests"});return}if(ge.set(F,P),ae.type==="authenticate"){if(!R){_(F,{type:"error",code:"UNKNOWN_COMMAND",message:"Authentication not configured on this server"});return}if(!k.has(F)){_(F,{type:"error",code:"ALREADY_AUTHENTICATED",message:"Already authenticated"});return}if(typeof ae.token!="string"){_(F,{type:"error",code:"AUTH_FAILED",message:"Missing token"}),F.close(),k.delete(F);return}let Ce=R(ae.token),Te=ft=>{ft?(k.delete(F),w.add(F),_(F,{type:"welcome",version:1,sessionId:T,timestamp:Date.now()})):(_(F,{type:"error",code:"AUTH_FAILED",message:"Invalid token"}),k.delete(F),F.close());};Ce instanceof Promise?Ce.then(Te).catch(()=>{_(F,{type:"error",code:"AUTH_FAILED",message:"Authentication error"}),k.delete(F),F.close();}):Te(Ce);return}if(k.has(F)){_(F,{type:"error",code:"AUTH_REQUIRED",message:"Authentication required"});return}switch(ae.type){case "ping":_(F,{type:"pong",timestamp:Date.now()});break;case "request_snapshot":n?_(F,{type:"snapshot",data:n()}):_(F,{type:"error",code:"NO_SNAPSHOT",message:"Snapshot provider not configured"});break;case "request_health":o?_(F,{type:"health",metrics:o.getAllMetrics()}):_(F,{type:"error",code:"NO_HEALTH",message:"Health monitor not configured"});break;case "request_events":{let Ce=r.getEvents(),Te=ae.since,ft=Te!=null?Ce.filter(Bt=>Bt.id>Te):Ce;_(F,{type:"event_batch",events:ft});break}case "request_breakpoints":a?_(F,{type:"breakpoints",state:a()}):_(F,{type:"error",code:"NO_BREAKPOINTS",message:"Breakpoint provider not configured"});break;case "resume_breakpoint":if(s&&typeof ae.breakpointId=="string"){let Ce=ae.modifications?{input:ae.modifications.input,skip:ae.modifications.skip}:void 0;s(ae.breakpointId,Ce);}else _(F,{type:"error",code:"NO_BREAKPOINTS",message:"Breakpoint resume not configured"});break;case "cancel_breakpoint":if(c&&typeof ae.breakpointId=="string"){let Ce=typeof ae.reason=="string"?ae.reason:void 0;c(ae.breakpointId,Ce);}else _(F,{type:"error",code:"NO_BREAKPOINTS",message:"Breakpoint cancel not configured"});break;case "export_session":_(F,{type:"event_batch",events:r.getEvents()});break;case "import_session":{if(typeof ae.data!="string")_(F,{type:"error",code:"INVALID_DATA",message:"Missing data field for import"});else if(ae.data.length>10485760)_(F,{type:"error",code:"IMPORT_TOO_LARGE",message:`Import data exceeds ${10485760/1024/1024} MB limit`});else try{r.import(ae.data),_(F,{type:"event_batch",events:r.getEvents()});}catch(Te){let ft=Te instanceof Error?Te.message:String(Te);_(F,{type:"error",code:"IMPORT_FAILED",message:ft});}break}case "request_scratchpad":u?_(F,{type:"scratchpad_state",data:u()}):_(F,{type:"error",code:"NO_SCRATCHPAD",message:"Scratchpad provider not configured"});break;case "request_derived":l?_(F,{type:"derived_state",data:l()}):_(F,{type:"error",code:"NO_DERIVED",message:"Derived state provider not configured"});break;case "fork_from_snapshot":{if(d&&typeof ae.eventId=="number")try{let Ce=d(ae.eventId);_(F,{type:"fork_complete",eventId:ae.eventId,newEventCount:Ce.newEventCount});}catch(Ce){let Te=Ce instanceof Error?Ce.message:String(Ce);_(F,{type:"error",code:"FORK_FAILED",message:Te});}else _(F,{type:"error",code:"NO_FORK",message:"Fork provider not configured"});break}default:_(F,{type:"error",code:"UNKNOWN_COMMAND",message:`Unknown message type: ${String(ae.type).slice(0,100)}`});}}let ge=new Map,$e=50;return e.onConnection((F,ue,ae)=>{if(w.size+k.size>=y){try{let P={type:"error",code:"MAX_CLIENTS",message:"Connection limit reached"};F.send(JSON.stringify(P));}catch{}F.close();return}R?k.add(F):(w.add(F),_(F,{type:"welcome",version:1,sessionId:T,timestamp:Date.now()})),ue(P=>W(F,P)),ae(()=>{w.delete(F),k.delete(F),ge.delete(F);});}),{get clientCount(){return w.size},broadcast(F){E(F);},pushHealth(){o&&w.size>0&&E({type:"health",metrics:o.getAllMetrics()});},pushBreakpoints(){a&&w.size>0&&E({type:"breakpoints",state:a()});},pushScratchpadUpdate(F,ue){w.size>0&&E({type:"scratchpad_update",key:F,value:ue});},pushDerivedUpdate(F,ue){w.size>0&&E({type:"derived_update",id:F,value:ue});},pushTokenStream(F,ue,ae){w.size>0&&E({type:"token_stream",agentId:F,tokens:ue,tokenCount:ae});},pushStreamDone(F,ue){w.size>0&&E({type:"stream_done",agentId:F,totalTokens:ue});},close(){j(),I&&(clearInterval(I),I=null),z&&(clearInterval(z),z=null),G();for(let F of w)try{F.close();}catch{}for(let F of k)try{F.close();}catch{}w.clear(),k.clear(),ge.clear(),e.close();}}}async function hi(t,e={}){if(!t.timeline)throw new Error("[Directive DevTools] Orchestrator must have debug: true to use DevTools");let r=await oo({port:e.port??4040,host:e.host??"localhost"});return ro({transport:r,timeline:t.timeline,healthMonitor:t.healthMonitor,healthPushIntervalMs:e.healthPushIntervalMs??5e3,batchSize:e.batchSize,authenticate:e.authenticate,getSnapshot:t.getAllAgentStates?()=>{let o=t.getAllAgentStates();return {timestamp:Date.now(),agents:o,eventCount:t.timeline.getEvents().length}}:void 0,getBreakpointState:t.getPendingBreakpoints?()=>({pending:t.getPendingBreakpoints(),resolved:[],cancelled:[]}):void 0,onResumeBreakpoint:t.resumeBreakpoint,onCancelBreakpoint:t.cancelBreakpoint,getScratchpadState:t.getScratchpadState,getDerivedState:t.getDerivedState,onForkFromSnapshot:t.timeline?.forkFrom?o=>(t.timeline.forkFrom(o),{newEventCount:t.timeline.getEvents().length}):void 0})}async function oo(t={}){let e=t.port??4040,r=t.host??"localhost",{WebSocketServer:o}=await import('ws'),n=new o({port:e,host:r,maxPayload:t.maxPayloadBytes??1048576}),a=null;return n.on("connection",s=>{let c=null,u=null,l={send(d){s.readyState===s.OPEN&&s.send(d);},close(){s.close();}};s.on("message",d=>{c&&c(d.toString());}),s.on("close",()=>{u&&u();}),a?.(l,d=>{c=d;},d=>{u=d;});}),{onConnection(s){a=s;},close(){n.close();}}}function Cn(t){return Number.isFinite(t)?t:0}function mr(t){let e=Object.keys(t),r=new Map;for(let[h,v]of Object.entries(t))for(let R of v.produces){if(r.has(R))throw new Error(`[Directive Goal] Fact key "${R}" is produced by both "${r.get(R)}" and "${h}". Each fact key must have exactly one producer.`);r.set(R,h);}let o=[],n=new Map,a=new Map;for(let h of e)n.set(h,0),a.set(h,[]);for(let[h,v]of Object.entries(t))for(let R of v.requires??[]){let y=r.get(R);y&&y!==h&&(o.push({from:y,to:h,factKey:R}),a.get(y).push(h),n.set(h,(n.get(h)??0)+1));}let s=[];for(let[h,v]of n)v===0&&s.push(h);let c=[],u=0;for(;u<s.length;){let h=s[u++];c.push(h);for(let v of a.get(h)??[]){let R=(n.get(v)??1)-1;n.set(v,R),R===0&&s.push(v);}}if(c.length!==e.length){let h=new Set(c),v=e.filter(R=>!h.has(R));throw new Error(`[Directive Goal] Circular dependency detected among agents: ${v.join(", ")}. Review their produces/requires declarations.`)}let l=c.filter(h=>(t[h].requires??[]).every(y=>!r.has(y)||r.get(y)===h)),d=new Set;for(let h of o)d.add(h.from);let m=e.filter(h=>!d.has(h));return {order:c,edges:o,roots:l,leaves:m,producers:r}}function yi(t){let e=mr(t);return {order:[...e.order],edges:[...e.edges],roots:[...e.roots],leaves:[...e.leaves],producers:new Map(e.producers)}}function bi(t){let e=[],r=[];Object.keys(t).length===0&&e.push("No agents declared");for(let[n,a]of Object.entries(t))a.produces.length===0&&r.push(`Agent "${n}" has no produces \u2014 it will never contribute`);let o=new Set;for(let n of Object.values(t))for(let a of n.produces)o.add(a);for(let[n,a]of Object.entries(t))for(let s of a.requires??[])o.has(s)||r.push(`Agent "${n}" requires "${s}" which no agent produces \u2014 must be in initial facts`);try{mr(t);}catch(n){e.push(n instanceof Error?n.message:String(n));}return {valid:e.length===0,errors:e,warnings:r}}function vi(t,e=[],r=50){let o=mr(t),n=new Set;for(let d of Object.values(t))for(let m of d.produces)n.add(m);let a=[];for(let d of Object.values(t))for(let m of d.requires??[])n.has(m)||a.push(m);let s=new Set(e),c=new Set,u=[];for(let d=1;d<=r;d++){let m=o.order.filter(v=>c.has(v)?false:(t[v].requires??[]).every(T=>s.has(T)));if(m.length===0)break;let h=[];for(let v of m){c.add(v);for(let R of t[v].produces)s.has(R)||(h.push(R),s.add(R));}u.push({step:d,agents:m,availableFacts:[...s],producedFacts:h});}let l=Object.keys(t).filter(d=>!c.has(d));return {steps:u,unreachableAgents:l,externalDeps:[...new Set(a)],feasible:l.length===0}}function ki(t){let e=t.stepMetrics.map(l=>{let d=Cn(l.satisfaction),m=Cn(l.satisfactionDelta),h=l.nodesRun.join(", "),v=l.factsProduced.length>0?l.factsProduced.join(", "):"none",R=+Cn(d-m).toFixed(3),y=m>=0?`+${m.toFixed(3)}`:m.toFixed(3),T=`Step ${l.step}: Ran ${h}. Produced: ${v}. Satisfaction: ${R} \u2192 ${d.toFixed(3)} (${y}). ${l.tokensConsumed} tokens, ${l.durationMs}ms.`;return {step:l.step,agents:l.nodesRun,factsProduced:l.factsProduced,satisfaction:d,satisfactionDelta:m,durationMs:l.durationMs,tokensConsumed:l.tokensConsumed,description:T}}),r=t.relaxations.map(l=>{let d;switch(l.strategy){case "allow_rerun":d=`Step ${l.step}: Applied relaxation "${l.label}" \u2014 re-enabled completed nodes for another run.`;break;case "inject_facts":d=`Step ${l.step}: Applied relaxation "${l.label}" \u2014 injected fact values to unblock dependencies.`;break;case "accept_partial":d=`Step ${l.step}: Applied relaxation "${l.label}" \u2014 accepted current facts as partial result.`;break;case "alternative_nodes":d=`Step ${l.step}: Applied relaxation "${l.label}" \u2014 added alternative nodes to the graph.`;break;case "custom":d=`Step ${l.step}: Applied relaxation "${l.label}" \u2014 ran custom recovery logic.`;break;default:d=`Step ${l.step}: Applied relaxation "${l.label}" (${l.strategy}).`;}return {step:l.step,label:l.label,strategy:l.strategy,description:d}}),o=t.stepMetrics.length>0?Cn(t.stepMetrics[0].satisfaction-t.stepMetrics[0].satisfactionDelta).toFixed(3):"0",n=t.stepMetrics.length>0?Cn(t.stepMetrics[t.stepMetrics.length-1].satisfaction).toFixed(3):"0",a=t.achieved?"Goal achieved":"Goal not achieved",s=t.relaxations.length>0?` ${t.relaxations.length} relaxation(s) applied.`:"",c=t.error?` Error: ${t.error}`:"",u=`${a} in ${t.steps} step(s) (${t.totalTokens.toLocaleString()} tokens, ${t.durationMs}ms). Satisfaction: ${o} \u2192 ${n}.`+s+c;return {achieved:t.achieved,summary:u,steps:e,relaxations:r,totalTokens:t.totalTokens,durationMs:t.durationMs}}function wi(t,e=false){let r=false,o=[],n=[],a=e?(s,...c)=>console.debug(`[MCP Stub] ${s}`,...c):()=>{};return {async connect(){a(`Connecting to ${t.name} (${t.transport})`),r=true;},async disconnect(){r=false;},isConnected(){return r},getCapabilities(){return {tools:true,resources:true,prompts:true}},async listTools(){return o},async callTool(s,c){return a(`Calling tool ${s}`,c),{content:[{type:"text",text:`Stub result for ${s}`}]}},async listResources(){return n},async readResource(s){return a(`Reading resource ${s}`),{contents:[{uri:s,text:`Stub content for ${s}`}]}},async listPrompts(){return []},async getPrompt(s){return {messages:[{role:"user",content:{type:"text",text:`Stub prompt ${s}`}}]}}}}function Ri(t,e,r){let o=Date.now(),n=t.get(e);return !n||o>n.resetTime?(t.set(e,{count:1,resetTime:o+6e4}),true):n.count>=r?false:(n.count++,true)}function Si(t){let{servers:e,toolConstraints:r={},resourceMappings:o=[],events:n={},autoConnect:a=false,autoReconnect:s=true,debug:c=false}=t;!t.clientFactory&&(typeof process<"u"&&process.env?.NODE_ENV==="production"?console.warn(`[Directive MCP] WARNING: Using stub MCP client in production!
106
106
  The stub client returns mock data and does not connect to real MCP servers.
@@ -111,7 +111,7 @@ Provide a real 'clientFactory' option to connect to actual MCP servers:
111
111
  const adapter = createMCPAdapter({
112
112
  servers: [...],
113
113
  clientFactory: (config) => new Client(config),
114
- });`):c&&console.debug("[Directive MCP] Using stub client for development. Provide 'clientFactory' for production use."));let l=t.clientFactory??(E=>wi(E,c)),d=t.approvalTimeoutMs??3e5,m={servers:new Map,toolConstraints:new Map(Object.entries(r)),rateLimiters:new Map,pendingApprovals:new Map,approvedRequests:new Set,rejectedRequests:new Set},h=0,v=new Map,R=new Map;function y(E){return new Promise((G,j)=>{if(m.approvedRequests.has(E)){m.approvedRequests.delete(E),m.pendingApprovals.delete(E),n.onApprovalResolved?.(E,true),G();return}if(m.rejectedRequests.has(E)){m.rejectedRequests.delete(E),m.pendingApprovals.delete(E);let ge=R.get(E);R.delete(E),n.onApprovalResolved?.(E,false),j(new Error(`[Directive MCP] Tool call request ${E} was rejected${ge?`: ${ge}`:""}`));return}let W=setTimeout(()=>{v.delete(E),m.pendingApprovals.delete(E),j(new Error(`[Directive MCP] Approval timeout: Request ${E} was not approved or rejected within ${d}ms. Call adapter.approve("${E}") or adapter.reject("${E}") to resolve.`));},d);v.set(E,{resolve:G,reject:j,timeoutId:W});})}function T(E,G,j){let W=v.get(E);W?(clearTimeout(W.timeoutId),v.delete(E),m.pendingApprovals.delete(E),n.onApprovalResolved?.(E,G),G?W.resolve():W.reject(new Error(`[Directive MCP] Tool call request ${E} was rejected${j?`: ${j}`:""}`))):(G?m.approvedRequests.add(E):(m.rejectedRequests.add(E),j&&R.set(E,j)),setTimeout(()=>{m.approvedRequests.delete(E),m.rejectedRequests.delete(E),R.delete(E),m.pendingApprovals.delete(E);},d));}let w=new Map;for(let E of e)m.servers.set(E.name,{config:E,client:null,tools:[],resources:[],status:"disconnected"}),w.set(E.name,{timer:null,attempts:0,maxAttempts:E.retry?.maxAttempts??10,baseDelay:E.retry?.backoffMs??5e3});async function k(E){let G=m.servers.get(E);if(!G)throw new Error(`Unknown MCP server: ${E}`);if(G.status!=="connected"){G.status="connecting";try{let j=l(G.config);await j.connect(),G.client=j,G.status="connected";let W=w.get(E);W&&(W.attempts=0,W.timer&&(clearTimeout(W.timer),W.timer=null)),j.getCapabilities().tools&&(G.tools=await j.listTools()),j.getCapabilities().resources&&(G.resources=await j.listResources()),G.lastSync=Date.now(),n.onConnect?.(E);}catch(j){if(G.status="error",G.error=j instanceof Error?j:new Error(String(j)),n.onError?.(E,G.error),s){let W=w.get(E);if(W&&W.attempts<W.maxAttempts){W.attempts++;let ge=Math.min(W.baseDelay*Math.pow(2,W.attempts-1)+Math.random()*1e3,6e4);W.timer=setTimeout(()=>{W.timer=null,k(E).catch(()=>{});},ge);}else W&&console.error(`[Directive MCP] Max reconnect attempts (${W.maxAttempts}) reached for server '${E}'. Call adapter.connectServer("${E}") to retry manually.`);}throw G.error}}}async function C(E){let G=w.get(E);G?.timer&&(clearTimeout(G.timer),G.timer=null,G.attempts=0);let j=m.servers.get(E);if(!(!j||!j.client))try{await j.client.disconnect();}finally{j.status="disconnected",j.client=null,n.onDisconnect?.(E);}}async function I(E,G,j,W){let ge=m.servers.get(E);if(!ge)throw new Error(`[Directive MCP] Unknown server '${E}'. Available servers: ${Array.from(m.servers.keys()).join(", ")||"(none)"}`);if(!ge.client)throw new Error(`[Directive MCP] Server '${E}' is not connected. Call 'adapter.connect()' or 'adapter.connectServer("${E}")' first.`);let $e=`${E}.${G}`,F=m.toolConstraints.get($e);if(F){if(F.rateLimit){let ae=m.rateLimiters.get($e);if(!Ri(m.rateLimiters,$e,F.rateLimit)){let P=ae?.resetTime?new Date(ae.resetTime).toISOString():"unknown";throw new Error(`[Directive MCP] Rate limit exceeded for '${$e}': ${ae?.count??0}/${F.rateLimit} requests per minute. Resets at ${P}.`)}}if(F.maxArgSize){let ae=JSON.stringify(j).length;if(ae>F.maxArgSize)throw new Error(`Arguments exceed max size (${ae} > ${F.maxArgSize})`)}if(F.when&&!await F.when(W,j))throw new Error(`Constraint not satisfied for ${$e}`);if(F.requireApproval){let ae=`approval-${++h}-${Date.now()}`,P={id:ae,server:E,tool:G,args:j,requestedAt:Date.now()};m.pendingApprovals.set(ae,P),n.onApprovalRequest?.(P),await y(ae);}}n.onToolCall?.(E,G,j);let ue=await Promise.race([ge.client.callTool(G,j),new Promise((ae,P)=>setTimeout(()=>P(new Error(`Tool call timeout: ${$e}`)),F?.timeout??3e4))]);return n.onToolResult?.(E,G,ue),ue}let z={name:"mcp-adapter",onInit:async()=>{a&&await Promise.all(Array.from(m.servers.keys()).map(E=>k(E).catch(G=>console.error(`Failed to connect to ${E}:`,G))));},onDestroy:async()=>{for(let E of w.values())E.timer&&(clearTimeout(E.timer),E.timer=null);for(let[,E]of v)clearTimeout(E.timeoutId),E.reject(new Error("[Directive MCP] Adapter destroyed while awaiting approval"));v.clear(),await Promise.all(Array.from(m.servers.keys()).map(E=>C(E).catch(G=>console.error(`Failed to disconnect from ${E}:`,G))));}};async function _(E){for(let G of o)for(let[j,W]of m.servers)if(W.client){for(let ge of W.resources)if(typeof G.pattern=="string"?Ei(ge.uri,G.pattern):G.pattern.test(ge.uri))try{let F=await W.client.readResource(ge.uri),ue=F.contents[0]?.text??"",ae=G.transform?G.transform(ue):ue;E[G.factKey]=ae,n.onResourceUpdate?.(j,ge.uri,F);}catch(F){console.error(`Failed to sync resource ${ge.uri}:`,F);}}}return {plugin:z,async connect(){await Promise.all(Array.from(m.servers.keys()).map(k));},connectServer:k,async disconnect(){await Promise.all(Array.from(m.servers.keys()).map(C));},disconnectServer:C,getTools(){let E=new Map;for(let[G,j]of m.servers)E.set(G,j.tools);return E},getResources(){let E=new Map;for(let[G,j]of m.servers)E.set(G,j.resources);return E},async callTool(E,G,j,W){return I(E,G,j,W)},async callToolDirect(E,G,j){let W=m.servers.get(E);if(!W)throw new Error(`[Directive MCP] Unknown server '${E}'. Available servers: ${Array.from(m.servers.keys()).join(", ")||"(none)"}`);if(!W.client)throw new Error(`[Directive MCP] Server '${E}' is not connected. Call 'adapter.connect()' or 'adapter.connectServer("${E}")' first.`);n.onToolCall?.(E,G,j);let ge=await W.client.callTool(G,j);return n.onToolResult?.(E,G,ge),ge},async readResource(E,G){let j=m.servers.get(E);if(!j)throw new Error(`[Directive MCP] Unknown server '${E}'. Available servers: ${Array.from(m.servers.keys()).join(", ")||"(none)"}`);if(!j.client)throw new Error(`[Directive MCP] Server '${E}' is not connected. Call 'adapter.connect()' or 'adapter.connectServer("${E}")' first.`);let W=await j.client.readResource(G);return n.onResourceUpdate?.(E,G,W),W},syncResources:_,getServerStatus(E){return m.servers.get(E)},getAllServerStatuses(){return new Map(m.servers)},approve(E){if(!m.pendingApprovals.get(E)&&!v.has(E))throw new Error(`[Directive MCP] No pending approval request with ID '${E}'. Pending requests: ${Array.from(m.pendingApprovals.keys()).join(", ")||"(none)"}`);T(E,true);},reject(E,G){if(!m.pendingApprovals.get(E)&&!v.has(E))throw new Error(`[Directive MCP] No pending approval request with ID '${E}'. Pending requests: ${Array.from(m.pendingApprovals.keys()).join(", ")||"(none)"}`);T(E,false,G);},getPendingApprovals(){return Array.from(m.pendingApprovals.values())},getRejectionReason(E){return R.get(E)}}}var Mn=new Map,Ti=200;function Ei(t,e){let r=Mn.get(e);if(!r){let o=e.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(`^${o}$`),Mn.size>=Ti){let n=Mn.keys().next().value;n!==void 0&&Mn.delete(n);}Mn.set(e,r);}return r.test(t)}function Ai(t){let e=[];for(let[r,o]of t)for(let n of o)e.push({type:"function",function:{name:`${r}.${n.name}`,description:n.description??`Tool: ${n.name}`,parameters:n.inputSchema}});return e}function xi(t,e,r){return {type:"MCP_CALL_TOOL",server:t,tool:e,args:r}}function Ci(t,e){return {type:"MCP_READ_RESOURCE",server:t,uri:e}}function Mi(t,e,r){return {type:"MCP_GET_PROMPT",server:t,prompt:e,args:r}}function Di(t,e){return {type:"MCP_SYNC_RESOURCES",server:t,pattern:e}}var fr=class{constructor(e){this.max=e;if(e<1)throw new Error(`[Directive Evals] concurrency must be >= 1, got ${e}`)}queue=[];active=0;async acquire(e){if(this.active<this.max){this.active++;return}return new Promise((r,o)=>{let n={resolve:r,reject:o};this.queue.push(n),e&&e.addEventListener("abort",()=>{let a=this.queue.indexOf(n);a!==-1&&(this.queue.splice(a,1),o(new Error("Semaphore acquire aborted")));},{once:true});})}release(){if(this.active<=0)return;this.active--;let e=this.queue.shift();e&&(this.active++,e.resolve());}};function Pi(t,e){return typeof e=="function"?{name:t,fn:e,threshold:.5,weight:1}:{...e,name:t,threshold:e.threshold??.5,weight:e.weight??1}}function Ii(t,e){let r=0,o=0;for(let[n,a]of Object.entries(t)){let c=e[n]?.weight??1,u=Number.isFinite(a.score)?a.score:0;r+=u*c,o+=c;}return o===0?0:r/o}function Oi(t,e){let r=0,o=0;for(let[n,a]of Object.entries(t)){let c=e[n]?.weight??1,u=Number.isFinite(a)?a:0;r+=u*c,o+=c;}return o===0?0:r/o}var so={pii:[/\b\d{3}-\d{2}-\d{4}\b/,/\b(?:4\d{3}|5[1-5]\d{2}|6011)\d{12}\b/,/\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b/],violence:[/\b(kill|murder|attack|bomb|weapon|shoot|stab)\b/i],self_harm:[/\b(suicide|self[- ]harm|cut myself)\b/i],illegal:[/\b(hack into|break into|steal|counterfeit)\b/i]};function _i(t){return {name:"cost",fn:e=>{let r=Date.now(),o=e.result.totalTokens,n=o/t.maxTokensPerRun,a;return n<=.5?a=1:n>=2?a=0:a=1-(n-.5)/1.5,{score:a,passed:o<=t.maxTokensPerRun,reason:`${o} tokens (budget: ${t.maxTokensPerRun})`,durationMs:Date.now()-r}},threshold:.5,weight:1}}function Ni(t){return {name:"latency",fn:e=>{let r=Date.now(),o=e.runDurationMs,n=o/t.maxMs,a;return n<=.5?a=1:n>=2?a=0:a=1-(n-.5)/1.5,{score:a,passed:o<=t.maxMs,reason:`${Math.round(o)}ms (max: ${t.maxMs}ms)`,durationMs:Date.now()-r}},threshold:.5,weight:1}}function $i(t){if(t.minLength!==void 0&&t.maxLength!==void 0&&t.minLength>t.maxLength)throw new Error("[Directive Evals] evalOutputLength: minLength must be <= maxLength");return {name:"outputLength",fn:e=>{let r=Date.now(),n=String(e.result.output).length,a=t.minLength??0,s=t.maxLength??Number.POSITIVE_INFINITY,c=n>=a&&n<=s,u;return c?u=1:n<a?u=a>0?Math.max(0,n/a):0:u=s>0&&s!==Number.POSITIVE_INFINITY?Math.max(0,1-(n-s)/s):0,{score:u,passed:c,reason:`${n} chars (range: ${a}-${s===Number.POSITIVE_INFINITY?"\u221E":s})`,durationMs:Date.now()-r}},threshold:.5,weight:1}}function ji(t={}){let e;if(t.blockedPatterns)e=t.blockedPatterns;else if(t.categories&&t.categories.length>0){e=[];for(let r of t.categories){let o=so[r];o&&e.push(...o);}}else {e=[];for(let r of Object.values(so))e.push(...r);}return {name:"safety",fn:r=>{let o=Date.now(),n=String(r.result.output),a=[];for(let c of e)c.test(n)&&a.push(c.source);return {score:a.length===0?1:0,passed:a.length===0,reason:a.length===0?"No unsafe patterns detected":`Matched patterns: ${a.join(", ")}`,durationMs:Date.now()-o}},threshold:1,weight:2}}function Gi(t){return {name:"structure",fn:e=>{let r=Date.now(),o=e.result.output;if(t.type==="json")try{let a=typeof o=="string"?JSON.parse(o):o;if(!a||typeof a!="object"||Array.isArray(a))return {score:0,passed:!1,reason:"Output is not a valid JSON object",durationMs:Date.now()-r};if(t.requiredKeys&&a&&typeof a=="object"){let s=t.requiredKeys.filter(c=>!Object.hasOwn(a,c));if(s.length>0)return {score:1-s.length/t.requiredKeys.length,passed:!1,reason:`Missing keys: ${s.join(", ")}`,durationMs:Date.now()-r}}return {score:1,passed:!0,reason:"Valid JSON with all required keys",durationMs:Date.now()-r}}catch{return {score:0,passed:false,reason:"Output is not valid JSON",durationMs:Date.now()-r}}let n=String(o);return {score:n.length>0?1:0,passed:n.length>0,reason:n.length>0?"Non-empty output":"Empty output",durationMs:Date.now()-r}},threshold:.5,weight:1}}function Bi(t){let e=t.promptTemplate??`You are evaluating an AI agent's output. Score it from 0.0 to 1.0.
114
+ });`):c&&console.debug("[Directive MCP] Using stub client for development. Provide 'clientFactory' for production use."));let l=t.clientFactory??(E=>wi(E,c)),d=t.approvalTimeoutMs??3e5,m={servers:new Map,toolConstraints:new Map(Object.entries(r)),rateLimiters:new Map,pendingApprovals:new Map,approvedRequests:new Set,rejectedRequests:new Set},h=0,v=new Map,R=new Map;function y(E){return new Promise((G,j)=>{if(m.approvedRequests.has(E)){m.approvedRequests.delete(E),m.pendingApprovals.delete(E),n.onApprovalResolved?.(E,true),G();return}if(m.rejectedRequests.has(E)){m.rejectedRequests.delete(E),m.pendingApprovals.delete(E);let ge=R.get(E);R.delete(E),n.onApprovalResolved?.(E,false),j(new Error(`[Directive MCP] Tool call request ${E} was rejected${ge?`: ${ge}`:""}`));return}let W=setTimeout(()=>{v.delete(E),m.pendingApprovals.delete(E),j(new Error(`[Directive MCP] Approval timeout: Request ${E} was not approved or rejected within ${d}ms. Call adapter.approve("${E}") or adapter.reject("${E}") to resolve.`));},d);v.set(E,{resolve:G,reject:j,timeoutId:W});})}function T(E,G,j){let W=v.get(E);W?(clearTimeout(W.timeoutId),v.delete(E),m.pendingApprovals.delete(E),n.onApprovalResolved?.(E,G),G?W.resolve():W.reject(new Error(`[Directive MCP] Tool call request ${E} was rejected${j?`: ${j}`:""}`))):(G?m.approvedRequests.add(E):(m.rejectedRequests.add(E),j&&R.set(E,j)),setTimeout(()=>{m.approvedRequests.delete(E),m.rejectedRequests.delete(E),R.delete(E),m.pendingApprovals.delete(E);},d));}let w=new Map;for(let E of e)m.servers.set(E.name,{config:E,client:null,tools:[],resources:[],status:"disconnected"}),w.set(E.name,{timer:null,attempts:0,maxAttempts:E.retry?.maxAttempts??10,baseDelay:E.retry?.backoffMs??5e3});async function k(E){let G=m.servers.get(E);if(!G)throw new Error(`Unknown MCP server: ${E}`);if(G.status!=="connected"){G.status="connecting";try{let j=l(G.config);await j.connect(),G.client=j,G.status="connected";let W=w.get(E);W&&(W.attempts=0,W.timer&&(clearTimeout(W.timer),W.timer=null)),j.getCapabilities().tools&&(G.tools=await j.listTools()),j.getCapabilities().resources&&(G.resources=await j.listResources()),G.lastSync=Date.now(),n.onConnect?.(E);}catch(j){if(G.status="error",G.error=j instanceof Error?j:new Error(String(j)),n.onError?.(E,G.error),s){let W=w.get(E);if(W&&W.attempts<W.maxAttempts){W.attempts++;let ge=Math.min(W.baseDelay*2**(W.attempts-1)+Math.random()*1e3,6e4);W.timer=setTimeout(()=>{W.timer=null,k(E).catch(()=>{});},ge);}else W&&console.error(`[Directive MCP] Max reconnect attempts (${W.maxAttempts}) reached for server '${E}'. Call adapter.connectServer("${E}") to retry manually.`);}throw G.error}}}async function C(E){let G=w.get(E);G?.timer&&(clearTimeout(G.timer),G.timer=null,G.attempts=0);let j=m.servers.get(E);if(!(!j||!j.client))try{await j.client.disconnect();}finally{j.status="disconnected",j.client=null,n.onDisconnect?.(E);}}async function I(E,G,j,W){let ge=m.servers.get(E);if(!ge)throw new Error(`[Directive MCP] Unknown server '${E}'. Available servers: ${Array.from(m.servers.keys()).join(", ")||"(none)"}`);if(!ge.client)throw new Error(`[Directive MCP] Server '${E}' is not connected. Call 'adapter.connect()' or 'adapter.connectServer("${E}")' first.`);let $e=`${E}.${G}`,F=m.toolConstraints.get($e);if(F){if(F.rateLimit){let ae=m.rateLimiters.get($e);if(!Ri(m.rateLimiters,$e,F.rateLimit)){let P=ae?.resetTime?new Date(ae.resetTime).toISOString():"unknown";throw new Error(`[Directive MCP] Rate limit exceeded for '${$e}': ${ae?.count??0}/${F.rateLimit} requests per minute. Resets at ${P}.`)}}if(F.maxArgSize){let ae=JSON.stringify(j).length;if(ae>F.maxArgSize)throw new Error(`Arguments exceed max size (${ae} > ${F.maxArgSize})`)}if(F.when&&!await F.when(W,j))throw new Error(`Constraint not satisfied for ${$e}`);if(F.requireApproval){let ae=`approval-${++h}-${Date.now()}`,P={id:ae,server:E,tool:G,args:j,requestedAt:Date.now()};m.pendingApprovals.set(ae,P),n.onApprovalRequest?.(P),await y(ae);}}n.onToolCall?.(E,G,j);let ue=await Promise.race([ge.client.callTool(G,j),new Promise((ae,P)=>setTimeout(()=>P(new Error(`Tool call timeout: ${$e}`)),F?.timeout??3e4))]);return n.onToolResult?.(E,G,ue),ue}let z={name:"mcp-adapter",onInit:async()=>{a&&await Promise.all(Array.from(m.servers.keys()).map(E=>k(E).catch(G=>console.error(`Failed to connect to ${E}:`,G))));},onDestroy:async()=>{for(let E of w.values())E.timer&&(clearTimeout(E.timer),E.timer=null);for(let[,E]of v)clearTimeout(E.timeoutId),E.reject(new Error("[Directive MCP] Adapter destroyed while awaiting approval"));v.clear(),await Promise.all(Array.from(m.servers.keys()).map(E=>C(E).catch(G=>console.error(`Failed to disconnect from ${E}:`,G))));}};async function _(E){for(let G of o)for(let[j,W]of m.servers)if(W.client){for(let ge of W.resources)if(typeof G.pattern=="string"?Ei(ge.uri,G.pattern):G.pattern.test(ge.uri))try{let F=await W.client.readResource(ge.uri),ue=F.contents[0]?.text??"",ae=G.transform?G.transform(ue):ue;E[G.factKey]=ae,n.onResourceUpdate?.(j,ge.uri,F);}catch(F){console.error(`Failed to sync resource ${ge.uri}:`,F);}}}return {plugin:z,async connect(){await Promise.all(Array.from(m.servers.keys()).map(k));},connectServer:k,async disconnect(){await Promise.all(Array.from(m.servers.keys()).map(C));},disconnectServer:C,getTools(){let E=new Map;for(let[G,j]of m.servers)E.set(G,j.tools);return E},getResources(){let E=new Map;for(let[G,j]of m.servers)E.set(G,j.resources);return E},async callTool(E,G,j,W){return I(E,G,j,W)},async callToolDirect(E,G,j){let W=m.servers.get(E);if(!W)throw new Error(`[Directive MCP] Unknown server '${E}'. Available servers: ${Array.from(m.servers.keys()).join(", ")||"(none)"}`);if(!W.client)throw new Error(`[Directive MCP] Server '${E}' is not connected. Call 'adapter.connect()' or 'adapter.connectServer("${E}")' first.`);n.onToolCall?.(E,G,j);let ge=await W.client.callTool(G,j);return n.onToolResult?.(E,G,ge),ge},async readResource(E,G){let j=m.servers.get(E);if(!j)throw new Error(`[Directive MCP] Unknown server '${E}'. Available servers: ${Array.from(m.servers.keys()).join(", ")||"(none)"}`);if(!j.client)throw new Error(`[Directive MCP] Server '${E}' is not connected. Call 'adapter.connect()' or 'adapter.connectServer("${E}")' first.`);let W=await j.client.readResource(G);return n.onResourceUpdate?.(E,G,W),W},syncResources:_,getServerStatus(E){return m.servers.get(E)},getAllServerStatuses(){return new Map(m.servers)},approve(E){if(!m.pendingApprovals.get(E)&&!v.has(E))throw new Error(`[Directive MCP] No pending approval request with ID '${E}'. Pending requests: ${Array.from(m.pendingApprovals.keys()).join(", ")||"(none)"}`);T(E,true);},reject(E,G){if(!m.pendingApprovals.get(E)&&!v.has(E))throw new Error(`[Directive MCP] No pending approval request with ID '${E}'. Pending requests: ${Array.from(m.pendingApprovals.keys()).join(", ")||"(none)"}`);T(E,false,G);},getPendingApprovals(){return Array.from(m.pendingApprovals.values())},getRejectionReason(E){return R.get(E)}}}var Mn=new Map,Ti=200;function Ei(t,e){let r=Mn.get(e);if(!r){let o=e.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(`^${o}$`),Mn.size>=Ti){let n=Mn.keys().next().value;n!==void 0&&Mn.delete(n);}Mn.set(e,r);}return r.test(t)}function Ai(t){let e=[];for(let[r,o]of t)for(let n of o)e.push({type:"function",function:{name:`${r}.${n.name}`,description:n.description??`Tool: ${n.name}`,parameters:n.inputSchema}});return e}function xi(t,e,r){return {type:"MCP_CALL_TOOL",server:t,tool:e,args:r}}function Ci(t,e){return {type:"MCP_READ_RESOURCE",server:t,uri:e}}function Mi(t,e,r){return {type:"MCP_GET_PROMPT",server:t,prompt:e,args:r}}function Di(t,e){return {type:"MCP_SYNC_RESOURCES",server:t,pattern:e}}var fr=class{constructor(e){this.max=e;if(e<1)throw new Error(`[Directive Evals] concurrency must be >= 1, got ${e}`)}queue=[];active=0;async acquire(e){if(this.active<this.max){this.active++;return}return new Promise((r,o)=>{let n={resolve:r,reject:o};this.queue.push(n),e&&e.addEventListener("abort",()=>{let a=this.queue.indexOf(n);a!==-1&&(this.queue.splice(a,1),o(new Error("Semaphore acquire aborted")));},{once:true});})}release(){if(this.active<=0)return;this.active--;let e=this.queue.shift();e&&(this.active++,e.resolve());}};function Pi(t,e){return typeof e=="function"?{name:t,fn:e,threshold:.5,weight:1}:{...e,name:t,threshold:e.threshold??.5,weight:e.weight??1}}function Ii(t,e){let r=0,o=0;for(let[n,a]of Object.entries(t)){let c=e[n]?.weight??1,u=Number.isFinite(a.score)?a.score:0;r+=u*c,o+=c;}return o===0?0:r/o}function Oi(t,e){let r=0,o=0;for(let[n,a]of Object.entries(t)){let c=e[n]?.weight??1,u=Number.isFinite(a)?a:0;r+=u*c,o+=c;}return o===0?0:r/o}var so={pii:[/\b\d{3}-\d{2}-\d{4}\b/,/\b(?:4\d{3}|5[1-5]\d{2}|6011)\d{12}\b/,/\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b/],violence:[/\b(kill|murder|attack|bomb|weapon|shoot|stab)\b/i],self_harm:[/\b(suicide|self[- ]harm|cut myself)\b/i],illegal:[/\b(hack into|break into|steal|counterfeit)\b/i]};function _i(t){return {name:"cost",fn:e=>{let r=Date.now(),o=e.result.totalTokens,n=o/t.maxTokensPerRun,a;return n<=.5?a=1:n>=2?a=0:a=1-(n-.5)/1.5,{score:a,passed:o<=t.maxTokensPerRun,reason:`${o} tokens (budget: ${t.maxTokensPerRun})`,durationMs:Date.now()-r}},threshold:.5,weight:1}}function Ni(t){return {name:"latency",fn:e=>{let r=Date.now(),o=e.runDurationMs,n=o/t.maxMs,a;return n<=.5?a=1:n>=2?a=0:a=1-(n-.5)/1.5,{score:a,passed:o<=t.maxMs,reason:`${Math.round(o)}ms (max: ${t.maxMs}ms)`,durationMs:Date.now()-r}},threshold:.5,weight:1}}function $i(t){if(t.minLength!==void 0&&t.maxLength!==void 0&&t.minLength>t.maxLength)throw new Error("[Directive Evals] evalOutputLength: minLength must be <= maxLength");return {name:"outputLength",fn:e=>{let r=Date.now(),n=String(e.result.output).length,a=t.minLength??0,s=t.maxLength??Number.POSITIVE_INFINITY,c=n>=a&&n<=s,u;return c?u=1:n<a?u=a>0?Math.max(0,n/a):0:u=s>0&&s!==Number.POSITIVE_INFINITY?Math.max(0,1-(n-s)/s):0,{score:u,passed:c,reason:`${n} chars (range: ${a}-${s===Number.POSITIVE_INFINITY?"\u221E":s})`,durationMs:Date.now()-r}},threshold:.5,weight:1}}function ji(t={}){let e;if(t.blockedPatterns)e=t.blockedPatterns;else if(t.categories&&t.categories.length>0){e=[];for(let r of t.categories){let o=so[r];o&&e.push(...o);}}else {e=[];for(let r of Object.values(so))e.push(...r);}return {name:"safety",fn:r=>{let o=Date.now(),n=String(r.result.output),a=[];for(let c of e)c.test(n)&&a.push(c.source);return {score:a.length===0?1:0,passed:a.length===0,reason:a.length===0?"No unsafe patterns detected":`Matched patterns: ${a.join(", ")}`,durationMs:Date.now()-o}},threshold:1,weight:2}}function Gi(t){return {name:"structure",fn:e=>{let r=Date.now(),o=e.result.output;if(t.type==="json")try{let a=typeof o=="string"?JSON.parse(o):o;if(!a||typeof a!="object"||Array.isArray(a))return {score:0,passed:!1,reason:"Output is not a valid JSON object",durationMs:Date.now()-r};if(t.requiredKeys&&a&&typeof a=="object"){let s=t.requiredKeys.filter(c=>!Object.hasOwn(a,c));if(s.length>0)return {score:1-s.length/t.requiredKeys.length,passed:!1,reason:`Missing keys: ${s.join(", ")}`,durationMs:Date.now()-r}}return {score:1,passed:!0,reason:"Valid JSON with all required keys",durationMs:Date.now()-r}}catch{return {score:0,passed:false,reason:"Output is not valid JSON",durationMs:Date.now()-r}}let n=String(o);return {score:n.length>0?1:0,passed:n.length>0,reason:n.length>0?"Non-empty output":"Empty output",durationMs:Date.now()-r}},threshold:.5,weight:1}}function Bi(t){let e=t.promptTemplate??`You are evaluating an AI agent's output. Score it from 0.0 to 1.0.
115
115
 
116
116
  Input: {{input}}
117
117
  Expected: {{expected}}