@directive-run/cli 1.17.0 → 1.17.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/cli.js CHANGED
@@ -746,7 +746,7 @@ export default system;
746
746
  `);for(let r of e)t.push(` ${m.yellow(r.requirement.type)} (id: ${m.dim(r.id)}) from ${m.dim(r.fromConstraint)}`);return t.join(`
747
747
  `)}function cn(e){let t=[];if(t.push(m.bold("Inflight:")),e.length===0)return t.push(` ${m.green("(none)")}`),t.join(`
748
748
  `);let r=Date.now();for(let s of e){let n=r-s.startedAt;t.push(` ${m.cyan(s.resolverId)} \u2192 req ${m.dim(s.id)} ${m.yellow(`${n}ms`)}`);}return t.join(`
749
- `)}function ln(e,t,r){let s=r!==void 0?` ${r}ms`:"";switch(e){case "resolved":return m.green(`resolved${s}`);case "errored":return m.red(`errored${s}${t?` \u2014 ${t}`:""}`);case "inflight":return m.yellow("inflight");case "cancelled":return m.dim("cancelled");default:return m.dim(e)}}function un(e){return e===null?m.dim("null"):e===void 0?m.dim("undefined"):typeof e=="string"?e.length>60?`"${e.slice(0,57)}..."`:`"${e}"`:typeof e=="number"||typeof e=="boolean"?String(e):Array.isArray(e)?`[${e.length} items]`:JSON.stringify(e).slice(0,60)}function dn(e){let t=[];new Set(e.unmet.map(o=>o.requirement.type));new Set(e.resolverDefs.map(o=>o.requirement));for(let o of e.resolverDefs)o.requirement;for(let o of e.unmet)e.resolverDefs.some(a=>a.requirement===o.requirement.type||a.requirement==="(predicate)")||t.push(`No resolver for requirement type "${o.requirement.type}"`);return t}async function Et(e){let{filePath:t,opts:r}=rn(e);t||(console.error("Usage: directive inspect <file> [--json] [--module <name>]"),process.exit(1));let s=await z(t);s.isRunning||s.start();let n=s.inspect();if(r.json){let a={};if(s.facts)for(let i of Object.keys(s.facts))try{a[i]=s.facts[i];}catch{a[i]="(error reading)";}console.log(JSON.stringify({facts:a,...n},null,2)),s.stop();return}console.log(),console.log(m.bold(m.cyan("Directive System Inspection"))),console.log(m.dim("\u2500".repeat(40))),console.log();let o={};if(s.facts)for(let a of Object.keys(s.facts))try{o[a]=s.facts[a];}catch{o[a]="(error reading)";}console.log(nn(o)),console.log(),console.log(sn(n.constraints)),console.log(),console.log(on(n.resolverDefs,n.resolvers)),console.log(),console.log(an(n.unmet)),console.log(),n.inflight.length>0&&(console.log(cn(n.inflight)),console.log());let c=dn(n);if(c.length>0){console.log(m.bold(m.yellow("Warnings:")));for(let a of c)console.log(` ${m.yellow("\u26A0")} ${a}`);console.log();}s.stop();}function Ct(e){let t={with:[],minimal:false,dir:process.cwd()};for(let r=0;r<e.length;r++)switch(e[r]){case "--with":{let n=e[++r];n&&(t.with=n.split(",").map(o=>o.trim()));break}case "--minimal":t.minimal=true;break;case "--dir":{let n=e[++r];n&&(t.dir=n);break}}return t}function Rt(e,t){let r=dirname(e);existsSync(r)||mkdirSync(r,{recursive:true}),writeFileSync(e,t,"utf-8");}function Tt(e){return join(e,"src")}function Mt(e,t){let r=validateModuleName(t),s=r===true?"":`: ${r}`;console.error(`Invalid ${e} name: ${t||"(none)"}${s}`),console.error("Must start with a lowercase letter, use lowercase letters, numbers, and hyphens."),process.exit(1);}async function Nt(e,t){let r=Ct(t);if(validateModuleName(e)!==true){Mt("module",e);return}let s;r.minimal?s=[]:r.with.length>0?s=r.with.filter(l=>MODULE_SECTIONS.includes(l)):s=[...MODULE_SECTIONS];let{sourceFileName:n}=suggestFileNames(e,"module"),o=Tt(r.dir),c=join(o,n);existsSync(c)&&(console.error(`File already exists: ${relative(r.dir,c)}`),process.exit(1));let a=generateModule(e,s);Rt(c,a);let i=relative(r.dir,c);console.log(`${m.green("Created")} ${m.dim(i)}`),s.length===0?console.log(m.dim(" Minimal module (schema + init only)")):console.log(m.dim(` Sections: ${s.join(", ")}`));}async function Pt(e,t){let r=Ct(t);if(validateModuleName(e)!==true){Mt("orchestrator",e);return}let{sourceFileName:s}=suggestFileNames(e,"orchestrator"),n=Tt(r.dir),o=join(n,s);existsSync(o)&&(console.error(`File already exists: ${relative(r.dir,o)}`),process.exit(1));let c=generateOrchestrator(e);Rt(o,c);let a=relative(r.dir,o);console.log(`${m.green("Created")} ${m.dim(a)}`),console.log(m.dim(" AI orchestrator with memory, guardrails, and streaming"));}var ge=typeof process<"u"&&process.env?.NODE_ENV!=="production";function de(e,t=50){let r=new WeakSet;function s(i){if(i===null)return "null";if(i===void 0)return "undefined";let l=typeof i;if(l==="string")return JSON.stringify(i);if(l==="number"||l==="boolean")return String(i);if(l==="function")return '"[function]"';if(l==="symbol")return '"[symbol]"'}function n(i,l){if(r.has(i))return '"[circular]"';r.add(i);let u=l();return r.delete(i),u}function o(i,l){return n(i,()=>`[${i.map(u=>a(u,l+1)).join(",")}]`)}function c(i,l){return n(i,()=>`{${Object.keys(i).sort().map(u=>`${JSON.stringify(u)}:${a(i[u],l+1)}`).join(",")}}`)}function a(i,l){if(l>t)return '"[max depth exceeded]"';if(typeof i=="bigint")return `${i.toString()}n`;let u=s(i);if(u!==void 0)return u;if(i instanceof Date)return `D:${i.toISOString()}`;if(i instanceof RegExp)return `R:${i.source}:${i.flags}`;if(i instanceof Map){let d=[...i.entries()].sort();return `M:${a(d,l+1)}`}if(i instanceof Set){let d=[...i].sort();return `S:${a(d,l+1)}`}return Array.isArray(i)?o(i,l):typeof i=="object"?c(i,l):'"[unknown]"'}return a(e,0)}var K=new Set(["$eq","$ne","$in","$nin","$exists","$gt","$gte","$lt","$lte","$between","$matches","$startsWith","$endsWith","$contains","$changed"]),It=new Set(["$all","$any","$not"]);var G=64;function I(e){return typeof e!="object"||e===null||Array.isArray(e)?false:!(e instanceof Date)&&!(e instanceof RegExp)}function De(e){if(typeof e!="object"||e===null||Array.isArray(e))return false;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function He(e){if(!I(e))return false;let t=0,r=false;for(let s of Object.keys(e)){if(s.startsWith("$"))r=true,K.has(s)||$e(`predicate: unknown operator "${s}" \u2014 looks like a typo. Known operators: ${[...K].join(", ")}`);else if(r||t===0)return false;t++;}return r?t>0:false}function Ft(e){return e===null?false:Array.isArray(e)?e.every(t=>De(t)&&"fact"in t&&"op"in t):De(e)}function ye(e,t,r="",s=new WeakSet,n=0){if(n>G){ge&&console.warn(`[Directive] predicate depth limit (${G}) exceeded \u2014 flatten the predicate or split it into multiple constraints. If this is unexpected, check for a cyclic spec object.`),t.bail?.("depth");return}if(Array.isArray(e)){e.forEach((c,a)=>{if(!I(c))return;let i=c;if(typeof i.fact=="string"&&typeof i.op=="string"){let l=r?`${r}[${a}]`:`[${a}]`;t.operator?.(r?`${r}.${i.fact}`:i.fact,i.op,i.value,`${l}.value`);}});return}if(!I(e))return;if(s.has(e)){ge&&console.warn("[Directive] walkPredicate: cyclic predicate spec"),t.bail?.("cycle");return}s.add(e);let o=e;for(let c of ["$all","$any","$not"])if(c in o){if(t.combinator?.(c)===false)return;let a=c==="$not"?[o.$not]:o[c]??[];for(let i of a)ye(i,t,r,s,n+1);return}for(let c of Object.keys(o)){let a=r?`${r}.${c}`:c;if(c.startsWith("$")){t.strayOperatorKey?.(c,a);continue}let i=o[c];if(He(i)){let l=i;for(let u of Object.keys(l))t.operator?.(a,u,l[u],`${a}.${u}`);continue}if(De(i)){if(t.nested?.(c)===false)continue;ye(i,t,a,s,n+1);continue}t.literal?.(a,i);}}function Wt(e,t=""){function r(n,o,c,a){if(typeof n=="bigint")throw new Error(`[Directive] validatePredicate: bigint operand at "${o}" is not JSON-serializable (JSON.stringify throws on bigint).`);if(n instanceof Set)throw new Error(`[Directive] validatePredicate: Set operand at "${o}" is not JSON-serializable (serializes to {} and loses all members).`);if(n instanceof Map)throw new Error(`[Directive] validatePredicate: Map operand at "${o}" is not JSON-serializable (serializes to {} and loses all entries).`);if(n instanceof RegExp)throw new Error(`[Directive] validatePredicate: RegExp operand at "${o}" is not JSON-serializable (a regex lost to JSON.parse becomes {}). Only a direct $matches operand may be a RegExp.`);if(!(n===null||typeof n!="object")&&!(a>G)&&!c.has(n)){if(c.add(n),Array.isArray(n)){n.forEach((i,l)=>{r(i,`${o}[${l}]`,c,a+1);});return}for(let i of Object.keys(n))r(n[i],o?`${o}.${i}`:i,c,a+1);}}function s(n,o,c){if(typeof n=="bigint")throw new Error(`[Directive] validatePredicate: bigint operand at "${c}" is not JSON-serializable (JSON.stringify throws on bigint).`);if(n instanceof Set)throw new Error(`[Directive] validatePredicate: Set operand at "${c}" is not JSON-serializable (serializes to {} and loses all members).`);if(n instanceof Map)throw new Error(`[Directive] validatePredicate: Map operand at "${c}" is not JSON-serializable (serializes to {} and loses all entries).`);if(o==="$matches"&&!(n instanceof RegExp))throw new Error(`[Directive] validatePredicate: $matches operand at "${c}" must be a RegExp; got ${n===null?"null":typeof n}. A regex lost to JSON.parse becomes {} \u2014 reify with new RegExp(pattern, flags) before installing.`);if(Array.isArray(n))n.forEach((a,i)=>{r(a,`${c}[${i}]`,new WeakSet,1);});else if(De(n))for(let a of Object.keys(n))r(n[a],`${c}.${a}`,new WeakSet,1);}if(e instanceof Set)throw new Error(`[Directive] validatePredicate: Set operand${t?` at "${t}"`:""} is not JSON-serializable (serializes to {} and loses all members).`);if(e instanceof Map)throw new Error(`[Directive] validatePredicate: Map operand${t?` at "${t}"`:""} is not JSON-serializable (serializes to {} and loses all entries).`);ye(e,{operator(n,o,c,a){s(c,o,t?`${t}.${a}`:a);},literal(n,o){s(o,"",t?`${t}.${n}`:n);}});}function yn(){return {ids:new WeakMap,next:{v:1},pairs:new Set}}function qt(e,t){let r=e.ids.get(t);return r===void 0&&(r=e.next.v++,e.ids.set(t,r)),r}function q(e,t,r){if(Object.is(e,t))return true;if(e instanceof Date&&t instanceof Date)return e.getTime()===t.getTime();if(typeof e!="object"||typeof t!="object"||e===null||t===null)return false;let s=r??yn(),n=`${qt(s,e)}:${qt(s,t)}`;if(s.pairs.has(n))return true;if(s.pairs.add(n),Array.isArray(e)||Array.isArray(t))return !Array.isArray(e)||!Array.isArray(t)||e.length!==t.length?false:e.every((a,i)=>q(a,t[i],s));if(e instanceof Set||t instanceof Set){if(!(e instanceof Set)||!(t instanceof Set)||e.size!==t.size)return false;let a=[...t];return [...e].every(i=>a.some(l=>q(i,l,s)))}if(e instanceof Map||t instanceof Map){if(!(e instanceof Map)||!(t instanceof Map)||e.size!==t.size)return false;let a=[...t.entries()],i=new Array(a.length).fill(false);for(let[l,u]of e){let d=false;for(let f=0;f<a.length;f++){if(i[f])continue;let[h,$]=a[f];if(q(l,h,s)&&q(u,$,s)){i[f]=true,d=true;break}}if(!d)return false}return true}let o=Object.keys(e),c=Object.keys(t);return o.length!==c.length?false:o.every(a=>Object.hasOwn(t,a)&&q(e[a],t[a],s))}function Ce(e){if(e instanceof Date)return e.getTime();if(typeof e=="number"||typeof e=="bigint"||typeof e=="string")return e}function Be(e,t,r){let s=Ce(t),n=Ce(r);if(s===void 0||n===void 0||typeof s!=typeof n)return false;switch(e){case "$gt":return s>n;case "$gte":return s>=n;case "$lt":return s<n;case "$lte":return s<=n;default:return false}}function Re(e,t,r,s){switch(e){case "$eq":return q(t,r);case "$ne":return !q(t,r);case "$in":return Array.isArray(r)&&r.some(n=>q(t,n));case "$nin":return Array.isArray(r)&&!r.some(n=>q(t,n));case "$exists":return r===(t!==void 0);case "$changed":return !q(t,s);case "$gt":case "$gte":case "$lt":case "$lte":return Be(e,t,r);case "$between":{if(!Array.isArray(r)||r.length!==2)return false;let n=Ce(r[0]),o=Ce(r[1]);return n!==void 0&&o!==void 0&&typeof n==typeof o&&n>o?($e("$between: reversed pair \u2014 [min, max] required"),false):Be("$gte",t,r[0])&&Be("$lte",t,r[1])}case "$matches":{if(!(r instanceof RegExp))throw new Error("[Directive] $matches: operand must be a RegExp (string operands are no longer accepted; pass /pattern/flags directly).");return typeof t!="string"?false:r.test(t)}case "$startsWith":return typeof t!="string"?false:t.startsWith(String(r));case "$endsWith":return typeof t!="string"?false:t.endsWith(String(r));case "$contains":return typeof t=="string"?t.includes(String(r)):Array.isArray(t)?t.some(n=>q(n,r)):t instanceof Set?t.has(r):false;default:return false}}function $e(e){ge&&console.warn(`[Directive] ${e}`);}function $n(e,t,r,s){if(He(e)){let n=Object.keys(e);n.length>1&&$e(`predicate: operator object has ${n.length} operators (${n.join(", ")}) \u2014 write the array form or $all instead. The runtime ANDs them as a best-effort fallback.`);for(let o of n)if(!Re(o,t,e[o],r))return false;return true}return I(e)?se(e,I(t)?t:Object.create(null),I(r)?r:void 0,s+1):q(t,e)}function se(e,t,r,s=0){if(s>G)return $e(`predicate depth limit (${G}) exceeded \u2014 flatten the predicate or split it into multiple constraints. If this is unexpected, check for a cyclic spec object.`),false;if(Array.isArray(e))return e.every(n=>{if(!I(n))return false;let{fact:o,op:c,value:a}=n;return Re(c,t?.[o],a,r?.[o])});if(!I(e))return !!e;if("$all"in e)return e.$all.every(n=>se(n,t,r,s+1));if("$any"in e)return e.$any.some(n=>se(n,t,r,s+1));if("$not"in e)return !se(e.$not,t,r,s+1);for(let n of Object.keys(e)){if(K.has(n))return $e(`predicate: operator "${n}" mixed with fact keys \u2014 wrap operators in a per-fact object`),false;if(!$n(e[n],t?.[n],r?.[n],s))return false}return true}function ve(e,t,r,s=""){let n=[];if(Array.isArray(e)){for(let o of e){if(!I(o))continue;let{fact:c,op:a,value:i}=o,l=t?.[c];n.push({path:s+c,op:a,expected:i,actual:l,pass:Re(a,l,i,r?.[c])});}return n}if(!I(e))return n;for(let o of ["$all","$any","$not"])if(o in e){let c=o==="$not"?[e.$not]:e[o],a=[];for(let u of c)a.push(...ve(u,t,r,s));let i=a.filter(u=>u.pass).length,l;return o==="$all"?l=a.length===0||i===a.length:o==="$any"?l=a.length>0&&i>0:l=!a.every(u=>u.pass),n.push({path:s||o,op:o,expected:c.length,actual:i,pass:l,children:a}),n}for(let o of Object.keys(e)){if(K.has(o))continue;let c=e[o],a=t?.[o],i=s+o;if(He(c))for(let l of Object.keys(c))n.push({path:i,op:l,expected:c[l],actual:a,pass:Re(l,a,c[l],r?.[o])});else I(c)?n.push(...ve(c,I(a)?a:Object.create(null),I(r?.[o])?r?.[o]:void 0,`${i}.`)):n.push({path:i,op:"$eq",expected:c,actual:a,pass:q(a,c)});}return n}var fe=1e6;function _t(e,t){try{Wt(e);}catch(s){let n=s instanceof Error?s.message:String(s);throw new Error(`[Directive] replayUnder: the ${t} predicate is invalid \u2014 ${n}`)}if(!Ft(e)){let s=e===null||typeof e!="object"?`${typeof e} \u2014 ${JSON.stringify(e)}`:JSON.stringify(e).slice(0,80);throw new Error(`[Directive] replayUnder: the ${t} predicate is not a valid FactPredicate (got ${s})`)}let r;if(ye(e,{operator(s,n){r===void 0&&n.startsWith("$")&&!K.has(n)&&(r=n);},strayOperatorKey(s){r===void 0&&!K.has(s)&&!It.has(s)&&(r=s);}}),r!==void 0)throw new Error(`[Directive] replayUnder: the ${t} predicate uses an unknown operator "${r}" \u2014 known operators: ${[...K].join(", ")}`)}function we(e){if(e&&typeof e=="object"&&!Array.isArray(e)&&Array.isArray(e.snapshots))return vn(e);let t=Array.isArray(e)?e:e&&typeof e=="object"&&Array.isArray(e.frames)?e.frames:null;if(!t)throw new Error("[Directive] toReplayFrames: history must be a JSON array of frames, an object with a `frames` array, or a history export with a `snapshots` array");if(t.length>fe)throw new Error(`[Directive] toReplayFrames: history has ${t.length} frames, exceeds the MAX_REPLAY_FRAMES limit (${fe}) \u2014 split or down-sample the history`);return t.map((r,s)=>{if(r&&typeof r=="object"&&"facts"in r){let n=r,o={id:n.id??`#${s}`,facts:n.facts??{}};return typeof n.timestamp=="number"&&(o.timestamp=n.timestamp),o}return {id:`#${s}`,facts:r??{}}})}function vn(e){let t=typeof e=="string"?JSON.parse(e):e;if(Array.isArray(t))return Ut(t);if(!t||typeof t!="object")throw new Error("[Directive] framesFromHistory: expected a history export object with a `snapshots` array (from system.history.export())");let r=t;if(r.version!==void 0&&r.version!==1)throw new Error(`[Directive] framesFromHistory: unsupported history export version ${JSON.stringify(r.version)} \u2014 expected 1`);if(!Array.isArray(r.snapshots))throw new Error("[Directive] framesFromHistory: expected a history export object with a `snapshots` array (from system.history.export())");return Ut(r.snapshots)}function Ut(e){if(!Array.isArray(e))throw new Error("[Directive] framesFromSnapshots: expected an array of fact-state snapshots");if(e.length>fe)throw new Error(`[Directive] framesFromSnapshots: history has ${e.length} snapshots, exceeds the MAX_REPLAY_FRAMES limit (${fe}) \u2014 split or down-sample the history`);for(let t=0;t<e.length;t++){let r=e[t];if(!r||typeof r!="object"||!("facts"in r))throw new Error(`[Directive] framesFromSnapshots: snapshot at index ${t} is not a { facts, ... } object`)}return we(e)}function Te(e){let{frames:t,original:r,proposed:s,entityKey:n}=e,o=e.maxSamples??20,c=o>0?o:0;if(t.length>fe)throw new Error(`[Directive] replayUnder: history has ${t.length} frames, exceeds the MAX_REPLAY_FRAMES limit (${fe}) \u2014 split or down-sample the history`);_t(r,"original"),_t(s,"proposed");let a=0,i=0,l=0,u=0,d=0,f=[],h=[],$=n?new Set:void 0,w=n?new Set:void 0,F;for(let p of t){let v=p.facts,D=se(r,v,F),_=se(s,v,F);D&&(a++,$?.add(v[n])),_&&(i++,w?.add(v[n])),D===_?d++:!D&&_?(l++,f.length<c&&f.push(Lt(p,r,s,F))):(u++,h.length<c&&h.push(Lt(p,r,s,F))),F=v;}let W={framesEvaluated:t.length,original:{matched:a},proposed:{matched:i},delta:i-a,newMatchCount:l,lostMatchCount:u,unchanged:d,newMatches:f,lostMatches:h};return $&&w&&(W.original.matchedEntities=$.size,W.proposed.matchedEntities=w.size),W}function Lt(e,t,r,s){let n=e.facts,o={frameId:e.id,facts:n,originalExplain:ve(t,n,s),proposedExplain:ve(r,n,s)};return e.timestamp!==void 0&&(o.timestamp=e.timestamp),o}var zt=1e4,Jt=5e7;function wn(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)&&Object.keys(e).length===1&&typeof e.$hole=="string"}function Qe(e,t,r=new Set,s=0){if(s>G)throw new Error(`[Directive] sweepUnder: template exceeds MAX_PREDICATE_DEPTH (${G}) \u2014 flatten the template or split the sweep`);if(wn(e)){let n=e.$hole;if(!(n in t))throw new Error(`[Directive] sweepUnder: template references hole "${n}" but sweep has no values for it`);return t[n]}if(e===null||typeof e!="object")return e;if(r.has(e))throw new Error("[Directive] sweepUnder: template contains a cycle \u2014 predicate templates must be a tree");r.add(e);try{if(Array.isArray(e))return e.map(o=>Qe(o,t,r,s+1));let n={};for(let[o,c]of Object.entries(e))n[o]=Qe(c,t,r,s+1);return n}finally{r.delete(e);}}function*Gt(e,t){if(e.length===0){yield {};return}let r=e[0],s=e.slice(1),n=t[r]??[];for(let o of n)for(let c of Gt(s,t))yield {[r]:o,...c};}function bn(e){let t=1;for(let r of Object.values(e))t*=r.length;return t}function Bt(e){let{frames:t,original:r,template:s,sweep:n,objective:o=v=>v.proposed.matched,entityKey:c,maxSamples:a=0}=e,i=Object.keys(n);if(i.length===0)throw new Error("[Directive] sweepUnder: `sweep` must contain at least one hole name");let l=bn(n);if(l>zt)throw new Error(`[Directive] sweepUnder: grid has ${l} points, exceeds the MAX_SWEEP_POINTS limit (${zt}) \u2014 narrow the sweep ranges or split the run`);if(l===0)throw new Error("[Directive] sweepUnder: at least one hole has zero candidate values");let u=l*t.length;if(u>Jt)throw new Error(`[Directive] sweepUnder: ${l} points \xD7 ${t.length} frames = ${u} per-frame evaluations, exceeds the MAX_SWEEP_EVALUATIONS limit (${Jt}) \u2014 narrow the sweep, down-sample the history, or split the run`);let d=false,f=v=>{let D;try{D=o(v);}catch(_){return d||(d=true,console.warn(`[Directive] sweepUnder: objective threw \u2014 point will not rank (${_.message})`)),Number.NEGATIVE_INFINITY}return typeof D!="number"||!Number.isFinite(D)?(d||(d=true,console.warn(`[Directive] sweepUnder: objective returned a non-finite number (${String(D)}) \u2014 point will not rank`)),Number.NEGATIVE_INFINITY):D},h=Te({frames:t,original:r,proposed:r,entityKey:c,maxSamples:a}),$={values:{},report:h,score:f(h)},w=[],F=0,W=Number.NEGATIVE_INFINITY;for(let v of Gt(i,n)){let D=Qe(s,v),_=Te({frames:t,original:r,proposed:D,entityKey:c,maxSamples:a}),Ne=f(_);Ne>W&&(W=Ne,F=w.length),w.push({values:v,report:_,score:Ne});}let p=w[F];return {points:w,bestIndex:F,best:p,baseline:$}}function Kt(e){let t=e&&typeof e=="object"&&!Array.isArray(e)&&"constraints"in e?e.constraints:e;if(Array.isArray(t)){let r={};for(let s of t){if(!s||typeof s!="object"||!("id"in s))throw new Error("[Directive] diffRules: array entries must be `{ id, whenSpec }` objects");let n=s;if(typeof n.id!="string")throw new Error("[Directive] diffRules: constraint `id` must be a string");r[n.id]=n.whenSpec;}return r}if(t&&typeof t=="object")return t;throw new Error("[Directive] diffRules: expected a `{ id: whenSpec }` map, an array of `{ id, whenSpec }`, or `{ constraints: ... }`")}var kn=new Set(["$eq","$ne","$in","$nin","$exists","$gt","$gte","$lt","$lte","$between","$matches","$startsWith","$endsWith","$contains","$changed"]),xn=new Set(["$all","$any","$not"]);function Ht(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Sn(e){if(!Ht(e))return false;let t=Object.keys(e);if(t.length===0)return false;let r=false;for(let s of t){if(!s.startsWith("$"))return false;kn.has(s)&&(r=true);}return r}function H(e,t="",r=[]){if(e===null||typeof e!="object")return r;if(Array.isArray(e)){for(let s of e)if(s&&typeof s=="object"&&"fact"in s&&"op"in s){let n=s;r.push({path:t?`${t}.${String(n.fact)}`:String(n.fact),op:String(n.op),value:n.value});}return r}if("$all"in e&&Array.isArray(e.$all))return e.$all.forEach((s,n)=>{H(s,`${t}$all[${n}]`,r);}),r;if("$any"in e&&Array.isArray(e.$any))return e.$any.forEach((s,n)=>{H(s,`${t}$any[${n}]`,r);}),r;if("$not"in e)return H(e.$not,`${t}$not`,r),r;for(let[s,n]of Object.entries(e)){let o=t?`${t}.${s}`:s;if(Sn(n))for(let[c,a]of Object.entries(n))r.push({path:o,op:c,value:a});else Ht(n)&&!xn.has(s)?H(n,o,r):r.push({path:o,op:"$eq",value:n});}return r}function B(e){return typeof e=="number"&&Number.isFinite(e)}function An(e,t,r){switch(e){case "$gte":case "$gt":if(B(t)&&B(r)){if(r<t)return "relaxed";if(r>t)return "tightened"}return null;case "$lte":case "$lt":if(B(t)&&B(r)){if(r>t)return "relaxed";if(r<t)return "tightened"}return null;case "$between":{if(Array.isArray(t)&&Array.isArray(r)&&t.length===2&&r.length===2&&B(t[0])&&B(t[1])&&B(r[0])&&B(r[1])){let s=t[1]-t[0],n=r[1]-r[0];if(n>s)return "relaxed";if(n<s)return "tightened"}return null}case "$in":case "$nin":{if(Array.isArray(t)&&Array.isArray(r))if(e==="$in"){if(r.length>t.length)return "relaxed";if(r.length<t.length)return "tightened"}else {if(r.length>t.length)return "tightened";if(r.length<t.length)return "relaxed"}return null}case "$contains":{if(Array.isArray(t)&&Array.isArray(r)){if(r.length>t.length)return "relaxed";if(r.length<t.length)return "tightened"}return null}default:return null}}function Qt(e){let t=Kt(e.before),r=Kt(e.after),s=[...new Set([...Object.keys(t),...Object.keys(r)])].sort(),n=[],o={added:0,removed:0,changed:0,unchanged:0,totalClauseChanges:0};for(let c of s){let a=t[c],i=r[c],l=c in t,u=c in r;if(l&&!u){let f=H(a),h=f.length===0?[{path:"(function-form predicate)",kind:"removed"}]:f.map($=>({path:$.path,kind:"removed",before:{op:$.op,value:$.value}}));Ye(h),n.push({id:c,status:"removed",changes:h}),o.removed++,o.totalClauseChanges+=h.length;continue}if(!l&&u){let f=H(i),h=f.length===0?[{path:"(function-form predicate)",kind:"added"}]:f.map($=>({path:$.path,kind:"added",after:{op:$.op,value:$.value}}));Ye(h),n.push({id:c,status:"added",changes:h}),o.added++,o.totalClauseChanges+=h.length;continue}let d=jn(a,i);d.length===0?(n.push({id:c,status:"unchanged",changes:[]}),o.unchanged++):(n.push({id:c,status:"changed",changes:d}),o.changed++,o.totalClauseChanges+=d.length);}return {constraints:n,summary:o}}function jn(e,t){if(e!==void 0&&t!==void 0&&(e===null||t===null||typeof e!="object"||typeof t!="object"))return de(e)===de(t)?[]:[{path:"",kind:"changed",before:{op:"$eq",value:e},after:{op:"$eq",value:t}}];let r=e===void 0?[]:H(e),s=t===void 0?[]:H(t),n=l=>`${l.path}::${l.op}`,o=new Map(r.map(l=>[n(l),l])),c=new Map(s.map(l=>[n(l),l])),a=new Set([...o.keys(),...c.keys()]),i=[];for(let l of a){let u=o.get(l),d=c.get(l);if(u&&!d){i.push({path:u.path,kind:"removed",before:{op:u.op,value:u.value}});continue}if(!u&&d){i.push({path:d.path,kind:"added",after:{op:d.op,value:d.value}});continue}if(u&&d){if(de(u.value)===de(d.value))continue;let f=An(u.op,u.value,d.value);i.push({path:u.path,kind:f??"changed",before:{op:u.op,value:u.value},after:{op:d.op,value:d.value}});}}return Ye(i),i}function Ye(e){e.sort((t,r)=>{let s=t.path.localeCompare(r.path);if(s!==0)return s;let n=t.before?.op??t.after?.op??"",o=r.before?.op??r.after?.op??"";return n.localeCompare(o)});}function Cn(e){let t={maxSamples:20,json:false};for(let r=0;r<e.length;r++)switch(e[r]){case "--history":{let n=e[++r];n&&(t.historyPath=n);break}case "--proposed":case "-p":{let n=e[++r];n&&(t.proposedPath=n);break}case "--original":case "-o":{let n=e[++r];n&&(t.originalPath=n);break}case "--max-samples":{let n=e[++r],o=n?Number.parseInt(n,10):Number.NaN;Number.isFinite(o)&&o>=0&&(t.maxSamples=o);break}case "--entity-key":{let n=e[++r];n&&(t.entityKey=n);break}case "--json":t.json=true;break}return t}function Me(){console.error(`
749
+ `)}function ln(e,t,r){let s=r!==void 0?` ${r}ms`:"";switch(e){case "resolved":return m.green(`resolved${s}`);case "errored":return m.red(`errored${s}${t?` \u2014 ${t}`:""}`);case "inflight":return m.yellow("inflight");case "cancelled":return m.dim("cancelled");default:return m.dim(e)}}function un(e){return e===null?m.dim("null"):e===void 0?m.dim("undefined"):typeof e=="string"?e.length>60?`"${e.slice(0,57)}..."`:`"${e}"`:typeof e=="number"||typeof e=="boolean"?String(e):Array.isArray(e)?`[${e.length} items]`:JSON.stringify(e).slice(0,60)}function dn(e){let t=[];new Set(e.unmet.map(o=>o.requirement.type));new Set(e.resolverDefs.map(o=>o.requirement));for(let o of e.resolverDefs)o.requirement;for(let o of e.unmet)e.resolverDefs.some(a=>a.requirement===o.requirement.type||a.requirement==="(predicate)")||t.push(`No resolver for requirement type "${o.requirement.type}"`);return t}async function Et(e){let{filePath:t,opts:r}=rn(e);t||(console.error("Usage: directive inspect <file> [--json] [--module <name>]"),process.exit(1));let s=await z(t);s.isRunning||s.start();let n=s.inspect();if(r.json){let a={};if(s.facts)for(let i of Object.keys(s.facts))try{a[i]=s.facts[i];}catch{a[i]="(error reading)";}console.log(JSON.stringify({facts:a,...n},null,2)),s.stop();return}console.log(),console.log(m.bold(m.cyan("Directive System Inspection"))),console.log(m.dim("\u2500".repeat(40))),console.log();let o={};if(s.facts)for(let a of Object.keys(s.facts))try{o[a]=s.facts[a];}catch{o[a]="(error reading)";}console.log(nn(o)),console.log(),console.log(sn(n.constraints)),console.log(),console.log(on(n.resolverDefs,n.resolvers)),console.log(),console.log(an(n.unmet)),console.log(),n.inflight.length>0&&(console.log(cn(n.inflight)),console.log());let c=dn(n);if(c.length>0){console.log(m.bold(m.yellow("Warnings:")));for(let a of c)console.log(` ${m.yellow("\u26A0")} ${a}`);console.log();}s.stop();}function Ct(e){let t={with:[],minimal:false,dir:process.cwd()};for(let r=0;r<e.length;r++)switch(e[r]){case "--with":{let n=e[++r];n&&(t.with=n.split(",").map(o=>o.trim()));break}case "--minimal":t.minimal=true;break;case "--dir":{let n=e[++r];n&&(t.dir=n);break}}return t}function Rt(e,t){let r=dirname(e);existsSync(r)||mkdirSync(r,{recursive:true}),writeFileSync(e,t,"utf-8");}function Tt(e){return join(e,"src")}function Mt(e,t){let r=validateModuleName(t),s=r===true?"":`: ${r}`;console.error(`Invalid ${e} name: ${t||"(none)"}${s}`),console.error("Must start with a lowercase letter, use lowercase letters, numbers, and hyphens."),process.exit(1);}async function Nt(e,t){let r=Ct(t);if(validateModuleName(e)!==true){Mt("module",e);return}let s;r.minimal?s=[]:r.with.length>0?s=r.with.filter(l=>MODULE_SECTIONS.includes(l)):s=[...MODULE_SECTIONS];let{sourceFileName:n}=suggestFileNames(e,"module"),o=Tt(r.dir),c=join(o,n);existsSync(c)&&(console.error(`File already exists: ${relative(r.dir,c)}`),process.exit(1));let{moduleSource:a}=generateModule(e,s);Rt(c,a);let i=relative(r.dir,c);console.log(`${m.green("Created")} ${m.dim(i)}`),s.length===0?console.log(m.dim(" Minimal module (schema + init only)")):console.log(m.dim(` Sections: ${s.join(", ")}`));}async function Pt(e,t){let r=Ct(t);if(validateModuleName(e)!==true){Mt("orchestrator",e);return}let{sourceFileName:s}=suggestFileNames(e,"orchestrator"),n=Tt(r.dir),o=join(n,s);existsSync(o)&&(console.error(`File already exists: ${relative(r.dir,o)}`),process.exit(1));let{moduleSource:c}=generateOrchestrator(e);Rt(o,c);let a=relative(r.dir,o);console.log(`${m.green("Created")} ${m.dim(a)}`),console.log(m.dim(" AI orchestrator with memory, guardrails, and streaming"));}var ge=typeof process<"u"&&process.env?.NODE_ENV!=="production";function de(e,t=50){let r=new WeakSet;function s(i){if(i===null)return "null";if(i===void 0)return "undefined";let l=typeof i;if(l==="string")return JSON.stringify(i);if(l==="number"||l==="boolean")return String(i);if(l==="function")return '"[function]"';if(l==="symbol")return '"[symbol]"'}function n(i,l){if(r.has(i))return '"[circular]"';r.add(i);let u=l();return r.delete(i),u}function o(i,l){return n(i,()=>`[${i.map(u=>a(u,l+1)).join(",")}]`)}function c(i,l){return n(i,()=>`{${Object.keys(i).sort().map(u=>`${JSON.stringify(u)}:${a(i[u],l+1)}`).join(",")}}`)}function a(i,l){if(l>t)return '"[max depth exceeded]"';if(typeof i=="bigint")return `${i.toString()}n`;let u=s(i);if(u!==void 0)return u;if(i instanceof Date)return `D:${i.toISOString()}`;if(i instanceof RegExp)return `R:${i.source}:${i.flags}`;if(i instanceof Map){let d=[...i.entries()].sort();return `M:${a(d,l+1)}`}if(i instanceof Set){let d=[...i].sort();return `S:${a(d,l+1)}`}return Array.isArray(i)?o(i,l):typeof i=="object"?c(i,l):'"[unknown]"'}return a(e,0)}var K=new Set(["$eq","$ne","$in","$nin","$exists","$gt","$gte","$lt","$lte","$between","$matches","$startsWith","$endsWith","$contains","$changed"]),It=new Set(["$all","$any","$not"]);var G=64;function I(e){return typeof e!="object"||e===null||Array.isArray(e)?false:!(e instanceof Date)&&!(e instanceof RegExp)}function De(e){if(typeof e!="object"||e===null||Array.isArray(e))return false;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function He(e){if(!I(e))return false;let t=0,r=false;for(let s of Object.keys(e)){if(s.startsWith("$"))r=true,K.has(s)||$e(`predicate: unknown operator "${s}" \u2014 looks like a typo. Known operators: ${[...K].join(", ")}`);else if(r||t===0)return false;t++;}return r?t>0:false}function Ft(e){return e===null?false:Array.isArray(e)?e.every(t=>De(t)&&"fact"in t&&"op"in t):De(e)}function ye(e,t,r="",s=new WeakSet,n=0){if(n>G){ge&&console.warn(`[Directive] predicate depth limit (${G}) exceeded \u2014 flatten the predicate or split it into multiple constraints. If this is unexpected, check for a cyclic spec object.`),t.bail?.("depth");return}if(Array.isArray(e)){e.forEach((c,a)=>{if(!I(c))return;let i=c;if(typeof i.fact=="string"&&typeof i.op=="string"){let l=r?`${r}[${a}]`:`[${a}]`;t.operator?.(r?`${r}.${i.fact}`:i.fact,i.op,i.value,`${l}.value`);}});return}if(!I(e))return;if(s.has(e)){ge&&console.warn("[Directive] walkPredicate: cyclic predicate spec"),t.bail?.("cycle");return}s.add(e);let o=e;for(let c of ["$all","$any","$not"])if(c in o){if(t.combinator?.(c)===false)return;let a=c==="$not"?[o.$not]:o[c]??[];for(let i of a)ye(i,t,r,s,n+1);return}for(let c of Object.keys(o)){let a=r?`${r}.${c}`:c;if(c.startsWith("$")){t.strayOperatorKey?.(c,a);continue}let i=o[c];if(He(i)){let l=i;for(let u of Object.keys(l))t.operator?.(a,u,l[u],`${a}.${u}`);continue}if(De(i)){if(t.nested?.(c)===false)continue;ye(i,t,a,s,n+1);continue}t.literal?.(a,i);}}function Wt(e,t=""){function r(n,o,c,a){if(typeof n=="bigint")throw new Error(`[Directive] validatePredicate: bigint operand at "${o}" is not JSON-serializable (JSON.stringify throws on bigint).`);if(n instanceof Set)throw new Error(`[Directive] validatePredicate: Set operand at "${o}" is not JSON-serializable (serializes to {} and loses all members).`);if(n instanceof Map)throw new Error(`[Directive] validatePredicate: Map operand at "${o}" is not JSON-serializable (serializes to {} and loses all entries).`);if(n instanceof RegExp)throw new Error(`[Directive] validatePredicate: RegExp operand at "${o}" is not JSON-serializable (a regex lost to JSON.parse becomes {}). Only a direct $matches operand may be a RegExp.`);if(!(n===null||typeof n!="object")&&!(a>G)&&!c.has(n)){if(c.add(n),Array.isArray(n)){n.forEach((i,l)=>{r(i,`${o}[${l}]`,c,a+1);});return}for(let i of Object.keys(n))r(n[i],o?`${o}.${i}`:i,c,a+1);}}function s(n,o,c){if(typeof n=="bigint")throw new Error(`[Directive] validatePredicate: bigint operand at "${c}" is not JSON-serializable (JSON.stringify throws on bigint).`);if(n instanceof Set)throw new Error(`[Directive] validatePredicate: Set operand at "${c}" is not JSON-serializable (serializes to {} and loses all members).`);if(n instanceof Map)throw new Error(`[Directive] validatePredicate: Map operand at "${c}" is not JSON-serializable (serializes to {} and loses all entries).`);if(o==="$matches"&&!(n instanceof RegExp))throw new Error(`[Directive] validatePredicate: $matches operand at "${c}" must be a RegExp; got ${n===null?"null":typeof n}. A regex lost to JSON.parse becomes {} \u2014 reify with new RegExp(pattern, flags) before installing.`);if(Array.isArray(n))n.forEach((a,i)=>{r(a,`${c}[${i}]`,new WeakSet,1);});else if(De(n))for(let a of Object.keys(n))r(n[a],`${c}.${a}`,new WeakSet,1);}if(e instanceof Set)throw new Error(`[Directive] validatePredicate: Set operand${t?` at "${t}"`:""} is not JSON-serializable (serializes to {} and loses all members).`);if(e instanceof Map)throw new Error(`[Directive] validatePredicate: Map operand${t?` at "${t}"`:""} is not JSON-serializable (serializes to {} and loses all entries).`);ye(e,{operator(n,o,c,a){s(c,o,t?`${t}.${a}`:a);},literal(n,o){s(o,"",t?`${t}.${n}`:n);}});}function yn(){return {ids:new WeakMap,next:{v:1},pairs:new Set}}function qt(e,t){let r=e.ids.get(t);return r===void 0&&(r=e.next.v++,e.ids.set(t,r)),r}function q(e,t,r){if(Object.is(e,t))return true;if(e instanceof Date&&t instanceof Date)return e.getTime()===t.getTime();if(typeof e!="object"||typeof t!="object"||e===null||t===null)return false;let s=r??yn(),n=`${qt(s,e)}:${qt(s,t)}`;if(s.pairs.has(n))return true;if(s.pairs.add(n),Array.isArray(e)||Array.isArray(t))return !Array.isArray(e)||!Array.isArray(t)||e.length!==t.length?false:e.every((a,i)=>q(a,t[i],s));if(e instanceof Set||t instanceof Set){if(!(e instanceof Set)||!(t instanceof Set)||e.size!==t.size)return false;let a=[...t];return [...e].every(i=>a.some(l=>q(i,l,s)))}if(e instanceof Map||t instanceof Map){if(!(e instanceof Map)||!(t instanceof Map)||e.size!==t.size)return false;let a=[...t.entries()],i=new Array(a.length).fill(false);for(let[l,u]of e){let d=false;for(let f=0;f<a.length;f++){if(i[f])continue;let[h,$]=a[f];if(q(l,h,s)&&q(u,$,s)){i[f]=true,d=true;break}}if(!d)return false}return true}let o=Object.keys(e),c=Object.keys(t);return o.length!==c.length?false:o.every(a=>Object.hasOwn(t,a)&&q(e[a],t[a],s))}function Ce(e){if(e instanceof Date)return e.getTime();if(typeof e=="number"||typeof e=="bigint"||typeof e=="string")return e}function Be(e,t,r){let s=Ce(t),n=Ce(r);if(s===void 0||n===void 0||typeof s!=typeof n)return false;switch(e){case "$gt":return s>n;case "$gte":return s>=n;case "$lt":return s<n;case "$lte":return s<=n;default:return false}}function Re(e,t,r,s){switch(e){case "$eq":return q(t,r);case "$ne":return !q(t,r);case "$in":return Array.isArray(r)&&r.some(n=>q(t,n));case "$nin":return Array.isArray(r)&&!r.some(n=>q(t,n));case "$exists":return r===(t!==void 0);case "$changed":return !q(t,s);case "$gt":case "$gte":case "$lt":case "$lte":return Be(e,t,r);case "$between":{if(!Array.isArray(r)||r.length!==2)return false;let n=Ce(r[0]),o=Ce(r[1]);return n!==void 0&&o!==void 0&&typeof n==typeof o&&n>o?($e("$between: reversed pair \u2014 [min, max] required"),false):Be("$gte",t,r[0])&&Be("$lte",t,r[1])}case "$matches":{if(!(r instanceof RegExp))throw new Error("[Directive] $matches: operand must be a RegExp (string operands are no longer accepted; pass /pattern/flags directly).");return typeof t!="string"?false:r.test(t)}case "$startsWith":return typeof t!="string"?false:t.startsWith(String(r));case "$endsWith":return typeof t!="string"?false:t.endsWith(String(r));case "$contains":return typeof t=="string"?t.includes(String(r)):Array.isArray(t)?t.some(n=>q(n,r)):t instanceof Set?t.has(r):false;default:return false}}function $e(e){ge&&console.warn(`[Directive] ${e}`);}function $n(e,t,r,s){if(He(e)){let n=Object.keys(e);n.length>1&&$e(`predicate: operator object has ${n.length} operators (${n.join(", ")}) \u2014 write the array form or $all instead. The runtime ANDs them as a best-effort fallback.`);for(let o of n)if(!Re(o,t,e[o],r))return false;return true}return I(e)?se(e,I(t)?t:Object.create(null),I(r)?r:void 0,s+1):q(t,e)}function se(e,t,r,s=0){if(s>G)return $e(`predicate depth limit (${G}) exceeded \u2014 flatten the predicate or split it into multiple constraints. If this is unexpected, check for a cyclic spec object.`),false;if(Array.isArray(e))return e.every(n=>{if(!I(n))return false;let{fact:o,op:c,value:a}=n;return Re(c,t?.[o],a,r?.[o])});if(!I(e))return !!e;if("$all"in e)return e.$all.every(n=>se(n,t,r,s+1));if("$any"in e)return e.$any.some(n=>se(n,t,r,s+1));if("$not"in e)return !se(e.$not,t,r,s+1);for(let n of Object.keys(e)){if(K.has(n))return $e(`predicate: operator "${n}" mixed with fact keys \u2014 wrap operators in a per-fact object`),false;if(!$n(e[n],t?.[n],r?.[n],s))return false}return true}function ve(e,t,r,s=""){let n=[];if(Array.isArray(e)){for(let o of e){if(!I(o))continue;let{fact:c,op:a,value:i}=o,l=t?.[c];n.push({path:s+c,op:a,expected:i,actual:l,pass:Re(a,l,i,r?.[c])});}return n}if(!I(e))return n;for(let o of ["$all","$any","$not"])if(o in e){let c=o==="$not"?[e.$not]:e[o],a=[];for(let u of c)a.push(...ve(u,t,r,s));let i=a.filter(u=>u.pass).length,l;return o==="$all"?l=a.length===0||i===a.length:o==="$any"?l=a.length>0&&i>0:l=!a.every(u=>u.pass),n.push({path:s||o,op:o,expected:c.length,actual:i,pass:l,children:a}),n}for(let o of Object.keys(e)){if(K.has(o))continue;let c=e[o],a=t?.[o],i=s+o;if(He(c))for(let l of Object.keys(c))n.push({path:i,op:l,expected:c[l],actual:a,pass:Re(l,a,c[l],r?.[o])});else I(c)?n.push(...ve(c,I(a)?a:Object.create(null),I(r?.[o])?r?.[o]:void 0,`${i}.`)):n.push({path:i,op:"$eq",expected:c,actual:a,pass:q(a,c)});}return n}var fe=1e6;function _t(e,t){try{Wt(e);}catch(s){let n=s instanceof Error?s.message:String(s);throw new Error(`[Directive] replayUnder: the ${t} predicate is invalid \u2014 ${n}`)}if(!Ft(e)){let s=e===null||typeof e!="object"?`${typeof e} \u2014 ${JSON.stringify(e)}`:JSON.stringify(e).slice(0,80);throw new Error(`[Directive] replayUnder: the ${t} predicate is not a valid FactPredicate (got ${s})`)}let r;if(ye(e,{operator(s,n){r===void 0&&n.startsWith("$")&&!K.has(n)&&(r=n);},strayOperatorKey(s){r===void 0&&!K.has(s)&&!It.has(s)&&(r=s);}}),r!==void 0)throw new Error(`[Directive] replayUnder: the ${t} predicate uses an unknown operator "${r}" \u2014 known operators: ${[...K].join(", ")}`)}function we(e){if(e&&typeof e=="object"&&!Array.isArray(e)&&Array.isArray(e.snapshots))return vn(e);let t=Array.isArray(e)?e:e&&typeof e=="object"&&Array.isArray(e.frames)?e.frames:null;if(!t)throw new Error("[Directive] toReplayFrames: history must be a JSON array of frames, an object with a `frames` array, or a history export with a `snapshots` array");if(t.length>fe)throw new Error(`[Directive] toReplayFrames: history has ${t.length} frames, exceeds the MAX_REPLAY_FRAMES limit (${fe}) \u2014 split or down-sample the history`);return t.map((r,s)=>{if(r&&typeof r=="object"&&"facts"in r){let n=r,o={id:n.id??`#${s}`,facts:n.facts??{}};return typeof n.timestamp=="number"&&(o.timestamp=n.timestamp),o}return {id:`#${s}`,facts:r??{}}})}function vn(e){let t=typeof e=="string"?JSON.parse(e):e;if(Array.isArray(t))return Ut(t);if(!t||typeof t!="object")throw new Error("[Directive] framesFromHistory: expected a history export object with a `snapshots` array (from system.history.export())");let r=t;if(r.version!==void 0&&r.version!==1)throw new Error(`[Directive] framesFromHistory: unsupported history export version ${JSON.stringify(r.version)} \u2014 expected 1`);if(!Array.isArray(r.snapshots))throw new Error("[Directive] framesFromHistory: expected a history export object with a `snapshots` array (from system.history.export())");return Ut(r.snapshots)}function Ut(e){if(!Array.isArray(e))throw new Error("[Directive] framesFromSnapshots: expected an array of fact-state snapshots");if(e.length>fe)throw new Error(`[Directive] framesFromSnapshots: history has ${e.length} snapshots, exceeds the MAX_REPLAY_FRAMES limit (${fe}) \u2014 split or down-sample the history`);for(let t=0;t<e.length;t++){let r=e[t];if(!r||typeof r!="object"||!("facts"in r))throw new Error(`[Directive] framesFromSnapshots: snapshot at index ${t} is not a { facts, ... } object`)}return we(e)}function Te(e){let{frames:t,original:r,proposed:s,entityKey:n}=e,o=e.maxSamples??20,c=o>0?o:0;if(t.length>fe)throw new Error(`[Directive] replayUnder: history has ${t.length} frames, exceeds the MAX_REPLAY_FRAMES limit (${fe}) \u2014 split or down-sample the history`);_t(r,"original"),_t(s,"proposed");let a=0,i=0,l=0,u=0,d=0,f=[],h=[],$=n?new Set:void 0,w=n?new Set:void 0,F;for(let p of t){let v=p.facts,D=se(r,v,F),_=se(s,v,F);D&&(a++,$?.add(v[n])),_&&(i++,w?.add(v[n])),D===_?d++:!D&&_?(l++,f.length<c&&f.push(Lt(p,r,s,F))):(u++,h.length<c&&h.push(Lt(p,r,s,F))),F=v;}let W={framesEvaluated:t.length,original:{matched:a},proposed:{matched:i},delta:i-a,newMatchCount:l,lostMatchCount:u,unchanged:d,newMatches:f,lostMatches:h};return $&&w&&(W.original.matchedEntities=$.size,W.proposed.matchedEntities=w.size),W}function Lt(e,t,r,s){let n=e.facts,o={frameId:e.id,facts:n,originalExplain:ve(t,n,s),proposedExplain:ve(r,n,s)};return e.timestamp!==void 0&&(o.timestamp=e.timestamp),o}var zt=1e4,Jt=5e7;function wn(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)&&Object.keys(e).length===1&&typeof e.$hole=="string"}function Qe(e,t,r=new Set,s=0){if(s>G)throw new Error(`[Directive] sweepUnder: template exceeds MAX_PREDICATE_DEPTH (${G}) \u2014 flatten the template or split the sweep`);if(wn(e)){let n=e.$hole;if(!(n in t))throw new Error(`[Directive] sweepUnder: template references hole "${n}" but sweep has no values for it`);return t[n]}if(e===null||typeof e!="object")return e;if(r.has(e))throw new Error("[Directive] sweepUnder: template contains a cycle \u2014 predicate templates must be a tree");r.add(e);try{if(Array.isArray(e))return e.map(o=>Qe(o,t,r,s+1));let n={};for(let[o,c]of Object.entries(e))n[o]=Qe(c,t,r,s+1);return n}finally{r.delete(e);}}function*Gt(e,t){if(e.length===0){yield {};return}let r=e[0],s=e.slice(1),n=t[r]??[];for(let o of n)for(let c of Gt(s,t))yield {[r]:o,...c};}function bn(e){let t=1;for(let r of Object.values(e))t*=r.length;return t}function Bt(e){let{frames:t,original:r,template:s,sweep:n,objective:o=v=>v.proposed.matched,entityKey:c,maxSamples:a=0}=e,i=Object.keys(n);if(i.length===0)throw new Error("[Directive] sweepUnder: `sweep` must contain at least one hole name");let l=bn(n);if(l>zt)throw new Error(`[Directive] sweepUnder: grid has ${l} points, exceeds the MAX_SWEEP_POINTS limit (${zt}) \u2014 narrow the sweep ranges or split the run`);if(l===0)throw new Error("[Directive] sweepUnder: at least one hole has zero candidate values");let u=l*t.length;if(u>Jt)throw new Error(`[Directive] sweepUnder: ${l} points \xD7 ${t.length} frames = ${u} per-frame evaluations, exceeds the MAX_SWEEP_EVALUATIONS limit (${Jt}) \u2014 narrow the sweep, down-sample the history, or split the run`);let d=false,f=v=>{let D;try{D=o(v);}catch(_){return d||(d=true,console.warn(`[Directive] sweepUnder: objective threw \u2014 point will not rank (${_.message})`)),Number.NEGATIVE_INFINITY}return typeof D!="number"||!Number.isFinite(D)?(d||(d=true,console.warn(`[Directive] sweepUnder: objective returned a non-finite number (${String(D)}) \u2014 point will not rank`)),Number.NEGATIVE_INFINITY):D},h=Te({frames:t,original:r,proposed:r,entityKey:c,maxSamples:a}),$={values:{},report:h,score:f(h)},w=[],F=0,W=Number.NEGATIVE_INFINITY;for(let v of Gt(i,n)){let D=Qe(s,v),_=Te({frames:t,original:r,proposed:D,entityKey:c,maxSamples:a}),Ne=f(_);Ne>W&&(W=Ne,F=w.length),w.push({values:v,report:_,score:Ne});}let p=w[F];return {points:w,bestIndex:F,best:p,baseline:$}}function Kt(e){let t=e&&typeof e=="object"&&!Array.isArray(e)&&"constraints"in e?e.constraints:e;if(Array.isArray(t)){let r={};for(let s of t){if(!s||typeof s!="object"||!("id"in s))throw new Error("[Directive] diffRules: array entries must be `{ id, whenSpec }` objects");let n=s;if(typeof n.id!="string")throw new Error("[Directive] diffRules: constraint `id` must be a string");r[n.id]=n.whenSpec;}return r}if(t&&typeof t=="object")return t;throw new Error("[Directive] diffRules: expected a `{ id: whenSpec }` map, an array of `{ id, whenSpec }`, or `{ constraints: ... }`")}var kn=new Set(["$eq","$ne","$in","$nin","$exists","$gt","$gte","$lt","$lte","$between","$matches","$startsWith","$endsWith","$contains","$changed"]),xn=new Set(["$all","$any","$not"]);function Ht(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Sn(e){if(!Ht(e))return false;let t=Object.keys(e);if(t.length===0)return false;let r=false;for(let s of t){if(!s.startsWith("$"))return false;kn.has(s)&&(r=true);}return r}function H(e,t="",r=[]){if(e===null||typeof e!="object")return r;if(Array.isArray(e)){for(let s of e)if(s&&typeof s=="object"&&"fact"in s&&"op"in s){let n=s;r.push({path:t?`${t}.${String(n.fact)}`:String(n.fact),op:String(n.op),value:n.value});}return r}if("$all"in e&&Array.isArray(e.$all))return e.$all.forEach((s,n)=>{H(s,`${t}$all[${n}]`,r);}),r;if("$any"in e&&Array.isArray(e.$any))return e.$any.forEach((s,n)=>{H(s,`${t}$any[${n}]`,r);}),r;if("$not"in e)return H(e.$not,`${t}$not`,r),r;for(let[s,n]of Object.entries(e)){let o=t?`${t}.${s}`:s;if(Sn(n))for(let[c,a]of Object.entries(n))r.push({path:o,op:c,value:a});else Ht(n)&&!xn.has(s)?H(n,o,r):r.push({path:o,op:"$eq",value:n});}return r}function B(e){return typeof e=="number"&&Number.isFinite(e)}function An(e,t,r){switch(e){case "$gte":case "$gt":if(B(t)&&B(r)){if(r<t)return "relaxed";if(r>t)return "tightened"}return null;case "$lte":case "$lt":if(B(t)&&B(r)){if(r>t)return "relaxed";if(r<t)return "tightened"}return null;case "$between":{if(Array.isArray(t)&&Array.isArray(r)&&t.length===2&&r.length===2&&B(t[0])&&B(t[1])&&B(r[0])&&B(r[1])){let s=t[1]-t[0],n=r[1]-r[0];if(n>s)return "relaxed";if(n<s)return "tightened"}return null}case "$in":case "$nin":{if(Array.isArray(t)&&Array.isArray(r))if(e==="$in"){if(r.length>t.length)return "relaxed";if(r.length<t.length)return "tightened"}else {if(r.length>t.length)return "tightened";if(r.length<t.length)return "relaxed"}return null}case "$contains":{if(Array.isArray(t)&&Array.isArray(r)){if(r.length>t.length)return "relaxed";if(r.length<t.length)return "tightened"}return null}default:return null}}function Qt(e){let t=Kt(e.before),r=Kt(e.after),s=[...new Set([...Object.keys(t),...Object.keys(r)])].sort(),n=[],o={added:0,removed:0,changed:0,unchanged:0,totalClauseChanges:0};for(let c of s){let a=t[c],i=r[c],l=c in t,u=c in r;if(l&&!u){let f=H(a),h=f.length===0?[{path:"(function-form predicate)",kind:"removed"}]:f.map($=>({path:$.path,kind:"removed",before:{op:$.op,value:$.value}}));Ye(h),n.push({id:c,status:"removed",changes:h}),o.removed++,o.totalClauseChanges+=h.length;continue}if(!l&&u){let f=H(i),h=f.length===0?[{path:"(function-form predicate)",kind:"added"}]:f.map($=>({path:$.path,kind:"added",after:{op:$.op,value:$.value}}));Ye(h),n.push({id:c,status:"added",changes:h}),o.added++,o.totalClauseChanges+=h.length;continue}let d=jn(a,i);d.length===0?(n.push({id:c,status:"unchanged",changes:[]}),o.unchanged++):(n.push({id:c,status:"changed",changes:d}),o.changed++,o.totalClauseChanges+=d.length);}return {constraints:n,summary:o}}function jn(e,t){if(e!==void 0&&t!==void 0&&(e===null||t===null||typeof e!="object"||typeof t!="object"))return de(e)===de(t)?[]:[{path:"",kind:"changed",before:{op:"$eq",value:e},after:{op:"$eq",value:t}}];let r=e===void 0?[]:H(e),s=t===void 0?[]:H(t),n=l=>`${l.path}::${l.op}`,o=new Map(r.map(l=>[n(l),l])),c=new Map(s.map(l=>[n(l),l])),a=new Set([...o.keys(),...c.keys()]),i=[];for(let l of a){let u=o.get(l),d=c.get(l);if(u&&!d){i.push({path:u.path,kind:"removed",before:{op:u.op,value:u.value}});continue}if(!u&&d){i.push({path:d.path,kind:"added",after:{op:d.op,value:d.value}});continue}if(u&&d){if(de(u.value)===de(d.value))continue;let f=An(u.op,u.value,d.value);i.push({path:u.path,kind:f??"changed",before:{op:u.op,value:u.value},after:{op:d.op,value:d.value}});}}return Ye(i),i}function Ye(e){e.sort((t,r)=>{let s=t.path.localeCompare(r.path);if(s!==0)return s;let n=t.before?.op??t.after?.op??"",o=r.before?.op??r.after?.op??"";return n.localeCompare(o)});}function Cn(e){let t={maxSamples:20,json:false};for(let r=0;r<e.length;r++)switch(e[r]){case "--history":{let n=e[++r];n&&(t.historyPath=n);break}case "--proposed":case "-p":{let n=e[++r];n&&(t.proposedPath=n);break}case "--original":case "-o":{let n=e[++r];n&&(t.originalPath=n);break}case "--max-samples":{let n=e[++r],o=n?Number.parseInt(n,10):Number.NaN;Number.isFinite(o)&&o>=0&&(t.maxSamples=o);break}case "--entity-key":{let n=e[++r];n&&(t.entityKey=n);break}case "--json":t.json=true;break}return t}function Me(){console.error(`
750
750
  Usage: directive replay-under --history <frames.json> --proposed <spec.json>
751
751
 
752
752
  Replay a recorded fact-frame history through a proposed constraint