Big News: Socket raises $60M Series C at a $1B valuation to secure software supply chains for AI-driven development.Announcement
Sign In

@directive-run/core

Package Overview
Dependencies
Maintainers
1
Versions
43
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@directive-run/core - npm Package Compare versions

Comparing version
1.13.0
to
1.14.0
+2
dist/chunk-AV6S27PU.js
import {i}from'./chunk-2FF6QGOA.js';import {h}from'./chunk-PXRV64PA.js';function L(t){if(t instanceof Date)return t.getTime();if(typeof t=="number"){if(!Number.isFinite(t))throw new Error("[Directive] audit-ledger: changedBetween bound must be a finite number, ISO string, or Date.");return t}if(typeof t=="string"){let r=Date.parse(t);if(!Number.isFinite(r))throw new Error(`[Directive] audit-ledger: changedBetween bound "${t}" is not a parseable ISO date string.`);return r}throw new Error("[Directive] audit-ledger: changedBetween bound must be a number, ISO string, or Date.")}function x(t,r){if(r.kind&&!(Array.isArray(r.kind)?r.kind:[r.kind]).includes(t.kind))return false;if(r.factPath!==void 0)if(t.kind==="fact.change"){if(t.key!==r.factPath)return false}else if(t.kind==="resolver.write.rejected"){if(t.fact!==r.factPath)return false}else return false;if(r.constraintId!==void 0&&(t.kind!=="constraint.evaluate"||t.constraintId!==r.constraintId))return false;if(r.changedBetween){let[n,a]=r.changedBetween,u=L(n),d=L(a);if(t.ts<u||t.ts>d)return false}return true}function R(t={}){let r=t.capacity??1e4,n=[],a=null;return {write(d){if(n.length>=r){let i=n[0];a?.(i.seq,1),n.shift();}for(n.push(d);n.length>r;)n.shift();},query(d){let i=d.limit??1e3,o=[];for(let c=n.length-1;c>=0;c--){let y=n[c];if(x(y,d)&&(o.push(y),o.length>=i))break}return o},recent(d){let i=Math.max(0,n.length-d);return n.slice(i)},forFact(d,i={}){return this.query({factPath:d,limit:i.limit})},forConstraint(d,i={}){return this.query({constraintId:d,limit:i.limit})},toJSON(){return {entries:n.slice(),capturedAt:Date.now()}},clear(){n=[];},destroy(){n=[],a=null;},erase(d,i){let o=0;for(let c=0;c<n.length;c++){let y=n[c];x(y,d)&&(n[c]=i(y),o++);}return o},onTruncate(d){a=d;}}}var _=Symbol("directive.audit-ledger.internal");function C(t){for(let r of Object.keys(t)){let n=t[r];if(n!==null&&typeof n=="object"){if(Array.isArray(n)&&r==="whenExplain")for(let a of n)a!==null&&typeof a=="object"&&Object.freeze(a);Object.freeze(n);}}return Object.freeze(t),t}function K(t){return h(t)}function v(t){if(t.hashAlgo==="djb2-1")return K(t);throw new Error(`[Directive] audit-ledger: unknown hashAlgo "${String(t.hashAlgo)}" on entry seq=${t.seq}. Cannot verify chain integrity. Known algorithms: "djb2-1".`)}function H(t,r,n){if(t===null||typeof t!="object")return;let a=[];for(let i of r.split(".")){if(!i)continue;let o=i.match(/^\[(\d+)\](.*)$/);if(o){a.push(Number(o[1])),o[2]&&a.push(o[2].replace(/^\./,""));continue}let c=i.match(/^([^[]+)\[(\d+)\](.*)$/);if(c){a.push(c[1]),a.push(Number(c[2])),c[3]&&a.push(c[3].replace(/^\./,""));continue}a.push(i);}let u=t;for(let i=0;i<a.length-1;i++){let o=a[i];if(u===null||typeof u!="object")return;u=u[o];}if(u===null||typeof u!="object")return;let d=a[a.length-1];d!==void 0&&(u[d]=n);}function F(t,r,n){if(r||n.size===0||t===null||typeof t!="object")return t;let a;try{a=JSON.parse(JSON.stringify(t));}catch{return t}return i(a,{operator(u,d,i,o){n.has(u)&&H(a,o,"[redacted]");},literal(u){n.has(u)&&H(a,u,"[redacted]");}}),a}var D="djb2-1";function N(t,r){if(r?.strong===true)throw new Error("[Directive] verify({ strong: true }) is reserved for v2 \u2014 v1 ships sync djb2 chain only. Use verify() (sync) for tamper detection.");let{entries:n}=t.toJSON();if(n.length===0)return {valid:true,entryCount:0};let a=new Set,u=null;for(let i=0;i<n.length;i++){let o=n[i];if(o.prevHash!==u){let c=i>0?n[i-1]:null,y=o.kind==="system.entry-erased",h=c?.kind==="system.entry-erased";if(y||h){let A=[];y&&A.push(o),h&&c!==null&&A.push(c);let b=A.find(I=>I.__internal!==_);if(b)return {valid:false,brokenAt:i,expectedHash:u??"<genesis>",actualHash:o.prevHash??"<genesis>",entry:b,reason:"tombstone forgery detected \u2014 missing internal sentinel. A 'system.entry-erased' entry was written via sink.write() rather than ledger.erase(); rejected as tamper."};let E=y?o:c;a.add(E.seq),u=v(o);continue}return {valid:false,brokenAt:i,expectedHash:u??"<genesis>",actualHash:o.prevHash??"<genesis>",entry:o}}u=v(o);}let d={valid:true,entryCount:n.length};return a.size>0&&(d.erasedSeqs=[...a].sort((i,o)=>i-o)),d}function ie(t={}){let r=t.sink??R(),n=t.capturePII??false,a=t.redact,u=0,d=null,i=null,o=null,c=new Map,y=new Map,h$1=new Set;function A(){if(c.clear(),y.clear(),!!i)try{let e=i.inspect;if(typeof e!="function")return;let l=e()?.constraints??[],f=i.$internal?.mergedConstraints;for(let m of l)if(m.whenSpec!==void 0)c.set(m.id,F(m.whenSpec,n,h$1));else {let g=f?.[m.id],S=g&&typeof g.when=="function"?g.when:void 0;S?y.set(m.id,h(String(S))):m.when!==void 0&&typeof m.when=="function"?y.set(m.id,h(String(m.when))):y.set(m.id,h("[function]"));}}catch{}}function b(){if(h$1.clear(),!(n||!i))try{let e=i.meta;if(!e||typeof e.byTag!="function")return;let s=e.byTag("pii")??[];for(let l of s)h$1.add(l.id);}catch{}}function E(e,s){return n?s:h$1.has(e)?"[redacted]":s}function I(e){if(!e||n||h$1.size===0)return e;let s=false,l=e.map(f=>{if(h$1.has(f.path))return s=true,{...f,actual:"[redacted]"};if(f.children){let m=I(f.children);if(m!==f.children)return s=true,{...f,children:m}}return f});return s?l:e}function p(e){let s={...e,seq:u++,ts:Date.now(),prevHash:d,hashAlgo:D,schemaVersion:1},l=a?a(s):s;return C(l),r.write(l),d=v(l),l}function T(e){switch(e.type){case "constraint.evaluate":{let s=c.get(e.id),l=y.get(e.id),f={kind:"constraint.evaluate",constraintId:e.id,active:e.active,whenExplain:I(e.whenExplain)};s!==void 0?f.whenSpec=s:l!==void 0&&(f.whenSource={kind:"function",sourceHash:l}),p(f);break}case "fact.change":p({kind:"fact.change",key:e.key,prior:E(e.key,e.prev),next:E(e.key,e.next)});break;case "resolver.write.rejected":e.kind==="summary"?p({kind:"resolver.write.rejected",rejection:"summary",resolverId:e.resolver,requirementId:e.requirementId,reason:e.reason,dropped:e.dropped}):p({kind:"resolver.write.rejected",rejection:"rejection",resolverId:e.resolver,requirementId:e.requirementId,reason:e.reason,fact:e.fact,expected:E(e.fact,e.expected),actual:E(e.fact,e.actual)});break;case "resolver.complete":p({kind:"resolver.complete",resolverId:e.resolver,requirementId:e.requirementId,duration:e.duration});break;case "resolver.error":p({kind:"resolver.error",resolverId:e.resolver,requirementId:e.requirementId,error:String(e.error)});break;case "system.init":case "system.start":case "system.stop":case "system.destroy":p({kind:e.type});break;}}let j=false;function B(e){i=e,b(),A(),o=e.observe(T),r.onTruncate?.((s,l)=>{if(!j){j=true;try{p({kind:"system.truncated",droppedSeq:s,droppedCount:l});}finally{j=false;}}});}function q(){o&&(o(),o=null),i=null,c.clear(),y.clear(),h$1.clear();}let M={name:"audit-ledger",onInit(e){B(e);},onStop(){o&&(o(),o=null);},onDestroy(){q();},onDefinitionRegister(e,s){e==="constraint"&&A(),(e==="constraint"||e==="resolver"||e==="effect")&&b();},onDefinitionAssign(e,s){e==="constraint"&&A();},onDefinitionUnregister(e,s){e==="constraint"&&A();},onSnapshot(e){p({kind:"system.snapshot",snapshotId:e.id,trigger:e.trigger});},onHistoryNavigate(e,s){p({kind:"system.history.navigate",from:e,to:s});}};function V(e){if(e.__internal===void 0)return e;let s={...e};return delete s.__internal,s}function w(e){let s=false;for(let l of e)if(l.__internal!==void 0){s=true;break}return s?e.map(V):e}return {plugin:M,query:(e={})=>w(r.query(e)),recent:e=>w(r.recent(e)),forFact:(e,s)=>w(r.forFact(e,s)),forConstraint:(e,s)=>w(r.forConstraint(e,s)),toJSON:()=>{let e=r.toJSON();return {entries:w(e.entries),capturedAt:e.capturedAt}},verify(e){return N(r,e)},erase(e){let s=Date.now(),l=0;if(typeof r.erase=="function"&&(l=r.erase(e,g=>{let S={seq:g.seq,ts:g.ts,kind:"system.entry-erased",prevHash:g.prevHash,hashAlgo:g.hashAlgo,schemaVersion:g.schemaVersion??1,originalKind:g.kind,erasedAt:s,__internal:_};return C(S),S})),l===0)return {erased:0,markerEntry:null};let f={factPath:e.factPath!==void 0,constraintId:e.constraintId!==void 0,kind:e.kind,changedBetween:e.changedBetween!==void 0?"[range]":void 0},m=p({kind:"system.subject-erased",filterHash:h(e),filterShape:f,erased:l});return {erased:l,markerEntry:m}},clear(){r.clear(),u=0,d=null;},destroy(){q(),r.destroy();}}}export{R as a,ie as b};//# sourceMappingURL=chunk-AV6S27PU.js.map
//# sourceMappingURL=chunk-AV6S27PU.js.map

Sorry, the diff of this file is too big to display

'use strict';var chunkT4TRJEJN_cjs=require('./chunk-T4TRJEJN.cjs'),chunk4MNQDXH7_cjs=require('./chunk-4MNQDXH7.cjs');function L(t){if(t instanceof Date)return t.getTime();if(typeof t=="number"){if(!Number.isFinite(t))throw new Error("[Directive] audit-ledger: changedBetween bound must be a finite number, ISO string, or Date.");return t}if(typeof t=="string"){let r=Date.parse(t);if(!Number.isFinite(r))throw new Error(`[Directive] audit-ledger: changedBetween bound "${t}" is not a parseable ISO date string.`);return r}throw new Error("[Directive] audit-ledger: changedBetween bound must be a number, ISO string, or Date.")}function x(t,r){if(r.kind&&!(Array.isArray(r.kind)?r.kind:[r.kind]).includes(t.kind))return false;if(r.factPath!==void 0)if(t.kind==="fact.change"){if(t.key!==r.factPath)return false}else if(t.kind==="resolver.write.rejected"){if(t.fact!==r.factPath)return false}else return false;if(r.constraintId!==void 0&&(t.kind!=="constraint.evaluate"||t.constraintId!==r.constraintId))return false;if(r.changedBetween){let[n,a]=r.changedBetween,u=L(n),d=L(a);if(t.ts<u||t.ts>d)return false}return true}function R(t={}){let r=t.capacity??1e4,n=[],a=null;return {write(d){if(n.length>=r){let i=n[0];a?.(i.seq,1),n.shift();}for(n.push(d);n.length>r;)n.shift();},query(d){let i=d.limit??1e3,o=[];for(let c=n.length-1;c>=0;c--){let y=n[c];if(x(y,d)&&(o.push(y),o.length>=i))break}return o},recent(d){let i=Math.max(0,n.length-d);return n.slice(i)},forFact(d,i={}){return this.query({factPath:d,limit:i.limit})},forConstraint(d,i={}){return this.query({constraintId:d,limit:i.limit})},toJSON(){return {entries:n.slice(),capturedAt:Date.now()}},clear(){n=[];},destroy(){n=[],a=null;},erase(d,i){let o=0;for(let c=0;c<n.length;c++){let y=n[c];x(y,d)&&(n[c]=i(y),o++);}return o},onTruncate(d){a=d;}}}var _=Symbol("directive.audit-ledger.internal");function C(t){for(let r of Object.keys(t)){let n=t[r];if(n!==null&&typeof n=="object"){if(Array.isArray(n)&&r==="whenExplain")for(let a of n)a!==null&&typeof a=="object"&&Object.freeze(a);Object.freeze(n);}}return Object.freeze(t),t}function K(t){return chunk4MNQDXH7_cjs.h(t)}function v(t){if(t.hashAlgo==="djb2-1")return K(t);throw new Error(`[Directive] audit-ledger: unknown hashAlgo "${String(t.hashAlgo)}" on entry seq=${t.seq}. Cannot verify chain integrity. Known algorithms: "djb2-1".`)}function H(t,r,n){if(t===null||typeof t!="object")return;let a=[];for(let i of r.split(".")){if(!i)continue;let o=i.match(/^\[(\d+)\](.*)$/);if(o){a.push(Number(o[1])),o[2]&&a.push(o[2].replace(/^\./,""));continue}let c=i.match(/^([^[]+)\[(\d+)\](.*)$/);if(c){a.push(c[1]),a.push(Number(c[2])),c[3]&&a.push(c[3].replace(/^\./,""));continue}a.push(i);}let u=t;for(let i=0;i<a.length-1;i++){let o=a[i];if(u===null||typeof u!="object")return;u=u[o];}if(u===null||typeof u!="object")return;let d=a[a.length-1];d!==void 0&&(u[d]=n);}function F(t,r,n){if(r||n.size===0||t===null||typeof t!="object")return t;let a;try{a=JSON.parse(JSON.stringify(t));}catch{return t}return chunkT4TRJEJN_cjs.i(a,{operator(u,d,i,o){n.has(u)&&H(a,o,"[redacted]");},literal(u){n.has(u)&&H(a,u,"[redacted]");}}),a}var D="djb2-1";function N(t,r){if(r?.strong===true)throw new Error("[Directive] verify({ strong: true }) is reserved for v2 \u2014 v1 ships sync djb2 chain only. Use verify() (sync) for tamper detection.");let{entries:n}=t.toJSON();if(n.length===0)return {valid:true,entryCount:0};let a=new Set,u=null;for(let i=0;i<n.length;i++){let o=n[i];if(o.prevHash!==u){let c=i>0?n[i-1]:null,y=o.kind==="system.entry-erased",h=c?.kind==="system.entry-erased";if(y||h){let A=[];y&&A.push(o),h&&c!==null&&A.push(c);let b=A.find(I=>I.__internal!==_);if(b)return {valid:false,brokenAt:i,expectedHash:u??"<genesis>",actualHash:o.prevHash??"<genesis>",entry:b,reason:"tombstone forgery detected \u2014 missing internal sentinel. A 'system.entry-erased' entry was written via sink.write() rather than ledger.erase(); rejected as tamper."};let E=y?o:c;a.add(E.seq),u=v(o);continue}return {valid:false,brokenAt:i,expectedHash:u??"<genesis>",actualHash:o.prevHash??"<genesis>",entry:o}}u=v(o);}let d={valid:true,entryCount:n.length};return a.size>0&&(d.erasedSeqs=[...a].sort((i,o)=>i-o)),d}function ie(t={}){let r=t.sink??R(),n=t.capturePII??false,a=t.redact,u=0,d=null,i=null,o=null,c=new Map,y=new Map,h=new Set;function A(){if(c.clear(),y.clear(),!!i)try{let e=i.inspect;if(typeof e!="function")return;let l=e()?.constraints??[],f=i.$internal?.mergedConstraints;for(let m of l)if(m.whenSpec!==void 0)c.set(m.id,F(m.whenSpec,n,h));else {let g=f?.[m.id],S=g&&typeof g.when=="function"?g.when:void 0;S?y.set(m.id,chunk4MNQDXH7_cjs.h(String(S))):m.when!==void 0&&typeof m.when=="function"?y.set(m.id,chunk4MNQDXH7_cjs.h(String(m.when))):y.set(m.id,chunk4MNQDXH7_cjs.h("[function]"));}}catch{}}function b(){if(h.clear(),!(n||!i))try{let e=i.meta;if(!e||typeof e.byTag!="function")return;let s=e.byTag("pii")??[];for(let l of s)h.add(l.id);}catch{}}function E(e,s){return n?s:h.has(e)?"[redacted]":s}function I(e){if(!e||n||h.size===0)return e;let s=false,l=e.map(f=>{if(h.has(f.path))return s=true,{...f,actual:"[redacted]"};if(f.children){let m=I(f.children);if(m!==f.children)return s=true,{...f,children:m}}return f});return s?l:e}function p(e){let s={...e,seq:u++,ts:Date.now(),prevHash:d,hashAlgo:D,schemaVersion:1},l=a?a(s):s;return C(l),r.write(l),d=v(l),l}function T(e){switch(e.type){case "constraint.evaluate":{let s=c.get(e.id),l=y.get(e.id),f={kind:"constraint.evaluate",constraintId:e.id,active:e.active,whenExplain:I(e.whenExplain)};s!==void 0?f.whenSpec=s:l!==void 0&&(f.whenSource={kind:"function",sourceHash:l}),p(f);break}case "fact.change":p({kind:"fact.change",key:e.key,prior:E(e.key,e.prev),next:E(e.key,e.next)});break;case "resolver.write.rejected":e.kind==="summary"?p({kind:"resolver.write.rejected",rejection:"summary",resolverId:e.resolver,requirementId:e.requirementId,reason:e.reason,dropped:e.dropped}):p({kind:"resolver.write.rejected",rejection:"rejection",resolverId:e.resolver,requirementId:e.requirementId,reason:e.reason,fact:e.fact,expected:E(e.fact,e.expected),actual:E(e.fact,e.actual)});break;case "resolver.complete":p({kind:"resolver.complete",resolverId:e.resolver,requirementId:e.requirementId,duration:e.duration});break;case "resolver.error":p({kind:"resolver.error",resolverId:e.resolver,requirementId:e.requirementId,error:String(e.error)});break;case "system.init":case "system.start":case "system.stop":case "system.destroy":p({kind:e.type});break;}}let j=false;function B(e){i=e,b(),A(),o=e.observe(T),r.onTruncate?.((s,l)=>{if(!j){j=true;try{p({kind:"system.truncated",droppedSeq:s,droppedCount:l});}finally{j=false;}}});}function q(){o&&(o(),o=null),i=null,c.clear(),y.clear(),h.clear();}let M={name:"audit-ledger",onInit(e){B(e);},onStop(){o&&(o(),o=null);},onDestroy(){q();},onDefinitionRegister(e,s){e==="constraint"&&A(),(e==="constraint"||e==="resolver"||e==="effect")&&b();},onDefinitionAssign(e,s){e==="constraint"&&A();},onDefinitionUnregister(e,s){e==="constraint"&&A();},onSnapshot(e){p({kind:"system.snapshot",snapshotId:e.id,trigger:e.trigger});},onHistoryNavigate(e,s){p({kind:"system.history.navigate",from:e,to:s});}};function V(e){if(e.__internal===void 0)return e;let s={...e};return delete s.__internal,s}function w(e){let s=false;for(let l of e)if(l.__internal!==void 0){s=true;break}return s?e.map(V):e}return {plugin:M,query:(e={})=>w(r.query(e)),recent:e=>w(r.recent(e)),forFact:(e,s)=>w(r.forFact(e,s)),forConstraint:(e,s)=>w(r.forConstraint(e,s)),toJSON:()=>{let e=r.toJSON();return {entries:w(e.entries),capturedAt:e.capturedAt}},verify(e){return N(r,e)},erase(e){let s=Date.now(),l=0;if(typeof r.erase=="function"&&(l=r.erase(e,g=>{let S={seq:g.seq,ts:g.ts,kind:"system.entry-erased",prevHash:g.prevHash,hashAlgo:g.hashAlgo,schemaVersion:g.schemaVersion??1,originalKind:g.kind,erasedAt:s,__internal:_};return C(S),S})),l===0)return {erased:0,markerEntry:null};let f={factPath:e.factPath!==void 0,constraintId:e.constraintId!==void 0,kind:e.kind,changedBetween:e.changedBetween!==void 0?"[range]":void 0},m=p({kind:"system.subject-erased",filterHash:chunk4MNQDXH7_cjs.h(e),filterShape:f,erased:l});return {erased:l,markerEntry:m}},clear(){r.clear(),u=0,d=null;},destroy(){q(),r.destroy();}}}exports.a=R;exports.b=ie;//# sourceMappingURL=chunk-Q2VZPURY.cjs.map
//# sourceMappingURL=chunk-Q2VZPURY.cjs.map

Sorry, the diff of this file is too big to display

import { F as FactPredicate, C as ClauseResult, P as Plugin, M as ModuleSchema } from './plugins-BIzXaYbg.js';
/**
* Audit-ledger type definitions — entry shapes, sink interface, query
* filter, verify result, and plugin options. Pure types + the two
* schema-version constants (`HASH_ALGO`, `SCHEMA_VERSION`) that are
* referenced by the entry shape.
*
* Kept free of runtime imports so the hash/freeze/sink modules can pull
* types from here without a cycle.
*/
/** Hash algorithm tag — bumped if canonicalization or hash function changes. */
declare const HASH_ALGO: "djb2-1";
/**
* Entry schema version. Bumped if `AuditEntry` field shape changes in
* a way that breaks back-compat parsers. Persisted on every entry so
* exports remain self-describing across library upgrades. (F-5)
*/
declare const SCHEMA_VERSION: 1;
type AuditEntryKind = "constraint.evaluate" | "resolver.write.rejected" | "fact.change" | "resolver.complete" | "resolver.error" | "system.init" | "system.start" | "system.stop" | "system.destroy" | "system.snapshot" | "system.history.navigate" | "system.truncated" | "system.entry-erased" | "system.subject-erased";
/**
* Internal sentinel symbol type. The actual symbol VALUE lives in
* `hash.ts` and is never exported from this folder's public surface —
* but the TYPE must be referenceable here so `AuditEntryBase` can
* declare the optional `__internal` field.
*
* We use `symbol` rather than `typeof LEDGER_INTERNAL_TOKEN` because
* importing the symbol value into types.ts would either re-export it
* (defeating the defense) or create a circular import. The runtime
* check in `verify()` compares against the actual symbol reference.
*/
type LedgerInternalSentinel = symbol;
interface AuditEntryBase {
/** Monotonic sequence number, starting at 0. */
readonly seq: number;
/** Wall-clock timestamp (ms epoch). */
readonly ts: number;
/** Discriminator. */
readonly kind: AuditEntryKind;
/** Hash of the previous entry's full payload. null on the genesis entry. */
readonly prevHash: string | null;
/**
* Hash algorithm tag identifying the canonicalization + hash
* function in use. Bumped if the algorithm or canonical form
* changes, so exports remain verifiable across versions.
*/
readonly hashAlgo: typeof HASH_ALGO;
/**
* Entry schema version — bumped if any `AuditEntry` field shape
* changes in a way that breaks back-compat. Pair with `hashAlgo`
* when migrating older exports. (F-5)
*/
readonly schemaVersion: typeof SCHEMA_VERSION;
/**
* Private sentinel — present (and equal to the in-module token) only
* on legitimate tombstones minted by `ledger.erase()`. Filtered out
* of all public read paths (`query`, `recent`, `toJSON`, etc.) so
* consumers never see or copy it. (N7)
*
* NOT serialized. NOT exported. Forging this from outside the module
* is impossible without the symbol reference; `verify()` rejects any
* `system.entry-erased` entry that lacks it.
*
* @internal
*/
readonly __internal?: LedgerInternalSentinel;
}
type AuditEntry = (AuditEntryBase & {
kind: "constraint.evaluate";
constraintId: string;
active: boolean;
/** Cached at ledger start from `system.inspect().constraints[].whenSpec`. Refreshed on `register()`/`assign()`/`unregister()`. May be undefined for function-form constraints (see `whenSource`). PII operands redacted unless `capturePII: true`. */
whenSpec?: FactPredicate<unknown>;
whenExplain?: readonly ClauseResult[];
/**
* For function-form constraints (no `whenSpec`), a tamper-evident
* identity for the function. We DO NOT capture the raw source —
* closures routinely reference secrets, API keys, or PII (e.g.
* `if (apiKey === "sk-live-xxx")`) and a preview would leak them
* into the audit log. Instead, we capture a djb2 hash of the
* stringified function (`hashObject(String(fn))`). Auditors can
* detect "the function changed between deploys" by comparing
* hashes across entries, without ever seeing the function body.
*
* Informational only — NOT replayable. (N5, M22)
*/
whenSource?: {
kind: "function";
sourceHash: string;
};
}) | (AuditEntryBase & {
kind: "resolver.write.rejected";
rejection: "rejection" | "summary";
resolverId: string;
requirementId: string;
reason: string;
fact?: string;
expected?: unknown;
actual?: unknown;
dropped?: number;
}) | (AuditEntryBase & {
kind: "fact.change";
key: string;
prior: unknown;
next: unknown;
}) | (AuditEntryBase & {
kind: "resolver.complete";
resolverId: string;
requirementId: string;
duration: number;
}) | (AuditEntryBase & {
kind: "resolver.error";
resolverId: string;
requirementId: string;
error: string;
}) | (AuditEntryBase & {
kind: "system.init" | "system.start" | "system.stop" | "system.destroy";
}) | (AuditEntryBase & {
kind: "system.snapshot";
snapshotId: number;
trigger: string;
}) | (AuditEntryBase & {
kind: "system.history.navigate";
from: number;
to: number;
}) | (AuditEntryBase & {
kind: "system.truncated";
droppedSeq: number;
droppedCount: number;
}) | (AuditEntryBase & {
kind: "system.entry-erased";
originalKind: AuditEntryKind;
erasedAt: number;
}) | (AuditEntryBase & {
kind: "system.subject-erased";
/**
* djb2 hash of the filter (via `hashObject(filter)`). PII-safe —
* the raw filter values never land in the ledger. Pair with
* `filterShape` to see which filter fields were used. (N2)
*/
filterHash: string;
/**
* Stripped-values shape of the filter — captures WHICH fields were
* present without recording their values. (N2)
*/
filterShape: {
factPath: boolean;
constraintId: boolean;
kind: AuditEntryKind | readonly AuditEntryKind[] | undefined;
changedBetween: "[range]" | undefined;
};
erased: number;
});
interface QueryFilter {
/** Exact-match fact path. */
factPath?: string;
/** Filter by constraint id. */
constraintId?: string;
/** Filter by entry kind. */
kind?: AuditEntryKind | readonly AuditEntryKind[];
/** Time range as `[startMs, endMs]`, ISO strings, or epoch numbers. */
changedBetween?: [string | number | Date, string | number | Date];
/** Maximum entries returned. Default 1000. */
limit?: number;
}
/**
* Verify result — chain valid OR a break with full context for tamper visualization.
*
* Erased entries (via `ledger.erase()`) appear as legitimate chain breaks —
* `verify()` reports them in `erasedSeqs` and continues the walk from the
* tombstone's own hash. Real tamper still surfaces as `valid: false`.
*
* Forged tombstones (a caller writes `kind: "system.entry-erased"`
* directly via `sink.write()` to mask tamper as erasure) are detected:
* legitimate tombstones carry an in-module sentinel that forgeries
* cannot mint, so `verify()` reports them as tamper. (N7)
*/
type VerifyResult = {
valid: true;
entryCount: number;
/**
* Seq numbers of entries legitimately broken by `erase()`
* tombstones. NOT timestamps — each entry pairs this seq with
* the per-entry `system.entry-erased.erasedAt` (ms epoch) for
* the timestamp. Empty unless the chain contains erasures.
* (N1 + M1; renamed from `erasedAt` in R3)
*/
erasedSeqs?: number[];
} | {
valid: false;
brokenAt: number;
expectedHash: string;
actualHash: string;
entry: AuditEntry;
/**
* Human-readable reason for the break — populated for cases
* where the cause is more specific than "hash mismatch" (e.g.
* tombstone forgery detected via missing sentinel).
*/
reason?: string;
};
interface AuditLedgerSink {
write(entry: AuditEntry): void;
query(filter: QueryFilter): readonly AuditEntry[];
recent(n: number): readonly AuditEntry[];
forFact(path: string, opts?: {
limit?: number;
}): readonly AuditEntry[];
forConstraint(id: string, opts?: {
limit?: number;
}): readonly AuditEntry[];
toJSON(): {
entries: readonly AuditEntry[];
capturedAt: number;
};
clear(): void;
destroy(): void;
/**
* Replace matching entries with marker entries IN PLACE (preserving seq +
* prevHash so the hash chain still verifies — the marker is a
* tombstone in chain terms; the chain break is what makes erasure
* visible to `verify()`). v1 implementation matches on the same
* `QueryFilter` shape used by `query()`. Returns the count of entries
* replaced.
*
* WARNING: erases only from this sink. Any external copies (toJSON
* exports, downstream pipelines) must be erased separately.
*/
erase?(filter: QueryFilter, markerEntryFactory: (e: AuditEntry) => AuditEntry): number;
/**
* Optional hook fired by the sink BEFORE shifting the oldest entry
* out of a bounded ring buffer. The ledger plugin uses this to emit
* a `system.truncated` marker so an auditor sees that the log was
* truncated and where. (M23)
*/
onTruncate?(handler: (droppedSeq: number, droppedCount: number) => void): void;
}
interface AuditLedgerOptions {
/** Sink to write entries to. Default: in-memory ring buffer (capacity 10k). */
sink?: AuditLedgerSink;
/**
* Whether to capture raw fact values (`prior`/`next` on fact.change,
* `actual` in whenExplain). Default `false` — PII-tagged facts are
* redacted by default. Set `true` to opt out of redaction.
*/
capturePII?: boolean;
/**
* Optional caller-supplied redactor. Runs AFTER the default
* pii-tag-based redaction. Useful for additional sanitization.
*/
redact?: (entry: AuditEntry) => AuditEntry;
}
interface AuditLedger {
/** The plugin to pass to `createSystem({ plugins: [...] })`. */
readonly plugin: Plugin<ModuleSchema>;
/** Query entries matching the filter. */
query(filter?: QueryFilter): readonly AuditEntry[];
/** Most recent N entries (chronological). */
recent(n: number): readonly AuditEntry[];
/** All entries that touch this fact path (exact match). */
forFact(path: string, opts?: {
limit?: number;
}): readonly AuditEntry[];
/** All entries for this constraint id. */
forConstraint(id: string, opts?: {
limit?: number;
}): readonly AuditEntry[];
/** Full ledger snapshot for export / serialization. */
toJSON(): {
entries: readonly AuditEntry[];
capturedAt: number;
};
/**
* Walk the hash chain genesis → tip. Returns `{ valid: true }` iff
* every entry's `prevHash` matches the (sync, djb2-based) hash of
* the previous entry. On break, returns the index of the first
* broken link plus the expected vs actual hashes — feed into a
* "TAMPERED" visualization.
*
* Erased entries (via `ledger.erase()`) appear as legitimate chain
* breaks — `verify()` reports them in `erasedSeqs` and continues
* the walk from the tombstone's actual hash. Real tamper still
* surfaces as `valid: false`. (N1 + M1)
*
* Forged tombstones — `kind: "system.entry-erased"` entries written
* directly via `sink.write()` to mask tamper — are detected as
* forgery. Legitimate tombstones carry an in-module sentinel that
* forgeries cannot mint. (N7)
*
* v1 ships sync djb2 only. `verify({ strong: true })` is reserved
* for v2 (SHA-256) and THROWS today — there is no silent fallback.
* Call `verify()` (no args) for tamper detection.
*/
verify(opts?: {
strong?: boolean;
}): VerifyResult;
/**
* Per-subject erasure (GDPR Art. 17 stub). Replaces matching entries
* in this sink with `system.entry-erased` tombstones (preserving
* seq + prevHash so verify() can resync), then appends a chained
* `system.subject-erased` marker entry that summarises the erasure.
*
* Returns `{ erased, markerEntry }` — `markerEntry` is the chained
* `system.subject-erased` summary (the N per-entry tombstones live
* in the sink, not on the return value). (M7)
*
* When `erased === 0` (filter matched nothing), `markerEntry` is
* `null` and no marker is emitted into the chain — avoids polluting
* the audit trail with empty "erased: 0" records. (MAJOR-3)
*
* WARNING: v1 erases only from THIS sink. External copies (toJSON
* exports, downstream pipelines, persisted backups) must be erased
* separately. (C8)
*/
erase(filter: QueryFilter): {
erased: number;
markerEntry: AuditEntry | null;
};
/** Empty the sink. */
clear(): void;
/** Unsubscribe + drop the sink. */
destroy(): void;
}
/**
* `memorySink()` — bounded ring-buffer implementation of
* `AuditLedgerSink`. Drops the oldest entry past `capacity`
* (default 10,000), exposes a truncation hook so the ledger plugin
* can emit a `system.truncated` marker before the shift, and
* supports in-place tombstone erasure for GDPR Art. 17.
*
* Pure storage layer — no hash chain awareness, no PII redaction.
* The plugin in `./index.ts` owns those concerns and routes them
* through this sink via `write()` / `erase()`.
*/
/**
* In-memory bounded ring-buffer sink. Drops oldest entries past
* `capacity` (default 10,000). Use this as the default sink for dev,
* tests, and StackBlitz demos.
*/
declare function memorySink(opts?: {
capacity?: number;
}): AuditLedgerSink;
/**
* createAuditLedger — append-only, queryable, hash-chained
* (djb2; SHA-256 reserved for v2) audit of every state change. For
* forensics and "show me why this user got that decision."
*
* Captures (per observation event):
*
* - `constraint.evaluate` → { whenSpec, whenExplain, active, whenSource? }
* - `resolver.write.rejected` (rejection + summary kinds)
* - `fact.change` → { key, prior, next }
* - `resolver.complete` → { resolverId, requirementId, duration }
* - `system.init` / `system.start` / `system.stop` / `system.destroy`
* - `system.snapshot` / `system.history.navigate` (lifecycle markers)
* - `system.truncated` (ring-buffer overflow marker)
* - `system.entry-erased` / `system.subject-erased` (GDPR Art.17 stub)
*
* PII redaction: by default, fact keys whose meta carries the `pii`
* tag (via `system.meta.byTag("pii")`) have their values replaced with
* `"[redacted]"` in `whenExplain.actual`, `fact.change.prior`,
* `fact.change.next`, and the cached `whenSpec` operands. Opt out with
* `capturePII: true`.
*
* Folder layout:
* types.ts — public type surface + version stamps
* hash.ts — djb2 dispatch + freeze helper + INTERNAL TOKEN
* sink.ts — memorySink() ring buffer
* predicate-redact.ts — PII-aware redactWhenSpec
* verify.ts — tombstone-aware chain walk
* index.ts (this) — createAuditLedger factory + plugin wiring
*/
/**
* Create an audit ledger that subscribes to the given system's
* observation stream. Returns a `Plugin` to install + a query/verify
* API for the ledger.
*
* @example
* ```ts
* import { createAuditLedger } from "@directive-run/core/plugins";
*
* const ledger = createAuditLedger();
* const system = createSystem({ module, plugins: [ledger.plugin] });
* system.start();
*
* // Six months later — auditor asks "what changed cart-total in March?"
* ledger.query({
* factPath: "cartTotal",
* changedBetween: ["2026-03-01", "2026-04-01"],
* });
*
* // Verify nobody tampered with the ledger
* const verdict = await ledger.verify();
* if (!verdict.valid) {
* console.error("Tamper at entry", verdict.brokenAt);
* }
* ```
*/
declare function createAuditLedger(opts?: AuditLedgerOptions): AuditLedger;
export { type AuditEntry as A, type QueryFilter as Q, type VerifyResult as V, type AuditEntryKind as a, type AuditLedger as b, type AuditLedgerOptions as c, type AuditLedgerSink as d, createAuditLedger as e, memorySink as m };
import { F as FactPredicate, C as ClauseResult, P as Plugin, M as ModuleSchema } from './plugins-BIzXaYbg.cjs';
/**
* Audit-ledger type definitions — entry shapes, sink interface, query
* filter, verify result, and plugin options. Pure types + the two
* schema-version constants (`HASH_ALGO`, `SCHEMA_VERSION`) that are
* referenced by the entry shape.
*
* Kept free of runtime imports so the hash/freeze/sink modules can pull
* types from here without a cycle.
*/
/** Hash algorithm tag — bumped if canonicalization or hash function changes. */
declare const HASH_ALGO: "djb2-1";
/**
* Entry schema version. Bumped if `AuditEntry` field shape changes in
* a way that breaks back-compat parsers. Persisted on every entry so
* exports remain self-describing across library upgrades. (F-5)
*/
declare const SCHEMA_VERSION: 1;
type AuditEntryKind = "constraint.evaluate" | "resolver.write.rejected" | "fact.change" | "resolver.complete" | "resolver.error" | "system.init" | "system.start" | "system.stop" | "system.destroy" | "system.snapshot" | "system.history.navigate" | "system.truncated" | "system.entry-erased" | "system.subject-erased";
/**
* Internal sentinel symbol type. The actual symbol VALUE lives in
* `hash.ts` and is never exported from this folder's public surface —
* but the TYPE must be referenceable here so `AuditEntryBase` can
* declare the optional `__internal` field.
*
* We use `symbol` rather than `typeof LEDGER_INTERNAL_TOKEN` because
* importing the symbol value into types.ts would either re-export it
* (defeating the defense) or create a circular import. The runtime
* check in `verify()` compares against the actual symbol reference.
*/
type LedgerInternalSentinel = symbol;
interface AuditEntryBase {
/** Monotonic sequence number, starting at 0. */
readonly seq: number;
/** Wall-clock timestamp (ms epoch). */
readonly ts: number;
/** Discriminator. */
readonly kind: AuditEntryKind;
/** Hash of the previous entry's full payload. null on the genesis entry. */
readonly prevHash: string | null;
/**
* Hash algorithm tag identifying the canonicalization + hash
* function in use. Bumped if the algorithm or canonical form
* changes, so exports remain verifiable across versions.
*/
readonly hashAlgo: typeof HASH_ALGO;
/**
* Entry schema version — bumped if any `AuditEntry` field shape
* changes in a way that breaks back-compat. Pair with `hashAlgo`
* when migrating older exports. (F-5)
*/
readonly schemaVersion: typeof SCHEMA_VERSION;
/**
* Private sentinel — present (and equal to the in-module token) only
* on legitimate tombstones minted by `ledger.erase()`. Filtered out
* of all public read paths (`query`, `recent`, `toJSON`, etc.) so
* consumers never see or copy it. (N7)
*
* NOT serialized. NOT exported. Forging this from outside the module
* is impossible without the symbol reference; `verify()` rejects any
* `system.entry-erased` entry that lacks it.
*
* @internal
*/
readonly __internal?: LedgerInternalSentinel;
}
type AuditEntry = (AuditEntryBase & {
kind: "constraint.evaluate";
constraintId: string;
active: boolean;
/** Cached at ledger start from `system.inspect().constraints[].whenSpec`. Refreshed on `register()`/`assign()`/`unregister()`. May be undefined for function-form constraints (see `whenSource`). PII operands redacted unless `capturePII: true`. */
whenSpec?: FactPredicate<unknown>;
whenExplain?: readonly ClauseResult[];
/**
* For function-form constraints (no `whenSpec`), a tamper-evident
* identity for the function. We DO NOT capture the raw source —
* closures routinely reference secrets, API keys, or PII (e.g.
* `if (apiKey === "sk-live-xxx")`) and a preview would leak them
* into the audit log. Instead, we capture a djb2 hash of the
* stringified function (`hashObject(String(fn))`). Auditors can
* detect "the function changed between deploys" by comparing
* hashes across entries, without ever seeing the function body.
*
* Informational only — NOT replayable. (N5, M22)
*/
whenSource?: {
kind: "function";
sourceHash: string;
};
}) | (AuditEntryBase & {
kind: "resolver.write.rejected";
rejection: "rejection" | "summary";
resolverId: string;
requirementId: string;
reason: string;
fact?: string;
expected?: unknown;
actual?: unknown;
dropped?: number;
}) | (AuditEntryBase & {
kind: "fact.change";
key: string;
prior: unknown;
next: unknown;
}) | (AuditEntryBase & {
kind: "resolver.complete";
resolverId: string;
requirementId: string;
duration: number;
}) | (AuditEntryBase & {
kind: "resolver.error";
resolverId: string;
requirementId: string;
error: string;
}) | (AuditEntryBase & {
kind: "system.init" | "system.start" | "system.stop" | "system.destroy";
}) | (AuditEntryBase & {
kind: "system.snapshot";
snapshotId: number;
trigger: string;
}) | (AuditEntryBase & {
kind: "system.history.navigate";
from: number;
to: number;
}) | (AuditEntryBase & {
kind: "system.truncated";
droppedSeq: number;
droppedCount: number;
}) | (AuditEntryBase & {
kind: "system.entry-erased";
originalKind: AuditEntryKind;
erasedAt: number;
}) | (AuditEntryBase & {
kind: "system.subject-erased";
/**
* djb2 hash of the filter (via `hashObject(filter)`). PII-safe —
* the raw filter values never land in the ledger. Pair with
* `filterShape` to see which filter fields were used. (N2)
*/
filterHash: string;
/**
* Stripped-values shape of the filter — captures WHICH fields were
* present without recording their values. (N2)
*/
filterShape: {
factPath: boolean;
constraintId: boolean;
kind: AuditEntryKind | readonly AuditEntryKind[] | undefined;
changedBetween: "[range]" | undefined;
};
erased: number;
});
interface QueryFilter {
/** Exact-match fact path. */
factPath?: string;
/** Filter by constraint id. */
constraintId?: string;
/** Filter by entry kind. */
kind?: AuditEntryKind | readonly AuditEntryKind[];
/** Time range as `[startMs, endMs]`, ISO strings, or epoch numbers. */
changedBetween?: [string | number | Date, string | number | Date];
/** Maximum entries returned. Default 1000. */
limit?: number;
}
/**
* Verify result — chain valid OR a break with full context for tamper visualization.
*
* Erased entries (via `ledger.erase()`) appear as legitimate chain breaks —
* `verify()` reports them in `erasedSeqs` and continues the walk from the
* tombstone's own hash. Real tamper still surfaces as `valid: false`.
*
* Forged tombstones (a caller writes `kind: "system.entry-erased"`
* directly via `sink.write()` to mask tamper as erasure) are detected:
* legitimate tombstones carry an in-module sentinel that forgeries
* cannot mint, so `verify()` reports them as tamper. (N7)
*/
type VerifyResult = {
valid: true;
entryCount: number;
/**
* Seq numbers of entries legitimately broken by `erase()`
* tombstones. NOT timestamps — each entry pairs this seq with
* the per-entry `system.entry-erased.erasedAt` (ms epoch) for
* the timestamp. Empty unless the chain contains erasures.
* (N1 + M1; renamed from `erasedAt` in R3)
*/
erasedSeqs?: number[];
} | {
valid: false;
brokenAt: number;
expectedHash: string;
actualHash: string;
entry: AuditEntry;
/**
* Human-readable reason for the break — populated for cases
* where the cause is more specific than "hash mismatch" (e.g.
* tombstone forgery detected via missing sentinel).
*/
reason?: string;
};
interface AuditLedgerSink {
write(entry: AuditEntry): void;
query(filter: QueryFilter): readonly AuditEntry[];
recent(n: number): readonly AuditEntry[];
forFact(path: string, opts?: {
limit?: number;
}): readonly AuditEntry[];
forConstraint(id: string, opts?: {
limit?: number;
}): readonly AuditEntry[];
toJSON(): {
entries: readonly AuditEntry[];
capturedAt: number;
};
clear(): void;
destroy(): void;
/**
* Replace matching entries with marker entries IN PLACE (preserving seq +
* prevHash so the hash chain still verifies — the marker is a
* tombstone in chain terms; the chain break is what makes erasure
* visible to `verify()`). v1 implementation matches on the same
* `QueryFilter` shape used by `query()`. Returns the count of entries
* replaced.
*
* WARNING: erases only from this sink. Any external copies (toJSON
* exports, downstream pipelines) must be erased separately.
*/
erase?(filter: QueryFilter, markerEntryFactory: (e: AuditEntry) => AuditEntry): number;
/**
* Optional hook fired by the sink BEFORE shifting the oldest entry
* out of a bounded ring buffer. The ledger plugin uses this to emit
* a `system.truncated` marker so an auditor sees that the log was
* truncated and where. (M23)
*/
onTruncate?(handler: (droppedSeq: number, droppedCount: number) => void): void;
}
interface AuditLedgerOptions {
/** Sink to write entries to. Default: in-memory ring buffer (capacity 10k). */
sink?: AuditLedgerSink;
/**
* Whether to capture raw fact values (`prior`/`next` on fact.change,
* `actual` in whenExplain). Default `false` — PII-tagged facts are
* redacted by default. Set `true` to opt out of redaction.
*/
capturePII?: boolean;
/**
* Optional caller-supplied redactor. Runs AFTER the default
* pii-tag-based redaction. Useful for additional sanitization.
*/
redact?: (entry: AuditEntry) => AuditEntry;
}
interface AuditLedger {
/** The plugin to pass to `createSystem({ plugins: [...] })`. */
readonly plugin: Plugin<ModuleSchema>;
/** Query entries matching the filter. */
query(filter?: QueryFilter): readonly AuditEntry[];
/** Most recent N entries (chronological). */
recent(n: number): readonly AuditEntry[];
/** All entries that touch this fact path (exact match). */
forFact(path: string, opts?: {
limit?: number;
}): readonly AuditEntry[];
/** All entries for this constraint id. */
forConstraint(id: string, opts?: {
limit?: number;
}): readonly AuditEntry[];
/** Full ledger snapshot for export / serialization. */
toJSON(): {
entries: readonly AuditEntry[];
capturedAt: number;
};
/**
* Walk the hash chain genesis → tip. Returns `{ valid: true }` iff
* every entry's `prevHash` matches the (sync, djb2-based) hash of
* the previous entry. On break, returns the index of the first
* broken link plus the expected vs actual hashes — feed into a
* "TAMPERED" visualization.
*
* Erased entries (via `ledger.erase()`) appear as legitimate chain
* breaks — `verify()` reports them in `erasedSeqs` and continues
* the walk from the tombstone's actual hash. Real tamper still
* surfaces as `valid: false`. (N1 + M1)
*
* Forged tombstones — `kind: "system.entry-erased"` entries written
* directly via `sink.write()` to mask tamper — are detected as
* forgery. Legitimate tombstones carry an in-module sentinel that
* forgeries cannot mint. (N7)
*
* v1 ships sync djb2 only. `verify({ strong: true })` is reserved
* for v2 (SHA-256) and THROWS today — there is no silent fallback.
* Call `verify()` (no args) for tamper detection.
*/
verify(opts?: {
strong?: boolean;
}): VerifyResult;
/**
* Per-subject erasure (GDPR Art. 17 stub). Replaces matching entries
* in this sink with `system.entry-erased` tombstones (preserving
* seq + prevHash so verify() can resync), then appends a chained
* `system.subject-erased` marker entry that summarises the erasure.
*
* Returns `{ erased, markerEntry }` — `markerEntry` is the chained
* `system.subject-erased` summary (the N per-entry tombstones live
* in the sink, not on the return value). (M7)
*
* When `erased === 0` (filter matched nothing), `markerEntry` is
* `null` and no marker is emitted into the chain — avoids polluting
* the audit trail with empty "erased: 0" records. (MAJOR-3)
*
* WARNING: v1 erases only from THIS sink. External copies (toJSON
* exports, downstream pipelines, persisted backups) must be erased
* separately. (C8)
*/
erase(filter: QueryFilter): {
erased: number;
markerEntry: AuditEntry | null;
};
/** Empty the sink. */
clear(): void;
/** Unsubscribe + drop the sink. */
destroy(): void;
}
/**
* `memorySink()` — bounded ring-buffer implementation of
* `AuditLedgerSink`. Drops the oldest entry past `capacity`
* (default 10,000), exposes a truncation hook so the ledger plugin
* can emit a `system.truncated` marker before the shift, and
* supports in-place tombstone erasure for GDPR Art. 17.
*
* Pure storage layer — no hash chain awareness, no PII redaction.
* The plugin in `./index.ts` owns those concerns and routes them
* through this sink via `write()` / `erase()`.
*/
/**
* In-memory bounded ring-buffer sink. Drops oldest entries past
* `capacity` (default 10,000). Use this as the default sink for dev,
* tests, and StackBlitz demos.
*/
declare function memorySink(opts?: {
capacity?: number;
}): AuditLedgerSink;
/**
* createAuditLedger — append-only, queryable, hash-chained
* (djb2; SHA-256 reserved for v2) audit of every state change. For
* forensics and "show me why this user got that decision."
*
* Captures (per observation event):
*
* - `constraint.evaluate` → { whenSpec, whenExplain, active, whenSource? }
* - `resolver.write.rejected` (rejection + summary kinds)
* - `fact.change` → { key, prior, next }
* - `resolver.complete` → { resolverId, requirementId, duration }
* - `system.init` / `system.start` / `system.stop` / `system.destroy`
* - `system.snapshot` / `system.history.navigate` (lifecycle markers)
* - `system.truncated` (ring-buffer overflow marker)
* - `system.entry-erased` / `system.subject-erased` (GDPR Art.17 stub)
*
* PII redaction: by default, fact keys whose meta carries the `pii`
* tag (via `system.meta.byTag("pii")`) have their values replaced with
* `"[redacted]"` in `whenExplain.actual`, `fact.change.prior`,
* `fact.change.next`, and the cached `whenSpec` operands. Opt out with
* `capturePII: true`.
*
* Folder layout:
* types.ts — public type surface + version stamps
* hash.ts — djb2 dispatch + freeze helper + INTERNAL TOKEN
* sink.ts — memorySink() ring buffer
* predicate-redact.ts — PII-aware redactWhenSpec
* verify.ts — tombstone-aware chain walk
* index.ts (this) — createAuditLedger factory + plugin wiring
*/
/**
* Create an audit ledger that subscribes to the given system's
* observation stream. Returns a `Plugin` to install + a query/verify
* API for the ledger.
*
* @example
* ```ts
* import { createAuditLedger } from "@directive-run/core/plugins";
*
* const ledger = createAuditLedger();
* const system = createSystem({ module, plugins: [ledger.plugin] });
* system.start();
*
* // Six months later — auditor asks "what changed cart-total in March?"
* ledger.query({
* factPath: "cartTotal",
* changedBetween: ["2026-03-01", "2026-04-01"],
* });
*
* // Verify nobody tampered with the ledger
* const verdict = await ledger.verify();
* if (!verdict.valid) {
* console.error("Tamper at entry", verdict.brokenAt);
* }
* ```
*/
declare function createAuditLedger(opts?: AuditLedgerOptions): AuditLedger;
export { type AuditEntry as A, type QueryFilter as Q, type VerifyResult as V, type AuditEntryKind as a, type AuditLedger as b, type AuditLedgerOptions as c, type AuditLedgerSink as d, createAuditLedger as e, memorySink as m };
/**
* Create a stable JSON string with sorted keys.
* Handles circular references and deeply nested objects safely.
*
* @param value - The value to stringify
* @param maxDepth - Maximum nesting depth (default: 50)
* @returns A stable JSON string
*/
declare function stableStringify(value: unknown, maxDepth?: number): string;
/**
* Check for prototype pollution in an object, including nested objects.
* Returns true if the object is safe, false if dangerous keys are found.
*
* @param obj - The object to check
* @param maxDepth - Maximum nesting depth to check (default: 50)
* @returns True if safe, false if dangerous keys found
*/
declare function isPrototypeSafe(obj: unknown, maxDepth?: number): boolean;
/**
* Shallow equality comparison for objects.
* Used by React hooks to avoid unnecessary re-renders.
*
* @param a - First object
* @param b - Second object
* @returns True if objects are shallowly equal
*/
declare function shallowEqual<T extends Record<string, unknown>>(a: T, b: T): boolean;
/**
* Generate a simple hash string from an object.
* Uses djb2 algorithm on the stable stringified value.
*
* **Limitations:**
* - 32-bit hash output means collision probability increases with data set size
* (birthday paradox: ~50% collision chance at ~77,000 distinct values)
* - Suitable for: cache invalidation, change detection, deduplication of small sets
* - NOT suitable for: cryptographic use, security-sensitive operations, large-scale deduplication
*
* For security-sensitive use cases requiring stronger collision resistance,
* consider using a cryptographic hash like SHA-256.
*
* @param value - The value to hash
* @returns A hex hash string (8 characters, 32 bits)
*/
declare function hashObject(value: unknown): string;
/**
* Distributable snapshot type for type-safe helper functions.
*/
interface DistributableSnapshotLike<T = Record<string, unknown>> {
data: T;
createdAt: number;
expiresAt?: number;
version?: string;
metadata?: Record<string, unknown>;
}
/**
* Check if a distributable snapshot has expired.
* Returns false if the snapshot has no expiresAt field.
*
* @example
* ```typescript
* const snapshot = system.getDistributableSnapshot({ ttlSeconds: 3600 });
* // ... later ...
* if (isSnapshotExpired(snapshot)) {
* // Refresh the snapshot
* }
* ```
*
* @param snapshot - The snapshot to check
* @param now - Optional current timestamp (defaults to Date.now())
* @returns True if the snapshot has expired, false otherwise
*/
declare function isSnapshotExpired<T>(snapshot: DistributableSnapshotLike<T>, now?: number): boolean;
/**
* Validate a distributable snapshot and return its data.
* Throws if the snapshot is malformed or has expired.
*
* @example
* ```typescript
* const cached = JSON.parse(await redis.get(`entitlements:${userId}`));
* try {
* const data = validateSnapshot(cached);
* // Use data.canUseFeature, etc.
* } catch (e) {
* // Snapshot invalid or expired, refresh it
* }
* ```
*
* @example Using custom timestamp for testing
* ```typescript
* const snapshot = { data: { test: true }, createdAt: 1000, expiresAt: 2000 };
* validateSnapshot(snapshot, 1500); // Returns { test: true }
* validateSnapshot(snapshot, 2500); // Throws: Snapshot expired
* ```
*
* @param snapshot - The snapshot to validate
* @param now - Optional current timestamp (defaults to Date.now())
* @returns The snapshot data if valid
* @throws Error if the snapshot is malformed or has expired
*/
declare function validateSnapshot<T>(snapshot: DistributableSnapshotLike<T>, now?: number): T;
/**
* Diff result for a single changed value.
*/
interface SnapshotDiffEntry {
/** The key path that changed (e.g., "canUseApi" or "limits.apiCalls") */
path: string;
/** The value in the old snapshot */
oldValue: unknown;
/** The value in the new snapshot */
newValue: unknown;
/** Type of change: "added", "removed", or "changed" */
type: "added" | "removed" | "changed";
}
/**
* Result of diffing two snapshots.
*/
interface SnapshotDiff {
/** Whether the snapshots are identical */
identical: boolean;
/** List of changes between snapshots */
changes: SnapshotDiffEntry[];
/** Whether the version changed (if both have versions) */
versionChanged: boolean;
/** Old version (if available) */
oldVersion?: string;
/** New version (if available) */
newVersion?: string;
}
/**
* Compare two distributable snapshots and return the differences.
* Useful for debugging, audit logs, and webhook payloads.
*
* @example
* ```typescript
* const oldSnapshot = system.getDistributableSnapshot({ includeVersion: true });
* system.dispatch({ type: "upgradePlan", plan: "pro" });
* const newSnapshot = system.getDistributableSnapshot({ includeVersion: true });
*
* const diff = diffSnapshots(oldSnapshot, newSnapshot);
* if (!diff.identical) {
* console.log("Changes:", diff.changes);
* // [{ path: "canUseApi", oldValue: false, newValue: true, type: "changed" }]
* }
* ```
*
* @param oldSnapshot - The previous snapshot
* @param newSnapshot - The new snapshot
* @returns A diff result with all changes
*/
declare function diffSnapshots<T = Record<string, unknown>>(oldSnapshot: DistributableSnapshotLike<T>, newSnapshot: DistributableSnapshotLike<T>): SnapshotDiff;
/**
* A signed distributable snapshot.
* Contains the original snapshot plus a cryptographic signature.
*/
interface SignedSnapshot<T = Record<string, unknown>> extends DistributableSnapshotLike<T> {
/** HMAC-SHA256 signature in hex format */
signature: string;
/** Signing algorithm used */
algorithm: "hmac-sha256";
}
/**
* Check if a snapshot is signed.
*
* @param snapshot - The snapshot to check
* @returns True if the snapshot has a signature
*/
declare function isSignedSnapshot<T>(snapshot: DistributableSnapshotLike<T> | SignedSnapshot<T>): snapshot is SignedSnapshot<T>;
/**
* Sign a distributable snapshot using HMAC-SHA256.
* Creates a tamper-proof signature that can be verified later.
*
* **Security Notes:**
* - Use a cryptographically random secret of at least 32 bytes
* - Store the secret securely (environment variable, secrets manager)
* - Never expose the secret to clients
* - The signature covers all snapshot fields for integrity
*
* @example
* ```typescript
* const snapshot = system.getDistributableSnapshot({
* includeDerivations: ['canUseFeature', 'limits'],
* ttlSeconds: 3600,
* });
*
* // Sign the snapshot (server-side only)
* const signed = await signSnapshot(snapshot, process.env.SNAPSHOT_SECRET);
*
* // Store in JWT, Redis, or send to client
* const jwt = createJWT({ snapshot: signed });
*
* // Later, verify the signature
* const isValid = await verifySnapshotSignature(signed, process.env.SNAPSHOT_SECRET);
* if (!isValid) {
* throw new Error('Snapshot has been tampered with');
* }
* ```
*
* @param snapshot - The snapshot to sign
* @param secret - The HMAC secret (string or Uint8Array)
* @returns A signed snapshot with the signature attached
*/
declare function signSnapshot<T>(snapshot: DistributableSnapshotLike<T>, secret: string | Uint8Array): Promise<SignedSnapshot<T>>;
/**
* Verify the signature of a signed snapshot.
* Returns true if the signature is valid, false otherwise.
*
* **Important:** Always verify signatures before trusting snapshot data,
* especially if the snapshot was received from an untrusted source (client, cache).
*
* @example
* ```typescript
* // Receive signed snapshot from client or cache
* const snapshot = JSON.parse(cachedData);
*
* // Verify before using
* const isValid = await verifySnapshotSignature(snapshot, process.env.SNAPSHOT_SECRET);
* if (!isValid) {
* throw new Error('Invalid snapshot signature - possible tampering');
* }
*
* // Now safe to use snapshot.data
* if (snapshot.data.canUseFeature.api) {
* // Grant access
* }
* ```
*
* @param signedSnapshot - The signed snapshot to verify
* @param secret - The HMAC secret (must match the signing secret)
* @returns True if signature is valid, false otherwise
*/
declare function verifySnapshotSignature<T>(signedSnapshot: SignedSnapshot<T>, secret: string | Uint8Array): Promise<boolean>;
/**
* Safely stringify any value for display. Handles circular references,
* BigInt, throwing toJSON, and optional truncation.
*
* This is the canonical implementation – all packages should import this
* instead of maintaining local copies.
*/
declare function safeStringify(data: unknown, maxLen?: number): string;
export { type DistributableSnapshotLike as D, type SignedSnapshot as S, type SnapshotDiff as a, type SnapshotDiffEntry as b, isSnapshotExpired as c, diffSnapshots as d, signSnapshot as e, verifySnapshotSignature as f, isPrototypeSafe as g, hashObject as h, isSignedSnapshot as i, safeStringify as j, stableStringify as k, shallowEqual as s, validateSnapshot as v };
/**
* Create a stable JSON string with sorted keys.
* Handles circular references and deeply nested objects safely.
*
* @param value - The value to stringify
* @param maxDepth - Maximum nesting depth (default: 50)
* @returns A stable JSON string
*/
declare function stableStringify(value: unknown, maxDepth?: number): string;
/**
* Check for prototype pollution in an object, including nested objects.
* Returns true if the object is safe, false if dangerous keys are found.
*
* @param obj - The object to check
* @param maxDepth - Maximum nesting depth to check (default: 50)
* @returns True if safe, false if dangerous keys found
*/
declare function isPrototypeSafe(obj: unknown, maxDepth?: number): boolean;
/**
* Shallow equality comparison for objects.
* Used by React hooks to avoid unnecessary re-renders.
*
* @param a - First object
* @param b - Second object
* @returns True if objects are shallowly equal
*/
declare function shallowEqual<T extends Record<string, unknown>>(a: T, b: T): boolean;
/**
* Generate a simple hash string from an object.
* Uses djb2 algorithm on the stable stringified value.
*
* **Limitations:**
* - 32-bit hash output means collision probability increases with data set size
* (birthday paradox: ~50% collision chance at ~77,000 distinct values)
* - Suitable for: cache invalidation, change detection, deduplication of small sets
* - NOT suitable for: cryptographic use, security-sensitive operations, large-scale deduplication
*
* For security-sensitive use cases requiring stronger collision resistance,
* consider using a cryptographic hash like SHA-256.
*
* @param value - The value to hash
* @returns A hex hash string (8 characters, 32 bits)
*/
declare function hashObject(value: unknown): string;
/**
* Distributable snapshot type for type-safe helper functions.
*/
interface DistributableSnapshotLike<T = Record<string, unknown>> {
data: T;
createdAt: number;
expiresAt?: number;
version?: string;
metadata?: Record<string, unknown>;
}
/**
* Check if a distributable snapshot has expired.
* Returns false if the snapshot has no expiresAt field.
*
* @example
* ```typescript
* const snapshot = system.getDistributableSnapshot({ ttlSeconds: 3600 });
* // ... later ...
* if (isSnapshotExpired(snapshot)) {
* // Refresh the snapshot
* }
* ```
*
* @param snapshot - The snapshot to check
* @param now - Optional current timestamp (defaults to Date.now())
* @returns True if the snapshot has expired, false otherwise
*/
declare function isSnapshotExpired<T>(snapshot: DistributableSnapshotLike<T>, now?: number): boolean;
/**
* Validate a distributable snapshot and return its data.
* Throws if the snapshot is malformed or has expired.
*
* @example
* ```typescript
* const cached = JSON.parse(await redis.get(`entitlements:${userId}`));
* try {
* const data = validateSnapshot(cached);
* // Use data.canUseFeature, etc.
* } catch (e) {
* // Snapshot invalid or expired, refresh it
* }
* ```
*
* @example Using custom timestamp for testing
* ```typescript
* const snapshot = { data: { test: true }, createdAt: 1000, expiresAt: 2000 };
* validateSnapshot(snapshot, 1500); // Returns { test: true }
* validateSnapshot(snapshot, 2500); // Throws: Snapshot expired
* ```
*
* @param snapshot - The snapshot to validate
* @param now - Optional current timestamp (defaults to Date.now())
* @returns The snapshot data if valid
* @throws Error if the snapshot is malformed or has expired
*/
declare function validateSnapshot<T>(snapshot: DistributableSnapshotLike<T>, now?: number): T;
/**
* Diff result for a single changed value.
*/
interface SnapshotDiffEntry {
/** The key path that changed (e.g., "canUseApi" or "limits.apiCalls") */
path: string;
/** The value in the old snapshot */
oldValue: unknown;
/** The value in the new snapshot */
newValue: unknown;
/** Type of change: "added", "removed", or "changed" */
type: "added" | "removed" | "changed";
}
/**
* Result of diffing two snapshots.
*/
interface SnapshotDiff {
/** Whether the snapshots are identical */
identical: boolean;
/** List of changes between snapshots */
changes: SnapshotDiffEntry[];
/** Whether the version changed (if both have versions) */
versionChanged: boolean;
/** Old version (if available) */
oldVersion?: string;
/** New version (if available) */
newVersion?: string;
}
/**
* Compare two distributable snapshots and return the differences.
* Useful for debugging, audit logs, and webhook payloads.
*
* @example
* ```typescript
* const oldSnapshot = system.getDistributableSnapshot({ includeVersion: true });
* system.dispatch({ type: "upgradePlan", plan: "pro" });
* const newSnapshot = system.getDistributableSnapshot({ includeVersion: true });
*
* const diff = diffSnapshots(oldSnapshot, newSnapshot);
* if (!diff.identical) {
* console.log("Changes:", diff.changes);
* // [{ path: "canUseApi", oldValue: false, newValue: true, type: "changed" }]
* }
* ```
*
* @param oldSnapshot - The previous snapshot
* @param newSnapshot - The new snapshot
* @returns A diff result with all changes
*/
declare function diffSnapshots<T = Record<string, unknown>>(oldSnapshot: DistributableSnapshotLike<T>, newSnapshot: DistributableSnapshotLike<T>): SnapshotDiff;
/**
* A signed distributable snapshot.
* Contains the original snapshot plus a cryptographic signature.
*/
interface SignedSnapshot<T = Record<string, unknown>> extends DistributableSnapshotLike<T> {
/** HMAC-SHA256 signature in hex format */
signature: string;
/** Signing algorithm used */
algorithm: "hmac-sha256";
}
/**
* Check if a snapshot is signed.
*
* @param snapshot - The snapshot to check
* @returns True if the snapshot has a signature
*/
declare function isSignedSnapshot<T>(snapshot: DistributableSnapshotLike<T> | SignedSnapshot<T>): snapshot is SignedSnapshot<T>;
/**
* Sign a distributable snapshot using HMAC-SHA256.
* Creates a tamper-proof signature that can be verified later.
*
* **Security Notes:**
* - Use a cryptographically random secret of at least 32 bytes
* - Store the secret securely (environment variable, secrets manager)
* - Never expose the secret to clients
* - The signature covers all snapshot fields for integrity
*
* @example
* ```typescript
* const snapshot = system.getDistributableSnapshot({
* includeDerivations: ['canUseFeature', 'limits'],
* ttlSeconds: 3600,
* });
*
* // Sign the snapshot (server-side only)
* const signed = await signSnapshot(snapshot, process.env.SNAPSHOT_SECRET);
*
* // Store in JWT, Redis, or send to client
* const jwt = createJWT({ snapshot: signed });
*
* // Later, verify the signature
* const isValid = await verifySnapshotSignature(signed, process.env.SNAPSHOT_SECRET);
* if (!isValid) {
* throw new Error('Snapshot has been tampered with');
* }
* ```
*
* @param snapshot - The snapshot to sign
* @param secret - The HMAC secret (string or Uint8Array)
* @returns A signed snapshot with the signature attached
*/
declare function signSnapshot<T>(snapshot: DistributableSnapshotLike<T>, secret: string | Uint8Array): Promise<SignedSnapshot<T>>;
/**
* Verify the signature of a signed snapshot.
* Returns true if the signature is valid, false otherwise.
*
* **Important:** Always verify signatures before trusting snapshot data,
* especially if the snapshot was received from an untrusted source (client, cache).
*
* @example
* ```typescript
* // Receive signed snapshot from client or cache
* const snapshot = JSON.parse(cachedData);
*
* // Verify before using
* const isValid = await verifySnapshotSignature(snapshot, process.env.SNAPSHOT_SECRET);
* if (!isValid) {
* throw new Error('Invalid snapshot signature - possible tampering');
* }
*
* // Now safe to use snapshot.data
* if (snapshot.data.canUseFeature.api) {
* // Grant access
* }
* ```
*
* @param signedSnapshot - The signed snapshot to verify
* @param secret - The HMAC secret (must match the signing secret)
* @returns True if signature is valid, false otherwise
*/
declare function verifySnapshotSignature<T>(signedSnapshot: SignedSnapshot<T>, secret: string | Uint8Array): Promise<boolean>;
/**
* Safely stringify any value for display. Handles circular references,
* BigInt, throwing toJSON, and optional truncation.
*
* This is the canonical implementation – all packages should import this
* instead of maintaining local copies.
*/
declare function safeStringify(data: unknown, maxLen?: number): string;
export { type DistributableSnapshotLike as D, type SignedSnapshot as S, type SnapshotDiff as a, type SnapshotDiffEntry as b, isSnapshotExpired as c, diffSnapshots as d, signSnapshot as e, verifySnapshotSignature as f, isPrototypeSafe as g, hashObject as h, isSignedSnapshot as i, safeStringify as j, stableStringify as k, shallowEqual as s, validateSnapshot as v };
+1
-1
import { q as Requirement, P as Plugin, a as Facts, a8 as Schema, H as HistoryAPI, ac as SystemInspection, I as HistoryState } from './plugins-BIzXaYbg.cjs';
export { s as shallowEqual } from './utils-Mg55IerF.cjs';
export { s as shallowEqual } from './utils-BZBBwS5A.cjs';

@@ -4,0 +4,0 @@ /**

import { q as Requirement, P as Plugin, a as Facts, a8 as Schema, H as HistoryAPI, ac as SystemInspection, I as HistoryState } from './plugins-BIzXaYbg.js';
export { s as shallowEqual } from './utils-Mg55IerF.js';
export { s as shallowEqual } from './utils-BZBBwS5A.js';

@@ -4,0 +4,0 @@ /**

@@ -1,5 +0,5 @@

'use strict';var chunkIXRS4LM4_cjs=require('./chunk-IXRS4LM4.cjs'),chunkNPX5EKPP_cjs=require('./chunk-NPX5EKPP.cjs'),chunkENZEHIL7_cjs=require('./chunk-ENZEHIL7.cjs'),chunkT4TRJEJN_cjs=require('./chunk-T4TRJEJN.cjs'),chunkX7G7UBXU_cjs=require('./chunk-X7G7UBXU.cjs'),chunk4MNQDXH7_cjs=require('./chunk-4MNQDXH7.cjs');var C=1e6;function Me(e,t){try{chunkT4TRJEJN_cjs.l(e);}catch(r){let i=r instanceof Error?r.message:String(r);throw new Error(`[Directive] replayUnder: the ${t} predicate is invalid \u2014 ${i}`)}if(!chunkT4TRJEJN_cjs.h(e)){let r=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 ${r})`)}let n;if(chunkT4TRJEJN_cjs.i(e,{operator(r,i){n===void 0&&i.startsWith("$")&&!chunkT4TRJEJN_cjs.a.has(i)&&(n=i);},strayOperatorKey(r){n===void 0&&!chunkT4TRJEJN_cjs.a.has(r)&&!chunkT4TRJEJN_cjs.b.has(r)&&(n=r);}}),n!==void 0)throw new Error(`[Directive] replayUnder: the ${t} predicate uses an unknown operator "${n}" \u2014 known operators: ${[...chunkT4TRJEJN_cjs.a].join(", ")}`)}function Ae(e){if(e&&typeof e=="object"&&!Array.isArray(e)&&Array.isArray(e.snapshots))return De(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>C)throw new Error(`[Directive] toReplayFrames: history has ${t.length} frames, exceeds the MAX_REPLAY_FRAMES limit (${C}) \u2014 split or down-sample the history`);return t.map((n,r)=>{if(n&&typeof n=="object"&&"facts"in n){let i=n,s={id:i.id??`#${r}`,facts:i.facts??{}};return typeof i.timestamp=="number"&&(s.timestamp=i.timestamp),s}return {id:`#${r}`,facts:n??{}}})}function De(e){let t=typeof e=="string"?JSON.parse(e):e;if(Array.isArray(t))return se(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 n=t;if(n.version!==void 0&&n.version!==1)throw new Error(`[Directive] framesFromHistory: unsupported history export version ${JSON.stringify(n.version)} \u2014 expected 1`);if(!Array.isArray(n.snapshots))throw new Error("[Directive] framesFromHistory: expected a history export object with a `snapshots` array (from system.history.export())");return se(n.snapshots)}function se(e){if(!Array.isArray(e))throw new Error("[Directive] framesFromSnapshots: expected an array of fact-state snapshots");if(e.length>C)throw new Error(`[Directive] framesFromSnapshots: history has ${e.length} snapshots, exceeds the MAX_REPLAY_FRAMES limit (${C}) \u2014 split or down-sample the history`);for(let t=0;t<e.length;t++){let n=e[t];if(!n||typeof n!="object"||!("facts"in n))throw new Error(`[Directive] framesFromSnapshots: snapshot at index ${t} is not a { facts, ... } object`)}return Ae(e)}function H(e){let{frames:t,original:n,proposed:r,entityKey:i}=e,s=e.maxSamples??20,o=s>0?s:0;if(t.length>C)throw new Error(`[Directive] replayUnder: history has ${t.length} frames, exceeds the MAX_REPLAY_FRAMES limit (${C}) \u2014 split or down-sample the history`);Me(n,"original"),Me(r,"proposed");let u=0,a=0,c=0,l=0,d=0,g=[],y=[],$=i?new Set:void 0,m=i?new Set:void 0,M;for(let F of t){let T=F.facts,v=chunkT4TRJEJN_cjs.o(n,T,M),A=chunkT4TRJEJN_cjs.o(r,T,M);v&&(u++,$?.add(T[i])),A&&(a++,m?.add(T[i])),v===A?d++:!v&&A?(c++,g.length<o&&g.push(Re(F,n,r,M))):(l++,y.length<o&&y.push(Re(F,n,r,M))),M=T;}let E={framesEvaluated:t.length,original:{matched:u},proposed:{matched:a},delta:a-u,newMatchCount:c,lostMatchCount:l,unchanged:d,newMatches:g,lostMatches:y};return $&&m&&(E.original.matchedEntities=$.size,E.proposed.matchedEntities=m.size),E}function Re(e,t,n,r){let i=e.facts,s={frameId:e.id,facts:i,originalExplain:chunkT4TRJEJN_cjs.p(t,i,r),proposedExplain:chunkT4TRJEJN_cjs.p(n,i,r)};return e.timestamp!==void 0&&(s.timestamp=e.timestamp),s}var ae=1e4,Ce=5e7;function It(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)&&Object.keys(e).length===1&&typeof e.$hole=="string"}function ue(e,t,n=new Set,r=0){if(r>chunkT4TRJEJN_cjs.g)throw new Error(`[Directive] sweepUnder: template exceeds MAX_PREDICATE_DEPTH (${chunkT4TRJEJN_cjs.g}) \u2014 flatten the template or split the sweep`);if(It(e)){let i=e.$hole;if(!(i in t))throw new Error(`[Directive] sweepUnder: template references hole "${i}" but sweep has no values for it`);return t[i]}if(e===null||typeof e!="object")return e;if(n.has(e))throw new Error("[Directive] sweepUnder: template contains a cycle \u2014 predicate templates must be a tree");n.add(e);try{if(Array.isArray(e))return e.map(s=>ue(s,t,n,r+1));let i={};for(let[s,o]of Object.entries(e))i[s]=ue(o,t,n,r+1);return i}finally{n.delete(e);}}function*Ee(e,t){if(e.length===0){yield {};return}let n=e[0],r=e.slice(1),i=t[n]??[];for(let s of i)for(let o of Ee(r,t))yield {[n]:s,...o};}function Lt(e){let t=1;for(let n of Object.values(e))t*=n.length;return t}function qt(e){let{frames:t,original:n,template:r,sweep:i,objective:s=T=>T.proposed.matched,entityKey:o,maxSamples:u=0}=e,a=Object.keys(i);if(a.length===0)throw new Error("[Directive] sweepUnder: `sweep` must contain at least one hole name");let c=Lt(i);if(c>ae)throw new Error(`[Directive] sweepUnder: grid has ${c} points, exceeds the MAX_SWEEP_POINTS limit (${ae}) \u2014 narrow the sweep ranges or split the run`);if(c===0)throw new Error("[Directive] sweepUnder: at least one hole has zero candidate values");let l=c*t.length;if(l>Ce)throw new Error(`[Directive] sweepUnder: ${c} points \xD7 ${t.length} frames = ${l} per-frame evaluations, exceeds the MAX_SWEEP_EVALUATIONS limit (${Ce}) \u2014 narrow the sweep, down-sample the history, or split the run`);let d=false,g=T=>{let v;try{v=s(T);}catch(A){return d||(d=true,console.warn(`[Directive] sweepUnder: objective threw \u2014 point will not rank (${A.message})`)),Number.NEGATIVE_INFINITY}return typeof v!="number"||!Number.isFinite(v)?(d||(d=true,console.warn(`[Directive] sweepUnder: objective returned a non-finite number (${String(v)}) \u2014 point will not rank`)),Number.NEGATIVE_INFINITY):v},y=H({frames:t,original:n,proposed:n,entityKey:o,maxSamples:u}),$={values:{},report:y,score:g(y)},m=[],M=0,E=Number.NEGATIVE_INFINITY;for(let T of Ee(a,i)){let v=ue(r,T),A=H({frames:t,original:n,proposed:v,entityKey:o,maxSamples:u}),te=g(A);te>E&&(E=te,M=m.length),m.push({values:T,report:A,score:te});}let F=m[M];return {points:m,bestIndex:M,best:F,baseline:$}}function ce(e){let t=e&&typeof e=="object"&&!Array.isArray(e)&&"constraints"in e?e.constraints:e;if(Array.isArray(t)){let n={};for(let r of t){if(!r||typeof r!="object"||!("id"in r))throw new Error("[Directive] diffRules: array entries must be `{ id, whenSpec }` objects");let i=r;if(typeof i.id!="string")throw new Error("[Directive] diffRules: constraint `id` must be a string");n[i.id]=i.whenSpec;}return n}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 Bt=new Set(["$eq","$ne","$in","$nin","$exists","$gt","$gte","$lt","$lte","$between","$matches","$startsWith","$endsWith","$contains","$changed"]),Wt=new Set(["$all","$any","$not"]);function xe(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Ut(e){if(!xe(e))return false;let t=Object.keys(e);if(t.length===0)return false;let n=false;for(let r of t){if(!r.startsWith("$"))return false;Bt.has(r)&&(n=true);}return n}function S(e,t="",n=[]){if(e===null||typeof e!="object")return n;if(Array.isArray(e)){for(let r of e)if(r&&typeof r=="object"&&"fact"in r&&"op"in r){let i=r;n.push({path:t?`${t}.${String(i.fact)}`:String(i.fact),op:String(i.op),value:i.value});}return n}if("$all"in e&&Array.isArray(e.$all))return e.$all.forEach((i,s)=>{S(i,`${t}$all[${s}]`,n);}),n;if("$any"in e&&Array.isArray(e.$any))return e.$any.forEach((i,s)=>{S(i,`${t}$any[${s}]`,n);}),n;if("$not"in e)return S(e.$not,`${t}$not`,n),n;for(let[r,i]of Object.entries(e)){let s=t?`${t}.${r}`:r;if(Ut(i))for(let[o,u]of Object.entries(i))n.push({path:s,op:o,value:u});else xe(i)&&!Wt.has(r)?S(i,s,n):n.push({path:s,op:"$eq",value:i});}return n}function D(e){return typeof e=="number"&&Number.isFinite(e)}function Kt(e,t,n){switch(e){case "$gte":case "$gt":if(D(t)&&D(n)){if(n<t)return "relaxed";if(n>t)return "tightened"}return null;case "$lte":case "$lt":if(D(t)&&D(n)){if(n>t)return "relaxed";if(n<t)return "tightened"}return null;case "$between":{if(Array.isArray(t)&&Array.isArray(n)&&t.length===2&&n.length===2&&D(t[0])&&D(t[1])&&D(n[0])&&D(n[1])){let r=t[1]-t[0],i=n[1]-n[0];if(i>r)return "relaxed";if(i<r)return "tightened"}return null}case "$in":case "$nin":{if(Array.isArray(t)&&Array.isArray(n))if(e==="$in"){if(n.length>t.length)return "relaxed";if(n.length<t.length)return "tightened"}else {if(n.length>t.length)return "tightened";if(n.length<t.length)return "relaxed"}return null}case "$contains":{if(Array.isArray(t)&&Array.isArray(n)){if(n.length>t.length)return "relaxed";if(n.length<t.length)return "tightened"}return null}default:return null}}function zt(e){let t=ce(e.before),n=ce(e.after),i=[...new Set([...Object.keys(t),...Object.keys(n)])].sort(),s=[],o={added:0,removed:0,changed:0,unchanged:0,totalClauseChanges:0};for(let u of i){let a=t[u],c=n[u],l=u in t,d=u in n;if(l&&!d){let y=S(a),$=y.length===0?[{path:"(function-form predicate)",kind:"removed"}]:y.map(m=>({path:m.path,kind:"removed",before:{op:m.op,value:m.value}}));le($),s.push({id:u,status:"removed",changes:$}),o.removed++,o.totalClauseChanges+=$.length;continue}if(!l&&d){let y=S(c),$=y.length===0?[{path:"(function-form predicate)",kind:"added"}]:y.map(m=>({path:m.path,kind:"added",after:{op:m.op,value:m.value}}));le($),s.push({id:u,status:"added",changes:$}),o.added++,o.totalClauseChanges+=$.length;continue}let g=Oe(a,c);g.length===0?(s.push({id:u,status:"unchanged",changes:[]}),o.unchanged++):(s.push({id:u,status:"changed",changes:g}),o.changed++,o.totalClauseChanges+=g.length);}return {constraints:s,summary:o}}function Oe(e,t){if(e!==void 0&&t!==void 0&&(e===null||t===null||typeof e!="object"||typeof t!="object"))return chunk4MNQDXH7_cjs.e(e)===chunk4MNQDXH7_cjs.e(t)?[]:[{path:"",kind:"changed",before:{op:"$eq",value:e},after:{op:"$eq",value:t}}];let n=e===void 0?[]:S(e),r=t===void 0?[]:S(t),i=c=>`${c.path}::${c.op}`,s=new Map(n.map(c=>[i(c),c])),o=new Map(r.map(c=>[i(c),c])),u=new Set([...s.keys(),...o.keys()]),a=[];for(let c of u){let l=s.get(c),d=o.get(c);if(l&&!d){a.push({path:l.path,kind:"removed",before:{op:l.op,value:l.value}});continue}if(!l&&d){a.push({path:d.path,kind:"added",after:{op:d.op,value:d.value}});continue}if(l&&d){if(chunk4MNQDXH7_cjs.e(l.value)===chunk4MNQDXH7_cjs.e(d.value))continue;let g=Kt(l.op,l.value,d.value);a.push({path:l.path,kind:g??"changed",before:{op:l.op,value:l.value},after:{op:d.op,value:d.value}});}}return le(a),a}function le(e){e.sort((t,n)=>{let r=t.path.localeCompare(n.path);if(r!==0)return r;let i=t.before?.op??t.after?.op??"",s=n.before?.op??n.after?.op??"";return i.localeCompare(s)});}function Ht(e){return chunk4MNQDXH7_cjs.h(e)}function J(e){return e===null?"null":e===void 0?"undefined":e instanceof Date?e.toISOString():typeof e=="string"||typeof e=="object"?JSON.stringify(e):String(e)}function Jt(e){let t=e.path,n=J(e.expected),r=J(e.actual);switch(e.op){case "$eq":return `set ${t} to ${n} (currently ${r})`;case "$ne":return `change ${t} to anything other than ${n} (currently ${r})`;case "$gt":return `set ${t} above ${n} (currently ${r})`;case "$gte":return `set ${t} to at least ${n} (currently ${r})`;case "$lt":return `set ${t} below ${n} (currently ${r})`;case "$lte":return `set ${t} to at most ${n} (currently ${r})`;case "$in":return `set ${t} to one of ${n} (currently ${r})`;case "$nin":return `set ${t} to something other than ${n} (currently ${r})`;case "$exists":return e.expected===true?`set ${t} to a non-null value (currently null/missing)`:`unset ${t} (currently ${r})`;case "$between":return Array.isArray(e.expected)&&e.expected.length===2?`set ${t} between ${J(e.expected[0])} and ${J(e.expected[1])} (currently ${r})`:`set ${t} within range ${n} (currently ${r})`;case "$startsWith":return `set ${t} to start with ${n} (currently ${r})`;case "$endsWith":return `set ${t} to end with ${n} (currently ${r})`;case "$contains":return `set ${t} to contain ${n} (currently ${r})`;case "$matches":return `set ${t} to match the pattern ${n} (currently ${r})`;case "$changed":return `the previous-vs-current change of ${t} is required to differ (currently they match: ${r})`;case "$all":case "$any":case "$not":return `the ${e.op} group at "${t}" did not pass \u2014 see its child clauses`;default:return `clause at ${t} (${e.op}) failed: expected ${n}, got ${r}`}}function je(e,t){for(let n of e)if(!n.pass){if((n.op==="$all"||n.op==="$any"||n.op==="$not")&&n.children){je(n.children,t);continue}t.push({path:n.path,op:n.op,expected:n.expected,actual:n.actual,suggestion:Jt(n)});}}function Qt(e,t,n){let r=chunkT4TRJEJN_cjs.p(e,t,n),i=r.every(o=>o.pass),s=[];if(i||je(r,s),!i&&n===void 0){let o=[];chunkT4TRJEJN_cjs.i(e,{operator(u,a){a==="$changed"&&o.push(u);}});for(let u of o)s.push({path:u,op:"$changed",expected:true,actual:void 0,suggestion:`$changed clause at "${u}" cannot be evaluated without a \`prev\` snapshot \u2014 pass predict(predicate, facts, prev).`});}return {wouldFire:i,whenExplain:r,missingChanges:s}}var Pe=new Set(["$eq","$ne","$gt","$gte","$lt","$lte","$in","$nin"]);function Q(e,t){if(e===t)return 0;if(typeof e=="number"&&typeof t=="number"||typeof e=="bigint"&&typeof t=="bigint")return e<t?-1:e>t?1:0;if(e instanceof Date&&t instanceof Date){let n=e.getTime(),r=t.getTime();return n<r?-1:n>r?1:0}return typeof e=="string"&&typeof t=="string"?e<t?-1:e>t?1:0:Number.NaN}function _(e,t){if(e===t)return true;if(typeof e!=typeof t||e===null||t===null||typeof e!="object"||Array.isArray(e)!==Array.isArray(t))return false;if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return false;for(let i=0;i<e.length;i++)if(!_(e[i],t[i]))return false;return true}let n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return false;for(let i of n)if(!_(e[i],t[i]))return false;return true}function Xt(e,t){if(!Pe.has(e.op)||!Pe.has(t.op))return {type:"overlap",reason:`Both rules touch "${e.path}".`};if(e.op==="$eq"&&t.op==="$eq")return _(e.value,t.value)?{type:"subset",reason:`Both rules require ${e.path} = ${JSON.stringify(e.value)} \u2014 candidate is redundant.`}:{type:"direct",reason:`Candidate requires ${e.path} = ${JSON.stringify(e.value)} but an existing rule requires ${e.path} = ${JSON.stringify(t.value)} \u2014 they cannot both fire.`};if(e.op==="$eq"&&t.op==="$ne")return _(e.value,t.value)?{type:"direct",reason:`Candidate requires ${e.path} = ${JSON.stringify(e.value)} but an existing rule excludes that value.`}:null;if(e.op==="$ne"&&t.op==="$eq")return _(e.value,t.value)?{type:"direct",reason:`Candidate excludes ${e.path} = ${JSON.stringify(e.value)} but an existing rule requires that exact value.`}:null;if(e.op==="$in"&&t.op==="$in"){let o=new Set(Array.isArray(e.value)?e.value:[]),u=new Set(Array.isArray(t.value)?t.value:[]),a=[...o].filter(c=>u.has(c));return a.length===0?{type:"direct",reason:`Candidate $in set for ${e.path} (${JSON.stringify([...o])}) and existing $in set (${JSON.stringify([...u])}) have no values in common \u2014 the candidate can never fire while the existing rule holds.`}:a.length===o.size&&a.length<u.size?{type:"subset",reason:`Candidate $in set for ${e.path} is a strict subset of the existing rule's $in set.`}:null}let n=e.op==="$gt"||e.op==="$gte"?e.value:void 0,r=e.op==="$lt"||e.op==="$lte"?e.value:void 0,i=t.op==="$gt"||t.op==="$gte"?t.value:void 0,s=t.op==="$lt"||t.op==="$lte"?t.value:void 0;if(n!==void 0&&s!==void 0){let o=Q(n,s);if(!Number.isNaN(o)&&(o>0||o===0&&(e.op==="$gt"||t.op==="$lt")))return {type:"direct",reason:`Candidate requires ${e.path} ${e.op==="$gt"?">":"\u2265"} ${JSON.stringify(n)} but an existing rule caps it at ${t.op==="$lt"?"<":"\u2264"} ${JSON.stringify(s)}.`}}if(i!==void 0&&r!==void 0){let o=Q(i,r);if(!Number.isNaN(o)&&(o>0||o===0&&(t.op==="$gt"||e.op==="$lt")))return {type:"direct",reason:`Candidate caps ${e.path} at ${e.op==="$lt"?"<":"\u2264"} ${JSON.stringify(r)} but an existing rule requires it ${t.op==="$gt"?">":"\u2265"} ${JSON.stringify(i)}.`}}if(n!==void 0&&i!==void 0){let o=Q(n,i);if(!Number.isNaN(o)&&o>0)return {type:"subset",reason:`Candidate's lower bound on ${e.path} (${JSON.stringify(n)}) is stricter than the existing rule's lower bound (${JSON.stringify(i)}) \u2014 candidate is a subset.`}}if(r!==void 0&&s!==void 0){let o=Q(r,s);if(!Number.isNaN(o)&&o<0)return {type:"subset",reason:`Candidate's upper bound on ${e.path} (${JSON.stringify(r)}) is stricter than the existing rule's upper bound (${JSON.stringify(s)}) \u2014 candidate is a subset.`}}return {type:"overlap",reason:`Both rules constrain "${e.path}".`}}function Fe(e){return typeof e=="object"&&e!==null&&typeof e.id=="string"}var Zt={checkAgainst(e,t){let n=Array.isArray(t)?t:"constraints"in t&&Array.isArray(t.constraints)?t.constraints:[],r=S(e);if(r.length===0)return {contradictions:[],warnings:[]};let i=new Map;for(let u of r){let a=i.get(u.path)??[];a.push(u),i.set(u.path,a);}let s=[],o=[];for(let u of n){if(!Fe(u)||u.whenSpec===void 0)continue;let a=S(u.whenSpec);for(let c of a){let l=i.get(c.path);if(l)for(let d of l){let g=Xt(d,c);if(!g)continue;let y={constraintId:u.id,type:g.type,reason:g.reason,candidatePath:d.path,candidate:{op:d.op,value:d.value},existing:{op:c.op,value:c.value}};g.type==="overlap"||g.type==="subset"?o.push(y):s.push(y);}}}return {contradictions:s,warnings:o}},checkOwns(e,t){let n=Array.isArray(t)?t:"constraints"in t&&Array.isArray(t.constraints)?t.constraints:[],r=S(e);if(r.length===0)return {warnings:[]};let i=new Set(r.map(o=>o.path)),s=[];for(let o of n){if(!Fe(o))continue;let u=Array.isArray(o.owns)?o.owns:[],a=Array.isArray(o.bind)?o.bind:[];for(let c of u)i.has(c)&&s.push({constraintId:o.id,candidatePath:c,source:"owns",reason:`Constraint "${o.id}" already owns "${c}" \u2014 candidate would race or shadow its writes.`,severity:"warning"});for(let c of a)i.has(c)&&s.push({constraintId:o.id,candidatePath:c,source:"bind",reason:`Constraint "${o.id}" binds "${c}" \u2014 candidate would write to a bound field.`,severity:"warning"});}return {warnings:s}}};var I=new Map,Yt=50;function Gt(e){let t=I.get(e);if(!t){try{t=new Intl.NumberFormat(e);}catch{t=new Intl.NumberFormat("en-US");}if(I.size>=Yt){let n=I.keys().next().value;n!==void 0&&I.delete(n);}I.set(e,t);}return t}function Vt(e,t={}){let n=t.style??"natural",r=t.parenthesize??true,i=t.locale??"en-US",s=t.factName??(a=>a);if(e===null||typeof e!="object")return "<invalid predicate>";let o={style:n,parenthesize:r,locale:i,factName:s,seen:new WeakSet,cycle:false},u=X(e,o,0);return o.cycle?"<invalid predicate: cycle>":u}var Ie=" AND ",en=" OR ",tn="NOT",Le=" \u2227 ",nn=" \u2228 ",rn="\xAC";function q(e){return typeof e!="object"||e===null||Array.isArray(e)?false:!(e instanceof Date)&&!(e instanceof RegExp)}function on(e){if(!q(e))return false;let t=Object.keys(e);if(t.length===0)return false;for(let n of t)if(!n.startsWith("$"))return false;return true}function X(e,t,n){if(n>chunkT4TRJEJN_cjs.g)return chunk4MNQDXH7_cjs.a&&console.warn(`[Directive] describePredicate: depth limit (${chunkT4TRJEJN_cjs.g}) exceeded \u2014 bailing.`),t.style==="formal"?"\u22A5":"always true";if(Array.isArray(e))return sn(e,t);if(!q(e))return f(e,t);if(t.seen.has(e))return t.cycle=true,"<invalid predicate: cycle>";t.seen.add(e);let r=e,i=Object.keys(r);for(let o of ["$all","$any","$not"])if(o in r)return an(o,r[o],t,n);let s=[];for(let o of i)o.startsWith("$")||s.push(qe(o,r[o],t,n));return Z(s,t)}function sn(e,t,n){let r=[];for(let i of e){if(!q(i))continue;let s=i;typeof s.fact!="string"||typeof s.op!="string"||r.push(L(s.fact,s.op,s.value,t));}return r.length===0?t.style==="formal"?"\u22A4":"always true":Z(r,t)}function an(e,t,n,r){if(e==="$not"){if(q(t)&&Object.keys(t).length===0)return n.style==="formal"?"\u22A5":"never";let o=X(t,n,r+1);return o==="always true"?"never":o==="\u22A4"?"\u22A5":`${n.style==="formal"?rn:`${tn} `}(${o})`}if(!Array.isArray(t))return n.style==="formal"?"\u22A5":"<invalid predicate>";if(t.length===0)return e==="$all"?n.style==="formal"?"\u22A4":"always true":n.style==="formal"?"\u22A5":"never";let i=[];for(let o of t){let u=X(o,n,r+1);i.push(u);}if(i.length===1)return i[0];let s=n.parenthesize?i.map(o=>`(${o})`):i;return e==="$all"?s.join(n.style==="formal"?Le:Ie):s.join(n.style==="formal"?nn:en)}function qe(e,t,n,r){if(on(t)){let i=t,s=Object.keys(i);if(s.length===1)return L(e,s[0],i[s[0]],n);let o=s.map(u=>L(e,u,i[u],n));return Z(o,n)}if(q(t)){let i=t;if("$all"in i||"$any"in i||"$not"in i)return X(t,n,r+1);let o=[];for(let u of Object.keys(i))u.startsWith("$")||o.push(qe(`${e}.${u}`,i[u],n,r+1));return o.length===0?L(e,"$eq",t,n):Z(o,n)}return L(e,"$eq",t,n)}function L(e,t,n,r){let i=r.style==="formal"?e:r.factName(e);return r.style==="formal"?cn(i,t,n,r):un(i,t,n,r)}function un(e,t,n,r){switch(t){case "$eq":return n===null?`${e} is null`:`${e} is ${f(n,r)}`;case "$ne":return n===null?`${e} is not null`:`${e} is not ${f(n,r)}`;case "$gt":return `${e} is more than ${f(n,r)}`;case "$gte":return `${e} is at least ${f(n,r)}`;case "$lt":return `${e} is less than ${f(n,r)}`;case "$lte":return `${e} is at most ${f(n,r)}`;case "$in":return `${e} is one of ${Ne(n,r)}`;case "$nin":return `${e} is not one of ${Ne(n,r)}`;case "$exists":return n===true?`${e} is set`:`${e} is not set`;case "$between":return Array.isArray(n)&&n.length===2?`${e} is between ${f(n[0],r)} and ${f(n[1],r)}`:`${e} is between ${f(n,r)}`;case "$startsWith":return `${e} starts with ${O(n,r,true)}`;case "$endsWith":return `${e} ends with ${O(n,r,true)}`;case "$contains":return `${e} contains ${O(n,r,true)}`;case "$matches":return n instanceof RegExp?`${e} matches ${n.toString()}`:`${e} matches ${f(n,r)}`;case "$changed":return `${e} changed`;default:return chunk4MNQDXH7_cjs.a&&!chunkT4TRJEJN_cjs.a.has(t)&&console.warn(`[Directive] describePredicate: unknown operator "${t}" \u2014 falling through to generic rendering.`),`${e} ${t} ${f(n,r)}`}}function cn(e,t,n,r){switch(t){case "$eq":return `${e} = ${f(n,r)}`;case "$ne":return `${e} \u2260 ${f(n,r)}`;case "$gt":return `${e} > ${f(n,r)}`;case "$gte":return `${e} \u2265 ${f(n,r)}`;case "$lt":return `${e} < ${f(n,r)}`;case "$lte":return `${e} \u2264 ${f(n,r)}`;case "$in":return `${e} \u2208 {${_e(n,r)}}`;case "$nin":return `${e} \u2209 {${_e(n,r)}}`;case "$exists":return n===true?`\u2203 ${e}`:`\u2204 ${e}`;case "$between":return Array.isArray(n)&&n.length===2?`${f(n[0],r)} \u2264 ${e} \u2264 ${f(n[1],r)}`:`${e} \u2208 [${f(n,r)}]`;case "$startsWith":return `${e} ^= ${O(n,r,true)}`;case "$endsWith":return `${e} $= ${O(n,r,true)}`;case "$contains":return `${e} \u2287 ${O(n,r,true)}`;case "$matches":return n instanceof RegExp?`${e} ~ ${n.toString()}`:`${e} ~ ${f(n,r)}`;case "$changed":return `\u0394${e}`;default:return chunk4MNQDXH7_cjs.a&&!chunkT4TRJEJN_cjs.a.has(t)&&console.warn(`[Directive] describePredicate: unknown operator "${t}" \u2014 falling through to generic rendering.`),`${e} ${t} ${f(n,r)}`}}function Y(e){return e.length===0?true:/[\s,"']/.test(e)}function O(e,t,n){return typeof e!="string"||n||Y(e)?JSON.stringify(e):e}function f(e,t){if(e===null)return "null";if(e===void 0)return "undefined";if(typeof e=="boolean")return e?"true":"false";if(typeof e=="number"){if(!Number.isFinite(e))return String(e);try{return Gt(t.locale).format(e)}catch{return String(e)}}if(typeof e=="bigint")return t.style==="formal"?`${e.toString()}n`:e.toString();if(typeof e=="string")return t.style==="formal"||Y(e)?JSON.stringify(e):e;if(e instanceof Date)return e.toISOString();if(e instanceof RegExp)return e.toString();if(Array.isArray(e))return `[${e.map(n=>f(n,t)).join(", ")}]`;if(typeof e=="object")try{return JSON.stringify(e)}catch{return "[object]"}return String(e)}function Ne(e,t){return Array.isArray(e)?e.map(n=>typeof n=="string"?Y(n)?JSON.stringify(n):n:f(n,t)).join(", "):f(e,t)}function _e(e,t){return Array.isArray(e)?e.map(n=>typeof n=="string"?Y(n)?JSON.stringify(n):n:f(n,t)).join(", "):f(e,t)}function Z(e,t){if(e.length===0)return t.style==="formal"?"\u22A4":"always true";if(e.length===1)return e[0];let n=t.style==="formal"?Le:Ie;return t.parenthesize,e.join(n)}var ln=/^[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)?$/;function W(e,t){if(typeof e!="string"||!ln.test(e))throw new Error(`[Directive] predicateToSQL: invalid ${t} identifier "${e}" \u2014 must match /^[A-Za-z_][A-Za-z0-9_]*(\\.[A-Za-z_][A-Za-z0-9_]*)?$/`)}function Be(e,t){if(t&&!t.includes(e))throw new Error(`[Directive] predicateToSQL: column "${e}" is not in the allowedKeys list \u2014 add it to options.allowedKeys or remove it from the predicate`)}function dn(e){if(Array.isArray(e)){if(e.length===0)throw new Error("[Directive] predicateToSQL: select must not be empty");for(let n of e)W(n,"column");return e.join(", ")}let t=e;return t==="*"?"*":(W(t,"column"),t)}function b(e,t){return e.params.push(t),e.placeholder(e.params.length)}function de(e,t,n,r){switch(t){case "$eq":return `${e} = ${b(r,n)}`;case "$ne":return `${e} <> ${b(r,n)}`;case "$gt":return `${e} > ${b(r,n)}`;case "$gte":return `${e} >= ${b(r,n)}`;case "$lt":return `${e} < ${b(r,n)}`;case "$lte":return `${e} <= ${b(r,n)}`;case "$in":if(!Array.isArray(n))throw new Error("[Directive] predicateToSQL: $in operand must be an array");return `${e} = ANY(${b(r,n)})`;case "$nin":if(!Array.isArray(n))throw new Error("[Directive] predicateToSQL: $nin operand must be an array");return `NOT (${e} = ANY(${b(r,n)}))`;case "$exists":return n===true?`${e} IS NOT NULL`:`${e} IS NULL`;case "$between":{if(!Array.isArray(n)||n.length!==2)throw new Error("[Directive] predicateToSQL: $between operand must be a [low, high] tuple");return `${e} BETWEEN ${b(r,n[0])} AND ${b(r,n[1])}`}case "$startsWith":if(typeof n!="string")throw new Error("[Directive] predicateToSQL: $startsWith operand must be a string");return `${e} LIKE ${b(r,fe(n))} || '%' ESCAPE '\\'`;case "$endsWith":if(typeof n!="string")throw new Error("[Directive] predicateToSQL: $endsWith operand must be a string");return `${e} LIKE '%' || ${b(r,fe(n))} ESCAPE '\\'`;case "$contains":if(typeof n!="string")throw new Error("[Directive] predicateToSQL: $contains only supports string operands \u2014 array containment requires a JOIN, not a predicate");return `${e} LIKE '%' || ${b(r,fe(n))} || '%' ESCAPE '\\'`;case "$matches":{if(!(n instanceof RegExp))throw new Error("[Directive] predicateToSQL: $matches operand must be a RegExp");let i=n.flags.includes("i")?"~*":"~";return `${e} ${i} ${b(r,n.source)}`}case "$changed":throw new Error('[Directive] predicateToSQL: $changed is an effects-only operator \u2014 no server-side translation (a database row has no "prev" snapshot)');default:throw new Error(`[Directive] predicateToSQL: unknown operator "${t}" \u2014 known: ${[...chunkT4TRJEJN_cjs.a].join(", ")}`)}}function fe(e){return e.replace(/[\\%_]/g,"\\$&")}function We(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function fn(e){if(!We(e))return false;let t=Object.keys(e);if(t.length===0)return false;for(let n of t)if(!n.startsWith("$"))return false;return true}function pe(e,t){let n=Object.keys(e).filter(r=>r!==t);if(n.length>0)throw new Error(`[Directive] predicateToSQL: ${t} cannot coexist with sibling keys (${n.join(", ")}) \u2014 wrap them in $all together, or move them inside the ${t} children`)}function B(e,t,n){if(n>chunkT4TRJEJN_cjs.g)throw new Error(`[Directive] predicateToSQL: predicate depth limit (${chunkT4TRJEJN_cjs.g}) exceeded \u2014 flatten the predicate or check for a cyclic spec object`);if(e===null||typeof e!="object")throw new Error(`[Directive] predicateToSQL: predicate must be an object or array, got ${typeof e}`);if(Array.isArray(e)){if(e.length===0)return "TRUE";let i=e.map(s=>{if(!s||typeof s!="object"||!("fact"in s)||!("op"in s))throw new Error("[Directive] predicateToSQL: array-form clause must be { fact, op, value }");let o=s;return W(o.fact,"column"),Be(o.fact,t.allowed),de(o.fact,o.op,o.value,t)});return i.length===1?i[0]:`(${i.join(" AND ")})`}if("$all"in e){pe(e,"$all");let i=e.$all;if(!Array.isArray(i))throw new Error("[Directive] predicateToSQL: $all must be an array");if(i.length===0)return "TRUE";let s=i.map(o=>B(o,t,n+1));return s.length===1?s[0]:`(${s.join(" AND ")})`}if("$any"in e){pe(e,"$any");let i=e.$any;if(!Array.isArray(i))throw new Error("[Directive] predicateToSQL: $any must be an array");if(i.length===0)return "FALSE";let s=i.map(o=>B(o,t,n+1));return s.length===1?s[0]:`(${s.join(" OR ")})`}if("$not"in e){pe(e,"$not");let i=e.$not;return `NOT (${B(i,t,n+1)})`}let r=[];for(let[i,s]of Object.entries(e))if(W(i,"column"),Be(i,t.allowed),fn(s))for(let[o,u]of Object.entries(s)){if(!chunkT4TRJEJN_cjs.a.has(o))throw new Error(`[Directive] predicateToSQL: unknown operator "${o}" on column "${i}" \u2014 known: ${[...chunkT4TRJEJN_cjs.a].join(", ")}`);r.push(de(i,o,u,t));}else {if(We(s))throw new Error(`[Directive] predicateToSQL: nested predicate at "${i}" \u2014 cross-module / partial-match predicates have no SQL equivalent (single-table queries only in v1; pass a flat predicate or build JOIN by hand with predicateToWhere)`);r.push(de(i,"$eq",s,t));}return r.length===0?"TRUE":r.length===1?r[0]:`(${r.join(" AND ")})`}var Ue=e=>`$${e}`;function pn(e,t){let{table:n,allowedKeys:r}=t,i=t.placeholder??Ue,s=t.select??"*";W(n,"table");let o=dn(s),u={params:[],placeholder:i,allowed:r},a=B(e,u,0);return {sql:`SELECT ${o} FROM ${n} WHERE ${a}`,where:a,params:u.params}}function gn(e,t={}){let n=t.placeholder??Ue,r={params:[],placeholder:n,allowed:t.allowedKeys};return {where:B(e,r,0),params:r.params}}function ge(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function he(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function yn(e){if(!he(e))return false;let t=Object.keys(e);if(t.length===0)return false;for(let n of t)if(!n.startsWith("$"))return false;return true}var hn=/^[A-Za-z_][A-Za-z0-9_]*$/,mn=/^[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*$/;function Ke(e,t){if(typeof e!="string"||e.length===0)throw new Error(`[Directive] predicateToMongo: field name must be a non-empty string, got ${typeof e}`);if(e.startsWith("$"))throw new Error(`[Directive] predicateToMongo: field name "${e}" starts with "$" \u2014 reserved for Mongo operators (a top-level $where would be an injection vector)`);if(!(t.allowDottedPaths?mn:hn).test(e))throw new Error(`[Directive] predicateToMongo: invalid field name "${e}"${t.allowDottedPaths?"":' \u2014 pass options.allowDottedPaths=true to permit sub-document paths like "user.role"'}`)}function ze(e,t){if(t&&!t.includes(e))throw new Error(`[Directive] predicateToMongo: field "${e}" is not in the allowedKeys list \u2014 add it to options.allowedKeys or remove it from the predicate`)}function ye(e,t){let n=Object.keys(e).filter(r=>r!==t);if(n.length>0)throw new Error(`[Directive] predicateToMongo: ${t} cannot coexist with sibling keys (${n.join(", ")}) \u2014 wrap them in $all together, or move them inside the ${t} children`)}function He(e,t){switch(e){case "$eq":case "$ne":case "$gt":case "$gte":case "$lt":case "$lte":case "$in":case "$nin":case "$exists":return {[e]:t};case "$between":{if(!Array.isArray(t)||t.length!==2)throw new Error("[Directive] predicateToMongo: $between operand must be a [low, high] tuple");return {$gte:t[0],$lte:t[1]}}case "$startsWith":if(typeof t!="string")throw new Error("[Directive] predicateToMongo: $startsWith operand must be a string");return {$regex:`^${ge(t)}`};case "$endsWith":if(typeof t!="string")throw new Error("[Directive] predicateToMongo: $endsWith operand must be a string");return {$regex:`${ge(t)}$`};case "$contains":if(typeof t=="string")return {$regex:ge(t)};throw new Error("[Directive] predicateToMongo: $contains in Mongo expects a string operand \u2014 for array element membership use $elemMatch or $in directly");case "$matches":{if(t instanceof RegExp)return t.flags?{$regex:t.source,$options:t.flags}:{$regex:t.source};if(typeof t=="string")return {$regex:t};throw new Error("[Directive] predicateToMongo: $matches operand must be a RegExp or string")}case "$changed":throw new Error("[Directive] predicateToMongo: $changed is an effects-only operator \u2014 no MongoDB query equivalent");default:throw new Error(`[Directive] predicateToMongo: unknown operator "${e}" \u2014 known: ${[...chunkT4TRJEJN_cjs.a].join(", ")}`)}}function j(e,t,n){if(n>chunkT4TRJEJN_cjs.g)throw new Error(`[Directive] predicateToMongo: predicate depth limit (${chunkT4TRJEJN_cjs.g}) exceeded \u2014 flatten the predicate or check for a cyclic spec object`);if(e===null||typeof e!="object")throw new Error(`[Directive] predicateToMongo: predicate must be an object or array, got ${typeof e}`);if(Array.isArray(e)){if(e.length===0)return {};let i={},s=[];for(let o of e){if(!o||typeof o!="object"||!("fact"in o)||!("op"in o))throw new Error("[Directive] predicateToMongo: array-form clause must be { fact, op, value }");let u=o;Ke(u.fact,t),ze(u.fact,t.allowedKeys);let a=He(u.op,u.value);if(u.fact in i&&he(i[u.fact])){let c=i[u.fact];Object.keys(a).some(d=>d in c)?s.push({[u.fact]:a}):i[u.fact]={...c,...a};}else u.fact in i?s.push({[u.fact]:a}):i[u.fact]=a;}if(s.length>0){let o=[];for(let[u,a]of Object.entries(i))o.push({[u]:a});return o.push(...s),{$and:o}}return i}if("$all"in e){ye(e,"$all");let i=e.$all;if(!Array.isArray(i))throw new Error("[Directive] predicateToMongo: $all must be an array");return i.length===0?{}:i.length===1?j(i[0],t,n+1):{$and:i.map(s=>j(s,t,n+1))}}if("$any"in e){ye(e,"$any");let i=e.$any;if(!Array.isArray(i))throw new Error("[Directive] predicateToMongo: $any must be an array");return i.length===0?{$expr:{$eq:[1,0]}}:i.length===1?j(i[0],t,n+1):{$or:i.map(s=>j(s,t,n+1))}}if("$not"in e){ye(e,"$not");let i=e.$not;return {$nor:[j(i,t,n+1)]}}let r={};for(let[i,s]of Object.entries(e))if(Ke(i,t),ze(i,t.allowedKeys),yn(s)){let o={};for(let[u,a]of Object.entries(s)){if(!chunkT4TRJEJN_cjs.a.has(u))throw new Error(`[Directive] predicateToMongo: unknown operator "${u}" on field "${i}" \u2014 known: ${[...chunkT4TRJEJN_cjs.a].join(", ")}`);Object.assign(o,He(u,a));}r[i]=o;}else r[i]=s;return r}function $n(e,t={}){return j(e,t,0)}var wn=/^[A-Za-z_][A-Za-z0-9_]*$/;function Je(e,t){if(typeof e!="string"||!wn.test(e))throw new Error(`[Directive] predicateToPostgrest: invalid column identifier "${e}"`);if(t&&!t.includes(e))throw new Error(`[Directive] predicateToPostgrest: column "${e}" is not in the allowedKeys list \u2014 add it to options.allowedKeys or remove it from the predicate`)}function me(e,t){let n=Object.keys(e).filter(r=>r!==t);if(n.length>0)throw new Error(`[Directive] predicateToPostgrest: ${t} cannot coexist with sibling keys (${n.join(", ")}) \u2014 wrap them in $all together, or move them inside the ${t} children`)}function k(e){if(e==null)return "null";if(typeof e=="boolean")return e?"true":"false";if(typeof e=="number"||typeof e=="bigint")return String(e);if(e instanceof Date)return e.toISOString();if(typeof e=="string")return /[,.():"\\\s]/.test(e)?`"${e.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`:e;throw new Error(`[Directive] predicateToPostgrest: cannot encode value of type ${typeof e}`)}function Qe(e){return `(${e.map(k).join(",")})`}function $e(e){return e.replace(/[\\%_*]/g,"\\$&")}function P(e,t){switch(e){case "$eq":return `eq.${k(t)}`;case "$ne":return `neq.${k(t)}`;case "$gt":return `gt.${k(t)}`;case "$gte":return `gte.${k(t)}`;case "$lt":return `lt.${k(t)}`;case "$lte":return `lte.${k(t)}`;case "$in":if(!Array.isArray(t))throw new Error("[Directive] predicateToPostgrest: $in operand must be an array");return `in.${Qe(t)}`;case "$nin":if(!Array.isArray(t))throw new Error("[Directive] predicateToPostgrest: $nin operand must be an array");return `not.in.${Qe(t)}`;case "$exists":return t===true?"not.is.null":"is.null";case "$startsWith":if(typeof t!="string")throw new Error("[Directive] predicateToPostgrest: $startsWith operand must be a string");return `like.${k($e(t)+"*")}`;case "$endsWith":if(typeof t!="string")throw new Error("[Directive] predicateToPostgrest: $endsWith operand must be a string");return `like.${k("*"+$e(t))}`;case "$contains":if(typeof t!="string")throw new Error("[Directive] predicateToPostgrest: $contains expects a string operand (array containment is the cs operator with a different shape \u2014 out of scope for v1)");return `like.${k("*"+$e(t)+"*")}`;case "$matches":if(t instanceof RegExp)return `${t.flags.includes("i")?"imatch":"match"}.${k(t.source)}`;if(typeof t=="string")return `match.${k(t)}`;throw new Error("[Directive] predicateToPostgrest: $matches operand must be a RegExp or string");case "$changed":throw new Error("[Directive] predicateToPostgrest: $changed is an effects-only operator \u2014 no server query equivalent");default:throw new Error(`[Directive] predicateToPostgrest: unknown operator "${e}" \u2014 known: ${[...chunkT4TRJEJN_cjs.a].join(", ")}`)}}function Xe(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function bn(e){if(!Xe(e))return false;let t=Object.keys(e);if(t.length===0)return false;for(let n of t)if(!n.startsWith("$"))return false;return true}function we(e,t){return `${e}=${t}`}function G(e,t){return `${e}=(${t.join(",")})`}function be(e,t,n,r){if(t==="$between"){if(!Array.isArray(n)||n.length!==2)throw new Error("[Directive] predicateToPostgrest: $between operand must be a [low, high] tuple");let i=r?we(e,P("$gte",n[0])):`${e}.${P("$gte",n[0])}`,s=r?we(e,P("$lte",n[1])):`${e}.${P("$lte",n[1])}`;return [i,s]}return [r?we(e,P(t,n)):`${e}.${P(t,n)}`]}function U(e,t,n,r){if(r>chunkT4TRJEJN_cjs.g)throw new Error(`[Directive] predicateToPostgrest: predicate depth limit (${chunkT4TRJEJN_cjs.g}) exceeded \u2014 flatten the predicate or check for a cyclic spec object`);if(e===null||typeof e!="object")throw new Error("[Directive] predicateToPostgrest: predicate must be an object or array");if(Array.isArray(e)){let s=[];for(let o of e){if(!o||typeof o!="object"||!("fact"in o)||!("op"in o))throw new Error("[Directive] predicateToPostgrest: array-form clause must be { fact, op, value }");let u=o;Je(u.fact,t),s.push(...be(u.fact,u.op,u.value,n));}return s}if("$all"in e){me(e,"$all");let s=e.$all;if(!Array.isArray(s))throw new Error("[Directive] predicateToPostgrest: $all must be an array");if(n){let u=[];for(let a of s)u.push(...U(a,t,true,r+1));return u}let o=[];for(let u of s)o.push(...U(u,t,false,r+1));return [G("and",o)]}if("$any"in e){me(e,"$any");let s=e.$any;if(!Array.isArray(s))throw new Error("[Directive] predicateToPostgrest: $any must be an array");if(s.length===0)return n?["id=is.null","id=not.is.null"]:[G("and",["id.is.null","id.not.is.null"])];let o=[];for(let u of s)o.push(...U(u,t,false,r+1));return [G("or",o)]}if("$not"in e){me(e,"$not");let s=e.$not,o=U(s,t,false,r+1);return [G("not.and",o)]}let i=[];for(let[s,o]of Object.entries(e))if(Je(s,t),bn(o))for(let[u,a]of Object.entries(o)){if(!chunkT4TRJEJN_cjs.a.has(u))throw new Error(`[Directive] predicateToPostgrest: unknown operator "${u}" on column "${s}" \u2014 known: ${[...chunkT4TRJEJN_cjs.a].join(", ")}`);i.push(...be(s,u,a,n));}else {if(Xe(o))throw new Error(`[Directive] predicateToPostgrest: nested predicate at "${s}" \u2014 single-table queries only`);i.push(...be(s,"$eq",o,n));}return i}function Sn(e){let t=e.indexOf("=");if(t<0)return encodeURIComponent(e);let n=e.slice(0,t),r=e.slice(t+1);return `${n}=${encodeURIComponent(r)}`}function Tn(e,t={}){let n=t.mode??"querystring",r=U(e,t.allowedKeys,true,0);return r.length===0?"":n==="raw"?r.join("&"):r.map(Sn).join("&")}function V(e=[],t,n,r,i,s,o){return {_type:void 0,_validators:e,_typeName:t,_default:n,_transform:r,_description:i,_refinements:s,_meta:o,validate(u){return V([...e,u],t,n,r,i,s,o)}}}function p(e,t,n,r,i,s,o){return {...V(e,t,n,r,i,s,o),default(a){return p(e,t,a,r,i,s,o)},transform(a){return p([],t,void 0,l=>{let d=r?r(l):l;return a(d)},i,void 0,o)},brand(){return p(e,`Branded<${t}>`,n,r,i,s,o)},describe(a){return p(e,t,n,r,a,s,o)},refine(a,c){let l=[...s??[],{predicate:a,message:c}];return p([...e,a],t,n,r,i,l,o)},nullable(){return p([a=>a===null||e.every(c=>c(a))],`${t} | null`,n,r,i,void 0,o)},optional(){return p([a=>a===void 0||e.every(c=>c(a))],`${t} | undefined`,n,r,i,void 0,o)},meta(a){return p(e,t,n,r,i,s,a)}}}var kn=((...e)=>{if(e.length===0)return p([],"union");let t=e.map(n=>n._typeName??"unknown");return p([n=>e.some(r=>r._validators.every(i=>i(n)))],t.join(" | "))}),vn={string(){let e=(t,n,r,i,s,o)=>({...p(t,"string",n,r,i,s,o),minLength(a){return e([...t,c=>c.length>=a],n,r,i,s,o)},maxLength(a){return e([...t,c=>c.length<=a],n,r,i,s,o)},pattern(a){return e([...t,c=>a.test(c)],n,r,i,s,o)},default(a){return e(t,a,r,i,s,o)},describe(a){return e(t,n,r,a,s,o)},refine(a,c){let l=[...s??[],{predicate:a,message:c}];return e([...t,a],n,r,i,l,o)},meta(a){return e(t,n,r,i,s,a)}});return e([t=>typeof t=="string"])},number(){let e=(t,n,r,i,s,o)=>({...p(t,"number",n,r,i,s,o),min(a){return e([...t,c=>c>=a],n,r,i,s,o)},max(a){return e([...t,c=>c<=a],n,r,i,s,o)},default(a){return e(t,a,r,i,s,o)},describe(a){return e(t,n,r,a,s,o)},refine(a,c){let l=[...s??[],{predicate:a,message:c}];return e([...t,a],n,r,i,l,o)},meta(a){return e(t,n,r,i,s,a)}});return e([t=>typeof t=="number"])},boolean(){return p([e=>typeof e=="boolean"],"boolean")},array(){let e=(t,n,r,i,s,o)=>{let u=p(t,"array",r,void 0,i,void 0,o),a=s??{value:-1};return {...u,get _lastFailedIndex(){return a.value},set _lastFailedIndex(l){a.value=l;},of(l){let d={value:-1};return e([...t,g=>{for(let y=0;y<g.length;y++)if(!l._validators.every($=>$(g[y])))return d.value=y,false;return true}],l,r,i,d,o)},nonEmpty(){return e([...t,l=>l.length>0],n,r,i,a,o)},maxLength(l){return e([...t,d=>d.length<=l],n,r,i,a,o)},minLength(l){return e([...t,d=>d.length>=l],n,r,i,a,o)},default(l){return e(t,n,l,i,a,o)},describe(l){return e(t,n,r,l,a,o)},meta(l){return e(t,n,r,i,a,l)}}};return e([t=>Array.isArray(t)])},object(){let e=(t,n,r,i)=>({...p(t,"object",n,void 0,r,void 0,i),shape(o){return e([...t,u=>{for(let[a,c]of Object.entries(o)){let l=u[a],d=c;if(d&&!d._validators.every(g=>g(l)))return false}return true}],n,r,i)},nonNull(){return e([...t,o=>o!=null],n,r,i)},hasKeys(...o){return e([...t,u=>o.every(a=>a in u)],n,r,i)},default(o){return e(t,o,r,i)},describe(o){return e(t,n,o,i)},meta(o){return e(t,n,r,o)}});return e([t=>typeof t=="object"&&t!==null&&!Array.isArray(t)])},enum(...e){chunk4MNQDXH7_cjs.a&&e.length===0&&console.warn("[Directive] t.enum() called with no values - this will reject all strings");let t=new Set(e);return p([n=>typeof n=="string"&&t.has(n)],`enum(${e.join("|")})`)},literal(e){return p([t=>t===e],`literal(${String(e)})`)},nullable(e){let t=e._typeName??"unknown";return V([n=>n===null?true:e._validators.every(r=>r(n))],`${t} | null`)},optional(e){let t=e._typeName??"unknown";return V([n=>n===void 0?true:e._validators.every(r=>r(n))],`${t} | undefined`)},union:kn,record(e){let t=e._typeName??"unknown";return p([n=>typeof n!="object"||n===null||Array.isArray(n)?false:Object.values(n).every(r=>e._validators.every(i=>i(r)))],`Record<string, ${t}>`)},tuple(...e){chunk4MNQDXH7_cjs.a&&e.length===0&&console.warn("[Directive] t.tuple() called with no types - this will only accept empty arrays");let t=e.map(n=>n._typeName??"unknown");return p([n=>!Array.isArray(n)||n.length!==e.length?false:e.every((r,i)=>r._validators.every(s=>s(n[i])))],`[${t.join(", ")}]`)},date(){return p([e=>e instanceof Date&&!Number.isNaN(e.getTime())],"Date")},uuid(){let e=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;return p([t=>typeof t=="string"&&e.test(t)],"uuid")},email(){let e=/^[^\s@]+@[^\s@]+\.[^\s@]+$/;return p([t=>typeof t=="string"&&e.test(t)],"email")},url(){return p([e=>{if(typeof e!="string")return false;try{return new URL(e),!0}catch{return false}}],"url")},bigint(){return p([e=>typeof e=="bigint"],"bigint")},any(){return p([],"any")},unknown(){return p([],"unknown")}};function Mn(e){if(!e||typeof e!="string"){console.warn("[Directive] Module ID must be a non-empty string");return}/^(__[a-z][a-z0-9_-]*|[a-z][a-z0-9-]*)$/i.test(e)||console.warn(`[Directive] Module ID "${e}" should follow kebab-case convention (e.g., "my-module")`);}function Ze(e,t,n,r,i){for(let s of e)t.has(s)||console.warn(`[Directive] ${n} "${s}" not declared in ${r}`);for(let s of t)e.has(s)||console.warn(`[Directive] ${r}["${s}"] ${i}`);}function Rn(e,t){e.length===0&&console.warn("[Directive] history.snapshotEvents is an empty array \u2014 no events will create history snapshots. Omit history.snapshotEvents entirely to snapshot all events, or list specific events.");let n=new Set(Object.keys(t));for(let r of e)n.has(r)||console.warn(`[Directive] history.snapshotEvents entry "${r}" not declared in schema.events. Available events: ${[...n].join(", ")||"(none)"}`);}function An(e,t){let n=new Set(Object.keys(t));for(let[r,i]of Object.entries(e)){let s=i;typeof s.requirement=="string"&&!n.has(s.requirement)&&console.warn(`[Directive] Resolver "${r}" references unknown requirement type "${s.requirement}". Available types: ${[...n].join(", ")||"(none)"}`);}}function Dn(e,t){let n=t.schema?.facts??{},r=Object.keys(n);if(r.length===0)return;let i=new Set(["self","prev","current"]),s="crossModuleDeps"in t&&t.crossModuleDeps?Object.keys(t.crossModuleDeps):[];for(let o of s)i.add(o);for(let o of r)if(i.has(o))throw new Error(`[Directive] module '${e}': fact key '${o}' conflicts with a reserved namespace pivot or evaluation alias (self / prev / current / a crossModuleDep namespace). Three fixes:
'use strict';var chunkQ2VZPURY_cjs=require('./chunk-Q2VZPURY.cjs'),chunkNPX5EKPP_cjs=require('./chunk-NPX5EKPP.cjs'),chunkENZEHIL7_cjs=require('./chunk-ENZEHIL7.cjs'),chunkT4TRJEJN_cjs=require('./chunk-T4TRJEJN.cjs'),chunkX7G7UBXU_cjs=require('./chunk-X7G7UBXU.cjs'),chunk4MNQDXH7_cjs=require('./chunk-4MNQDXH7.cjs');var C=1e6;function Me(e,t){try{chunkT4TRJEJN_cjs.l(e);}catch(r){let i=r instanceof Error?r.message:String(r);throw new Error(`[Directive] replayUnder: the ${t} predicate is invalid \u2014 ${i}`)}if(!chunkT4TRJEJN_cjs.h(e)){let r=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 ${r})`)}let n;if(chunkT4TRJEJN_cjs.i(e,{operator(r,i){n===void 0&&i.startsWith("$")&&!chunkT4TRJEJN_cjs.a.has(i)&&(n=i);},strayOperatorKey(r){n===void 0&&!chunkT4TRJEJN_cjs.a.has(r)&&!chunkT4TRJEJN_cjs.b.has(r)&&(n=r);}}),n!==void 0)throw new Error(`[Directive] replayUnder: the ${t} predicate uses an unknown operator "${n}" \u2014 known operators: ${[...chunkT4TRJEJN_cjs.a].join(", ")}`)}function Ae(e){if(e&&typeof e=="object"&&!Array.isArray(e)&&Array.isArray(e.snapshots))return De(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>C)throw new Error(`[Directive] toReplayFrames: history has ${t.length} frames, exceeds the MAX_REPLAY_FRAMES limit (${C}) \u2014 split or down-sample the history`);return t.map((n,r)=>{if(n&&typeof n=="object"&&"facts"in n){let i=n,s={id:i.id??`#${r}`,facts:i.facts??{}};return typeof i.timestamp=="number"&&(s.timestamp=i.timestamp),s}return {id:`#${r}`,facts:n??{}}})}function De(e){let t=typeof e=="string"?JSON.parse(e):e;if(Array.isArray(t))return se(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 n=t;if(n.version!==void 0&&n.version!==1)throw new Error(`[Directive] framesFromHistory: unsupported history export version ${JSON.stringify(n.version)} \u2014 expected 1`);if(!Array.isArray(n.snapshots))throw new Error("[Directive] framesFromHistory: expected a history export object with a `snapshots` array (from system.history.export())");return se(n.snapshots)}function se(e){if(!Array.isArray(e))throw new Error("[Directive] framesFromSnapshots: expected an array of fact-state snapshots");if(e.length>C)throw new Error(`[Directive] framesFromSnapshots: history has ${e.length} snapshots, exceeds the MAX_REPLAY_FRAMES limit (${C}) \u2014 split or down-sample the history`);for(let t=0;t<e.length;t++){let n=e[t];if(!n||typeof n!="object"||!("facts"in n))throw new Error(`[Directive] framesFromSnapshots: snapshot at index ${t} is not a { facts, ... } object`)}return Ae(e)}function H(e){let{frames:t,original:n,proposed:r,entityKey:i}=e,s=e.maxSamples??20,o=s>0?s:0;if(t.length>C)throw new Error(`[Directive] replayUnder: history has ${t.length} frames, exceeds the MAX_REPLAY_FRAMES limit (${C}) \u2014 split or down-sample the history`);Me(n,"original"),Me(r,"proposed");let u=0,a=0,c=0,l=0,d=0,g=[],y=[],$=i?new Set:void 0,m=i?new Set:void 0,M;for(let F of t){let T=F.facts,v=chunkT4TRJEJN_cjs.o(n,T,M),A=chunkT4TRJEJN_cjs.o(r,T,M);v&&(u++,$?.add(T[i])),A&&(a++,m?.add(T[i])),v===A?d++:!v&&A?(c++,g.length<o&&g.push(Re(F,n,r,M))):(l++,y.length<o&&y.push(Re(F,n,r,M))),M=T;}let E={framesEvaluated:t.length,original:{matched:u},proposed:{matched:a},delta:a-u,newMatchCount:c,lostMatchCount:l,unchanged:d,newMatches:g,lostMatches:y};return $&&m&&(E.original.matchedEntities=$.size,E.proposed.matchedEntities=m.size),E}function Re(e,t,n,r){let i=e.facts,s={frameId:e.id,facts:i,originalExplain:chunkT4TRJEJN_cjs.p(t,i,r),proposedExplain:chunkT4TRJEJN_cjs.p(n,i,r)};return e.timestamp!==void 0&&(s.timestamp=e.timestamp),s}var ae=1e4,Ce=5e7;function It(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)&&Object.keys(e).length===1&&typeof e.$hole=="string"}function ue(e,t,n=new Set,r=0){if(r>chunkT4TRJEJN_cjs.g)throw new Error(`[Directive] sweepUnder: template exceeds MAX_PREDICATE_DEPTH (${chunkT4TRJEJN_cjs.g}) \u2014 flatten the template or split the sweep`);if(It(e)){let i=e.$hole;if(!(i in t))throw new Error(`[Directive] sweepUnder: template references hole "${i}" but sweep has no values for it`);return t[i]}if(e===null||typeof e!="object")return e;if(n.has(e))throw new Error("[Directive] sweepUnder: template contains a cycle \u2014 predicate templates must be a tree");n.add(e);try{if(Array.isArray(e))return e.map(s=>ue(s,t,n,r+1));let i={};for(let[s,o]of Object.entries(e))i[s]=ue(o,t,n,r+1);return i}finally{n.delete(e);}}function*Ee(e,t){if(e.length===0){yield {};return}let n=e[0],r=e.slice(1),i=t[n]??[];for(let s of i)for(let o of Ee(r,t))yield {[n]:s,...o};}function Lt(e){let t=1;for(let n of Object.values(e))t*=n.length;return t}function qt(e){let{frames:t,original:n,template:r,sweep:i,objective:s=T=>T.proposed.matched,entityKey:o,maxSamples:u=0}=e,a=Object.keys(i);if(a.length===0)throw new Error("[Directive] sweepUnder: `sweep` must contain at least one hole name");let c=Lt(i);if(c>ae)throw new Error(`[Directive] sweepUnder: grid has ${c} points, exceeds the MAX_SWEEP_POINTS limit (${ae}) \u2014 narrow the sweep ranges or split the run`);if(c===0)throw new Error("[Directive] sweepUnder: at least one hole has zero candidate values");let l=c*t.length;if(l>Ce)throw new Error(`[Directive] sweepUnder: ${c} points \xD7 ${t.length} frames = ${l} per-frame evaluations, exceeds the MAX_SWEEP_EVALUATIONS limit (${Ce}) \u2014 narrow the sweep, down-sample the history, or split the run`);let d=false,g=T=>{let v;try{v=s(T);}catch(A){return d||(d=true,console.warn(`[Directive] sweepUnder: objective threw \u2014 point will not rank (${A.message})`)),Number.NEGATIVE_INFINITY}return typeof v!="number"||!Number.isFinite(v)?(d||(d=true,console.warn(`[Directive] sweepUnder: objective returned a non-finite number (${String(v)}) \u2014 point will not rank`)),Number.NEGATIVE_INFINITY):v},y=H({frames:t,original:n,proposed:n,entityKey:o,maxSamples:u}),$={values:{},report:y,score:g(y)},m=[],M=0,E=Number.NEGATIVE_INFINITY;for(let T of Ee(a,i)){let v=ue(r,T),A=H({frames:t,original:n,proposed:v,entityKey:o,maxSamples:u}),te=g(A);te>E&&(E=te,M=m.length),m.push({values:T,report:A,score:te});}let F=m[M];return {points:m,bestIndex:M,best:F,baseline:$}}function ce(e){let t=e&&typeof e=="object"&&!Array.isArray(e)&&"constraints"in e?e.constraints:e;if(Array.isArray(t)){let n={};for(let r of t){if(!r||typeof r!="object"||!("id"in r))throw new Error("[Directive] diffRules: array entries must be `{ id, whenSpec }` objects");let i=r;if(typeof i.id!="string")throw new Error("[Directive] diffRules: constraint `id` must be a string");n[i.id]=i.whenSpec;}return n}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 Bt=new Set(["$eq","$ne","$in","$nin","$exists","$gt","$gte","$lt","$lte","$between","$matches","$startsWith","$endsWith","$contains","$changed"]),Wt=new Set(["$all","$any","$not"]);function xe(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Ut(e){if(!xe(e))return false;let t=Object.keys(e);if(t.length===0)return false;let n=false;for(let r of t){if(!r.startsWith("$"))return false;Bt.has(r)&&(n=true);}return n}function S(e,t="",n=[]){if(e===null||typeof e!="object")return n;if(Array.isArray(e)){for(let r of e)if(r&&typeof r=="object"&&"fact"in r&&"op"in r){let i=r;n.push({path:t?`${t}.${String(i.fact)}`:String(i.fact),op:String(i.op),value:i.value});}return n}if("$all"in e&&Array.isArray(e.$all))return e.$all.forEach((i,s)=>{S(i,`${t}$all[${s}]`,n);}),n;if("$any"in e&&Array.isArray(e.$any))return e.$any.forEach((i,s)=>{S(i,`${t}$any[${s}]`,n);}),n;if("$not"in e)return S(e.$not,`${t}$not`,n),n;for(let[r,i]of Object.entries(e)){let s=t?`${t}.${r}`:r;if(Ut(i))for(let[o,u]of Object.entries(i))n.push({path:s,op:o,value:u});else xe(i)&&!Wt.has(r)?S(i,s,n):n.push({path:s,op:"$eq",value:i});}return n}function D(e){return typeof e=="number"&&Number.isFinite(e)}function Kt(e,t,n){switch(e){case "$gte":case "$gt":if(D(t)&&D(n)){if(n<t)return "relaxed";if(n>t)return "tightened"}return null;case "$lte":case "$lt":if(D(t)&&D(n)){if(n>t)return "relaxed";if(n<t)return "tightened"}return null;case "$between":{if(Array.isArray(t)&&Array.isArray(n)&&t.length===2&&n.length===2&&D(t[0])&&D(t[1])&&D(n[0])&&D(n[1])){let r=t[1]-t[0],i=n[1]-n[0];if(i>r)return "relaxed";if(i<r)return "tightened"}return null}case "$in":case "$nin":{if(Array.isArray(t)&&Array.isArray(n))if(e==="$in"){if(n.length>t.length)return "relaxed";if(n.length<t.length)return "tightened"}else {if(n.length>t.length)return "tightened";if(n.length<t.length)return "relaxed"}return null}case "$contains":{if(Array.isArray(t)&&Array.isArray(n)){if(n.length>t.length)return "relaxed";if(n.length<t.length)return "tightened"}return null}default:return null}}function zt(e){let t=ce(e.before),n=ce(e.after),i=[...new Set([...Object.keys(t),...Object.keys(n)])].sort(),s=[],o={added:0,removed:0,changed:0,unchanged:0,totalClauseChanges:0};for(let u of i){let a=t[u],c=n[u],l=u in t,d=u in n;if(l&&!d){let y=S(a),$=y.length===0?[{path:"(function-form predicate)",kind:"removed"}]:y.map(m=>({path:m.path,kind:"removed",before:{op:m.op,value:m.value}}));le($),s.push({id:u,status:"removed",changes:$}),o.removed++,o.totalClauseChanges+=$.length;continue}if(!l&&d){let y=S(c),$=y.length===0?[{path:"(function-form predicate)",kind:"added"}]:y.map(m=>({path:m.path,kind:"added",after:{op:m.op,value:m.value}}));le($),s.push({id:u,status:"added",changes:$}),o.added++,o.totalClauseChanges+=$.length;continue}let g=Oe(a,c);g.length===0?(s.push({id:u,status:"unchanged",changes:[]}),o.unchanged++):(s.push({id:u,status:"changed",changes:g}),o.changed++,o.totalClauseChanges+=g.length);}return {constraints:s,summary:o}}function Oe(e,t){if(e!==void 0&&t!==void 0&&(e===null||t===null||typeof e!="object"||typeof t!="object"))return chunk4MNQDXH7_cjs.e(e)===chunk4MNQDXH7_cjs.e(t)?[]:[{path:"",kind:"changed",before:{op:"$eq",value:e},after:{op:"$eq",value:t}}];let n=e===void 0?[]:S(e),r=t===void 0?[]:S(t),i=c=>`${c.path}::${c.op}`,s=new Map(n.map(c=>[i(c),c])),o=new Map(r.map(c=>[i(c),c])),u=new Set([...s.keys(),...o.keys()]),a=[];for(let c of u){let l=s.get(c),d=o.get(c);if(l&&!d){a.push({path:l.path,kind:"removed",before:{op:l.op,value:l.value}});continue}if(!l&&d){a.push({path:d.path,kind:"added",after:{op:d.op,value:d.value}});continue}if(l&&d){if(chunk4MNQDXH7_cjs.e(l.value)===chunk4MNQDXH7_cjs.e(d.value))continue;let g=Kt(l.op,l.value,d.value);a.push({path:l.path,kind:g??"changed",before:{op:l.op,value:l.value},after:{op:d.op,value:d.value}});}}return le(a),a}function le(e){e.sort((t,n)=>{let r=t.path.localeCompare(n.path);if(r!==0)return r;let i=t.before?.op??t.after?.op??"",s=n.before?.op??n.after?.op??"";return i.localeCompare(s)});}function Ht(e){return chunk4MNQDXH7_cjs.h(e)}function J(e){return e===null?"null":e===void 0?"undefined":e instanceof Date?e.toISOString():typeof e=="string"||typeof e=="object"?JSON.stringify(e):String(e)}function Jt(e){let t=e.path,n=J(e.expected),r=J(e.actual);switch(e.op){case "$eq":return `set ${t} to ${n} (currently ${r})`;case "$ne":return `change ${t} to anything other than ${n} (currently ${r})`;case "$gt":return `set ${t} above ${n} (currently ${r})`;case "$gte":return `set ${t} to at least ${n} (currently ${r})`;case "$lt":return `set ${t} below ${n} (currently ${r})`;case "$lte":return `set ${t} to at most ${n} (currently ${r})`;case "$in":return `set ${t} to one of ${n} (currently ${r})`;case "$nin":return `set ${t} to something other than ${n} (currently ${r})`;case "$exists":return e.expected===true?`set ${t} to a non-null value (currently null/missing)`:`unset ${t} (currently ${r})`;case "$between":return Array.isArray(e.expected)&&e.expected.length===2?`set ${t} between ${J(e.expected[0])} and ${J(e.expected[1])} (currently ${r})`:`set ${t} within range ${n} (currently ${r})`;case "$startsWith":return `set ${t} to start with ${n} (currently ${r})`;case "$endsWith":return `set ${t} to end with ${n} (currently ${r})`;case "$contains":return `set ${t} to contain ${n} (currently ${r})`;case "$matches":return `set ${t} to match the pattern ${n} (currently ${r})`;case "$changed":return `the previous-vs-current change of ${t} is required to differ (currently they match: ${r})`;case "$all":case "$any":case "$not":return `the ${e.op} group at "${t}" did not pass \u2014 see its child clauses`;default:return `clause at ${t} (${e.op}) failed: expected ${n}, got ${r}`}}function je(e,t){for(let n of e)if(!n.pass){if((n.op==="$all"||n.op==="$any"||n.op==="$not")&&n.children){je(n.children,t);continue}t.push({path:n.path,op:n.op,expected:n.expected,actual:n.actual,suggestion:Jt(n)});}}function Qt(e,t,n){let r=chunkT4TRJEJN_cjs.p(e,t,n),i=r.every(o=>o.pass),s=[];if(i||je(r,s),!i&&n===void 0){let o=[];chunkT4TRJEJN_cjs.i(e,{operator(u,a){a==="$changed"&&o.push(u);}});for(let u of o)s.push({path:u,op:"$changed",expected:true,actual:void 0,suggestion:`$changed clause at "${u}" cannot be evaluated without a \`prev\` snapshot \u2014 pass predict(predicate, facts, prev).`});}return {wouldFire:i,whenExplain:r,missingChanges:s}}var Pe=new Set(["$eq","$ne","$gt","$gte","$lt","$lte","$in","$nin"]);function Q(e,t){if(e===t)return 0;if(typeof e=="number"&&typeof t=="number"||typeof e=="bigint"&&typeof t=="bigint")return e<t?-1:e>t?1:0;if(e instanceof Date&&t instanceof Date){let n=e.getTime(),r=t.getTime();return n<r?-1:n>r?1:0}return typeof e=="string"&&typeof t=="string"?e<t?-1:e>t?1:0:Number.NaN}function _(e,t){if(e===t)return true;if(typeof e!=typeof t||e===null||t===null||typeof e!="object"||Array.isArray(e)!==Array.isArray(t))return false;if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return false;for(let i=0;i<e.length;i++)if(!_(e[i],t[i]))return false;return true}let n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return false;for(let i of n)if(!_(e[i],t[i]))return false;return true}function Xt(e,t){if(!Pe.has(e.op)||!Pe.has(t.op))return {type:"overlap",reason:`Both rules touch "${e.path}".`};if(e.op==="$eq"&&t.op==="$eq")return _(e.value,t.value)?{type:"subset",reason:`Both rules require ${e.path} = ${JSON.stringify(e.value)} \u2014 candidate is redundant.`}:{type:"direct",reason:`Candidate requires ${e.path} = ${JSON.stringify(e.value)} but an existing rule requires ${e.path} = ${JSON.stringify(t.value)} \u2014 they cannot both fire.`};if(e.op==="$eq"&&t.op==="$ne")return _(e.value,t.value)?{type:"direct",reason:`Candidate requires ${e.path} = ${JSON.stringify(e.value)} but an existing rule excludes that value.`}:null;if(e.op==="$ne"&&t.op==="$eq")return _(e.value,t.value)?{type:"direct",reason:`Candidate excludes ${e.path} = ${JSON.stringify(e.value)} but an existing rule requires that exact value.`}:null;if(e.op==="$in"&&t.op==="$in"){let o=new Set(Array.isArray(e.value)?e.value:[]),u=new Set(Array.isArray(t.value)?t.value:[]),a=[...o].filter(c=>u.has(c));return a.length===0?{type:"direct",reason:`Candidate $in set for ${e.path} (${JSON.stringify([...o])}) and existing $in set (${JSON.stringify([...u])}) have no values in common \u2014 the candidate can never fire while the existing rule holds.`}:a.length===o.size&&a.length<u.size?{type:"subset",reason:`Candidate $in set for ${e.path} is a strict subset of the existing rule's $in set.`}:null}let n=e.op==="$gt"||e.op==="$gte"?e.value:void 0,r=e.op==="$lt"||e.op==="$lte"?e.value:void 0,i=t.op==="$gt"||t.op==="$gte"?t.value:void 0,s=t.op==="$lt"||t.op==="$lte"?t.value:void 0;if(n!==void 0&&s!==void 0){let o=Q(n,s);if(!Number.isNaN(o)&&(o>0||o===0&&(e.op==="$gt"||t.op==="$lt")))return {type:"direct",reason:`Candidate requires ${e.path} ${e.op==="$gt"?">":"\u2265"} ${JSON.stringify(n)} but an existing rule caps it at ${t.op==="$lt"?"<":"\u2264"} ${JSON.stringify(s)}.`}}if(i!==void 0&&r!==void 0){let o=Q(i,r);if(!Number.isNaN(o)&&(o>0||o===0&&(t.op==="$gt"||e.op==="$lt")))return {type:"direct",reason:`Candidate caps ${e.path} at ${e.op==="$lt"?"<":"\u2264"} ${JSON.stringify(r)} but an existing rule requires it ${t.op==="$gt"?">":"\u2265"} ${JSON.stringify(i)}.`}}if(n!==void 0&&i!==void 0){let o=Q(n,i);if(!Number.isNaN(o)&&o>0)return {type:"subset",reason:`Candidate's lower bound on ${e.path} (${JSON.stringify(n)}) is stricter than the existing rule's lower bound (${JSON.stringify(i)}) \u2014 candidate is a subset.`}}if(r!==void 0&&s!==void 0){let o=Q(r,s);if(!Number.isNaN(o)&&o<0)return {type:"subset",reason:`Candidate's upper bound on ${e.path} (${JSON.stringify(r)}) is stricter than the existing rule's upper bound (${JSON.stringify(s)}) \u2014 candidate is a subset.`}}return {type:"overlap",reason:`Both rules constrain "${e.path}".`}}function Fe(e){return typeof e=="object"&&e!==null&&typeof e.id=="string"}var Zt={checkAgainst(e,t){let n=Array.isArray(t)?t:"constraints"in t&&Array.isArray(t.constraints)?t.constraints:[],r=S(e);if(r.length===0)return {contradictions:[],warnings:[]};let i=new Map;for(let u of r){let a=i.get(u.path)??[];a.push(u),i.set(u.path,a);}let s=[],o=[];for(let u of n){if(!Fe(u)||u.whenSpec===void 0)continue;let a=S(u.whenSpec);for(let c of a){let l=i.get(c.path);if(l)for(let d of l){let g=Xt(d,c);if(!g)continue;let y={constraintId:u.id,type:g.type,reason:g.reason,candidatePath:d.path,candidate:{op:d.op,value:d.value},existing:{op:c.op,value:c.value}};g.type==="overlap"||g.type==="subset"?o.push(y):s.push(y);}}}return {contradictions:s,warnings:o}},checkOwns(e,t){let n=Array.isArray(t)?t:"constraints"in t&&Array.isArray(t.constraints)?t.constraints:[],r=S(e);if(r.length===0)return {warnings:[]};let i=new Set(r.map(o=>o.path)),s=[];for(let o of n){if(!Fe(o))continue;let u=Array.isArray(o.owns)?o.owns:[],a=Array.isArray(o.bind)?o.bind:[];for(let c of u)i.has(c)&&s.push({constraintId:o.id,candidatePath:c,source:"owns",reason:`Constraint "${o.id}" already owns "${c}" \u2014 candidate would race or shadow its writes.`,severity:"warning"});for(let c of a)i.has(c)&&s.push({constraintId:o.id,candidatePath:c,source:"bind",reason:`Constraint "${o.id}" binds "${c}" \u2014 candidate would write to a bound field.`,severity:"warning"});}return {warnings:s}}};var I=new Map,Yt=50;function Gt(e){let t=I.get(e);if(!t){try{t=new Intl.NumberFormat(e);}catch{t=new Intl.NumberFormat("en-US");}if(I.size>=Yt){let n=I.keys().next().value;n!==void 0&&I.delete(n);}I.set(e,t);}return t}function Vt(e,t={}){let n=t.style??"natural",r=t.parenthesize??true,i=t.locale??"en-US",s=t.factName??(a=>a);if(e===null||typeof e!="object")return "<invalid predicate>";let o={style:n,parenthesize:r,locale:i,factName:s,seen:new WeakSet,cycle:false},u=X(e,o,0);return o.cycle?"<invalid predicate: cycle>":u}var Ie=" AND ",en=" OR ",tn="NOT",Le=" \u2227 ",nn=" \u2228 ",rn="\xAC";function q(e){return typeof e!="object"||e===null||Array.isArray(e)?false:!(e instanceof Date)&&!(e instanceof RegExp)}function on(e){if(!q(e))return false;let t=Object.keys(e);if(t.length===0)return false;for(let n of t)if(!n.startsWith("$"))return false;return true}function X(e,t,n){if(n>chunkT4TRJEJN_cjs.g)return chunk4MNQDXH7_cjs.a&&console.warn(`[Directive] describePredicate: depth limit (${chunkT4TRJEJN_cjs.g}) exceeded \u2014 bailing.`),t.style==="formal"?"\u22A5":"always true";if(Array.isArray(e))return sn(e,t);if(!q(e))return f(e,t);if(t.seen.has(e))return t.cycle=true,"<invalid predicate: cycle>";t.seen.add(e);let r=e,i=Object.keys(r);for(let o of ["$all","$any","$not"])if(o in r)return an(o,r[o],t,n);let s=[];for(let o of i)o.startsWith("$")||s.push(qe(o,r[o],t,n));return Z(s,t)}function sn(e,t,n){let r=[];for(let i of e){if(!q(i))continue;let s=i;typeof s.fact!="string"||typeof s.op!="string"||r.push(L(s.fact,s.op,s.value,t));}return r.length===0?t.style==="formal"?"\u22A4":"always true":Z(r,t)}function an(e,t,n,r){if(e==="$not"){if(q(t)&&Object.keys(t).length===0)return n.style==="formal"?"\u22A5":"never";let o=X(t,n,r+1);return o==="always true"?"never":o==="\u22A4"?"\u22A5":`${n.style==="formal"?rn:`${tn} `}(${o})`}if(!Array.isArray(t))return n.style==="formal"?"\u22A5":"<invalid predicate>";if(t.length===0)return e==="$all"?n.style==="formal"?"\u22A4":"always true":n.style==="formal"?"\u22A5":"never";let i=[];for(let o of t){let u=X(o,n,r+1);i.push(u);}if(i.length===1)return i[0];let s=n.parenthesize?i.map(o=>`(${o})`):i;return e==="$all"?s.join(n.style==="formal"?Le:Ie):s.join(n.style==="formal"?nn:en)}function qe(e,t,n,r){if(on(t)){let i=t,s=Object.keys(i);if(s.length===1)return L(e,s[0],i[s[0]],n);let o=s.map(u=>L(e,u,i[u],n));return Z(o,n)}if(q(t)){let i=t;if("$all"in i||"$any"in i||"$not"in i)return X(t,n,r+1);let o=[];for(let u of Object.keys(i))u.startsWith("$")||o.push(qe(`${e}.${u}`,i[u],n,r+1));return o.length===0?L(e,"$eq",t,n):Z(o,n)}return L(e,"$eq",t,n)}function L(e,t,n,r){let i=r.style==="formal"?e:r.factName(e);return r.style==="formal"?cn(i,t,n,r):un(i,t,n,r)}function un(e,t,n,r){switch(t){case "$eq":return n===null?`${e} is null`:`${e} is ${f(n,r)}`;case "$ne":return n===null?`${e} is not null`:`${e} is not ${f(n,r)}`;case "$gt":return `${e} is more than ${f(n,r)}`;case "$gte":return `${e} is at least ${f(n,r)}`;case "$lt":return `${e} is less than ${f(n,r)}`;case "$lte":return `${e} is at most ${f(n,r)}`;case "$in":return `${e} is one of ${Ne(n,r)}`;case "$nin":return `${e} is not one of ${Ne(n,r)}`;case "$exists":return n===true?`${e} is set`:`${e} is not set`;case "$between":return Array.isArray(n)&&n.length===2?`${e} is between ${f(n[0],r)} and ${f(n[1],r)}`:`${e} is between ${f(n,r)}`;case "$startsWith":return `${e} starts with ${O(n,r,true)}`;case "$endsWith":return `${e} ends with ${O(n,r,true)}`;case "$contains":return `${e} contains ${O(n,r,true)}`;case "$matches":return n instanceof RegExp?`${e} matches ${n.toString()}`:`${e} matches ${f(n,r)}`;case "$changed":return `${e} changed`;default:return chunk4MNQDXH7_cjs.a&&!chunkT4TRJEJN_cjs.a.has(t)&&console.warn(`[Directive] describePredicate: unknown operator "${t}" \u2014 falling through to generic rendering.`),`${e} ${t} ${f(n,r)}`}}function cn(e,t,n,r){switch(t){case "$eq":return `${e} = ${f(n,r)}`;case "$ne":return `${e} \u2260 ${f(n,r)}`;case "$gt":return `${e} > ${f(n,r)}`;case "$gte":return `${e} \u2265 ${f(n,r)}`;case "$lt":return `${e} < ${f(n,r)}`;case "$lte":return `${e} \u2264 ${f(n,r)}`;case "$in":return `${e} \u2208 {${_e(n,r)}}`;case "$nin":return `${e} \u2209 {${_e(n,r)}}`;case "$exists":return n===true?`\u2203 ${e}`:`\u2204 ${e}`;case "$between":return Array.isArray(n)&&n.length===2?`${f(n[0],r)} \u2264 ${e} \u2264 ${f(n[1],r)}`:`${e} \u2208 [${f(n,r)}]`;case "$startsWith":return `${e} ^= ${O(n,r,true)}`;case "$endsWith":return `${e} $= ${O(n,r,true)}`;case "$contains":return `${e} \u2287 ${O(n,r,true)}`;case "$matches":return n instanceof RegExp?`${e} ~ ${n.toString()}`:`${e} ~ ${f(n,r)}`;case "$changed":return `\u0394${e}`;default:return chunk4MNQDXH7_cjs.a&&!chunkT4TRJEJN_cjs.a.has(t)&&console.warn(`[Directive] describePredicate: unknown operator "${t}" \u2014 falling through to generic rendering.`),`${e} ${t} ${f(n,r)}`}}function Y(e){return e.length===0?true:/[\s,"']/.test(e)}function O(e,t,n){return typeof e!="string"||n||Y(e)?JSON.stringify(e):e}function f(e,t){if(e===null)return "null";if(e===void 0)return "undefined";if(typeof e=="boolean")return e?"true":"false";if(typeof e=="number"){if(!Number.isFinite(e))return String(e);try{return Gt(t.locale).format(e)}catch{return String(e)}}if(typeof e=="bigint")return t.style==="formal"?`${e.toString()}n`:e.toString();if(typeof e=="string")return t.style==="formal"||Y(e)?JSON.stringify(e):e;if(e instanceof Date)return e.toISOString();if(e instanceof RegExp)return e.toString();if(Array.isArray(e))return `[${e.map(n=>f(n,t)).join(", ")}]`;if(typeof e=="object")try{return JSON.stringify(e)}catch{return "[object]"}return String(e)}function Ne(e,t){return Array.isArray(e)?e.map(n=>typeof n=="string"?Y(n)?JSON.stringify(n):n:f(n,t)).join(", "):f(e,t)}function _e(e,t){return Array.isArray(e)?e.map(n=>typeof n=="string"?Y(n)?JSON.stringify(n):n:f(n,t)).join(", "):f(e,t)}function Z(e,t){if(e.length===0)return t.style==="formal"?"\u22A4":"always true";if(e.length===1)return e[0];let n=t.style==="formal"?Le:Ie;return t.parenthesize,e.join(n)}var ln=/^[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)?$/;function W(e,t){if(typeof e!="string"||!ln.test(e))throw new Error(`[Directive] predicateToSQL: invalid ${t} identifier "${e}" \u2014 must match /^[A-Za-z_][A-Za-z0-9_]*(\\.[A-Za-z_][A-Za-z0-9_]*)?$/`)}function Be(e,t){if(t&&!t.includes(e))throw new Error(`[Directive] predicateToSQL: column "${e}" is not in the allowedKeys list \u2014 add it to options.allowedKeys or remove it from the predicate`)}function dn(e){if(Array.isArray(e)){if(e.length===0)throw new Error("[Directive] predicateToSQL: select must not be empty");for(let n of e)W(n,"column");return e.join(", ")}let t=e;return t==="*"?"*":(W(t,"column"),t)}function b(e,t){return e.params.push(t),e.placeholder(e.params.length)}function de(e,t,n,r){switch(t){case "$eq":return `${e} = ${b(r,n)}`;case "$ne":return `${e} <> ${b(r,n)}`;case "$gt":return `${e} > ${b(r,n)}`;case "$gte":return `${e} >= ${b(r,n)}`;case "$lt":return `${e} < ${b(r,n)}`;case "$lte":return `${e} <= ${b(r,n)}`;case "$in":if(!Array.isArray(n))throw new Error("[Directive] predicateToSQL: $in operand must be an array");return `${e} = ANY(${b(r,n)})`;case "$nin":if(!Array.isArray(n))throw new Error("[Directive] predicateToSQL: $nin operand must be an array");return `NOT (${e} = ANY(${b(r,n)}))`;case "$exists":return n===true?`${e} IS NOT NULL`:`${e} IS NULL`;case "$between":{if(!Array.isArray(n)||n.length!==2)throw new Error("[Directive] predicateToSQL: $between operand must be a [low, high] tuple");return `${e} BETWEEN ${b(r,n[0])} AND ${b(r,n[1])}`}case "$startsWith":if(typeof n!="string")throw new Error("[Directive] predicateToSQL: $startsWith operand must be a string");return `${e} LIKE ${b(r,fe(n))} || '%' ESCAPE '\\'`;case "$endsWith":if(typeof n!="string")throw new Error("[Directive] predicateToSQL: $endsWith operand must be a string");return `${e} LIKE '%' || ${b(r,fe(n))} ESCAPE '\\'`;case "$contains":if(typeof n!="string")throw new Error("[Directive] predicateToSQL: $contains only supports string operands \u2014 array containment requires a JOIN, not a predicate");return `${e} LIKE '%' || ${b(r,fe(n))} || '%' ESCAPE '\\'`;case "$matches":{if(!(n instanceof RegExp))throw new Error("[Directive] predicateToSQL: $matches operand must be a RegExp");let i=n.flags.includes("i")?"~*":"~";return `${e} ${i} ${b(r,n.source)}`}case "$changed":throw new Error('[Directive] predicateToSQL: $changed is an effects-only operator \u2014 no server-side translation (a database row has no "prev" snapshot)');default:throw new Error(`[Directive] predicateToSQL: unknown operator "${t}" \u2014 known: ${[...chunkT4TRJEJN_cjs.a].join(", ")}`)}}function fe(e){return e.replace(/[\\%_]/g,"\\$&")}function We(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function fn(e){if(!We(e))return false;let t=Object.keys(e);if(t.length===0)return false;for(let n of t)if(!n.startsWith("$"))return false;return true}function pe(e,t){let n=Object.keys(e).filter(r=>r!==t);if(n.length>0)throw new Error(`[Directive] predicateToSQL: ${t} cannot coexist with sibling keys (${n.join(", ")}) \u2014 wrap them in $all together, or move them inside the ${t} children`)}function B(e,t,n){if(n>chunkT4TRJEJN_cjs.g)throw new Error(`[Directive] predicateToSQL: predicate depth limit (${chunkT4TRJEJN_cjs.g}) exceeded \u2014 flatten the predicate or check for a cyclic spec object`);if(e===null||typeof e!="object")throw new Error(`[Directive] predicateToSQL: predicate must be an object or array, got ${typeof e}`);if(Array.isArray(e)){if(e.length===0)return "TRUE";let i=e.map(s=>{if(!s||typeof s!="object"||!("fact"in s)||!("op"in s))throw new Error("[Directive] predicateToSQL: array-form clause must be { fact, op, value }");let o=s;return W(o.fact,"column"),Be(o.fact,t.allowed),de(o.fact,o.op,o.value,t)});return i.length===1?i[0]:`(${i.join(" AND ")})`}if("$all"in e){pe(e,"$all");let i=e.$all;if(!Array.isArray(i))throw new Error("[Directive] predicateToSQL: $all must be an array");if(i.length===0)return "TRUE";let s=i.map(o=>B(o,t,n+1));return s.length===1?s[0]:`(${s.join(" AND ")})`}if("$any"in e){pe(e,"$any");let i=e.$any;if(!Array.isArray(i))throw new Error("[Directive] predicateToSQL: $any must be an array");if(i.length===0)return "FALSE";let s=i.map(o=>B(o,t,n+1));return s.length===1?s[0]:`(${s.join(" OR ")})`}if("$not"in e){pe(e,"$not");let i=e.$not;return `NOT (${B(i,t,n+1)})`}let r=[];for(let[i,s]of Object.entries(e))if(W(i,"column"),Be(i,t.allowed),fn(s))for(let[o,u]of Object.entries(s)){if(!chunkT4TRJEJN_cjs.a.has(o))throw new Error(`[Directive] predicateToSQL: unknown operator "${o}" on column "${i}" \u2014 known: ${[...chunkT4TRJEJN_cjs.a].join(", ")}`);r.push(de(i,o,u,t));}else {if(We(s))throw new Error(`[Directive] predicateToSQL: nested predicate at "${i}" \u2014 cross-module / partial-match predicates have no SQL equivalent (single-table queries only in v1; pass a flat predicate or build JOIN by hand with predicateToWhere)`);r.push(de(i,"$eq",s,t));}return r.length===0?"TRUE":r.length===1?r[0]:`(${r.join(" AND ")})`}var Ue=e=>`$${e}`;function pn(e,t){let{table:n,allowedKeys:r}=t,i=t.placeholder??Ue,s=t.select??"*";W(n,"table");let o=dn(s),u={params:[],placeholder:i,allowed:r},a=B(e,u,0);return {sql:`SELECT ${o} FROM ${n} WHERE ${a}`,where:a,params:u.params}}function gn(e,t={}){let n=t.placeholder??Ue,r={params:[],placeholder:n,allowed:t.allowedKeys};return {where:B(e,r,0),params:r.params}}function ge(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function he(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function yn(e){if(!he(e))return false;let t=Object.keys(e);if(t.length===0)return false;for(let n of t)if(!n.startsWith("$"))return false;return true}var hn=/^[A-Za-z_][A-Za-z0-9_]*$/,mn=/^[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*$/;function Ke(e,t){if(typeof e!="string"||e.length===0)throw new Error(`[Directive] predicateToMongo: field name must be a non-empty string, got ${typeof e}`);if(e.startsWith("$"))throw new Error(`[Directive] predicateToMongo: field name "${e}" starts with "$" \u2014 reserved for Mongo operators (a top-level $where would be an injection vector)`);if(!(t.allowDottedPaths?mn:hn).test(e))throw new Error(`[Directive] predicateToMongo: invalid field name "${e}"${t.allowDottedPaths?"":' \u2014 pass options.allowDottedPaths=true to permit sub-document paths like "user.role"'}`)}function ze(e,t){if(t&&!t.includes(e))throw new Error(`[Directive] predicateToMongo: field "${e}" is not in the allowedKeys list \u2014 add it to options.allowedKeys or remove it from the predicate`)}function ye(e,t){let n=Object.keys(e).filter(r=>r!==t);if(n.length>0)throw new Error(`[Directive] predicateToMongo: ${t} cannot coexist with sibling keys (${n.join(", ")}) \u2014 wrap them in $all together, or move them inside the ${t} children`)}function He(e,t){switch(e){case "$eq":case "$ne":case "$gt":case "$gte":case "$lt":case "$lte":case "$in":case "$nin":case "$exists":return {[e]:t};case "$between":{if(!Array.isArray(t)||t.length!==2)throw new Error("[Directive] predicateToMongo: $between operand must be a [low, high] tuple");return {$gte:t[0],$lte:t[1]}}case "$startsWith":if(typeof t!="string")throw new Error("[Directive] predicateToMongo: $startsWith operand must be a string");return {$regex:`^${ge(t)}`};case "$endsWith":if(typeof t!="string")throw new Error("[Directive] predicateToMongo: $endsWith operand must be a string");return {$regex:`${ge(t)}$`};case "$contains":if(typeof t=="string")return {$regex:ge(t)};throw new Error("[Directive] predicateToMongo: $contains in Mongo expects a string operand \u2014 for array element membership use $elemMatch or $in directly");case "$matches":{if(t instanceof RegExp)return t.flags?{$regex:t.source,$options:t.flags}:{$regex:t.source};if(typeof t=="string")return {$regex:t};throw new Error("[Directive] predicateToMongo: $matches operand must be a RegExp or string")}case "$changed":throw new Error("[Directive] predicateToMongo: $changed is an effects-only operator \u2014 no MongoDB query equivalent");default:throw new Error(`[Directive] predicateToMongo: unknown operator "${e}" \u2014 known: ${[...chunkT4TRJEJN_cjs.a].join(", ")}`)}}function j(e,t,n){if(n>chunkT4TRJEJN_cjs.g)throw new Error(`[Directive] predicateToMongo: predicate depth limit (${chunkT4TRJEJN_cjs.g}) exceeded \u2014 flatten the predicate or check for a cyclic spec object`);if(e===null||typeof e!="object")throw new Error(`[Directive] predicateToMongo: predicate must be an object or array, got ${typeof e}`);if(Array.isArray(e)){if(e.length===0)return {};let i={},s=[];for(let o of e){if(!o||typeof o!="object"||!("fact"in o)||!("op"in o))throw new Error("[Directive] predicateToMongo: array-form clause must be { fact, op, value }");let u=o;Ke(u.fact,t),ze(u.fact,t.allowedKeys);let a=He(u.op,u.value);if(u.fact in i&&he(i[u.fact])){let c=i[u.fact];Object.keys(a).some(d=>d in c)?s.push({[u.fact]:a}):i[u.fact]={...c,...a};}else u.fact in i?s.push({[u.fact]:a}):i[u.fact]=a;}if(s.length>0){let o=[];for(let[u,a]of Object.entries(i))o.push({[u]:a});return o.push(...s),{$and:o}}return i}if("$all"in e){ye(e,"$all");let i=e.$all;if(!Array.isArray(i))throw new Error("[Directive] predicateToMongo: $all must be an array");return i.length===0?{}:i.length===1?j(i[0],t,n+1):{$and:i.map(s=>j(s,t,n+1))}}if("$any"in e){ye(e,"$any");let i=e.$any;if(!Array.isArray(i))throw new Error("[Directive] predicateToMongo: $any must be an array");return i.length===0?{$expr:{$eq:[1,0]}}:i.length===1?j(i[0],t,n+1):{$or:i.map(s=>j(s,t,n+1))}}if("$not"in e){ye(e,"$not");let i=e.$not;return {$nor:[j(i,t,n+1)]}}let r={};for(let[i,s]of Object.entries(e))if(Ke(i,t),ze(i,t.allowedKeys),yn(s)){let o={};for(let[u,a]of Object.entries(s)){if(!chunkT4TRJEJN_cjs.a.has(u))throw new Error(`[Directive] predicateToMongo: unknown operator "${u}" on field "${i}" \u2014 known: ${[...chunkT4TRJEJN_cjs.a].join(", ")}`);Object.assign(o,He(u,a));}r[i]=o;}else r[i]=s;return r}function $n(e,t={}){return j(e,t,0)}var wn=/^[A-Za-z_][A-Za-z0-9_]*$/;function Je(e,t){if(typeof e!="string"||!wn.test(e))throw new Error(`[Directive] predicateToPostgrest: invalid column identifier "${e}"`);if(t&&!t.includes(e))throw new Error(`[Directive] predicateToPostgrest: column "${e}" is not in the allowedKeys list \u2014 add it to options.allowedKeys or remove it from the predicate`)}function me(e,t){let n=Object.keys(e).filter(r=>r!==t);if(n.length>0)throw new Error(`[Directive] predicateToPostgrest: ${t} cannot coexist with sibling keys (${n.join(", ")}) \u2014 wrap them in $all together, or move them inside the ${t} children`)}function k(e){if(e==null)return "null";if(typeof e=="boolean")return e?"true":"false";if(typeof e=="number"||typeof e=="bigint")return String(e);if(e instanceof Date)return e.toISOString();if(typeof e=="string")return /[,.():"\\\s]/.test(e)?`"${e.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`:e;throw new Error(`[Directive] predicateToPostgrest: cannot encode value of type ${typeof e}`)}function Qe(e){return `(${e.map(k).join(",")})`}function $e(e){return e.replace(/[\\%_*]/g,"\\$&")}function P(e,t){switch(e){case "$eq":return `eq.${k(t)}`;case "$ne":return `neq.${k(t)}`;case "$gt":return `gt.${k(t)}`;case "$gte":return `gte.${k(t)}`;case "$lt":return `lt.${k(t)}`;case "$lte":return `lte.${k(t)}`;case "$in":if(!Array.isArray(t))throw new Error("[Directive] predicateToPostgrest: $in operand must be an array");return `in.${Qe(t)}`;case "$nin":if(!Array.isArray(t))throw new Error("[Directive] predicateToPostgrest: $nin operand must be an array");return `not.in.${Qe(t)}`;case "$exists":return t===true?"not.is.null":"is.null";case "$startsWith":if(typeof t!="string")throw new Error("[Directive] predicateToPostgrest: $startsWith operand must be a string");return `like.${k($e(t)+"*")}`;case "$endsWith":if(typeof t!="string")throw new Error("[Directive] predicateToPostgrest: $endsWith operand must be a string");return `like.${k("*"+$e(t))}`;case "$contains":if(typeof t!="string")throw new Error("[Directive] predicateToPostgrest: $contains expects a string operand (array containment is the cs operator with a different shape \u2014 out of scope for v1)");return `like.${k("*"+$e(t)+"*")}`;case "$matches":if(t instanceof RegExp)return `${t.flags.includes("i")?"imatch":"match"}.${k(t.source)}`;if(typeof t=="string")return `match.${k(t)}`;throw new Error("[Directive] predicateToPostgrest: $matches operand must be a RegExp or string");case "$changed":throw new Error("[Directive] predicateToPostgrest: $changed is an effects-only operator \u2014 no server query equivalent");default:throw new Error(`[Directive] predicateToPostgrest: unknown operator "${e}" \u2014 known: ${[...chunkT4TRJEJN_cjs.a].join(", ")}`)}}function Xe(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function bn(e){if(!Xe(e))return false;let t=Object.keys(e);if(t.length===0)return false;for(let n of t)if(!n.startsWith("$"))return false;return true}function we(e,t){return `${e}=${t}`}function G(e,t){return `${e}=(${t.join(",")})`}function be(e,t,n,r){if(t==="$between"){if(!Array.isArray(n)||n.length!==2)throw new Error("[Directive] predicateToPostgrest: $between operand must be a [low, high] tuple");let i=r?we(e,P("$gte",n[0])):`${e}.${P("$gte",n[0])}`,s=r?we(e,P("$lte",n[1])):`${e}.${P("$lte",n[1])}`;return [i,s]}return [r?we(e,P(t,n)):`${e}.${P(t,n)}`]}function U(e,t,n,r){if(r>chunkT4TRJEJN_cjs.g)throw new Error(`[Directive] predicateToPostgrest: predicate depth limit (${chunkT4TRJEJN_cjs.g}) exceeded \u2014 flatten the predicate or check for a cyclic spec object`);if(e===null||typeof e!="object")throw new Error("[Directive] predicateToPostgrest: predicate must be an object or array");if(Array.isArray(e)){let s=[];for(let o of e){if(!o||typeof o!="object"||!("fact"in o)||!("op"in o))throw new Error("[Directive] predicateToPostgrest: array-form clause must be { fact, op, value }");let u=o;Je(u.fact,t),s.push(...be(u.fact,u.op,u.value,n));}return s}if("$all"in e){me(e,"$all");let s=e.$all;if(!Array.isArray(s))throw new Error("[Directive] predicateToPostgrest: $all must be an array");if(n){let u=[];for(let a of s)u.push(...U(a,t,true,r+1));return u}let o=[];for(let u of s)o.push(...U(u,t,false,r+1));return [G("and",o)]}if("$any"in e){me(e,"$any");let s=e.$any;if(!Array.isArray(s))throw new Error("[Directive] predicateToPostgrest: $any must be an array");if(s.length===0)return n?["id=is.null","id=not.is.null"]:[G("and",["id.is.null","id.not.is.null"])];let o=[];for(let u of s)o.push(...U(u,t,false,r+1));return [G("or",o)]}if("$not"in e){me(e,"$not");let s=e.$not,o=U(s,t,false,r+1);return [G("not.and",o)]}let i=[];for(let[s,o]of Object.entries(e))if(Je(s,t),bn(o))for(let[u,a]of Object.entries(o)){if(!chunkT4TRJEJN_cjs.a.has(u))throw new Error(`[Directive] predicateToPostgrest: unknown operator "${u}" on column "${s}" \u2014 known: ${[...chunkT4TRJEJN_cjs.a].join(", ")}`);i.push(...be(s,u,a,n));}else {if(Xe(o))throw new Error(`[Directive] predicateToPostgrest: nested predicate at "${s}" \u2014 single-table queries only`);i.push(...be(s,"$eq",o,n));}return i}function Sn(e){let t=e.indexOf("=");if(t<0)return encodeURIComponent(e);let n=e.slice(0,t),r=e.slice(t+1);return `${n}=${encodeURIComponent(r)}`}function Tn(e,t={}){let n=t.mode??"querystring",r=U(e,t.allowedKeys,true,0);return r.length===0?"":n==="raw"?r.join("&"):r.map(Sn).join("&")}function V(e=[],t,n,r,i,s,o){return {_type:void 0,_validators:e,_typeName:t,_default:n,_transform:r,_description:i,_refinements:s,_meta:o,validate(u){return V([...e,u],t,n,r,i,s,o)}}}function p(e,t,n,r,i,s,o){return {...V(e,t,n,r,i,s,o),default(a){return p(e,t,a,r,i,s,o)},transform(a){return p([],t,void 0,l=>{let d=r?r(l):l;return a(d)},i,void 0,o)},brand(){return p(e,`Branded<${t}>`,n,r,i,s,o)},describe(a){return p(e,t,n,r,a,s,o)},refine(a,c){let l=[...s??[],{predicate:a,message:c}];return p([...e,a],t,n,r,i,l,o)},nullable(){return p([a=>a===null||e.every(c=>c(a))],`${t} | null`,n,r,i,void 0,o)},optional(){return p([a=>a===void 0||e.every(c=>c(a))],`${t} | undefined`,n,r,i,void 0,o)},meta(a){return p(e,t,n,r,i,s,a)}}}var kn=((...e)=>{if(e.length===0)return p([],"union");let t=e.map(n=>n._typeName??"unknown");return p([n=>e.some(r=>r._validators.every(i=>i(n)))],t.join(" | "))}),vn={string(){let e=(t,n,r,i,s,o)=>({...p(t,"string",n,r,i,s,o),minLength(a){return e([...t,c=>c.length>=a],n,r,i,s,o)},maxLength(a){return e([...t,c=>c.length<=a],n,r,i,s,o)},pattern(a){return e([...t,c=>a.test(c)],n,r,i,s,o)},default(a){return e(t,a,r,i,s,o)},describe(a){return e(t,n,r,a,s,o)},refine(a,c){let l=[...s??[],{predicate:a,message:c}];return e([...t,a],n,r,i,l,o)},meta(a){return e(t,n,r,i,s,a)}});return e([t=>typeof t=="string"])},number(){let e=(t,n,r,i,s,o)=>({...p(t,"number",n,r,i,s,o),min(a){return e([...t,c=>c>=a],n,r,i,s,o)},max(a){return e([...t,c=>c<=a],n,r,i,s,o)},default(a){return e(t,a,r,i,s,o)},describe(a){return e(t,n,r,a,s,o)},refine(a,c){let l=[...s??[],{predicate:a,message:c}];return e([...t,a],n,r,i,l,o)},meta(a){return e(t,n,r,i,s,a)}});return e([t=>typeof t=="number"])},boolean(){return p([e=>typeof e=="boolean"],"boolean")},array(){let e=(t,n,r,i,s,o)=>{let u=p(t,"array",r,void 0,i,void 0,o),a=s??{value:-1};return {...u,get _lastFailedIndex(){return a.value},set _lastFailedIndex(l){a.value=l;},of(l){let d={value:-1};return e([...t,g=>{for(let y=0;y<g.length;y++)if(!l._validators.every($=>$(g[y])))return d.value=y,false;return true}],l,r,i,d,o)},nonEmpty(){return e([...t,l=>l.length>0],n,r,i,a,o)},maxLength(l){return e([...t,d=>d.length<=l],n,r,i,a,o)},minLength(l){return e([...t,d=>d.length>=l],n,r,i,a,o)},default(l){return e(t,n,l,i,a,o)},describe(l){return e(t,n,r,l,a,o)},meta(l){return e(t,n,r,i,a,l)}}};return e([t=>Array.isArray(t)])},object(){let e=(t,n,r,i)=>({...p(t,"object",n,void 0,r,void 0,i),shape(o){return e([...t,u=>{for(let[a,c]of Object.entries(o)){let l=u[a],d=c;if(d&&!d._validators.every(g=>g(l)))return false}return true}],n,r,i)},nonNull(){return e([...t,o=>o!=null],n,r,i)},hasKeys(...o){return e([...t,u=>o.every(a=>a in u)],n,r,i)},default(o){return e(t,o,r,i)},describe(o){return e(t,n,o,i)},meta(o){return e(t,n,r,o)}});return e([t=>typeof t=="object"&&t!==null&&!Array.isArray(t)])},enum(...e){chunk4MNQDXH7_cjs.a&&e.length===0&&console.warn("[Directive] t.enum() called with no values - this will reject all strings");let t=new Set(e);return p([n=>typeof n=="string"&&t.has(n)],`enum(${e.join("|")})`)},literal(e){return p([t=>t===e],`literal(${String(e)})`)},nullable(e){let t=e._typeName??"unknown";return V([n=>n===null?true:e._validators.every(r=>r(n))],`${t} | null`)},optional(e){let t=e._typeName??"unknown";return V([n=>n===void 0?true:e._validators.every(r=>r(n))],`${t} | undefined`)},union:kn,record(e){let t=e._typeName??"unknown";return p([n=>typeof n!="object"||n===null||Array.isArray(n)?false:Object.values(n).every(r=>e._validators.every(i=>i(r)))],`Record<string, ${t}>`)},tuple(...e){chunk4MNQDXH7_cjs.a&&e.length===0&&console.warn("[Directive] t.tuple() called with no types - this will only accept empty arrays");let t=e.map(n=>n._typeName??"unknown");return p([n=>!Array.isArray(n)||n.length!==e.length?false:e.every((r,i)=>r._validators.every(s=>s(n[i])))],`[${t.join(", ")}]`)},date(){return p([e=>e instanceof Date&&!Number.isNaN(e.getTime())],"Date")},uuid(){let e=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;return p([t=>typeof t=="string"&&e.test(t)],"uuid")},email(){let e=/^[^\s@]+@[^\s@]+\.[^\s@]+$/;return p([t=>typeof t=="string"&&e.test(t)],"email")},url(){return p([e=>{if(typeof e!="string")return false;try{return new URL(e),!0}catch{return false}}],"url")},bigint(){return p([e=>typeof e=="bigint"],"bigint")},any(){return p([],"any")},unknown(){return p([],"unknown")}};function Mn(e){if(!e||typeof e!="string"){console.warn("[Directive] Module ID must be a non-empty string");return}/^(__[a-z][a-z0-9_-]*|[a-z][a-z0-9-]*)$/i.test(e)||console.warn(`[Directive] Module ID "${e}" should follow kebab-case convention (e.g., "my-module")`);}function Ze(e,t,n,r,i){for(let s of e)t.has(s)||console.warn(`[Directive] ${n} "${s}" not declared in ${r}`);for(let s of t)e.has(s)||console.warn(`[Directive] ${r}["${s}"] ${i}`);}function Rn(e,t){e.length===0&&console.warn("[Directive] history.snapshotEvents is an empty array \u2014 no events will create history snapshots. Omit history.snapshotEvents entirely to snapshot all events, or list specific events.");let n=new Set(Object.keys(t));for(let r of e)n.has(r)||console.warn(`[Directive] history.snapshotEvents entry "${r}" not declared in schema.events. Available events: ${[...n].join(", ")||"(none)"}`);}function An(e,t){let n=new Set(Object.keys(t));for(let[r,i]of Object.entries(e)){let s=i;typeof s.requirement=="string"&&!n.has(s.requirement)&&console.warn(`[Directive] Resolver "${r}" references unknown requirement type "${s.requirement}". Available types: ${[...n].join(", ")||"(none)"}`);}}function Dn(e,t){let n=t.schema?.facts??{},r=Object.keys(n);if(r.length===0)return;let i=new Set(["self","prev","current"]),s="crossModuleDeps"in t&&t.crossModuleDeps?Object.keys(t.crossModuleDeps):[];for(let o of s)i.add(o);for(let o of r)if(i.has(o))throw new Error(`[Directive] module '${e}': fact key '${o}' conflicts with a reserved namespace pivot or evaluation alias (self / prev / current / a crossModuleDep namespace). Three fixes:
1. Rename the fact (e.g. ${o}_)
2. Remove '${o}' from this module's crossModuleDeps if it's not actually needed
3. Move the fact under a wrapping namespace (t.object({ inner: ... }))`)}function Cn(e,t){let n=t.constraints;if(n)for(let[r,i]of Object.entries(n)){let s=i?.owns;if(s){for(let o of s)if(chunkX7G7UBXU_cjs.k.has(o)||o.startsWith("$"))throw new Error(`[Directive] module '${e}' constraint '${r}': owns key '${o}' is reserved (BLOCKED_PROPS or $-prefixed)`)}}}function En(e,t){Mn(e),t.schema?t.schema.facts||console.warn("[Directive] Module schema.facts is required"):console.warn("[Directive] Module schema is required"),Ze(new Set(Object.keys(t.derive??{})),new Set(Object.keys(t.schema?.derivations??{})),"Derivation","schema.derivations","has no matching implementation in derive"),Ze(new Set(Object.keys(t.events??{})),new Set(Object.keys(t.schema?.events??{})),"Event","schema.events","has no matching handler in events"),t.history?.snapshotEvents&&Rn(t.history.snapshotEvents,t.schema?.events??{}),t.resolvers&&t.schema?.requirements&&An(t.resolvers,t.schema.requirements);}function Ye(e,t){Dn(e,t),Cn(e,t),chunk4MNQDXH7_cjs.a&&En(e,t);let n="crossModuleDeps"in t?t.crossModuleDeps:void 0;return {id:e,schema:t.schema,init:t.init,derive:t.derive??{},events:t.events??{},effects:t.effects,constraints:t.constraints,resolvers:t.resolvers,hooks:t.hooks,meta:t.meta,history:t.history,crossModuleDeps:n}}function xn(e){return t=>Ye(t,e)}function Se(){let e={pending:new Map,inflight:new Map,failed:new Map,errors:new Map,listeners:new Set};function t(){for(let a of e.listeners)a();}function n(a,c){let l=a.get(c);return l||(l=new Set,a.set(c,l)),l}function r(a){let c=e.pending.get(a)??new Set,l=e.inflight.get(a)??new Set,d=e.failed.get(a)??new Set,g=e.errors.get(a)??null;return {pending:c.size,inflight:l.size,failed:d.size,isLoading:c.size>0||l.size>0,hasError:d.size>0,lastError:g}}function i(){let a=new Set([...e.pending.keys(),...e.inflight.keys(),...e.failed.keys()]),c=new Map;for(let l of a)c.set(l,r(l));return c}function s(a){return e.listeners.add(a),()=>e.listeners.delete(a)}function o(){e.pending.clear(),e.inflight.clear(),e.failed.clear(),e.errors.clear(),t();}return {plugin:{name:"requirement-status",onRequirementCreated(a){let c=a.requirement.type;n(e.pending,c).add(a.id),e.failed.get(c)?.delete(a.id),t();},onResolverStart(a,c){let l=c.requirement.type;e.pending.get(l)?.delete(c.id),n(e.inflight,l).add(c.id),t();},onResolverComplete(a,c){let l=c.requirement.type;e.inflight.get(l)?.delete(c.id),e.pending.get(l)?.delete(c.id),t();},onResolverError(a,c,l){let d=c.requirement.type;e.inflight.get(d)?.delete(c.id),n(e.failed,d).add(c.id),e.errors.set(d,l instanceof Error?l:new Error(String(l))),t();},onResolverCancel(a,c){let l=c.requirement.type;e.pending.get(l)?.delete(c.id),e.inflight.get(l)?.delete(c.id),t();},onRequirementMet(a){let c=a.requirement.type;e.pending.get(c)?.delete(a.id),e.inflight.get(c)?.delete(a.id),t();}},getStatus:r,getAllStatus:i,subscribe:s,reset:o}}function On(e){return t=>e.getStatus(t)}function jn(e){let t=Se(),r=[...e.plugins??[],t.plugin];return {system:chunkNPX5EKPP_cjs.a({module:e.module,plugins:r,trace:e.trace,errorBoundary:e.errorBoundary,tickMs:e.tickMs,zeroConfig:e.zeroConfig,initialFacts:e.initialFacts}),statusPlugin:t}}function Ge(){return {now:()=>Date.now(),setTimeout:(e,t)=>{let n=globalThis.setTimeout(e,t);return ()=>globalThis.clearTimeout(n)}}}function Pn(e=0){let t=e,n=0,r=[];return {now:()=>t,setTimeout:(i,s)=>{let o={id:n++,deadlineMs:t+s,cb:i,canceled:false};return r.push(o),()=>{o.canceled=true;}},advanceBy:i=>{let s=t+i;for(;;){let o=r.filter(a=>!a.canceled&&a.deadlineMs<=s).sort((a,c)=>a.deadlineMs!==c.deadlineMs?a.deadlineMs-c.deadlineMs:a.id-c.id);if(o.length===0)break;let u=o[0];t=Math.max(t,u.deadlineMs),u.canceled=true,u.cb();}t=Math.max(t,s);}}}function Fn(){return Ge()}function Te(){return {startedAtMs:null,pausedDurationMs:0,pausedAtMs:null,status:"idle",repeats:0}}function ee(e,t){return e.startedAtMs===null?0:e.status==="paused"&&e.pausedAtMs!==null?Math.max(0,e.pausedAtMs-e.startedAtMs-e.pausedDurationMs):Math.max(0,t-e.startedAtMs-e.pausedDurationMs)}function Ve(e,t,n){return Math.max(0,n-ee(e,t))}function et(e,t){return e.status==="running"||e.status==="paused"?e:{...e,startedAtMs:t,pausedDurationMs:0,pausedAtMs:null,status:"running",repeats:0}}function tt(e,t){return e.status!=="running"?e:{...e,pausedAtMs:t,status:"paused"}}function nt(e,t){if(e.status!=="paused"||e.pausedAtMs===null)return e;let n=Math.max(0,t-e.pausedAtMs);return {...e,pausedDurationMs:e.pausedDurationMs+n,pausedAtMs:null,status:"running"}}function rt(){return Te()}function it(e){return {...e,status:"completed"}}function ot(e,t){return e.startedAtMs===null||e.status==="paused"?e:{...e,startedAtMs:e.startedAtMs+t,pausedDurationMs:0,pausedAtMs:null,repeats:e.repeats+1}}function st(e,t,n){if(e.status!=="running")return {kind:"no-op"};let r=ee(e,t);return n.mode==="up"?{kind:"no-op"}:n.mode==="repeat"?r>=n.ms?{kind:"repeat"}:{kind:"no-op"}:r>=n.ms?{kind:"complete"}:{kind:"no-op"}}function Nn(e){return {initial:Te,start:et,pause:tt,resume:nt,reset:rt,complete:it,registerRepeat:t=>ot(t,e.ms),tick:(t,n)=>st(t,n,e),elapsedMs:ee,remainingMs:(t,n)=>Ve(t,n,e.ms)}}var Sr={None:"none",Linear:"linear",Exponential:"exponential"};Object.defineProperty(exports,"createAuditLedger",{enumerable:true,get:function(){return chunkIXRS4LM4_cjs.b}});Object.defineProperty(exports,"memorySink",{enumerable:true,get:function(){return chunkIXRS4LM4_cjs.a}});Object.defineProperty(exports,"createSystem",{enumerable:true,get:function(){return chunkNPX5EKPP_cjs.a}});Object.defineProperty(exports,"DirectiveError",{enumerable:true,get:function(){return chunkENZEHIL7_cjs.b}});Object.defineProperty(exports,"RequirementSet",{enumerable:true,get:function(){return chunkENZEHIL7_cjs.o}});Object.defineProperty(exports,"forType",{enumerable:true,get:function(){return chunkENZEHIL7_cjs.n}});Object.defineProperty(exports,"generateRequirementId",{enumerable:true,get:function(){return chunkENZEHIL7_cjs.k}});Object.defineProperty(exports,"isNamespacedSystem",{enumerable:true,get:function(){return chunkENZEHIL7_cjs.h}});Object.defineProperty(exports,"isRequirementType",{enumerable:true,get:function(){return chunkENZEHIL7_cjs.m}});Object.defineProperty(exports,"isSingleModuleSystem",{enumerable:true,get:function(){return chunkENZEHIL7_cjs.g}});Object.defineProperty(exports,"req",{enumerable:true,get:function(){return chunkENZEHIL7_cjs.l}});Object.defineProperty(exports,"typedConstraint",{enumerable:true,get:function(){return chunkENZEHIL7_cjs.e}});Object.defineProperty(exports,"typedResolver",{enumerable:true,get:function(){return chunkENZEHIL7_cjs.f}});Object.defineProperty(exports,"applyPatch",{enumerable:true,get:function(){return chunkT4TRJEJN_cjs.v}});Object.defineProperty(exports,"evaluateKeySelector",{enumerable:true,get:function(){return chunkT4TRJEJN_cjs.u}});Object.defineProperty(exports,"evaluatePredicate",{enumerable:true,get:function(){return chunkT4TRJEJN_cjs.o}});Object.defineProperty(exports,"evaluatePredicateExplained",{enumerable:true,get:function(){return chunkT4TRJEJN_cjs.p}});Object.defineProperty(exports,"evaluateTemplate",{enumerable:true,get:function(){return chunkT4TRJEJN_cjs.s}});Object.defineProperty(exports,"extractDeps",{enumerable:true,get:function(){return chunkT4TRJEJN_cjs.r}});Object.defineProperty(exports,"extractTemplateKeys",{enumerable:true,get:function(){return chunkT4TRJEJN_cjs.t}});Object.defineProperty(exports,"getKind",{enumerable:true,get:function(){return chunkT4TRJEJN_cjs.c}});Object.defineProperty(exports,"getOperatorsForKind",{enumerable:true,get:function(){return chunkT4TRJEJN_cjs.e}});Object.defineProperty(exports,"getSchemaFieldKinds",{enumerable:true,get:function(){return chunkT4TRJEJN_cjs.d}});Object.defineProperty(exports,"isPredicate",{enumerable:true,get:function(){return chunkT4TRJEJN_cjs.h}});Object.defineProperty(exports,"isTemplate",{enumerable:true,get:function(){return chunkT4TRJEJN_cjs.k}});Object.defineProperty(exports,"listAllPredicateOperators",{enumerable:true,get:function(){return chunkT4TRJEJN_cjs.f}});Object.defineProperty(exports,"memoizePredicate",{enumerable:true,get:function(){return chunkT4TRJEJN_cjs.q}});Object.defineProperty(exports,"validatePredicate",{enumerable:true,get:function(){return chunkT4TRJEJN_cjs.l}});Object.defineProperty(exports,"validatePredicateAgainstSchema",{enumerable:true,get:function(){return chunkT4TRJEJN_cjs.n}});Object.defineProperty(exports,"diffSnapshots",{enumerable:true,get:function(){return chunk4MNQDXH7_cjs.k}});Object.defineProperty(exports,"isSignedSnapshot",{enumerable:true,get:function(){return chunk4MNQDXH7_cjs.l}});Object.defineProperty(exports,"isSnapshotExpired",{enumerable:true,get:function(){return chunk4MNQDXH7_cjs.i}});Object.defineProperty(exports,"shallowEqual",{enumerable:true,get:function(){return chunk4MNQDXH7_cjs.g}});Object.defineProperty(exports,"signSnapshot",{enumerable:true,get:function(){return chunk4MNQDXH7_cjs.m}});Object.defineProperty(exports,"validateSnapshot",{enumerable:true,get:function(){return chunk4MNQDXH7_cjs.j}});Object.defineProperty(exports,"verifySnapshotSignature",{enumerable:true,get:function(){return chunk4MNQDXH7_cjs.n}});exports.Backoff=Sr;exports.MAX_REPLAY_FRAMES=C;exports.MAX_SWEEP_POINTS=ae;exports.completeTimer=it;exports.createModule=Ye;exports.createModuleFactory=xn;exports.createRequirementStatusPlugin=Se;exports.createStatusHook=On;exports.createSystemWithStatus=jn;exports.defaultClock=Fn;exports.describePredicate=Vt;exports.diffClauses=Oe;exports.diffRules=zt;exports.doctor=Zt;exports.elapsedMs=ee;exports.flattenPredicate=S;exports.framesFromHistory=De;exports.framesFromSnapshots=se;exports.initialTimerState=Te;exports.pauseTimer=tt;exports.predicateHash=Ht;exports.predicateToMongo=$n;exports.predicateToPostgrest=Tn;exports.predicateToSQL=pn;exports.predicateToWhere=gn;exports.predict=Qt;exports.realClock=Ge;exports.registerRepeat=ot;exports.remainingMs=Ve;exports.replayUnder=H;exports.resetTimer=rt;exports.resumeTimer=nt;exports.startTimer=et;exports.sweepUnder=qt;exports.t=vn;exports.tickTimer=st;exports.timerOps=Nn;exports.toReplayFrames=Ae;exports.toRulesMap=ce;exports.virtualClock=Pn;//# sourceMappingURL=index.cjs.map
3. Move the fact under a wrapping namespace (t.object({ inner: ... }))`)}function Cn(e,t){let n=t.constraints;if(n)for(let[r,i]of Object.entries(n)){let s=i?.owns;if(s){for(let o of s)if(chunkX7G7UBXU_cjs.k.has(o)||o.startsWith("$"))throw new Error(`[Directive] module '${e}' constraint '${r}': owns key '${o}' is reserved (BLOCKED_PROPS or $-prefixed)`)}}}function En(e,t){Mn(e),t.schema?t.schema.facts||console.warn("[Directive] Module schema.facts is required"):console.warn("[Directive] Module schema is required"),Ze(new Set(Object.keys(t.derive??{})),new Set(Object.keys(t.schema?.derivations??{})),"Derivation","schema.derivations","has no matching implementation in derive"),Ze(new Set(Object.keys(t.events??{})),new Set(Object.keys(t.schema?.events??{})),"Event","schema.events","has no matching handler in events"),t.history?.snapshotEvents&&Rn(t.history.snapshotEvents,t.schema?.events??{}),t.resolvers&&t.schema?.requirements&&An(t.resolvers,t.schema.requirements);}function Ye(e,t){Dn(e,t),Cn(e,t),chunk4MNQDXH7_cjs.a&&En(e,t);let n="crossModuleDeps"in t?t.crossModuleDeps:void 0;return {id:e,schema:t.schema,init:t.init,derive:t.derive??{},events:t.events??{},effects:t.effects,constraints:t.constraints,resolvers:t.resolvers,hooks:t.hooks,meta:t.meta,history:t.history,crossModuleDeps:n}}function xn(e){return t=>Ye(t,e)}function Se(){let e={pending:new Map,inflight:new Map,failed:new Map,errors:new Map,listeners:new Set};function t(){for(let a of e.listeners)a();}function n(a,c){let l=a.get(c);return l||(l=new Set,a.set(c,l)),l}function r(a){let c=e.pending.get(a)??new Set,l=e.inflight.get(a)??new Set,d=e.failed.get(a)??new Set,g=e.errors.get(a)??null;return {pending:c.size,inflight:l.size,failed:d.size,isLoading:c.size>0||l.size>0,hasError:d.size>0,lastError:g}}function i(){let a=new Set([...e.pending.keys(),...e.inflight.keys(),...e.failed.keys()]),c=new Map;for(let l of a)c.set(l,r(l));return c}function s(a){return e.listeners.add(a),()=>e.listeners.delete(a)}function o(){e.pending.clear(),e.inflight.clear(),e.failed.clear(),e.errors.clear(),t();}return {plugin:{name:"requirement-status",onRequirementCreated(a){let c=a.requirement.type;n(e.pending,c).add(a.id),e.failed.get(c)?.delete(a.id),t();},onResolverStart(a,c){let l=c.requirement.type;e.pending.get(l)?.delete(c.id),n(e.inflight,l).add(c.id),t();},onResolverComplete(a,c){let l=c.requirement.type;e.inflight.get(l)?.delete(c.id),e.pending.get(l)?.delete(c.id),t();},onResolverError(a,c,l){let d=c.requirement.type;e.inflight.get(d)?.delete(c.id),n(e.failed,d).add(c.id),e.errors.set(d,l instanceof Error?l:new Error(String(l))),t();},onResolverCancel(a,c){let l=c.requirement.type;e.pending.get(l)?.delete(c.id),e.inflight.get(l)?.delete(c.id),t();},onRequirementMet(a){let c=a.requirement.type;e.pending.get(c)?.delete(a.id),e.inflight.get(c)?.delete(a.id),t();}},getStatus:r,getAllStatus:i,subscribe:s,reset:o}}function On(e){return t=>e.getStatus(t)}function jn(e){let t=Se(),r=[...e.plugins??[],t.plugin];return {system:chunkNPX5EKPP_cjs.a({module:e.module,plugins:r,trace:e.trace,errorBoundary:e.errorBoundary,tickMs:e.tickMs,zeroConfig:e.zeroConfig,initialFacts:e.initialFacts}),statusPlugin:t}}function Ge(){return {now:()=>Date.now(),setTimeout:(e,t)=>{let n=globalThis.setTimeout(e,t);return ()=>globalThis.clearTimeout(n)}}}function Pn(e=0){let t=e,n=0,r=[];return {now:()=>t,setTimeout:(i,s)=>{let o={id:n++,deadlineMs:t+s,cb:i,canceled:false};return r.push(o),()=>{o.canceled=true;}},advanceBy:i=>{let s=t+i;for(;;){let o=r.filter(a=>!a.canceled&&a.deadlineMs<=s).sort((a,c)=>a.deadlineMs!==c.deadlineMs?a.deadlineMs-c.deadlineMs:a.id-c.id);if(o.length===0)break;let u=o[0];t=Math.max(t,u.deadlineMs),u.canceled=true,u.cb();}t=Math.max(t,s);}}}function Fn(){return Ge()}function Te(){return {startedAtMs:null,pausedDurationMs:0,pausedAtMs:null,status:"idle",repeats:0}}function ee(e,t){return e.startedAtMs===null?0:e.status==="paused"&&e.pausedAtMs!==null?Math.max(0,e.pausedAtMs-e.startedAtMs-e.pausedDurationMs):Math.max(0,t-e.startedAtMs-e.pausedDurationMs)}function Ve(e,t,n){return Math.max(0,n-ee(e,t))}function et(e,t){return e.status==="running"||e.status==="paused"?e:{...e,startedAtMs:t,pausedDurationMs:0,pausedAtMs:null,status:"running",repeats:0}}function tt(e,t){return e.status!=="running"?e:{...e,pausedAtMs:t,status:"paused"}}function nt(e,t){if(e.status!=="paused"||e.pausedAtMs===null)return e;let n=Math.max(0,t-e.pausedAtMs);return {...e,pausedDurationMs:e.pausedDurationMs+n,pausedAtMs:null,status:"running"}}function rt(){return Te()}function it(e){return {...e,status:"completed"}}function ot(e,t){return e.startedAtMs===null||e.status==="paused"?e:{...e,startedAtMs:e.startedAtMs+t,pausedDurationMs:0,pausedAtMs:null,repeats:e.repeats+1}}function st(e,t,n){if(e.status!=="running")return {kind:"no-op"};let r=ee(e,t);return n.mode==="up"?{kind:"no-op"}:n.mode==="repeat"?r>=n.ms?{kind:"repeat"}:{kind:"no-op"}:r>=n.ms?{kind:"complete"}:{kind:"no-op"}}function Nn(e){return {initial:Te,start:et,pause:tt,resume:nt,reset:rt,complete:it,registerRepeat:t=>ot(t,e.ms),tick:(t,n)=>st(t,n,e),elapsedMs:ee,remainingMs:(t,n)=>Ve(t,n,e.ms)}}var Sr={None:"none",Linear:"linear",Exponential:"exponential"};Object.defineProperty(exports,"createAuditLedger",{enumerable:true,get:function(){return chunkQ2VZPURY_cjs.b}});Object.defineProperty(exports,"memorySink",{enumerable:true,get:function(){return chunkQ2VZPURY_cjs.a}});Object.defineProperty(exports,"createSystem",{enumerable:true,get:function(){return chunkNPX5EKPP_cjs.a}});Object.defineProperty(exports,"DirectiveError",{enumerable:true,get:function(){return chunkENZEHIL7_cjs.b}});Object.defineProperty(exports,"RequirementSet",{enumerable:true,get:function(){return chunkENZEHIL7_cjs.o}});Object.defineProperty(exports,"forType",{enumerable:true,get:function(){return chunkENZEHIL7_cjs.n}});Object.defineProperty(exports,"generateRequirementId",{enumerable:true,get:function(){return chunkENZEHIL7_cjs.k}});Object.defineProperty(exports,"isNamespacedSystem",{enumerable:true,get:function(){return chunkENZEHIL7_cjs.h}});Object.defineProperty(exports,"isRequirementType",{enumerable:true,get:function(){return chunkENZEHIL7_cjs.m}});Object.defineProperty(exports,"isSingleModuleSystem",{enumerable:true,get:function(){return chunkENZEHIL7_cjs.g}});Object.defineProperty(exports,"req",{enumerable:true,get:function(){return chunkENZEHIL7_cjs.l}});Object.defineProperty(exports,"typedConstraint",{enumerable:true,get:function(){return chunkENZEHIL7_cjs.e}});Object.defineProperty(exports,"typedResolver",{enumerable:true,get:function(){return chunkENZEHIL7_cjs.f}});Object.defineProperty(exports,"applyPatch",{enumerable:true,get:function(){return chunkT4TRJEJN_cjs.v}});Object.defineProperty(exports,"evaluateKeySelector",{enumerable:true,get:function(){return chunkT4TRJEJN_cjs.u}});Object.defineProperty(exports,"evaluatePredicate",{enumerable:true,get:function(){return chunkT4TRJEJN_cjs.o}});Object.defineProperty(exports,"evaluatePredicateExplained",{enumerable:true,get:function(){return chunkT4TRJEJN_cjs.p}});Object.defineProperty(exports,"evaluateTemplate",{enumerable:true,get:function(){return chunkT4TRJEJN_cjs.s}});Object.defineProperty(exports,"extractDeps",{enumerable:true,get:function(){return chunkT4TRJEJN_cjs.r}});Object.defineProperty(exports,"extractTemplateKeys",{enumerable:true,get:function(){return chunkT4TRJEJN_cjs.t}});Object.defineProperty(exports,"getKind",{enumerable:true,get:function(){return chunkT4TRJEJN_cjs.c}});Object.defineProperty(exports,"getOperatorsForKind",{enumerable:true,get:function(){return chunkT4TRJEJN_cjs.e}});Object.defineProperty(exports,"getSchemaFieldKinds",{enumerable:true,get:function(){return chunkT4TRJEJN_cjs.d}});Object.defineProperty(exports,"isPredicate",{enumerable:true,get:function(){return chunkT4TRJEJN_cjs.h}});Object.defineProperty(exports,"isTemplate",{enumerable:true,get:function(){return chunkT4TRJEJN_cjs.k}});Object.defineProperty(exports,"listAllPredicateOperators",{enumerable:true,get:function(){return chunkT4TRJEJN_cjs.f}});Object.defineProperty(exports,"memoizePredicate",{enumerable:true,get:function(){return chunkT4TRJEJN_cjs.q}});Object.defineProperty(exports,"validatePredicate",{enumerable:true,get:function(){return chunkT4TRJEJN_cjs.l}});Object.defineProperty(exports,"validatePredicateAgainstSchema",{enumerable:true,get:function(){return chunkT4TRJEJN_cjs.n}});Object.defineProperty(exports,"diffSnapshots",{enumerable:true,get:function(){return chunk4MNQDXH7_cjs.k}});Object.defineProperty(exports,"isSignedSnapshot",{enumerable:true,get:function(){return chunk4MNQDXH7_cjs.l}});Object.defineProperty(exports,"isSnapshotExpired",{enumerable:true,get:function(){return chunk4MNQDXH7_cjs.i}});Object.defineProperty(exports,"shallowEqual",{enumerable:true,get:function(){return chunk4MNQDXH7_cjs.g}});Object.defineProperty(exports,"signSnapshot",{enumerable:true,get:function(){return chunk4MNQDXH7_cjs.m}});Object.defineProperty(exports,"validateSnapshot",{enumerable:true,get:function(){return chunk4MNQDXH7_cjs.j}});Object.defineProperty(exports,"verifySnapshotSignature",{enumerable:true,get:function(){return chunk4MNQDXH7_cjs.n}});exports.Backoff=Sr;exports.MAX_REPLAY_FRAMES=C;exports.MAX_SWEEP_POINTS=ae;exports.completeTimer=it;exports.createModule=Ye;exports.createModuleFactory=xn;exports.createRequirementStatusPlugin=Se;exports.createStatusHook=On;exports.createSystemWithStatus=jn;exports.defaultClock=Fn;exports.describePredicate=Vt;exports.diffClauses=Oe;exports.diffRules=zt;exports.doctor=Zt;exports.elapsedMs=ee;exports.flattenPredicate=S;exports.framesFromHistory=De;exports.framesFromSnapshots=se;exports.initialTimerState=Te;exports.pauseTimer=tt;exports.predicateHash=Ht;exports.predicateToMongo=$n;exports.predicateToPostgrest=Tn;exports.predicateToSQL=pn;exports.predicateToWhere=gn;exports.predict=Qt;exports.realClock=Ge;exports.registerRepeat=ot;exports.remainingMs=Ve;exports.replayUnder=H;exports.resetTimer=rt;exports.resumeTimer=nt;exports.startTimer=et;exports.sweepUnder=qt;exports.t=vn;exports.tickTimer=st;exports.timerOps=Nn;exports.toReplayFrames=Ae;exports.toRulesMap=ce;exports.virtualClock=Pn;//# sourceMappingURL=index.cjs.map
//# sourceMappingURL=index.cjs.map

@@ -1,2 +0,2 @@

export{b as createAuditLedger,a as memorySink}from'./chunk-PA6VC32N.js';import {a as a$2}from'./chunk-644QZVTT.js';export{a as createSystem}from'./chunk-644QZVTT.js';export{b as DirectiveError,o as RequirementSet,n as forType,k as generateRequirementId,h as isNamespacedSystem,m as isRequirementType,g as isSingleModuleSystem,l as req,e as typedConstraint,f as typedResolver}from'./chunk-R2GHSCTR.js';import {o,p as p$1,i,g,a as a$1,l,h as h$1,b as b$1}from'./chunk-2FF6QGOA.js';export{v as applyPatch,u as evaluateKeySelector,o as evaluatePredicate,p as evaluatePredicateExplained,s as evaluateTemplate,r as extractDeps,t as extractTemplateKeys,c as getKind,e as getOperatorsForKind,d as getSchemaFieldKinds,h as isPredicate,k as isTemplate,f as listAllPredicateOperators,q as memoizePredicate,l as validatePredicate,n as validatePredicateAgainstSchema}from'./chunk-2FF6QGOA.js';import {k as k$1}from'./chunk-I722BZA5.js';import {e,h,a}from'./chunk-PXRV64PA.js';export{k as diffSnapshots,l as isSignedSnapshot,i as isSnapshotExpired,g as shallowEqual,m as signSnapshot,j as validateSnapshot,n as verifySnapshotSignature}from'./chunk-PXRV64PA.js';var C=1e6;function Me(e,t){try{l(e);}catch(r){let i=r instanceof Error?r.message:String(r);throw new Error(`[Directive] replayUnder: the ${t} predicate is invalid \u2014 ${i}`)}if(!h$1(e)){let r=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 ${r})`)}let n;if(i(e,{operator(r,i){n===void 0&&i.startsWith("$")&&!a$1.has(i)&&(n=i);},strayOperatorKey(r){n===void 0&&!a$1.has(r)&&!b$1.has(r)&&(n=r);}}),n!==void 0)throw new Error(`[Directive] replayUnder: the ${t} predicate uses an unknown operator "${n}" \u2014 known operators: ${[...a$1].join(", ")}`)}function Ae(e){if(e&&typeof e=="object"&&!Array.isArray(e)&&Array.isArray(e.snapshots))return De(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>C)throw new Error(`[Directive] toReplayFrames: history has ${t.length} frames, exceeds the MAX_REPLAY_FRAMES limit (${C}) \u2014 split or down-sample the history`);return t.map((n,r)=>{if(n&&typeof n=="object"&&"facts"in n){let i=n,s={id:i.id??`#${r}`,facts:i.facts??{}};return typeof i.timestamp=="number"&&(s.timestamp=i.timestamp),s}return {id:`#${r}`,facts:n??{}}})}function De(e){let t=typeof e=="string"?JSON.parse(e):e;if(Array.isArray(t))return se(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 n=t;if(n.version!==void 0&&n.version!==1)throw new Error(`[Directive] framesFromHistory: unsupported history export version ${JSON.stringify(n.version)} \u2014 expected 1`);if(!Array.isArray(n.snapshots))throw new Error("[Directive] framesFromHistory: expected a history export object with a `snapshots` array (from system.history.export())");return se(n.snapshots)}function se(e){if(!Array.isArray(e))throw new Error("[Directive] framesFromSnapshots: expected an array of fact-state snapshots");if(e.length>C)throw new Error(`[Directive] framesFromSnapshots: history has ${e.length} snapshots, exceeds the MAX_REPLAY_FRAMES limit (${C}) \u2014 split or down-sample the history`);for(let t=0;t<e.length;t++){let n=e[t];if(!n||typeof n!="object"||!("facts"in n))throw new Error(`[Directive] framesFromSnapshots: snapshot at index ${t} is not a { facts, ... } object`)}return Ae(e)}function H(e){let{frames:t,original:n,proposed:r,entityKey:i}=e,s=e.maxSamples??20,o$1=s>0?s:0;if(t.length>C)throw new Error(`[Directive] replayUnder: history has ${t.length} frames, exceeds the MAX_REPLAY_FRAMES limit (${C}) \u2014 split or down-sample the history`);Me(n,"original"),Me(r,"proposed");let u=0,a=0,c=0,l=0,d=0,g=[],y=[],$=i?new Set:void 0,m=i?new Set:void 0,M;for(let F of t){let T=F.facts,v=o(n,T,M),A=o(r,T,M);v&&(u++,$?.add(T[i])),A&&(a++,m?.add(T[i])),v===A?d++:!v&&A?(c++,g.length<o$1&&g.push(Re(F,n,r,M))):(l++,y.length<o$1&&y.push(Re(F,n,r,M))),M=T;}let E={framesEvaluated:t.length,original:{matched:u},proposed:{matched:a},delta:a-u,newMatchCount:c,lostMatchCount:l,unchanged:d,newMatches:g,lostMatches:y};return $&&m&&(E.original.matchedEntities=$.size,E.proposed.matchedEntities=m.size),E}function Re(e,t,n,r){let i=e.facts,s={frameId:e.id,facts:i,originalExplain:p$1(t,i,r),proposedExplain:p$1(n,i,r)};return e.timestamp!==void 0&&(s.timestamp=e.timestamp),s}var ae=1e4,Ce=5e7;function It(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)&&Object.keys(e).length===1&&typeof e.$hole=="string"}function ue(e,t,n=new Set,r=0){if(r>g)throw new Error(`[Directive] sweepUnder: template exceeds MAX_PREDICATE_DEPTH (${g}) \u2014 flatten the template or split the sweep`);if(It(e)){let i=e.$hole;if(!(i in t))throw new Error(`[Directive] sweepUnder: template references hole "${i}" but sweep has no values for it`);return t[i]}if(e===null||typeof e!="object")return e;if(n.has(e))throw new Error("[Directive] sweepUnder: template contains a cycle \u2014 predicate templates must be a tree");n.add(e);try{if(Array.isArray(e))return e.map(s=>ue(s,t,n,r+1));let i={};for(let[s,o]of Object.entries(e))i[s]=ue(o,t,n,r+1);return i}finally{n.delete(e);}}function*Ee(e,t){if(e.length===0){yield {};return}let n=e[0],r=e.slice(1),i=t[n]??[];for(let s of i)for(let o of Ee(r,t))yield {[n]:s,...o};}function Lt(e){let t=1;for(let n of Object.values(e))t*=n.length;return t}function qt(e){let{frames:t,original:n,template:r,sweep:i,objective:s=T=>T.proposed.matched,entityKey:o,maxSamples:u=0}=e,a=Object.keys(i);if(a.length===0)throw new Error("[Directive] sweepUnder: `sweep` must contain at least one hole name");let c=Lt(i);if(c>ae)throw new Error(`[Directive] sweepUnder: grid has ${c} points, exceeds the MAX_SWEEP_POINTS limit (${ae}) \u2014 narrow the sweep ranges or split the run`);if(c===0)throw new Error("[Directive] sweepUnder: at least one hole has zero candidate values");let l=c*t.length;if(l>Ce)throw new Error(`[Directive] sweepUnder: ${c} points \xD7 ${t.length} frames = ${l} per-frame evaluations, exceeds the MAX_SWEEP_EVALUATIONS limit (${Ce}) \u2014 narrow the sweep, down-sample the history, or split the run`);let d=false,g=T=>{let v;try{v=s(T);}catch(A){return d||(d=true,console.warn(`[Directive] sweepUnder: objective threw \u2014 point will not rank (${A.message})`)),Number.NEGATIVE_INFINITY}return typeof v!="number"||!Number.isFinite(v)?(d||(d=true,console.warn(`[Directive] sweepUnder: objective returned a non-finite number (${String(v)}) \u2014 point will not rank`)),Number.NEGATIVE_INFINITY):v},y=H({frames:t,original:n,proposed:n,entityKey:o,maxSamples:u}),$={values:{},report:y,score:g(y)},m=[],M=0,E=Number.NEGATIVE_INFINITY;for(let T of Ee(a,i)){let v=ue(r,T),A=H({frames:t,original:n,proposed:v,entityKey:o,maxSamples:u}),te=g(A);te>E&&(E=te,M=m.length),m.push({values:T,report:A,score:te});}let F=m[M];return {points:m,bestIndex:M,best:F,baseline:$}}function ce(e){let t=e&&typeof e=="object"&&!Array.isArray(e)&&"constraints"in e?e.constraints:e;if(Array.isArray(t)){let n={};for(let r of t){if(!r||typeof r!="object"||!("id"in r))throw new Error("[Directive] diffRules: array entries must be `{ id, whenSpec }` objects");let i=r;if(typeof i.id!="string")throw new Error("[Directive] diffRules: constraint `id` must be a string");n[i.id]=i.whenSpec;}return n}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 Bt=new Set(["$eq","$ne","$in","$nin","$exists","$gt","$gte","$lt","$lte","$between","$matches","$startsWith","$endsWith","$contains","$changed"]),Wt=new Set(["$all","$any","$not"]);function xe(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Ut(e){if(!xe(e))return false;let t=Object.keys(e);if(t.length===0)return false;let n=false;for(let r of t){if(!r.startsWith("$"))return false;Bt.has(r)&&(n=true);}return n}function S(e,t="",n=[]){if(e===null||typeof e!="object")return n;if(Array.isArray(e)){for(let r of e)if(r&&typeof r=="object"&&"fact"in r&&"op"in r){let i=r;n.push({path:t?`${t}.${String(i.fact)}`:String(i.fact),op:String(i.op),value:i.value});}return n}if("$all"in e&&Array.isArray(e.$all))return e.$all.forEach((i,s)=>{S(i,`${t}$all[${s}]`,n);}),n;if("$any"in e&&Array.isArray(e.$any))return e.$any.forEach((i,s)=>{S(i,`${t}$any[${s}]`,n);}),n;if("$not"in e)return S(e.$not,`${t}$not`,n),n;for(let[r,i]of Object.entries(e)){let s=t?`${t}.${r}`:r;if(Ut(i))for(let[o,u]of Object.entries(i))n.push({path:s,op:o,value:u});else xe(i)&&!Wt.has(r)?S(i,s,n):n.push({path:s,op:"$eq",value:i});}return n}function D(e){return typeof e=="number"&&Number.isFinite(e)}function Kt(e,t,n){switch(e){case "$gte":case "$gt":if(D(t)&&D(n)){if(n<t)return "relaxed";if(n>t)return "tightened"}return null;case "$lte":case "$lt":if(D(t)&&D(n)){if(n>t)return "relaxed";if(n<t)return "tightened"}return null;case "$between":{if(Array.isArray(t)&&Array.isArray(n)&&t.length===2&&n.length===2&&D(t[0])&&D(t[1])&&D(n[0])&&D(n[1])){let r=t[1]-t[0],i=n[1]-n[0];if(i>r)return "relaxed";if(i<r)return "tightened"}return null}case "$in":case "$nin":{if(Array.isArray(t)&&Array.isArray(n))if(e==="$in"){if(n.length>t.length)return "relaxed";if(n.length<t.length)return "tightened"}else {if(n.length>t.length)return "tightened";if(n.length<t.length)return "relaxed"}return null}case "$contains":{if(Array.isArray(t)&&Array.isArray(n)){if(n.length>t.length)return "relaxed";if(n.length<t.length)return "tightened"}return null}default:return null}}function zt(e){let t=ce(e.before),n=ce(e.after),i=[...new Set([...Object.keys(t),...Object.keys(n)])].sort(),s=[],o={added:0,removed:0,changed:0,unchanged:0,totalClauseChanges:0};for(let u of i){let a=t[u],c=n[u],l=u in t,d=u in n;if(l&&!d){let y=S(a),$=y.length===0?[{path:"(function-form predicate)",kind:"removed"}]:y.map(m=>({path:m.path,kind:"removed",before:{op:m.op,value:m.value}}));le($),s.push({id:u,status:"removed",changes:$}),o.removed++,o.totalClauseChanges+=$.length;continue}if(!l&&d){let y=S(c),$=y.length===0?[{path:"(function-form predicate)",kind:"added"}]:y.map(m=>({path:m.path,kind:"added",after:{op:m.op,value:m.value}}));le($),s.push({id:u,status:"added",changes:$}),o.added++,o.totalClauseChanges+=$.length;continue}let g=Oe(a,c);g.length===0?(s.push({id:u,status:"unchanged",changes:[]}),o.unchanged++):(s.push({id:u,status:"changed",changes:g}),o.changed++,o.totalClauseChanges+=g.length);}return {constraints:s,summary:o}}function Oe(e$1,t){if(e$1!==void 0&&t!==void 0&&(e$1===null||t===null||typeof e$1!="object"||typeof t!="object"))return e(e$1)===e(t)?[]:[{path:"",kind:"changed",before:{op:"$eq",value:e$1},after:{op:"$eq",value:t}}];let n=e$1===void 0?[]:S(e$1),r=t===void 0?[]:S(t),i=c=>`${c.path}::${c.op}`,s=new Map(n.map(c=>[i(c),c])),o=new Map(r.map(c=>[i(c),c])),u=new Set([...s.keys(),...o.keys()]),a=[];for(let c of u){let l=s.get(c),d=o.get(c);if(l&&!d){a.push({path:l.path,kind:"removed",before:{op:l.op,value:l.value}});continue}if(!l&&d){a.push({path:d.path,kind:"added",after:{op:d.op,value:d.value}});continue}if(l&&d){if(e(l.value)===e(d.value))continue;let g=Kt(l.op,l.value,d.value);a.push({path:l.path,kind:g??"changed",before:{op:l.op,value:l.value},after:{op:d.op,value:d.value}});}}return le(a),a}function le(e){e.sort((t,n)=>{let r=t.path.localeCompare(n.path);if(r!==0)return r;let i=t.before?.op??t.after?.op??"",s=n.before?.op??n.after?.op??"";return i.localeCompare(s)});}function Ht(e){return h(e)}function J(e){return e===null?"null":e===void 0?"undefined":e instanceof Date?e.toISOString():typeof e=="string"||typeof e=="object"?JSON.stringify(e):String(e)}function Jt(e){let t=e.path,n=J(e.expected),r=J(e.actual);switch(e.op){case "$eq":return `set ${t} to ${n} (currently ${r})`;case "$ne":return `change ${t} to anything other than ${n} (currently ${r})`;case "$gt":return `set ${t} above ${n} (currently ${r})`;case "$gte":return `set ${t} to at least ${n} (currently ${r})`;case "$lt":return `set ${t} below ${n} (currently ${r})`;case "$lte":return `set ${t} to at most ${n} (currently ${r})`;case "$in":return `set ${t} to one of ${n} (currently ${r})`;case "$nin":return `set ${t} to something other than ${n} (currently ${r})`;case "$exists":return e.expected===true?`set ${t} to a non-null value (currently null/missing)`:`unset ${t} (currently ${r})`;case "$between":return Array.isArray(e.expected)&&e.expected.length===2?`set ${t} between ${J(e.expected[0])} and ${J(e.expected[1])} (currently ${r})`:`set ${t} within range ${n} (currently ${r})`;case "$startsWith":return `set ${t} to start with ${n} (currently ${r})`;case "$endsWith":return `set ${t} to end with ${n} (currently ${r})`;case "$contains":return `set ${t} to contain ${n} (currently ${r})`;case "$matches":return `set ${t} to match the pattern ${n} (currently ${r})`;case "$changed":return `the previous-vs-current change of ${t} is required to differ (currently they match: ${r})`;case "$all":case "$any":case "$not":return `the ${e.op} group at "${t}" did not pass \u2014 see its child clauses`;default:return `clause at ${t} (${e.op}) failed: expected ${n}, got ${r}`}}function je(e,t){for(let n of e)if(!n.pass){if((n.op==="$all"||n.op==="$any"||n.op==="$not")&&n.children){je(n.children,t);continue}t.push({path:n.path,op:n.op,expected:n.expected,actual:n.actual,suggestion:Jt(n)});}}function Qt(e,t,n){let r=p$1(e,t,n),i$1=r.every(o=>o.pass),s=[];if(i$1||je(r,s),!i$1&&n===void 0){let o=[];i(e,{operator(u,a){a==="$changed"&&o.push(u);}});for(let u of o)s.push({path:u,op:"$changed",expected:true,actual:void 0,suggestion:`$changed clause at "${u}" cannot be evaluated without a \`prev\` snapshot \u2014 pass predict(predicate, facts, prev).`});}return {wouldFire:i$1,whenExplain:r,missingChanges:s}}var Pe=new Set(["$eq","$ne","$gt","$gte","$lt","$lte","$in","$nin"]);function Q(e,t){if(e===t)return 0;if(typeof e=="number"&&typeof t=="number"||typeof e=="bigint"&&typeof t=="bigint")return e<t?-1:e>t?1:0;if(e instanceof Date&&t instanceof Date){let n=e.getTime(),r=t.getTime();return n<r?-1:n>r?1:0}return typeof e=="string"&&typeof t=="string"?e<t?-1:e>t?1:0:Number.NaN}function _(e,t){if(e===t)return true;if(typeof e!=typeof t||e===null||t===null||typeof e!="object"||Array.isArray(e)!==Array.isArray(t))return false;if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return false;for(let i=0;i<e.length;i++)if(!_(e[i],t[i]))return false;return true}let n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return false;for(let i of n)if(!_(e[i],t[i]))return false;return true}function Xt(e,t){if(!Pe.has(e.op)||!Pe.has(t.op))return {type:"overlap",reason:`Both rules touch "${e.path}".`};if(e.op==="$eq"&&t.op==="$eq")return _(e.value,t.value)?{type:"subset",reason:`Both rules require ${e.path} = ${JSON.stringify(e.value)} \u2014 candidate is redundant.`}:{type:"direct",reason:`Candidate requires ${e.path} = ${JSON.stringify(e.value)} but an existing rule requires ${e.path} = ${JSON.stringify(t.value)} \u2014 they cannot both fire.`};if(e.op==="$eq"&&t.op==="$ne")return _(e.value,t.value)?{type:"direct",reason:`Candidate requires ${e.path} = ${JSON.stringify(e.value)} but an existing rule excludes that value.`}:null;if(e.op==="$ne"&&t.op==="$eq")return _(e.value,t.value)?{type:"direct",reason:`Candidate excludes ${e.path} = ${JSON.stringify(e.value)} but an existing rule requires that exact value.`}:null;if(e.op==="$in"&&t.op==="$in"){let o=new Set(Array.isArray(e.value)?e.value:[]),u=new Set(Array.isArray(t.value)?t.value:[]),a=[...o].filter(c=>u.has(c));return a.length===0?{type:"direct",reason:`Candidate $in set for ${e.path} (${JSON.stringify([...o])}) and existing $in set (${JSON.stringify([...u])}) have no values in common \u2014 the candidate can never fire while the existing rule holds.`}:a.length===o.size&&a.length<u.size?{type:"subset",reason:`Candidate $in set for ${e.path} is a strict subset of the existing rule's $in set.`}:null}let n=e.op==="$gt"||e.op==="$gte"?e.value:void 0,r=e.op==="$lt"||e.op==="$lte"?e.value:void 0,i=t.op==="$gt"||t.op==="$gte"?t.value:void 0,s=t.op==="$lt"||t.op==="$lte"?t.value:void 0;if(n!==void 0&&s!==void 0){let o=Q(n,s);if(!Number.isNaN(o)&&(o>0||o===0&&(e.op==="$gt"||t.op==="$lt")))return {type:"direct",reason:`Candidate requires ${e.path} ${e.op==="$gt"?">":"\u2265"} ${JSON.stringify(n)} but an existing rule caps it at ${t.op==="$lt"?"<":"\u2264"} ${JSON.stringify(s)}.`}}if(i!==void 0&&r!==void 0){let o=Q(i,r);if(!Number.isNaN(o)&&(o>0||o===0&&(t.op==="$gt"||e.op==="$lt")))return {type:"direct",reason:`Candidate caps ${e.path} at ${e.op==="$lt"?"<":"\u2264"} ${JSON.stringify(r)} but an existing rule requires it ${t.op==="$gt"?">":"\u2265"} ${JSON.stringify(i)}.`}}if(n!==void 0&&i!==void 0){let o=Q(n,i);if(!Number.isNaN(o)&&o>0)return {type:"subset",reason:`Candidate's lower bound on ${e.path} (${JSON.stringify(n)}) is stricter than the existing rule's lower bound (${JSON.stringify(i)}) \u2014 candidate is a subset.`}}if(r!==void 0&&s!==void 0){let o=Q(r,s);if(!Number.isNaN(o)&&o<0)return {type:"subset",reason:`Candidate's upper bound on ${e.path} (${JSON.stringify(r)}) is stricter than the existing rule's upper bound (${JSON.stringify(s)}) \u2014 candidate is a subset.`}}return {type:"overlap",reason:`Both rules constrain "${e.path}".`}}function Fe(e){return typeof e=="object"&&e!==null&&typeof e.id=="string"}var Zt={checkAgainst(e,t){let n=Array.isArray(t)?t:"constraints"in t&&Array.isArray(t.constraints)?t.constraints:[],r=S(e);if(r.length===0)return {contradictions:[],warnings:[]};let i=new Map;for(let u of r){let a=i.get(u.path)??[];a.push(u),i.set(u.path,a);}let s=[],o=[];for(let u of n){if(!Fe(u)||u.whenSpec===void 0)continue;let a=S(u.whenSpec);for(let c of a){let l=i.get(c.path);if(l)for(let d of l){let g=Xt(d,c);if(!g)continue;let y={constraintId:u.id,type:g.type,reason:g.reason,candidatePath:d.path,candidate:{op:d.op,value:d.value},existing:{op:c.op,value:c.value}};g.type==="overlap"||g.type==="subset"?o.push(y):s.push(y);}}}return {contradictions:s,warnings:o}},checkOwns(e,t){let n=Array.isArray(t)?t:"constraints"in t&&Array.isArray(t.constraints)?t.constraints:[],r=S(e);if(r.length===0)return {warnings:[]};let i=new Set(r.map(o=>o.path)),s=[];for(let o of n){if(!Fe(o))continue;let u=Array.isArray(o.owns)?o.owns:[],a=Array.isArray(o.bind)?o.bind:[];for(let c of u)i.has(c)&&s.push({constraintId:o.id,candidatePath:c,source:"owns",reason:`Constraint "${o.id}" already owns "${c}" \u2014 candidate would race or shadow its writes.`,severity:"warning"});for(let c of a)i.has(c)&&s.push({constraintId:o.id,candidatePath:c,source:"bind",reason:`Constraint "${o.id}" binds "${c}" \u2014 candidate would write to a bound field.`,severity:"warning"});}return {warnings:s}}};var I=new Map,Yt=50;function Gt(e){let t=I.get(e);if(!t){try{t=new Intl.NumberFormat(e);}catch{t=new Intl.NumberFormat("en-US");}if(I.size>=Yt){let n=I.keys().next().value;n!==void 0&&I.delete(n);}I.set(e,t);}return t}function Vt(e,t={}){let n=t.style??"natural",r=t.parenthesize??true,i=t.locale??"en-US",s=t.factName??(a=>a);if(e===null||typeof e!="object")return "<invalid predicate>";let o={style:n,parenthesize:r,locale:i,factName:s,seen:new WeakSet,cycle:false},u=X(e,o,0);return o.cycle?"<invalid predicate: cycle>":u}var Ie=" AND ",en=" OR ",tn="NOT",Le=" \u2227 ",nn=" \u2228 ",rn="\xAC";function q(e){return typeof e!="object"||e===null||Array.isArray(e)?false:!(e instanceof Date)&&!(e instanceof RegExp)}function on(e){if(!q(e))return false;let t=Object.keys(e);if(t.length===0)return false;for(let n of t)if(!n.startsWith("$"))return false;return true}function X(e,t,n){if(n>g)return a&&console.warn(`[Directive] describePredicate: depth limit (${g}) exceeded \u2014 bailing.`),t.style==="formal"?"\u22A5":"always true";if(Array.isArray(e))return sn(e,t);if(!q(e))return f(e,t);if(t.seen.has(e))return t.cycle=true,"<invalid predicate: cycle>";t.seen.add(e);let r=e,i=Object.keys(r);for(let o of ["$all","$any","$not"])if(o in r)return an(o,r[o],t,n);let s=[];for(let o of i)o.startsWith("$")||s.push(qe(o,r[o],t,n));return Z(s,t)}function sn(e,t,n){let r=[];for(let i of e){if(!q(i))continue;let s=i;typeof s.fact!="string"||typeof s.op!="string"||r.push(L(s.fact,s.op,s.value,t));}return r.length===0?t.style==="formal"?"\u22A4":"always true":Z(r,t)}function an(e,t,n,r){if(e==="$not"){if(q(t)&&Object.keys(t).length===0)return n.style==="formal"?"\u22A5":"never";let o=X(t,n,r+1);return o==="always true"?"never":o==="\u22A4"?"\u22A5":`${n.style==="formal"?rn:`${tn} `}(${o})`}if(!Array.isArray(t))return n.style==="formal"?"\u22A5":"<invalid predicate>";if(t.length===0)return e==="$all"?n.style==="formal"?"\u22A4":"always true":n.style==="formal"?"\u22A5":"never";let i=[];for(let o of t){let u=X(o,n,r+1);i.push(u);}if(i.length===1)return i[0];let s=n.parenthesize?i.map(o=>`(${o})`):i;return e==="$all"?s.join(n.style==="formal"?Le:Ie):s.join(n.style==="formal"?nn:en)}function qe(e,t,n,r){if(on(t)){let i=t,s=Object.keys(i);if(s.length===1)return L(e,s[0],i[s[0]],n);let o=s.map(u=>L(e,u,i[u],n));return Z(o,n)}if(q(t)){let i=t;if("$all"in i||"$any"in i||"$not"in i)return X(t,n,r+1);let o=[];for(let u of Object.keys(i))u.startsWith("$")||o.push(qe(`${e}.${u}`,i[u],n,r+1));return o.length===0?L(e,"$eq",t,n):Z(o,n)}return L(e,"$eq",t,n)}function L(e,t,n,r){let i=r.style==="formal"?e:r.factName(e);return r.style==="formal"?cn(i,t,n,r):un(i,t,n,r)}function un(e,t,n,r){switch(t){case "$eq":return n===null?`${e} is null`:`${e} is ${f(n,r)}`;case "$ne":return n===null?`${e} is not null`:`${e} is not ${f(n,r)}`;case "$gt":return `${e} is more than ${f(n,r)}`;case "$gte":return `${e} is at least ${f(n,r)}`;case "$lt":return `${e} is less than ${f(n,r)}`;case "$lte":return `${e} is at most ${f(n,r)}`;case "$in":return `${e} is one of ${Ne(n,r)}`;case "$nin":return `${e} is not one of ${Ne(n,r)}`;case "$exists":return n===true?`${e} is set`:`${e} is not set`;case "$between":return Array.isArray(n)&&n.length===2?`${e} is between ${f(n[0],r)} and ${f(n[1],r)}`:`${e} is between ${f(n,r)}`;case "$startsWith":return `${e} starts with ${O(n,r,true)}`;case "$endsWith":return `${e} ends with ${O(n,r,true)}`;case "$contains":return `${e} contains ${O(n,r,true)}`;case "$matches":return n instanceof RegExp?`${e} matches ${n.toString()}`:`${e} matches ${f(n,r)}`;case "$changed":return `${e} changed`;default:return a&&!a$1.has(t)&&console.warn(`[Directive] describePredicate: unknown operator "${t}" \u2014 falling through to generic rendering.`),`${e} ${t} ${f(n,r)}`}}function cn(e,t,n,r){switch(t){case "$eq":return `${e} = ${f(n,r)}`;case "$ne":return `${e} \u2260 ${f(n,r)}`;case "$gt":return `${e} > ${f(n,r)}`;case "$gte":return `${e} \u2265 ${f(n,r)}`;case "$lt":return `${e} < ${f(n,r)}`;case "$lte":return `${e} \u2264 ${f(n,r)}`;case "$in":return `${e} \u2208 {${_e(n,r)}}`;case "$nin":return `${e} \u2209 {${_e(n,r)}}`;case "$exists":return n===true?`\u2203 ${e}`:`\u2204 ${e}`;case "$between":return Array.isArray(n)&&n.length===2?`${f(n[0],r)} \u2264 ${e} \u2264 ${f(n[1],r)}`:`${e} \u2208 [${f(n,r)}]`;case "$startsWith":return `${e} ^= ${O(n,r,true)}`;case "$endsWith":return `${e} $= ${O(n,r,true)}`;case "$contains":return `${e} \u2287 ${O(n,r,true)}`;case "$matches":return n instanceof RegExp?`${e} ~ ${n.toString()}`:`${e} ~ ${f(n,r)}`;case "$changed":return `\u0394${e}`;default:return a&&!a$1.has(t)&&console.warn(`[Directive] describePredicate: unknown operator "${t}" \u2014 falling through to generic rendering.`),`${e} ${t} ${f(n,r)}`}}function Y(e){return e.length===0?true:/[\s,"']/.test(e)}function O(e,t,n){return typeof e!="string"||n||Y(e)?JSON.stringify(e):e}function f(e,t){if(e===null)return "null";if(e===void 0)return "undefined";if(typeof e=="boolean")return e?"true":"false";if(typeof e=="number"){if(!Number.isFinite(e))return String(e);try{return Gt(t.locale).format(e)}catch{return String(e)}}if(typeof e=="bigint")return t.style==="formal"?`${e.toString()}n`:e.toString();if(typeof e=="string")return t.style==="formal"||Y(e)?JSON.stringify(e):e;if(e instanceof Date)return e.toISOString();if(e instanceof RegExp)return e.toString();if(Array.isArray(e))return `[${e.map(n=>f(n,t)).join(", ")}]`;if(typeof e=="object")try{return JSON.stringify(e)}catch{return "[object]"}return String(e)}function Ne(e,t){return Array.isArray(e)?e.map(n=>typeof n=="string"?Y(n)?JSON.stringify(n):n:f(n,t)).join(", "):f(e,t)}function _e(e,t){return Array.isArray(e)?e.map(n=>typeof n=="string"?Y(n)?JSON.stringify(n):n:f(n,t)).join(", "):f(e,t)}function Z(e,t){if(e.length===0)return t.style==="formal"?"\u22A4":"always true";if(e.length===1)return e[0];let n=t.style==="formal"?Le:Ie;return t.parenthesize,e.join(n)}var ln=/^[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)?$/;function W(e,t){if(typeof e!="string"||!ln.test(e))throw new Error(`[Directive] predicateToSQL: invalid ${t} identifier "${e}" \u2014 must match /^[A-Za-z_][A-Za-z0-9_]*(\\.[A-Za-z_][A-Za-z0-9_]*)?$/`)}function Be(e,t){if(t&&!t.includes(e))throw new Error(`[Directive] predicateToSQL: column "${e}" is not in the allowedKeys list \u2014 add it to options.allowedKeys or remove it from the predicate`)}function dn(e){if(Array.isArray(e)){if(e.length===0)throw new Error("[Directive] predicateToSQL: select must not be empty");for(let n of e)W(n,"column");return e.join(", ")}let t=e;return t==="*"?"*":(W(t,"column"),t)}function b(e,t){return e.params.push(t),e.placeholder(e.params.length)}function de(e,t,n,r){switch(t){case "$eq":return `${e} = ${b(r,n)}`;case "$ne":return `${e} <> ${b(r,n)}`;case "$gt":return `${e} > ${b(r,n)}`;case "$gte":return `${e} >= ${b(r,n)}`;case "$lt":return `${e} < ${b(r,n)}`;case "$lte":return `${e} <= ${b(r,n)}`;case "$in":if(!Array.isArray(n))throw new Error("[Directive] predicateToSQL: $in operand must be an array");return `${e} = ANY(${b(r,n)})`;case "$nin":if(!Array.isArray(n))throw new Error("[Directive] predicateToSQL: $nin operand must be an array");return `NOT (${e} = ANY(${b(r,n)}))`;case "$exists":return n===true?`${e} IS NOT NULL`:`${e} IS NULL`;case "$between":{if(!Array.isArray(n)||n.length!==2)throw new Error("[Directive] predicateToSQL: $between operand must be a [low, high] tuple");return `${e} BETWEEN ${b(r,n[0])} AND ${b(r,n[1])}`}case "$startsWith":if(typeof n!="string")throw new Error("[Directive] predicateToSQL: $startsWith operand must be a string");return `${e} LIKE ${b(r,fe(n))} || '%' ESCAPE '\\'`;case "$endsWith":if(typeof n!="string")throw new Error("[Directive] predicateToSQL: $endsWith operand must be a string");return `${e} LIKE '%' || ${b(r,fe(n))} ESCAPE '\\'`;case "$contains":if(typeof n!="string")throw new Error("[Directive] predicateToSQL: $contains only supports string operands \u2014 array containment requires a JOIN, not a predicate");return `${e} LIKE '%' || ${b(r,fe(n))} || '%' ESCAPE '\\'`;case "$matches":{if(!(n instanceof RegExp))throw new Error("[Directive] predicateToSQL: $matches operand must be a RegExp");let i=n.flags.includes("i")?"~*":"~";return `${e} ${i} ${b(r,n.source)}`}case "$changed":throw new Error('[Directive] predicateToSQL: $changed is an effects-only operator \u2014 no server-side translation (a database row has no "prev" snapshot)');default:throw new Error(`[Directive] predicateToSQL: unknown operator "${t}" \u2014 known: ${[...a$1].join(", ")}`)}}function fe(e){return e.replace(/[\\%_]/g,"\\$&")}function We(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function fn(e){if(!We(e))return false;let t=Object.keys(e);if(t.length===0)return false;for(let n of t)if(!n.startsWith("$"))return false;return true}function pe(e,t){let n=Object.keys(e).filter(r=>r!==t);if(n.length>0)throw new Error(`[Directive] predicateToSQL: ${t} cannot coexist with sibling keys (${n.join(", ")}) \u2014 wrap them in $all together, or move them inside the ${t} children`)}function B(e,t,n){if(n>g)throw new Error(`[Directive] predicateToSQL: predicate depth limit (${g}) exceeded \u2014 flatten the predicate or check for a cyclic spec object`);if(e===null||typeof e!="object")throw new Error(`[Directive] predicateToSQL: predicate must be an object or array, got ${typeof e}`);if(Array.isArray(e)){if(e.length===0)return "TRUE";let i=e.map(s=>{if(!s||typeof s!="object"||!("fact"in s)||!("op"in s))throw new Error("[Directive] predicateToSQL: array-form clause must be { fact, op, value }");let o=s;return W(o.fact,"column"),Be(o.fact,t.allowed),de(o.fact,o.op,o.value,t)});return i.length===1?i[0]:`(${i.join(" AND ")})`}if("$all"in e){pe(e,"$all");let i=e.$all;if(!Array.isArray(i))throw new Error("[Directive] predicateToSQL: $all must be an array");if(i.length===0)return "TRUE";let s=i.map(o=>B(o,t,n+1));return s.length===1?s[0]:`(${s.join(" AND ")})`}if("$any"in e){pe(e,"$any");let i=e.$any;if(!Array.isArray(i))throw new Error("[Directive] predicateToSQL: $any must be an array");if(i.length===0)return "FALSE";let s=i.map(o=>B(o,t,n+1));return s.length===1?s[0]:`(${s.join(" OR ")})`}if("$not"in e){pe(e,"$not");let i=e.$not;return `NOT (${B(i,t,n+1)})`}let r=[];for(let[i,s]of Object.entries(e))if(W(i,"column"),Be(i,t.allowed),fn(s))for(let[o,u]of Object.entries(s)){if(!a$1.has(o))throw new Error(`[Directive] predicateToSQL: unknown operator "${o}" on column "${i}" \u2014 known: ${[...a$1].join(", ")}`);r.push(de(i,o,u,t));}else {if(We(s))throw new Error(`[Directive] predicateToSQL: nested predicate at "${i}" \u2014 cross-module / partial-match predicates have no SQL equivalent (single-table queries only in v1; pass a flat predicate or build JOIN by hand with predicateToWhere)`);r.push(de(i,"$eq",s,t));}return r.length===0?"TRUE":r.length===1?r[0]:`(${r.join(" AND ")})`}var Ue=e=>`$${e}`;function pn(e,t){let{table:n,allowedKeys:r}=t,i=t.placeholder??Ue,s=t.select??"*";W(n,"table");let o=dn(s),u={params:[],placeholder:i,allowed:r},a=B(e,u,0);return {sql:`SELECT ${o} FROM ${n} WHERE ${a}`,where:a,params:u.params}}function gn(e,t={}){let n=t.placeholder??Ue,r={params:[],placeholder:n,allowed:t.allowedKeys};return {where:B(e,r,0),params:r.params}}function ge(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function he(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function yn(e){if(!he(e))return false;let t=Object.keys(e);if(t.length===0)return false;for(let n of t)if(!n.startsWith("$"))return false;return true}var hn=/^[A-Za-z_][A-Za-z0-9_]*$/,mn=/^[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*$/;function Ke(e,t){if(typeof e!="string"||e.length===0)throw new Error(`[Directive] predicateToMongo: field name must be a non-empty string, got ${typeof e}`);if(e.startsWith("$"))throw new Error(`[Directive] predicateToMongo: field name "${e}" starts with "$" \u2014 reserved for Mongo operators (a top-level $where would be an injection vector)`);if(!(t.allowDottedPaths?mn:hn).test(e))throw new Error(`[Directive] predicateToMongo: invalid field name "${e}"${t.allowDottedPaths?"":' \u2014 pass options.allowDottedPaths=true to permit sub-document paths like "user.role"'}`)}function ze(e,t){if(t&&!t.includes(e))throw new Error(`[Directive] predicateToMongo: field "${e}" is not in the allowedKeys list \u2014 add it to options.allowedKeys or remove it from the predicate`)}function ye(e,t){let n=Object.keys(e).filter(r=>r!==t);if(n.length>0)throw new Error(`[Directive] predicateToMongo: ${t} cannot coexist with sibling keys (${n.join(", ")}) \u2014 wrap them in $all together, or move them inside the ${t} children`)}function He(e,t){switch(e){case "$eq":case "$ne":case "$gt":case "$gte":case "$lt":case "$lte":case "$in":case "$nin":case "$exists":return {[e]:t};case "$between":{if(!Array.isArray(t)||t.length!==2)throw new Error("[Directive] predicateToMongo: $between operand must be a [low, high] tuple");return {$gte:t[0],$lte:t[1]}}case "$startsWith":if(typeof t!="string")throw new Error("[Directive] predicateToMongo: $startsWith operand must be a string");return {$regex:`^${ge(t)}`};case "$endsWith":if(typeof t!="string")throw new Error("[Directive] predicateToMongo: $endsWith operand must be a string");return {$regex:`${ge(t)}$`};case "$contains":if(typeof t=="string")return {$regex:ge(t)};throw new Error("[Directive] predicateToMongo: $contains in Mongo expects a string operand \u2014 for array element membership use $elemMatch or $in directly");case "$matches":{if(t instanceof RegExp)return t.flags?{$regex:t.source,$options:t.flags}:{$regex:t.source};if(typeof t=="string")return {$regex:t};throw new Error("[Directive] predicateToMongo: $matches operand must be a RegExp or string")}case "$changed":throw new Error("[Directive] predicateToMongo: $changed is an effects-only operator \u2014 no MongoDB query equivalent");default:throw new Error(`[Directive] predicateToMongo: unknown operator "${e}" \u2014 known: ${[...a$1].join(", ")}`)}}function j(e,t,n){if(n>g)throw new Error(`[Directive] predicateToMongo: predicate depth limit (${g}) exceeded \u2014 flatten the predicate or check for a cyclic spec object`);if(e===null||typeof e!="object")throw new Error(`[Directive] predicateToMongo: predicate must be an object or array, got ${typeof e}`);if(Array.isArray(e)){if(e.length===0)return {};let i={},s=[];for(let o of e){if(!o||typeof o!="object"||!("fact"in o)||!("op"in o))throw new Error("[Directive] predicateToMongo: array-form clause must be { fact, op, value }");let u=o;Ke(u.fact,t),ze(u.fact,t.allowedKeys);let a=He(u.op,u.value);if(u.fact in i&&he(i[u.fact])){let c=i[u.fact];Object.keys(a).some(d=>d in c)?s.push({[u.fact]:a}):i[u.fact]={...c,...a};}else u.fact in i?s.push({[u.fact]:a}):i[u.fact]=a;}if(s.length>0){let o=[];for(let[u,a]of Object.entries(i))o.push({[u]:a});return o.push(...s),{$and:o}}return i}if("$all"in e){ye(e,"$all");let i=e.$all;if(!Array.isArray(i))throw new Error("[Directive] predicateToMongo: $all must be an array");return i.length===0?{}:i.length===1?j(i[0],t,n+1):{$and:i.map(s=>j(s,t,n+1))}}if("$any"in e){ye(e,"$any");let i=e.$any;if(!Array.isArray(i))throw new Error("[Directive] predicateToMongo: $any must be an array");return i.length===0?{$expr:{$eq:[1,0]}}:i.length===1?j(i[0],t,n+1):{$or:i.map(s=>j(s,t,n+1))}}if("$not"in e){ye(e,"$not");let i=e.$not;return {$nor:[j(i,t,n+1)]}}let r={};for(let[i,s]of Object.entries(e))if(Ke(i,t),ze(i,t.allowedKeys),yn(s)){let o={};for(let[u,a]of Object.entries(s)){if(!a$1.has(u))throw new Error(`[Directive] predicateToMongo: unknown operator "${u}" on field "${i}" \u2014 known: ${[...a$1].join(", ")}`);Object.assign(o,He(u,a));}r[i]=o;}else r[i]=s;return r}function $n(e,t={}){return j(e,t,0)}var wn=/^[A-Za-z_][A-Za-z0-9_]*$/;function Je(e,t){if(typeof e!="string"||!wn.test(e))throw new Error(`[Directive] predicateToPostgrest: invalid column identifier "${e}"`);if(t&&!t.includes(e))throw new Error(`[Directive] predicateToPostgrest: column "${e}" is not in the allowedKeys list \u2014 add it to options.allowedKeys or remove it from the predicate`)}function me(e,t){let n=Object.keys(e).filter(r=>r!==t);if(n.length>0)throw new Error(`[Directive] predicateToPostgrest: ${t} cannot coexist with sibling keys (${n.join(", ")}) \u2014 wrap them in $all together, or move them inside the ${t} children`)}function k(e){if(e==null)return "null";if(typeof e=="boolean")return e?"true":"false";if(typeof e=="number"||typeof e=="bigint")return String(e);if(e instanceof Date)return e.toISOString();if(typeof e=="string")return /[,.():"\\\s]/.test(e)?`"${e.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`:e;throw new Error(`[Directive] predicateToPostgrest: cannot encode value of type ${typeof e}`)}function Qe(e){return `(${e.map(k).join(",")})`}function $e(e){return e.replace(/[\\%_*]/g,"\\$&")}function P(e,t){switch(e){case "$eq":return `eq.${k(t)}`;case "$ne":return `neq.${k(t)}`;case "$gt":return `gt.${k(t)}`;case "$gte":return `gte.${k(t)}`;case "$lt":return `lt.${k(t)}`;case "$lte":return `lte.${k(t)}`;case "$in":if(!Array.isArray(t))throw new Error("[Directive] predicateToPostgrest: $in operand must be an array");return `in.${Qe(t)}`;case "$nin":if(!Array.isArray(t))throw new Error("[Directive] predicateToPostgrest: $nin operand must be an array");return `not.in.${Qe(t)}`;case "$exists":return t===true?"not.is.null":"is.null";case "$startsWith":if(typeof t!="string")throw new Error("[Directive] predicateToPostgrest: $startsWith operand must be a string");return `like.${k($e(t)+"*")}`;case "$endsWith":if(typeof t!="string")throw new Error("[Directive] predicateToPostgrest: $endsWith operand must be a string");return `like.${k("*"+$e(t))}`;case "$contains":if(typeof t!="string")throw new Error("[Directive] predicateToPostgrest: $contains expects a string operand (array containment is the cs operator with a different shape \u2014 out of scope for v1)");return `like.${k("*"+$e(t)+"*")}`;case "$matches":if(t instanceof RegExp)return `${t.flags.includes("i")?"imatch":"match"}.${k(t.source)}`;if(typeof t=="string")return `match.${k(t)}`;throw new Error("[Directive] predicateToPostgrest: $matches operand must be a RegExp or string");case "$changed":throw new Error("[Directive] predicateToPostgrest: $changed is an effects-only operator \u2014 no server query equivalent");default:throw new Error(`[Directive] predicateToPostgrest: unknown operator "${e}" \u2014 known: ${[...a$1].join(", ")}`)}}function Xe(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function bn(e){if(!Xe(e))return false;let t=Object.keys(e);if(t.length===0)return false;for(let n of t)if(!n.startsWith("$"))return false;return true}function we(e,t){return `${e}=${t}`}function G(e,t){return `${e}=(${t.join(",")})`}function be(e,t,n,r){if(t==="$between"){if(!Array.isArray(n)||n.length!==2)throw new Error("[Directive] predicateToPostgrest: $between operand must be a [low, high] tuple");let i=r?we(e,P("$gte",n[0])):`${e}.${P("$gte",n[0])}`,s=r?we(e,P("$lte",n[1])):`${e}.${P("$lte",n[1])}`;return [i,s]}return [r?we(e,P(t,n)):`${e}.${P(t,n)}`]}function U(e,t,n,r){if(r>g)throw new Error(`[Directive] predicateToPostgrest: predicate depth limit (${g}) exceeded \u2014 flatten the predicate or check for a cyclic spec object`);if(e===null||typeof e!="object")throw new Error("[Directive] predicateToPostgrest: predicate must be an object or array");if(Array.isArray(e)){let s=[];for(let o of e){if(!o||typeof o!="object"||!("fact"in o)||!("op"in o))throw new Error("[Directive] predicateToPostgrest: array-form clause must be { fact, op, value }");let u=o;Je(u.fact,t),s.push(...be(u.fact,u.op,u.value,n));}return s}if("$all"in e){me(e,"$all");let s=e.$all;if(!Array.isArray(s))throw new Error("[Directive] predicateToPostgrest: $all must be an array");if(n){let u=[];for(let a of s)u.push(...U(a,t,true,r+1));return u}let o=[];for(let u of s)o.push(...U(u,t,false,r+1));return [G("and",o)]}if("$any"in e){me(e,"$any");let s=e.$any;if(!Array.isArray(s))throw new Error("[Directive] predicateToPostgrest: $any must be an array");if(s.length===0)return n?["id=is.null","id=not.is.null"]:[G("and",["id.is.null","id.not.is.null"])];let o=[];for(let u of s)o.push(...U(u,t,false,r+1));return [G("or",o)]}if("$not"in e){me(e,"$not");let s=e.$not,o=U(s,t,false,r+1);return [G("not.and",o)]}let i=[];for(let[s,o]of Object.entries(e))if(Je(s,t),bn(o))for(let[u,a]of Object.entries(o)){if(!a$1.has(u))throw new Error(`[Directive] predicateToPostgrest: unknown operator "${u}" on column "${s}" \u2014 known: ${[...a$1].join(", ")}`);i.push(...be(s,u,a,n));}else {if(Xe(o))throw new Error(`[Directive] predicateToPostgrest: nested predicate at "${s}" \u2014 single-table queries only`);i.push(...be(s,"$eq",o,n));}return i}function Sn(e){let t=e.indexOf("=");if(t<0)return encodeURIComponent(e);let n=e.slice(0,t),r=e.slice(t+1);return `${n}=${encodeURIComponent(r)}`}function Tn(e,t={}){let n=t.mode??"querystring",r=U(e,t.allowedKeys,true,0);return r.length===0?"":n==="raw"?r.join("&"):r.map(Sn).join("&")}function V(e=[],t,n,r,i,s,o){return {_type:void 0,_validators:e,_typeName:t,_default:n,_transform:r,_description:i,_refinements:s,_meta:o,validate(u){return V([...e,u],t,n,r,i,s,o)}}}function p(e,t,n,r,i,s,o){return {...V(e,t,n,r,i,s,o),default(a){return p(e,t,a,r,i,s,o)},transform(a){return p([],t,void 0,l=>{let d=r?r(l):l;return a(d)},i,void 0,o)},brand(){return p(e,`Branded<${t}>`,n,r,i,s,o)},describe(a){return p(e,t,n,r,a,s,o)},refine(a,c){let l=[...s??[],{predicate:a,message:c}];return p([...e,a],t,n,r,i,l,o)},nullable(){return p([a=>a===null||e.every(c=>c(a))],`${t} | null`,n,r,i,void 0,o)},optional(){return p([a=>a===void 0||e.every(c=>c(a))],`${t} | undefined`,n,r,i,void 0,o)},meta(a){return p(e,t,n,r,i,s,a)}}}var kn=((...e)=>{if(e.length===0)return p([],"union");let t=e.map(n=>n._typeName??"unknown");return p([n=>e.some(r=>r._validators.every(i=>i(n)))],t.join(" | "))}),vn={string(){let e=(t,n,r,i,s,o)=>({...p(t,"string",n,r,i,s,o),minLength(a){return e([...t,c=>c.length>=a],n,r,i,s,o)},maxLength(a){return e([...t,c=>c.length<=a],n,r,i,s,o)},pattern(a){return e([...t,c=>a.test(c)],n,r,i,s,o)},default(a){return e(t,a,r,i,s,o)},describe(a){return e(t,n,r,a,s,o)},refine(a,c){let l=[...s??[],{predicate:a,message:c}];return e([...t,a],n,r,i,l,o)},meta(a){return e(t,n,r,i,s,a)}});return e([t=>typeof t=="string"])},number(){let e=(t,n,r,i,s,o)=>({...p(t,"number",n,r,i,s,o),min(a){return e([...t,c=>c>=a],n,r,i,s,o)},max(a){return e([...t,c=>c<=a],n,r,i,s,o)},default(a){return e(t,a,r,i,s,o)},describe(a){return e(t,n,r,a,s,o)},refine(a,c){let l=[...s??[],{predicate:a,message:c}];return e([...t,a],n,r,i,l,o)},meta(a){return e(t,n,r,i,s,a)}});return e([t=>typeof t=="number"])},boolean(){return p([e=>typeof e=="boolean"],"boolean")},array(){let e=(t,n,r,i,s,o)=>{let u=p(t,"array",r,void 0,i,void 0,o),a=s??{value:-1};return {...u,get _lastFailedIndex(){return a.value},set _lastFailedIndex(l){a.value=l;},of(l){let d={value:-1};return e([...t,g=>{for(let y=0;y<g.length;y++)if(!l._validators.every($=>$(g[y])))return d.value=y,false;return true}],l,r,i,d,o)},nonEmpty(){return e([...t,l=>l.length>0],n,r,i,a,o)},maxLength(l){return e([...t,d=>d.length<=l],n,r,i,a,o)},minLength(l){return e([...t,d=>d.length>=l],n,r,i,a,o)},default(l){return e(t,n,l,i,a,o)},describe(l){return e(t,n,r,l,a,o)},meta(l){return e(t,n,r,i,a,l)}}};return e([t=>Array.isArray(t)])},object(){let e=(t,n,r,i)=>({...p(t,"object",n,void 0,r,void 0,i),shape(o){return e([...t,u=>{for(let[a,c]of Object.entries(o)){let l=u[a],d=c;if(d&&!d._validators.every(g=>g(l)))return false}return true}],n,r,i)},nonNull(){return e([...t,o=>o!=null],n,r,i)},hasKeys(...o){return e([...t,u=>o.every(a=>a in u)],n,r,i)},default(o){return e(t,o,r,i)},describe(o){return e(t,n,o,i)},meta(o){return e(t,n,r,o)}});return e([t=>typeof t=="object"&&t!==null&&!Array.isArray(t)])},enum(...e){a&&e.length===0&&console.warn("[Directive] t.enum() called with no values - this will reject all strings");let t=new Set(e);return p([n=>typeof n=="string"&&t.has(n)],`enum(${e.join("|")})`)},literal(e){return p([t=>t===e],`literal(${String(e)})`)},nullable(e){let t=e._typeName??"unknown";return V([n=>n===null?true:e._validators.every(r=>r(n))],`${t} | null`)},optional(e){let t=e._typeName??"unknown";return V([n=>n===void 0?true:e._validators.every(r=>r(n))],`${t} | undefined`)},union:kn,record(e){let t=e._typeName??"unknown";return p([n=>typeof n!="object"||n===null||Array.isArray(n)?false:Object.values(n).every(r=>e._validators.every(i=>i(r)))],`Record<string, ${t}>`)},tuple(...e){a&&e.length===0&&console.warn("[Directive] t.tuple() called with no types - this will only accept empty arrays");let t=e.map(n=>n._typeName??"unknown");return p([n=>!Array.isArray(n)||n.length!==e.length?false:e.every((r,i)=>r._validators.every(s=>s(n[i])))],`[${t.join(", ")}]`)},date(){return p([e=>e instanceof Date&&!Number.isNaN(e.getTime())],"Date")},uuid(){let e=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;return p([t=>typeof t=="string"&&e.test(t)],"uuid")},email(){let e=/^[^\s@]+@[^\s@]+\.[^\s@]+$/;return p([t=>typeof t=="string"&&e.test(t)],"email")},url(){return p([e=>{if(typeof e!="string")return false;try{return new URL(e),!0}catch{return false}}],"url")},bigint(){return p([e=>typeof e=="bigint"],"bigint")},any(){return p([],"any")},unknown(){return p([],"unknown")}};function Mn(e){if(!e||typeof e!="string"){console.warn("[Directive] Module ID must be a non-empty string");return}/^(__[a-z][a-z0-9_-]*|[a-z][a-z0-9-]*)$/i.test(e)||console.warn(`[Directive] Module ID "${e}" should follow kebab-case convention (e.g., "my-module")`);}function Ze(e,t,n,r,i){for(let s of e)t.has(s)||console.warn(`[Directive] ${n} "${s}" not declared in ${r}`);for(let s of t)e.has(s)||console.warn(`[Directive] ${r}["${s}"] ${i}`);}function Rn(e,t){e.length===0&&console.warn("[Directive] history.snapshotEvents is an empty array \u2014 no events will create history snapshots. Omit history.snapshotEvents entirely to snapshot all events, or list specific events.");let n=new Set(Object.keys(t));for(let r of e)n.has(r)||console.warn(`[Directive] history.snapshotEvents entry "${r}" not declared in schema.events. Available events: ${[...n].join(", ")||"(none)"}`);}function An(e,t){let n=new Set(Object.keys(t));for(let[r,i]of Object.entries(e)){let s=i;typeof s.requirement=="string"&&!n.has(s.requirement)&&console.warn(`[Directive] Resolver "${r}" references unknown requirement type "${s.requirement}". Available types: ${[...n].join(", ")||"(none)"}`);}}function Dn(e,t){let n=t.schema?.facts??{},r=Object.keys(n);if(r.length===0)return;let i=new Set(["self","prev","current"]),s="crossModuleDeps"in t&&t.crossModuleDeps?Object.keys(t.crossModuleDeps):[];for(let o of s)i.add(o);for(let o of r)if(i.has(o))throw new Error(`[Directive] module '${e}': fact key '${o}' conflicts with a reserved namespace pivot or evaluation alias (self / prev / current / a crossModuleDep namespace). Three fixes:
export{b as createAuditLedger,a as memorySink}from'./chunk-AV6S27PU.js';import {a as a$2}from'./chunk-644QZVTT.js';export{a as createSystem}from'./chunk-644QZVTT.js';export{b as DirectiveError,o as RequirementSet,n as forType,k as generateRequirementId,h as isNamespacedSystem,m as isRequirementType,g as isSingleModuleSystem,l as req,e as typedConstraint,f as typedResolver}from'./chunk-R2GHSCTR.js';import {o,p as p$1,i,g,a as a$1,l,h as h$1,b as b$1}from'./chunk-2FF6QGOA.js';export{v as applyPatch,u as evaluateKeySelector,o as evaluatePredicate,p as evaluatePredicateExplained,s as evaluateTemplate,r as extractDeps,t as extractTemplateKeys,c as getKind,e as getOperatorsForKind,d as getSchemaFieldKinds,h as isPredicate,k as isTemplate,f as listAllPredicateOperators,q as memoizePredicate,l as validatePredicate,n as validatePredicateAgainstSchema}from'./chunk-2FF6QGOA.js';import {k as k$1}from'./chunk-I722BZA5.js';import {e,h,a}from'./chunk-PXRV64PA.js';export{k as diffSnapshots,l as isSignedSnapshot,i as isSnapshotExpired,g as shallowEqual,m as signSnapshot,j as validateSnapshot,n as verifySnapshotSignature}from'./chunk-PXRV64PA.js';var C=1e6;function Me(e,t){try{l(e);}catch(r){let i=r instanceof Error?r.message:String(r);throw new Error(`[Directive] replayUnder: the ${t} predicate is invalid \u2014 ${i}`)}if(!h$1(e)){let r=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 ${r})`)}let n;if(i(e,{operator(r,i){n===void 0&&i.startsWith("$")&&!a$1.has(i)&&(n=i);},strayOperatorKey(r){n===void 0&&!a$1.has(r)&&!b$1.has(r)&&(n=r);}}),n!==void 0)throw new Error(`[Directive] replayUnder: the ${t} predicate uses an unknown operator "${n}" \u2014 known operators: ${[...a$1].join(", ")}`)}function Ae(e){if(e&&typeof e=="object"&&!Array.isArray(e)&&Array.isArray(e.snapshots))return De(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>C)throw new Error(`[Directive] toReplayFrames: history has ${t.length} frames, exceeds the MAX_REPLAY_FRAMES limit (${C}) \u2014 split or down-sample the history`);return t.map((n,r)=>{if(n&&typeof n=="object"&&"facts"in n){let i=n,s={id:i.id??`#${r}`,facts:i.facts??{}};return typeof i.timestamp=="number"&&(s.timestamp=i.timestamp),s}return {id:`#${r}`,facts:n??{}}})}function De(e){let t=typeof e=="string"?JSON.parse(e):e;if(Array.isArray(t))return se(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 n=t;if(n.version!==void 0&&n.version!==1)throw new Error(`[Directive] framesFromHistory: unsupported history export version ${JSON.stringify(n.version)} \u2014 expected 1`);if(!Array.isArray(n.snapshots))throw new Error("[Directive] framesFromHistory: expected a history export object with a `snapshots` array (from system.history.export())");return se(n.snapshots)}function se(e){if(!Array.isArray(e))throw new Error("[Directive] framesFromSnapshots: expected an array of fact-state snapshots");if(e.length>C)throw new Error(`[Directive] framesFromSnapshots: history has ${e.length} snapshots, exceeds the MAX_REPLAY_FRAMES limit (${C}) \u2014 split or down-sample the history`);for(let t=0;t<e.length;t++){let n=e[t];if(!n||typeof n!="object"||!("facts"in n))throw new Error(`[Directive] framesFromSnapshots: snapshot at index ${t} is not a { facts, ... } object`)}return Ae(e)}function H(e){let{frames:t,original:n,proposed:r,entityKey:i}=e,s=e.maxSamples??20,o$1=s>0?s:0;if(t.length>C)throw new Error(`[Directive] replayUnder: history has ${t.length} frames, exceeds the MAX_REPLAY_FRAMES limit (${C}) \u2014 split or down-sample the history`);Me(n,"original"),Me(r,"proposed");let u=0,a=0,c=0,l=0,d=0,g=[],y=[],$=i?new Set:void 0,m=i?new Set:void 0,M;for(let F of t){let T=F.facts,v=o(n,T,M),A=o(r,T,M);v&&(u++,$?.add(T[i])),A&&(a++,m?.add(T[i])),v===A?d++:!v&&A?(c++,g.length<o$1&&g.push(Re(F,n,r,M))):(l++,y.length<o$1&&y.push(Re(F,n,r,M))),M=T;}let E={framesEvaluated:t.length,original:{matched:u},proposed:{matched:a},delta:a-u,newMatchCount:c,lostMatchCount:l,unchanged:d,newMatches:g,lostMatches:y};return $&&m&&(E.original.matchedEntities=$.size,E.proposed.matchedEntities=m.size),E}function Re(e,t,n,r){let i=e.facts,s={frameId:e.id,facts:i,originalExplain:p$1(t,i,r),proposedExplain:p$1(n,i,r)};return e.timestamp!==void 0&&(s.timestamp=e.timestamp),s}var ae=1e4,Ce=5e7;function It(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)&&Object.keys(e).length===1&&typeof e.$hole=="string"}function ue(e,t,n=new Set,r=0){if(r>g)throw new Error(`[Directive] sweepUnder: template exceeds MAX_PREDICATE_DEPTH (${g}) \u2014 flatten the template or split the sweep`);if(It(e)){let i=e.$hole;if(!(i in t))throw new Error(`[Directive] sweepUnder: template references hole "${i}" but sweep has no values for it`);return t[i]}if(e===null||typeof e!="object")return e;if(n.has(e))throw new Error("[Directive] sweepUnder: template contains a cycle \u2014 predicate templates must be a tree");n.add(e);try{if(Array.isArray(e))return e.map(s=>ue(s,t,n,r+1));let i={};for(let[s,o]of Object.entries(e))i[s]=ue(o,t,n,r+1);return i}finally{n.delete(e);}}function*Ee(e,t){if(e.length===0){yield {};return}let n=e[0],r=e.slice(1),i=t[n]??[];for(let s of i)for(let o of Ee(r,t))yield {[n]:s,...o};}function Lt(e){let t=1;for(let n of Object.values(e))t*=n.length;return t}function qt(e){let{frames:t,original:n,template:r,sweep:i,objective:s=T=>T.proposed.matched,entityKey:o,maxSamples:u=0}=e,a=Object.keys(i);if(a.length===0)throw new Error("[Directive] sweepUnder: `sweep` must contain at least one hole name");let c=Lt(i);if(c>ae)throw new Error(`[Directive] sweepUnder: grid has ${c} points, exceeds the MAX_SWEEP_POINTS limit (${ae}) \u2014 narrow the sweep ranges or split the run`);if(c===0)throw new Error("[Directive] sweepUnder: at least one hole has zero candidate values");let l=c*t.length;if(l>Ce)throw new Error(`[Directive] sweepUnder: ${c} points \xD7 ${t.length} frames = ${l} per-frame evaluations, exceeds the MAX_SWEEP_EVALUATIONS limit (${Ce}) \u2014 narrow the sweep, down-sample the history, or split the run`);let d=false,g=T=>{let v;try{v=s(T);}catch(A){return d||(d=true,console.warn(`[Directive] sweepUnder: objective threw \u2014 point will not rank (${A.message})`)),Number.NEGATIVE_INFINITY}return typeof v!="number"||!Number.isFinite(v)?(d||(d=true,console.warn(`[Directive] sweepUnder: objective returned a non-finite number (${String(v)}) \u2014 point will not rank`)),Number.NEGATIVE_INFINITY):v},y=H({frames:t,original:n,proposed:n,entityKey:o,maxSamples:u}),$={values:{},report:y,score:g(y)},m=[],M=0,E=Number.NEGATIVE_INFINITY;for(let T of Ee(a,i)){let v=ue(r,T),A=H({frames:t,original:n,proposed:v,entityKey:o,maxSamples:u}),te=g(A);te>E&&(E=te,M=m.length),m.push({values:T,report:A,score:te});}let F=m[M];return {points:m,bestIndex:M,best:F,baseline:$}}function ce(e){let t=e&&typeof e=="object"&&!Array.isArray(e)&&"constraints"in e?e.constraints:e;if(Array.isArray(t)){let n={};for(let r of t){if(!r||typeof r!="object"||!("id"in r))throw new Error("[Directive] diffRules: array entries must be `{ id, whenSpec }` objects");let i=r;if(typeof i.id!="string")throw new Error("[Directive] diffRules: constraint `id` must be a string");n[i.id]=i.whenSpec;}return n}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 Bt=new Set(["$eq","$ne","$in","$nin","$exists","$gt","$gte","$lt","$lte","$between","$matches","$startsWith","$endsWith","$contains","$changed"]),Wt=new Set(["$all","$any","$not"]);function xe(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Ut(e){if(!xe(e))return false;let t=Object.keys(e);if(t.length===0)return false;let n=false;for(let r of t){if(!r.startsWith("$"))return false;Bt.has(r)&&(n=true);}return n}function S(e,t="",n=[]){if(e===null||typeof e!="object")return n;if(Array.isArray(e)){for(let r of e)if(r&&typeof r=="object"&&"fact"in r&&"op"in r){let i=r;n.push({path:t?`${t}.${String(i.fact)}`:String(i.fact),op:String(i.op),value:i.value});}return n}if("$all"in e&&Array.isArray(e.$all))return e.$all.forEach((i,s)=>{S(i,`${t}$all[${s}]`,n);}),n;if("$any"in e&&Array.isArray(e.$any))return e.$any.forEach((i,s)=>{S(i,`${t}$any[${s}]`,n);}),n;if("$not"in e)return S(e.$not,`${t}$not`,n),n;for(let[r,i]of Object.entries(e)){let s=t?`${t}.${r}`:r;if(Ut(i))for(let[o,u]of Object.entries(i))n.push({path:s,op:o,value:u});else xe(i)&&!Wt.has(r)?S(i,s,n):n.push({path:s,op:"$eq",value:i});}return n}function D(e){return typeof e=="number"&&Number.isFinite(e)}function Kt(e,t,n){switch(e){case "$gte":case "$gt":if(D(t)&&D(n)){if(n<t)return "relaxed";if(n>t)return "tightened"}return null;case "$lte":case "$lt":if(D(t)&&D(n)){if(n>t)return "relaxed";if(n<t)return "tightened"}return null;case "$between":{if(Array.isArray(t)&&Array.isArray(n)&&t.length===2&&n.length===2&&D(t[0])&&D(t[1])&&D(n[0])&&D(n[1])){let r=t[1]-t[0],i=n[1]-n[0];if(i>r)return "relaxed";if(i<r)return "tightened"}return null}case "$in":case "$nin":{if(Array.isArray(t)&&Array.isArray(n))if(e==="$in"){if(n.length>t.length)return "relaxed";if(n.length<t.length)return "tightened"}else {if(n.length>t.length)return "tightened";if(n.length<t.length)return "relaxed"}return null}case "$contains":{if(Array.isArray(t)&&Array.isArray(n)){if(n.length>t.length)return "relaxed";if(n.length<t.length)return "tightened"}return null}default:return null}}function zt(e){let t=ce(e.before),n=ce(e.after),i=[...new Set([...Object.keys(t),...Object.keys(n)])].sort(),s=[],o={added:0,removed:0,changed:0,unchanged:0,totalClauseChanges:0};for(let u of i){let a=t[u],c=n[u],l=u in t,d=u in n;if(l&&!d){let y=S(a),$=y.length===0?[{path:"(function-form predicate)",kind:"removed"}]:y.map(m=>({path:m.path,kind:"removed",before:{op:m.op,value:m.value}}));le($),s.push({id:u,status:"removed",changes:$}),o.removed++,o.totalClauseChanges+=$.length;continue}if(!l&&d){let y=S(c),$=y.length===0?[{path:"(function-form predicate)",kind:"added"}]:y.map(m=>({path:m.path,kind:"added",after:{op:m.op,value:m.value}}));le($),s.push({id:u,status:"added",changes:$}),o.added++,o.totalClauseChanges+=$.length;continue}let g=Oe(a,c);g.length===0?(s.push({id:u,status:"unchanged",changes:[]}),o.unchanged++):(s.push({id:u,status:"changed",changes:g}),o.changed++,o.totalClauseChanges+=g.length);}return {constraints:s,summary:o}}function Oe(e$1,t){if(e$1!==void 0&&t!==void 0&&(e$1===null||t===null||typeof e$1!="object"||typeof t!="object"))return e(e$1)===e(t)?[]:[{path:"",kind:"changed",before:{op:"$eq",value:e$1},after:{op:"$eq",value:t}}];let n=e$1===void 0?[]:S(e$1),r=t===void 0?[]:S(t),i=c=>`${c.path}::${c.op}`,s=new Map(n.map(c=>[i(c),c])),o=new Map(r.map(c=>[i(c),c])),u=new Set([...s.keys(),...o.keys()]),a=[];for(let c of u){let l=s.get(c),d=o.get(c);if(l&&!d){a.push({path:l.path,kind:"removed",before:{op:l.op,value:l.value}});continue}if(!l&&d){a.push({path:d.path,kind:"added",after:{op:d.op,value:d.value}});continue}if(l&&d){if(e(l.value)===e(d.value))continue;let g=Kt(l.op,l.value,d.value);a.push({path:l.path,kind:g??"changed",before:{op:l.op,value:l.value},after:{op:d.op,value:d.value}});}}return le(a),a}function le(e){e.sort((t,n)=>{let r=t.path.localeCompare(n.path);if(r!==0)return r;let i=t.before?.op??t.after?.op??"",s=n.before?.op??n.after?.op??"";return i.localeCompare(s)});}function Ht(e){return h(e)}function J(e){return e===null?"null":e===void 0?"undefined":e instanceof Date?e.toISOString():typeof e=="string"||typeof e=="object"?JSON.stringify(e):String(e)}function Jt(e){let t=e.path,n=J(e.expected),r=J(e.actual);switch(e.op){case "$eq":return `set ${t} to ${n} (currently ${r})`;case "$ne":return `change ${t} to anything other than ${n} (currently ${r})`;case "$gt":return `set ${t} above ${n} (currently ${r})`;case "$gte":return `set ${t} to at least ${n} (currently ${r})`;case "$lt":return `set ${t} below ${n} (currently ${r})`;case "$lte":return `set ${t} to at most ${n} (currently ${r})`;case "$in":return `set ${t} to one of ${n} (currently ${r})`;case "$nin":return `set ${t} to something other than ${n} (currently ${r})`;case "$exists":return e.expected===true?`set ${t} to a non-null value (currently null/missing)`:`unset ${t} (currently ${r})`;case "$between":return Array.isArray(e.expected)&&e.expected.length===2?`set ${t} between ${J(e.expected[0])} and ${J(e.expected[1])} (currently ${r})`:`set ${t} within range ${n} (currently ${r})`;case "$startsWith":return `set ${t} to start with ${n} (currently ${r})`;case "$endsWith":return `set ${t} to end with ${n} (currently ${r})`;case "$contains":return `set ${t} to contain ${n} (currently ${r})`;case "$matches":return `set ${t} to match the pattern ${n} (currently ${r})`;case "$changed":return `the previous-vs-current change of ${t} is required to differ (currently they match: ${r})`;case "$all":case "$any":case "$not":return `the ${e.op} group at "${t}" did not pass \u2014 see its child clauses`;default:return `clause at ${t} (${e.op}) failed: expected ${n}, got ${r}`}}function je(e,t){for(let n of e)if(!n.pass){if((n.op==="$all"||n.op==="$any"||n.op==="$not")&&n.children){je(n.children,t);continue}t.push({path:n.path,op:n.op,expected:n.expected,actual:n.actual,suggestion:Jt(n)});}}function Qt(e,t,n){let r=p$1(e,t,n),i$1=r.every(o=>o.pass),s=[];if(i$1||je(r,s),!i$1&&n===void 0){let o=[];i(e,{operator(u,a){a==="$changed"&&o.push(u);}});for(let u of o)s.push({path:u,op:"$changed",expected:true,actual:void 0,suggestion:`$changed clause at "${u}" cannot be evaluated without a \`prev\` snapshot \u2014 pass predict(predicate, facts, prev).`});}return {wouldFire:i$1,whenExplain:r,missingChanges:s}}var Pe=new Set(["$eq","$ne","$gt","$gte","$lt","$lte","$in","$nin"]);function Q(e,t){if(e===t)return 0;if(typeof e=="number"&&typeof t=="number"||typeof e=="bigint"&&typeof t=="bigint")return e<t?-1:e>t?1:0;if(e instanceof Date&&t instanceof Date){let n=e.getTime(),r=t.getTime();return n<r?-1:n>r?1:0}return typeof e=="string"&&typeof t=="string"?e<t?-1:e>t?1:0:Number.NaN}function _(e,t){if(e===t)return true;if(typeof e!=typeof t||e===null||t===null||typeof e!="object"||Array.isArray(e)!==Array.isArray(t))return false;if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return false;for(let i=0;i<e.length;i++)if(!_(e[i],t[i]))return false;return true}let n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return false;for(let i of n)if(!_(e[i],t[i]))return false;return true}function Xt(e,t){if(!Pe.has(e.op)||!Pe.has(t.op))return {type:"overlap",reason:`Both rules touch "${e.path}".`};if(e.op==="$eq"&&t.op==="$eq")return _(e.value,t.value)?{type:"subset",reason:`Both rules require ${e.path} = ${JSON.stringify(e.value)} \u2014 candidate is redundant.`}:{type:"direct",reason:`Candidate requires ${e.path} = ${JSON.stringify(e.value)} but an existing rule requires ${e.path} = ${JSON.stringify(t.value)} \u2014 they cannot both fire.`};if(e.op==="$eq"&&t.op==="$ne")return _(e.value,t.value)?{type:"direct",reason:`Candidate requires ${e.path} = ${JSON.stringify(e.value)} but an existing rule excludes that value.`}:null;if(e.op==="$ne"&&t.op==="$eq")return _(e.value,t.value)?{type:"direct",reason:`Candidate excludes ${e.path} = ${JSON.stringify(e.value)} but an existing rule requires that exact value.`}:null;if(e.op==="$in"&&t.op==="$in"){let o=new Set(Array.isArray(e.value)?e.value:[]),u=new Set(Array.isArray(t.value)?t.value:[]),a=[...o].filter(c=>u.has(c));return a.length===0?{type:"direct",reason:`Candidate $in set for ${e.path} (${JSON.stringify([...o])}) and existing $in set (${JSON.stringify([...u])}) have no values in common \u2014 the candidate can never fire while the existing rule holds.`}:a.length===o.size&&a.length<u.size?{type:"subset",reason:`Candidate $in set for ${e.path} is a strict subset of the existing rule's $in set.`}:null}let n=e.op==="$gt"||e.op==="$gte"?e.value:void 0,r=e.op==="$lt"||e.op==="$lte"?e.value:void 0,i=t.op==="$gt"||t.op==="$gte"?t.value:void 0,s=t.op==="$lt"||t.op==="$lte"?t.value:void 0;if(n!==void 0&&s!==void 0){let o=Q(n,s);if(!Number.isNaN(o)&&(o>0||o===0&&(e.op==="$gt"||t.op==="$lt")))return {type:"direct",reason:`Candidate requires ${e.path} ${e.op==="$gt"?">":"\u2265"} ${JSON.stringify(n)} but an existing rule caps it at ${t.op==="$lt"?"<":"\u2264"} ${JSON.stringify(s)}.`}}if(i!==void 0&&r!==void 0){let o=Q(i,r);if(!Number.isNaN(o)&&(o>0||o===0&&(t.op==="$gt"||e.op==="$lt")))return {type:"direct",reason:`Candidate caps ${e.path} at ${e.op==="$lt"?"<":"\u2264"} ${JSON.stringify(r)} but an existing rule requires it ${t.op==="$gt"?">":"\u2265"} ${JSON.stringify(i)}.`}}if(n!==void 0&&i!==void 0){let o=Q(n,i);if(!Number.isNaN(o)&&o>0)return {type:"subset",reason:`Candidate's lower bound on ${e.path} (${JSON.stringify(n)}) is stricter than the existing rule's lower bound (${JSON.stringify(i)}) \u2014 candidate is a subset.`}}if(r!==void 0&&s!==void 0){let o=Q(r,s);if(!Number.isNaN(o)&&o<0)return {type:"subset",reason:`Candidate's upper bound on ${e.path} (${JSON.stringify(r)}) is stricter than the existing rule's upper bound (${JSON.stringify(s)}) \u2014 candidate is a subset.`}}return {type:"overlap",reason:`Both rules constrain "${e.path}".`}}function Fe(e){return typeof e=="object"&&e!==null&&typeof e.id=="string"}var Zt={checkAgainst(e,t){let n=Array.isArray(t)?t:"constraints"in t&&Array.isArray(t.constraints)?t.constraints:[],r=S(e);if(r.length===0)return {contradictions:[],warnings:[]};let i=new Map;for(let u of r){let a=i.get(u.path)??[];a.push(u),i.set(u.path,a);}let s=[],o=[];for(let u of n){if(!Fe(u)||u.whenSpec===void 0)continue;let a=S(u.whenSpec);for(let c of a){let l=i.get(c.path);if(l)for(let d of l){let g=Xt(d,c);if(!g)continue;let y={constraintId:u.id,type:g.type,reason:g.reason,candidatePath:d.path,candidate:{op:d.op,value:d.value},existing:{op:c.op,value:c.value}};g.type==="overlap"||g.type==="subset"?o.push(y):s.push(y);}}}return {contradictions:s,warnings:o}},checkOwns(e,t){let n=Array.isArray(t)?t:"constraints"in t&&Array.isArray(t.constraints)?t.constraints:[],r=S(e);if(r.length===0)return {warnings:[]};let i=new Set(r.map(o=>o.path)),s=[];for(let o of n){if(!Fe(o))continue;let u=Array.isArray(o.owns)?o.owns:[],a=Array.isArray(o.bind)?o.bind:[];for(let c of u)i.has(c)&&s.push({constraintId:o.id,candidatePath:c,source:"owns",reason:`Constraint "${o.id}" already owns "${c}" \u2014 candidate would race or shadow its writes.`,severity:"warning"});for(let c of a)i.has(c)&&s.push({constraintId:o.id,candidatePath:c,source:"bind",reason:`Constraint "${o.id}" binds "${c}" \u2014 candidate would write to a bound field.`,severity:"warning"});}return {warnings:s}}};var I=new Map,Yt=50;function Gt(e){let t=I.get(e);if(!t){try{t=new Intl.NumberFormat(e);}catch{t=new Intl.NumberFormat("en-US");}if(I.size>=Yt){let n=I.keys().next().value;n!==void 0&&I.delete(n);}I.set(e,t);}return t}function Vt(e,t={}){let n=t.style??"natural",r=t.parenthesize??true,i=t.locale??"en-US",s=t.factName??(a=>a);if(e===null||typeof e!="object")return "<invalid predicate>";let o={style:n,parenthesize:r,locale:i,factName:s,seen:new WeakSet,cycle:false},u=X(e,o,0);return o.cycle?"<invalid predicate: cycle>":u}var Ie=" AND ",en=" OR ",tn="NOT",Le=" \u2227 ",nn=" \u2228 ",rn="\xAC";function q(e){return typeof e!="object"||e===null||Array.isArray(e)?false:!(e instanceof Date)&&!(e instanceof RegExp)}function on(e){if(!q(e))return false;let t=Object.keys(e);if(t.length===0)return false;for(let n of t)if(!n.startsWith("$"))return false;return true}function X(e,t,n){if(n>g)return a&&console.warn(`[Directive] describePredicate: depth limit (${g}) exceeded \u2014 bailing.`),t.style==="formal"?"\u22A5":"always true";if(Array.isArray(e))return sn(e,t);if(!q(e))return f(e,t);if(t.seen.has(e))return t.cycle=true,"<invalid predicate: cycle>";t.seen.add(e);let r=e,i=Object.keys(r);for(let o of ["$all","$any","$not"])if(o in r)return an(o,r[o],t,n);let s=[];for(let o of i)o.startsWith("$")||s.push(qe(o,r[o],t,n));return Z(s,t)}function sn(e,t,n){let r=[];for(let i of e){if(!q(i))continue;let s=i;typeof s.fact!="string"||typeof s.op!="string"||r.push(L(s.fact,s.op,s.value,t));}return r.length===0?t.style==="formal"?"\u22A4":"always true":Z(r,t)}function an(e,t,n,r){if(e==="$not"){if(q(t)&&Object.keys(t).length===0)return n.style==="formal"?"\u22A5":"never";let o=X(t,n,r+1);return o==="always true"?"never":o==="\u22A4"?"\u22A5":`${n.style==="formal"?rn:`${tn} `}(${o})`}if(!Array.isArray(t))return n.style==="formal"?"\u22A5":"<invalid predicate>";if(t.length===0)return e==="$all"?n.style==="formal"?"\u22A4":"always true":n.style==="formal"?"\u22A5":"never";let i=[];for(let o of t){let u=X(o,n,r+1);i.push(u);}if(i.length===1)return i[0];let s=n.parenthesize?i.map(o=>`(${o})`):i;return e==="$all"?s.join(n.style==="formal"?Le:Ie):s.join(n.style==="formal"?nn:en)}function qe(e,t,n,r){if(on(t)){let i=t,s=Object.keys(i);if(s.length===1)return L(e,s[0],i[s[0]],n);let o=s.map(u=>L(e,u,i[u],n));return Z(o,n)}if(q(t)){let i=t;if("$all"in i||"$any"in i||"$not"in i)return X(t,n,r+1);let o=[];for(let u of Object.keys(i))u.startsWith("$")||o.push(qe(`${e}.${u}`,i[u],n,r+1));return o.length===0?L(e,"$eq",t,n):Z(o,n)}return L(e,"$eq",t,n)}function L(e,t,n,r){let i=r.style==="formal"?e:r.factName(e);return r.style==="formal"?cn(i,t,n,r):un(i,t,n,r)}function un(e,t,n,r){switch(t){case "$eq":return n===null?`${e} is null`:`${e} is ${f(n,r)}`;case "$ne":return n===null?`${e} is not null`:`${e} is not ${f(n,r)}`;case "$gt":return `${e} is more than ${f(n,r)}`;case "$gte":return `${e} is at least ${f(n,r)}`;case "$lt":return `${e} is less than ${f(n,r)}`;case "$lte":return `${e} is at most ${f(n,r)}`;case "$in":return `${e} is one of ${Ne(n,r)}`;case "$nin":return `${e} is not one of ${Ne(n,r)}`;case "$exists":return n===true?`${e} is set`:`${e} is not set`;case "$between":return Array.isArray(n)&&n.length===2?`${e} is between ${f(n[0],r)} and ${f(n[1],r)}`:`${e} is between ${f(n,r)}`;case "$startsWith":return `${e} starts with ${O(n,r,true)}`;case "$endsWith":return `${e} ends with ${O(n,r,true)}`;case "$contains":return `${e} contains ${O(n,r,true)}`;case "$matches":return n instanceof RegExp?`${e} matches ${n.toString()}`:`${e} matches ${f(n,r)}`;case "$changed":return `${e} changed`;default:return a&&!a$1.has(t)&&console.warn(`[Directive] describePredicate: unknown operator "${t}" \u2014 falling through to generic rendering.`),`${e} ${t} ${f(n,r)}`}}function cn(e,t,n,r){switch(t){case "$eq":return `${e} = ${f(n,r)}`;case "$ne":return `${e} \u2260 ${f(n,r)}`;case "$gt":return `${e} > ${f(n,r)}`;case "$gte":return `${e} \u2265 ${f(n,r)}`;case "$lt":return `${e} < ${f(n,r)}`;case "$lte":return `${e} \u2264 ${f(n,r)}`;case "$in":return `${e} \u2208 {${_e(n,r)}}`;case "$nin":return `${e} \u2209 {${_e(n,r)}}`;case "$exists":return n===true?`\u2203 ${e}`:`\u2204 ${e}`;case "$between":return Array.isArray(n)&&n.length===2?`${f(n[0],r)} \u2264 ${e} \u2264 ${f(n[1],r)}`:`${e} \u2208 [${f(n,r)}]`;case "$startsWith":return `${e} ^= ${O(n,r,true)}`;case "$endsWith":return `${e} $= ${O(n,r,true)}`;case "$contains":return `${e} \u2287 ${O(n,r,true)}`;case "$matches":return n instanceof RegExp?`${e} ~ ${n.toString()}`:`${e} ~ ${f(n,r)}`;case "$changed":return `\u0394${e}`;default:return a&&!a$1.has(t)&&console.warn(`[Directive] describePredicate: unknown operator "${t}" \u2014 falling through to generic rendering.`),`${e} ${t} ${f(n,r)}`}}function Y(e){return e.length===0?true:/[\s,"']/.test(e)}function O(e,t,n){return typeof e!="string"||n||Y(e)?JSON.stringify(e):e}function f(e,t){if(e===null)return "null";if(e===void 0)return "undefined";if(typeof e=="boolean")return e?"true":"false";if(typeof e=="number"){if(!Number.isFinite(e))return String(e);try{return Gt(t.locale).format(e)}catch{return String(e)}}if(typeof e=="bigint")return t.style==="formal"?`${e.toString()}n`:e.toString();if(typeof e=="string")return t.style==="formal"||Y(e)?JSON.stringify(e):e;if(e instanceof Date)return e.toISOString();if(e instanceof RegExp)return e.toString();if(Array.isArray(e))return `[${e.map(n=>f(n,t)).join(", ")}]`;if(typeof e=="object")try{return JSON.stringify(e)}catch{return "[object]"}return String(e)}function Ne(e,t){return Array.isArray(e)?e.map(n=>typeof n=="string"?Y(n)?JSON.stringify(n):n:f(n,t)).join(", "):f(e,t)}function _e(e,t){return Array.isArray(e)?e.map(n=>typeof n=="string"?Y(n)?JSON.stringify(n):n:f(n,t)).join(", "):f(e,t)}function Z(e,t){if(e.length===0)return t.style==="formal"?"\u22A4":"always true";if(e.length===1)return e[0];let n=t.style==="formal"?Le:Ie;return t.parenthesize,e.join(n)}var ln=/^[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)?$/;function W(e,t){if(typeof e!="string"||!ln.test(e))throw new Error(`[Directive] predicateToSQL: invalid ${t} identifier "${e}" \u2014 must match /^[A-Za-z_][A-Za-z0-9_]*(\\.[A-Za-z_][A-Za-z0-9_]*)?$/`)}function Be(e,t){if(t&&!t.includes(e))throw new Error(`[Directive] predicateToSQL: column "${e}" is not in the allowedKeys list \u2014 add it to options.allowedKeys or remove it from the predicate`)}function dn(e){if(Array.isArray(e)){if(e.length===0)throw new Error("[Directive] predicateToSQL: select must not be empty");for(let n of e)W(n,"column");return e.join(", ")}let t=e;return t==="*"?"*":(W(t,"column"),t)}function b(e,t){return e.params.push(t),e.placeholder(e.params.length)}function de(e,t,n,r){switch(t){case "$eq":return `${e} = ${b(r,n)}`;case "$ne":return `${e} <> ${b(r,n)}`;case "$gt":return `${e} > ${b(r,n)}`;case "$gte":return `${e} >= ${b(r,n)}`;case "$lt":return `${e} < ${b(r,n)}`;case "$lte":return `${e} <= ${b(r,n)}`;case "$in":if(!Array.isArray(n))throw new Error("[Directive] predicateToSQL: $in operand must be an array");return `${e} = ANY(${b(r,n)})`;case "$nin":if(!Array.isArray(n))throw new Error("[Directive] predicateToSQL: $nin operand must be an array");return `NOT (${e} = ANY(${b(r,n)}))`;case "$exists":return n===true?`${e} IS NOT NULL`:`${e} IS NULL`;case "$between":{if(!Array.isArray(n)||n.length!==2)throw new Error("[Directive] predicateToSQL: $between operand must be a [low, high] tuple");return `${e} BETWEEN ${b(r,n[0])} AND ${b(r,n[1])}`}case "$startsWith":if(typeof n!="string")throw new Error("[Directive] predicateToSQL: $startsWith operand must be a string");return `${e} LIKE ${b(r,fe(n))} || '%' ESCAPE '\\'`;case "$endsWith":if(typeof n!="string")throw new Error("[Directive] predicateToSQL: $endsWith operand must be a string");return `${e} LIKE '%' || ${b(r,fe(n))} ESCAPE '\\'`;case "$contains":if(typeof n!="string")throw new Error("[Directive] predicateToSQL: $contains only supports string operands \u2014 array containment requires a JOIN, not a predicate");return `${e} LIKE '%' || ${b(r,fe(n))} || '%' ESCAPE '\\'`;case "$matches":{if(!(n instanceof RegExp))throw new Error("[Directive] predicateToSQL: $matches operand must be a RegExp");let i=n.flags.includes("i")?"~*":"~";return `${e} ${i} ${b(r,n.source)}`}case "$changed":throw new Error('[Directive] predicateToSQL: $changed is an effects-only operator \u2014 no server-side translation (a database row has no "prev" snapshot)');default:throw new Error(`[Directive] predicateToSQL: unknown operator "${t}" \u2014 known: ${[...a$1].join(", ")}`)}}function fe(e){return e.replace(/[\\%_]/g,"\\$&")}function We(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function fn(e){if(!We(e))return false;let t=Object.keys(e);if(t.length===0)return false;for(let n of t)if(!n.startsWith("$"))return false;return true}function pe(e,t){let n=Object.keys(e).filter(r=>r!==t);if(n.length>0)throw new Error(`[Directive] predicateToSQL: ${t} cannot coexist with sibling keys (${n.join(", ")}) \u2014 wrap them in $all together, or move them inside the ${t} children`)}function B(e,t,n){if(n>g)throw new Error(`[Directive] predicateToSQL: predicate depth limit (${g}) exceeded \u2014 flatten the predicate or check for a cyclic spec object`);if(e===null||typeof e!="object")throw new Error(`[Directive] predicateToSQL: predicate must be an object or array, got ${typeof e}`);if(Array.isArray(e)){if(e.length===0)return "TRUE";let i=e.map(s=>{if(!s||typeof s!="object"||!("fact"in s)||!("op"in s))throw new Error("[Directive] predicateToSQL: array-form clause must be { fact, op, value }");let o=s;return W(o.fact,"column"),Be(o.fact,t.allowed),de(o.fact,o.op,o.value,t)});return i.length===1?i[0]:`(${i.join(" AND ")})`}if("$all"in e){pe(e,"$all");let i=e.$all;if(!Array.isArray(i))throw new Error("[Directive] predicateToSQL: $all must be an array");if(i.length===0)return "TRUE";let s=i.map(o=>B(o,t,n+1));return s.length===1?s[0]:`(${s.join(" AND ")})`}if("$any"in e){pe(e,"$any");let i=e.$any;if(!Array.isArray(i))throw new Error("[Directive] predicateToSQL: $any must be an array");if(i.length===0)return "FALSE";let s=i.map(o=>B(o,t,n+1));return s.length===1?s[0]:`(${s.join(" OR ")})`}if("$not"in e){pe(e,"$not");let i=e.$not;return `NOT (${B(i,t,n+1)})`}let r=[];for(let[i,s]of Object.entries(e))if(W(i,"column"),Be(i,t.allowed),fn(s))for(let[o,u]of Object.entries(s)){if(!a$1.has(o))throw new Error(`[Directive] predicateToSQL: unknown operator "${o}" on column "${i}" \u2014 known: ${[...a$1].join(", ")}`);r.push(de(i,o,u,t));}else {if(We(s))throw new Error(`[Directive] predicateToSQL: nested predicate at "${i}" \u2014 cross-module / partial-match predicates have no SQL equivalent (single-table queries only in v1; pass a flat predicate or build JOIN by hand with predicateToWhere)`);r.push(de(i,"$eq",s,t));}return r.length===0?"TRUE":r.length===1?r[0]:`(${r.join(" AND ")})`}var Ue=e=>`$${e}`;function pn(e,t){let{table:n,allowedKeys:r}=t,i=t.placeholder??Ue,s=t.select??"*";W(n,"table");let o=dn(s),u={params:[],placeholder:i,allowed:r},a=B(e,u,0);return {sql:`SELECT ${o} FROM ${n} WHERE ${a}`,where:a,params:u.params}}function gn(e,t={}){let n=t.placeholder??Ue,r={params:[],placeholder:n,allowed:t.allowedKeys};return {where:B(e,r,0),params:r.params}}function ge(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function he(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function yn(e){if(!he(e))return false;let t=Object.keys(e);if(t.length===0)return false;for(let n of t)if(!n.startsWith("$"))return false;return true}var hn=/^[A-Za-z_][A-Za-z0-9_]*$/,mn=/^[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*$/;function Ke(e,t){if(typeof e!="string"||e.length===0)throw new Error(`[Directive] predicateToMongo: field name must be a non-empty string, got ${typeof e}`);if(e.startsWith("$"))throw new Error(`[Directive] predicateToMongo: field name "${e}" starts with "$" \u2014 reserved for Mongo operators (a top-level $where would be an injection vector)`);if(!(t.allowDottedPaths?mn:hn).test(e))throw new Error(`[Directive] predicateToMongo: invalid field name "${e}"${t.allowDottedPaths?"":' \u2014 pass options.allowDottedPaths=true to permit sub-document paths like "user.role"'}`)}function ze(e,t){if(t&&!t.includes(e))throw new Error(`[Directive] predicateToMongo: field "${e}" is not in the allowedKeys list \u2014 add it to options.allowedKeys or remove it from the predicate`)}function ye(e,t){let n=Object.keys(e).filter(r=>r!==t);if(n.length>0)throw new Error(`[Directive] predicateToMongo: ${t} cannot coexist with sibling keys (${n.join(", ")}) \u2014 wrap them in $all together, or move them inside the ${t} children`)}function He(e,t){switch(e){case "$eq":case "$ne":case "$gt":case "$gte":case "$lt":case "$lte":case "$in":case "$nin":case "$exists":return {[e]:t};case "$between":{if(!Array.isArray(t)||t.length!==2)throw new Error("[Directive] predicateToMongo: $between operand must be a [low, high] tuple");return {$gte:t[0],$lte:t[1]}}case "$startsWith":if(typeof t!="string")throw new Error("[Directive] predicateToMongo: $startsWith operand must be a string");return {$regex:`^${ge(t)}`};case "$endsWith":if(typeof t!="string")throw new Error("[Directive] predicateToMongo: $endsWith operand must be a string");return {$regex:`${ge(t)}$`};case "$contains":if(typeof t=="string")return {$regex:ge(t)};throw new Error("[Directive] predicateToMongo: $contains in Mongo expects a string operand \u2014 for array element membership use $elemMatch or $in directly");case "$matches":{if(t instanceof RegExp)return t.flags?{$regex:t.source,$options:t.flags}:{$regex:t.source};if(typeof t=="string")return {$regex:t};throw new Error("[Directive] predicateToMongo: $matches operand must be a RegExp or string")}case "$changed":throw new Error("[Directive] predicateToMongo: $changed is an effects-only operator \u2014 no MongoDB query equivalent");default:throw new Error(`[Directive] predicateToMongo: unknown operator "${e}" \u2014 known: ${[...a$1].join(", ")}`)}}function j(e,t,n){if(n>g)throw new Error(`[Directive] predicateToMongo: predicate depth limit (${g}) exceeded \u2014 flatten the predicate or check for a cyclic spec object`);if(e===null||typeof e!="object")throw new Error(`[Directive] predicateToMongo: predicate must be an object or array, got ${typeof e}`);if(Array.isArray(e)){if(e.length===0)return {};let i={},s=[];for(let o of e){if(!o||typeof o!="object"||!("fact"in o)||!("op"in o))throw new Error("[Directive] predicateToMongo: array-form clause must be { fact, op, value }");let u=o;Ke(u.fact,t),ze(u.fact,t.allowedKeys);let a=He(u.op,u.value);if(u.fact in i&&he(i[u.fact])){let c=i[u.fact];Object.keys(a).some(d=>d in c)?s.push({[u.fact]:a}):i[u.fact]={...c,...a};}else u.fact in i?s.push({[u.fact]:a}):i[u.fact]=a;}if(s.length>0){let o=[];for(let[u,a]of Object.entries(i))o.push({[u]:a});return o.push(...s),{$and:o}}return i}if("$all"in e){ye(e,"$all");let i=e.$all;if(!Array.isArray(i))throw new Error("[Directive] predicateToMongo: $all must be an array");return i.length===0?{}:i.length===1?j(i[0],t,n+1):{$and:i.map(s=>j(s,t,n+1))}}if("$any"in e){ye(e,"$any");let i=e.$any;if(!Array.isArray(i))throw new Error("[Directive] predicateToMongo: $any must be an array");return i.length===0?{$expr:{$eq:[1,0]}}:i.length===1?j(i[0],t,n+1):{$or:i.map(s=>j(s,t,n+1))}}if("$not"in e){ye(e,"$not");let i=e.$not;return {$nor:[j(i,t,n+1)]}}let r={};for(let[i,s]of Object.entries(e))if(Ke(i,t),ze(i,t.allowedKeys),yn(s)){let o={};for(let[u,a]of Object.entries(s)){if(!a$1.has(u))throw new Error(`[Directive] predicateToMongo: unknown operator "${u}" on field "${i}" \u2014 known: ${[...a$1].join(", ")}`);Object.assign(o,He(u,a));}r[i]=o;}else r[i]=s;return r}function $n(e,t={}){return j(e,t,0)}var wn=/^[A-Za-z_][A-Za-z0-9_]*$/;function Je(e,t){if(typeof e!="string"||!wn.test(e))throw new Error(`[Directive] predicateToPostgrest: invalid column identifier "${e}"`);if(t&&!t.includes(e))throw new Error(`[Directive] predicateToPostgrest: column "${e}" is not in the allowedKeys list \u2014 add it to options.allowedKeys or remove it from the predicate`)}function me(e,t){let n=Object.keys(e).filter(r=>r!==t);if(n.length>0)throw new Error(`[Directive] predicateToPostgrest: ${t} cannot coexist with sibling keys (${n.join(", ")}) \u2014 wrap them in $all together, or move them inside the ${t} children`)}function k(e){if(e==null)return "null";if(typeof e=="boolean")return e?"true":"false";if(typeof e=="number"||typeof e=="bigint")return String(e);if(e instanceof Date)return e.toISOString();if(typeof e=="string")return /[,.():"\\\s]/.test(e)?`"${e.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`:e;throw new Error(`[Directive] predicateToPostgrest: cannot encode value of type ${typeof e}`)}function Qe(e){return `(${e.map(k).join(",")})`}function $e(e){return e.replace(/[\\%_*]/g,"\\$&")}function P(e,t){switch(e){case "$eq":return `eq.${k(t)}`;case "$ne":return `neq.${k(t)}`;case "$gt":return `gt.${k(t)}`;case "$gte":return `gte.${k(t)}`;case "$lt":return `lt.${k(t)}`;case "$lte":return `lte.${k(t)}`;case "$in":if(!Array.isArray(t))throw new Error("[Directive] predicateToPostgrest: $in operand must be an array");return `in.${Qe(t)}`;case "$nin":if(!Array.isArray(t))throw new Error("[Directive] predicateToPostgrest: $nin operand must be an array");return `not.in.${Qe(t)}`;case "$exists":return t===true?"not.is.null":"is.null";case "$startsWith":if(typeof t!="string")throw new Error("[Directive] predicateToPostgrest: $startsWith operand must be a string");return `like.${k($e(t)+"*")}`;case "$endsWith":if(typeof t!="string")throw new Error("[Directive] predicateToPostgrest: $endsWith operand must be a string");return `like.${k("*"+$e(t))}`;case "$contains":if(typeof t!="string")throw new Error("[Directive] predicateToPostgrest: $contains expects a string operand (array containment is the cs operator with a different shape \u2014 out of scope for v1)");return `like.${k("*"+$e(t)+"*")}`;case "$matches":if(t instanceof RegExp)return `${t.flags.includes("i")?"imatch":"match"}.${k(t.source)}`;if(typeof t=="string")return `match.${k(t)}`;throw new Error("[Directive] predicateToPostgrest: $matches operand must be a RegExp or string");case "$changed":throw new Error("[Directive] predicateToPostgrest: $changed is an effects-only operator \u2014 no server query equivalent");default:throw new Error(`[Directive] predicateToPostgrest: unknown operator "${e}" \u2014 known: ${[...a$1].join(", ")}`)}}function Xe(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function bn(e){if(!Xe(e))return false;let t=Object.keys(e);if(t.length===0)return false;for(let n of t)if(!n.startsWith("$"))return false;return true}function we(e,t){return `${e}=${t}`}function G(e,t){return `${e}=(${t.join(",")})`}function be(e,t,n,r){if(t==="$between"){if(!Array.isArray(n)||n.length!==2)throw new Error("[Directive] predicateToPostgrest: $between operand must be a [low, high] tuple");let i=r?we(e,P("$gte",n[0])):`${e}.${P("$gte",n[0])}`,s=r?we(e,P("$lte",n[1])):`${e}.${P("$lte",n[1])}`;return [i,s]}return [r?we(e,P(t,n)):`${e}.${P(t,n)}`]}function U(e,t,n,r){if(r>g)throw new Error(`[Directive] predicateToPostgrest: predicate depth limit (${g}) exceeded \u2014 flatten the predicate or check for a cyclic spec object`);if(e===null||typeof e!="object")throw new Error("[Directive] predicateToPostgrest: predicate must be an object or array");if(Array.isArray(e)){let s=[];for(let o of e){if(!o||typeof o!="object"||!("fact"in o)||!("op"in o))throw new Error("[Directive] predicateToPostgrest: array-form clause must be { fact, op, value }");let u=o;Je(u.fact,t),s.push(...be(u.fact,u.op,u.value,n));}return s}if("$all"in e){me(e,"$all");let s=e.$all;if(!Array.isArray(s))throw new Error("[Directive] predicateToPostgrest: $all must be an array");if(n){let u=[];for(let a of s)u.push(...U(a,t,true,r+1));return u}let o=[];for(let u of s)o.push(...U(u,t,false,r+1));return [G("and",o)]}if("$any"in e){me(e,"$any");let s=e.$any;if(!Array.isArray(s))throw new Error("[Directive] predicateToPostgrest: $any must be an array");if(s.length===0)return n?["id=is.null","id=not.is.null"]:[G("and",["id.is.null","id.not.is.null"])];let o=[];for(let u of s)o.push(...U(u,t,false,r+1));return [G("or",o)]}if("$not"in e){me(e,"$not");let s=e.$not,o=U(s,t,false,r+1);return [G("not.and",o)]}let i=[];for(let[s,o]of Object.entries(e))if(Je(s,t),bn(o))for(let[u,a]of Object.entries(o)){if(!a$1.has(u))throw new Error(`[Directive] predicateToPostgrest: unknown operator "${u}" on column "${s}" \u2014 known: ${[...a$1].join(", ")}`);i.push(...be(s,u,a,n));}else {if(Xe(o))throw new Error(`[Directive] predicateToPostgrest: nested predicate at "${s}" \u2014 single-table queries only`);i.push(...be(s,"$eq",o,n));}return i}function Sn(e){let t=e.indexOf("=");if(t<0)return encodeURIComponent(e);let n=e.slice(0,t),r=e.slice(t+1);return `${n}=${encodeURIComponent(r)}`}function Tn(e,t={}){let n=t.mode??"querystring",r=U(e,t.allowedKeys,true,0);return r.length===0?"":n==="raw"?r.join("&"):r.map(Sn).join("&")}function V(e=[],t,n,r,i,s,o){return {_type:void 0,_validators:e,_typeName:t,_default:n,_transform:r,_description:i,_refinements:s,_meta:o,validate(u){return V([...e,u],t,n,r,i,s,o)}}}function p(e,t,n,r,i,s,o){return {...V(e,t,n,r,i,s,o),default(a){return p(e,t,a,r,i,s,o)},transform(a){return p([],t,void 0,l=>{let d=r?r(l):l;return a(d)},i,void 0,o)},brand(){return p(e,`Branded<${t}>`,n,r,i,s,o)},describe(a){return p(e,t,n,r,a,s,o)},refine(a,c){let l=[...s??[],{predicate:a,message:c}];return p([...e,a],t,n,r,i,l,o)},nullable(){return p([a=>a===null||e.every(c=>c(a))],`${t} | null`,n,r,i,void 0,o)},optional(){return p([a=>a===void 0||e.every(c=>c(a))],`${t} | undefined`,n,r,i,void 0,o)},meta(a){return p(e,t,n,r,i,s,a)}}}var kn=((...e)=>{if(e.length===0)return p([],"union");let t=e.map(n=>n._typeName??"unknown");return p([n=>e.some(r=>r._validators.every(i=>i(n)))],t.join(" | "))}),vn={string(){let e=(t,n,r,i,s,o)=>({...p(t,"string",n,r,i,s,o),minLength(a){return e([...t,c=>c.length>=a],n,r,i,s,o)},maxLength(a){return e([...t,c=>c.length<=a],n,r,i,s,o)},pattern(a){return e([...t,c=>a.test(c)],n,r,i,s,o)},default(a){return e(t,a,r,i,s,o)},describe(a){return e(t,n,r,a,s,o)},refine(a,c){let l=[...s??[],{predicate:a,message:c}];return e([...t,a],n,r,i,l,o)},meta(a){return e(t,n,r,i,s,a)}});return e([t=>typeof t=="string"])},number(){let e=(t,n,r,i,s,o)=>({...p(t,"number",n,r,i,s,o),min(a){return e([...t,c=>c>=a],n,r,i,s,o)},max(a){return e([...t,c=>c<=a],n,r,i,s,o)},default(a){return e(t,a,r,i,s,o)},describe(a){return e(t,n,r,a,s,o)},refine(a,c){let l=[...s??[],{predicate:a,message:c}];return e([...t,a],n,r,i,l,o)},meta(a){return e(t,n,r,i,s,a)}});return e([t=>typeof t=="number"])},boolean(){return p([e=>typeof e=="boolean"],"boolean")},array(){let e=(t,n,r,i,s,o)=>{let u=p(t,"array",r,void 0,i,void 0,o),a=s??{value:-1};return {...u,get _lastFailedIndex(){return a.value},set _lastFailedIndex(l){a.value=l;},of(l){let d={value:-1};return e([...t,g=>{for(let y=0;y<g.length;y++)if(!l._validators.every($=>$(g[y])))return d.value=y,false;return true}],l,r,i,d,o)},nonEmpty(){return e([...t,l=>l.length>0],n,r,i,a,o)},maxLength(l){return e([...t,d=>d.length<=l],n,r,i,a,o)},minLength(l){return e([...t,d=>d.length>=l],n,r,i,a,o)},default(l){return e(t,n,l,i,a,o)},describe(l){return e(t,n,r,l,a,o)},meta(l){return e(t,n,r,i,a,l)}}};return e([t=>Array.isArray(t)])},object(){let e=(t,n,r,i)=>({...p(t,"object",n,void 0,r,void 0,i),shape(o){return e([...t,u=>{for(let[a,c]of Object.entries(o)){let l=u[a],d=c;if(d&&!d._validators.every(g=>g(l)))return false}return true}],n,r,i)},nonNull(){return e([...t,o=>o!=null],n,r,i)},hasKeys(...o){return e([...t,u=>o.every(a=>a in u)],n,r,i)},default(o){return e(t,o,r,i)},describe(o){return e(t,n,o,i)},meta(o){return e(t,n,r,o)}});return e([t=>typeof t=="object"&&t!==null&&!Array.isArray(t)])},enum(...e){a&&e.length===0&&console.warn("[Directive] t.enum() called with no values - this will reject all strings");let t=new Set(e);return p([n=>typeof n=="string"&&t.has(n)],`enum(${e.join("|")})`)},literal(e){return p([t=>t===e],`literal(${String(e)})`)},nullable(e){let t=e._typeName??"unknown";return V([n=>n===null?true:e._validators.every(r=>r(n))],`${t} | null`)},optional(e){let t=e._typeName??"unknown";return V([n=>n===void 0?true:e._validators.every(r=>r(n))],`${t} | undefined`)},union:kn,record(e){let t=e._typeName??"unknown";return p([n=>typeof n!="object"||n===null||Array.isArray(n)?false:Object.values(n).every(r=>e._validators.every(i=>i(r)))],`Record<string, ${t}>`)},tuple(...e){a&&e.length===0&&console.warn("[Directive] t.tuple() called with no types - this will only accept empty arrays");let t=e.map(n=>n._typeName??"unknown");return p([n=>!Array.isArray(n)||n.length!==e.length?false:e.every((r,i)=>r._validators.every(s=>s(n[i])))],`[${t.join(", ")}]`)},date(){return p([e=>e instanceof Date&&!Number.isNaN(e.getTime())],"Date")},uuid(){let e=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;return p([t=>typeof t=="string"&&e.test(t)],"uuid")},email(){let e=/^[^\s@]+@[^\s@]+\.[^\s@]+$/;return p([t=>typeof t=="string"&&e.test(t)],"email")},url(){return p([e=>{if(typeof e!="string")return false;try{return new URL(e),!0}catch{return false}}],"url")},bigint(){return p([e=>typeof e=="bigint"],"bigint")},any(){return p([],"any")},unknown(){return p([],"unknown")}};function Mn(e){if(!e||typeof e!="string"){console.warn("[Directive] Module ID must be a non-empty string");return}/^(__[a-z][a-z0-9_-]*|[a-z][a-z0-9-]*)$/i.test(e)||console.warn(`[Directive] Module ID "${e}" should follow kebab-case convention (e.g., "my-module")`);}function Ze(e,t,n,r,i){for(let s of e)t.has(s)||console.warn(`[Directive] ${n} "${s}" not declared in ${r}`);for(let s of t)e.has(s)||console.warn(`[Directive] ${r}["${s}"] ${i}`);}function Rn(e,t){e.length===0&&console.warn("[Directive] history.snapshotEvents is an empty array \u2014 no events will create history snapshots. Omit history.snapshotEvents entirely to snapshot all events, or list specific events.");let n=new Set(Object.keys(t));for(let r of e)n.has(r)||console.warn(`[Directive] history.snapshotEvents entry "${r}" not declared in schema.events. Available events: ${[...n].join(", ")||"(none)"}`);}function An(e,t){let n=new Set(Object.keys(t));for(let[r,i]of Object.entries(e)){let s=i;typeof s.requirement=="string"&&!n.has(s.requirement)&&console.warn(`[Directive] Resolver "${r}" references unknown requirement type "${s.requirement}". Available types: ${[...n].join(", ")||"(none)"}`);}}function Dn(e,t){let n=t.schema?.facts??{},r=Object.keys(n);if(r.length===0)return;let i=new Set(["self","prev","current"]),s="crossModuleDeps"in t&&t.crossModuleDeps?Object.keys(t.crossModuleDeps):[];for(let o of s)i.add(o);for(let o of r)if(i.has(o))throw new Error(`[Directive] module '${e}': fact key '${o}' conflicts with a reserved namespace pivot or evaluation alias (self / prev / current / a crossModuleDep namespace). Three fixes:
1. Rename the fact (e.g. ${o}_)

@@ -3,0 +3,0 @@ 2. Remove '${o}' from this module's crossModuleDeps if it's not actually needed

@@ -1,2 +0,2 @@

'use strict';var chunkENZEHIL7_cjs=require('./chunk-ENZEHIL7.cjs'),chunkT4TRJEJN_cjs=require('./chunk-T4TRJEJN.cjs'),chunkX7G7UBXU_cjs=require('./chunk-X7G7UBXU.cjs'),chunk4MNQDXH7_cjs=require('./chunk-4MNQDXH7.cjs');Object.defineProperty(exports,"createConstraintFactory",{enumerable:true,get:function(){return chunkENZEHIL7_cjs.c}});Object.defineProperty(exports,"createConstraintsManager",{enumerable:true,get:function(){return chunkENZEHIL7_cjs.p}});Object.defineProperty(exports,"createDerivationsManager",{enumerable:true,get:function(){return chunkENZEHIL7_cjs.q}});Object.defineProperty(exports,"createDisabledHistory",{enumerable:true,get:function(){return chunkENZEHIL7_cjs.j}});Object.defineProperty(exports,"createEffectsManager",{enumerable:true,get:function(){return chunkENZEHIL7_cjs.r}});Object.defineProperty(exports,"createEngine",{enumerable:true,get:function(){return chunkENZEHIL7_cjs.z}});Object.defineProperty(exports,"createErrorBoundaryManager",{enumerable:true,get:function(){return chunkENZEHIL7_cjs.t}});Object.defineProperty(exports,"createFacts",{enumerable:true,get:function(){return chunkENZEHIL7_cjs.w}});Object.defineProperty(exports,"createFactsProxy",{enumerable:true,get:function(){return chunkENZEHIL7_cjs.v}});Object.defineProperty(exports,"createFactsStore",{enumerable:true,get:function(){return chunkENZEHIL7_cjs.u}});Object.defineProperty(exports,"createHistoryManager",{enumerable:true,get:function(){return chunkENZEHIL7_cjs.i}});Object.defineProperty(exports,"createPluginManager",{enumerable:true,get:function(){return chunkENZEHIL7_cjs.x}});Object.defineProperty(exports,"createResolverFactory",{enumerable:true,get:function(){return chunkENZEHIL7_cjs.d}});Object.defineProperty(exports,"createResolversManager",{enumerable:true,get:function(){return chunkENZEHIL7_cjs.y}});Object.defineProperty(exports,"createRetryLaterManager",{enumerable:true,get:function(){return chunkENZEHIL7_cjs.s}});Object.defineProperty(exports,"dangerousRegex",{enumerable:true,get:function(){return chunkT4TRJEJN_cjs.m}});Object.defineProperty(exports,"getCurrentDeps",{enumerable:true,get:function(){return chunkX7G7UBXU_cjs.f}});Object.defineProperty(exports,"isTracking",{enumerable:true,get:function(){return chunkX7G7UBXU_cjs.g}});Object.defineProperty(exports,"trackAccess",{enumerable:true,get:function(){return chunkX7G7UBXU_cjs.j}});Object.defineProperty(exports,"withTracking",{enumerable:true,get:function(){return chunkX7G7UBXU_cjs.h}});Object.defineProperty(exports,"withoutTracking",{enumerable:true,get:function(){return chunkX7G7UBXU_cjs.i}});Object.defineProperty(exports,"hashObject",{enumerable:true,get:function(){return chunk4MNQDXH7_cjs.h}});Object.defineProperty(exports,"safeStringify",{enumerable:true,get:function(){return chunk4MNQDXH7_cjs.o}});Object.defineProperty(exports,"stableStringify",{enumerable:true,get:function(){return chunk4MNQDXH7_cjs.e}});//# sourceMappingURL=internals.cjs.map
'use strict';var chunkENZEHIL7_cjs=require('./chunk-ENZEHIL7.cjs'),chunkT4TRJEJN_cjs=require('./chunk-T4TRJEJN.cjs'),chunkX7G7UBXU_cjs=require('./chunk-X7G7UBXU.cjs'),chunk4MNQDXH7_cjs=require('./chunk-4MNQDXH7.cjs');Object.defineProperty(exports,"createConstraintFactory",{enumerable:true,get:function(){return chunkENZEHIL7_cjs.c}});Object.defineProperty(exports,"createConstraintsManager",{enumerable:true,get:function(){return chunkENZEHIL7_cjs.p}});Object.defineProperty(exports,"createDerivationsManager",{enumerable:true,get:function(){return chunkENZEHIL7_cjs.q}});Object.defineProperty(exports,"createDisabledHistory",{enumerable:true,get:function(){return chunkENZEHIL7_cjs.j}});Object.defineProperty(exports,"createEffectsManager",{enumerable:true,get:function(){return chunkENZEHIL7_cjs.r}});Object.defineProperty(exports,"createEngine",{enumerable:true,get:function(){return chunkENZEHIL7_cjs.z}});Object.defineProperty(exports,"createErrorBoundaryManager",{enumerable:true,get:function(){return chunkENZEHIL7_cjs.t}});Object.defineProperty(exports,"createFacts",{enumerable:true,get:function(){return chunkENZEHIL7_cjs.w}});Object.defineProperty(exports,"createFactsProxy",{enumerable:true,get:function(){return chunkENZEHIL7_cjs.v}});Object.defineProperty(exports,"createFactsStore",{enumerable:true,get:function(){return chunkENZEHIL7_cjs.u}});Object.defineProperty(exports,"createHistoryManager",{enumerable:true,get:function(){return chunkENZEHIL7_cjs.i}});Object.defineProperty(exports,"createPluginManager",{enumerable:true,get:function(){return chunkENZEHIL7_cjs.x}});Object.defineProperty(exports,"createResolverFactory",{enumerable:true,get:function(){return chunkENZEHIL7_cjs.d}});Object.defineProperty(exports,"createResolversManager",{enumerable:true,get:function(){return chunkENZEHIL7_cjs.y}});Object.defineProperty(exports,"createRetryLaterManager",{enumerable:true,get:function(){return chunkENZEHIL7_cjs.s}});Object.defineProperty(exports,"dangerousRegex",{enumerable:true,get:function(){return chunkT4TRJEJN_cjs.m}});Object.defineProperty(exports,"getCurrentDeps",{enumerable:true,get:function(){return chunkX7G7UBXU_cjs.f}});Object.defineProperty(exports,"isTracking",{enumerable:true,get:function(){return chunkX7G7UBXU_cjs.g}});Object.defineProperty(exports,"trackAccess",{enumerable:true,get:function(){return chunkX7G7UBXU_cjs.j}});Object.defineProperty(exports,"withTracking",{enumerable:true,get:function(){return chunkX7G7UBXU_cjs.h}});Object.defineProperty(exports,"withoutTracking",{enumerable:true,get:function(){return chunkX7G7UBXU_cjs.i}});Object.defineProperty(exports,"hashObject",{enumerable:true,get:function(){return chunk4MNQDXH7_cjs.h}});Object.defineProperty(exports,"isPrototypeSafe",{enumerable:true,get:function(){return chunk4MNQDXH7_cjs.f}});Object.defineProperty(exports,"safeStringify",{enumerable:true,get:function(){return chunk4MNQDXH7_cjs.o}});Object.defineProperty(exports,"stableStringify",{enumerable:true,get:function(){return chunk4MNQDXH7_cjs.e}});//# sourceMappingURL=internals.cjs.map
//# sourceMappingURL=internals.cjs.map

@@ -5,3 +5,3 @@ import { a8 as Schema, ai as FactsStore, a as Facts, D as DefinitionMeta, E as EffectsDef, aj as ConstraintsDef, r as RequirementKeyFn, R as RequirementWithId, ak as ConstraintState, F as FactPredicate, C as ClauseResult, al as ResolversDef, am as ResolverStatus, q as Requirement, P as Plugin, aa as System, an as FactChange, z as FactsSnapshot, ao as ReconcileResult, a9 as Snapshot, s as DirectiveError, ap as RecoveryStrategy, af as TraceEntry, aq as ErrorSource, p as ErrorBoundaryConfig, ar as RetryLaterConfig, H as HistoryAPI, G as HistoryOption, ab as SystemConfig } from './plugins-BIzXaYbg.cjs';

export { y as DerivationState, T as TypedConstraint, z as TypedResolver, A as createConstraintFactory, B as createResolverFactory, C as dangerousRegex } from './predicate-Bnx3LN7P.cjs';
export { h as hashObject, g as safeStringify, j as stableStringify } from './utils-Mg55IerF.cjs';
export { h as hashObject, g as isPrototypeSafe, j as safeStringify, k as stableStringify } from './utils-BZBBwS5A.cjs';

@@ -8,0 +8,0 @@ /**

@@ -5,3 +5,3 @@ import { a8 as Schema, ai as FactsStore, a as Facts, D as DefinitionMeta, E as EffectsDef, aj as ConstraintsDef, r as RequirementKeyFn, R as RequirementWithId, ak as ConstraintState, F as FactPredicate, C as ClauseResult, al as ResolversDef, am as ResolverStatus, q as Requirement, P as Plugin, aa as System, an as FactChange, z as FactsSnapshot, ao as ReconcileResult, a9 as Snapshot, s as DirectiveError, ap as RecoveryStrategy, af as TraceEntry, aq as ErrorSource, p as ErrorBoundaryConfig, ar as RetryLaterConfig, H as HistoryAPI, G as HistoryOption, ab as SystemConfig } from './plugins-BIzXaYbg.js';

export { y as DerivationState, T as TypedConstraint, z as TypedResolver, A as createConstraintFactory, B as createResolverFactory, C as dangerousRegex } from './predicate-BxQVf0ug.js';
export { h as hashObject, g as safeStringify, j as stableStringify } from './utils-Mg55IerF.js';
export { h as hashObject, g as isPrototypeSafe, j as safeStringify, k as stableStringify } from './utils-BZBBwS5A.js';

@@ -8,0 +8,0 @@ /**

@@ -1,2 +0,2 @@

export{c as createConstraintFactory,p as createConstraintsManager,q as createDerivationsManager,j as createDisabledHistory,r as createEffectsManager,z as createEngine,t as createErrorBoundaryManager,w as createFacts,v as createFactsProxy,u as createFactsStore,i as createHistoryManager,x as createPluginManager,d as createResolverFactory,y as createResolversManager,s as createRetryLaterManager}from'./chunk-R2GHSCTR.js';export{m as dangerousRegex}from'./chunk-2FF6QGOA.js';export{f as getCurrentDeps,g as isTracking,j as trackAccess,h as withTracking,i as withoutTracking}from'./chunk-I722BZA5.js';export{h as hashObject,o as safeStringify,e as stableStringify}from'./chunk-PXRV64PA.js';//# sourceMappingURL=internals.js.map
export{c as createConstraintFactory,p as createConstraintsManager,q as createDerivationsManager,j as createDisabledHistory,r as createEffectsManager,z as createEngine,t as createErrorBoundaryManager,w as createFacts,v as createFactsProxy,u as createFactsStore,i as createHistoryManager,x as createPluginManager,d as createResolverFactory,y as createResolversManager,s as createRetryLaterManager}from'./chunk-R2GHSCTR.js';export{m as dangerousRegex}from'./chunk-2FF6QGOA.js';export{f as getCurrentDeps,g as isTracking,j as trackAccess,h as withTracking,i as withoutTracking}from'./chunk-I722BZA5.js';export{h as hashObject,f as isPrototypeSafe,o as safeStringify,e as stableStringify}from'./chunk-PXRV64PA.js';//# sourceMappingURL=internals.js.map
//# sourceMappingURL=internals.js.map

@@ -1,3 +0,3 @@

'use strict';var chunkIXRS4LM4_cjs=require('../chunk-IXRS4LM4.cjs');require('../chunk-T4TRJEJN.cjs');var chunk4MNQDXH7_cjs=require('../chunk-4MNQDXH7.cjs');var _documentCurrentScript=typeof document!=='undefined'?document.currentScript:null;var Oe={debug:0,info:1,warn:2,error:3};function st(e={}){let{level:s="info",filter:o=()=>true,logger:r=console,prefix:a="[Directive]"}=e,p=Oe[s],l=(t,i,...c)=>{Oe[t]<p||o(i)&&r[t](`${a} ${i}`,...c);};return {name:"logging",onInit:()=>l("debug","init"),onStart:()=>l("info","start"),onStop:()=>l("info","stop"),onDestroy:()=>l("debug","destroy"),onFactSet:(t,i,c)=>{l("debug","fact.set",{key:t,value:i,prev:c});},onFactDelete:(t,i)=>{l("debug","fact.delete",{key:t,prev:i});},onFactsBatch:t=>{l("debug","facts.batch",{count:t.length,changes:t});},onDerivationCompute:(t,i,c)=>{l("debug","derivation.compute",{id:t,value:i,deps:c});},onDerivationInvalidate:t=>{l("debug","derivation.invalidate",{id:t});},onReconcileStart:()=>{l("debug","reconcile.start");},onReconcileEnd:t=>{l("debug","reconcile.end",{unmet:t.unmet.length,inflight:t.inflight.length,completed:t.completed.length,canceled:t.canceled.length});},onConstraintEvaluate:(t,i,c)=>{if(c){let d=c.filter(y=>y.pass).length;l("debug","constraint.evaluate",{id:t,active:i,clauses:{total:c.length,passed:d}});return}l("debug","constraint.evaluate",{id:t,active:i});},onConstraintError:(t,i)=>{l("error","constraint.error",{id:t,error:i});},onRequirementCreated:t=>{l("debug","requirement.created",{id:t.id,type:t.requirement.type});},onRequirementMet:(t,i)=>{l("info","requirement.met",{id:t.id,byResolver:i});},onRequirementCanceled:t=>{l("debug","requirement.canceled",{id:t.id});},onResolverStart:(t,i)=>{l("debug","resolver.start",{resolver:t,requirementId:i.id});},onResolverComplete:(t,i,c)=>{l("info","resolver.complete",{resolver:t,requirementId:i.id,duration:c});},onResolverError:(t,i,c)=>{l("error","resolver.error",{resolver:t,requirementId:i.id,error:c});},onResolverRetry:(t,i,c)=>{l("warn","resolver.retry",{resolver:t,requirementId:i.id,attempt:c});},onResolverCancel:(t,i)=>{l("debug","resolver.cancel",{resolver:t,requirementId:i.id});},onResolverWriteRejected:t=>{l("warn","resolver.write.rejected",t.kind==="summary"?{kind:t.kind,resolver:t.resolver,requirementId:t.req.id,reason:t.reason,dropped:t.dropped}:{kind:t.kind,resolver:t.resolver,requirementId:t.req.id,reason:t.reason,fact:t.fact,expected:t.expected,actual:t.actual});},onEffectRun:t=>{l("debug","effect.run",{id:t});},onEffectError:(t,i)=>{l("error","effect.error",{id:t,error:i});},onSnapshot:t=>{l("debug","timetravel.snapshot",{id:t.id,trigger:t.trigger});},onHistoryNavigate:(t,i)=>{l("info","timetravel.jump",{from:t,to:i});},onError:t=>{l("error","error",{source:t.source,sourceId:t.sourceId,message:t.message});},onErrorRecovery:(t,i)=>{l("warn","error.recovery",{source:t.source,sourceId:t.sourceId,strategy:i});},onDefinitionRegister:(t,i)=>{l("info","definition.register",{type:t,id:i});},onDefinitionAssign:(t,i)=>{l("info","definition.assign",{type:t,id:i});},onDefinitionUnregister:(t,i)=>{l("info","definition.unregister",{type:t,id:i});},onDefinitionCall:(t,i,c)=>{l("debug","definition.call",{type:t,id:i,props:c});},onTraceComplete:t=>{l("debug","trace.complete",{id:t.id,status:t.status,duration:t.duration,factChanges:t.factChanges.length,derivationsRecomputed:t.derivationsRecomputed.length,constraintsHit:t.constraintsHit.length,resolversStarted:t.resolversStarted.length,effectsRun:t.effectsRun.length});}}}var ue=class{constructor(s){this.capacity=s;this.buf=new Array(s);}buf;head=0;_size=0;get size(){return this._size}push(s){this.buf[this.head]=s,this.head=(this.head+1)%this.capacity,this._size<this.capacity&&this._size++;}toArray(){return this._size===0?[]:this._size<this.capacity?this.buf.slice(0,this._size):[...this.buf.slice(this.head),...this.buf.slice(0,this.head)]}clear(){this.buf=new Array(this.capacity),this.head=0,this._size=0;}};function ge(){try{if(typeof process<"u"&&process.env?.NODE_ENV==="production")return !1}catch{}try{if(typeof ({ url: (typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href)) })<"u"&&undefined?.MODE==="production")return !1}catch{}return true}function fe(e){try{if(e===void 0)return "undefined";if(e===null)return "null";if(typeof e=="bigint")return String(e)+"n";if(typeof e=="symbol")return String(e);if(typeof e=="object"){let s=JSON.stringify(e,(o,r)=>typeof r=="bigint"?String(r)+"n":typeof r=="symbol"?String(r):r);return s.length>120?s.slice(0,117)+"...":s}return String(e)}catch{return "<error>"}}function ee(e,s){return e.length<=s?e:e.slice(0,s-3)+"..."}function se(e){try{return e.inspect()}catch{return null}}function Le(e){try{return e==null||typeof e!="object"?e:JSON.parse(JSON.stringify(e))}catch{return null}}function Pe(e){return e===void 0?1e3:!Number.isFinite(e)||e<1?(ge()&&console.warn(`[directive:devtools] Invalid maxEvents value (${e}), using default 1000`),1e3):Math.floor(e)}function Ie(){return {reconcileCount:0,reconcileTotalMs:0,resolverStats:new Map,effectRunCount:0,effectErrorCount:0,lastReconcileStartMs:0}}var it=200,ie=340,ae=16,ce=80,he=2,Se=["#8b9aff","#4ade80","#fbbf24","#c084fc","#f472b6","#22d3ee"];function $e(){return {entries:new ue(it),inflight:new Map}}function _e(){return {derivationDeps:new Map,activeConstraints:new Set,recentlyChangedFacts:new Set,recentlyComputedDerivations:new Set,recentlyActiveConstraints:new Set,animationTimer:null}}var Ne=1e4,Be=100;function je(){return {isRecording:false,recordedEvents:[],snapshots:[]}}var He=50,xe=200,b={bg:"#1a1a2e",text:"#e0e0e0",accent:"#8b9aff",muted:"#b0b0d0",border:"#333",rowBorder:"#2a2a4a",green:"#4ade80",yellow:"#fbbf24",red:"#f87171",closeBtn:"#aaa",font:"ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace"},G={nodeW:90,nodeH:16,nodeGap:6,startY:16,colGap:20,fontSize:10,labelMaxChars:11};function Ve(e,s,o,r){let a=false,p={position:"fixed",zIndex:"99999",...s.includes("bottom")?{bottom:"12px"}:{top:"12px"},...s.includes("right")?{right:"12px"}:{left:"12px"}},l=document.createElement("style");l.textContent=`[data-directive-devtools] summary:focus-visible{outline:2px solid ${b.accent};outline-offset:2px;border-radius:2px}[data-directive-devtools] button:focus-visible{outline:2px solid ${b.accent};outline-offset:2px}`,document.head.appendChild(l);let t=document.createElement("button");t.setAttribute("aria-label","Open Directive DevTools"),t.setAttribute("aria-expanded",String(o)),t.title="Ctrl+Shift+D to toggle",Object.assign(t.style,{...p,background:b.bg,color:b.text,border:`1px solid ${b.border}`,borderRadius:"6px",padding:"10px 14px",minWidth:"44px",minHeight:"44px",cursor:"pointer",fontFamily:b.font,fontSize:"12px",display:o?"none":"block"}),t.textContent="Directive";let i=document.createElement("div");i.setAttribute("role","region"),i.setAttribute("aria-label","Directive DevTools"),i.setAttribute("data-directive-devtools",""),i.tabIndex=-1,Object.assign(i.style,{...p,background:b.bg,color:b.text,border:`1px solid ${b.border}`,borderRadius:"8px",padding:"12px",fontFamily:b.font,fontSize:"11px",maxWidth:"min(380px, calc(100vw - 24px))",maxHeight:"min(500px, calc(100vh - 24px))",overflow:"auto",boxShadow:"0 4px 20px rgba(0,0,0,0.5)",display:o?"block":"none"});let c=document.createElement("div");Object.assign(c.style,{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:"8px"});let d=document.createElement("strong");d.style.color=b.accent,d.textContent=e==="default"?"Directive DevTools":`DevTools (${e})`;let y=document.createElement("button");y.setAttribute("aria-label","Close DevTools"),Object.assign(y.style,{background:"none",border:"none",color:b.closeBtn,cursor:"pointer",fontSize:"16px",padding:"8px 12px",minWidth:"44px",minHeight:"44px",lineHeight:"1",display:"flex",alignItems:"center",justifyContent:"center"}),y.textContent="\xD7",c.appendChild(d),c.appendChild(y),i.appendChild(c);let I=document.createElement("div");I.style.marginBottom="6px",I.setAttribute("aria-live","polite");let N=document.createElement("span");N.style.color=b.green,N.textContent="Settled",I.appendChild(N),i.appendChild(I);let R=document.createElement("div");Object.assign(R.style,{display:"none",marginBottom:"8px",padding:"4px 8px",background:"#252545",borderRadius:"4px",alignItems:"center",gap:"6px"});let w=document.createElement("button");Object.assign(w.style,{background:"none",border:`1px solid ${b.border}`,color:b.text,cursor:"pointer",padding:"4px 10px",borderRadius:"3px",fontFamily:b.font,fontSize:"11px",minWidth:"44px",minHeight:"44px"}),w.textContent="\u25C0 Undo",w.disabled=true;let g=document.createElement("button");Object.assign(g.style,{background:"none",border:`1px solid ${b.border}`,color:b.text,cursor:"pointer",padding:"4px 10px",borderRadius:"3px",fontFamily:b.font,fontSize:"11px",minWidth:"44px",minHeight:"44px"}),g.textContent="Redo \u25B6",g.disabled=true;let f=document.createElement("span");f.style.color=b.muted,f.style.fontSize="10px",R.appendChild(w),R.appendChild(g),R.appendChild(f),i.appendChild(R);function C(z,K){let X=document.createElement("details");K&&(X.open=true),X.style.marginBottom="4px";let J=document.createElement("summary");Object.assign(J.style,{cursor:"pointer",color:b.accent,marginBottom:"4px"});let Q=document.createElement("span");J.textContent=`${z} (`,J.appendChild(Q),J.appendChild(document.createTextNode(")")),Q.textContent="0",X.appendChild(J);let te=document.createElement("table");Object.assign(te.style,{width:"100%",borderCollapse:"collapse",fontSize:"11px"});let Re=document.createElement("thead"),De=document.createElement("tr");for(let nt of ["Key","Value"]){let pe=document.createElement("th");pe.scope="col",Object.assign(pe.style,{textAlign:"left",padding:"2px 4px",color:b.accent}),pe.textContent=nt,De.appendChild(pe);}Re.appendChild(De),te.appendChild(Re);let Ae=document.createElement("tbody");return te.appendChild(Ae),X.appendChild(te),{details:X,tbody:Ae,countSpan:Q}}function T(z,K){let X=document.createElement("details");X.style.marginBottom="4px";let J=document.createElement("summary");Object.assign(J.style,{cursor:"pointer",color:K,marginBottom:"4px"});let Q=document.createElement("span");J.textContent=`${z} (`,J.appendChild(Q),J.appendChild(document.createTextNode(")")),Q.textContent="0",X.appendChild(J);let te=document.createElement("ul");return Object.assign(te.style,{margin:"0",paddingLeft:"16px"}),X.appendChild(te),{details:X,list:te,countSpan:Q}}let P=C("Facts",true);i.appendChild(P.details);let F=C("Derivations",false);i.appendChild(F.details);let O=T("Inflight",b.yellow);i.appendChild(O.details);let Y=T("Unmet",b.red);i.appendChild(Y.details);let $=document.createElement("details");$.style.marginBottom="4px";let V=document.createElement("summary");Object.assign(V.style,{cursor:"pointer",color:b.accent,marginBottom:"4px"}),V.textContent="Performance",$.appendChild(V);let _=document.createElement("div");_.style.fontSize="10px",_.style.color=b.muted,_.textContent="No data yet",$.appendChild(_),i.appendChild($);let H=document.createElement("details");H.style.marginBottom="4px";let h=document.createElement("summary");Object.assign(h.style,{cursor:"pointer",color:b.accent,marginBottom:"4px"}),h.textContent="Dependency Graph",H.appendChild(h);let x=document.createElementNS("http://www.w3.org/2000/svg","svg");x.setAttribute("width","100%"),x.setAttribute("height","120"),x.setAttribute("role","img"),x.setAttribute("aria-label","System dependency graph"),x.style.display="block",x.setAttribute("viewBox","0 0 460 120"),x.setAttribute("preserveAspectRatio","xMinYMin meet"),H.appendChild(x),i.appendChild(H);let E=document.createElement("details");E.style.marginBottom="4px";let q=document.createElement("summary");Object.assign(q.style,{cursor:"pointer",color:b.accent,marginBottom:"4px"}),q.textContent="Timeline",E.appendChild(q);let j=document.createElementNS("http://www.w3.org/2000/svg","svg");j.setAttribute("width","100%"),j.setAttribute("height","60"),j.setAttribute("role","img"),j.setAttribute("aria-label","Resolver execution timeline"),j.style.display="block",j.setAttribute("viewBox",`0 0 ${ie} 60`),j.setAttribute("preserveAspectRatio","xMinYMin meet");let u=document.createElementNS("http://www.w3.org/2000/svg","text");u.setAttribute("x",String(ie/2)),u.setAttribute("y","30"),u.setAttribute("text-anchor","middle"),u.setAttribute("fill",b.muted),u.setAttribute("font-size","10"),u.setAttribute("font-family",b.font),u.textContent="No resolver activity yet",j.appendChild(u),E.appendChild(j),i.appendChild(E);let M=(()=>{let z=document.createElement("details");z.style.marginBottom="4px";let K=document.createElement("summary");Object.assign(K.style,{cursor:"pointer",color:b.accent,marginBottom:"4px"});let X=document.createElement("span");X.textContent="0",K.textContent="Constraints (",K.appendChild(X),K.appendChild(document.createTextNode(")")),z.appendChild(K);let J=document.createElement("div");Object.assign(J.style,{fontSize:"11px"});let Q=document.createElement("div");return Q.style.color=b.muted,Q.style.padding="4px",Q.style.fontStyle="italic",Q.textContent="Waiting for first evaluation\u2026",Q.className="dt-constraints-empty",J.appendChild(Q),z.appendChild(J),i.appendChild(z),{details:z,body:J,countSpan:X}})(),S,A,W,k;if(r){let z=document.createElement("details");z.style.marginBottom="4px";let K=document.createElement("summary");Object.assign(K.style,{cursor:"pointer",color:b.accent,marginBottom:"4px"}),W=document.createElement("span"),W.textContent="0",K.textContent="Events (",K.appendChild(W),K.appendChild(document.createTextNode(")")),z.appendChild(K),A=document.createElement("div"),Object.assign(A.style,{maxHeight:"150px",overflow:"auto",fontSize:"10px"}),A.setAttribute("role","log"),A.setAttribute("aria-live","polite"),A.tabIndex=0;let X=document.createElement("div");X.style.color=b.muted,X.style.padding="4px",X.textContent="Waiting for events...",X.className="dt-events-empty",A.appendChild(X),z.appendChild(A),i.appendChild(z),S=z,k=document.createElement("div");}else S=document.createElement("details"),A=document.createElement("div"),W=document.createElement("span"),k=document.createElement("div"),k.style.fontSize="10px",k.style.color=b.muted,k.style.marginTop="4px",k.style.fontStyle="italic",k.textContent="Enable trace: true for event log",i.appendChild(k);let L=document.createElement("div");Object.assign(L.style,{display:"flex",gap:"6px",marginTop:"6px"});let n=document.createElement("button");Object.assign(n.style,{background:"none",border:`1px solid ${b.border}`,color:b.text,cursor:"pointer",padding:"8px 12px",borderRadius:"3px",fontFamily:b.font,fontSize:"10px",minWidth:"44px",minHeight:"44px"}),n.textContent="\u23FA Record";let m=document.createElement("button");Object.assign(m.style,{background:"none",border:`1px solid ${b.border}`,color:b.text,cursor:"pointer",padding:"8px 12px",borderRadius:"3px",fontFamily:b.font,fontSize:"10px",minWidth:"44px",minHeight:"44px"}),m.textContent="\u2913 Export",L.appendChild(n),L.appendChild(m),i.appendChild(L),i.addEventListener("wheel",z=>{let K=i,X=K.scrollTop===0&&z.deltaY<0,J=K.scrollTop+K.clientHeight>=K.scrollHeight&&z.deltaY>0;(X||J)&&z.preventDefault();},{passive:false});let v=o,D=new Set;function B(){v=true,i.style.display="block",t.style.display="none",t.setAttribute("aria-expanded","true"),y.focus();}function U(){v=false,i.style.display="none",t.style.display="block",t.setAttribute("aria-expanded","false"),t.focus();}t.addEventListener("click",B),y.addEventListener("click",U);function Z(z){z.key==="Escape"&&v&&U();}i.addEventListener("keydown",Z);function re(z){z.key==="d"&&z.shiftKey&&(z.ctrlKey||z.metaKey)&&(z.preventDefault(),v?U():B());}document.addEventListener("keydown",re);function oe(){a||(document.body.appendChild(t),document.body.appendChild(i));}document.body?oe():document.addEventListener("DOMContentLoaded",oe,{once:true});function le(){a=true,t.removeEventListener("click",B),y.removeEventListener("click",U),i.removeEventListener("keydown",Z),document.removeEventListener("keydown",re),document.removeEventListener("DOMContentLoaded",oe);for(let z of D)clearTimeout(z);D.clear(),t.remove(),i.remove(),l.remove();}return {refs:{container:i,toggleBtn:t,titleEl:d,statusEl:N,factsBody:P.tbody,factsCount:P.countSpan,derivBody:F.tbody,derivCount:F.countSpan,derivSection:F.details,inflightList:O.list,inflightSection:O.details,inflightCount:O.countSpan,unmetList:Y.list,unmetSection:Y.details,unmetCount:Y.countSpan,perfSection:$,perfBody:_,historySection:R,historyLabel:f,undoBtn:w,redoBtn:g,flowSection:H,flowSvg:x,timelineSection:E,timelineSvg:j,eventsSection:S,eventsList:A,eventsCount:W,traceHint:k,recordBtn:n,exportBtn:m,constraintsSection:M.details,constraintsBody:M.body,constraintsCount:M.countSpan},destroy:le,isOpen:()=>v,flashTimers:D}}function de(e,s,o,r,a,p){let l=fe(r),t=e.get(o);if(t){let i=t.cells;if(i[1]&&(i[1].textContent=l,a&&p)){let c=i[1];c.style.background="rgba(139, 154, 255, 0.25)";let d=setTimeout(()=>{c.style.background="",p.delete(d);},300);p.add(d);}}else {t=document.createElement("tr"),t.style.borderBottom=`1px solid ${b.rowBorder}`;let i=document.createElement("td");Object.assign(i.style,{padding:"2px 4px",color:b.muted}),i.textContent=o;let c=document.createElement("td");c.style.padding="2px 4px",c.textContent=l,t.appendChild(i),t.appendChild(c),s.appendChild(t),e.set(o,t);}}function ze(e,s){let o=e.get(s);o&&(o.remove(),e.delete(s));}function be(e,s,o){if(e.inflightList.replaceChildren(),e.inflightCount.textContent=String(s.length),s.length>0)for(let r of s){let a=document.createElement("li");a.style.fontSize="11px",a.textContent=`${r.resolverId} (${r.id})`,e.inflightList.appendChild(a);}else {let r=document.createElement("li");r.style.fontSize="10px",r.style.color=b.muted,r.textContent="None",e.inflightList.appendChild(r);}if(e.unmetList.replaceChildren(),e.unmetCount.textContent=String(o.length),o.length>0)for(let r of o){let a=document.createElement("li");a.style.fontSize="11px",a.textContent=`${r.requirement.type} from ${r.fromConstraint}`,e.unmetList.appendChild(a);}else {let r=document.createElement("li");r.style.fontSize="10px",r.style.color=b.muted,r.textContent="None",e.unmetList.appendChild(r);}}function ye(e,s,o){let r=s===0&&o===0;e.statusEl.style.color=r?b.green:b.yellow,e.statusEl.textContent=r?"Settled":"Working...",e.toggleBtn.textContent=r?"Directive":"Directive...",e.toggleBtn.setAttribute("aria-label",`Open Directive DevTools${r?"":" (system working)"}`);}function Ee(e,s,o,r){let a=Object.keys(o.derive);if(e.derivCount.textContent=String(a.length),a.length===0){s.clear(),e.derivBody.replaceChildren();let l=document.createElement("tr"),t=document.createElement("td");t.colSpan=2,t.style.color=b.muted,t.style.fontSize="10px",t.textContent="No derivations defined",l.appendChild(t),e.derivBody.appendChild(l);return}let p=new Set(a);for(let[l,t]of s)p.has(l)||(t.remove(),s.delete(l));for(let l of a){let t;try{t=fe(o.read(l));}catch{t="<error>";}de(s,e.derivBody,l,t,true,r);}}function We(e,s,o,r){let a=e.eventsList.querySelector(".dt-events-empty");a&&a.remove();let p=document.createElement("div");Object.assign(p.style,{padding:"2px 4px",borderBottom:`1px solid ${b.rowBorder}`,fontFamily:"inherit"});let l=new Date,t=`${String(l.getHours()).padStart(2,"0")}:${String(l.getMinutes()).padStart(2,"0")}:${String(l.getSeconds()).padStart(2,"0")}.${String(l.getMilliseconds()).padStart(3,"0")}`,i;try{let I=JSON.stringify(o);i=ee(I,60);}catch{i="{}";}let c=document.createElement("span");c.style.color=b.closeBtn,c.textContent=t;let d=document.createElement("span");d.style.color=b.accent,d.textContent=` ${s} `;let y=document.createElement("span");for(y.style.color=b.muted,y.textContent=i,p.appendChild(c),p.appendChild(d),p.appendChild(y),e.eventsList.prepend(p);e.eventsList.childElementCount>He;)e.eventsList.lastElementChild?.remove();e.eventsCount.textContent=String(r);}function Ue(e,s){e.perfBody.replaceChildren();let o=s.reconcileCount>0?(s.reconcileTotalMs/s.reconcileCount).toFixed(1):"\u2014",r=[`Reconciles: ${s.reconcileCount} (avg ${o}ms)`,`Effects: ${s.effectRunCount} run, ${s.effectErrorCount} errors`];for(let a of r){let p=document.createElement("div");p.style.marginBottom="2px",p.textContent=a,e.perfBody.appendChild(p);}if(s.resolverStats.size>0){let a=document.createElement("div");a.style.marginTop="4px",a.style.marginBottom="2px",a.style.color=b.accent,a.textContent="Resolvers:",e.perfBody.appendChild(a);let p=[...s.resolverStats.entries()].sort((l,t)=>t[1].totalMs-l[1].totalMs);for(let[l,t]of p){let i=t.count>0?(t.totalMs/t.count).toFixed(1):"0",c=document.createElement("div");c.style.paddingLeft="8px",c.textContent=`${l}: ${t.count}x, avg ${i}ms${t.errors>0?`, ${t.errors} err`:""}`,t.errors>0&&(c.style.color=b.red),e.perfBody.appendChild(c);}}}function Ce(e,s){let o=s.history;if(!o){e.historySection.style.display="none";return}e.historySection.style.display="flex";let r=o.currentIndex,a=o.snapshots.length;e.historyLabel.textContent=a>0?`${r+1} / ${a}`:"0 snapshots";let p=r>0,l=r<a-1;e.undoBtn.disabled=!p,e.undoBtn.style.opacity=p?"1":"0.4",e.redoBtn.disabled=!l,e.redoBtn.style.opacity=l?"1":"0.4";}function Ge(e,s){e.undoBtn.addEventListener("click",()=>{s.history&&s.history.currentIndex>0&&s.history.goBack(1);}),e.redoBtn.addEventListener("click",()=>{s.history&&s.history.currentIndex<s.history.snapshots.length-1&&s.history.goForward(1);});}var qe=Object.assign(Object.create(null),{$eq:"=",$ne:"\u2260",$gt:">",$gte:"\u2265",$lt:"<",$lte:"\u2264",$in:"\u2208",$nin:"\u2209",$exists:"exists",$between:"in",$startsWith:"starts with",$endsWith:"ends with",$contains:"contains",$matches:"matches",$changed:"changed"});function at(e){return Object.hasOwn(qe,e)?qe[e]:e}function Fe(e){return e instanceof RegExp?ee(String(e),40):fe(e)}var ct=new Set(["$all","$any","$not"]);function Ye(e){let s=document.createElement("li"),o=e.pass?"\u2713":"\u2717";if(s.style.color=e.pass?b.green:b.red,s.style.listStyle="none",ct.has(e.op)){let r=e.path?` @ ${e.path}`:"";if(s.textContent=`${o} ${e.op}${r}`,e.children&&e.children.length>0){let a=document.createElement("ul");Object.assign(a.style,{margin:"0",paddingLeft:"14px",listStyle:"none"});for(let p of e.children)a.appendChild(Ye(p));s.appendChild(a);}}else {let r=at(e.op),a=Fe(e.expected);if(e.pass)s.textContent=`${o} ${e.path} ${r} ${a}`;else {let p=Fe(e.actual);s.textContent=`${o} ${e.path} ${r} ${a} (actual: ${p})`;}}return s}function Xe(e,s,o){let r=s.get(o);if(r&&(r.remove(),s.delete(o),e.constraintsCount.textContent=String(s.size)),s.size===0&&!e.constraintsBody.querySelector(".dt-constraints-empty")){let a=document.createElement("div");a.style.color=b.muted,a.style.padding="4px",a.style.fontStyle="italic",a.textContent="Waiting for first evaluation\u2026",a.className="dt-constraints-empty",e.constraintsBody.appendChild(a);}}function Ke(e,s){let o=e.constraintsBody.querySelector(".dt-constraints-empty");o&&(o.textContent=s?"Waiting for first evaluation\u2026":"This system has no constraints");}function Je(e,s,o,r,a,p){let l=e.constraintsBody.querySelector(".dt-constraints-empty");l&&l.remove();let t=s.get(o);t||(t=document.createElement("div"),Object.assign(t.style,{marginBottom:"6px",paddingBottom:"4px",borderBottom:`1px solid ${b.rowBorder}`}),s.set(o,t),e.constraintsBody.appendChild(t),e.constraintsCount.textContent=String(s.size)),t.replaceChildren();let i=document.createElement("div");Object.assign(i.style,{fontWeight:"bold",color:r?b.green:b.muted});let c=r?"\u2713":"\u2717";if(i.textContent=p?`${c} ${o} (${p})`:`${c} ${o}`,t.appendChild(i),a&&a.length>0){let d=document.createElement("ul");Object.assign(d.style,{margin:"2px 0 0 0",paddingLeft:"14px",listStyle:"none"});for(let y of a)d.appendChild(Ye(y));t.appendChild(d);}else if(!a){let d=document.createElement("div");Object.assign(d.style,{color:b.muted,fontSize:"10px",fontStyle:"italic",paddingLeft:"14px"}),d.textContent="function-form when (no clause tree)",t.appendChild(d);}}var we=new WeakMap;function lt(e,s,o,r,a,p){return [e.join(","),s.join(","),o.map(l=>`${l.id}:${l.active}`).join(","),[...r.entries()].map(([l,t])=>`${l}:${t.status}:${t.type}`).join(","),a.join(","),p.join(",")].join("|")}function ut(e,s,o,r,a){for(let p of o){let l=e.nodes.get(`0:${p}`);if(!l)continue;let t=s.recentlyChangedFacts.has(p);l.rect.setAttribute("fill",t?b.text+"33":"none"),l.rect.setAttribute("stroke-width",t?"2":"1");}for(let p of r){let l=e.nodes.get(`1:${p}`);if(!l)continue;let t=s.recentlyComputedDerivations.has(p);l.rect.setAttribute("fill",t?b.accent+"33":"none"),l.rect.setAttribute("stroke-width",t?"2":"1");}for(let p of a){let l=e.nodes.get(`2:${p}`);if(!l)continue;let t=s.recentlyActiveConstraints.has(p),i=l.rect.getAttribute("stroke")??b.muted;l.rect.setAttribute("fill",t?i+"33":"none"),l.rect.setAttribute("stroke-width",t?"2":"1");}}function Me(e,s,o){let r=se(s);if(!r)return;let a;try{a=Object.keys(s.facts.$store.toObject());}catch{a=[];}let p=Object.keys(s.derive),l=r.constraints,t=r.unmet,i=r.inflight,c=Object.keys(r.resolvers),d=new Map;for(let u of t)d.set(u.id,{type:u.requirement.type,fromConstraint:u.fromConstraint,status:"unmet"});for(let u of i)d.set(u.id,{type:u.resolverId,fromConstraint:"",status:"inflight"});if(a.length===0&&p.length===0&&l.length===0&&c.length===0){we.delete(e.flowSvg),e.flowSvg.replaceChildren(),e.flowSvg.setAttribute("viewBox","0 0 460 40");let u=document.createElementNS("http://www.w3.org/2000/svg","text");u.setAttribute("x","230"),u.setAttribute("y","24"),u.setAttribute("text-anchor","middle"),u.setAttribute("fill",b.muted),u.setAttribute("font-size","10"),u.setAttribute("font-family",b.font),u.textContent="No system topology",e.flowSvg.appendChild(u);return}let y=i.map(u=>u.resolverId).sort(),I=lt(a,p,l,d,c,y),N=we.get(e.flowSvg);if(N&&N.fingerprint===I){ut(N,o,a,p,l.map(u=>u.id));return}let R=G.nodeW+G.colGap,w=[5,5+R,5+R*2,5+R*3,5+R*4],g=w[4]+G.nodeW+5;function f(u){let M=G.startY+12;return u.map(S=>{let A={...S,y:M};return M+=G.nodeH+G.nodeGap,A})}let C=f(a.map(u=>{let M=r.facts.find(S=>S.key===u);return {id:u,label:ee(M?.meta?.label??u,G.labelMaxChars)}})),T=f(p.map(u=>{let M=r.derivations.find(S=>S.id===u);return {id:u,label:ee(M?.meta?.label??u,G.labelMaxChars)}})),P=f(l.map(u=>({id:u.id,label:ee(u.meta?.label??u.id,G.labelMaxChars),active:u.active,priority:u.priority}))),F=f([...d.entries()].map(([u,M])=>({id:u,type:M.type,fromConstraint:M.fromConstraint,status:M.status}))),O=f(c.map(u=>{let M=r.resolverDefs.find(S=>S.id===u);return {id:u,label:ee(M?.meta?.label??u,G.labelMaxChars)}})),Y=Math.max(C.length,T.length,P.length,F.length,O.length,1),$=G.startY+12+Y*(G.nodeH+G.nodeGap)+8;e.flowSvg.replaceChildren(),e.flowSvg.setAttribute("viewBox",`0 0 ${g} ${$}`),e.flowSvg.setAttribute("aria-label",`Dependency graph: ${a.length} facts, ${p.length} derivations, ${l.length} constraints, ${d.size} requirements, ${c.length} resolvers`);let V=["Facts","Derivations","Constraints","Reqs","Resolvers"];for(let[u,M]of V.entries()){let S=document.createElementNS("http://www.w3.org/2000/svg","text");S.setAttribute("x",String(w[u]??0)),S.setAttribute("y","10"),S.setAttribute("fill",b.accent),S.setAttribute("font-size",String(G.fontSize)),S.setAttribute("font-family",b.font),S.textContent=M,e.flowSvg.appendChild(S);}let _={fingerprint:I,nodes:new Map};function H(u,M,S,A,W,k,L,n,m){let v=document.createElementNS("http://www.w3.org/2000/svg","g");if(m){let U=document.createElementNS("http://www.w3.org/2000/svg","title");U.textContent=m,v.appendChild(U);}let D=document.createElementNS("http://www.w3.org/2000/svg","rect");D.setAttribute("x",String(M)),D.setAttribute("y",String(S-6)),D.setAttribute("width",String(G.nodeW)),D.setAttribute("height",String(G.nodeH)),D.setAttribute("rx","3"),D.setAttribute("fill",n?k+"33":"none"),D.setAttribute("stroke",k),D.setAttribute("stroke-width",n?"2":"1"),D.setAttribute("opacity",L?"0.35":"1"),v.appendChild(D);let B=document.createElementNS("http://www.w3.org/2000/svg","text");return B.setAttribute("x",String(M+4)),B.setAttribute("y",String(S+4)),B.setAttribute("fill",k),B.setAttribute("font-size",String(G.fontSize)),B.setAttribute("font-family",b.font),B.setAttribute("opacity",L?"0.35":"1"),B.textContent=W,v.appendChild(B),e.flowSvg.appendChild(v),_.nodes.set(`${u}:${A}`,{g:v,rect:D,text:B}),{midX:M+G.nodeW/2,midY:S}}function h(u,M,S,A,W,k){let L=document.createElementNS("http://www.w3.org/2000/svg","line");L.setAttribute("x1",String(u)),L.setAttribute("y1",String(M)),L.setAttribute("x2",String(S)),L.setAttribute("y2",String(A)),L.setAttribute("stroke",W),L.setAttribute("stroke-width","1"),L.setAttribute("stroke-dasharray","3,2"),L.setAttribute("opacity","0.7"),e.flowSvg.appendChild(L);}let x=new Map,E=new Map,q=new Map,j=new Map;for(let u of C){let M=o.recentlyChangedFacts.has(u.id),S=r.facts.find(W=>W.key===u.id)?.meta,A=H(0,w[0],u.y,u.id,u.label,b.text,false,M,S?.description);x.set(u.id,A);}for(let u of T){let M=o.recentlyComputedDerivations.has(u.id),S=r.derivations.find(W=>W.id===u.id)?.meta,A=H(1,w[1],u.y,u.id,u.label,b.accent,false,M,S?.description);E.set(u.id,A);}for(let u of P){let M=o.recentlyActiveConstraints.has(u.id),S=l.find(W=>W.id===u.id)?.meta,A=H(2,w[2],u.y,u.id,u.label,S?.color??(u.active?b.yellow:b.muted),!u.active,M,S?.description);q.set(u.id,A);}for(let u of F){let M=u.status==="unmet"?b.red:b.yellow,S=H(3,w[3],u.y,u.id,ee(u.type,G.labelMaxChars),M,false,false);j.set(u.id,S);}for(let u of O){let M=i.some(A=>A.resolverId===u.id),S=r.resolverDefs.find(A=>A.id===u.id)?.meta;H(4,w[4],u.y,u.id,u.label,S?.color??(M?b.green:b.muted),!M,false,S?.description);}for(let u of T){let M=o.derivationDeps.get(u.id),S=E.get(u.id);if(M&&S)for(let A of M){let W=x.get(A);W&&h(W.midX+G.nodeW/2,W.midY,S.midX-G.nodeW/2,S.midY,b.accent);}}for(let u of F){let M=q.get(u.fromConstraint),S=j.get(u.id);M&&S&&h(M.midX+G.nodeW/2,M.midY,S.midX-G.nodeW/2,S.midY,b.muted);}for(let u of i){let M=j.get(u.id);if(M){let S=O.find(A=>A.id===u.resolverId);S&&h(M.midX+G.nodeW/2,M.midY,w[4],S.y,b.green);}}we.set(e.flowSvg,_);}function Qe(e){e.animationTimer&&clearTimeout(e.animationTimer),e.animationTimer=setTimeout(()=>{e.recentlyChangedFacts.clear(),e.recentlyComputedDerivations.clear(),e.recentlyActiveConstraints.clear(),e.animationTimer=null;},600);}function Ze(e,s){let o=s.entries.toArray();if(o.length===0)return;e.timelineSvg.replaceChildren();let r=Number.POSITIVE_INFINITY,a=Number.NEGATIVE_INFINITY;for(let R of o)R.startMs<r&&(r=R.startMs),R.endMs>a&&(a=R.endMs);let p=performance.now();for(let R of s.inflight.values())R<r&&(r=R),p>a&&(a=p);let l=a-r||1,t=ie-ce-10,i=[],c=new Set;for(let R of o)c.has(R.resolver)||(c.add(R.resolver),i.push(R.resolver));for(let R of s.inflight.keys())c.has(R)||(c.add(R),i.push(R));let y=i.slice(-12),I=ae*y.length+20;e.timelineSvg.setAttribute("viewBox",`0 0 ${ie} ${I}`),e.timelineSvg.setAttribute("height",String(Math.min(I,200)));let N=5;for(let R=0;R<=N;R++){let w=ce+t*R/N,g=l*R/N,f=document.createElementNS("http://www.w3.org/2000/svg","text");f.setAttribute("x",String(w)),f.setAttribute("y","8"),f.setAttribute("fill",b.muted),f.setAttribute("font-size","6"),f.setAttribute("font-family",b.font),f.setAttribute("text-anchor","middle"),f.textContent=g<1e3?`${g.toFixed(0)}ms`:`${(g/1e3).toFixed(1)}s`,e.timelineSvg.appendChild(f);let C=document.createElementNS("http://www.w3.org/2000/svg","line");C.setAttribute("x1",String(w)),C.setAttribute("y1","10"),C.setAttribute("x2",String(w)),C.setAttribute("y2",String(I)),C.setAttribute("stroke",b.border),C.setAttribute("stroke-width","0.5"),e.timelineSvg.appendChild(C);}for(let R=0;R<y.length;R++){let w=y[R],g=12+R*ae,f=R%Se.length,C=Se[f],T=document.createElementNS("http://www.w3.org/2000/svg","text");T.setAttribute("x",String(ce-4)),T.setAttribute("y",String(g+ae/2+3)),T.setAttribute("fill",b.muted),T.setAttribute("font-size","7"),T.setAttribute("font-family",b.font),T.setAttribute("text-anchor","end"),T.textContent=ee(w,12),e.timelineSvg.appendChild(T);let P=o.filter(O=>O.resolver===w);for(let O of P){let Y=ce+(O.startMs-r)/l*t,$=Math.max((O.endMs-O.startMs)/l*t,he),V=document.createElementNS("http://www.w3.org/2000/svg","rect");V.setAttribute("x",String(Y)),V.setAttribute("y",String(g+2)),V.setAttribute("width",String($)),V.setAttribute("height",String(ae-4)),V.setAttribute("rx","2"),V.setAttribute("fill",O.error?b.red:C),V.setAttribute("opacity","0.8");let _=document.createElementNS("http://www.w3.org/2000/svg","title"),H=O.endMs-O.startMs;_.textContent=`${w}: ${H.toFixed(1)}ms${O.error?" (error)":""}`,V.appendChild(_),e.timelineSvg.appendChild(V);}let F=s.inflight.get(w);if(F!==void 0){let O=ce+(F-r)/l*t,Y=Math.max((p-F)/l*t,he),$=document.createElementNS("http://www.w3.org/2000/svg","rect");$.setAttribute("x",String(O)),$.setAttribute("y",String(g+2)),$.setAttribute("width",String(Y)),$.setAttribute("height",String(ae-4)),$.setAttribute("rx","2"),$.setAttribute("fill",C),$.setAttribute("opacity","0.4"),$.setAttribute("stroke",C),$.setAttribute("stroke-width","1"),$.setAttribute("stroke-dasharray","3,2");let V=document.createElementNS("http://www.w3.org/2000/svg","title");V.textContent=`${w}: inflight ${(p-F).toFixed(0)}ms`,$.appendChild(V),e.timelineSvg.appendChild($);}}e.timelineSvg.setAttribute("aria-label",`Timeline: ${o.length} resolver executions across ${y.length} resolvers`);}function dt(){if(typeof window>"u")return {systems:new Map,getSystem:()=>null,getSystems:()=>[],inspect:()=>null,getEvents:()=>[],explain:()=>null,exportSession:()=>null,importSession:()=>false,clearEvents:()=>{},subscribe:()=>()=>{}};if(!window.__DIRECTIVE__){let e=new Map,s={systems:e,getSystem(o){return o?e.get(o)?.system??null:e.values().next().value?.system??null},getSystems(){return [...e.keys()]},inspect(o){let r=this.getSystem(o),a=o?e.get(o):e.values().next().value,p=r?.inspect()??null;return p&&a&&(p.resolverStats=a.resolverStats?Object.fromEntries(a.resolverStats):{}),p},getEvents(o){return o?e.get(o)?.events.toArray()??[]:e.values().next().value?.events.toArray()??[]},explain(o,r){return this.getSystem(r)?.explain(o)??null},subscribe(o,r){let a=r?e.get(r):e.values().next().value;if(!a){let p=false,t=setInterval(()=>{let c=r?e.get(r):e.values().next().value;c&&!p&&(p=true,c.subscribers.add(o));},100),i=setTimeout(()=>clearInterval(t),1e4);return ()=>{clearInterval(t),clearTimeout(i);for(let c of e.values())c.subscribers.delete(o);}}return a.subscribers.add(o),()=>{a.subscribers.delete(o);}},exportSession(o){let r=o?e.get(o):e.values().next().value;return r?JSON.stringify({version:1,name:o??e.keys().next().value??"default",exportedAt:Date.now(),events:r.events.toArray()}):null},importSession(o,r){try{if(o.length>10*1024*1024)return !1;let a=JSON.parse(o);if(!a||typeof a!="object"||Array.isArray(a)||!Array.isArray(a.events))return !1;let p=r?e.get(r):e.values().next().value;if(!p)return !1;let l=p.maxEvents,t=a.events,i=t.length>l?t.length-l:0;p.events.clear();for(let c=i;c<t.length;c++){let d=t[c];d&&typeof d=="object"&&!Array.isArray(d)&&typeof d.timestamp=="number"&&typeof d.type=="string"&&d.type!=="__proto__"&&d.type!=="constructor"&&d.type!=="prototype"&&p.events.push({timestamp:d.timestamp,type:d.type,data:d.data??null});}return !0}catch{return false}},clearEvents(o){let r=o?e.get(o):e.values().next().value;r&&r.events.clear();}};return Object.defineProperty(window,"__DIRECTIVE__",{value:s,writable:false,configurable:ge(),enumerable:true}),s}return window.__DIRECTIVE__}function mt(e={}){let{name:s="default",trace:o=false,maxEvents:r,panel:a=false,position:p="bottom-right",defaultOpen:l=false}=e,t=Pe(r),i=dt(),c={system:null,events:new ue(t),maxEvents:t,subscribers:new Set,resolverStats:new Map};i.systems.set(s,c);let d=(n,m)=>{let v={timestamp:Date.now(),type:n,data:m};o&&c.events.push(v);for(let D of c.subscribers)try{D(v);}catch{}},y=null,I=new Map,N=new Map,R=new Map,w=Ie(),g=_e(),f=je(),C=$e(),T=a&&typeof window<"u"&&typeof document<"u"&&ge(),P=null,F=0,O=1,Y=2,$=4,V=8,_=16,H=32,h=64,x=128,E=256,q=new Map,j=new Set,u=new Map,M=new Set,S=null;function A(n){F|=n,P===null&&typeof requestAnimationFrame<"u"&&(P=requestAnimationFrame(W));}function W(){if(P=null,!y||!c.system){F=0;return}let n=y.refs,m=c.system,v=F;if(F=0,v&O){for(let D of j)ze(I,D);j.clear();for(let[D,{value:B,flash:U}]of q)de(I,n.factsBody,D,B,U,y.flashTimers);q.clear(),n.factsCount.textContent=String(I.size);}if(v&Y&&Ee(n,N,m,y.flashTimers),v&E){for(let D of M)Xe(n,R,D);M.clear();for(let[D,{active:B,whenExplain:U,label:Z}]of u)Je(n,R,D,B,U,Z);u.clear();}if(v&V)if(S)ye(n,S.inflight.length,S.unmet.length);else {let D=se(m);D&&ye(n,D.inflight.length,D.unmet.length);}if(v&$)if(S)be(n,S.inflight,S.unmet);else {let D=se(m);D&&be(n,D.inflight,D.unmet);}v&_&&Ue(n,w),v&H&&Me(n,m,g),v&h&&Ce(n,m),v&x&&Ze(n,C);}function k(n,m){y&&o&&We(y.refs,n,m,c.events.size);}function L(n,m){f.isRecording&&f.recordedEvents.length<Ne&&f.recordedEvents.push({timestamp:Date.now(),type:n,data:Le(m)});}return {name:"devtools",onInit:n=>{if(c.system=n,d("init",{}),typeof window<"u"&&console.log(`%c[Directive Devtools]%c System "${s}" initialized. Access via window.__DIRECTIVE__`,"color: #7c3aed; font-weight: bold","color: inherit"),T){let m=c.system;y=Ve(s,p,l,o);let v=y.refs;try{let U=m.facts.$store.toObject();for(let[Z,re]of Object.entries(U))de(I,v.factsBody,Z,re,!1);v.factsCount.textContent=String(Object.keys(U).length);}catch{}Ee(v,N,m);let D=se(m);D&&(ye(v,D.inflight.length,D.unmet.length),be(v,D.inflight,D.unmet)),Ce(v,m),Ge(v,m),Me(v,m,g);let B=(D?.constraints?.length??0)>0;Ke(v,B),v.recordBtn.addEventListener("click",()=>{if(f.isRecording=!f.isRecording,v.recordBtn.textContent=f.isRecording?"\u23F9 Stop":"\u23FA Record",v.recordBtn.style.color=f.isRecording?b.red:b.text,f.isRecording){f.recordedEvents=[],f.snapshots=[];try{f.snapshots.push({timestamp:Date.now(),facts:m.facts.$store.toObject()});}catch{}}}),v.exportBtn.addEventListener("click",()=>{let U=f.recordedEvents.length>0?f.recordedEvents:c.events.toArray(),Z=JSON.stringify({version:1,name:s,exportedAt:Date.now(),events:U,snapshots:f.snapshots},null,2),re=new Blob([Z],{type:"application/json"}),oe=URL.createObjectURL(re),le=document.createElement("a");le.href=oe,le.download=`directive-session-${s}-${Date.now()}.json`,le.click(),URL.revokeObjectURL(oe);});}},onStart:n=>{d("start",{}),k("start",{}),L("start",{});},onStop:n=>{d("stop",{}),k("stop",{}),L("stop",{});},onDestroy:n=>{d("destroy",{}),i.systems.delete(s),P!==null&&typeof cancelAnimationFrame<"u"&&(cancelAnimationFrame(P),P=null),g.animationTimer&&clearTimeout(g.animationTimer),y&&(y.destroy(),y=null,I.clear(),N.clear(),R.clear());},onFactSet:(n,m,v)=>{d("fact.set",{key:n,value:m,prev:v}),L("fact.set",{key:n,value:m,prev:v}),g.recentlyChangedFacts.add(n),y&&c.system&&(q.set(n,{value:m,flash:true}),j.delete(n),A(O),k("fact.set",{key:n,value:m}));},onFactDelete:(n,m)=>{d("fact.delete",{key:n,prev:m}),L("fact.delete",{key:n,prev:m}),y&&(j.add(n),q.delete(n),A(O),k("fact.delete",{key:n}));},onFactsBatch:n=>{if(d("facts.batch",{changes:n}),L("facts.batch",{count:n.length}),y&&c.system){for(let m of n)m.type==="delete"?(j.add(m.key),q.delete(m.key)):(g.recentlyChangedFacts.add(m.key),q.set(m.key,{value:m.value,flash:true}),j.delete(m.key));A(O),k("facts.batch",{count:n.length});}},onDerivationCompute:(n,m,v)=>{d("derivation.compute",{id:n,value:m,deps:v}),L("derivation.compute",{id:n,deps:v}),g.derivationDeps.set(n,v),g.recentlyComputedDerivations.add(n),k("derivation.compute",{id:n,deps:v});},onDerivationInvalidate:n=>{d("derivation.invalidate",{id:n}),k("derivation.invalidate",{id:n});},onReconcileStart:n=>{d("reconcile.start",{}),w.lastReconcileStartMs=performance.now(),k("reconcile.start",{}),L("reconcile.start",{});},onReconcileEnd:n=>{if(d("reconcile.end",n),L("reconcile.end",{unmet:n.unmet.length,inflight:n.inflight.length,completed:n.completed.length}),w.lastReconcileStartMs>0){let m=performance.now()-w.lastReconcileStartMs;w.reconcileCount++,w.reconcileTotalMs+=m,w.lastReconcileStartMs=0;}if(f.isRecording&&c.system&&f.snapshots.length<Be)try{f.snapshots.push({timestamp:Date.now(),facts:c.system.facts.$store.toObject()});}catch{}y&&c.system&&(S=n,Qe(g),A(Y|V|$|_|H|h),k("reconcile.end",{unmet:n.unmet.length,inflight:n.inflight.length}));},onConstraintEvaluate:(n,m,v)=>{let D=c.system?.meta?.constraint(n)?.label,B=D?{id:n,active:m,label:D}:{id:n,active:m},U=v?{...B,whenExplain:v}:B;d("constraint.evaluate",U),L("constraint.evaluate",U),m?(g.activeConstraints.add(n),g.recentlyActiveConstraints.add(n)):g.activeConstraints.delete(n),y&&(u.set(n,{active:m,whenExplain:v,label:D}),M.delete(n),A(E)),k("constraint.evaluate",{id:n,active:m});},onConstraintError:(n,m)=>{d("constraint.error",{id:n,error:String(m)}),k("constraint.error",{id:n,error:String(m)});},onRequirementCreated:n=>{d("requirement.created",{id:n.id,type:n.requirement.type}),L("requirement.created",{id:n.id,type:n.requirement.type}),k("requirement.created",{id:n.id,type:n.requirement.type});},onRequirementMet:(n,m)=>{d("requirement.met",{id:n.id,byResolver:m}),L("requirement.met",{id:n.id,byResolver:m}),k("requirement.met",{id:n.id,byResolver:m});},onRequirementCanceled:n=>{d("requirement.canceled",{id:n.id}),L("requirement.canceled",{id:n.id}),k("requirement.canceled",{id:n.id});},onResolverStart:(n,m)=>{let v=c.system?.meta?.resolver(n)?.label,D={resolver:n,requirementId:m.id},B=v?{...D,label:v}:D;d("resolver.start",B),L("resolver.start",B),C.inflight.set(n,performance.now()),y&&c.system&&(A($|V|x),k("resolver.start",{resolver:n,requirementId:m.id}));},onResolverComplete:(n,m,v)=>{let D=c.system?.meta?.resolver(n)?.label;d("resolver.complete",{resolver:n,requirementId:m.id,duration:v,...D?{label:D}:{}}),L("resolver.complete",{resolver:n,requirementId:m.id,duration:v});let B=c.resolverStats.get(n)??{count:0,totalMs:0,errors:0};if(B.count++,B.totalMs+=v,c.resolverStats.set(n,B),c.resolverStats.size>xe){let Z=c.resolverStats.keys().next().value;Z!==void 0&&c.resolverStats.delete(Z);}w.resolverStats.set(n,{...B});let U=C.inflight.get(n);C.inflight.delete(n),U!==void 0&&C.entries.push({resolver:n,startMs:U,endMs:performance.now(),error:false}),y&&c.system&&(A($|V|_|x),k("resolver.complete",{resolver:n,duration:v}));},onResolverError:(n,m,v)=>{d("resolver.error",{resolver:n,requirementId:m.id,error:String(v)}),L("resolver.error",{resolver:n,requirementId:m.id,error:String(v)});let D=c.resolverStats.get(n)??{count:0,totalMs:0,errors:0};if(D.errors++,c.resolverStats.set(n,D),c.resolverStats.size>xe){let U=c.resolverStats.keys().next().value;U!==void 0&&c.resolverStats.delete(U);}w.resolverStats.set(n,{...D});let B=C.inflight.get(n);C.inflight.delete(n),B!==void 0&&C.entries.push({resolver:n,startMs:B,endMs:performance.now(),error:true}),y&&c.system&&(A($|V|_|x),k("resolver.error",{resolver:n,error:String(v)}));},onResolverRetry:(n,m,v)=>{d("resolver.retry",{resolver:n,requirementId:m.id,attempt:v}),L("resolver.retry",{resolver:n,requirementId:m.id,attempt:v}),k("resolver.retry",{resolver:n,attempt:v});},onResolverCancel:(n,m)=>{d("resolver.cancel",{resolver:n,requirementId:m.id}),L("resolver.cancel",{resolver:n,requirementId:m.id}),C.inflight.delete(n),k("resolver.cancel",{resolver:n});},onResolverWriteRejected:n=>{let m=n.kind==="summary"?{kind:n.kind,resolver:n.resolver,requirementId:n.req.id,reason:n.reason,dropped:n.dropped}:{kind:n.kind,resolver:n.resolver,requirementId:n.req.id,reason:n.reason,fact:n.fact,expected:n.expected,actual:n.actual};d("resolver.write.rejected",m),L("resolver.write.rejected",m),k("resolver.write.rejected",n.kind==="summary"?{resolver:n.resolver,dropped:n.dropped}:{resolver:n.resolver,fact:n.fact});},onEffectRun:n=>{let m=c.system?.meta?.effect(n)?.label,v=m?{id:n,label:m}:{id:n};d("effect.run",v),L("effect.run",v),w.effectRunCount++,k("effect.run",{id:n});},onEffectError:(n,m)=>{d("effect.error",{id:n,error:String(m)}),w.effectErrorCount++,k("effect.error",{id:n,error:String(m)});},onSnapshot:n=>{d("timetravel.snapshot",{id:n.id,trigger:n.trigger}),y&&c.system&&A(h),k("timetravel.snapshot",{id:n.id,trigger:n.trigger});},onHistoryNavigate:(n,m)=>{if(d("timetravel.jump",{from:n,to:m}),L("timetravel.jump",{from:n,to:m}),y&&c.system){let v=c.system;try{let D=v.facts.$store.toObject();I.clear(),y.refs.factsBody.replaceChildren();for(let[B,U]of Object.entries(D))de(I,y.refs.factsBody,B,U,!1);y.refs.factsCount.textContent=String(Object.keys(D).length);}catch{}N.clear(),g.derivationDeps.clear(),y.refs.derivBody.replaceChildren(),R.clear(),y.refs.constraintsBody.replaceChildren(),y.refs.constraintsCount.textContent="0",S=null,A(Y|V|$|H|h),k("timetravel.jump",{from:n,to:m});}},onError:n=>{d("error",{source:n.source,sourceId:n.sourceId,message:n.message}),L("error",{source:n.source,message:n.message}),k("error",{source:n.source,message:n.message});},onErrorRecovery:(n,m)=>{d("error.recovery",{source:n.source,sourceId:n.sourceId,strategy:m}),k("error.recovery",{source:n.source,strategy:m});},onTraceComplete:n=>{d("trace.complete",{id:n.id,status:n.status,facts:n.factChanges.length,constraints:n.constraintsHit.length,requirements:n.requirementsAdded.length,resolvers:n.resolversStarted.length,effects:n.effectsRun.length}),k("trace.complete",{id:n.id});},onDefinitionRegister:(n,m)=>{d("definition.register",{type:n,id:m}),L("definition.register",{type:n,id:m}),k("definition.register",{type:n,id:m});},onDefinitionAssign:(n,m)=>{d("definition.assign",{type:n,id:m}),L("definition.assign",{type:n,id:m}),k("definition.assign",{type:n,id:m});},onDefinitionUnregister:(n,m)=>{d("definition.unregister",{type:n,id:m}),L("definition.unregister",{type:n,id:m}),k("definition.unregister",{type:n,id:m}),n==="constraint"&&y&&(M.add(m),u.delete(m),A(E));},onDefinitionCall:(n,m,v)=>{d("definition.call",{type:n,id:m,props:v}),L("definition.call",{type:n,id:m,props:v}),k("definition.call",{type:n,id:m,props:v});}}}var tt="directive-devtools-event",et=new Set(["__proto__","constructor","prototype"]),pt=Math.random().toString(36).slice(2,8);function gt(){if(typeof window<"u"){let e=`__DIRECTIVE_BRIDGE_ID_${pt}__`,s=window,o=s[e]??0;return s[e]=o+1,o+1}return 1}function ft(e){let s=false;for(let r of et)if(r in e){s=true;break}if(!s)return e;let o=Object.create(null);for(let[r,a]of Object.entries(e))et.has(r)||(o[r]=a);return o}function bt(e){if(!(typeof window>"u"))try{let s=ft(e),o={id:gt(),timestamp:Date.now(),snapshotId:null,...s};window.dispatchEvent(new CustomEvent(tt,{detail:o}));}catch{}}function yt(e){let{storage:s,key:o,include:r,exclude:a=[],debounce:p=100,onRestore:l,onSave:t,onError:i}=e,c=null,d=null,y=new Set,I=g=>a.includes(g)?false:r?r.includes(g):true,N=()=>{try{let g=s.getItem(o);if(!g)return null;let f=JSON.parse(g);return typeof f!="object"||f===null?null:chunk4MNQDXH7_cjs.f(f)?f:(i?.(new Error("Potential prototype pollution detected in stored data")),null)}catch(g){return i?.(g instanceof Error?g:new Error(String(g))),null}},R=()=>{if(d)try{let g={};for(let f of y)I(f)&&(g[f]=d.facts[f]);s.setItem(o,JSON.stringify(g)),t?.(g);}catch(g){i?.(g instanceof Error?g:new Error(String(g)));}},w=()=>{c&&clearTimeout(c),c=setTimeout(R,p);};return {name:"persistence",onInit:g=>{d=g;let f=N();f&&(d.facts.$store.batch(()=>{for(let[C,T]of Object.entries(f))I(C)&&(d.facts[C]=T,y.add(C));}),l?.(f));},onDestroy:()=>{c&&clearTimeout(c),R();},onFactSet:g=>{y.add(g),I(g)&&w();},onFactDelete:g=>{y.delete(g),I(g)&&w();},onFactsBatch:g=>{let f=false;for(let C of g)C.type==="set"?y.add(C.key):y.delete(C.key),I(C.key)&&(f=true);f&&w();}}}function vt(e={}){let{onSlowConstraint:s,onSlowResolver:o,slowConstraintThresholdMs:r=16,slowResolverThresholdMs:a=1e3}=e,p=new Map,l=new Map,t=new Map,i={runs:0,totalDurationMs:0,avgDurationMs:0,maxDurationMs:0},c=0,d=0,y=0;function I(g){let f=p.get(g);return f||(f={evaluations:0,totalDurationMs:0,avgDurationMs:0,maxDurationMs:0,lastEvaluatedAt:0},p.set(g,f)),f}function N(g){let f=l.get(g);return f||(f={starts:0,completions:0,errors:0,retries:0,cancellations:0,totalDurationMs:0,avgDurationMs:0,maxDurationMs:0,lastCompletedAt:0},l.set(g,f)),f}function R(g){let f=t.get(g);return f||(f={runs:0,errors:0,lastRunAt:0},t.set(g,f)),f}let w={name:"performance",onStart(){c=Date.now();},onConstraintEvaluate(g,f){let C=performance.now(),T=I(g);if(T.evaluations++,T.lastEvaluatedAt=Date.now(),y>0){let P=C-y;T.totalDurationMs+=P;let F=T.evaluations;T.avgDurationMs=T.totalDurationMs/F,P>T.maxDurationMs&&(T.maxDurationMs=P),P>r&&s?.(g,P);}y=C;},onResolverStart(g,f){let C=N(g);C.starts++;},onResolverComplete(g,f,C){let T=N(g);T.completions++,T.totalDurationMs+=C,T.avgDurationMs=T.totalDurationMs/T.completions,C>T.maxDurationMs&&(T.maxDurationMs=C),T.lastCompletedAt=Date.now(),C>a&&o?.(g,C);},onResolverError(g,f,C){N(g).errors++;},onResolverRetry(g,f,C){N(g).retries++;},onResolverCancel(g,f){N(g).cancellations++;},onEffectRun(g){let f=R(g);f.runs++,f.lastRunAt=Date.now();},onEffectError(g,f){R(g).errors++;},onReconcileStart(){d=performance.now(),y=0;},onReconcileEnd(){let g=performance.now()-d;i.runs++,i.totalDurationMs+=g,i.avgDurationMs=i.totalDurationMs/i.runs,g>i.maxDurationMs&&(i.maxDurationMs=g);},onDestroy(){w.reset();},getSnapshot(){let g={};for(let[T,P]of p)g[T]={...P};let f={};for(let[T,P]of l)f[T]={...P};let C={};for(let[T,P]of t)C[T]={...P};return {constraints:g,resolvers:f,effects:C,reconcile:{...i},uptime:c?Date.now()-c:0}},reset(){p.clear(),l.clear(),t.clear(),i.runs=0,i.totalDurationMs=0,i.avgDurationMs=0,i.maxDurationMs=0,y=0;}};return w}function ve(){return globalThis.crypto?.randomUUID?.()??`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,11)}`}function Te(e,s){if(e.length===0)return 0;let o=[...e].sort((a,p)=>a-p),r=Math.ceil(s/100*o.length)-1;return o[Math.max(0,r)]??0}function ht(e={}){let{serviceName:s="directive-agents",metrics:o={},tracing:r={},alerts:a=[],summaryMetrics:p={},events:l={}}=e,t={requests:p.requests??"agent.requests",errors:p.errors??"agent.errors",latency:p.latency??"agent.latency",tokens:p.tokens??"agent.tokens",cost:p.cost??"agent.cost"},{enabled:i=true,exportInterval:c,exporter:d,maxDataPoints:y=1e3}=o,{enabled:I=true,sampleRate:N=1,maxSpans:R=1e3,exporter:w}=r,g=Date.now(),f=new Map,C=new Map,T=[],P=[],F=new Map,O=new Map,Y;c&&(d||w)&&(Y=setInterval(async()=>{try{if(d&&i&&await d(Array.from(O.values())),w&&I){let h=T.splice(0,100);h.length>0&&await w(h);}}catch(h){console.error("[Directive Observability] Export error:",h);}},c));function $(h){if(!i)return;let x=`${h.name}:${JSON.stringify(Object.fromEntries(Object.entries(h.labels).sort()))}`,E=f.get(x);E||(E=[],f.set(x,E)),E.push(h),E.length>y&&E.shift(),V(h.name,E),l.onMetricRecorded?.(h),_(h.name);}function V(h,x){if(x.length===0)return;let E=x.map(S=>S.value),q=E.reduce((S,A)=>S+A,0),j=x[0],u=E[E.length-1],M={name:h,type:j.type,count:x.length,sum:q,min:Math.min(...E),max:Math.max(...E),avg:q/x.length,lastValue:u,lastUpdated:Date.now()};O.set(h,M);}function _(h){for(let x of a){if(x.metric!==h)continue;let E=O.get(h);if(!E)continue;let q=`${x.metric}:${x.threshold}`,j=F.get(q),u=x.cooldownMs??6e4;if(j&&Date.now()-j<u)continue;let M=x.operator??">",S=E.lastValue,A=x.threshold,W=false;switch(M){case ">":W=S>A;break;case "<":W=S<A;break;case ">=":W=S>=A;break;case "<=":W=S<=A;break;case "==":W=S===A;break}if(W){let k={alertId:ve(),metric:h,currentValue:S,threshold:A,operator:M,action:x.action,timestamp:Date.now(),message:`Alert: ${h} ${M} ${A} (current: ${S})`};switch(P.push(k),P.length>1e3&&P.splice(0,P.length-1e3),F.set(q,Date.now()),l.onAlert?.(k),x.action){case "log":console.log(`[Observability] ${k.message}`);break;case "warn":console.warn(`[Observability] ${k.message}`);break;case "alert":console.error(`[Observability ALERT] ${k.message}`);break;case "callback":x.callback?.(E,A);break}}}}function H(h){let x=[];for(let[E,q]of f)if(E.startsWith(`${h}:`))for(let j of q)x.push(j.value);return x.length===0?{}:{p50:Te(x,50),p90:Te(x,90),p99:Te(x,99)}}return {incrementCounter(h,x={},E=1){$({name:h,type:"counter",value:E,labels:x,timestamp:Date.now()});},setGauge(h,x,E={}){$({name:h,type:"gauge",value:x,labels:E,timestamp:Date.now()});},observeHistogram(h,x,E={}){$({name:h,type:"histogram",value:x,labels:E,timestamp:Date.now()});},startSpan(h,x){if(Math.random()>N)return {traceId:"sampled-out",spanId:"sampled-out",operationName:h,serviceName:s,startTime:Date.now(),status:"ok",tags:{},logs:[]};let E={traceId:x?C.get(x)?.traceId??ve():ve(),spanId:ve(),parentSpanId:x,operationName:h,serviceName:s,startTime:Date.now(),status:"ok",tags:{},logs:[]};return I&&(C.set(E.spanId,E),l.onSpanStart?.(E)),E},endSpan(h,x="ok"){if(h==="sampled-out")return;let E=C.get(h);if(E){for(E.endTime=Date.now(),E.duration=E.endTime-E.startTime,E.status=x,C.delete(h),T.push(E);T.length>R;)T.shift();$({name:`${E.operationName}.latency`,type:"histogram",value:E.duration,labels:{},timestamp:Date.now()}),x==="error"&&$({name:`${E.operationName}.errors`,type:"counter",value:1,labels:{},timestamp:Date.now()}),l.onSpanEnd?.(E);}},addSpanLog(h,x,E="info"){if(h==="sampled-out")return;let q=C.get(h);q&&q.logs.push({timestamp:Date.now(),message:x,level:E});},addSpanTag(h,x,E){if(h==="sampled-out")return;let q=C.get(h);q&&(q.tags[x]=E);},getDashboard(){let h=O.get(t.requests),x=O.get(t.errors),E=O.get(t.latency),q=O.get(t.tokens),j=O.get(t.cost),u=h?.sum??0,M=x?.sum??0,S=u>0?M/u:0,A=E?H(t.latency):{};return {service:{name:s,uptime:Date.now()-g,startTime:g},metrics:Object.fromEntries(O),traces:[...T].slice(-100),alerts:[...P].slice(-50),summary:{totalRequests:u,totalErrors:M,errorRate:S,avgLatency:E?.avg??0,p99Latency:A.p99??0,activeSpans:C.size,totalTokens:q?.sum??0,totalCost:j?.sum??0}}},getMetric(h){let x=O.get(h);if(!x)return;let E=H(h);return {...x,...E}},getTraces(h=100){return [...T].slice(-h)},getAlerts(){return [...P]},export(){return {metrics:Array.from(O.values()),traces:[...T],alerts:[...P]}},clear(){f.clear(),O.clear(),C.clear(),T.length=0,P.length=0,F.clear();},async destroy(){Y&&(clearInterval(Y),Y=void 0);try{d&&i&&O.size>0&&await d(Array.from(O.values())),w&&I&&T.length>0&&await w([...T]);}catch(h){console.error("[Directive Observability] Error flushing data during destroy:",h);}f.clear(),O.clear(),C.clear(),T.length=0,P.length=0,F.clear();},getHealthStatus(){let h=O.get(t.requests),x=O.get(t.errors),E=h?.sum??0,q=x?.sum??0,j=E>0?q/E:0,u=P.filter(M=>Date.now()-M.timestamp<3e5).length;return {healthy:j<.1&&u===0,uptime:Date.now()-g,errorRate:j,activeAlerts:u}}}}function St(e){return {trackRun(s,o){let r={agent:s};e.incrementCounter("agent.requests",r),o.success||e.incrementCounter("agent.errors",r),e.observeHistogram("agent.latency",o.latencyMs,r),o.inputTokens!==void 0&&(e.incrementCounter("agent.tokens.input",r,o.inputTokens),e.incrementCounter("agent.tokens",r,o.inputTokens)),o.outputTokens!==void 0&&(e.incrementCounter("agent.tokens.output",r,o.outputTokens),e.incrementCounter("agent.tokens",r,o.outputTokens)),o.cost!==void 0&&e.incrementCounter("agent.cost",r,o.cost),o.toolCalls!==void 0&&e.incrementCounter("agent.tool_calls",r,o.toolCalls);},trackGuardrail(s,o){let r={guardrail:s};e.incrementCounter("guardrail.checks",r),o.passed||e.incrementCounter("guardrail.failures",r),o.blocked&&e.incrementCounter("guardrail.blocks",r),e.observeHistogram("guardrail.latency",o.latencyMs,r);},trackApproval(s,o){let r={tool:s};e.incrementCounter("approval.requests",r),o.approved?e.incrementCounter("approval.approved",r):e.incrementCounter("approval.rejected",r),o.timedOut&&e.incrementCounter("approval.timeouts",r),e.observeHistogram("approval.wait_time",o.waitTimeMs,r);},trackHandoff(s,o,r){e.incrementCounter("handoff.count",{from:s,to:o}),e.observeHistogram("handoff.latency",r);}}}function xt(e){let s=[{key:"service.name",value:{stringValue:e.serviceName??"directive-agents"}}];if(e.serviceVersion&&s.push({key:"service.version",value:{stringValue:e.serviceVersion}}),e.resourceAttributes)for(let[o,r]of Object.entries(e.resourceAttributes))s.push({key:o,value:{stringValue:r}});return {attributes:s}}function ne(e){return `${BigInt(e)*BigInt(1e6)}`}function Et(e){switch(e){case "counter":return "sum";case "gauge":return "gauge";case "histogram":return "histogram";default:return "gauge"}}function Ct(e,s,o){let r=e.map(a=>{let p=a.lastUpdated-6e4,l=[{asInt:a.type==="counter"?a.sum:void 0,asDouble:a.type!=="counter"?a.lastValue:void 0,timeUnixNano:ne(a.lastUpdated),startTimeUnixNano:ne(p),attributes:[]}],t=Et(a.type),i={name:a.name,unit:""};return t==="sum"?i.sum={dataPoints:l,aggregationTemporality:2,isMonotonic:true}:t==="histogram"?i.histogram={dataPoints:[{count:a.count,sum:a.sum,min:a.min,max:a.max,timeUnixNano:ne(a.lastUpdated),startTimeUnixNano:ne(p),attributes:[]}],aggregationTemporality:2}:i.gauge={dataPoints:l},i});return {resourceMetrics:[{resource:s,scopeMetrics:[{scope:{name:"directive",version:o},metrics:r}]}]}}function wt(e,s,o){let r=e.map(a=>{let p=a.logs.map(i=>({timeUnixNano:ne(i.timestamp),name:i.level,attributes:[{key:"message",value:{stringValue:i.message}},{key:"level",value:{stringValue:i.level}}]})),l=Object.entries(a.tags).map(([i,c])=>({key:i,value:typeof c=="string"?{stringValue:c}:typeof c=="number"?{intValue:`${c}`}:{boolValue:c}})),t=a.status==="ok"?1:a.status==="error"?2:0;return {traceId:a.traceId.replace(/-/g,"").padEnd(32,"0").slice(0,32),spanId:a.spanId.replace(/-/g,"").padEnd(16,"0").slice(0,16),parentSpanId:a.parentSpanId?a.parentSpanId.replace(/-/g,"").padEnd(16,"0").slice(0,16):void 0,name:a.operationName,kind:1,startTimeUnixNano:ne(a.startTime),endTimeUnixNano:a.endTime?ne(a.endTime):ne(a.startTime),attributes:l,events:p,status:{code:t}}});return {resourceSpans:[{resource:s,scopeSpans:[{scope:{name:"directive",version:o},spans:r}]}]}}function Mt(e){let{endpoint:s,headers:o={},scopeVersion:r="0.1.0",timeoutMs:a=1e4,fetch:p=globalThis.fetch,onError:l}=e;try{let c=new URL(s);if(c.protocol!=="http:"&&c.protocol!=="https:")throw new Error("[Directive] Only http: and https: protocols are supported")}catch(c){throw new Error(`[Directive OTLP] Invalid endpoint URL "${s}": ${c instanceof Error?c.message:String(c)}`)}if(/\/v1\/(metrics|traces)/.test(s)&&console.warn(`[Directive OTLP] Endpoint "${s}" already contains a /v1/metrics or /v1/traces path. The exporter will append /v1/metrics or /v1/traces automatically. Use the base URL (e.g., "http://localhost:4318") instead.`),a<=0||!Number.isFinite(a))throw new Error(`[Directive OTLP] timeoutMs must be > 0, got ${a}`);let t=xt(e);async function i(c,d,y){let I=`${s.replace(/\/$/,"")}${c}`,N=new AbortController,R=setTimeout(()=>N.abort(),a);try{let w=await p(I,{method:"POST",headers:{"Content-Type":"application/json",...o},body:JSON.stringify(d),signal:N.signal});if(!w.ok)throw new Error(`[Directive] OTLP export failed: ${w.status} ${w.statusText}`)}catch(w){let g=w instanceof Error?w:new Error(String(w));l?l(g,y):console.error(`[Directive OTLP] Export ${y} error:`,g.message);}finally{clearTimeout(R);}}return {async exportMetrics(c){if(c.length===0)return;let d=Ct(c,t,r);await i("/v1/metrics",d,"metrics");},async exportTraces(c){if(c.length===0)return;let d=wt(c,t,r);await i("/v1/traces",d,"traces");}}}var me=class extends Error{code="CIRCUIT_OPEN";retryAfterMs;state;constructor(s,o,r="OPEN",a){let p=a?`[Directive CircuitBreaker] Circuit "${s}" is ${r}. ${a}`:`[Directive CircuitBreaker] Circuit "${s}" is ${r}. Request rejected. Try again in ${Math.ceil(o/1e3)}s.`;super(p),this.name="CircuitBreakerOpenError",this.retryAfterMs=o,this.state=r;}};function Tt(e={}){let{failureThreshold:s=5,recoveryTimeMs:o=3e4,halfOpenMaxRequests:r=3,failureWindowMs:a=6e4,observability:p,metricPrefix:l="circuit_breaker",name:t="default",isFailure:i=()=>true,onStateChange:c}=e;if(s<1||!Number.isFinite(s))throw new Error(`[Directive CircuitBreaker] failureThreshold must be >= 1, got ${s}`);if(o<=0||!Number.isFinite(o))throw new Error(`[Directive CircuitBreaker] recoveryTimeMs must be > 0, got ${o}`);if(r<1||!Number.isFinite(r))throw new Error(`[Directive CircuitBreaker] halfOpenMaxRequests must be >= 1, got ${r}`);if(a<=0||!Number.isFinite(a))throw new Error(`[Directive CircuitBreaker] failureWindowMs must be > 0, got ${a}`);let d="CLOSED",y=[],I=0,N=0,R=Date.now(),w=0,g=0,f=0,C=0,T=0,P=null,F=null;function O(_){if(d===_)return;let H=d;d=_,R=Date.now(),_==="OPEN"&&(w=Date.now()),_==="HALF_OPEN"&&(I=0,N=0),c?.(H,_),p&&p.incrementCounter(`${l}.state_change`,{name:t,from:H,to:_});}function Y(){let _=Date.now()-a;return y=y.filter(H=>H>_),y.length}function $(){C++,F=Date.now(),p&&p.incrementCounter(`${l}.success`,{name:t}),d==="HALF_OPEN"&&(N++,N>=r&&(O("CLOSED"),y=[]));}function V(_){if(!i(_)){$();return}f++,P=Date.now(),y.push(Date.now());let H=s*2;if(y.length>H&&(y=y.slice(-H)),p&&p.incrementCounter(`${l}.failure`,{name:t}),d==="HALF_OPEN"){O("OPEN");return}d==="CLOSED"&&Y()>=s&&O("OPEN");}return {async execute(_){if(g++,p&&p.incrementCounter(`${l}.requests`,{name:t}),d==="OPEN")if(Date.now()-w>=o)O("HALF_OPEN");else throw T++,p&&p.incrementCounter(`${l}.rejected`,{name:t}),new me(t,o-(Date.now()-w));if(d==="HALF_OPEN"){if(I>=r)throw T++,new me(t,o,"HALF_OPEN",`Max trial requests (${r}) reached.`);I++;}let H=Date.now();try{let h=await _();return $(),p&&p.observeHistogram(`${l}.latency`,Date.now()-H,{name:t}),h}catch(h){let x=h instanceof Error?h:new Error(String(h));throw V(x),p&&p.observeHistogram(`${l}.latency`,Date.now()-H,{name:t}),h}},getState(){return d==="OPEN"&&Date.now()-w>=o&&O("HALF_OPEN"),d},getStats(){return {state:this.getState(),totalRequests:g,totalFailures:f,totalSuccesses:C,totalRejected:T,recentFailures:Y(),lastFailureTime:P,lastSuccessTime:F,lastStateChange:R}},forceState(_){O(_);},reset(){let _=d;d="CLOSED",y=[],I=0,N=0,R=Date.now(),w=0,g=0,f=0,C=0,T=0,P=null,F=null,_!=="CLOSED"&&c?.(_,"CLOSED");},isAllowed(){return d==="CLOSED"?true:d==="OPEN"?Date.now()-w>=o:I<r}}}
Object.defineProperty(exports,"createAuditLedger",{enumerable:true,get:function(){return chunkIXRS4LM4_cjs.b}});Object.defineProperty(exports,"memorySink",{enumerable:true,get:function(){return chunkIXRS4LM4_cjs.a}});exports.CircuitBreakerOpenError=me;exports.DEVTOOLS_EVENT_NAME=tt;exports.createAgentMetrics=St;exports.createCircuitBreaker=Tt;exports.createOTLPExporter=Mt;exports.createObservability=ht;exports.devtoolsPlugin=mt;exports.emitDevToolsEvent=bt;exports.loggingPlugin=st;exports.performancePlugin=vt;exports.persistencePlugin=yt;//# sourceMappingURL=index.cjs.map
'use strict';var chunkQ2VZPURY_cjs=require('../chunk-Q2VZPURY.cjs');require('../chunk-T4TRJEJN.cjs');var chunk4MNQDXH7_cjs=require('../chunk-4MNQDXH7.cjs');var _documentCurrentScript=typeof document!=='undefined'?document.currentScript:null;var Oe={debug:0,info:1,warn:2,error:3};function st(e={}){let{level:s="info",filter:o=()=>true,logger:r=console,prefix:a="[Directive]"}=e,p=Oe[s],l=(t,i,...c)=>{Oe[t]<p||o(i)&&r[t](`${a} ${i}`,...c);};return {name:"logging",onInit:()=>l("debug","init"),onStart:()=>l("info","start"),onStop:()=>l("info","stop"),onDestroy:()=>l("debug","destroy"),onFactSet:(t,i,c)=>{l("debug","fact.set",{key:t,value:i,prev:c});},onFactDelete:(t,i)=>{l("debug","fact.delete",{key:t,prev:i});},onFactsBatch:t=>{l("debug","facts.batch",{count:t.length,changes:t});},onDerivationCompute:(t,i,c)=>{l("debug","derivation.compute",{id:t,value:i,deps:c});},onDerivationInvalidate:t=>{l("debug","derivation.invalidate",{id:t});},onReconcileStart:()=>{l("debug","reconcile.start");},onReconcileEnd:t=>{l("debug","reconcile.end",{unmet:t.unmet.length,inflight:t.inflight.length,completed:t.completed.length,canceled:t.canceled.length});},onConstraintEvaluate:(t,i,c)=>{if(c){let d=c.filter(y=>y.pass).length;l("debug","constraint.evaluate",{id:t,active:i,clauses:{total:c.length,passed:d}});return}l("debug","constraint.evaluate",{id:t,active:i});},onConstraintError:(t,i)=>{l("error","constraint.error",{id:t,error:i});},onRequirementCreated:t=>{l("debug","requirement.created",{id:t.id,type:t.requirement.type});},onRequirementMet:(t,i)=>{l("info","requirement.met",{id:t.id,byResolver:i});},onRequirementCanceled:t=>{l("debug","requirement.canceled",{id:t.id});},onResolverStart:(t,i)=>{l("debug","resolver.start",{resolver:t,requirementId:i.id});},onResolverComplete:(t,i,c)=>{l("info","resolver.complete",{resolver:t,requirementId:i.id,duration:c});},onResolverError:(t,i,c)=>{l("error","resolver.error",{resolver:t,requirementId:i.id,error:c});},onResolverRetry:(t,i,c)=>{l("warn","resolver.retry",{resolver:t,requirementId:i.id,attempt:c});},onResolverCancel:(t,i)=>{l("debug","resolver.cancel",{resolver:t,requirementId:i.id});},onResolverWriteRejected:t=>{l("warn","resolver.write.rejected",t.kind==="summary"?{kind:t.kind,resolver:t.resolver,requirementId:t.req.id,reason:t.reason,dropped:t.dropped}:{kind:t.kind,resolver:t.resolver,requirementId:t.req.id,reason:t.reason,fact:t.fact,expected:t.expected,actual:t.actual});},onEffectRun:t=>{l("debug","effect.run",{id:t});},onEffectError:(t,i)=>{l("error","effect.error",{id:t,error:i});},onSnapshot:t=>{l("debug","timetravel.snapshot",{id:t.id,trigger:t.trigger});},onHistoryNavigate:(t,i)=>{l("info","timetravel.jump",{from:t,to:i});},onError:t=>{l("error","error",{source:t.source,sourceId:t.sourceId,message:t.message});},onErrorRecovery:(t,i)=>{l("warn","error.recovery",{source:t.source,sourceId:t.sourceId,strategy:i});},onDefinitionRegister:(t,i)=>{l("info","definition.register",{type:t,id:i});},onDefinitionAssign:(t,i)=>{l("info","definition.assign",{type:t,id:i});},onDefinitionUnregister:(t,i)=>{l("info","definition.unregister",{type:t,id:i});},onDefinitionCall:(t,i,c)=>{l("debug","definition.call",{type:t,id:i,props:c});},onTraceComplete:t=>{l("debug","trace.complete",{id:t.id,status:t.status,duration:t.duration,factChanges:t.factChanges.length,derivationsRecomputed:t.derivationsRecomputed.length,constraintsHit:t.constraintsHit.length,resolversStarted:t.resolversStarted.length,effectsRun:t.effectsRun.length});}}}var ue=class{constructor(s){this.capacity=s;this.buf=new Array(s);}buf;head=0;_size=0;get size(){return this._size}push(s){this.buf[this.head]=s,this.head=(this.head+1)%this.capacity,this._size<this.capacity&&this._size++;}toArray(){return this._size===0?[]:this._size<this.capacity?this.buf.slice(0,this._size):[...this.buf.slice(this.head),...this.buf.slice(0,this.head)]}clear(){this.buf=new Array(this.capacity),this.head=0,this._size=0;}};function ge(){try{if(typeof process<"u"&&process.env?.NODE_ENV==="production")return !1}catch{}try{if(typeof ({ url: (typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href)) })<"u"&&undefined?.MODE==="production")return !1}catch{}return true}function fe(e){try{if(e===void 0)return "undefined";if(e===null)return "null";if(typeof e=="bigint")return String(e)+"n";if(typeof e=="symbol")return String(e);if(typeof e=="object"){let s=JSON.stringify(e,(o,r)=>typeof r=="bigint"?String(r)+"n":typeof r=="symbol"?String(r):r);return s.length>120?s.slice(0,117)+"...":s}return String(e)}catch{return "<error>"}}function ee(e,s){return e.length<=s?e:e.slice(0,s-3)+"..."}function se(e){try{return e.inspect()}catch{return null}}function Le(e){try{return e==null||typeof e!="object"?e:JSON.parse(JSON.stringify(e))}catch{return null}}function Pe(e){return e===void 0?1e3:!Number.isFinite(e)||e<1?(ge()&&console.warn(`[directive:devtools] Invalid maxEvents value (${e}), using default 1000`),1e3):Math.floor(e)}function Ie(){return {reconcileCount:0,reconcileTotalMs:0,resolverStats:new Map,effectRunCount:0,effectErrorCount:0,lastReconcileStartMs:0}}var it=200,ie=340,ae=16,ce=80,he=2,Se=["#8b9aff","#4ade80","#fbbf24","#c084fc","#f472b6","#22d3ee"];function $e(){return {entries:new ue(it),inflight:new Map}}function _e(){return {derivationDeps:new Map,activeConstraints:new Set,recentlyChangedFacts:new Set,recentlyComputedDerivations:new Set,recentlyActiveConstraints:new Set,animationTimer:null}}var Ne=1e4,Be=100;function je(){return {isRecording:false,recordedEvents:[],snapshots:[]}}var He=50,xe=200,b={bg:"#1a1a2e",text:"#e0e0e0",accent:"#8b9aff",muted:"#b0b0d0",border:"#333",rowBorder:"#2a2a4a",green:"#4ade80",yellow:"#fbbf24",red:"#f87171",closeBtn:"#aaa",font:"ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace"},G={nodeW:90,nodeH:16,nodeGap:6,startY:16,colGap:20,fontSize:10,labelMaxChars:11};function Ve(e,s,o,r){let a=false,p={position:"fixed",zIndex:"99999",...s.includes("bottom")?{bottom:"12px"}:{top:"12px"},...s.includes("right")?{right:"12px"}:{left:"12px"}},l=document.createElement("style");l.textContent=`[data-directive-devtools] summary:focus-visible{outline:2px solid ${b.accent};outline-offset:2px;border-radius:2px}[data-directive-devtools] button:focus-visible{outline:2px solid ${b.accent};outline-offset:2px}`,document.head.appendChild(l);let t=document.createElement("button");t.setAttribute("aria-label","Open Directive DevTools"),t.setAttribute("aria-expanded",String(o)),t.title="Ctrl+Shift+D to toggle",Object.assign(t.style,{...p,background:b.bg,color:b.text,border:`1px solid ${b.border}`,borderRadius:"6px",padding:"10px 14px",minWidth:"44px",minHeight:"44px",cursor:"pointer",fontFamily:b.font,fontSize:"12px",display:o?"none":"block"}),t.textContent="Directive";let i=document.createElement("div");i.setAttribute("role","region"),i.setAttribute("aria-label","Directive DevTools"),i.setAttribute("data-directive-devtools",""),i.tabIndex=-1,Object.assign(i.style,{...p,background:b.bg,color:b.text,border:`1px solid ${b.border}`,borderRadius:"8px",padding:"12px",fontFamily:b.font,fontSize:"11px",maxWidth:"min(380px, calc(100vw - 24px))",maxHeight:"min(500px, calc(100vh - 24px))",overflow:"auto",boxShadow:"0 4px 20px rgba(0,0,0,0.5)",display:o?"block":"none"});let c=document.createElement("div");Object.assign(c.style,{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:"8px"});let d=document.createElement("strong");d.style.color=b.accent,d.textContent=e==="default"?"Directive DevTools":`DevTools (${e})`;let y=document.createElement("button");y.setAttribute("aria-label","Close DevTools"),Object.assign(y.style,{background:"none",border:"none",color:b.closeBtn,cursor:"pointer",fontSize:"16px",padding:"8px 12px",minWidth:"44px",minHeight:"44px",lineHeight:"1",display:"flex",alignItems:"center",justifyContent:"center"}),y.textContent="\xD7",c.appendChild(d),c.appendChild(y),i.appendChild(c);let I=document.createElement("div");I.style.marginBottom="6px",I.setAttribute("aria-live","polite");let N=document.createElement("span");N.style.color=b.green,N.textContent="Settled",I.appendChild(N),i.appendChild(I);let R=document.createElement("div");Object.assign(R.style,{display:"none",marginBottom:"8px",padding:"4px 8px",background:"#252545",borderRadius:"4px",alignItems:"center",gap:"6px"});let w=document.createElement("button");Object.assign(w.style,{background:"none",border:`1px solid ${b.border}`,color:b.text,cursor:"pointer",padding:"4px 10px",borderRadius:"3px",fontFamily:b.font,fontSize:"11px",minWidth:"44px",minHeight:"44px"}),w.textContent="\u25C0 Undo",w.disabled=true;let g=document.createElement("button");Object.assign(g.style,{background:"none",border:`1px solid ${b.border}`,color:b.text,cursor:"pointer",padding:"4px 10px",borderRadius:"3px",fontFamily:b.font,fontSize:"11px",minWidth:"44px",minHeight:"44px"}),g.textContent="Redo \u25B6",g.disabled=true;let f=document.createElement("span");f.style.color=b.muted,f.style.fontSize="10px",R.appendChild(w),R.appendChild(g),R.appendChild(f),i.appendChild(R);function C(z,K){let X=document.createElement("details");K&&(X.open=true),X.style.marginBottom="4px";let J=document.createElement("summary");Object.assign(J.style,{cursor:"pointer",color:b.accent,marginBottom:"4px"});let Q=document.createElement("span");J.textContent=`${z} (`,J.appendChild(Q),J.appendChild(document.createTextNode(")")),Q.textContent="0",X.appendChild(J);let te=document.createElement("table");Object.assign(te.style,{width:"100%",borderCollapse:"collapse",fontSize:"11px"});let Re=document.createElement("thead"),De=document.createElement("tr");for(let nt of ["Key","Value"]){let pe=document.createElement("th");pe.scope="col",Object.assign(pe.style,{textAlign:"left",padding:"2px 4px",color:b.accent}),pe.textContent=nt,De.appendChild(pe);}Re.appendChild(De),te.appendChild(Re);let Ae=document.createElement("tbody");return te.appendChild(Ae),X.appendChild(te),{details:X,tbody:Ae,countSpan:Q}}function T(z,K){let X=document.createElement("details");X.style.marginBottom="4px";let J=document.createElement("summary");Object.assign(J.style,{cursor:"pointer",color:K,marginBottom:"4px"});let Q=document.createElement("span");J.textContent=`${z} (`,J.appendChild(Q),J.appendChild(document.createTextNode(")")),Q.textContent="0",X.appendChild(J);let te=document.createElement("ul");return Object.assign(te.style,{margin:"0",paddingLeft:"16px"}),X.appendChild(te),{details:X,list:te,countSpan:Q}}let P=C("Facts",true);i.appendChild(P.details);let F=C("Derivations",false);i.appendChild(F.details);let O=T("Inflight",b.yellow);i.appendChild(O.details);let Y=T("Unmet",b.red);i.appendChild(Y.details);let $=document.createElement("details");$.style.marginBottom="4px";let V=document.createElement("summary");Object.assign(V.style,{cursor:"pointer",color:b.accent,marginBottom:"4px"}),V.textContent="Performance",$.appendChild(V);let _=document.createElement("div");_.style.fontSize="10px",_.style.color=b.muted,_.textContent="No data yet",$.appendChild(_),i.appendChild($);let H=document.createElement("details");H.style.marginBottom="4px";let h=document.createElement("summary");Object.assign(h.style,{cursor:"pointer",color:b.accent,marginBottom:"4px"}),h.textContent="Dependency Graph",H.appendChild(h);let x=document.createElementNS("http://www.w3.org/2000/svg","svg");x.setAttribute("width","100%"),x.setAttribute("height","120"),x.setAttribute("role","img"),x.setAttribute("aria-label","System dependency graph"),x.style.display="block",x.setAttribute("viewBox","0 0 460 120"),x.setAttribute("preserveAspectRatio","xMinYMin meet"),H.appendChild(x),i.appendChild(H);let E=document.createElement("details");E.style.marginBottom="4px";let q=document.createElement("summary");Object.assign(q.style,{cursor:"pointer",color:b.accent,marginBottom:"4px"}),q.textContent="Timeline",E.appendChild(q);let j=document.createElementNS("http://www.w3.org/2000/svg","svg");j.setAttribute("width","100%"),j.setAttribute("height","60"),j.setAttribute("role","img"),j.setAttribute("aria-label","Resolver execution timeline"),j.style.display="block",j.setAttribute("viewBox",`0 0 ${ie} 60`),j.setAttribute("preserveAspectRatio","xMinYMin meet");let u=document.createElementNS("http://www.w3.org/2000/svg","text");u.setAttribute("x",String(ie/2)),u.setAttribute("y","30"),u.setAttribute("text-anchor","middle"),u.setAttribute("fill",b.muted),u.setAttribute("font-size","10"),u.setAttribute("font-family",b.font),u.textContent="No resolver activity yet",j.appendChild(u),E.appendChild(j),i.appendChild(E);let M=(()=>{let z=document.createElement("details");z.style.marginBottom="4px";let K=document.createElement("summary");Object.assign(K.style,{cursor:"pointer",color:b.accent,marginBottom:"4px"});let X=document.createElement("span");X.textContent="0",K.textContent="Constraints (",K.appendChild(X),K.appendChild(document.createTextNode(")")),z.appendChild(K);let J=document.createElement("div");Object.assign(J.style,{fontSize:"11px"});let Q=document.createElement("div");return Q.style.color=b.muted,Q.style.padding="4px",Q.style.fontStyle="italic",Q.textContent="Waiting for first evaluation\u2026",Q.className="dt-constraints-empty",J.appendChild(Q),z.appendChild(J),i.appendChild(z),{details:z,body:J,countSpan:X}})(),S,A,W,k;if(r){let z=document.createElement("details");z.style.marginBottom="4px";let K=document.createElement("summary");Object.assign(K.style,{cursor:"pointer",color:b.accent,marginBottom:"4px"}),W=document.createElement("span"),W.textContent="0",K.textContent="Events (",K.appendChild(W),K.appendChild(document.createTextNode(")")),z.appendChild(K),A=document.createElement("div"),Object.assign(A.style,{maxHeight:"150px",overflow:"auto",fontSize:"10px"}),A.setAttribute("role","log"),A.setAttribute("aria-live","polite"),A.tabIndex=0;let X=document.createElement("div");X.style.color=b.muted,X.style.padding="4px",X.textContent="Waiting for events...",X.className="dt-events-empty",A.appendChild(X),z.appendChild(A),i.appendChild(z),S=z,k=document.createElement("div");}else S=document.createElement("details"),A=document.createElement("div"),W=document.createElement("span"),k=document.createElement("div"),k.style.fontSize="10px",k.style.color=b.muted,k.style.marginTop="4px",k.style.fontStyle="italic",k.textContent="Enable trace: true for event log",i.appendChild(k);let L=document.createElement("div");Object.assign(L.style,{display:"flex",gap:"6px",marginTop:"6px"});let n=document.createElement("button");Object.assign(n.style,{background:"none",border:`1px solid ${b.border}`,color:b.text,cursor:"pointer",padding:"8px 12px",borderRadius:"3px",fontFamily:b.font,fontSize:"10px",minWidth:"44px",minHeight:"44px"}),n.textContent="\u23FA Record";let m=document.createElement("button");Object.assign(m.style,{background:"none",border:`1px solid ${b.border}`,color:b.text,cursor:"pointer",padding:"8px 12px",borderRadius:"3px",fontFamily:b.font,fontSize:"10px",minWidth:"44px",minHeight:"44px"}),m.textContent="\u2913 Export",L.appendChild(n),L.appendChild(m),i.appendChild(L),i.addEventListener("wheel",z=>{let K=i,X=K.scrollTop===0&&z.deltaY<0,J=K.scrollTop+K.clientHeight>=K.scrollHeight&&z.deltaY>0;(X||J)&&z.preventDefault();},{passive:false});let v=o,D=new Set;function B(){v=true,i.style.display="block",t.style.display="none",t.setAttribute("aria-expanded","true"),y.focus();}function U(){v=false,i.style.display="none",t.style.display="block",t.setAttribute("aria-expanded","false"),t.focus();}t.addEventListener("click",B),y.addEventListener("click",U);function Z(z){z.key==="Escape"&&v&&U();}i.addEventListener("keydown",Z);function re(z){z.key==="d"&&z.shiftKey&&(z.ctrlKey||z.metaKey)&&(z.preventDefault(),v?U():B());}document.addEventListener("keydown",re);function oe(){a||(document.body.appendChild(t),document.body.appendChild(i));}document.body?oe():document.addEventListener("DOMContentLoaded",oe,{once:true});function le(){a=true,t.removeEventListener("click",B),y.removeEventListener("click",U),i.removeEventListener("keydown",Z),document.removeEventListener("keydown",re),document.removeEventListener("DOMContentLoaded",oe);for(let z of D)clearTimeout(z);D.clear(),t.remove(),i.remove(),l.remove();}return {refs:{container:i,toggleBtn:t,titleEl:d,statusEl:N,factsBody:P.tbody,factsCount:P.countSpan,derivBody:F.tbody,derivCount:F.countSpan,derivSection:F.details,inflightList:O.list,inflightSection:O.details,inflightCount:O.countSpan,unmetList:Y.list,unmetSection:Y.details,unmetCount:Y.countSpan,perfSection:$,perfBody:_,historySection:R,historyLabel:f,undoBtn:w,redoBtn:g,flowSection:H,flowSvg:x,timelineSection:E,timelineSvg:j,eventsSection:S,eventsList:A,eventsCount:W,traceHint:k,recordBtn:n,exportBtn:m,constraintsSection:M.details,constraintsBody:M.body,constraintsCount:M.countSpan},destroy:le,isOpen:()=>v,flashTimers:D}}function de(e,s,o,r,a,p){let l=fe(r),t=e.get(o);if(t){let i=t.cells;if(i[1]&&(i[1].textContent=l,a&&p)){let c=i[1];c.style.background="rgba(139, 154, 255, 0.25)";let d=setTimeout(()=>{c.style.background="",p.delete(d);},300);p.add(d);}}else {t=document.createElement("tr"),t.style.borderBottom=`1px solid ${b.rowBorder}`;let i=document.createElement("td");Object.assign(i.style,{padding:"2px 4px",color:b.muted}),i.textContent=o;let c=document.createElement("td");c.style.padding="2px 4px",c.textContent=l,t.appendChild(i),t.appendChild(c),s.appendChild(t),e.set(o,t);}}function ze(e,s){let o=e.get(s);o&&(o.remove(),e.delete(s));}function be(e,s,o){if(e.inflightList.replaceChildren(),e.inflightCount.textContent=String(s.length),s.length>0)for(let r of s){let a=document.createElement("li");a.style.fontSize="11px",a.textContent=`${r.resolverId} (${r.id})`,e.inflightList.appendChild(a);}else {let r=document.createElement("li");r.style.fontSize="10px",r.style.color=b.muted,r.textContent="None",e.inflightList.appendChild(r);}if(e.unmetList.replaceChildren(),e.unmetCount.textContent=String(o.length),o.length>0)for(let r of o){let a=document.createElement("li");a.style.fontSize="11px",a.textContent=`${r.requirement.type} from ${r.fromConstraint}`,e.unmetList.appendChild(a);}else {let r=document.createElement("li");r.style.fontSize="10px",r.style.color=b.muted,r.textContent="None",e.unmetList.appendChild(r);}}function ye(e,s,o){let r=s===0&&o===0;e.statusEl.style.color=r?b.green:b.yellow,e.statusEl.textContent=r?"Settled":"Working...",e.toggleBtn.textContent=r?"Directive":"Directive...",e.toggleBtn.setAttribute("aria-label",`Open Directive DevTools${r?"":" (system working)"}`);}function Ee(e,s,o,r){let a=Object.keys(o.derive);if(e.derivCount.textContent=String(a.length),a.length===0){s.clear(),e.derivBody.replaceChildren();let l=document.createElement("tr"),t=document.createElement("td");t.colSpan=2,t.style.color=b.muted,t.style.fontSize="10px",t.textContent="No derivations defined",l.appendChild(t),e.derivBody.appendChild(l);return}let p=new Set(a);for(let[l,t]of s)p.has(l)||(t.remove(),s.delete(l));for(let l of a){let t;try{t=fe(o.read(l));}catch{t="<error>";}de(s,e.derivBody,l,t,true,r);}}function We(e,s,o,r){let a=e.eventsList.querySelector(".dt-events-empty");a&&a.remove();let p=document.createElement("div");Object.assign(p.style,{padding:"2px 4px",borderBottom:`1px solid ${b.rowBorder}`,fontFamily:"inherit"});let l=new Date,t=`${String(l.getHours()).padStart(2,"0")}:${String(l.getMinutes()).padStart(2,"0")}:${String(l.getSeconds()).padStart(2,"0")}.${String(l.getMilliseconds()).padStart(3,"0")}`,i;try{let I=JSON.stringify(o);i=ee(I,60);}catch{i="{}";}let c=document.createElement("span");c.style.color=b.closeBtn,c.textContent=t;let d=document.createElement("span");d.style.color=b.accent,d.textContent=` ${s} `;let y=document.createElement("span");for(y.style.color=b.muted,y.textContent=i,p.appendChild(c),p.appendChild(d),p.appendChild(y),e.eventsList.prepend(p);e.eventsList.childElementCount>He;)e.eventsList.lastElementChild?.remove();e.eventsCount.textContent=String(r);}function Ue(e,s){e.perfBody.replaceChildren();let o=s.reconcileCount>0?(s.reconcileTotalMs/s.reconcileCount).toFixed(1):"\u2014",r=[`Reconciles: ${s.reconcileCount} (avg ${o}ms)`,`Effects: ${s.effectRunCount} run, ${s.effectErrorCount} errors`];for(let a of r){let p=document.createElement("div");p.style.marginBottom="2px",p.textContent=a,e.perfBody.appendChild(p);}if(s.resolverStats.size>0){let a=document.createElement("div");a.style.marginTop="4px",a.style.marginBottom="2px",a.style.color=b.accent,a.textContent="Resolvers:",e.perfBody.appendChild(a);let p=[...s.resolverStats.entries()].sort((l,t)=>t[1].totalMs-l[1].totalMs);for(let[l,t]of p){let i=t.count>0?(t.totalMs/t.count).toFixed(1):"0",c=document.createElement("div");c.style.paddingLeft="8px",c.textContent=`${l}: ${t.count}x, avg ${i}ms${t.errors>0?`, ${t.errors} err`:""}`,t.errors>0&&(c.style.color=b.red),e.perfBody.appendChild(c);}}}function Ce(e,s){let o=s.history;if(!o){e.historySection.style.display="none";return}e.historySection.style.display="flex";let r=o.currentIndex,a=o.snapshots.length;e.historyLabel.textContent=a>0?`${r+1} / ${a}`:"0 snapshots";let p=r>0,l=r<a-1;e.undoBtn.disabled=!p,e.undoBtn.style.opacity=p?"1":"0.4",e.redoBtn.disabled=!l,e.redoBtn.style.opacity=l?"1":"0.4";}function Ge(e,s){e.undoBtn.addEventListener("click",()=>{s.history&&s.history.currentIndex>0&&s.history.goBack(1);}),e.redoBtn.addEventListener("click",()=>{s.history&&s.history.currentIndex<s.history.snapshots.length-1&&s.history.goForward(1);});}var qe=Object.assign(Object.create(null),{$eq:"=",$ne:"\u2260",$gt:">",$gte:"\u2265",$lt:"<",$lte:"\u2264",$in:"\u2208",$nin:"\u2209",$exists:"exists",$between:"in",$startsWith:"starts with",$endsWith:"ends with",$contains:"contains",$matches:"matches",$changed:"changed"});function at(e){return Object.hasOwn(qe,e)?qe[e]:e}function Fe(e){return e instanceof RegExp?ee(String(e),40):fe(e)}var ct=new Set(["$all","$any","$not"]);function Ye(e){let s=document.createElement("li"),o=e.pass?"\u2713":"\u2717";if(s.style.color=e.pass?b.green:b.red,s.style.listStyle="none",ct.has(e.op)){let r=e.path?` @ ${e.path}`:"";if(s.textContent=`${o} ${e.op}${r}`,e.children&&e.children.length>0){let a=document.createElement("ul");Object.assign(a.style,{margin:"0",paddingLeft:"14px",listStyle:"none"});for(let p of e.children)a.appendChild(Ye(p));s.appendChild(a);}}else {let r=at(e.op),a=Fe(e.expected);if(e.pass)s.textContent=`${o} ${e.path} ${r} ${a}`;else {let p=Fe(e.actual);s.textContent=`${o} ${e.path} ${r} ${a} (actual: ${p})`;}}return s}function Xe(e,s,o){let r=s.get(o);if(r&&(r.remove(),s.delete(o),e.constraintsCount.textContent=String(s.size)),s.size===0&&!e.constraintsBody.querySelector(".dt-constraints-empty")){let a=document.createElement("div");a.style.color=b.muted,a.style.padding="4px",a.style.fontStyle="italic",a.textContent="Waiting for first evaluation\u2026",a.className="dt-constraints-empty",e.constraintsBody.appendChild(a);}}function Ke(e,s){let o=e.constraintsBody.querySelector(".dt-constraints-empty");o&&(o.textContent=s?"Waiting for first evaluation\u2026":"This system has no constraints");}function Je(e,s,o,r,a,p){let l=e.constraintsBody.querySelector(".dt-constraints-empty");l&&l.remove();let t=s.get(o);t||(t=document.createElement("div"),Object.assign(t.style,{marginBottom:"6px",paddingBottom:"4px",borderBottom:`1px solid ${b.rowBorder}`}),s.set(o,t),e.constraintsBody.appendChild(t),e.constraintsCount.textContent=String(s.size)),t.replaceChildren();let i=document.createElement("div");Object.assign(i.style,{fontWeight:"bold",color:r?b.green:b.muted});let c=r?"\u2713":"\u2717";if(i.textContent=p?`${c} ${o} (${p})`:`${c} ${o}`,t.appendChild(i),a&&a.length>0){let d=document.createElement("ul");Object.assign(d.style,{margin:"2px 0 0 0",paddingLeft:"14px",listStyle:"none"});for(let y of a)d.appendChild(Ye(y));t.appendChild(d);}else if(!a){let d=document.createElement("div");Object.assign(d.style,{color:b.muted,fontSize:"10px",fontStyle:"italic",paddingLeft:"14px"}),d.textContent="function-form when (no clause tree)",t.appendChild(d);}}var we=new WeakMap;function lt(e,s,o,r,a,p){return [e.join(","),s.join(","),o.map(l=>`${l.id}:${l.active}`).join(","),[...r.entries()].map(([l,t])=>`${l}:${t.status}:${t.type}`).join(","),a.join(","),p.join(",")].join("|")}function ut(e,s,o,r,a){for(let p of o){let l=e.nodes.get(`0:${p}`);if(!l)continue;let t=s.recentlyChangedFacts.has(p);l.rect.setAttribute("fill",t?b.text+"33":"none"),l.rect.setAttribute("stroke-width",t?"2":"1");}for(let p of r){let l=e.nodes.get(`1:${p}`);if(!l)continue;let t=s.recentlyComputedDerivations.has(p);l.rect.setAttribute("fill",t?b.accent+"33":"none"),l.rect.setAttribute("stroke-width",t?"2":"1");}for(let p of a){let l=e.nodes.get(`2:${p}`);if(!l)continue;let t=s.recentlyActiveConstraints.has(p),i=l.rect.getAttribute("stroke")??b.muted;l.rect.setAttribute("fill",t?i+"33":"none"),l.rect.setAttribute("stroke-width",t?"2":"1");}}function Me(e,s,o){let r=se(s);if(!r)return;let a;try{a=Object.keys(s.facts.$store.toObject());}catch{a=[];}let p=Object.keys(s.derive),l=r.constraints,t=r.unmet,i=r.inflight,c=Object.keys(r.resolvers),d=new Map;for(let u of t)d.set(u.id,{type:u.requirement.type,fromConstraint:u.fromConstraint,status:"unmet"});for(let u of i)d.set(u.id,{type:u.resolverId,fromConstraint:"",status:"inflight"});if(a.length===0&&p.length===0&&l.length===0&&c.length===0){we.delete(e.flowSvg),e.flowSvg.replaceChildren(),e.flowSvg.setAttribute("viewBox","0 0 460 40");let u=document.createElementNS("http://www.w3.org/2000/svg","text");u.setAttribute("x","230"),u.setAttribute("y","24"),u.setAttribute("text-anchor","middle"),u.setAttribute("fill",b.muted),u.setAttribute("font-size","10"),u.setAttribute("font-family",b.font),u.textContent="No system topology",e.flowSvg.appendChild(u);return}let y=i.map(u=>u.resolverId).sort(),I=lt(a,p,l,d,c,y),N=we.get(e.flowSvg);if(N&&N.fingerprint===I){ut(N,o,a,p,l.map(u=>u.id));return}let R=G.nodeW+G.colGap,w=[5,5+R,5+R*2,5+R*3,5+R*4],g=w[4]+G.nodeW+5;function f(u){let M=G.startY+12;return u.map(S=>{let A={...S,y:M};return M+=G.nodeH+G.nodeGap,A})}let C=f(a.map(u=>{let M=r.facts.find(S=>S.key===u);return {id:u,label:ee(M?.meta?.label??u,G.labelMaxChars)}})),T=f(p.map(u=>{let M=r.derivations.find(S=>S.id===u);return {id:u,label:ee(M?.meta?.label??u,G.labelMaxChars)}})),P=f(l.map(u=>({id:u.id,label:ee(u.meta?.label??u.id,G.labelMaxChars),active:u.active,priority:u.priority}))),F=f([...d.entries()].map(([u,M])=>({id:u,type:M.type,fromConstraint:M.fromConstraint,status:M.status}))),O=f(c.map(u=>{let M=r.resolverDefs.find(S=>S.id===u);return {id:u,label:ee(M?.meta?.label??u,G.labelMaxChars)}})),Y=Math.max(C.length,T.length,P.length,F.length,O.length,1),$=G.startY+12+Y*(G.nodeH+G.nodeGap)+8;e.flowSvg.replaceChildren(),e.flowSvg.setAttribute("viewBox",`0 0 ${g} ${$}`),e.flowSvg.setAttribute("aria-label",`Dependency graph: ${a.length} facts, ${p.length} derivations, ${l.length} constraints, ${d.size} requirements, ${c.length} resolvers`);let V=["Facts","Derivations","Constraints","Reqs","Resolvers"];for(let[u,M]of V.entries()){let S=document.createElementNS("http://www.w3.org/2000/svg","text");S.setAttribute("x",String(w[u]??0)),S.setAttribute("y","10"),S.setAttribute("fill",b.accent),S.setAttribute("font-size",String(G.fontSize)),S.setAttribute("font-family",b.font),S.textContent=M,e.flowSvg.appendChild(S);}let _={fingerprint:I,nodes:new Map};function H(u,M,S,A,W,k,L,n,m){let v=document.createElementNS("http://www.w3.org/2000/svg","g");if(m){let U=document.createElementNS("http://www.w3.org/2000/svg","title");U.textContent=m,v.appendChild(U);}let D=document.createElementNS("http://www.w3.org/2000/svg","rect");D.setAttribute("x",String(M)),D.setAttribute("y",String(S-6)),D.setAttribute("width",String(G.nodeW)),D.setAttribute("height",String(G.nodeH)),D.setAttribute("rx","3"),D.setAttribute("fill",n?k+"33":"none"),D.setAttribute("stroke",k),D.setAttribute("stroke-width",n?"2":"1"),D.setAttribute("opacity",L?"0.35":"1"),v.appendChild(D);let B=document.createElementNS("http://www.w3.org/2000/svg","text");return B.setAttribute("x",String(M+4)),B.setAttribute("y",String(S+4)),B.setAttribute("fill",k),B.setAttribute("font-size",String(G.fontSize)),B.setAttribute("font-family",b.font),B.setAttribute("opacity",L?"0.35":"1"),B.textContent=W,v.appendChild(B),e.flowSvg.appendChild(v),_.nodes.set(`${u}:${A}`,{g:v,rect:D,text:B}),{midX:M+G.nodeW/2,midY:S}}function h(u,M,S,A,W,k){let L=document.createElementNS("http://www.w3.org/2000/svg","line");L.setAttribute("x1",String(u)),L.setAttribute("y1",String(M)),L.setAttribute("x2",String(S)),L.setAttribute("y2",String(A)),L.setAttribute("stroke",W),L.setAttribute("stroke-width","1"),L.setAttribute("stroke-dasharray","3,2"),L.setAttribute("opacity","0.7"),e.flowSvg.appendChild(L);}let x=new Map,E=new Map,q=new Map,j=new Map;for(let u of C){let M=o.recentlyChangedFacts.has(u.id),S=r.facts.find(W=>W.key===u.id)?.meta,A=H(0,w[0],u.y,u.id,u.label,b.text,false,M,S?.description);x.set(u.id,A);}for(let u of T){let M=o.recentlyComputedDerivations.has(u.id),S=r.derivations.find(W=>W.id===u.id)?.meta,A=H(1,w[1],u.y,u.id,u.label,b.accent,false,M,S?.description);E.set(u.id,A);}for(let u of P){let M=o.recentlyActiveConstraints.has(u.id),S=l.find(W=>W.id===u.id)?.meta,A=H(2,w[2],u.y,u.id,u.label,S?.color??(u.active?b.yellow:b.muted),!u.active,M,S?.description);q.set(u.id,A);}for(let u of F){let M=u.status==="unmet"?b.red:b.yellow,S=H(3,w[3],u.y,u.id,ee(u.type,G.labelMaxChars),M,false,false);j.set(u.id,S);}for(let u of O){let M=i.some(A=>A.resolverId===u.id),S=r.resolverDefs.find(A=>A.id===u.id)?.meta;H(4,w[4],u.y,u.id,u.label,S?.color??(M?b.green:b.muted),!M,false,S?.description);}for(let u of T){let M=o.derivationDeps.get(u.id),S=E.get(u.id);if(M&&S)for(let A of M){let W=x.get(A);W&&h(W.midX+G.nodeW/2,W.midY,S.midX-G.nodeW/2,S.midY,b.accent);}}for(let u of F){let M=q.get(u.fromConstraint),S=j.get(u.id);M&&S&&h(M.midX+G.nodeW/2,M.midY,S.midX-G.nodeW/2,S.midY,b.muted);}for(let u of i){let M=j.get(u.id);if(M){let S=O.find(A=>A.id===u.resolverId);S&&h(M.midX+G.nodeW/2,M.midY,w[4],S.y,b.green);}}we.set(e.flowSvg,_);}function Qe(e){e.animationTimer&&clearTimeout(e.animationTimer),e.animationTimer=setTimeout(()=>{e.recentlyChangedFacts.clear(),e.recentlyComputedDerivations.clear(),e.recentlyActiveConstraints.clear(),e.animationTimer=null;},600);}function Ze(e,s){let o=s.entries.toArray();if(o.length===0)return;e.timelineSvg.replaceChildren();let r=Number.POSITIVE_INFINITY,a=Number.NEGATIVE_INFINITY;for(let R of o)R.startMs<r&&(r=R.startMs),R.endMs>a&&(a=R.endMs);let p=performance.now();for(let R of s.inflight.values())R<r&&(r=R),p>a&&(a=p);let l=a-r||1,t=ie-ce-10,i=[],c=new Set;for(let R of o)c.has(R.resolver)||(c.add(R.resolver),i.push(R.resolver));for(let R of s.inflight.keys())c.has(R)||(c.add(R),i.push(R));let y=i.slice(-12),I=ae*y.length+20;e.timelineSvg.setAttribute("viewBox",`0 0 ${ie} ${I}`),e.timelineSvg.setAttribute("height",String(Math.min(I,200)));let N=5;for(let R=0;R<=N;R++){let w=ce+t*R/N,g=l*R/N,f=document.createElementNS("http://www.w3.org/2000/svg","text");f.setAttribute("x",String(w)),f.setAttribute("y","8"),f.setAttribute("fill",b.muted),f.setAttribute("font-size","6"),f.setAttribute("font-family",b.font),f.setAttribute("text-anchor","middle"),f.textContent=g<1e3?`${g.toFixed(0)}ms`:`${(g/1e3).toFixed(1)}s`,e.timelineSvg.appendChild(f);let C=document.createElementNS("http://www.w3.org/2000/svg","line");C.setAttribute("x1",String(w)),C.setAttribute("y1","10"),C.setAttribute("x2",String(w)),C.setAttribute("y2",String(I)),C.setAttribute("stroke",b.border),C.setAttribute("stroke-width","0.5"),e.timelineSvg.appendChild(C);}for(let R=0;R<y.length;R++){let w=y[R],g=12+R*ae,f=R%Se.length,C=Se[f],T=document.createElementNS("http://www.w3.org/2000/svg","text");T.setAttribute("x",String(ce-4)),T.setAttribute("y",String(g+ae/2+3)),T.setAttribute("fill",b.muted),T.setAttribute("font-size","7"),T.setAttribute("font-family",b.font),T.setAttribute("text-anchor","end"),T.textContent=ee(w,12),e.timelineSvg.appendChild(T);let P=o.filter(O=>O.resolver===w);for(let O of P){let Y=ce+(O.startMs-r)/l*t,$=Math.max((O.endMs-O.startMs)/l*t,he),V=document.createElementNS("http://www.w3.org/2000/svg","rect");V.setAttribute("x",String(Y)),V.setAttribute("y",String(g+2)),V.setAttribute("width",String($)),V.setAttribute("height",String(ae-4)),V.setAttribute("rx","2"),V.setAttribute("fill",O.error?b.red:C),V.setAttribute("opacity","0.8");let _=document.createElementNS("http://www.w3.org/2000/svg","title"),H=O.endMs-O.startMs;_.textContent=`${w}: ${H.toFixed(1)}ms${O.error?" (error)":""}`,V.appendChild(_),e.timelineSvg.appendChild(V);}let F=s.inflight.get(w);if(F!==void 0){let O=ce+(F-r)/l*t,Y=Math.max((p-F)/l*t,he),$=document.createElementNS("http://www.w3.org/2000/svg","rect");$.setAttribute("x",String(O)),$.setAttribute("y",String(g+2)),$.setAttribute("width",String(Y)),$.setAttribute("height",String(ae-4)),$.setAttribute("rx","2"),$.setAttribute("fill",C),$.setAttribute("opacity","0.4"),$.setAttribute("stroke",C),$.setAttribute("stroke-width","1"),$.setAttribute("stroke-dasharray","3,2");let V=document.createElementNS("http://www.w3.org/2000/svg","title");V.textContent=`${w}: inflight ${(p-F).toFixed(0)}ms`,$.appendChild(V),e.timelineSvg.appendChild($);}}e.timelineSvg.setAttribute("aria-label",`Timeline: ${o.length} resolver executions across ${y.length} resolvers`);}function dt(){if(typeof window>"u")return {systems:new Map,getSystem:()=>null,getSystems:()=>[],inspect:()=>null,getEvents:()=>[],explain:()=>null,exportSession:()=>null,importSession:()=>false,clearEvents:()=>{},subscribe:()=>()=>{}};if(!window.__DIRECTIVE__){let e=new Map,s={systems:e,getSystem(o){return o?e.get(o)?.system??null:e.values().next().value?.system??null},getSystems(){return [...e.keys()]},inspect(o){let r=this.getSystem(o),a=o?e.get(o):e.values().next().value,p=r?.inspect()??null;return p&&a&&(p.resolverStats=a.resolverStats?Object.fromEntries(a.resolverStats):{}),p},getEvents(o){return o?e.get(o)?.events.toArray()??[]:e.values().next().value?.events.toArray()??[]},explain(o,r){return this.getSystem(r)?.explain(o)??null},subscribe(o,r){let a=r?e.get(r):e.values().next().value;if(!a){let p=false,t=setInterval(()=>{let c=r?e.get(r):e.values().next().value;c&&!p&&(p=true,c.subscribers.add(o));},100),i=setTimeout(()=>clearInterval(t),1e4);return ()=>{clearInterval(t),clearTimeout(i);for(let c of e.values())c.subscribers.delete(o);}}return a.subscribers.add(o),()=>{a.subscribers.delete(o);}},exportSession(o){let r=o?e.get(o):e.values().next().value;return r?JSON.stringify({version:1,name:o??e.keys().next().value??"default",exportedAt:Date.now(),events:r.events.toArray()}):null},importSession(o,r){try{if(o.length>10*1024*1024)return !1;let a=JSON.parse(o);if(!a||typeof a!="object"||Array.isArray(a)||!Array.isArray(a.events))return !1;let p=r?e.get(r):e.values().next().value;if(!p)return !1;let l=p.maxEvents,t=a.events,i=t.length>l?t.length-l:0;p.events.clear();for(let c=i;c<t.length;c++){let d=t[c];d&&typeof d=="object"&&!Array.isArray(d)&&typeof d.timestamp=="number"&&typeof d.type=="string"&&d.type!=="__proto__"&&d.type!=="constructor"&&d.type!=="prototype"&&p.events.push({timestamp:d.timestamp,type:d.type,data:d.data??null});}return !0}catch{return false}},clearEvents(o){let r=o?e.get(o):e.values().next().value;r&&r.events.clear();}};return Object.defineProperty(window,"__DIRECTIVE__",{value:s,writable:false,configurable:ge(),enumerable:true}),s}return window.__DIRECTIVE__}function mt(e={}){let{name:s="default",trace:o=false,maxEvents:r,panel:a=false,position:p="bottom-right",defaultOpen:l=false}=e,t=Pe(r),i=dt(),c={system:null,events:new ue(t),maxEvents:t,subscribers:new Set,resolverStats:new Map};i.systems.set(s,c);let d=(n,m)=>{let v={timestamp:Date.now(),type:n,data:m};o&&c.events.push(v);for(let D of c.subscribers)try{D(v);}catch{}},y=null,I=new Map,N=new Map,R=new Map,w=Ie(),g=_e(),f=je(),C=$e(),T=a&&typeof window<"u"&&typeof document<"u"&&ge(),P=null,F=0,O=1,Y=2,$=4,V=8,_=16,H=32,h=64,x=128,E=256,q=new Map,j=new Set,u=new Map,M=new Set,S=null;function A(n){F|=n,P===null&&typeof requestAnimationFrame<"u"&&(P=requestAnimationFrame(W));}function W(){if(P=null,!y||!c.system){F=0;return}let n=y.refs,m=c.system,v=F;if(F=0,v&O){for(let D of j)ze(I,D);j.clear();for(let[D,{value:B,flash:U}]of q)de(I,n.factsBody,D,B,U,y.flashTimers);q.clear(),n.factsCount.textContent=String(I.size);}if(v&Y&&Ee(n,N,m,y.flashTimers),v&E){for(let D of M)Xe(n,R,D);M.clear();for(let[D,{active:B,whenExplain:U,label:Z}]of u)Je(n,R,D,B,U,Z);u.clear();}if(v&V)if(S)ye(n,S.inflight.length,S.unmet.length);else {let D=se(m);D&&ye(n,D.inflight.length,D.unmet.length);}if(v&$)if(S)be(n,S.inflight,S.unmet);else {let D=se(m);D&&be(n,D.inflight,D.unmet);}v&_&&Ue(n,w),v&H&&Me(n,m,g),v&h&&Ce(n,m),v&x&&Ze(n,C);}function k(n,m){y&&o&&We(y.refs,n,m,c.events.size);}function L(n,m){f.isRecording&&f.recordedEvents.length<Ne&&f.recordedEvents.push({timestamp:Date.now(),type:n,data:Le(m)});}return {name:"devtools",onInit:n=>{if(c.system=n,d("init",{}),typeof window<"u"&&console.log(`%c[Directive Devtools]%c System "${s}" initialized. Access via window.__DIRECTIVE__`,"color: #7c3aed; font-weight: bold","color: inherit"),T){let m=c.system;y=Ve(s,p,l,o);let v=y.refs;try{let U=m.facts.$store.toObject();for(let[Z,re]of Object.entries(U))de(I,v.factsBody,Z,re,!1);v.factsCount.textContent=String(Object.keys(U).length);}catch{}Ee(v,N,m);let D=se(m);D&&(ye(v,D.inflight.length,D.unmet.length),be(v,D.inflight,D.unmet)),Ce(v,m),Ge(v,m),Me(v,m,g);let B=(D?.constraints?.length??0)>0;Ke(v,B),v.recordBtn.addEventListener("click",()=>{if(f.isRecording=!f.isRecording,v.recordBtn.textContent=f.isRecording?"\u23F9 Stop":"\u23FA Record",v.recordBtn.style.color=f.isRecording?b.red:b.text,f.isRecording){f.recordedEvents=[],f.snapshots=[];try{f.snapshots.push({timestamp:Date.now(),facts:m.facts.$store.toObject()});}catch{}}}),v.exportBtn.addEventListener("click",()=>{let U=f.recordedEvents.length>0?f.recordedEvents:c.events.toArray(),Z=JSON.stringify({version:1,name:s,exportedAt:Date.now(),events:U,snapshots:f.snapshots},null,2),re=new Blob([Z],{type:"application/json"}),oe=URL.createObjectURL(re),le=document.createElement("a");le.href=oe,le.download=`directive-session-${s}-${Date.now()}.json`,le.click(),URL.revokeObjectURL(oe);});}},onStart:n=>{d("start",{}),k("start",{}),L("start",{});},onStop:n=>{d("stop",{}),k("stop",{}),L("stop",{});},onDestroy:n=>{d("destroy",{}),i.systems.delete(s),P!==null&&typeof cancelAnimationFrame<"u"&&(cancelAnimationFrame(P),P=null),g.animationTimer&&clearTimeout(g.animationTimer),y&&(y.destroy(),y=null,I.clear(),N.clear(),R.clear());},onFactSet:(n,m,v)=>{d("fact.set",{key:n,value:m,prev:v}),L("fact.set",{key:n,value:m,prev:v}),g.recentlyChangedFacts.add(n),y&&c.system&&(q.set(n,{value:m,flash:true}),j.delete(n),A(O),k("fact.set",{key:n,value:m}));},onFactDelete:(n,m)=>{d("fact.delete",{key:n,prev:m}),L("fact.delete",{key:n,prev:m}),y&&(j.add(n),q.delete(n),A(O),k("fact.delete",{key:n}));},onFactsBatch:n=>{if(d("facts.batch",{changes:n}),L("facts.batch",{count:n.length}),y&&c.system){for(let m of n)m.type==="delete"?(j.add(m.key),q.delete(m.key)):(g.recentlyChangedFacts.add(m.key),q.set(m.key,{value:m.value,flash:true}),j.delete(m.key));A(O),k("facts.batch",{count:n.length});}},onDerivationCompute:(n,m,v)=>{d("derivation.compute",{id:n,value:m,deps:v}),L("derivation.compute",{id:n,deps:v}),g.derivationDeps.set(n,v),g.recentlyComputedDerivations.add(n),k("derivation.compute",{id:n,deps:v});},onDerivationInvalidate:n=>{d("derivation.invalidate",{id:n}),k("derivation.invalidate",{id:n});},onReconcileStart:n=>{d("reconcile.start",{}),w.lastReconcileStartMs=performance.now(),k("reconcile.start",{}),L("reconcile.start",{});},onReconcileEnd:n=>{if(d("reconcile.end",n),L("reconcile.end",{unmet:n.unmet.length,inflight:n.inflight.length,completed:n.completed.length}),w.lastReconcileStartMs>0){let m=performance.now()-w.lastReconcileStartMs;w.reconcileCount++,w.reconcileTotalMs+=m,w.lastReconcileStartMs=0;}if(f.isRecording&&c.system&&f.snapshots.length<Be)try{f.snapshots.push({timestamp:Date.now(),facts:c.system.facts.$store.toObject()});}catch{}y&&c.system&&(S=n,Qe(g),A(Y|V|$|_|H|h),k("reconcile.end",{unmet:n.unmet.length,inflight:n.inflight.length}));},onConstraintEvaluate:(n,m,v)=>{let D=c.system?.meta?.constraint(n)?.label,B=D?{id:n,active:m,label:D}:{id:n,active:m},U=v?{...B,whenExplain:v}:B;d("constraint.evaluate",U),L("constraint.evaluate",U),m?(g.activeConstraints.add(n),g.recentlyActiveConstraints.add(n)):g.activeConstraints.delete(n),y&&(u.set(n,{active:m,whenExplain:v,label:D}),M.delete(n),A(E)),k("constraint.evaluate",{id:n,active:m});},onConstraintError:(n,m)=>{d("constraint.error",{id:n,error:String(m)}),k("constraint.error",{id:n,error:String(m)});},onRequirementCreated:n=>{d("requirement.created",{id:n.id,type:n.requirement.type}),L("requirement.created",{id:n.id,type:n.requirement.type}),k("requirement.created",{id:n.id,type:n.requirement.type});},onRequirementMet:(n,m)=>{d("requirement.met",{id:n.id,byResolver:m}),L("requirement.met",{id:n.id,byResolver:m}),k("requirement.met",{id:n.id,byResolver:m});},onRequirementCanceled:n=>{d("requirement.canceled",{id:n.id}),L("requirement.canceled",{id:n.id}),k("requirement.canceled",{id:n.id});},onResolverStart:(n,m)=>{let v=c.system?.meta?.resolver(n)?.label,D={resolver:n,requirementId:m.id},B=v?{...D,label:v}:D;d("resolver.start",B),L("resolver.start",B),C.inflight.set(n,performance.now()),y&&c.system&&(A($|V|x),k("resolver.start",{resolver:n,requirementId:m.id}));},onResolverComplete:(n,m,v)=>{let D=c.system?.meta?.resolver(n)?.label;d("resolver.complete",{resolver:n,requirementId:m.id,duration:v,...D?{label:D}:{}}),L("resolver.complete",{resolver:n,requirementId:m.id,duration:v});let B=c.resolverStats.get(n)??{count:0,totalMs:0,errors:0};if(B.count++,B.totalMs+=v,c.resolverStats.set(n,B),c.resolverStats.size>xe){let Z=c.resolverStats.keys().next().value;Z!==void 0&&c.resolverStats.delete(Z);}w.resolverStats.set(n,{...B});let U=C.inflight.get(n);C.inflight.delete(n),U!==void 0&&C.entries.push({resolver:n,startMs:U,endMs:performance.now(),error:false}),y&&c.system&&(A($|V|_|x),k("resolver.complete",{resolver:n,duration:v}));},onResolverError:(n,m,v)=>{d("resolver.error",{resolver:n,requirementId:m.id,error:String(v)}),L("resolver.error",{resolver:n,requirementId:m.id,error:String(v)});let D=c.resolverStats.get(n)??{count:0,totalMs:0,errors:0};if(D.errors++,c.resolverStats.set(n,D),c.resolverStats.size>xe){let U=c.resolverStats.keys().next().value;U!==void 0&&c.resolverStats.delete(U);}w.resolverStats.set(n,{...D});let B=C.inflight.get(n);C.inflight.delete(n),B!==void 0&&C.entries.push({resolver:n,startMs:B,endMs:performance.now(),error:true}),y&&c.system&&(A($|V|_|x),k("resolver.error",{resolver:n,error:String(v)}));},onResolverRetry:(n,m,v)=>{d("resolver.retry",{resolver:n,requirementId:m.id,attempt:v}),L("resolver.retry",{resolver:n,requirementId:m.id,attempt:v}),k("resolver.retry",{resolver:n,attempt:v});},onResolverCancel:(n,m)=>{d("resolver.cancel",{resolver:n,requirementId:m.id}),L("resolver.cancel",{resolver:n,requirementId:m.id}),C.inflight.delete(n),k("resolver.cancel",{resolver:n});},onResolverWriteRejected:n=>{let m=n.kind==="summary"?{kind:n.kind,resolver:n.resolver,requirementId:n.req.id,reason:n.reason,dropped:n.dropped}:{kind:n.kind,resolver:n.resolver,requirementId:n.req.id,reason:n.reason,fact:n.fact,expected:n.expected,actual:n.actual};d("resolver.write.rejected",m),L("resolver.write.rejected",m),k("resolver.write.rejected",n.kind==="summary"?{resolver:n.resolver,dropped:n.dropped}:{resolver:n.resolver,fact:n.fact});},onEffectRun:n=>{let m=c.system?.meta?.effect(n)?.label,v=m?{id:n,label:m}:{id:n};d("effect.run",v),L("effect.run",v),w.effectRunCount++,k("effect.run",{id:n});},onEffectError:(n,m)=>{d("effect.error",{id:n,error:String(m)}),w.effectErrorCount++,k("effect.error",{id:n,error:String(m)});},onSnapshot:n=>{d("timetravel.snapshot",{id:n.id,trigger:n.trigger}),y&&c.system&&A(h),k("timetravel.snapshot",{id:n.id,trigger:n.trigger});},onHistoryNavigate:(n,m)=>{if(d("timetravel.jump",{from:n,to:m}),L("timetravel.jump",{from:n,to:m}),y&&c.system){let v=c.system;try{let D=v.facts.$store.toObject();I.clear(),y.refs.factsBody.replaceChildren();for(let[B,U]of Object.entries(D))de(I,y.refs.factsBody,B,U,!1);y.refs.factsCount.textContent=String(Object.keys(D).length);}catch{}N.clear(),g.derivationDeps.clear(),y.refs.derivBody.replaceChildren(),R.clear(),y.refs.constraintsBody.replaceChildren(),y.refs.constraintsCount.textContent="0",S=null,A(Y|V|$|H|h),k("timetravel.jump",{from:n,to:m});}},onError:n=>{d("error",{source:n.source,sourceId:n.sourceId,message:n.message}),L("error",{source:n.source,message:n.message}),k("error",{source:n.source,message:n.message});},onErrorRecovery:(n,m)=>{d("error.recovery",{source:n.source,sourceId:n.sourceId,strategy:m}),k("error.recovery",{source:n.source,strategy:m});},onTraceComplete:n=>{d("trace.complete",{id:n.id,status:n.status,facts:n.factChanges.length,constraints:n.constraintsHit.length,requirements:n.requirementsAdded.length,resolvers:n.resolversStarted.length,effects:n.effectsRun.length}),k("trace.complete",{id:n.id});},onDefinitionRegister:(n,m)=>{d("definition.register",{type:n,id:m}),L("definition.register",{type:n,id:m}),k("definition.register",{type:n,id:m});},onDefinitionAssign:(n,m)=>{d("definition.assign",{type:n,id:m}),L("definition.assign",{type:n,id:m}),k("definition.assign",{type:n,id:m});},onDefinitionUnregister:(n,m)=>{d("definition.unregister",{type:n,id:m}),L("definition.unregister",{type:n,id:m}),k("definition.unregister",{type:n,id:m}),n==="constraint"&&y&&(M.add(m),u.delete(m),A(E));},onDefinitionCall:(n,m,v)=>{d("definition.call",{type:n,id:m,props:v}),L("definition.call",{type:n,id:m,props:v}),k("definition.call",{type:n,id:m,props:v});}}}var tt="directive-devtools-event",et=new Set(["__proto__","constructor","prototype"]),pt=Math.random().toString(36).slice(2,8);function gt(){if(typeof window<"u"){let e=`__DIRECTIVE_BRIDGE_ID_${pt}__`,s=window,o=s[e]??0;return s[e]=o+1,o+1}return 1}function ft(e){let s=false;for(let r of et)if(r in e){s=true;break}if(!s)return e;let o=Object.create(null);for(let[r,a]of Object.entries(e))et.has(r)||(o[r]=a);return o}function bt(e){if(!(typeof window>"u"))try{let s=ft(e),o={id:gt(),timestamp:Date.now(),snapshotId:null,...s};window.dispatchEvent(new CustomEvent(tt,{detail:o}));}catch{}}function yt(e){let{storage:s,key:o,include:r,exclude:a=[],debounce:p=100,onRestore:l,onSave:t,onError:i}=e,c=null,d=null,y=new Set,I=g=>a.includes(g)?false:r?r.includes(g):true,N=()=>{try{let g=s.getItem(o);if(!g)return null;let f=JSON.parse(g);return typeof f!="object"||f===null?null:chunk4MNQDXH7_cjs.f(f)?f:(i?.(new Error("Potential prototype pollution detected in stored data")),null)}catch(g){return i?.(g instanceof Error?g:new Error(String(g))),null}},R=()=>{if(d)try{let g={};for(let f of y)I(f)&&(g[f]=d.facts[f]);s.setItem(o,JSON.stringify(g)),t?.(g);}catch(g){i?.(g instanceof Error?g:new Error(String(g)));}},w=()=>{c&&clearTimeout(c),c=setTimeout(R,p);};return {name:"persistence",onInit:g=>{d=g;let f=N();f&&(d.facts.$store.batch(()=>{for(let[C,T]of Object.entries(f))I(C)&&(d.facts[C]=T,y.add(C));}),l?.(f));},onDestroy:()=>{c&&clearTimeout(c),R();},onFactSet:g=>{y.add(g),I(g)&&w();},onFactDelete:g=>{y.delete(g),I(g)&&w();},onFactsBatch:g=>{let f=false;for(let C of g)C.type==="set"?y.add(C.key):y.delete(C.key),I(C.key)&&(f=true);f&&w();}}}function vt(e={}){let{onSlowConstraint:s,onSlowResolver:o,slowConstraintThresholdMs:r=16,slowResolverThresholdMs:a=1e3}=e,p=new Map,l=new Map,t=new Map,i={runs:0,totalDurationMs:0,avgDurationMs:0,maxDurationMs:0},c=0,d=0,y=0;function I(g){let f=p.get(g);return f||(f={evaluations:0,totalDurationMs:0,avgDurationMs:0,maxDurationMs:0,lastEvaluatedAt:0},p.set(g,f)),f}function N(g){let f=l.get(g);return f||(f={starts:0,completions:0,errors:0,retries:0,cancellations:0,totalDurationMs:0,avgDurationMs:0,maxDurationMs:0,lastCompletedAt:0},l.set(g,f)),f}function R(g){let f=t.get(g);return f||(f={runs:0,errors:0,lastRunAt:0},t.set(g,f)),f}let w={name:"performance",onStart(){c=Date.now();},onConstraintEvaluate(g,f){let C=performance.now(),T=I(g);if(T.evaluations++,T.lastEvaluatedAt=Date.now(),y>0){let P=C-y;T.totalDurationMs+=P;let F=T.evaluations;T.avgDurationMs=T.totalDurationMs/F,P>T.maxDurationMs&&(T.maxDurationMs=P),P>r&&s?.(g,P);}y=C;},onResolverStart(g,f){let C=N(g);C.starts++;},onResolverComplete(g,f,C){let T=N(g);T.completions++,T.totalDurationMs+=C,T.avgDurationMs=T.totalDurationMs/T.completions,C>T.maxDurationMs&&(T.maxDurationMs=C),T.lastCompletedAt=Date.now(),C>a&&o?.(g,C);},onResolverError(g,f,C){N(g).errors++;},onResolverRetry(g,f,C){N(g).retries++;},onResolverCancel(g,f){N(g).cancellations++;},onEffectRun(g){let f=R(g);f.runs++,f.lastRunAt=Date.now();},onEffectError(g,f){R(g).errors++;},onReconcileStart(){d=performance.now(),y=0;},onReconcileEnd(){let g=performance.now()-d;i.runs++,i.totalDurationMs+=g,i.avgDurationMs=i.totalDurationMs/i.runs,g>i.maxDurationMs&&(i.maxDurationMs=g);},onDestroy(){w.reset();},getSnapshot(){let g={};for(let[T,P]of p)g[T]={...P};let f={};for(let[T,P]of l)f[T]={...P};let C={};for(let[T,P]of t)C[T]={...P};return {constraints:g,resolvers:f,effects:C,reconcile:{...i},uptime:c?Date.now()-c:0}},reset(){p.clear(),l.clear(),t.clear(),i.runs=0,i.totalDurationMs=0,i.avgDurationMs=0,i.maxDurationMs=0,y=0;}};return w}function ve(){return globalThis.crypto?.randomUUID?.()??`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,11)}`}function Te(e,s){if(e.length===0)return 0;let o=[...e].sort((a,p)=>a-p),r=Math.ceil(s/100*o.length)-1;return o[Math.max(0,r)]??0}function ht(e={}){let{serviceName:s="directive-agents",metrics:o={},tracing:r={},alerts:a=[],summaryMetrics:p={},events:l={}}=e,t={requests:p.requests??"agent.requests",errors:p.errors??"agent.errors",latency:p.latency??"agent.latency",tokens:p.tokens??"agent.tokens",cost:p.cost??"agent.cost"},{enabled:i=true,exportInterval:c,exporter:d,maxDataPoints:y=1e3}=o,{enabled:I=true,sampleRate:N=1,maxSpans:R=1e3,exporter:w}=r,g=Date.now(),f=new Map,C=new Map,T=[],P=[],F=new Map,O=new Map,Y;c&&(d||w)&&(Y=setInterval(async()=>{try{if(d&&i&&await d(Array.from(O.values())),w&&I){let h=T.splice(0,100);h.length>0&&await w(h);}}catch(h){console.error("[Directive Observability] Export error:",h);}},c));function $(h){if(!i)return;let x=`${h.name}:${JSON.stringify(Object.fromEntries(Object.entries(h.labels).sort()))}`,E=f.get(x);E||(E=[],f.set(x,E)),E.push(h),E.length>y&&E.shift(),V(h.name,E),l.onMetricRecorded?.(h),_(h.name);}function V(h,x){if(x.length===0)return;let E=x.map(S=>S.value),q=E.reduce((S,A)=>S+A,0),j=x[0],u=E[E.length-1],M={name:h,type:j.type,count:x.length,sum:q,min:Math.min(...E),max:Math.max(...E),avg:q/x.length,lastValue:u,lastUpdated:Date.now()};O.set(h,M);}function _(h){for(let x of a){if(x.metric!==h)continue;let E=O.get(h);if(!E)continue;let q=`${x.metric}:${x.threshold}`,j=F.get(q),u=x.cooldownMs??6e4;if(j&&Date.now()-j<u)continue;let M=x.operator??">",S=E.lastValue,A=x.threshold,W=false;switch(M){case ">":W=S>A;break;case "<":W=S<A;break;case ">=":W=S>=A;break;case "<=":W=S<=A;break;case "==":W=S===A;break}if(W){let k={alertId:ve(),metric:h,currentValue:S,threshold:A,operator:M,action:x.action,timestamp:Date.now(),message:`Alert: ${h} ${M} ${A} (current: ${S})`};switch(P.push(k),P.length>1e3&&P.splice(0,P.length-1e3),F.set(q,Date.now()),l.onAlert?.(k),x.action){case "log":console.log(`[Observability] ${k.message}`);break;case "warn":console.warn(`[Observability] ${k.message}`);break;case "alert":console.error(`[Observability ALERT] ${k.message}`);break;case "callback":x.callback?.(E,A);break}}}}function H(h){let x=[];for(let[E,q]of f)if(E.startsWith(`${h}:`))for(let j of q)x.push(j.value);return x.length===0?{}:{p50:Te(x,50),p90:Te(x,90),p99:Te(x,99)}}return {incrementCounter(h,x={},E=1){$({name:h,type:"counter",value:E,labels:x,timestamp:Date.now()});},setGauge(h,x,E={}){$({name:h,type:"gauge",value:x,labels:E,timestamp:Date.now()});},observeHistogram(h,x,E={}){$({name:h,type:"histogram",value:x,labels:E,timestamp:Date.now()});},startSpan(h,x){if(Math.random()>N)return {traceId:"sampled-out",spanId:"sampled-out",operationName:h,serviceName:s,startTime:Date.now(),status:"ok",tags:{},logs:[]};let E={traceId:x?C.get(x)?.traceId??ve():ve(),spanId:ve(),parentSpanId:x,operationName:h,serviceName:s,startTime:Date.now(),status:"ok",tags:{},logs:[]};return I&&(C.set(E.spanId,E),l.onSpanStart?.(E)),E},endSpan(h,x="ok"){if(h==="sampled-out")return;let E=C.get(h);if(E){for(E.endTime=Date.now(),E.duration=E.endTime-E.startTime,E.status=x,C.delete(h),T.push(E);T.length>R;)T.shift();$({name:`${E.operationName}.latency`,type:"histogram",value:E.duration,labels:{},timestamp:Date.now()}),x==="error"&&$({name:`${E.operationName}.errors`,type:"counter",value:1,labels:{},timestamp:Date.now()}),l.onSpanEnd?.(E);}},addSpanLog(h,x,E="info"){if(h==="sampled-out")return;let q=C.get(h);q&&q.logs.push({timestamp:Date.now(),message:x,level:E});},addSpanTag(h,x,E){if(h==="sampled-out")return;let q=C.get(h);q&&(q.tags[x]=E);},getDashboard(){let h=O.get(t.requests),x=O.get(t.errors),E=O.get(t.latency),q=O.get(t.tokens),j=O.get(t.cost),u=h?.sum??0,M=x?.sum??0,S=u>0?M/u:0,A=E?H(t.latency):{};return {service:{name:s,uptime:Date.now()-g,startTime:g},metrics:Object.fromEntries(O),traces:[...T].slice(-100),alerts:[...P].slice(-50),summary:{totalRequests:u,totalErrors:M,errorRate:S,avgLatency:E?.avg??0,p99Latency:A.p99??0,activeSpans:C.size,totalTokens:q?.sum??0,totalCost:j?.sum??0}}},getMetric(h){let x=O.get(h);if(!x)return;let E=H(h);return {...x,...E}},getTraces(h=100){return [...T].slice(-h)},getAlerts(){return [...P]},export(){return {metrics:Array.from(O.values()),traces:[...T],alerts:[...P]}},clear(){f.clear(),O.clear(),C.clear(),T.length=0,P.length=0,F.clear();},async destroy(){Y&&(clearInterval(Y),Y=void 0);try{d&&i&&O.size>0&&await d(Array.from(O.values())),w&&I&&T.length>0&&await w([...T]);}catch(h){console.error("[Directive Observability] Error flushing data during destroy:",h);}f.clear(),O.clear(),C.clear(),T.length=0,P.length=0,F.clear();},getHealthStatus(){let h=O.get(t.requests),x=O.get(t.errors),E=h?.sum??0,q=x?.sum??0,j=E>0?q/E:0,u=P.filter(M=>Date.now()-M.timestamp<3e5).length;return {healthy:j<.1&&u===0,uptime:Date.now()-g,errorRate:j,activeAlerts:u}}}}function St(e){return {trackRun(s,o){let r={agent:s};e.incrementCounter("agent.requests",r),o.success||e.incrementCounter("agent.errors",r),e.observeHistogram("agent.latency",o.latencyMs,r),o.inputTokens!==void 0&&(e.incrementCounter("agent.tokens.input",r,o.inputTokens),e.incrementCounter("agent.tokens",r,o.inputTokens)),o.outputTokens!==void 0&&(e.incrementCounter("agent.tokens.output",r,o.outputTokens),e.incrementCounter("agent.tokens",r,o.outputTokens)),o.cost!==void 0&&e.incrementCounter("agent.cost",r,o.cost),o.toolCalls!==void 0&&e.incrementCounter("agent.tool_calls",r,o.toolCalls);},trackGuardrail(s,o){let r={guardrail:s};e.incrementCounter("guardrail.checks",r),o.passed||e.incrementCounter("guardrail.failures",r),o.blocked&&e.incrementCounter("guardrail.blocks",r),e.observeHistogram("guardrail.latency",o.latencyMs,r);},trackApproval(s,o){let r={tool:s};e.incrementCounter("approval.requests",r),o.approved?e.incrementCounter("approval.approved",r):e.incrementCounter("approval.rejected",r),o.timedOut&&e.incrementCounter("approval.timeouts",r),e.observeHistogram("approval.wait_time",o.waitTimeMs,r);},trackHandoff(s,o,r){e.incrementCounter("handoff.count",{from:s,to:o}),e.observeHistogram("handoff.latency",r);}}}function xt(e){let s=[{key:"service.name",value:{stringValue:e.serviceName??"directive-agents"}}];if(e.serviceVersion&&s.push({key:"service.version",value:{stringValue:e.serviceVersion}}),e.resourceAttributes)for(let[o,r]of Object.entries(e.resourceAttributes))s.push({key:o,value:{stringValue:r}});return {attributes:s}}function ne(e){return `${BigInt(e)*BigInt(1e6)}`}function Et(e){switch(e){case "counter":return "sum";case "gauge":return "gauge";case "histogram":return "histogram";default:return "gauge"}}function Ct(e,s,o){let r=e.map(a=>{let p=a.lastUpdated-6e4,l=[{asInt:a.type==="counter"?a.sum:void 0,asDouble:a.type!=="counter"?a.lastValue:void 0,timeUnixNano:ne(a.lastUpdated),startTimeUnixNano:ne(p),attributes:[]}],t=Et(a.type),i={name:a.name,unit:""};return t==="sum"?i.sum={dataPoints:l,aggregationTemporality:2,isMonotonic:true}:t==="histogram"?i.histogram={dataPoints:[{count:a.count,sum:a.sum,min:a.min,max:a.max,timeUnixNano:ne(a.lastUpdated),startTimeUnixNano:ne(p),attributes:[]}],aggregationTemporality:2}:i.gauge={dataPoints:l},i});return {resourceMetrics:[{resource:s,scopeMetrics:[{scope:{name:"directive",version:o},metrics:r}]}]}}function wt(e,s,o){let r=e.map(a=>{let p=a.logs.map(i=>({timeUnixNano:ne(i.timestamp),name:i.level,attributes:[{key:"message",value:{stringValue:i.message}},{key:"level",value:{stringValue:i.level}}]})),l=Object.entries(a.tags).map(([i,c])=>({key:i,value:typeof c=="string"?{stringValue:c}:typeof c=="number"?{intValue:`${c}`}:{boolValue:c}})),t=a.status==="ok"?1:a.status==="error"?2:0;return {traceId:a.traceId.replace(/-/g,"").padEnd(32,"0").slice(0,32),spanId:a.spanId.replace(/-/g,"").padEnd(16,"0").slice(0,16),parentSpanId:a.parentSpanId?a.parentSpanId.replace(/-/g,"").padEnd(16,"0").slice(0,16):void 0,name:a.operationName,kind:1,startTimeUnixNano:ne(a.startTime),endTimeUnixNano:a.endTime?ne(a.endTime):ne(a.startTime),attributes:l,events:p,status:{code:t}}});return {resourceSpans:[{resource:s,scopeSpans:[{scope:{name:"directive",version:o},spans:r}]}]}}function Mt(e){let{endpoint:s,headers:o={},scopeVersion:r="0.1.0",timeoutMs:a=1e4,fetch:p=globalThis.fetch,onError:l}=e;try{let c=new URL(s);if(c.protocol!=="http:"&&c.protocol!=="https:")throw new Error("[Directive] Only http: and https: protocols are supported")}catch(c){throw new Error(`[Directive OTLP] Invalid endpoint URL "${s}": ${c instanceof Error?c.message:String(c)}`)}if(/\/v1\/(metrics|traces)/.test(s)&&console.warn(`[Directive OTLP] Endpoint "${s}" already contains a /v1/metrics or /v1/traces path. The exporter will append /v1/metrics or /v1/traces automatically. Use the base URL (e.g., "http://localhost:4318") instead.`),a<=0||!Number.isFinite(a))throw new Error(`[Directive OTLP] timeoutMs must be > 0, got ${a}`);let t=xt(e);async function i(c,d,y){let I=`${s.replace(/\/$/,"")}${c}`,N=new AbortController,R=setTimeout(()=>N.abort(),a);try{let w=await p(I,{method:"POST",headers:{"Content-Type":"application/json",...o},body:JSON.stringify(d),signal:N.signal});if(!w.ok)throw new Error(`[Directive] OTLP export failed: ${w.status} ${w.statusText}`)}catch(w){let g=w instanceof Error?w:new Error(String(w));l?l(g,y):console.error(`[Directive OTLP] Export ${y} error:`,g.message);}finally{clearTimeout(R);}}return {async exportMetrics(c){if(c.length===0)return;let d=Ct(c,t,r);await i("/v1/metrics",d,"metrics");},async exportTraces(c){if(c.length===0)return;let d=wt(c,t,r);await i("/v1/traces",d,"traces");}}}var me=class extends Error{code="CIRCUIT_OPEN";retryAfterMs;state;constructor(s,o,r="OPEN",a){let p=a?`[Directive CircuitBreaker] Circuit "${s}" is ${r}. ${a}`:`[Directive CircuitBreaker] Circuit "${s}" is ${r}. Request rejected. Try again in ${Math.ceil(o/1e3)}s.`;super(p),this.name="CircuitBreakerOpenError",this.retryAfterMs=o,this.state=r;}};function Tt(e={}){let{failureThreshold:s=5,recoveryTimeMs:o=3e4,halfOpenMaxRequests:r=3,failureWindowMs:a=6e4,observability:p,metricPrefix:l="circuit_breaker",name:t="default",isFailure:i=()=>true,onStateChange:c}=e;if(s<1||!Number.isFinite(s))throw new Error(`[Directive CircuitBreaker] failureThreshold must be >= 1, got ${s}`);if(o<=0||!Number.isFinite(o))throw new Error(`[Directive CircuitBreaker] recoveryTimeMs must be > 0, got ${o}`);if(r<1||!Number.isFinite(r))throw new Error(`[Directive CircuitBreaker] halfOpenMaxRequests must be >= 1, got ${r}`);if(a<=0||!Number.isFinite(a))throw new Error(`[Directive CircuitBreaker] failureWindowMs must be > 0, got ${a}`);let d="CLOSED",y=[],I=0,N=0,R=Date.now(),w=0,g=0,f=0,C=0,T=0,P=null,F=null;function O(_){if(d===_)return;let H=d;d=_,R=Date.now(),_==="OPEN"&&(w=Date.now()),_==="HALF_OPEN"&&(I=0,N=0),c?.(H,_),p&&p.incrementCounter(`${l}.state_change`,{name:t,from:H,to:_});}function Y(){let _=Date.now()-a;return y=y.filter(H=>H>_),y.length}function $(){C++,F=Date.now(),p&&p.incrementCounter(`${l}.success`,{name:t}),d==="HALF_OPEN"&&(N++,N>=r&&(O("CLOSED"),y=[]));}function V(_){if(!i(_)){$();return}f++,P=Date.now(),y.push(Date.now());let H=s*2;if(y.length>H&&(y=y.slice(-H)),p&&p.incrementCounter(`${l}.failure`,{name:t}),d==="HALF_OPEN"){O("OPEN");return}d==="CLOSED"&&Y()>=s&&O("OPEN");}return {async execute(_){if(g++,p&&p.incrementCounter(`${l}.requests`,{name:t}),d==="OPEN")if(Date.now()-w>=o)O("HALF_OPEN");else throw T++,p&&p.incrementCounter(`${l}.rejected`,{name:t}),new me(t,o-(Date.now()-w));if(d==="HALF_OPEN"){if(I>=r)throw T++,new me(t,o,"HALF_OPEN",`Max trial requests (${r}) reached.`);I++;}let H=Date.now();try{let h=await _();return $(),p&&p.observeHistogram(`${l}.latency`,Date.now()-H,{name:t}),h}catch(h){let x=h instanceof Error?h:new Error(String(h));throw V(x),p&&p.observeHistogram(`${l}.latency`,Date.now()-H,{name:t}),h}},getState(){return d==="OPEN"&&Date.now()-w>=o&&O("HALF_OPEN"),d},getStats(){return {state:this.getState(),totalRequests:g,totalFailures:f,totalSuccesses:C,totalRejected:T,recentFailures:Y(),lastFailureTime:P,lastSuccessTime:F,lastStateChange:R}},forceState(_){O(_);},reset(){let _=d;d="CLOSED",y=[],I=0,N=0,R=Date.now(),w=0,g=0,f=0,C=0,T=0,P=null,F=null,_!=="CLOSED"&&c?.(_,"CLOSED");},isAllowed(){return d==="CLOSED"?true:d==="OPEN"?Date.now()-w>=o:I<r}}}
Object.defineProperty(exports,"createAuditLedger",{enumerable:true,get:function(){return chunkQ2VZPURY_cjs.b}});Object.defineProperty(exports,"memorySink",{enumerable:true,get:function(){return chunkQ2VZPURY_cjs.a}});exports.CircuitBreakerOpenError=me;exports.DEVTOOLS_EVENT_NAME=tt;exports.createAgentMetrics=St;exports.createCircuitBreaker=Tt;exports.createOTLPExporter=Mt;exports.createObservability=ht;exports.devtoolsPlugin=mt;exports.emitDevToolsEvent=bt;exports.loggingPlugin=st;exports.performancePlugin=vt;exports.persistencePlugin=yt;//# sourceMappingURL=index.cjs.map
//# sourceMappingURL=index.cjs.map

@@ -1,2 +0,2 @@

export { A as AuditEntry, a as AuditEntryKind, b as AuditLedger, c as AuditLedgerOptions, d as AuditLedgerSink, Q as QueryFilter, e as createAuditLedger, m as memorySink } from '../audit-ledger-Dc6hAXam.cjs';
export { A as AuditEntry, a as AuditEntryKind, b as AuditLedger, c as AuditLedgerOptions, d as AuditLedgerSink, Q as QueryFilter, e as createAuditLedger, m as memorySink } from '../index-DErb8sV3.cjs';
import { M as ModuleSchema, P as Plugin, aa as System } from '../plugins-BIzXaYbg.cjs';

@@ -3,0 +3,0 @@

@@ -1,2 +0,2 @@

export { A as AuditEntry, a as AuditEntryKind, b as AuditLedger, c as AuditLedgerOptions, d as AuditLedgerSink, Q as QueryFilter, e as createAuditLedger, m as memorySink } from '../audit-ledger-dxvslGi3.js';
export { A as AuditEntry, a as AuditEntryKind, b as AuditLedger, c as AuditLedgerOptions, d as AuditLedgerSink, Q as QueryFilter, e as createAuditLedger, m as memorySink } from '../index-C8M6pj9H.js';
import { M as ModuleSchema, P as Plugin, aa as System } from '../plugins-BIzXaYbg.js';

@@ -3,0 +3,0 @@

@@ -1,3 +0,3 @@

export{b as createAuditLedger,a as memorySink}from'../chunk-PA6VC32N.js';import'../chunk-2FF6QGOA.js';import {f}from'../chunk-PXRV64PA.js';var Oe={debug:0,info:1,warn:2,error:3};function st(e={}){let{level:s="info",filter:o=()=>true,logger:r=console,prefix:a="[Directive]"}=e,p=Oe[s],l=(t,i,...c)=>{Oe[t]<p||o(i)&&r[t](`${a} ${i}`,...c);};return {name:"logging",onInit:()=>l("debug","init"),onStart:()=>l("info","start"),onStop:()=>l("info","stop"),onDestroy:()=>l("debug","destroy"),onFactSet:(t,i,c)=>{l("debug","fact.set",{key:t,value:i,prev:c});},onFactDelete:(t,i)=>{l("debug","fact.delete",{key:t,prev:i});},onFactsBatch:t=>{l("debug","facts.batch",{count:t.length,changes:t});},onDerivationCompute:(t,i,c)=>{l("debug","derivation.compute",{id:t,value:i,deps:c});},onDerivationInvalidate:t=>{l("debug","derivation.invalidate",{id:t});},onReconcileStart:()=>{l("debug","reconcile.start");},onReconcileEnd:t=>{l("debug","reconcile.end",{unmet:t.unmet.length,inflight:t.inflight.length,completed:t.completed.length,canceled:t.canceled.length});},onConstraintEvaluate:(t,i,c)=>{if(c){let d=c.filter(y=>y.pass).length;l("debug","constraint.evaluate",{id:t,active:i,clauses:{total:c.length,passed:d}});return}l("debug","constraint.evaluate",{id:t,active:i});},onConstraintError:(t,i)=>{l("error","constraint.error",{id:t,error:i});},onRequirementCreated:t=>{l("debug","requirement.created",{id:t.id,type:t.requirement.type});},onRequirementMet:(t,i)=>{l("info","requirement.met",{id:t.id,byResolver:i});},onRequirementCanceled:t=>{l("debug","requirement.canceled",{id:t.id});},onResolverStart:(t,i)=>{l("debug","resolver.start",{resolver:t,requirementId:i.id});},onResolverComplete:(t,i,c)=>{l("info","resolver.complete",{resolver:t,requirementId:i.id,duration:c});},onResolverError:(t,i,c)=>{l("error","resolver.error",{resolver:t,requirementId:i.id,error:c});},onResolverRetry:(t,i,c)=>{l("warn","resolver.retry",{resolver:t,requirementId:i.id,attempt:c});},onResolverCancel:(t,i)=>{l("debug","resolver.cancel",{resolver:t,requirementId:i.id});},onResolverWriteRejected:t=>{l("warn","resolver.write.rejected",t.kind==="summary"?{kind:t.kind,resolver:t.resolver,requirementId:t.req.id,reason:t.reason,dropped:t.dropped}:{kind:t.kind,resolver:t.resolver,requirementId:t.req.id,reason:t.reason,fact:t.fact,expected:t.expected,actual:t.actual});},onEffectRun:t=>{l("debug","effect.run",{id:t});},onEffectError:(t,i)=>{l("error","effect.error",{id:t,error:i});},onSnapshot:t=>{l("debug","timetravel.snapshot",{id:t.id,trigger:t.trigger});},onHistoryNavigate:(t,i)=>{l("info","timetravel.jump",{from:t,to:i});},onError:t=>{l("error","error",{source:t.source,sourceId:t.sourceId,message:t.message});},onErrorRecovery:(t,i)=>{l("warn","error.recovery",{source:t.source,sourceId:t.sourceId,strategy:i});},onDefinitionRegister:(t,i)=>{l("info","definition.register",{type:t,id:i});},onDefinitionAssign:(t,i)=>{l("info","definition.assign",{type:t,id:i});},onDefinitionUnregister:(t,i)=>{l("info","definition.unregister",{type:t,id:i});},onDefinitionCall:(t,i,c)=>{l("debug","definition.call",{type:t,id:i,props:c});},onTraceComplete:t=>{l("debug","trace.complete",{id:t.id,status:t.status,duration:t.duration,factChanges:t.factChanges.length,derivationsRecomputed:t.derivationsRecomputed.length,constraintsHit:t.constraintsHit.length,resolversStarted:t.resolversStarted.length,effectsRun:t.effectsRun.length});}}}var ue=class{constructor(s){this.capacity=s;this.buf=new Array(s);}buf;head=0;_size=0;get size(){return this._size}push(s){this.buf[this.head]=s,this.head=(this.head+1)%this.capacity,this._size<this.capacity&&this._size++;}toArray(){return this._size===0?[]:this._size<this.capacity?this.buf.slice(0,this._size):[...this.buf.slice(this.head),...this.buf.slice(0,this.head)]}clear(){this.buf=new Array(this.capacity),this.head=0,this._size=0;}};function ge(){try{if(typeof process<"u"&&process.env?.NODE_ENV==="production")return !1}catch{}try{if(typeof import.meta<"u"&&import.meta.env?.MODE==="production")return !1}catch{}return true}function fe(e){try{if(e===void 0)return "undefined";if(e===null)return "null";if(typeof e=="bigint")return String(e)+"n";if(typeof e=="symbol")return String(e);if(typeof e=="object"){let s=JSON.stringify(e,(o,r)=>typeof r=="bigint"?String(r)+"n":typeof r=="symbol"?String(r):r);return s.length>120?s.slice(0,117)+"...":s}return String(e)}catch{return "<error>"}}function ee(e,s){return e.length<=s?e:e.slice(0,s-3)+"..."}function se(e){try{return e.inspect()}catch{return null}}function Le(e){try{return e==null||typeof e!="object"?e:JSON.parse(JSON.stringify(e))}catch{return null}}function Pe(e){return e===void 0?1e3:!Number.isFinite(e)||e<1?(ge()&&console.warn(`[directive:devtools] Invalid maxEvents value (${e}), using default 1000`),1e3):Math.floor(e)}function Ie(){return {reconcileCount:0,reconcileTotalMs:0,resolverStats:new Map,effectRunCount:0,effectErrorCount:0,lastReconcileStartMs:0}}var it=200,ie=340,ae=16,ce=80,he=2,Se=["#8b9aff","#4ade80","#fbbf24","#c084fc","#f472b6","#22d3ee"];function $e(){return {entries:new ue(it),inflight:new Map}}function _e(){return {derivationDeps:new Map,activeConstraints:new Set,recentlyChangedFacts:new Set,recentlyComputedDerivations:new Set,recentlyActiveConstraints:new Set,animationTimer:null}}var Ne=1e4,Be=100;function je(){return {isRecording:false,recordedEvents:[],snapshots:[]}}var He=50,xe=200,b={bg:"#1a1a2e",text:"#e0e0e0",accent:"#8b9aff",muted:"#b0b0d0",border:"#333",rowBorder:"#2a2a4a",green:"#4ade80",yellow:"#fbbf24",red:"#f87171",closeBtn:"#aaa",font:"ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace"},G={nodeW:90,nodeH:16,nodeGap:6,startY:16,colGap:20,fontSize:10,labelMaxChars:11};function Ve(e,s,o,r){let a=false,p={position:"fixed",zIndex:"99999",...s.includes("bottom")?{bottom:"12px"}:{top:"12px"},...s.includes("right")?{right:"12px"}:{left:"12px"}},l=document.createElement("style");l.textContent=`[data-directive-devtools] summary:focus-visible{outline:2px solid ${b.accent};outline-offset:2px;border-radius:2px}[data-directive-devtools] button:focus-visible{outline:2px solid ${b.accent};outline-offset:2px}`,document.head.appendChild(l);let t=document.createElement("button");t.setAttribute("aria-label","Open Directive DevTools"),t.setAttribute("aria-expanded",String(o)),t.title="Ctrl+Shift+D to toggle",Object.assign(t.style,{...p,background:b.bg,color:b.text,border:`1px solid ${b.border}`,borderRadius:"6px",padding:"10px 14px",minWidth:"44px",minHeight:"44px",cursor:"pointer",fontFamily:b.font,fontSize:"12px",display:o?"none":"block"}),t.textContent="Directive";let i=document.createElement("div");i.setAttribute("role","region"),i.setAttribute("aria-label","Directive DevTools"),i.setAttribute("data-directive-devtools",""),i.tabIndex=-1,Object.assign(i.style,{...p,background:b.bg,color:b.text,border:`1px solid ${b.border}`,borderRadius:"8px",padding:"12px",fontFamily:b.font,fontSize:"11px",maxWidth:"min(380px, calc(100vw - 24px))",maxHeight:"min(500px, calc(100vh - 24px))",overflow:"auto",boxShadow:"0 4px 20px rgba(0,0,0,0.5)",display:o?"block":"none"});let c=document.createElement("div");Object.assign(c.style,{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:"8px"});let d=document.createElement("strong");d.style.color=b.accent,d.textContent=e==="default"?"Directive DevTools":`DevTools (${e})`;let y=document.createElement("button");y.setAttribute("aria-label","Close DevTools"),Object.assign(y.style,{background:"none",border:"none",color:b.closeBtn,cursor:"pointer",fontSize:"16px",padding:"8px 12px",minWidth:"44px",minHeight:"44px",lineHeight:"1",display:"flex",alignItems:"center",justifyContent:"center"}),y.textContent="\xD7",c.appendChild(d),c.appendChild(y),i.appendChild(c);let I=document.createElement("div");I.style.marginBottom="6px",I.setAttribute("aria-live","polite");let N=document.createElement("span");N.style.color=b.green,N.textContent="Settled",I.appendChild(N),i.appendChild(I);let R=document.createElement("div");Object.assign(R.style,{display:"none",marginBottom:"8px",padding:"4px 8px",background:"#252545",borderRadius:"4px",alignItems:"center",gap:"6px"});let w=document.createElement("button");Object.assign(w.style,{background:"none",border:`1px solid ${b.border}`,color:b.text,cursor:"pointer",padding:"4px 10px",borderRadius:"3px",fontFamily:b.font,fontSize:"11px",minWidth:"44px",minHeight:"44px"}),w.textContent="\u25C0 Undo",w.disabled=true;let g=document.createElement("button");Object.assign(g.style,{background:"none",border:`1px solid ${b.border}`,color:b.text,cursor:"pointer",padding:"4px 10px",borderRadius:"3px",fontFamily:b.font,fontSize:"11px",minWidth:"44px",minHeight:"44px"}),g.textContent="Redo \u25B6",g.disabled=true;let f=document.createElement("span");f.style.color=b.muted,f.style.fontSize="10px",R.appendChild(w),R.appendChild(g),R.appendChild(f),i.appendChild(R);function C(z,K){let X=document.createElement("details");K&&(X.open=true),X.style.marginBottom="4px";let J=document.createElement("summary");Object.assign(J.style,{cursor:"pointer",color:b.accent,marginBottom:"4px"});let Q=document.createElement("span");J.textContent=`${z} (`,J.appendChild(Q),J.appendChild(document.createTextNode(")")),Q.textContent="0",X.appendChild(J);let te=document.createElement("table");Object.assign(te.style,{width:"100%",borderCollapse:"collapse",fontSize:"11px"});let Re=document.createElement("thead"),De=document.createElement("tr");for(let nt of ["Key","Value"]){let pe=document.createElement("th");pe.scope="col",Object.assign(pe.style,{textAlign:"left",padding:"2px 4px",color:b.accent}),pe.textContent=nt,De.appendChild(pe);}Re.appendChild(De),te.appendChild(Re);let Ae=document.createElement("tbody");return te.appendChild(Ae),X.appendChild(te),{details:X,tbody:Ae,countSpan:Q}}function T(z,K){let X=document.createElement("details");X.style.marginBottom="4px";let J=document.createElement("summary");Object.assign(J.style,{cursor:"pointer",color:K,marginBottom:"4px"});let Q=document.createElement("span");J.textContent=`${z} (`,J.appendChild(Q),J.appendChild(document.createTextNode(")")),Q.textContent="0",X.appendChild(J);let te=document.createElement("ul");return Object.assign(te.style,{margin:"0",paddingLeft:"16px"}),X.appendChild(te),{details:X,list:te,countSpan:Q}}let P=C("Facts",true);i.appendChild(P.details);let F=C("Derivations",false);i.appendChild(F.details);let O=T("Inflight",b.yellow);i.appendChild(O.details);let Y=T("Unmet",b.red);i.appendChild(Y.details);let $=document.createElement("details");$.style.marginBottom="4px";let V=document.createElement("summary");Object.assign(V.style,{cursor:"pointer",color:b.accent,marginBottom:"4px"}),V.textContent="Performance",$.appendChild(V);let _=document.createElement("div");_.style.fontSize="10px",_.style.color=b.muted,_.textContent="No data yet",$.appendChild(_),i.appendChild($);let H=document.createElement("details");H.style.marginBottom="4px";let h=document.createElement("summary");Object.assign(h.style,{cursor:"pointer",color:b.accent,marginBottom:"4px"}),h.textContent="Dependency Graph",H.appendChild(h);let x=document.createElementNS("http://www.w3.org/2000/svg","svg");x.setAttribute("width","100%"),x.setAttribute("height","120"),x.setAttribute("role","img"),x.setAttribute("aria-label","System dependency graph"),x.style.display="block",x.setAttribute("viewBox","0 0 460 120"),x.setAttribute("preserveAspectRatio","xMinYMin meet"),H.appendChild(x),i.appendChild(H);let E=document.createElement("details");E.style.marginBottom="4px";let q=document.createElement("summary");Object.assign(q.style,{cursor:"pointer",color:b.accent,marginBottom:"4px"}),q.textContent="Timeline",E.appendChild(q);let j=document.createElementNS("http://www.w3.org/2000/svg","svg");j.setAttribute("width","100%"),j.setAttribute("height","60"),j.setAttribute("role","img"),j.setAttribute("aria-label","Resolver execution timeline"),j.style.display="block",j.setAttribute("viewBox",`0 0 ${ie} 60`),j.setAttribute("preserveAspectRatio","xMinYMin meet");let u=document.createElementNS("http://www.w3.org/2000/svg","text");u.setAttribute("x",String(ie/2)),u.setAttribute("y","30"),u.setAttribute("text-anchor","middle"),u.setAttribute("fill",b.muted),u.setAttribute("font-size","10"),u.setAttribute("font-family",b.font),u.textContent="No resolver activity yet",j.appendChild(u),E.appendChild(j),i.appendChild(E);let M=(()=>{let z=document.createElement("details");z.style.marginBottom="4px";let K=document.createElement("summary");Object.assign(K.style,{cursor:"pointer",color:b.accent,marginBottom:"4px"});let X=document.createElement("span");X.textContent="0",K.textContent="Constraints (",K.appendChild(X),K.appendChild(document.createTextNode(")")),z.appendChild(K);let J=document.createElement("div");Object.assign(J.style,{fontSize:"11px"});let Q=document.createElement("div");return Q.style.color=b.muted,Q.style.padding="4px",Q.style.fontStyle="italic",Q.textContent="Waiting for first evaluation\u2026",Q.className="dt-constraints-empty",J.appendChild(Q),z.appendChild(J),i.appendChild(z),{details:z,body:J,countSpan:X}})(),S,A,W,k;if(r){let z=document.createElement("details");z.style.marginBottom="4px";let K=document.createElement("summary");Object.assign(K.style,{cursor:"pointer",color:b.accent,marginBottom:"4px"}),W=document.createElement("span"),W.textContent="0",K.textContent="Events (",K.appendChild(W),K.appendChild(document.createTextNode(")")),z.appendChild(K),A=document.createElement("div"),Object.assign(A.style,{maxHeight:"150px",overflow:"auto",fontSize:"10px"}),A.setAttribute("role","log"),A.setAttribute("aria-live","polite"),A.tabIndex=0;let X=document.createElement("div");X.style.color=b.muted,X.style.padding="4px",X.textContent="Waiting for events...",X.className="dt-events-empty",A.appendChild(X),z.appendChild(A),i.appendChild(z),S=z,k=document.createElement("div");}else S=document.createElement("details"),A=document.createElement("div"),W=document.createElement("span"),k=document.createElement("div"),k.style.fontSize="10px",k.style.color=b.muted,k.style.marginTop="4px",k.style.fontStyle="italic",k.textContent="Enable trace: true for event log",i.appendChild(k);let L=document.createElement("div");Object.assign(L.style,{display:"flex",gap:"6px",marginTop:"6px"});let n=document.createElement("button");Object.assign(n.style,{background:"none",border:`1px solid ${b.border}`,color:b.text,cursor:"pointer",padding:"8px 12px",borderRadius:"3px",fontFamily:b.font,fontSize:"10px",minWidth:"44px",minHeight:"44px"}),n.textContent="\u23FA Record";let m=document.createElement("button");Object.assign(m.style,{background:"none",border:`1px solid ${b.border}`,color:b.text,cursor:"pointer",padding:"8px 12px",borderRadius:"3px",fontFamily:b.font,fontSize:"10px",minWidth:"44px",minHeight:"44px"}),m.textContent="\u2913 Export",L.appendChild(n),L.appendChild(m),i.appendChild(L),i.addEventListener("wheel",z=>{let K=i,X=K.scrollTop===0&&z.deltaY<0,J=K.scrollTop+K.clientHeight>=K.scrollHeight&&z.deltaY>0;(X||J)&&z.preventDefault();},{passive:false});let v=o,D=new Set;function B(){v=true,i.style.display="block",t.style.display="none",t.setAttribute("aria-expanded","true"),y.focus();}function U(){v=false,i.style.display="none",t.style.display="block",t.setAttribute("aria-expanded","false"),t.focus();}t.addEventListener("click",B),y.addEventListener("click",U);function Z(z){z.key==="Escape"&&v&&U();}i.addEventListener("keydown",Z);function re(z){z.key==="d"&&z.shiftKey&&(z.ctrlKey||z.metaKey)&&(z.preventDefault(),v?U():B());}document.addEventListener("keydown",re);function oe(){a||(document.body.appendChild(t),document.body.appendChild(i));}document.body?oe():document.addEventListener("DOMContentLoaded",oe,{once:true});function le(){a=true,t.removeEventListener("click",B),y.removeEventListener("click",U),i.removeEventListener("keydown",Z),document.removeEventListener("keydown",re),document.removeEventListener("DOMContentLoaded",oe);for(let z of D)clearTimeout(z);D.clear(),t.remove(),i.remove(),l.remove();}return {refs:{container:i,toggleBtn:t,titleEl:d,statusEl:N,factsBody:P.tbody,factsCount:P.countSpan,derivBody:F.tbody,derivCount:F.countSpan,derivSection:F.details,inflightList:O.list,inflightSection:O.details,inflightCount:O.countSpan,unmetList:Y.list,unmetSection:Y.details,unmetCount:Y.countSpan,perfSection:$,perfBody:_,historySection:R,historyLabel:f,undoBtn:w,redoBtn:g,flowSection:H,flowSvg:x,timelineSection:E,timelineSvg:j,eventsSection:S,eventsList:A,eventsCount:W,traceHint:k,recordBtn:n,exportBtn:m,constraintsSection:M.details,constraintsBody:M.body,constraintsCount:M.countSpan},destroy:le,isOpen:()=>v,flashTimers:D}}function de(e,s,o,r,a,p){let l=fe(r),t=e.get(o);if(t){let i=t.cells;if(i[1]&&(i[1].textContent=l,a&&p)){let c=i[1];c.style.background="rgba(139, 154, 255, 0.25)";let d=setTimeout(()=>{c.style.background="",p.delete(d);},300);p.add(d);}}else {t=document.createElement("tr"),t.style.borderBottom=`1px solid ${b.rowBorder}`;let i=document.createElement("td");Object.assign(i.style,{padding:"2px 4px",color:b.muted}),i.textContent=o;let c=document.createElement("td");c.style.padding="2px 4px",c.textContent=l,t.appendChild(i),t.appendChild(c),s.appendChild(t),e.set(o,t);}}function ze(e,s){let o=e.get(s);o&&(o.remove(),e.delete(s));}function be(e,s,o){if(e.inflightList.replaceChildren(),e.inflightCount.textContent=String(s.length),s.length>0)for(let r of s){let a=document.createElement("li");a.style.fontSize="11px",a.textContent=`${r.resolverId} (${r.id})`,e.inflightList.appendChild(a);}else {let r=document.createElement("li");r.style.fontSize="10px",r.style.color=b.muted,r.textContent="None",e.inflightList.appendChild(r);}if(e.unmetList.replaceChildren(),e.unmetCount.textContent=String(o.length),o.length>0)for(let r of o){let a=document.createElement("li");a.style.fontSize="11px",a.textContent=`${r.requirement.type} from ${r.fromConstraint}`,e.unmetList.appendChild(a);}else {let r=document.createElement("li");r.style.fontSize="10px",r.style.color=b.muted,r.textContent="None",e.unmetList.appendChild(r);}}function ye(e,s,o){let r=s===0&&o===0;e.statusEl.style.color=r?b.green:b.yellow,e.statusEl.textContent=r?"Settled":"Working...",e.toggleBtn.textContent=r?"Directive":"Directive...",e.toggleBtn.setAttribute("aria-label",`Open Directive DevTools${r?"":" (system working)"}`);}function Ee(e,s,o,r){let a=Object.keys(o.derive);if(e.derivCount.textContent=String(a.length),a.length===0){s.clear(),e.derivBody.replaceChildren();let l=document.createElement("tr"),t=document.createElement("td");t.colSpan=2,t.style.color=b.muted,t.style.fontSize="10px",t.textContent="No derivations defined",l.appendChild(t),e.derivBody.appendChild(l);return}let p=new Set(a);for(let[l,t]of s)p.has(l)||(t.remove(),s.delete(l));for(let l of a){let t;try{t=fe(o.read(l));}catch{t="<error>";}de(s,e.derivBody,l,t,true,r);}}function We(e,s,o,r){let a=e.eventsList.querySelector(".dt-events-empty");a&&a.remove();let p=document.createElement("div");Object.assign(p.style,{padding:"2px 4px",borderBottom:`1px solid ${b.rowBorder}`,fontFamily:"inherit"});let l=new Date,t=`${String(l.getHours()).padStart(2,"0")}:${String(l.getMinutes()).padStart(2,"0")}:${String(l.getSeconds()).padStart(2,"0")}.${String(l.getMilliseconds()).padStart(3,"0")}`,i;try{let I=JSON.stringify(o);i=ee(I,60);}catch{i="{}";}let c=document.createElement("span");c.style.color=b.closeBtn,c.textContent=t;let d=document.createElement("span");d.style.color=b.accent,d.textContent=` ${s} `;let y=document.createElement("span");for(y.style.color=b.muted,y.textContent=i,p.appendChild(c),p.appendChild(d),p.appendChild(y),e.eventsList.prepend(p);e.eventsList.childElementCount>He;)e.eventsList.lastElementChild?.remove();e.eventsCount.textContent=String(r);}function Ue(e,s){e.perfBody.replaceChildren();let o=s.reconcileCount>0?(s.reconcileTotalMs/s.reconcileCount).toFixed(1):"\u2014",r=[`Reconciles: ${s.reconcileCount} (avg ${o}ms)`,`Effects: ${s.effectRunCount} run, ${s.effectErrorCount} errors`];for(let a of r){let p=document.createElement("div");p.style.marginBottom="2px",p.textContent=a,e.perfBody.appendChild(p);}if(s.resolverStats.size>0){let a=document.createElement("div");a.style.marginTop="4px",a.style.marginBottom="2px",a.style.color=b.accent,a.textContent="Resolvers:",e.perfBody.appendChild(a);let p=[...s.resolverStats.entries()].sort((l,t)=>t[1].totalMs-l[1].totalMs);for(let[l,t]of p){let i=t.count>0?(t.totalMs/t.count).toFixed(1):"0",c=document.createElement("div");c.style.paddingLeft="8px",c.textContent=`${l}: ${t.count}x, avg ${i}ms${t.errors>0?`, ${t.errors} err`:""}`,t.errors>0&&(c.style.color=b.red),e.perfBody.appendChild(c);}}}function Ce(e,s){let o=s.history;if(!o){e.historySection.style.display="none";return}e.historySection.style.display="flex";let r=o.currentIndex,a=o.snapshots.length;e.historyLabel.textContent=a>0?`${r+1} / ${a}`:"0 snapshots";let p=r>0,l=r<a-1;e.undoBtn.disabled=!p,e.undoBtn.style.opacity=p?"1":"0.4",e.redoBtn.disabled=!l,e.redoBtn.style.opacity=l?"1":"0.4";}function Ge(e,s){e.undoBtn.addEventListener("click",()=>{s.history&&s.history.currentIndex>0&&s.history.goBack(1);}),e.redoBtn.addEventListener("click",()=>{s.history&&s.history.currentIndex<s.history.snapshots.length-1&&s.history.goForward(1);});}var qe=Object.assign(Object.create(null),{$eq:"=",$ne:"\u2260",$gt:">",$gte:"\u2265",$lt:"<",$lte:"\u2264",$in:"\u2208",$nin:"\u2209",$exists:"exists",$between:"in",$startsWith:"starts with",$endsWith:"ends with",$contains:"contains",$matches:"matches",$changed:"changed"});function at(e){return Object.hasOwn(qe,e)?qe[e]:e}function Fe(e){return e instanceof RegExp?ee(String(e),40):fe(e)}var ct=new Set(["$all","$any","$not"]);function Ye(e){let s=document.createElement("li"),o=e.pass?"\u2713":"\u2717";if(s.style.color=e.pass?b.green:b.red,s.style.listStyle="none",ct.has(e.op)){let r=e.path?` @ ${e.path}`:"";if(s.textContent=`${o} ${e.op}${r}`,e.children&&e.children.length>0){let a=document.createElement("ul");Object.assign(a.style,{margin:"0",paddingLeft:"14px",listStyle:"none"});for(let p of e.children)a.appendChild(Ye(p));s.appendChild(a);}}else {let r=at(e.op),a=Fe(e.expected);if(e.pass)s.textContent=`${o} ${e.path} ${r} ${a}`;else {let p=Fe(e.actual);s.textContent=`${o} ${e.path} ${r} ${a} (actual: ${p})`;}}return s}function Xe(e,s,o){let r=s.get(o);if(r&&(r.remove(),s.delete(o),e.constraintsCount.textContent=String(s.size)),s.size===0&&!e.constraintsBody.querySelector(".dt-constraints-empty")){let a=document.createElement("div");a.style.color=b.muted,a.style.padding="4px",a.style.fontStyle="italic",a.textContent="Waiting for first evaluation\u2026",a.className="dt-constraints-empty",e.constraintsBody.appendChild(a);}}function Ke(e,s){let o=e.constraintsBody.querySelector(".dt-constraints-empty");o&&(o.textContent=s?"Waiting for first evaluation\u2026":"This system has no constraints");}function Je(e,s,o,r,a,p){let l=e.constraintsBody.querySelector(".dt-constraints-empty");l&&l.remove();let t=s.get(o);t||(t=document.createElement("div"),Object.assign(t.style,{marginBottom:"6px",paddingBottom:"4px",borderBottom:`1px solid ${b.rowBorder}`}),s.set(o,t),e.constraintsBody.appendChild(t),e.constraintsCount.textContent=String(s.size)),t.replaceChildren();let i=document.createElement("div");Object.assign(i.style,{fontWeight:"bold",color:r?b.green:b.muted});let c=r?"\u2713":"\u2717";if(i.textContent=p?`${c} ${o} (${p})`:`${c} ${o}`,t.appendChild(i),a&&a.length>0){let d=document.createElement("ul");Object.assign(d.style,{margin:"2px 0 0 0",paddingLeft:"14px",listStyle:"none"});for(let y of a)d.appendChild(Ye(y));t.appendChild(d);}else if(!a){let d=document.createElement("div");Object.assign(d.style,{color:b.muted,fontSize:"10px",fontStyle:"italic",paddingLeft:"14px"}),d.textContent="function-form when (no clause tree)",t.appendChild(d);}}var we=new WeakMap;function lt(e,s,o,r,a,p){return [e.join(","),s.join(","),o.map(l=>`${l.id}:${l.active}`).join(","),[...r.entries()].map(([l,t])=>`${l}:${t.status}:${t.type}`).join(","),a.join(","),p.join(",")].join("|")}function ut(e,s,o,r,a){for(let p of o){let l=e.nodes.get(`0:${p}`);if(!l)continue;let t=s.recentlyChangedFacts.has(p);l.rect.setAttribute("fill",t?b.text+"33":"none"),l.rect.setAttribute("stroke-width",t?"2":"1");}for(let p of r){let l=e.nodes.get(`1:${p}`);if(!l)continue;let t=s.recentlyComputedDerivations.has(p);l.rect.setAttribute("fill",t?b.accent+"33":"none"),l.rect.setAttribute("stroke-width",t?"2":"1");}for(let p of a){let l=e.nodes.get(`2:${p}`);if(!l)continue;let t=s.recentlyActiveConstraints.has(p),i=l.rect.getAttribute("stroke")??b.muted;l.rect.setAttribute("fill",t?i+"33":"none"),l.rect.setAttribute("stroke-width",t?"2":"1");}}function Me(e,s,o){let r=se(s);if(!r)return;let a;try{a=Object.keys(s.facts.$store.toObject());}catch{a=[];}let p=Object.keys(s.derive),l=r.constraints,t=r.unmet,i=r.inflight,c=Object.keys(r.resolvers),d=new Map;for(let u of t)d.set(u.id,{type:u.requirement.type,fromConstraint:u.fromConstraint,status:"unmet"});for(let u of i)d.set(u.id,{type:u.resolverId,fromConstraint:"",status:"inflight"});if(a.length===0&&p.length===0&&l.length===0&&c.length===0){we.delete(e.flowSvg),e.flowSvg.replaceChildren(),e.flowSvg.setAttribute("viewBox","0 0 460 40");let u=document.createElementNS("http://www.w3.org/2000/svg","text");u.setAttribute("x","230"),u.setAttribute("y","24"),u.setAttribute("text-anchor","middle"),u.setAttribute("fill",b.muted),u.setAttribute("font-size","10"),u.setAttribute("font-family",b.font),u.textContent="No system topology",e.flowSvg.appendChild(u);return}let y=i.map(u=>u.resolverId).sort(),I=lt(a,p,l,d,c,y),N=we.get(e.flowSvg);if(N&&N.fingerprint===I){ut(N,o,a,p,l.map(u=>u.id));return}let R=G.nodeW+G.colGap,w=[5,5+R,5+R*2,5+R*3,5+R*4],g=w[4]+G.nodeW+5;function f(u){let M=G.startY+12;return u.map(S=>{let A={...S,y:M};return M+=G.nodeH+G.nodeGap,A})}let C=f(a.map(u=>{let M=r.facts.find(S=>S.key===u);return {id:u,label:ee(M?.meta?.label??u,G.labelMaxChars)}})),T=f(p.map(u=>{let M=r.derivations.find(S=>S.id===u);return {id:u,label:ee(M?.meta?.label??u,G.labelMaxChars)}})),P=f(l.map(u=>({id:u.id,label:ee(u.meta?.label??u.id,G.labelMaxChars),active:u.active,priority:u.priority}))),F=f([...d.entries()].map(([u,M])=>({id:u,type:M.type,fromConstraint:M.fromConstraint,status:M.status}))),O=f(c.map(u=>{let M=r.resolverDefs.find(S=>S.id===u);return {id:u,label:ee(M?.meta?.label??u,G.labelMaxChars)}})),Y=Math.max(C.length,T.length,P.length,F.length,O.length,1),$=G.startY+12+Y*(G.nodeH+G.nodeGap)+8;e.flowSvg.replaceChildren(),e.flowSvg.setAttribute("viewBox",`0 0 ${g} ${$}`),e.flowSvg.setAttribute("aria-label",`Dependency graph: ${a.length} facts, ${p.length} derivations, ${l.length} constraints, ${d.size} requirements, ${c.length} resolvers`);let V=["Facts","Derivations","Constraints","Reqs","Resolvers"];for(let[u,M]of V.entries()){let S=document.createElementNS("http://www.w3.org/2000/svg","text");S.setAttribute("x",String(w[u]??0)),S.setAttribute("y","10"),S.setAttribute("fill",b.accent),S.setAttribute("font-size",String(G.fontSize)),S.setAttribute("font-family",b.font),S.textContent=M,e.flowSvg.appendChild(S);}let _={fingerprint:I,nodes:new Map};function H(u,M,S,A,W,k,L,n,m){let v=document.createElementNS("http://www.w3.org/2000/svg","g");if(m){let U=document.createElementNS("http://www.w3.org/2000/svg","title");U.textContent=m,v.appendChild(U);}let D=document.createElementNS("http://www.w3.org/2000/svg","rect");D.setAttribute("x",String(M)),D.setAttribute("y",String(S-6)),D.setAttribute("width",String(G.nodeW)),D.setAttribute("height",String(G.nodeH)),D.setAttribute("rx","3"),D.setAttribute("fill",n?k+"33":"none"),D.setAttribute("stroke",k),D.setAttribute("stroke-width",n?"2":"1"),D.setAttribute("opacity",L?"0.35":"1"),v.appendChild(D);let B=document.createElementNS("http://www.w3.org/2000/svg","text");return B.setAttribute("x",String(M+4)),B.setAttribute("y",String(S+4)),B.setAttribute("fill",k),B.setAttribute("font-size",String(G.fontSize)),B.setAttribute("font-family",b.font),B.setAttribute("opacity",L?"0.35":"1"),B.textContent=W,v.appendChild(B),e.flowSvg.appendChild(v),_.nodes.set(`${u}:${A}`,{g:v,rect:D,text:B}),{midX:M+G.nodeW/2,midY:S}}function h(u,M,S,A,W,k){let L=document.createElementNS("http://www.w3.org/2000/svg","line");L.setAttribute("x1",String(u)),L.setAttribute("y1",String(M)),L.setAttribute("x2",String(S)),L.setAttribute("y2",String(A)),L.setAttribute("stroke",W),L.setAttribute("stroke-width","1"),L.setAttribute("stroke-dasharray","3,2"),L.setAttribute("opacity","0.7"),e.flowSvg.appendChild(L);}let x=new Map,E=new Map,q=new Map,j=new Map;for(let u of C){let M=o.recentlyChangedFacts.has(u.id),S=r.facts.find(W=>W.key===u.id)?.meta,A=H(0,w[0],u.y,u.id,u.label,b.text,false,M,S?.description);x.set(u.id,A);}for(let u of T){let M=o.recentlyComputedDerivations.has(u.id),S=r.derivations.find(W=>W.id===u.id)?.meta,A=H(1,w[1],u.y,u.id,u.label,b.accent,false,M,S?.description);E.set(u.id,A);}for(let u of P){let M=o.recentlyActiveConstraints.has(u.id),S=l.find(W=>W.id===u.id)?.meta,A=H(2,w[2],u.y,u.id,u.label,S?.color??(u.active?b.yellow:b.muted),!u.active,M,S?.description);q.set(u.id,A);}for(let u of F){let M=u.status==="unmet"?b.red:b.yellow,S=H(3,w[3],u.y,u.id,ee(u.type,G.labelMaxChars),M,false,false);j.set(u.id,S);}for(let u of O){let M=i.some(A=>A.resolverId===u.id),S=r.resolverDefs.find(A=>A.id===u.id)?.meta;H(4,w[4],u.y,u.id,u.label,S?.color??(M?b.green:b.muted),!M,false,S?.description);}for(let u of T){let M=o.derivationDeps.get(u.id),S=E.get(u.id);if(M&&S)for(let A of M){let W=x.get(A);W&&h(W.midX+G.nodeW/2,W.midY,S.midX-G.nodeW/2,S.midY,b.accent);}}for(let u of F){let M=q.get(u.fromConstraint),S=j.get(u.id);M&&S&&h(M.midX+G.nodeW/2,M.midY,S.midX-G.nodeW/2,S.midY,b.muted);}for(let u of i){let M=j.get(u.id);if(M){let S=O.find(A=>A.id===u.resolverId);S&&h(M.midX+G.nodeW/2,M.midY,w[4],S.y,b.green);}}we.set(e.flowSvg,_);}function Qe(e){e.animationTimer&&clearTimeout(e.animationTimer),e.animationTimer=setTimeout(()=>{e.recentlyChangedFacts.clear(),e.recentlyComputedDerivations.clear(),e.recentlyActiveConstraints.clear(),e.animationTimer=null;},600);}function Ze(e,s){let o=s.entries.toArray();if(o.length===0)return;e.timelineSvg.replaceChildren();let r=Number.POSITIVE_INFINITY,a=Number.NEGATIVE_INFINITY;for(let R of o)R.startMs<r&&(r=R.startMs),R.endMs>a&&(a=R.endMs);let p=performance.now();for(let R of s.inflight.values())R<r&&(r=R),p>a&&(a=p);let l=a-r||1,t=ie-ce-10,i=[],c=new Set;for(let R of o)c.has(R.resolver)||(c.add(R.resolver),i.push(R.resolver));for(let R of s.inflight.keys())c.has(R)||(c.add(R),i.push(R));let y=i.slice(-12),I=ae*y.length+20;e.timelineSvg.setAttribute("viewBox",`0 0 ${ie} ${I}`),e.timelineSvg.setAttribute("height",String(Math.min(I,200)));let N=5;for(let R=0;R<=N;R++){let w=ce+t*R/N,g=l*R/N,f=document.createElementNS("http://www.w3.org/2000/svg","text");f.setAttribute("x",String(w)),f.setAttribute("y","8"),f.setAttribute("fill",b.muted),f.setAttribute("font-size","6"),f.setAttribute("font-family",b.font),f.setAttribute("text-anchor","middle"),f.textContent=g<1e3?`${g.toFixed(0)}ms`:`${(g/1e3).toFixed(1)}s`,e.timelineSvg.appendChild(f);let C=document.createElementNS("http://www.w3.org/2000/svg","line");C.setAttribute("x1",String(w)),C.setAttribute("y1","10"),C.setAttribute("x2",String(w)),C.setAttribute("y2",String(I)),C.setAttribute("stroke",b.border),C.setAttribute("stroke-width","0.5"),e.timelineSvg.appendChild(C);}for(let R=0;R<y.length;R++){let w=y[R],g=12+R*ae,f=R%Se.length,C=Se[f],T=document.createElementNS("http://www.w3.org/2000/svg","text");T.setAttribute("x",String(ce-4)),T.setAttribute("y",String(g+ae/2+3)),T.setAttribute("fill",b.muted),T.setAttribute("font-size","7"),T.setAttribute("font-family",b.font),T.setAttribute("text-anchor","end"),T.textContent=ee(w,12),e.timelineSvg.appendChild(T);let P=o.filter(O=>O.resolver===w);for(let O of P){let Y=ce+(O.startMs-r)/l*t,$=Math.max((O.endMs-O.startMs)/l*t,he),V=document.createElementNS("http://www.w3.org/2000/svg","rect");V.setAttribute("x",String(Y)),V.setAttribute("y",String(g+2)),V.setAttribute("width",String($)),V.setAttribute("height",String(ae-4)),V.setAttribute("rx","2"),V.setAttribute("fill",O.error?b.red:C),V.setAttribute("opacity","0.8");let _=document.createElementNS("http://www.w3.org/2000/svg","title"),H=O.endMs-O.startMs;_.textContent=`${w}: ${H.toFixed(1)}ms${O.error?" (error)":""}`,V.appendChild(_),e.timelineSvg.appendChild(V);}let F=s.inflight.get(w);if(F!==void 0){let O=ce+(F-r)/l*t,Y=Math.max((p-F)/l*t,he),$=document.createElementNS("http://www.w3.org/2000/svg","rect");$.setAttribute("x",String(O)),$.setAttribute("y",String(g+2)),$.setAttribute("width",String(Y)),$.setAttribute("height",String(ae-4)),$.setAttribute("rx","2"),$.setAttribute("fill",C),$.setAttribute("opacity","0.4"),$.setAttribute("stroke",C),$.setAttribute("stroke-width","1"),$.setAttribute("stroke-dasharray","3,2");let V=document.createElementNS("http://www.w3.org/2000/svg","title");V.textContent=`${w}: inflight ${(p-F).toFixed(0)}ms`,$.appendChild(V),e.timelineSvg.appendChild($);}}e.timelineSvg.setAttribute("aria-label",`Timeline: ${o.length} resolver executions across ${y.length} resolvers`);}function dt(){if(typeof window>"u")return {systems:new Map,getSystem:()=>null,getSystems:()=>[],inspect:()=>null,getEvents:()=>[],explain:()=>null,exportSession:()=>null,importSession:()=>false,clearEvents:()=>{},subscribe:()=>()=>{}};if(!window.__DIRECTIVE__){let e=new Map,s={systems:e,getSystem(o){return o?e.get(o)?.system??null:e.values().next().value?.system??null},getSystems(){return [...e.keys()]},inspect(o){let r=this.getSystem(o),a=o?e.get(o):e.values().next().value,p=r?.inspect()??null;return p&&a&&(p.resolverStats=a.resolverStats?Object.fromEntries(a.resolverStats):{}),p},getEvents(o){return o?e.get(o)?.events.toArray()??[]:e.values().next().value?.events.toArray()??[]},explain(o,r){return this.getSystem(r)?.explain(o)??null},subscribe(o,r){let a=r?e.get(r):e.values().next().value;if(!a){let p=false,t=setInterval(()=>{let c=r?e.get(r):e.values().next().value;c&&!p&&(p=true,c.subscribers.add(o));},100),i=setTimeout(()=>clearInterval(t),1e4);return ()=>{clearInterval(t),clearTimeout(i);for(let c of e.values())c.subscribers.delete(o);}}return a.subscribers.add(o),()=>{a.subscribers.delete(o);}},exportSession(o){let r=o?e.get(o):e.values().next().value;return r?JSON.stringify({version:1,name:o??e.keys().next().value??"default",exportedAt:Date.now(),events:r.events.toArray()}):null},importSession(o,r){try{if(o.length>10*1024*1024)return !1;let a=JSON.parse(o);if(!a||typeof a!="object"||Array.isArray(a)||!Array.isArray(a.events))return !1;let p=r?e.get(r):e.values().next().value;if(!p)return !1;let l=p.maxEvents,t=a.events,i=t.length>l?t.length-l:0;p.events.clear();for(let c=i;c<t.length;c++){let d=t[c];d&&typeof d=="object"&&!Array.isArray(d)&&typeof d.timestamp=="number"&&typeof d.type=="string"&&d.type!=="__proto__"&&d.type!=="constructor"&&d.type!=="prototype"&&p.events.push({timestamp:d.timestamp,type:d.type,data:d.data??null});}return !0}catch{return false}},clearEvents(o){let r=o?e.get(o):e.values().next().value;r&&r.events.clear();}};return Object.defineProperty(window,"__DIRECTIVE__",{value:s,writable:false,configurable:ge(),enumerable:true}),s}return window.__DIRECTIVE__}function mt(e={}){let{name:s="default",trace:o=false,maxEvents:r,panel:a=false,position:p="bottom-right",defaultOpen:l=false}=e,t=Pe(r),i=dt(),c={system:null,events:new ue(t),maxEvents:t,subscribers:new Set,resolverStats:new Map};i.systems.set(s,c);let d=(n,m)=>{let v={timestamp:Date.now(),type:n,data:m};o&&c.events.push(v);for(let D of c.subscribers)try{D(v);}catch{}},y=null,I=new Map,N=new Map,R=new Map,w=Ie(),g=_e(),f=je(),C=$e(),T=a&&typeof window<"u"&&typeof document<"u"&&ge(),P=null,F=0,O=1,Y=2,$=4,V=8,_=16,H=32,h=64,x=128,E=256,q=new Map,j=new Set,u=new Map,M=new Set,S=null;function A(n){F|=n,P===null&&typeof requestAnimationFrame<"u"&&(P=requestAnimationFrame(W));}function W(){if(P=null,!y||!c.system){F=0;return}let n=y.refs,m=c.system,v=F;if(F=0,v&O){for(let D of j)ze(I,D);j.clear();for(let[D,{value:B,flash:U}]of q)de(I,n.factsBody,D,B,U,y.flashTimers);q.clear(),n.factsCount.textContent=String(I.size);}if(v&Y&&Ee(n,N,m,y.flashTimers),v&E){for(let D of M)Xe(n,R,D);M.clear();for(let[D,{active:B,whenExplain:U,label:Z}]of u)Je(n,R,D,B,U,Z);u.clear();}if(v&V)if(S)ye(n,S.inflight.length,S.unmet.length);else {let D=se(m);D&&ye(n,D.inflight.length,D.unmet.length);}if(v&$)if(S)be(n,S.inflight,S.unmet);else {let D=se(m);D&&be(n,D.inflight,D.unmet);}v&_&&Ue(n,w),v&H&&Me(n,m,g),v&h&&Ce(n,m),v&x&&Ze(n,C);}function k(n,m){y&&o&&We(y.refs,n,m,c.events.size);}function L(n,m){f.isRecording&&f.recordedEvents.length<Ne&&f.recordedEvents.push({timestamp:Date.now(),type:n,data:Le(m)});}return {name:"devtools",onInit:n=>{if(c.system=n,d("init",{}),typeof window<"u"&&console.log(`%c[Directive Devtools]%c System "${s}" initialized. Access via window.__DIRECTIVE__`,"color: #7c3aed; font-weight: bold","color: inherit"),T){let m=c.system;y=Ve(s,p,l,o);let v=y.refs;try{let U=m.facts.$store.toObject();for(let[Z,re]of Object.entries(U))de(I,v.factsBody,Z,re,!1);v.factsCount.textContent=String(Object.keys(U).length);}catch{}Ee(v,N,m);let D=se(m);D&&(ye(v,D.inflight.length,D.unmet.length),be(v,D.inflight,D.unmet)),Ce(v,m),Ge(v,m),Me(v,m,g);let B=(D?.constraints?.length??0)>0;Ke(v,B),v.recordBtn.addEventListener("click",()=>{if(f.isRecording=!f.isRecording,v.recordBtn.textContent=f.isRecording?"\u23F9 Stop":"\u23FA Record",v.recordBtn.style.color=f.isRecording?b.red:b.text,f.isRecording){f.recordedEvents=[],f.snapshots=[];try{f.snapshots.push({timestamp:Date.now(),facts:m.facts.$store.toObject()});}catch{}}}),v.exportBtn.addEventListener("click",()=>{let U=f.recordedEvents.length>0?f.recordedEvents:c.events.toArray(),Z=JSON.stringify({version:1,name:s,exportedAt:Date.now(),events:U,snapshots:f.snapshots},null,2),re=new Blob([Z],{type:"application/json"}),oe=URL.createObjectURL(re),le=document.createElement("a");le.href=oe,le.download=`directive-session-${s}-${Date.now()}.json`,le.click(),URL.revokeObjectURL(oe);});}},onStart:n=>{d("start",{}),k("start",{}),L("start",{});},onStop:n=>{d("stop",{}),k("stop",{}),L("stop",{});},onDestroy:n=>{d("destroy",{}),i.systems.delete(s),P!==null&&typeof cancelAnimationFrame<"u"&&(cancelAnimationFrame(P),P=null),g.animationTimer&&clearTimeout(g.animationTimer),y&&(y.destroy(),y=null,I.clear(),N.clear(),R.clear());},onFactSet:(n,m,v)=>{d("fact.set",{key:n,value:m,prev:v}),L("fact.set",{key:n,value:m,prev:v}),g.recentlyChangedFacts.add(n),y&&c.system&&(q.set(n,{value:m,flash:true}),j.delete(n),A(O),k("fact.set",{key:n,value:m}));},onFactDelete:(n,m)=>{d("fact.delete",{key:n,prev:m}),L("fact.delete",{key:n,prev:m}),y&&(j.add(n),q.delete(n),A(O),k("fact.delete",{key:n}));},onFactsBatch:n=>{if(d("facts.batch",{changes:n}),L("facts.batch",{count:n.length}),y&&c.system){for(let m of n)m.type==="delete"?(j.add(m.key),q.delete(m.key)):(g.recentlyChangedFacts.add(m.key),q.set(m.key,{value:m.value,flash:true}),j.delete(m.key));A(O),k("facts.batch",{count:n.length});}},onDerivationCompute:(n,m,v)=>{d("derivation.compute",{id:n,value:m,deps:v}),L("derivation.compute",{id:n,deps:v}),g.derivationDeps.set(n,v),g.recentlyComputedDerivations.add(n),k("derivation.compute",{id:n,deps:v});},onDerivationInvalidate:n=>{d("derivation.invalidate",{id:n}),k("derivation.invalidate",{id:n});},onReconcileStart:n=>{d("reconcile.start",{}),w.lastReconcileStartMs=performance.now(),k("reconcile.start",{}),L("reconcile.start",{});},onReconcileEnd:n=>{if(d("reconcile.end",n),L("reconcile.end",{unmet:n.unmet.length,inflight:n.inflight.length,completed:n.completed.length}),w.lastReconcileStartMs>0){let m=performance.now()-w.lastReconcileStartMs;w.reconcileCount++,w.reconcileTotalMs+=m,w.lastReconcileStartMs=0;}if(f.isRecording&&c.system&&f.snapshots.length<Be)try{f.snapshots.push({timestamp:Date.now(),facts:c.system.facts.$store.toObject()});}catch{}y&&c.system&&(S=n,Qe(g),A(Y|V|$|_|H|h),k("reconcile.end",{unmet:n.unmet.length,inflight:n.inflight.length}));},onConstraintEvaluate:(n,m,v)=>{let D=c.system?.meta?.constraint(n)?.label,B=D?{id:n,active:m,label:D}:{id:n,active:m},U=v?{...B,whenExplain:v}:B;d("constraint.evaluate",U),L("constraint.evaluate",U),m?(g.activeConstraints.add(n),g.recentlyActiveConstraints.add(n)):g.activeConstraints.delete(n),y&&(u.set(n,{active:m,whenExplain:v,label:D}),M.delete(n),A(E)),k("constraint.evaluate",{id:n,active:m});},onConstraintError:(n,m)=>{d("constraint.error",{id:n,error:String(m)}),k("constraint.error",{id:n,error:String(m)});},onRequirementCreated:n=>{d("requirement.created",{id:n.id,type:n.requirement.type}),L("requirement.created",{id:n.id,type:n.requirement.type}),k("requirement.created",{id:n.id,type:n.requirement.type});},onRequirementMet:(n,m)=>{d("requirement.met",{id:n.id,byResolver:m}),L("requirement.met",{id:n.id,byResolver:m}),k("requirement.met",{id:n.id,byResolver:m});},onRequirementCanceled:n=>{d("requirement.canceled",{id:n.id}),L("requirement.canceled",{id:n.id}),k("requirement.canceled",{id:n.id});},onResolverStart:(n,m)=>{let v=c.system?.meta?.resolver(n)?.label,D={resolver:n,requirementId:m.id},B=v?{...D,label:v}:D;d("resolver.start",B),L("resolver.start",B),C.inflight.set(n,performance.now()),y&&c.system&&(A($|V|x),k("resolver.start",{resolver:n,requirementId:m.id}));},onResolverComplete:(n,m,v)=>{let D=c.system?.meta?.resolver(n)?.label;d("resolver.complete",{resolver:n,requirementId:m.id,duration:v,...D?{label:D}:{}}),L("resolver.complete",{resolver:n,requirementId:m.id,duration:v});let B=c.resolverStats.get(n)??{count:0,totalMs:0,errors:0};if(B.count++,B.totalMs+=v,c.resolverStats.set(n,B),c.resolverStats.size>xe){let Z=c.resolverStats.keys().next().value;Z!==void 0&&c.resolverStats.delete(Z);}w.resolverStats.set(n,{...B});let U=C.inflight.get(n);C.inflight.delete(n),U!==void 0&&C.entries.push({resolver:n,startMs:U,endMs:performance.now(),error:false}),y&&c.system&&(A($|V|_|x),k("resolver.complete",{resolver:n,duration:v}));},onResolverError:(n,m,v)=>{d("resolver.error",{resolver:n,requirementId:m.id,error:String(v)}),L("resolver.error",{resolver:n,requirementId:m.id,error:String(v)});let D=c.resolverStats.get(n)??{count:0,totalMs:0,errors:0};if(D.errors++,c.resolverStats.set(n,D),c.resolverStats.size>xe){let U=c.resolverStats.keys().next().value;U!==void 0&&c.resolverStats.delete(U);}w.resolverStats.set(n,{...D});let B=C.inflight.get(n);C.inflight.delete(n),B!==void 0&&C.entries.push({resolver:n,startMs:B,endMs:performance.now(),error:true}),y&&c.system&&(A($|V|_|x),k("resolver.error",{resolver:n,error:String(v)}));},onResolverRetry:(n,m,v)=>{d("resolver.retry",{resolver:n,requirementId:m.id,attempt:v}),L("resolver.retry",{resolver:n,requirementId:m.id,attempt:v}),k("resolver.retry",{resolver:n,attempt:v});},onResolverCancel:(n,m)=>{d("resolver.cancel",{resolver:n,requirementId:m.id}),L("resolver.cancel",{resolver:n,requirementId:m.id}),C.inflight.delete(n),k("resolver.cancel",{resolver:n});},onResolverWriteRejected:n=>{let m=n.kind==="summary"?{kind:n.kind,resolver:n.resolver,requirementId:n.req.id,reason:n.reason,dropped:n.dropped}:{kind:n.kind,resolver:n.resolver,requirementId:n.req.id,reason:n.reason,fact:n.fact,expected:n.expected,actual:n.actual};d("resolver.write.rejected",m),L("resolver.write.rejected",m),k("resolver.write.rejected",n.kind==="summary"?{resolver:n.resolver,dropped:n.dropped}:{resolver:n.resolver,fact:n.fact});},onEffectRun:n=>{let m=c.system?.meta?.effect(n)?.label,v=m?{id:n,label:m}:{id:n};d("effect.run",v),L("effect.run",v),w.effectRunCount++,k("effect.run",{id:n});},onEffectError:(n,m)=>{d("effect.error",{id:n,error:String(m)}),w.effectErrorCount++,k("effect.error",{id:n,error:String(m)});},onSnapshot:n=>{d("timetravel.snapshot",{id:n.id,trigger:n.trigger}),y&&c.system&&A(h),k("timetravel.snapshot",{id:n.id,trigger:n.trigger});},onHistoryNavigate:(n,m)=>{if(d("timetravel.jump",{from:n,to:m}),L("timetravel.jump",{from:n,to:m}),y&&c.system){let v=c.system;try{let D=v.facts.$store.toObject();I.clear(),y.refs.factsBody.replaceChildren();for(let[B,U]of Object.entries(D))de(I,y.refs.factsBody,B,U,!1);y.refs.factsCount.textContent=String(Object.keys(D).length);}catch{}N.clear(),g.derivationDeps.clear(),y.refs.derivBody.replaceChildren(),R.clear(),y.refs.constraintsBody.replaceChildren(),y.refs.constraintsCount.textContent="0",S=null,A(Y|V|$|H|h),k("timetravel.jump",{from:n,to:m});}},onError:n=>{d("error",{source:n.source,sourceId:n.sourceId,message:n.message}),L("error",{source:n.source,message:n.message}),k("error",{source:n.source,message:n.message});},onErrorRecovery:(n,m)=>{d("error.recovery",{source:n.source,sourceId:n.sourceId,strategy:m}),k("error.recovery",{source:n.source,strategy:m});},onTraceComplete:n=>{d("trace.complete",{id:n.id,status:n.status,facts:n.factChanges.length,constraints:n.constraintsHit.length,requirements:n.requirementsAdded.length,resolvers:n.resolversStarted.length,effects:n.effectsRun.length}),k("trace.complete",{id:n.id});},onDefinitionRegister:(n,m)=>{d("definition.register",{type:n,id:m}),L("definition.register",{type:n,id:m}),k("definition.register",{type:n,id:m});},onDefinitionAssign:(n,m)=>{d("definition.assign",{type:n,id:m}),L("definition.assign",{type:n,id:m}),k("definition.assign",{type:n,id:m});},onDefinitionUnregister:(n,m)=>{d("definition.unregister",{type:n,id:m}),L("definition.unregister",{type:n,id:m}),k("definition.unregister",{type:n,id:m}),n==="constraint"&&y&&(M.add(m),u.delete(m),A(E));},onDefinitionCall:(n,m,v)=>{d("definition.call",{type:n,id:m,props:v}),L("definition.call",{type:n,id:m,props:v}),k("definition.call",{type:n,id:m,props:v});}}}var tt="directive-devtools-event",et=new Set(["__proto__","constructor","prototype"]),pt=Math.random().toString(36).slice(2,8);function gt(){if(typeof window<"u"){let e=`__DIRECTIVE_BRIDGE_ID_${pt}__`,s=window,o=s[e]??0;return s[e]=o+1,o+1}return 1}function ft(e){let s=false;for(let r of et)if(r in e){s=true;break}if(!s)return e;let o=Object.create(null);for(let[r,a]of Object.entries(e))et.has(r)||(o[r]=a);return o}function bt(e){if(!(typeof window>"u"))try{let s=ft(e),o={id:gt(),timestamp:Date.now(),snapshotId:null,...s};window.dispatchEvent(new CustomEvent(tt,{detail:o}));}catch{}}function yt(e){let{storage:s,key:o,include:r,exclude:a=[],debounce:p=100,onRestore:l,onSave:t,onError:i}=e,c=null,d=null,y=new Set,I=g=>a.includes(g)?false:r?r.includes(g):true,N=()=>{try{let g=s.getItem(o);if(!g)return null;let f$1=JSON.parse(g);return typeof f$1!="object"||f$1===null?null:f(f$1)?f$1:(i?.(new Error("Potential prototype pollution detected in stored data")),null)}catch(g){return i?.(g instanceof Error?g:new Error(String(g))),null}},R=()=>{if(d)try{let g={};for(let f of y)I(f)&&(g[f]=d.facts[f]);s.setItem(o,JSON.stringify(g)),t?.(g);}catch(g){i?.(g instanceof Error?g:new Error(String(g)));}},w=()=>{c&&clearTimeout(c),c=setTimeout(R,p);};return {name:"persistence",onInit:g=>{d=g;let f=N();f&&(d.facts.$store.batch(()=>{for(let[C,T]of Object.entries(f))I(C)&&(d.facts[C]=T,y.add(C));}),l?.(f));},onDestroy:()=>{c&&clearTimeout(c),R();},onFactSet:g=>{y.add(g),I(g)&&w();},onFactDelete:g=>{y.delete(g),I(g)&&w();},onFactsBatch:g=>{let f=false;for(let C of g)C.type==="set"?y.add(C.key):y.delete(C.key),I(C.key)&&(f=true);f&&w();}}}function vt(e={}){let{onSlowConstraint:s,onSlowResolver:o,slowConstraintThresholdMs:r=16,slowResolverThresholdMs:a=1e3}=e,p=new Map,l=new Map,t=new Map,i={runs:0,totalDurationMs:0,avgDurationMs:0,maxDurationMs:0},c=0,d=0,y=0;function I(g){let f=p.get(g);return f||(f={evaluations:0,totalDurationMs:0,avgDurationMs:0,maxDurationMs:0,lastEvaluatedAt:0},p.set(g,f)),f}function N(g){let f=l.get(g);return f||(f={starts:0,completions:0,errors:0,retries:0,cancellations:0,totalDurationMs:0,avgDurationMs:0,maxDurationMs:0,lastCompletedAt:0},l.set(g,f)),f}function R(g){let f=t.get(g);return f||(f={runs:0,errors:0,lastRunAt:0},t.set(g,f)),f}let w={name:"performance",onStart(){c=Date.now();},onConstraintEvaluate(g,f){let C=performance.now(),T=I(g);if(T.evaluations++,T.lastEvaluatedAt=Date.now(),y>0){let P=C-y;T.totalDurationMs+=P;let F=T.evaluations;T.avgDurationMs=T.totalDurationMs/F,P>T.maxDurationMs&&(T.maxDurationMs=P),P>r&&s?.(g,P);}y=C;},onResolverStart(g,f){let C=N(g);C.starts++;},onResolverComplete(g,f,C){let T=N(g);T.completions++,T.totalDurationMs+=C,T.avgDurationMs=T.totalDurationMs/T.completions,C>T.maxDurationMs&&(T.maxDurationMs=C),T.lastCompletedAt=Date.now(),C>a&&o?.(g,C);},onResolverError(g,f,C){N(g).errors++;},onResolverRetry(g,f,C){N(g).retries++;},onResolverCancel(g,f){N(g).cancellations++;},onEffectRun(g){let f=R(g);f.runs++,f.lastRunAt=Date.now();},onEffectError(g,f){R(g).errors++;},onReconcileStart(){d=performance.now(),y=0;},onReconcileEnd(){let g=performance.now()-d;i.runs++,i.totalDurationMs+=g,i.avgDurationMs=i.totalDurationMs/i.runs,g>i.maxDurationMs&&(i.maxDurationMs=g);},onDestroy(){w.reset();},getSnapshot(){let g={};for(let[T,P]of p)g[T]={...P};let f={};for(let[T,P]of l)f[T]={...P};let C={};for(let[T,P]of t)C[T]={...P};return {constraints:g,resolvers:f,effects:C,reconcile:{...i},uptime:c?Date.now()-c:0}},reset(){p.clear(),l.clear(),t.clear(),i.runs=0,i.totalDurationMs=0,i.avgDurationMs=0,i.maxDurationMs=0,y=0;}};return w}function ve(){return globalThis.crypto?.randomUUID?.()??`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,11)}`}function Te(e,s){if(e.length===0)return 0;let o=[...e].sort((a,p)=>a-p),r=Math.ceil(s/100*o.length)-1;return o[Math.max(0,r)]??0}function ht(e={}){let{serviceName:s="directive-agents",metrics:o={},tracing:r={},alerts:a=[],summaryMetrics:p={},events:l={}}=e,t={requests:p.requests??"agent.requests",errors:p.errors??"agent.errors",latency:p.latency??"agent.latency",tokens:p.tokens??"agent.tokens",cost:p.cost??"agent.cost"},{enabled:i=true,exportInterval:c,exporter:d,maxDataPoints:y=1e3}=o,{enabled:I=true,sampleRate:N=1,maxSpans:R=1e3,exporter:w}=r,g=Date.now(),f=new Map,C=new Map,T=[],P=[],F=new Map,O=new Map,Y;c&&(d||w)&&(Y=setInterval(async()=>{try{if(d&&i&&await d(Array.from(O.values())),w&&I){let h=T.splice(0,100);h.length>0&&await w(h);}}catch(h){console.error("[Directive Observability] Export error:",h);}},c));function $(h){if(!i)return;let x=`${h.name}:${JSON.stringify(Object.fromEntries(Object.entries(h.labels).sort()))}`,E=f.get(x);E||(E=[],f.set(x,E)),E.push(h),E.length>y&&E.shift(),V(h.name,E),l.onMetricRecorded?.(h),_(h.name);}function V(h,x){if(x.length===0)return;let E=x.map(S=>S.value),q=E.reduce((S,A)=>S+A,0),j=x[0],u=E[E.length-1],M={name:h,type:j.type,count:x.length,sum:q,min:Math.min(...E),max:Math.max(...E),avg:q/x.length,lastValue:u,lastUpdated:Date.now()};O.set(h,M);}function _(h){for(let x of a){if(x.metric!==h)continue;let E=O.get(h);if(!E)continue;let q=`${x.metric}:${x.threshold}`,j=F.get(q),u=x.cooldownMs??6e4;if(j&&Date.now()-j<u)continue;let M=x.operator??">",S=E.lastValue,A=x.threshold,W=false;switch(M){case ">":W=S>A;break;case "<":W=S<A;break;case ">=":W=S>=A;break;case "<=":W=S<=A;break;case "==":W=S===A;break}if(W){let k={alertId:ve(),metric:h,currentValue:S,threshold:A,operator:M,action:x.action,timestamp:Date.now(),message:`Alert: ${h} ${M} ${A} (current: ${S})`};switch(P.push(k),P.length>1e3&&P.splice(0,P.length-1e3),F.set(q,Date.now()),l.onAlert?.(k),x.action){case "log":console.log(`[Observability] ${k.message}`);break;case "warn":console.warn(`[Observability] ${k.message}`);break;case "alert":console.error(`[Observability ALERT] ${k.message}`);break;case "callback":x.callback?.(E,A);break}}}}function H(h){let x=[];for(let[E,q]of f)if(E.startsWith(`${h}:`))for(let j of q)x.push(j.value);return x.length===0?{}:{p50:Te(x,50),p90:Te(x,90),p99:Te(x,99)}}return {incrementCounter(h,x={},E=1){$({name:h,type:"counter",value:E,labels:x,timestamp:Date.now()});},setGauge(h,x,E={}){$({name:h,type:"gauge",value:x,labels:E,timestamp:Date.now()});},observeHistogram(h,x,E={}){$({name:h,type:"histogram",value:x,labels:E,timestamp:Date.now()});},startSpan(h,x){if(Math.random()>N)return {traceId:"sampled-out",spanId:"sampled-out",operationName:h,serviceName:s,startTime:Date.now(),status:"ok",tags:{},logs:[]};let E={traceId:x?C.get(x)?.traceId??ve():ve(),spanId:ve(),parentSpanId:x,operationName:h,serviceName:s,startTime:Date.now(),status:"ok",tags:{},logs:[]};return I&&(C.set(E.spanId,E),l.onSpanStart?.(E)),E},endSpan(h,x="ok"){if(h==="sampled-out")return;let E=C.get(h);if(E){for(E.endTime=Date.now(),E.duration=E.endTime-E.startTime,E.status=x,C.delete(h),T.push(E);T.length>R;)T.shift();$({name:`${E.operationName}.latency`,type:"histogram",value:E.duration,labels:{},timestamp:Date.now()}),x==="error"&&$({name:`${E.operationName}.errors`,type:"counter",value:1,labels:{},timestamp:Date.now()}),l.onSpanEnd?.(E);}},addSpanLog(h,x,E="info"){if(h==="sampled-out")return;let q=C.get(h);q&&q.logs.push({timestamp:Date.now(),message:x,level:E});},addSpanTag(h,x,E){if(h==="sampled-out")return;let q=C.get(h);q&&(q.tags[x]=E);},getDashboard(){let h=O.get(t.requests),x=O.get(t.errors),E=O.get(t.latency),q=O.get(t.tokens),j=O.get(t.cost),u=h?.sum??0,M=x?.sum??0,S=u>0?M/u:0,A=E?H(t.latency):{};return {service:{name:s,uptime:Date.now()-g,startTime:g},metrics:Object.fromEntries(O),traces:[...T].slice(-100),alerts:[...P].slice(-50),summary:{totalRequests:u,totalErrors:M,errorRate:S,avgLatency:E?.avg??0,p99Latency:A.p99??0,activeSpans:C.size,totalTokens:q?.sum??0,totalCost:j?.sum??0}}},getMetric(h){let x=O.get(h);if(!x)return;let E=H(h);return {...x,...E}},getTraces(h=100){return [...T].slice(-h)},getAlerts(){return [...P]},export(){return {metrics:Array.from(O.values()),traces:[...T],alerts:[...P]}},clear(){f.clear(),O.clear(),C.clear(),T.length=0,P.length=0,F.clear();},async destroy(){Y&&(clearInterval(Y),Y=void 0);try{d&&i&&O.size>0&&await d(Array.from(O.values())),w&&I&&T.length>0&&await w([...T]);}catch(h){console.error("[Directive Observability] Error flushing data during destroy:",h);}f.clear(),O.clear(),C.clear(),T.length=0,P.length=0,F.clear();},getHealthStatus(){let h=O.get(t.requests),x=O.get(t.errors),E=h?.sum??0,q=x?.sum??0,j=E>0?q/E:0,u=P.filter(M=>Date.now()-M.timestamp<3e5).length;return {healthy:j<.1&&u===0,uptime:Date.now()-g,errorRate:j,activeAlerts:u}}}}function St(e){return {trackRun(s,o){let r={agent:s};e.incrementCounter("agent.requests",r),o.success||e.incrementCounter("agent.errors",r),e.observeHistogram("agent.latency",o.latencyMs,r),o.inputTokens!==void 0&&(e.incrementCounter("agent.tokens.input",r,o.inputTokens),e.incrementCounter("agent.tokens",r,o.inputTokens)),o.outputTokens!==void 0&&(e.incrementCounter("agent.tokens.output",r,o.outputTokens),e.incrementCounter("agent.tokens",r,o.outputTokens)),o.cost!==void 0&&e.incrementCounter("agent.cost",r,o.cost),o.toolCalls!==void 0&&e.incrementCounter("agent.tool_calls",r,o.toolCalls);},trackGuardrail(s,o){let r={guardrail:s};e.incrementCounter("guardrail.checks",r),o.passed||e.incrementCounter("guardrail.failures",r),o.blocked&&e.incrementCounter("guardrail.blocks",r),e.observeHistogram("guardrail.latency",o.latencyMs,r);},trackApproval(s,o){let r={tool:s};e.incrementCounter("approval.requests",r),o.approved?e.incrementCounter("approval.approved",r):e.incrementCounter("approval.rejected",r),o.timedOut&&e.incrementCounter("approval.timeouts",r),e.observeHistogram("approval.wait_time",o.waitTimeMs,r);},trackHandoff(s,o,r){e.incrementCounter("handoff.count",{from:s,to:o}),e.observeHistogram("handoff.latency",r);}}}function xt(e){let s=[{key:"service.name",value:{stringValue:e.serviceName??"directive-agents"}}];if(e.serviceVersion&&s.push({key:"service.version",value:{stringValue:e.serviceVersion}}),e.resourceAttributes)for(let[o,r]of Object.entries(e.resourceAttributes))s.push({key:o,value:{stringValue:r}});return {attributes:s}}function ne(e){return `${BigInt(e)*BigInt(1e6)}`}function Et(e){switch(e){case "counter":return "sum";case "gauge":return "gauge";case "histogram":return "histogram";default:return "gauge"}}function Ct(e,s,o){let r=e.map(a=>{let p=a.lastUpdated-6e4,l=[{asInt:a.type==="counter"?a.sum:void 0,asDouble:a.type!=="counter"?a.lastValue:void 0,timeUnixNano:ne(a.lastUpdated),startTimeUnixNano:ne(p),attributes:[]}],t=Et(a.type),i={name:a.name,unit:""};return t==="sum"?i.sum={dataPoints:l,aggregationTemporality:2,isMonotonic:true}:t==="histogram"?i.histogram={dataPoints:[{count:a.count,sum:a.sum,min:a.min,max:a.max,timeUnixNano:ne(a.lastUpdated),startTimeUnixNano:ne(p),attributes:[]}],aggregationTemporality:2}:i.gauge={dataPoints:l},i});return {resourceMetrics:[{resource:s,scopeMetrics:[{scope:{name:"directive",version:o},metrics:r}]}]}}function wt(e,s,o){let r=e.map(a=>{let p=a.logs.map(i=>({timeUnixNano:ne(i.timestamp),name:i.level,attributes:[{key:"message",value:{stringValue:i.message}},{key:"level",value:{stringValue:i.level}}]})),l=Object.entries(a.tags).map(([i,c])=>({key:i,value:typeof c=="string"?{stringValue:c}:typeof c=="number"?{intValue:`${c}`}:{boolValue:c}})),t=a.status==="ok"?1:a.status==="error"?2:0;return {traceId:a.traceId.replace(/-/g,"").padEnd(32,"0").slice(0,32),spanId:a.spanId.replace(/-/g,"").padEnd(16,"0").slice(0,16),parentSpanId:a.parentSpanId?a.parentSpanId.replace(/-/g,"").padEnd(16,"0").slice(0,16):void 0,name:a.operationName,kind:1,startTimeUnixNano:ne(a.startTime),endTimeUnixNano:a.endTime?ne(a.endTime):ne(a.startTime),attributes:l,events:p,status:{code:t}}});return {resourceSpans:[{resource:s,scopeSpans:[{scope:{name:"directive",version:o},spans:r}]}]}}function Mt(e){let{endpoint:s,headers:o={},scopeVersion:r="0.1.0",timeoutMs:a=1e4,fetch:p=globalThis.fetch,onError:l}=e;try{let c=new URL(s);if(c.protocol!=="http:"&&c.protocol!=="https:")throw new Error("[Directive] Only http: and https: protocols are supported")}catch(c){throw new Error(`[Directive OTLP] Invalid endpoint URL "${s}": ${c instanceof Error?c.message:String(c)}`)}if(/\/v1\/(metrics|traces)/.test(s)&&console.warn(`[Directive OTLP] Endpoint "${s}" already contains a /v1/metrics or /v1/traces path. The exporter will append /v1/metrics or /v1/traces automatically. Use the base URL (e.g., "http://localhost:4318") instead.`),a<=0||!Number.isFinite(a))throw new Error(`[Directive OTLP] timeoutMs must be > 0, got ${a}`);let t=xt(e);async function i(c,d,y){let I=`${s.replace(/\/$/,"")}${c}`,N=new AbortController,R=setTimeout(()=>N.abort(),a);try{let w=await p(I,{method:"POST",headers:{"Content-Type":"application/json",...o},body:JSON.stringify(d),signal:N.signal});if(!w.ok)throw new Error(`[Directive] OTLP export failed: ${w.status} ${w.statusText}`)}catch(w){let g=w instanceof Error?w:new Error(String(w));l?l(g,y):console.error(`[Directive OTLP] Export ${y} error:`,g.message);}finally{clearTimeout(R);}}return {async exportMetrics(c){if(c.length===0)return;let d=Ct(c,t,r);await i("/v1/metrics",d,"metrics");},async exportTraces(c){if(c.length===0)return;let d=wt(c,t,r);await i("/v1/traces",d,"traces");}}}var me=class extends Error{code="CIRCUIT_OPEN";retryAfterMs;state;constructor(s,o,r="OPEN",a){let p=a?`[Directive CircuitBreaker] Circuit "${s}" is ${r}. ${a}`:`[Directive CircuitBreaker] Circuit "${s}" is ${r}. Request rejected. Try again in ${Math.ceil(o/1e3)}s.`;super(p),this.name="CircuitBreakerOpenError",this.retryAfterMs=o,this.state=r;}};function Tt(e={}){let{failureThreshold:s=5,recoveryTimeMs:o=3e4,halfOpenMaxRequests:r=3,failureWindowMs:a=6e4,observability:p,metricPrefix:l="circuit_breaker",name:t="default",isFailure:i=()=>true,onStateChange:c}=e;if(s<1||!Number.isFinite(s))throw new Error(`[Directive CircuitBreaker] failureThreshold must be >= 1, got ${s}`);if(o<=0||!Number.isFinite(o))throw new Error(`[Directive CircuitBreaker] recoveryTimeMs must be > 0, got ${o}`);if(r<1||!Number.isFinite(r))throw new Error(`[Directive CircuitBreaker] halfOpenMaxRequests must be >= 1, got ${r}`);if(a<=0||!Number.isFinite(a))throw new Error(`[Directive CircuitBreaker] failureWindowMs must be > 0, got ${a}`);let d="CLOSED",y=[],I=0,N=0,R=Date.now(),w=0,g=0,f=0,C=0,T=0,P=null,F=null;function O(_){if(d===_)return;let H=d;d=_,R=Date.now(),_==="OPEN"&&(w=Date.now()),_==="HALF_OPEN"&&(I=0,N=0),c?.(H,_),p&&p.incrementCounter(`${l}.state_change`,{name:t,from:H,to:_});}function Y(){let _=Date.now()-a;return y=y.filter(H=>H>_),y.length}function $(){C++,F=Date.now(),p&&p.incrementCounter(`${l}.success`,{name:t}),d==="HALF_OPEN"&&(N++,N>=r&&(O("CLOSED"),y=[]));}function V(_){if(!i(_)){$();return}f++,P=Date.now(),y.push(Date.now());let H=s*2;if(y.length>H&&(y=y.slice(-H)),p&&p.incrementCounter(`${l}.failure`,{name:t}),d==="HALF_OPEN"){O("OPEN");return}d==="CLOSED"&&Y()>=s&&O("OPEN");}return {async execute(_){if(g++,p&&p.incrementCounter(`${l}.requests`,{name:t}),d==="OPEN")if(Date.now()-w>=o)O("HALF_OPEN");else throw T++,p&&p.incrementCounter(`${l}.rejected`,{name:t}),new me(t,o-(Date.now()-w));if(d==="HALF_OPEN"){if(I>=r)throw T++,new me(t,o,"HALF_OPEN",`Max trial requests (${r}) reached.`);I++;}let H=Date.now();try{let h=await _();return $(),p&&p.observeHistogram(`${l}.latency`,Date.now()-H,{name:t}),h}catch(h){let x=h instanceof Error?h:new Error(String(h));throw V(x),p&&p.observeHistogram(`${l}.latency`,Date.now()-H,{name:t}),h}},getState(){return d==="OPEN"&&Date.now()-w>=o&&O("HALF_OPEN"),d},getStats(){return {state:this.getState(),totalRequests:g,totalFailures:f,totalSuccesses:C,totalRejected:T,recentFailures:Y(),lastFailureTime:P,lastSuccessTime:F,lastStateChange:R}},forceState(_){O(_);},reset(){let _=d;d="CLOSED",y=[],I=0,N=0,R=Date.now(),w=0,g=0,f=0,C=0,T=0,P=null,F=null,_!=="CLOSED"&&c?.(_,"CLOSED");},isAllowed(){return d==="CLOSED"?true:d==="OPEN"?Date.now()-w>=o:I<r}}}
export{b as createAuditLedger,a as memorySink}from'../chunk-AV6S27PU.js';import'../chunk-2FF6QGOA.js';import {f}from'../chunk-PXRV64PA.js';var Oe={debug:0,info:1,warn:2,error:3};function st(e={}){let{level:s="info",filter:o=()=>true,logger:r=console,prefix:a="[Directive]"}=e,p=Oe[s],l=(t,i,...c)=>{Oe[t]<p||o(i)&&r[t](`${a} ${i}`,...c);};return {name:"logging",onInit:()=>l("debug","init"),onStart:()=>l("info","start"),onStop:()=>l("info","stop"),onDestroy:()=>l("debug","destroy"),onFactSet:(t,i,c)=>{l("debug","fact.set",{key:t,value:i,prev:c});},onFactDelete:(t,i)=>{l("debug","fact.delete",{key:t,prev:i});},onFactsBatch:t=>{l("debug","facts.batch",{count:t.length,changes:t});},onDerivationCompute:(t,i,c)=>{l("debug","derivation.compute",{id:t,value:i,deps:c});},onDerivationInvalidate:t=>{l("debug","derivation.invalidate",{id:t});},onReconcileStart:()=>{l("debug","reconcile.start");},onReconcileEnd:t=>{l("debug","reconcile.end",{unmet:t.unmet.length,inflight:t.inflight.length,completed:t.completed.length,canceled:t.canceled.length});},onConstraintEvaluate:(t,i,c)=>{if(c){let d=c.filter(y=>y.pass).length;l("debug","constraint.evaluate",{id:t,active:i,clauses:{total:c.length,passed:d}});return}l("debug","constraint.evaluate",{id:t,active:i});},onConstraintError:(t,i)=>{l("error","constraint.error",{id:t,error:i});},onRequirementCreated:t=>{l("debug","requirement.created",{id:t.id,type:t.requirement.type});},onRequirementMet:(t,i)=>{l("info","requirement.met",{id:t.id,byResolver:i});},onRequirementCanceled:t=>{l("debug","requirement.canceled",{id:t.id});},onResolverStart:(t,i)=>{l("debug","resolver.start",{resolver:t,requirementId:i.id});},onResolverComplete:(t,i,c)=>{l("info","resolver.complete",{resolver:t,requirementId:i.id,duration:c});},onResolverError:(t,i,c)=>{l("error","resolver.error",{resolver:t,requirementId:i.id,error:c});},onResolverRetry:(t,i,c)=>{l("warn","resolver.retry",{resolver:t,requirementId:i.id,attempt:c});},onResolverCancel:(t,i)=>{l("debug","resolver.cancel",{resolver:t,requirementId:i.id});},onResolverWriteRejected:t=>{l("warn","resolver.write.rejected",t.kind==="summary"?{kind:t.kind,resolver:t.resolver,requirementId:t.req.id,reason:t.reason,dropped:t.dropped}:{kind:t.kind,resolver:t.resolver,requirementId:t.req.id,reason:t.reason,fact:t.fact,expected:t.expected,actual:t.actual});},onEffectRun:t=>{l("debug","effect.run",{id:t});},onEffectError:(t,i)=>{l("error","effect.error",{id:t,error:i});},onSnapshot:t=>{l("debug","timetravel.snapshot",{id:t.id,trigger:t.trigger});},onHistoryNavigate:(t,i)=>{l("info","timetravel.jump",{from:t,to:i});},onError:t=>{l("error","error",{source:t.source,sourceId:t.sourceId,message:t.message});},onErrorRecovery:(t,i)=>{l("warn","error.recovery",{source:t.source,sourceId:t.sourceId,strategy:i});},onDefinitionRegister:(t,i)=>{l("info","definition.register",{type:t,id:i});},onDefinitionAssign:(t,i)=>{l("info","definition.assign",{type:t,id:i});},onDefinitionUnregister:(t,i)=>{l("info","definition.unregister",{type:t,id:i});},onDefinitionCall:(t,i,c)=>{l("debug","definition.call",{type:t,id:i,props:c});},onTraceComplete:t=>{l("debug","trace.complete",{id:t.id,status:t.status,duration:t.duration,factChanges:t.factChanges.length,derivationsRecomputed:t.derivationsRecomputed.length,constraintsHit:t.constraintsHit.length,resolversStarted:t.resolversStarted.length,effectsRun:t.effectsRun.length});}}}var ue=class{constructor(s){this.capacity=s;this.buf=new Array(s);}buf;head=0;_size=0;get size(){return this._size}push(s){this.buf[this.head]=s,this.head=(this.head+1)%this.capacity,this._size<this.capacity&&this._size++;}toArray(){return this._size===0?[]:this._size<this.capacity?this.buf.slice(0,this._size):[...this.buf.slice(this.head),...this.buf.slice(0,this.head)]}clear(){this.buf=new Array(this.capacity),this.head=0,this._size=0;}};function ge(){try{if(typeof process<"u"&&process.env?.NODE_ENV==="production")return !1}catch{}try{if(typeof import.meta<"u"&&import.meta.env?.MODE==="production")return !1}catch{}return true}function fe(e){try{if(e===void 0)return "undefined";if(e===null)return "null";if(typeof e=="bigint")return String(e)+"n";if(typeof e=="symbol")return String(e);if(typeof e=="object"){let s=JSON.stringify(e,(o,r)=>typeof r=="bigint"?String(r)+"n":typeof r=="symbol"?String(r):r);return s.length>120?s.slice(0,117)+"...":s}return String(e)}catch{return "<error>"}}function ee(e,s){return e.length<=s?e:e.slice(0,s-3)+"..."}function se(e){try{return e.inspect()}catch{return null}}function Le(e){try{return e==null||typeof e!="object"?e:JSON.parse(JSON.stringify(e))}catch{return null}}function Pe(e){return e===void 0?1e3:!Number.isFinite(e)||e<1?(ge()&&console.warn(`[directive:devtools] Invalid maxEvents value (${e}), using default 1000`),1e3):Math.floor(e)}function Ie(){return {reconcileCount:0,reconcileTotalMs:0,resolverStats:new Map,effectRunCount:0,effectErrorCount:0,lastReconcileStartMs:0}}var it=200,ie=340,ae=16,ce=80,he=2,Se=["#8b9aff","#4ade80","#fbbf24","#c084fc","#f472b6","#22d3ee"];function $e(){return {entries:new ue(it),inflight:new Map}}function _e(){return {derivationDeps:new Map,activeConstraints:new Set,recentlyChangedFacts:new Set,recentlyComputedDerivations:new Set,recentlyActiveConstraints:new Set,animationTimer:null}}var Ne=1e4,Be=100;function je(){return {isRecording:false,recordedEvents:[],snapshots:[]}}var He=50,xe=200,b={bg:"#1a1a2e",text:"#e0e0e0",accent:"#8b9aff",muted:"#b0b0d0",border:"#333",rowBorder:"#2a2a4a",green:"#4ade80",yellow:"#fbbf24",red:"#f87171",closeBtn:"#aaa",font:"ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace"},G={nodeW:90,nodeH:16,nodeGap:6,startY:16,colGap:20,fontSize:10,labelMaxChars:11};function Ve(e,s,o,r){let a=false,p={position:"fixed",zIndex:"99999",...s.includes("bottom")?{bottom:"12px"}:{top:"12px"},...s.includes("right")?{right:"12px"}:{left:"12px"}},l=document.createElement("style");l.textContent=`[data-directive-devtools] summary:focus-visible{outline:2px solid ${b.accent};outline-offset:2px;border-radius:2px}[data-directive-devtools] button:focus-visible{outline:2px solid ${b.accent};outline-offset:2px}`,document.head.appendChild(l);let t=document.createElement("button");t.setAttribute("aria-label","Open Directive DevTools"),t.setAttribute("aria-expanded",String(o)),t.title="Ctrl+Shift+D to toggle",Object.assign(t.style,{...p,background:b.bg,color:b.text,border:`1px solid ${b.border}`,borderRadius:"6px",padding:"10px 14px",minWidth:"44px",minHeight:"44px",cursor:"pointer",fontFamily:b.font,fontSize:"12px",display:o?"none":"block"}),t.textContent="Directive";let i=document.createElement("div");i.setAttribute("role","region"),i.setAttribute("aria-label","Directive DevTools"),i.setAttribute("data-directive-devtools",""),i.tabIndex=-1,Object.assign(i.style,{...p,background:b.bg,color:b.text,border:`1px solid ${b.border}`,borderRadius:"8px",padding:"12px",fontFamily:b.font,fontSize:"11px",maxWidth:"min(380px, calc(100vw - 24px))",maxHeight:"min(500px, calc(100vh - 24px))",overflow:"auto",boxShadow:"0 4px 20px rgba(0,0,0,0.5)",display:o?"block":"none"});let c=document.createElement("div");Object.assign(c.style,{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:"8px"});let d=document.createElement("strong");d.style.color=b.accent,d.textContent=e==="default"?"Directive DevTools":`DevTools (${e})`;let y=document.createElement("button");y.setAttribute("aria-label","Close DevTools"),Object.assign(y.style,{background:"none",border:"none",color:b.closeBtn,cursor:"pointer",fontSize:"16px",padding:"8px 12px",minWidth:"44px",minHeight:"44px",lineHeight:"1",display:"flex",alignItems:"center",justifyContent:"center"}),y.textContent="\xD7",c.appendChild(d),c.appendChild(y),i.appendChild(c);let I=document.createElement("div");I.style.marginBottom="6px",I.setAttribute("aria-live","polite");let N=document.createElement("span");N.style.color=b.green,N.textContent="Settled",I.appendChild(N),i.appendChild(I);let R=document.createElement("div");Object.assign(R.style,{display:"none",marginBottom:"8px",padding:"4px 8px",background:"#252545",borderRadius:"4px",alignItems:"center",gap:"6px"});let w=document.createElement("button");Object.assign(w.style,{background:"none",border:`1px solid ${b.border}`,color:b.text,cursor:"pointer",padding:"4px 10px",borderRadius:"3px",fontFamily:b.font,fontSize:"11px",minWidth:"44px",minHeight:"44px"}),w.textContent="\u25C0 Undo",w.disabled=true;let g=document.createElement("button");Object.assign(g.style,{background:"none",border:`1px solid ${b.border}`,color:b.text,cursor:"pointer",padding:"4px 10px",borderRadius:"3px",fontFamily:b.font,fontSize:"11px",minWidth:"44px",minHeight:"44px"}),g.textContent="Redo \u25B6",g.disabled=true;let f=document.createElement("span");f.style.color=b.muted,f.style.fontSize="10px",R.appendChild(w),R.appendChild(g),R.appendChild(f),i.appendChild(R);function C(z,K){let X=document.createElement("details");K&&(X.open=true),X.style.marginBottom="4px";let J=document.createElement("summary");Object.assign(J.style,{cursor:"pointer",color:b.accent,marginBottom:"4px"});let Q=document.createElement("span");J.textContent=`${z} (`,J.appendChild(Q),J.appendChild(document.createTextNode(")")),Q.textContent="0",X.appendChild(J);let te=document.createElement("table");Object.assign(te.style,{width:"100%",borderCollapse:"collapse",fontSize:"11px"});let Re=document.createElement("thead"),De=document.createElement("tr");for(let nt of ["Key","Value"]){let pe=document.createElement("th");pe.scope="col",Object.assign(pe.style,{textAlign:"left",padding:"2px 4px",color:b.accent}),pe.textContent=nt,De.appendChild(pe);}Re.appendChild(De),te.appendChild(Re);let Ae=document.createElement("tbody");return te.appendChild(Ae),X.appendChild(te),{details:X,tbody:Ae,countSpan:Q}}function T(z,K){let X=document.createElement("details");X.style.marginBottom="4px";let J=document.createElement("summary");Object.assign(J.style,{cursor:"pointer",color:K,marginBottom:"4px"});let Q=document.createElement("span");J.textContent=`${z} (`,J.appendChild(Q),J.appendChild(document.createTextNode(")")),Q.textContent="0",X.appendChild(J);let te=document.createElement("ul");return Object.assign(te.style,{margin:"0",paddingLeft:"16px"}),X.appendChild(te),{details:X,list:te,countSpan:Q}}let P=C("Facts",true);i.appendChild(P.details);let F=C("Derivations",false);i.appendChild(F.details);let O=T("Inflight",b.yellow);i.appendChild(O.details);let Y=T("Unmet",b.red);i.appendChild(Y.details);let $=document.createElement("details");$.style.marginBottom="4px";let V=document.createElement("summary");Object.assign(V.style,{cursor:"pointer",color:b.accent,marginBottom:"4px"}),V.textContent="Performance",$.appendChild(V);let _=document.createElement("div");_.style.fontSize="10px",_.style.color=b.muted,_.textContent="No data yet",$.appendChild(_),i.appendChild($);let H=document.createElement("details");H.style.marginBottom="4px";let h=document.createElement("summary");Object.assign(h.style,{cursor:"pointer",color:b.accent,marginBottom:"4px"}),h.textContent="Dependency Graph",H.appendChild(h);let x=document.createElementNS("http://www.w3.org/2000/svg","svg");x.setAttribute("width","100%"),x.setAttribute("height","120"),x.setAttribute("role","img"),x.setAttribute("aria-label","System dependency graph"),x.style.display="block",x.setAttribute("viewBox","0 0 460 120"),x.setAttribute("preserveAspectRatio","xMinYMin meet"),H.appendChild(x),i.appendChild(H);let E=document.createElement("details");E.style.marginBottom="4px";let q=document.createElement("summary");Object.assign(q.style,{cursor:"pointer",color:b.accent,marginBottom:"4px"}),q.textContent="Timeline",E.appendChild(q);let j=document.createElementNS("http://www.w3.org/2000/svg","svg");j.setAttribute("width","100%"),j.setAttribute("height","60"),j.setAttribute("role","img"),j.setAttribute("aria-label","Resolver execution timeline"),j.style.display="block",j.setAttribute("viewBox",`0 0 ${ie} 60`),j.setAttribute("preserveAspectRatio","xMinYMin meet");let u=document.createElementNS("http://www.w3.org/2000/svg","text");u.setAttribute("x",String(ie/2)),u.setAttribute("y","30"),u.setAttribute("text-anchor","middle"),u.setAttribute("fill",b.muted),u.setAttribute("font-size","10"),u.setAttribute("font-family",b.font),u.textContent="No resolver activity yet",j.appendChild(u),E.appendChild(j),i.appendChild(E);let M=(()=>{let z=document.createElement("details");z.style.marginBottom="4px";let K=document.createElement("summary");Object.assign(K.style,{cursor:"pointer",color:b.accent,marginBottom:"4px"});let X=document.createElement("span");X.textContent="0",K.textContent="Constraints (",K.appendChild(X),K.appendChild(document.createTextNode(")")),z.appendChild(K);let J=document.createElement("div");Object.assign(J.style,{fontSize:"11px"});let Q=document.createElement("div");return Q.style.color=b.muted,Q.style.padding="4px",Q.style.fontStyle="italic",Q.textContent="Waiting for first evaluation\u2026",Q.className="dt-constraints-empty",J.appendChild(Q),z.appendChild(J),i.appendChild(z),{details:z,body:J,countSpan:X}})(),S,A,W,k;if(r){let z=document.createElement("details");z.style.marginBottom="4px";let K=document.createElement("summary");Object.assign(K.style,{cursor:"pointer",color:b.accent,marginBottom:"4px"}),W=document.createElement("span"),W.textContent="0",K.textContent="Events (",K.appendChild(W),K.appendChild(document.createTextNode(")")),z.appendChild(K),A=document.createElement("div"),Object.assign(A.style,{maxHeight:"150px",overflow:"auto",fontSize:"10px"}),A.setAttribute("role","log"),A.setAttribute("aria-live","polite"),A.tabIndex=0;let X=document.createElement("div");X.style.color=b.muted,X.style.padding="4px",X.textContent="Waiting for events...",X.className="dt-events-empty",A.appendChild(X),z.appendChild(A),i.appendChild(z),S=z,k=document.createElement("div");}else S=document.createElement("details"),A=document.createElement("div"),W=document.createElement("span"),k=document.createElement("div"),k.style.fontSize="10px",k.style.color=b.muted,k.style.marginTop="4px",k.style.fontStyle="italic",k.textContent="Enable trace: true for event log",i.appendChild(k);let L=document.createElement("div");Object.assign(L.style,{display:"flex",gap:"6px",marginTop:"6px"});let n=document.createElement("button");Object.assign(n.style,{background:"none",border:`1px solid ${b.border}`,color:b.text,cursor:"pointer",padding:"8px 12px",borderRadius:"3px",fontFamily:b.font,fontSize:"10px",minWidth:"44px",minHeight:"44px"}),n.textContent="\u23FA Record";let m=document.createElement("button");Object.assign(m.style,{background:"none",border:`1px solid ${b.border}`,color:b.text,cursor:"pointer",padding:"8px 12px",borderRadius:"3px",fontFamily:b.font,fontSize:"10px",minWidth:"44px",minHeight:"44px"}),m.textContent="\u2913 Export",L.appendChild(n),L.appendChild(m),i.appendChild(L),i.addEventListener("wheel",z=>{let K=i,X=K.scrollTop===0&&z.deltaY<0,J=K.scrollTop+K.clientHeight>=K.scrollHeight&&z.deltaY>0;(X||J)&&z.preventDefault();},{passive:false});let v=o,D=new Set;function B(){v=true,i.style.display="block",t.style.display="none",t.setAttribute("aria-expanded","true"),y.focus();}function U(){v=false,i.style.display="none",t.style.display="block",t.setAttribute("aria-expanded","false"),t.focus();}t.addEventListener("click",B),y.addEventListener("click",U);function Z(z){z.key==="Escape"&&v&&U();}i.addEventListener("keydown",Z);function re(z){z.key==="d"&&z.shiftKey&&(z.ctrlKey||z.metaKey)&&(z.preventDefault(),v?U():B());}document.addEventListener("keydown",re);function oe(){a||(document.body.appendChild(t),document.body.appendChild(i));}document.body?oe():document.addEventListener("DOMContentLoaded",oe,{once:true});function le(){a=true,t.removeEventListener("click",B),y.removeEventListener("click",U),i.removeEventListener("keydown",Z),document.removeEventListener("keydown",re),document.removeEventListener("DOMContentLoaded",oe);for(let z of D)clearTimeout(z);D.clear(),t.remove(),i.remove(),l.remove();}return {refs:{container:i,toggleBtn:t,titleEl:d,statusEl:N,factsBody:P.tbody,factsCount:P.countSpan,derivBody:F.tbody,derivCount:F.countSpan,derivSection:F.details,inflightList:O.list,inflightSection:O.details,inflightCount:O.countSpan,unmetList:Y.list,unmetSection:Y.details,unmetCount:Y.countSpan,perfSection:$,perfBody:_,historySection:R,historyLabel:f,undoBtn:w,redoBtn:g,flowSection:H,flowSvg:x,timelineSection:E,timelineSvg:j,eventsSection:S,eventsList:A,eventsCount:W,traceHint:k,recordBtn:n,exportBtn:m,constraintsSection:M.details,constraintsBody:M.body,constraintsCount:M.countSpan},destroy:le,isOpen:()=>v,flashTimers:D}}function de(e,s,o,r,a,p){let l=fe(r),t=e.get(o);if(t){let i=t.cells;if(i[1]&&(i[1].textContent=l,a&&p)){let c=i[1];c.style.background="rgba(139, 154, 255, 0.25)";let d=setTimeout(()=>{c.style.background="",p.delete(d);},300);p.add(d);}}else {t=document.createElement("tr"),t.style.borderBottom=`1px solid ${b.rowBorder}`;let i=document.createElement("td");Object.assign(i.style,{padding:"2px 4px",color:b.muted}),i.textContent=o;let c=document.createElement("td");c.style.padding="2px 4px",c.textContent=l,t.appendChild(i),t.appendChild(c),s.appendChild(t),e.set(o,t);}}function ze(e,s){let o=e.get(s);o&&(o.remove(),e.delete(s));}function be(e,s,o){if(e.inflightList.replaceChildren(),e.inflightCount.textContent=String(s.length),s.length>0)for(let r of s){let a=document.createElement("li");a.style.fontSize="11px",a.textContent=`${r.resolverId} (${r.id})`,e.inflightList.appendChild(a);}else {let r=document.createElement("li");r.style.fontSize="10px",r.style.color=b.muted,r.textContent="None",e.inflightList.appendChild(r);}if(e.unmetList.replaceChildren(),e.unmetCount.textContent=String(o.length),o.length>0)for(let r of o){let a=document.createElement("li");a.style.fontSize="11px",a.textContent=`${r.requirement.type} from ${r.fromConstraint}`,e.unmetList.appendChild(a);}else {let r=document.createElement("li");r.style.fontSize="10px",r.style.color=b.muted,r.textContent="None",e.unmetList.appendChild(r);}}function ye(e,s,o){let r=s===0&&o===0;e.statusEl.style.color=r?b.green:b.yellow,e.statusEl.textContent=r?"Settled":"Working...",e.toggleBtn.textContent=r?"Directive":"Directive...",e.toggleBtn.setAttribute("aria-label",`Open Directive DevTools${r?"":" (system working)"}`);}function Ee(e,s,o,r){let a=Object.keys(o.derive);if(e.derivCount.textContent=String(a.length),a.length===0){s.clear(),e.derivBody.replaceChildren();let l=document.createElement("tr"),t=document.createElement("td");t.colSpan=2,t.style.color=b.muted,t.style.fontSize="10px",t.textContent="No derivations defined",l.appendChild(t),e.derivBody.appendChild(l);return}let p=new Set(a);for(let[l,t]of s)p.has(l)||(t.remove(),s.delete(l));for(let l of a){let t;try{t=fe(o.read(l));}catch{t="<error>";}de(s,e.derivBody,l,t,true,r);}}function We(e,s,o,r){let a=e.eventsList.querySelector(".dt-events-empty");a&&a.remove();let p=document.createElement("div");Object.assign(p.style,{padding:"2px 4px",borderBottom:`1px solid ${b.rowBorder}`,fontFamily:"inherit"});let l=new Date,t=`${String(l.getHours()).padStart(2,"0")}:${String(l.getMinutes()).padStart(2,"0")}:${String(l.getSeconds()).padStart(2,"0")}.${String(l.getMilliseconds()).padStart(3,"0")}`,i;try{let I=JSON.stringify(o);i=ee(I,60);}catch{i="{}";}let c=document.createElement("span");c.style.color=b.closeBtn,c.textContent=t;let d=document.createElement("span");d.style.color=b.accent,d.textContent=` ${s} `;let y=document.createElement("span");for(y.style.color=b.muted,y.textContent=i,p.appendChild(c),p.appendChild(d),p.appendChild(y),e.eventsList.prepend(p);e.eventsList.childElementCount>He;)e.eventsList.lastElementChild?.remove();e.eventsCount.textContent=String(r);}function Ue(e,s){e.perfBody.replaceChildren();let o=s.reconcileCount>0?(s.reconcileTotalMs/s.reconcileCount).toFixed(1):"\u2014",r=[`Reconciles: ${s.reconcileCount} (avg ${o}ms)`,`Effects: ${s.effectRunCount} run, ${s.effectErrorCount} errors`];for(let a of r){let p=document.createElement("div");p.style.marginBottom="2px",p.textContent=a,e.perfBody.appendChild(p);}if(s.resolverStats.size>0){let a=document.createElement("div");a.style.marginTop="4px",a.style.marginBottom="2px",a.style.color=b.accent,a.textContent="Resolvers:",e.perfBody.appendChild(a);let p=[...s.resolverStats.entries()].sort((l,t)=>t[1].totalMs-l[1].totalMs);for(let[l,t]of p){let i=t.count>0?(t.totalMs/t.count).toFixed(1):"0",c=document.createElement("div");c.style.paddingLeft="8px",c.textContent=`${l}: ${t.count}x, avg ${i}ms${t.errors>0?`, ${t.errors} err`:""}`,t.errors>0&&(c.style.color=b.red),e.perfBody.appendChild(c);}}}function Ce(e,s){let o=s.history;if(!o){e.historySection.style.display="none";return}e.historySection.style.display="flex";let r=o.currentIndex,a=o.snapshots.length;e.historyLabel.textContent=a>0?`${r+1} / ${a}`:"0 snapshots";let p=r>0,l=r<a-1;e.undoBtn.disabled=!p,e.undoBtn.style.opacity=p?"1":"0.4",e.redoBtn.disabled=!l,e.redoBtn.style.opacity=l?"1":"0.4";}function Ge(e,s){e.undoBtn.addEventListener("click",()=>{s.history&&s.history.currentIndex>0&&s.history.goBack(1);}),e.redoBtn.addEventListener("click",()=>{s.history&&s.history.currentIndex<s.history.snapshots.length-1&&s.history.goForward(1);});}var qe=Object.assign(Object.create(null),{$eq:"=",$ne:"\u2260",$gt:">",$gte:"\u2265",$lt:"<",$lte:"\u2264",$in:"\u2208",$nin:"\u2209",$exists:"exists",$between:"in",$startsWith:"starts with",$endsWith:"ends with",$contains:"contains",$matches:"matches",$changed:"changed"});function at(e){return Object.hasOwn(qe,e)?qe[e]:e}function Fe(e){return e instanceof RegExp?ee(String(e),40):fe(e)}var ct=new Set(["$all","$any","$not"]);function Ye(e){let s=document.createElement("li"),o=e.pass?"\u2713":"\u2717";if(s.style.color=e.pass?b.green:b.red,s.style.listStyle="none",ct.has(e.op)){let r=e.path?` @ ${e.path}`:"";if(s.textContent=`${o} ${e.op}${r}`,e.children&&e.children.length>0){let a=document.createElement("ul");Object.assign(a.style,{margin:"0",paddingLeft:"14px",listStyle:"none"});for(let p of e.children)a.appendChild(Ye(p));s.appendChild(a);}}else {let r=at(e.op),a=Fe(e.expected);if(e.pass)s.textContent=`${o} ${e.path} ${r} ${a}`;else {let p=Fe(e.actual);s.textContent=`${o} ${e.path} ${r} ${a} (actual: ${p})`;}}return s}function Xe(e,s,o){let r=s.get(o);if(r&&(r.remove(),s.delete(o),e.constraintsCount.textContent=String(s.size)),s.size===0&&!e.constraintsBody.querySelector(".dt-constraints-empty")){let a=document.createElement("div");a.style.color=b.muted,a.style.padding="4px",a.style.fontStyle="italic",a.textContent="Waiting for first evaluation\u2026",a.className="dt-constraints-empty",e.constraintsBody.appendChild(a);}}function Ke(e,s){let o=e.constraintsBody.querySelector(".dt-constraints-empty");o&&(o.textContent=s?"Waiting for first evaluation\u2026":"This system has no constraints");}function Je(e,s,o,r,a,p){let l=e.constraintsBody.querySelector(".dt-constraints-empty");l&&l.remove();let t=s.get(o);t||(t=document.createElement("div"),Object.assign(t.style,{marginBottom:"6px",paddingBottom:"4px",borderBottom:`1px solid ${b.rowBorder}`}),s.set(o,t),e.constraintsBody.appendChild(t),e.constraintsCount.textContent=String(s.size)),t.replaceChildren();let i=document.createElement("div");Object.assign(i.style,{fontWeight:"bold",color:r?b.green:b.muted});let c=r?"\u2713":"\u2717";if(i.textContent=p?`${c} ${o} (${p})`:`${c} ${o}`,t.appendChild(i),a&&a.length>0){let d=document.createElement("ul");Object.assign(d.style,{margin:"2px 0 0 0",paddingLeft:"14px",listStyle:"none"});for(let y of a)d.appendChild(Ye(y));t.appendChild(d);}else if(!a){let d=document.createElement("div");Object.assign(d.style,{color:b.muted,fontSize:"10px",fontStyle:"italic",paddingLeft:"14px"}),d.textContent="function-form when (no clause tree)",t.appendChild(d);}}var we=new WeakMap;function lt(e,s,o,r,a,p){return [e.join(","),s.join(","),o.map(l=>`${l.id}:${l.active}`).join(","),[...r.entries()].map(([l,t])=>`${l}:${t.status}:${t.type}`).join(","),a.join(","),p.join(",")].join("|")}function ut(e,s,o,r,a){for(let p of o){let l=e.nodes.get(`0:${p}`);if(!l)continue;let t=s.recentlyChangedFacts.has(p);l.rect.setAttribute("fill",t?b.text+"33":"none"),l.rect.setAttribute("stroke-width",t?"2":"1");}for(let p of r){let l=e.nodes.get(`1:${p}`);if(!l)continue;let t=s.recentlyComputedDerivations.has(p);l.rect.setAttribute("fill",t?b.accent+"33":"none"),l.rect.setAttribute("stroke-width",t?"2":"1");}for(let p of a){let l=e.nodes.get(`2:${p}`);if(!l)continue;let t=s.recentlyActiveConstraints.has(p),i=l.rect.getAttribute("stroke")??b.muted;l.rect.setAttribute("fill",t?i+"33":"none"),l.rect.setAttribute("stroke-width",t?"2":"1");}}function Me(e,s,o){let r=se(s);if(!r)return;let a;try{a=Object.keys(s.facts.$store.toObject());}catch{a=[];}let p=Object.keys(s.derive),l=r.constraints,t=r.unmet,i=r.inflight,c=Object.keys(r.resolvers),d=new Map;for(let u of t)d.set(u.id,{type:u.requirement.type,fromConstraint:u.fromConstraint,status:"unmet"});for(let u of i)d.set(u.id,{type:u.resolverId,fromConstraint:"",status:"inflight"});if(a.length===0&&p.length===0&&l.length===0&&c.length===0){we.delete(e.flowSvg),e.flowSvg.replaceChildren(),e.flowSvg.setAttribute("viewBox","0 0 460 40");let u=document.createElementNS("http://www.w3.org/2000/svg","text");u.setAttribute("x","230"),u.setAttribute("y","24"),u.setAttribute("text-anchor","middle"),u.setAttribute("fill",b.muted),u.setAttribute("font-size","10"),u.setAttribute("font-family",b.font),u.textContent="No system topology",e.flowSvg.appendChild(u);return}let y=i.map(u=>u.resolverId).sort(),I=lt(a,p,l,d,c,y),N=we.get(e.flowSvg);if(N&&N.fingerprint===I){ut(N,o,a,p,l.map(u=>u.id));return}let R=G.nodeW+G.colGap,w=[5,5+R,5+R*2,5+R*3,5+R*4],g=w[4]+G.nodeW+5;function f(u){let M=G.startY+12;return u.map(S=>{let A={...S,y:M};return M+=G.nodeH+G.nodeGap,A})}let C=f(a.map(u=>{let M=r.facts.find(S=>S.key===u);return {id:u,label:ee(M?.meta?.label??u,G.labelMaxChars)}})),T=f(p.map(u=>{let M=r.derivations.find(S=>S.id===u);return {id:u,label:ee(M?.meta?.label??u,G.labelMaxChars)}})),P=f(l.map(u=>({id:u.id,label:ee(u.meta?.label??u.id,G.labelMaxChars),active:u.active,priority:u.priority}))),F=f([...d.entries()].map(([u,M])=>({id:u,type:M.type,fromConstraint:M.fromConstraint,status:M.status}))),O=f(c.map(u=>{let M=r.resolverDefs.find(S=>S.id===u);return {id:u,label:ee(M?.meta?.label??u,G.labelMaxChars)}})),Y=Math.max(C.length,T.length,P.length,F.length,O.length,1),$=G.startY+12+Y*(G.nodeH+G.nodeGap)+8;e.flowSvg.replaceChildren(),e.flowSvg.setAttribute("viewBox",`0 0 ${g} ${$}`),e.flowSvg.setAttribute("aria-label",`Dependency graph: ${a.length} facts, ${p.length} derivations, ${l.length} constraints, ${d.size} requirements, ${c.length} resolvers`);let V=["Facts","Derivations","Constraints","Reqs","Resolvers"];for(let[u,M]of V.entries()){let S=document.createElementNS("http://www.w3.org/2000/svg","text");S.setAttribute("x",String(w[u]??0)),S.setAttribute("y","10"),S.setAttribute("fill",b.accent),S.setAttribute("font-size",String(G.fontSize)),S.setAttribute("font-family",b.font),S.textContent=M,e.flowSvg.appendChild(S);}let _={fingerprint:I,nodes:new Map};function H(u,M,S,A,W,k,L,n,m){let v=document.createElementNS("http://www.w3.org/2000/svg","g");if(m){let U=document.createElementNS("http://www.w3.org/2000/svg","title");U.textContent=m,v.appendChild(U);}let D=document.createElementNS("http://www.w3.org/2000/svg","rect");D.setAttribute("x",String(M)),D.setAttribute("y",String(S-6)),D.setAttribute("width",String(G.nodeW)),D.setAttribute("height",String(G.nodeH)),D.setAttribute("rx","3"),D.setAttribute("fill",n?k+"33":"none"),D.setAttribute("stroke",k),D.setAttribute("stroke-width",n?"2":"1"),D.setAttribute("opacity",L?"0.35":"1"),v.appendChild(D);let B=document.createElementNS("http://www.w3.org/2000/svg","text");return B.setAttribute("x",String(M+4)),B.setAttribute("y",String(S+4)),B.setAttribute("fill",k),B.setAttribute("font-size",String(G.fontSize)),B.setAttribute("font-family",b.font),B.setAttribute("opacity",L?"0.35":"1"),B.textContent=W,v.appendChild(B),e.flowSvg.appendChild(v),_.nodes.set(`${u}:${A}`,{g:v,rect:D,text:B}),{midX:M+G.nodeW/2,midY:S}}function h(u,M,S,A,W,k){let L=document.createElementNS("http://www.w3.org/2000/svg","line");L.setAttribute("x1",String(u)),L.setAttribute("y1",String(M)),L.setAttribute("x2",String(S)),L.setAttribute("y2",String(A)),L.setAttribute("stroke",W),L.setAttribute("stroke-width","1"),L.setAttribute("stroke-dasharray","3,2"),L.setAttribute("opacity","0.7"),e.flowSvg.appendChild(L);}let x=new Map,E=new Map,q=new Map,j=new Map;for(let u of C){let M=o.recentlyChangedFacts.has(u.id),S=r.facts.find(W=>W.key===u.id)?.meta,A=H(0,w[0],u.y,u.id,u.label,b.text,false,M,S?.description);x.set(u.id,A);}for(let u of T){let M=o.recentlyComputedDerivations.has(u.id),S=r.derivations.find(W=>W.id===u.id)?.meta,A=H(1,w[1],u.y,u.id,u.label,b.accent,false,M,S?.description);E.set(u.id,A);}for(let u of P){let M=o.recentlyActiveConstraints.has(u.id),S=l.find(W=>W.id===u.id)?.meta,A=H(2,w[2],u.y,u.id,u.label,S?.color??(u.active?b.yellow:b.muted),!u.active,M,S?.description);q.set(u.id,A);}for(let u of F){let M=u.status==="unmet"?b.red:b.yellow,S=H(3,w[3],u.y,u.id,ee(u.type,G.labelMaxChars),M,false,false);j.set(u.id,S);}for(let u of O){let M=i.some(A=>A.resolverId===u.id),S=r.resolverDefs.find(A=>A.id===u.id)?.meta;H(4,w[4],u.y,u.id,u.label,S?.color??(M?b.green:b.muted),!M,false,S?.description);}for(let u of T){let M=o.derivationDeps.get(u.id),S=E.get(u.id);if(M&&S)for(let A of M){let W=x.get(A);W&&h(W.midX+G.nodeW/2,W.midY,S.midX-G.nodeW/2,S.midY,b.accent);}}for(let u of F){let M=q.get(u.fromConstraint),S=j.get(u.id);M&&S&&h(M.midX+G.nodeW/2,M.midY,S.midX-G.nodeW/2,S.midY,b.muted);}for(let u of i){let M=j.get(u.id);if(M){let S=O.find(A=>A.id===u.resolverId);S&&h(M.midX+G.nodeW/2,M.midY,w[4],S.y,b.green);}}we.set(e.flowSvg,_);}function Qe(e){e.animationTimer&&clearTimeout(e.animationTimer),e.animationTimer=setTimeout(()=>{e.recentlyChangedFacts.clear(),e.recentlyComputedDerivations.clear(),e.recentlyActiveConstraints.clear(),e.animationTimer=null;},600);}function Ze(e,s){let o=s.entries.toArray();if(o.length===0)return;e.timelineSvg.replaceChildren();let r=Number.POSITIVE_INFINITY,a=Number.NEGATIVE_INFINITY;for(let R of o)R.startMs<r&&(r=R.startMs),R.endMs>a&&(a=R.endMs);let p=performance.now();for(let R of s.inflight.values())R<r&&(r=R),p>a&&(a=p);let l=a-r||1,t=ie-ce-10,i=[],c=new Set;for(let R of o)c.has(R.resolver)||(c.add(R.resolver),i.push(R.resolver));for(let R of s.inflight.keys())c.has(R)||(c.add(R),i.push(R));let y=i.slice(-12),I=ae*y.length+20;e.timelineSvg.setAttribute("viewBox",`0 0 ${ie} ${I}`),e.timelineSvg.setAttribute("height",String(Math.min(I,200)));let N=5;for(let R=0;R<=N;R++){let w=ce+t*R/N,g=l*R/N,f=document.createElementNS("http://www.w3.org/2000/svg","text");f.setAttribute("x",String(w)),f.setAttribute("y","8"),f.setAttribute("fill",b.muted),f.setAttribute("font-size","6"),f.setAttribute("font-family",b.font),f.setAttribute("text-anchor","middle"),f.textContent=g<1e3?`${g.toFixed(0)}ms`:`${(g/1e3).toFixed(1)}s`,e.timelineSvg.appendChild(f);let C=document.createElementNS("http://www.w3.org/2000/svg","line");C.setAttribute("x1",String(w)),C.setAttribute("y1","10"),C.setAttribute("x2",String(w)),C.setAttribute("y2",String(I)),C.setAttribute("stroke",b.border),C.setAttribute("stroke-width","0.5"),e.timelineSvg.appendChild(C);}for(let R=0;R<y.length;R++){let w=y[R],g=12+R*ae,f=R%Se.length,C=Se[f],T=document.createElementNS("http://www.w3.org/2000/svg","text");T.setAttribute("x",String(ce-4)),T.setAttribute("y",String(g+ae/2+3)),T.setAttribute("fill",b.muted),T.setAttribute("font-size","7"),T.setAttribute("font-family",b.font),T.setAttribute("text-anchor","end"),T.textContent=ee(w,12),e.timelineSvg.appendChild(T);let P=o.filter(O=>O.resolver===w);for(let O of P){let Y=ce+(O.startMs-r)/l*t,$=Math.max((O.endMs-O.startMs)/l*t,he),V=document.createElementNS("http://www.w3.org/2000/svg","rect");V.setAttribute("x",String(Y)),V.setAttribute("y",String(g+2)),V.setAttribute("width",String($)),V.setAttribute("height",String(ae-4)),V.setAttribute("rx","2"),V.setAttribute("fill",O.error?b.red:C),V.setAttribute("opacity","0.8");let _=document.createElementNS("http://www.w3.org/2000/svg","title"),H=O.endMs-O.startMs;_.textContent=`${w}: ${H.toFixed(1)}ms${O.error?" (error)":""}`,V.appendChild(_),e.timelineSvg.appendChild(V);}let F=s.inflight.get(w);if(F!==void 0){let O=ce+(F-r)/l*t,Y=Math.max((p-F)/l*t,he),$=document.createElementNS("http://www.w3.org/2000/svg","rect");$.setAttribute("x",String(O)),$.setAttribute("y",String(g+2)),$.setAttribute("width",String(Y)),$.setAttribute("height",String(ae-4)),$.setAttribute("rx","2"),$.setAttribute("fill",C),$.setAttribute("opacity","0.4"),$.setAttribute("stroke",C),$.setAttribute("stroke-width","1"),$.setAttribute("stroke-dasharray","3,2");let V=document.createElementNS("http://www.w3.org/2000/svg","title");V.textContent=`${w}: inflight ${(p-F).toFixed(0)}ms`,$.appendChild(V),e.timelineSvg.appendChild($);}}e.timelineSvg.setAttribute("aria-label",`Timeline: ${o.length} resolver executions across ${y.length} resolvers`);}function dt(){if(typeof window>"u")return {systems:new Map,getSystem:()=>null,getSystems:()=>[],inspect:()=>null,getEvents:()=>[],explain:()=>null,exportSession:()=>null,importSession:()=>false,clearEvents:()=>{},subscribe:()=>()=>{}};if(!window.__DIRECTIVE__){let e=new Map,s={systems:e,getSystem(o){return o?e.get(o)?.system??null:e.values().next().value?.system??null},getSystems(){return [...e.keys()]},inspect(o){let r=this.getSystem(o),a=o?e.get(o):e.values().next().value,p=r?.inspect()??null;return p&&a&&(p.resolverStats=a.resolverStats?Object.fromEntries(a.resolverStats):{}),p},getEvents(o){return o?e.get(o)?.events.toArray()??[]:e.values().next().value?.events.toArray()??[]},explain(o,r){return this.getSystem(r)?.explain(o)??null},subscribe(o,r){let a=r?e.get(r):e.values().next().value;if(!a){let p=false,t=setInterval(()=>{let c=r?e.get(r):e.values().next().value;c&&!p&&(p=true,c.subscribers.add(o));},100),i=setTimeout(()=>clearInterval(t),1e4);return ()=>{clearInterval(t),clearTimeout(i);for(let c of e.values())c.subscribers.delete(o);}}return a.subscribers.add(o),()=>{a.subscribers.delete(o);}},exportSession(o){let r=o?e.get(o):e.values().next().value;return r?JSON.stringify({version:1,name:o??e.keys().next().value??"default",exportedAt:Date.now(),events:r.events.toArray()}):null},importSession(o,r){try{if(o.length>10*1024*1024)return !1;let a=JSON.parse(o);if(!a||typeof a!="object"||Array.isArray(a)||!Array.isArray(a.events))return !1;let p=r?e.get(r):e.values().next().value;if(!p)return !1;let l=p.maxEvents,t=a.events,i=t.length>l?t.length-l:0;p.events.clear();for(let c=i;c<t.length;c++){let d=t[c];d&&typeof d=="object"&&!Array.isArray(d)&&typeof d.timestamp=="number"&&typeof d.type=="string"&&d.type!=="__proto__"&&d.type!=="constructor"&&d.type!=="prototype"&&p.events.push({timestamp:d.timestamp,type:d.type,data:d.data??null});}return !0}catch{return false}},clearEvents(o){let r=o?e.get(o):e.values().next().value;r&&r.events.clear();}};return Object.defineProperty(window,"__DIRECTIVE__",{value:s,writable:false,configurable:ge(),enumerable:true}),s}return window.__DIRECTIVE__}function mt(e={}){let{name:s="default",trace:o=false,maxEvents:r,panel:a=false,position:p="bottom-right",defaultOpen:l=false}=e,t=Pe(r),i=dt(),c={system:null,events:new ue(t),maxEvents:t,subscribers:new Set,resolverStats:new Map};i.systems.set(s,c);let d=(n,m)=>{let v={timestamp:Date.now(),type:n,data:m};o&&c.events.push(v);for(let D of c.subscribers)try{D(v);}catch{}},y=null,I=new Map,N=new Map,R=new Map,w=Ie(),g=_e(),f=je(),C=$e(),T=a&&typeof window<"u"&&typeof document<"u"&&ge(),P=null,F=0,O=1,Y=2,$=4,V=8,_=16,H=32,h=64,x=128,E=256,q=new Map,j=new Set,u=new Map,M=new Set,S=null;function A(n){F|=n,P===null&&typeof requestAnimationFrame<"u"&&(P=requestAnimationFrame(W));}function W(){if(P=null,!y||!c.system){F=0;return}let n=y.refs,m=c.system,v=F;if(F=0,v&O){for(let D of j)ze(I,D);j.clear();for(let[D,{value:B,flash:U}]of q)de(I,n.factsBody,D,B,U,y.flashTimers);q.clear(),n.factsCount.textContent=String(I.size);}if(v&Y&&Ee(n,N,m,y.flashTimers),v&E){for(let D of M)Xe(n,R,D);M.clear();for(let[D,{active:B,whenExplain:U,label:Z}]of u)Je(n,R,D,B,U,Z);u.clear();}if(v&V)if(S)ye(n,S.inflight.length,S.unmet.length);else {let D=se(m);D&&ye(n,D.inflight.length,D.unmet.length);}if(v&$)if(S)be(n,S.inflight,S.unmet);else {let D=se(m);D&&be(n,D.inflight,D.unmet);}v&_&&Ue(n,w),v&H&&Me(n,m,g),v&h&&Ce(n,m),v&x&&Ze(n,C);}function k(n,m){y&&o&&We(y.refs,n,m,c.events.size);}function L(n,m){f.isRecording&&f.recordedEvents.length<Ne&&f.recordedEvents.push({timestamp:Date.now(),type:n,data:Le(m)});}return {name:"devtools",onInit:n=>{if(c.system=n,d("init",{}),typeof window<"u"&&console.log(`%c[Directive Devtools]%c System "${s}" initialized. Access via window.__DIRECTIVE__`,"color: #7c3aed; font-weight: bold","color: inherit"),T){let m=c.system;y=Ve(s,p,l,o);let v=y.refs;try{let U=m.facts.$store.toObject();for(let[Z,re]of Object.entries(U))de(I,v.factsBody,Z,re,!1);v.factsCount.textContent=String(Object.keys(U).length);}catch{}Ee(v,N,m);let D=se(m);D&&(ye(v,D.inflight.length,D.unmet.length),be(v,D.inflight,D.unmet)),Ce(v,m),Ge(v,m),Me(v,m,g);let B=(D?.constraints?.length??0)>0;Ke(v,B),v.recordBtn.addEventListener("click",()=>{if(f.isRecording=!f.isRecording,v.recordBtn.textContent=f.isRecording?"\u23F9 Stop":"\u23FA Record",v.recordBtn.style.color=f.isRecording?b.red:b.text,f.isRecording){f.recordedEvents=[],f.snapshots=[];try{f.snapshots.push({timestamp:Date.now(),facts:m.facts.$store.toObject()});}catch{}}}),v.exportBtn.addEventListener("click",()=>{let U=f.recordedEvents.length>0?f.recordedEvents:c.events.toArray(),Z=JSON.stringify({version:1,name:s,exportedAt:Date.now(),events:U,snapshots:f.snapshots},null,2),re=new Blob([Z],{type:"application/json"}),oe=URL.createObjectURL(re),le=document.createElement("a");le.href=oe,le.download=`directive-session-${s}-${Date.now()}.json`,le.click(),URL.revokeObjectURL(oe);});}},onStart:n=>{d("start",{}),k("start",{}),L("start",{});},onStop:n=>{d("stop",{}),k("stop",{}),L("stop",{});},onDestroy:n=>{d("destroy",{}),i.systems.delete(s),P!==null&&typeof cancelAnimationFrame<"u"&&(cancelAnimationFrame(P),P=null),g.animationTimer&&clearTimeout(g.animationTimer),y&&(y.destroy(),y=null,I.clear(),N.clear(),R.clear());},onFactSet:(n,m,v)=>{d("fact.set",{key:n,value:m,prev:v}),L("fact.set",{key:n,value:m,prev:v}),g.recentlyChangedFacts.add(n),y&&c.system&&(q.set(n,{value:m,flash:true}),j.delete(n),A(O),k("fact.set",{key:n,value:m}));},onFactDelete:(n,m)=>{d("fact.delete",{key:n,prev:m}),L("fact.delete",{key:n,prev:m}),y&&(j.add(n),q.delete(n),A(O),k("fact.delete",{key:n}));},onFactsBatch:n=>{if(d("facts.batch",{changes:n}),L("facts.batch",{count:n.length}),y&&c.system){for(let m of n)m.type==="delete"?(j.add(m.key),q.delete(m.key)):(g.recentlyChangedFacts.add(m.key),q.set(m.key,{value:m.value,flash:true}),j.delete(m.key));A(O),k("facts.batch",{count:n.length});}},onDerivationCompute:(n,m,v)=>{d("derivation.compute",{id:n,value:m,deps:v}),L("derivation.compute",{id:n,deps:v}),g.derivationDeps.set(n,v),g.recentlyComputedDerivations.add(n),k("derivation.compute",{id:n,deps:v});},onDerivationInvalidate:n=>{d("derivation.invalidate",{id:n}),k("derivation.invalidate",{id:n});},onReconcileStart:n=>{d("reconcile.start",{}),w.lastReconcileStartMs=performance.now(),k("reconcile.start",{}),L("reconcile.start",{});},onReconcileEnd:n=>{if(d("reconcile.end",n),L("reconcile.end",{unmet:n.unmet.length,inflight:n.inflight.length,completed:n.completed.length}),w.lastReconcileStartMs>0){let m=performance.now()-w.lastReconcileStartMs;w.reconcileCount++,w.reconcileTotalMs+=m,w.lastReconcileStartMs=0;}if(f.isRecording&&c.system&&f.snapshots.length<Be)try{f.snapshots.push({timestamp:Date.now(),facts:c.system.facts.$store.toObject()});}catch{}y&&c.system&&(S=n,Qe(g),A(Y|V|$|_|H|h),k("reconcile.end",{unmet:n.unmet.length,inflight:n.inflight.length}));},onConstraintEvaluate:(n,m,v)=>{let D=c.system?.meta?.constraint(n)?.label,B=D?{id:n,active:m,label:D}:{id:n,active:m},U=v?{...B,whenExplain:v}:B;d("constraint.evaluate",U),L("constraint.evaluate",U),m?(g.activeConstraints.add(n),g.recentlyActiveConstraints.add(n)):g.activeConstraints.delete(n),y&&(u.set(n,{active:m,whenExplain:v,label:D}),M.delete(n),A(E)),k("constraint.evaluate",{id:n,active:m});},onConstraintError:(n,m)=>{d("constraint.error",{id:n,error:String(m)}),k("constraint.error",{id:n,error:String(m)});},onRequirementCreated:n=>{d("requirement.created",{id:n.id,type:n.requirement.type}),L("requirement.created",{id:n.id,type:n.requirement.type}),k("requirement.created",{id:n.id,type:n.requirement.type});},onRequirementMet:(n,m)=>{d("requirement.met",{id:n.id,byResolver:m}),L("requirement.met",{id:n.id,byResolver:m}),k("requirement.met",{id:n.id,byResolver:m});},onRequirementCanceled:n=>{d("requirement.canceled",{id:n.id}),L("requirement.canceled",{id:n.id}),k("requirement.canceled",{id:n.id});},onResolverStart:(n,m)=>{let v=c.system?.meta?.resolver(n)?.label,D={resolver:n,requirementId:m.id},B=v?{...D,label:v}:D;d("resolver.start",B),L("resolver.start",B),C.inflight.set(n,performance.now()),y&&c.system&&(A($|V|x),k("resolver.start",{resolver:n,requirementId:m.id}));},onResolverComplete:(n,m,v)=>{let D=c.system?.meta?.resolver(n)?.label;d("resolver.complete",{resolver:n,requirementId:m.id,duration:v,...D?{label:D}:{}}),L("resolver.complete",{resolver:n,requirementId:m.id,duration:v});let B=c.resolverStats.get(n)??{count:0,totalMs:0,errors:0};if(B.count++,B.totalMs+=v,c.resolverStats.set(n,B),c.resolverStats.size>xe){let Z=c.resolverStats.keys().next().value;Z!==void 0&&c.resolverStats.delete(Z);}w.resolverStats.set(n,{...B});let U=C.inflight.get(n);C.inflight.delete(n),U!==void 0&&C.entries.push({resolver:n,startMs:U,endMs:performance.now(),error:false}),y&&c.system&&(A($|V|_|x),k("resolver.complete",{resolver:n,duration:v}));},onResolverError:(n,m,v)=>{d("resolver.error",{resolver:n,requirementId:m.id,error:String(v)}),L("resolver.error",{resolver:n,requirementId:m.id,error:String(v)});let D=c.resolverStats.get(n)??{count:0,totalMs:0,errors:0};if(D.errors++,c.resolverStats.set(n,D),c.resolverStats.size>xe){let U=c.resolverStats.keys().next().value;U!==void 0&&c.resolverStats.delete(U);}w.resolverStats.set(n,{...D});let B=C.inflight.get(n);C.inflight.delete(n),B!==void 0&&C.entries.push({resolver:n,startMs:B,endMs:performance.now(),error:true}),y&&c.system&&(A($|V|_|x),k("resolver.error",{resolver:n,error:String(v)}));},onResolverRetry:(n,m,v)=>{d("resolver.retry",{resolver:n,requirementId:m.id,attempt:v}),L("resolver.retry",{resolver:n,requirementId:m.id,attempt:v}),k("resolver.retry",{resolver:n,attempt:v});},onResolverCancel:(n,m)=>{d("resolver.cancel",{resolver:n,requirementId:m.id}),L("resolver.cancel",{resolver:n,requirementId:m.id}),C.inflight.delete(n),k("resolver.cancel",{resolver:n});},onResolverWriteRejected:n=>{let m=n.kind==="summary"?{kind:n.kind,resolver:n.resolver,requirementId:n.req.id,reason:n.reason,dropped:n.dropped}:{kind:n.kind,resolver:n.resolver,requirementId:n.req.id,reason:n.reason,fact:n.fact,expected:n.expected,actual:n.actual};d("resolver.write.rejected",m),L("resolver.write.rejected",m),k("resolver.write.rejected",n.kind==="summary"?{resolver:n.resolver,dropped:n.dropped}:{resolver:n.resolver,fact:n.fact});},onEffectRun:n=>{let m=c.system?.meta?.effect(n)?.label,v=m?{id:n,label:m}:{id:n};d("effect.run",v),L("effect.run",v),w.effectRunCount++,k("effect.run",{id:n});},onEffectError:(n,m)=>{d("effect.error",{id:n,error:String(m)}),w.effectErrorCount++,k("effect.error",{id:n,error:String(m)});},onSnapshot:n=>{d("timetravel.snapshot",{id:n.id,trigger:n.trigger}),y&&c.system&&A(h),k("timetravel.snapshot",{id:n.id,trigger:n.trigger});},onHistoryNavigate:(n,m)=>{if(d("timetravel.jump",{from:n,to:m}),L("timetravel.jump",{from:n,to:m}),y&&c.system){let v=c.system;try{let D=v.facts.$store.toObject();I.clear(),y.refs.factsBody.replaceChildren();for(let[B,U]of Object.entries(D))de(I,y.refs.factsBody,B,U,!1);y.refs.factsCount.textContent=String(Object.keys(D).length);}catch{}N.clear(),g.derivationDeps.clear(),y.refs.derivBody.replaceChildren(),R.clear(),y.refs.constraintsBody.replaceChildren(),y.refs.constraintsCount.textContent="0",S=null,A(Y|V|$|H|h),k("timetravel.jump",{from:n,to:m});}},onError:n=>{d("error",{source:n.source,sourceId:n.sourceId,message:n.message}),L("error",{source:n.source,message:n.message}),k("error",{source:n.source,message:n.message});},onErrorRecovery:(n,m)=>{d("error.recovery",{source:n.source,sourceId:n.sourceId,strategy:m}),k("error.recovery",{source:n.source,strategy:m});},onTraceComplete:n=>{d("trace.complete",{id:n.id,status:n.status,facts:n.factChanges.length,constraints:n.constraintsHit.length,requirements:n.requirementsAdded.length,resolvers:n.resolversStarted.length,effects:n.effectsRun.length}),k("trace.complete",{id:n.id});},onDefinitionRegister:(n,m)=>{d("definition.register",{type:n,id:m}),L("definition.register",{type:n,id:m}),k("definition.register",{type:n,id:m});},onDefinitionAssign:(n,m)=>{d("definition.assign",{type:n,id:m}),L("definition.assign",{type:n,id:m}),k("definition.assign",{type:n,id:m});},onDefinitionUnregister:(n,m)=>{d("definition.unregister",{type:n,id:m}),L("definition.unregister",{type:n,id:m}),k("definition.unregister",{type:n,id:m}),n==="constraint"&&y&&(M.add(m),u.delete(m),A(E));},onDefinitionCall:(n,m,v)=>{d("definition.call",{type:n,id:m,props:v}),L("definition.call",{type:n,id:m,props:v}),k("definition.call",{type:n,id:m,props:v});}}}var tt="directive-devtools-event",et=new Set(["__proto__","constructor","prototype"]),pt=Math.random().toString(36).slice(2,8);function gt(){if(typeof window<"u"){let e=`__DIRECTIVE_BRIDGE_ID_${pt}__`,s=window,o=s[e]??0;return s[e]=o+1,o+1}return 1}function ft(e){let s=false;for(let r of et)if(r in e){s=true;break}if(!s)return e;let o=Object.create(null);for(let[r,a]of Object.entries(e))et.has(r)||(o[r]=a);return o}function bt(e){if(!(typeof window>"u"))try{let s=ft(e),o={id:gt(),timestamp:Date.now(),snapshotId:null,...s};window.dispatchEvent(new CustomEvent(tt,{detail:o}));}catch{}}function yt(e){let{storage:s,key:o,include:r,exclude:a=[],debounce:p=100,onRestore:l,onSave:t,onError:i}=e,c=null,d=null,y=new Set,I=g=>a.includes(g)?false:r?r.includes(g):true,N=()=>{try{let g=s.getItem(o);if(!g)return null;let f$1=JSON.parse(g);return typeof f$1!="object"||f$1===null?null:f(f$1)?f$1:(i?.(new Error("Potential prototype pollution detected in stored data")),null)}catch(g){return i?.(g instanceof Error?g:new Error(String(g))),null}},R=()=>{if(d)try{let g={};for(let f of y)I(f)&&(g[f]=d.facts[f]);s.setItem(o,JSON.stringify(g)),t?.(g);}catch(g){i?.(g instanceof Error?g:new Error(String(g)));}},w=()=>{c&&clearTimeout(c),c=setTimeout(R,p);};return {name:"persistence",onInit:g=>{d=g;let f=N();f&&(d.facts.$store.batch(()=>{for(let[C,T]of Object.entries(f))I(C)&&(d.facts[C]=T,y.add(C));}),l?.(f));},onDestroy:()=>{c&&clearTimeout(c),R();},onFactSet:g=>{y.add(g),I(g)&&w();},onFactDelete:g=>{y.delete(g),I(g)&&w();},onFactsBatch:g=>{let f=false;for(let C of g)C.type==="set"?y.add(C.key):y.delete(C.key),I(C.key)&&(f=true);f&&w();}}}function vt(e={}){let{onSlowConstraint:s,onSlowResolver:o,slowConstraintThresholdMs:r=16,slowResolverThresholdMs:a=1e3}=e,p=new Map,l=new Map,t=new Map,i={runs:0,totalDurationMs:0,avgDurationMs:0,maxDurationMs:0},c=0,d=0,y=0;function I(g){let f=p.get(g);return f||(f={evaluations:0,totalDurationMs:0,avgDurationMs:0,maxDurationMs:0,lastEvaluatedAt:0},p.set(g,f)),f}function N(g){let f=l.get(g);return f||(f={starts:0,completions:0,errors:0,retries:0,cancellations:0,totalDurationMs:0,avgDurationMs:0,maxDurationMs:0,lastCompletedAt:0},l.set(g,f)),f}function R(g){let f=t.get(g);return f||(f={runs:0,errors:0,lastRunAt:0},t.set(g,f)),f}let w={name:"performance",onStart(){c=Date.now();},onConstraintEvaluate(g,f){let C=performance.now(),T=I(g);if(T.evaluations++,T.lastEvaluatedAt=Date.now(),y>0){let P=C-y;T.totalDurationMs+=P;let F=T.evaluations;T.avgDurationMs=T.totalDurationMs/F,P>T.maxDurationMs&&(T.maxDurationMs=P),P>r&&s?.(g,P);}y=C;},onResolverStart(g,f){let C=N(g);C.starts++;},onResolverComplete(g,f,C){let T=N(g);T.completions++,T.totalDurationMs+=C,T.avgDurationMs=T.totalDurationMs/T.completions,C>T.maxDurationMs&&(T.maxDurationMs=C),T.lastCompletedAt=Date.now(),C>a&&o?.(g,C);},onResolverError(g,f,C){N(g).errors++;},onResolverRetry(g,f,C){N(g).retries++;},onResolverCancel(g,f){N(g).cancellations++;},onEffectRun(g){let f=R(g);f.runs++,f.lastRunAt=Date.now();},onEffectError(g,f){R(g).errors++;},onReconcileStart(){d=performance.now(),y=0;},onReconcileEnd(){let g=performance.now()-d;i.runs++,i.totalDurationMs+=g,i.avgDurationMs=i.totalDurationMs/i.runs,g>i.maxDurationMs&&(i.maxDurationMs=g);},onDestroy(){w.reset();},getSnapshot(){let g={};for(let[T,P]of p)g[T]={...P};let f={};for(let[T,P]of l)f[T]={...P};let C={};for(let[T,P]of t)C[T]={...P};return {constraints:g,resolvers:f,effects:C,reconcile:{...i},uptime:c?Date.now()-c:0}},reset(){p.clear(),l.clear(),t.clear(),i.runs=0,i.totalDurationMs=0,i.avgDurationMs=0,i.maxDurationMs=0,y=0;}};return w}function ve(){return globalThis.crypto?.randomUUID?.()??`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,11)}`}function Te(e,s){if(e.length===0)return 0;let o=[...e].sort((a,p)=>a-p),r=Math.ceil(s/100*o.length)-1;return o[Math.max(0,r)]??0}function ht(e={}){let{serviceName:s="directive-agents",metrics:o={},tracing:r={},alerts:a=[],summaryMetrics:p={},events:l={}}=e,t={requests:p.requests??"agent.requests",errors:p.errors??"agent.errors",latency:p.latency??"agent.latency",tokens:p.tokens??"agent.tokens",cost:p.cost??"agent.cost"},{enabled:i=true,exportInterval:c,exporter:d,maxDataPoints:y=1e3}=o,{enabled:I=true,sampleRate:N=1,maxSpans:R=1e3,exporter:w}=r,g=Date.now(),f=new Map,C=new Map,T=[],P=[],F=new Map,O=new Map,Y;c&&(d||w)&&(Y=setInterval(async()=>{try{if(d&&i&&await d(Array.from(O.values())),w&&I){let h=T.splice(0,100);h.length>0&&await w(h);}}catch(h){console.error("[Directive Observability] Export error:",h);}},c));function $(h){if(!i)return;let x=`${h.name}:${JSON.stringify(Object.fromEntries(Object.entries(h.labels).sort()))}`,E=f.get(x);E||(E=[],f.set(x,E)),E.push(h),E.length>y&&E.shift(),V(h.name,E),l.onMetricRecorded?.(h),_(h.name);}function V(h,x){if(x.length===0)return;let E=x.map(S=>S.value),q=E.reduce((S,A)=>S+A,0),j=x[0],u=E[E.length-1],M={name:h,type:j.type,count:x.length,sum:q,min:Math.min(...E),max:Math.max(...E),avg:q/x.length,lastValue:u,lastUpdated:Date.now()};O.set(h,M);}function _(h){for(let x of a){if(x.metric!==h)continue;let E=O.get(h);if(!E)continue;let q=`${x.metric}:${x.threshold}`,j=F.get(q),u=x.cooldownMs??6e4;if(j&&Date.now()-j<u)continue;let M=x.operator??">",S=E.lastValue,A=x.threshold,W=false;switch(M){case ">":W=S>A;break;case "<":W=S<A;break;case ">=":W=S>=A;break;case "<=":W=S<=A;break;case "==":W=S===A;break}if(W){let k={alertId:ve(),metric:h,currentValue:S,threshold:A,operator:M,action:x.action,timestamp:Date.now(),message:`Alert: ${h} ${M} ${A} (current: ${S})`};switch(P.push(k),P.length>1e3&&P.splice(0,P.length-1e3),F.set(q,Date.now()),l.onAlert?.(k),x.action){case "log":console.log(`[Observability] ${k.message}`);break;case "warn":console.warn(`[Observability] ${k.message}`);break;case "alert":console.error(`[Observability ALERT] ${k.message}`);break;case "callback":x.callback?.(E,A);break}}}}function H(h){let x=[];for(let[E,q]of f)if(E.startsWith(`${h}:`))for(let j of q)x.push(j.value);return x.length===0?{}:{p50:Te(x,50),p90:Te(x,90),p99:Te(x,99)}}return {incrementCounter(h,x={},E=1){$({name:h,type:"counter",value:E,labels:x,timestamp:Date.now()});},setGauge(h,x,E={}){$({name:h,type:"gauge",value:x,labels:E,timestamp:Date.now()});},observeHistogram(h,x,E={}){$({name:h,type:"histogram",value:x,labels:E,timestamp:Date.now()});},startSpan(h,x){if(Math.random()>N)return {traceId:"sampled-out",spanId:"sampled-out",operationName:h,serviceName:s,startTime:Date.now(),status:"ok",tags:{},logs:[]};let E={traceId:x?C.get(x)?.traceId??ve():ve(),spanId:ve(),parentSpanId:x,operationName:h,serviceName:s,startTime:Date.now(),status:"ok",tags:{},logs:[]};return I&&(C.set(E.spanId,E),l.onSpanStart?.(E)),E},endSpan(h,x="ok"){if(h==="sampled-out")return;let E=C.get(h);if(E){for(E.endTime=Date.now(),E.duration=E.endTime-E.startTime,E.status=x,C.delete(h),T.push(E);T.length>R;)T.shift();$({name:`${E.operationName}.latency`,type:"histogram",value:E.duration,labels:{},timestamp:Date.now()}),x==="error"&&$({name:`${E.operationName}.errors`,type:"counter",value:1,labels:{},timestamp:Date.now()}),l.onSpanEnd?.(E);}},addSpanLog(h,x,E="info"){if(h==="sampled-out")return;let q=C.get(h);q&&q.logs.push({timestamp:Date.now(),message:x,level:E});},addSpanTag(h,x,E){if(h==="sampled-out")return;let q=C.get(h);q&&(q.tags[x]=E);},getDashboard(){let h=O.get(t.requests),x=O.get(t.errors),E=O.get(t.latency),q=O.get(t.tokens),j=O.get(t.cost),u=h?.sum??0,M=x?.sum??0,S=u>0?M/u:0,A=E?H(t.latency):{};return {service:{name:s,uptime:Date.now()-g,startTime:g},metrics:Object.fromEntries(O),traces:[...T].slice(-100),alerts:[...P].slice(-50),summary:{totalRequests:u,totalErrors:M,errorRate:S,avgLatency:E?.avg??0,p99Latency:A.p99??0,activeSpans:C.size,totalTokens:q?.sum??0,totalCost:j?.sum??0}}},getMetric(h){let x=O.get(h);if(!x)return;let E=H(h);return {...x,...E}},getTraces(h=100){return [...T].slice(-h)},getAlerts(){return [...P]},export(){return {metrics:Array.from(O.values()),traces:[...T],alerts:[...P]}},clear(){f.clear(),O.clear(),C.clear(),T.length=0,P.length=0,F.clear();},async destroy(){Y&&(clearInterval(Y),Y=void 0);try{d&&i&&O.size>0&&await d(Array.from(O.values())),w&&I&&T.length>0&&await w([...T]);}catch(h){console.error("[Directive Observability] Error flushing data during destroy:",h);}f.clear(),O.clear(),C.clear(),T.length=0,P.length=0,F.clear();},getHealthStatus(){let h=O.get(t.requests),x=O.get(t.errors),E=h?.sum??0,q=x?.sum??0,j=E>0?q/E:0,u=P.filter(M=>Date.now()-M.timestamp<3e5).length;return {healthy:j<.1&&u===0,uptime:Date.now()-g,errorRate:j,activeAlerts:u}}}}function St(e){return {trackRun(s,o){let r={agent:s};e.incrementCounter("agent.requests",r),o.success||e.incrementCounter("agent.errors",r),e.observeHistogram("agent.latency",o.latencyMs,r),o.inputTokens!==void 0&&(e.incrementCounter("agent.tokens.input",r,o.inputTokens),e.incrementCounter("agent.tokens",r,o.inputTokens)),o.outputTokens!==void 0&&(e.incrementCounter("agent.tokens.output",r,o.outputTokens),e.incrementCounter("agent.tokens",r,o.outputTokens)),o.cost!==void 0&&e.incrementCounter("agent.cost",r,o.cost),o.toolCalls!==void 0&&e.incrementCounter("agent.tool_calls",r,o.toolCalls);},trackGuardrail(s,o){let r={guardrail:s};e.incrementCounter("guardrail.checks",r),o.passed||e.incrementCounter("guardrail.failures",r),o.blocked&&e.incrementCounter("guardrail.blocks",r),e.observeHistogram("guardrail.latency",o.latencyMs,r);},trackApproval(s,o){let r={tool:s};e.incrementCounter("approval.requests",r),o.approved?e.incrementCounter("approval.approved",r):e.incrementCounter("approval.rejected",r),o.timedOut&&e.incrementCounter("approval.timeouts",r),e.observeHistogram("approval.wait_time",o.waitTimeMs,r);},trackHandoff(s,o,r){e.incrementCounter("handoff.count",{from:s,to:o}),e.observeHistogram("handoff.latency",r);}}}function xt(e){let s=[{key:"service.name",value:{stringValue:e.serviceName??"directive-agents"}}];if(e.serviceVersion&&s.push({key:"service.version",value:{stringValue:e.serviceVersion}}),e.resourceAttributes)for(let[o,r]of Object.entries(e.resourceAttributes))s.push({key:o,value:{stringValue:r}});return {attributes:s}}function ne(e){return `${BigInt(e)*BigInt(1e6)}`}function Et(e){switch(e){case "counter":return "sum";case "gauge":return "gauge";case "histogram":return "histogram";default:return "gauge"}}function Ct(e,s,o){let r=e.map(a=>{let p=a.lastUpdated-6e4,l=[{asInt:a.type==="counter"?a.sum:void 0,asDouble:a.type!=="counter"?a.lastValue:void 0,timeUnixNano:ne(a.lastUpdated),startTimeUnixNano:ne(p),attributes:[]}],t=Et(a.type),i={name:a.name,unit:""};return t==="sum"?i.sum={dataPoints:l,aggregationTemporality:2,isMonotonic:true}:t==="histogram"?i.histogram={dataPoints:[{count:a.count,sum:a.sum,min:a.min,max:a.max,timeUnixNano:ne(a.lastUpdated),startTimeUnixNano:ne(p),attributes:[]}],aggregationTemporality:2}:i.gauge={dataPoints:l},i});return {resourceMetrics:[{resource:s,scopeMetrics:[{scope:{name:"directive",version:o},metrics:r}]}]}}function wt(e,s,o){let r=e.map(a=>{let p=a.logs.map(i=>({timeUnixNano:ne(i.timestamp),name:i.level,attributes:[{key:"message",value:{stringValue:i.message}},{key:"level",value:{stringValue:i.level}}]})),l=Object.entries(a.tags).map(([i,c])=>({key:i,value:typeof c=="string"?{stringValue:c}:typeof c=="number"?{intValue:`${c}`}:{boolValue:c}})),t=a.status==="ok"?1:a.status==="error"?2:0;return {traceId:a.traceId.replace(/-/g,"").padEnd(32,"0").slice(0,32),spanId:a.spanId.replace(/-/g,"").padEnd(16,"0").slice(0,16),parentSpanId:a.parentSpanId?a.parentSpanId.replace(/-/g,"").padEnd(16,"0").slice(0,16):void 0,name:a.operationName,kind:1,startTimeUnixNano:ne(a.startTime),endTimeUnixNano:a.endTime?ne(a.endTime):ne(a.startTime),attributes:l,events:p,status:{code:t}}});return {resourceSpans:[{resource:s,scopeSpans:[{scope:{name:"directive",version:o},spans:r}]}]}}function Mt(e){let{endpoint:s,headers:o={},scopeVersion:r="0.1.0",timeoutMs:a=1e4,fetch:p=globalThis.fetch,onError:l}=e;try{let c=new URL(s);if(c.protocol!=="http:"&&c.protocol!=="https:")throw new Error("[Directive] Only http: and https: protocols are supported")}catch(c){throw new Error(`[Directive OTLP] Invalid endpoint URL "${s}": ${c instanceof Error?c.message:String(c)}`)}if(/\/v1\/(metrics|traces)/.test(s)&&console.warn(`[Directive OTLP] Endpoint "${s}" already contains a /v1/metrics or /v1/traces path. The exporter will append /v1/metrics or /v1/traces automatically. Use the base URL (e.g., "http://localhost:4318") instead.`),a<=0||!Number.isFinite(a))throw new Error(`[Directive OTLP] timeoutMs must be > 0, got ${a}`);let t=xt(e);async function i(c,d,y){let I=`${s.replace(/\/$/,"")}${c}`,N=new AbortController,R=setTimeout(()=>N.abort(),a);try{let w=await p(I,{method:"POST",headers:{"Content-Type":"application/json",...o},body:JSON.stringify(d),signal:N.signal});if(!w.ok)throw new Error(`[Directive] OTLP export failed: ${w.status} ${w.statusText}`)}catch(w){let g=w instanceof Error?w:new Error(String(w));l?l(g,y):console.error(`[Directive OTLP] Export ${y} error:`,g.message);}finally{clearTimeout(R);}}return {async exportMetrics(c){if(c.length===0)return;let d=Ct(c,t,r);await i("/v1/metrics",d,"metrics");},async exportTraces(c){if(c.length===0)return;let d=wt(c,t,r);await i("/v1/traces",d,"traces");}}}var me=class extends Error{code="CIRCUIT_OPEN";retryAfterMs;state;constructor(s,o,r="OPEN",a){let p=a?`[Directive CircuitBreaker] Circuit "${s}" is ${r}. ${a}`:`[Directive CircuitBreaker] Circuit "${s}" is ${r}. Request rejected. Try again in ${Math.ceil(o/1e3)}s.`;super(p),this.name="CircuitBreakerOpenError",this.retryAfterMs=o,this.state=r;}};function Tt(e={}){let{failureThreshold:s=5,recoveryTimeMs:o=3e4,halfOpenMaxRequests:r=3,failureWindowMs:a=6e4,observability:p,metricPrefix:l="circuit_breaker",name:t="default",isFailure:i=()=>true,onStateChange:c}=e;if(s<1||!Number.isFinite(s))throw new Error(`[Directive CircuitBreaker] failureThreshold must be >= 1, got ${s}`);if(o<=0||!Number.isFinite(o))throw new Error(`[Directive CircuitBreaker] recoveryTimeMs must be > 0, got ${o}`);if(r<1||!Number.isFinite(r))throw new Error(`[Directive CircuitBreaker] halfOpenMaxRequests must be >= 1, got ${r}`);if(a<=0||!Number.isFinite(a))throw new Error(`[Directive CircuitBreaker] failureWindowMs must be > 0, got ${a}`);let d="CLOSED",y=[],I=0,N=0,R=Date.now(),w=0,g=0,f=0,C=0,T=0,P=null,F=null;function O(_){if(d===_)return;let H=d;d=_,R=Date.now(),_==="OPEN"&&(w=Date.now()),_==="HALF_OPEN"&&(I=0,N=0),c?.(H,_),p&&p.incrementCounter(`${l}.state_change`,{name:t,from:H,to:_});}function Y(){let _=Date.now()-a;return y=y.filter(H=>H>_),y.length}function $(){C++,F=Date.now(),p&&p.incrementCounter(`${l}.success`,{name:t}),d==="HALF_OPEN"&&(N++,N>=r&&(O("CLOSED"),y=[]));}function V(_){if(!i(_)){$();return}f++,P=Date.now(),y.push(Date.now());let H=s*2;if(y.length>H&&(y=y.slice(-H)),p&&p.incrementCounter(`${l}.failure`,{name:t}),d==="HALF_OPEN"){O("OPEN");return}d==="CLOSED"&&Y()>=s&&O("OPEN");}return {async execute(_){if(g++,p&&p.incrementCounter(`${l}.requests`,{name:t}),d==="OPEN")if(Date.now()-w>=o)O("HALF_OPEN");else throw T++,p&&p.incrementCounter(`${l}.rejected`,{name:t}),new me(t,o-(Date.now()-w));if(d==="HALF_OPEN"){if(I>=r)throw T++,new me(t,o,"HALF_OPEN",`Max trial requests (${r}) reached.`);I++;}let H=Date.now();try{let h=await _();return $(),p&&p.observeHistogram(`${l}.latency`,Date.now()-H,{name:t}),h}catch(h){let x=h instanceof Error?h:new Error(String(h));throw V(x),p&&p.observeHistogram(`${l}.latency`,Date.now()-H,{name:t}),h}},getState(){return d==="OPEN"&&Date.now()-w>=o&&O("HALF_OPEN"),d},getStats(){return {state:this.getState(),totalRequests:g,totalFailures:f,totalSuccesses:C,totalRejected:T,recentFailures:Y(),lastFailureTime:P,lastSuccessTime:F,lastStateChange:R}},forceState(_){O(_);},reset(){let _=d;d="CLOSED",y=[],I=0,N=0,R=Date.now(),w=0,g=0,f=0,C=0,T=0,P=null,F=null,_!=="CLOSED"&&c?.(_,"CLOSED");},isAllowed(){return d==="CLOSED"?true:d==="OPEN"?Date.now()-w>=o:I<r}}}
export{me as CircuitBreakerOpenError,tt as DEVTOOLS_EVENT_NAME,St as createAgentMetrics,Tt as createCircuitBreaker,Mt as createOTLPExporter,ht as createObservability,mt as devtoolsPlugin,bt as emitDevToolsEvent,st as loggingPlugin,vt as performancePlugin,yt as persistencePlugin};//# sourceMappingURL=index.js.map
//# sourceMappingURL=index.js.map

@@ -1,2 +0,2 @@

'use strict';function _(o){let{worker:c,onFactChange:l,onDerivationChange:y,onRequirementCreated:E,onRequirementMet:a,onError:r}=o,s=new Map,u=0,t=null,i=null,d=null,T=null;function g(e){return e?.(),null}function R(e,n){let S=s.get(e);S&&(S.resolve(n),s.delete(e));}function M(){t=g(t);}function m(){i=g(i);}function I(){d=g(d);}function b(){T=g(T);}function h(e){l?.(e.key,e.value,e.prev);}function O(e){y?.(e.key,e.value);}function W(e){E?.(e.requirement);}function C(e){a?.(e.requirementId,e.resolverId);}function P(e){r?.(e.error,e.source);}function D(e){R(e.requestId,e.snapshot);}function w(e){R(e.requestId,e.inspection);}function q(e){let n=s.get(e.requestId);n&&(e.success?n.resolve(void 0):n.reject(new Error(e.error||"Settle failed")),s.delete(e.requestId));}c.onmessage=e=>{let n=e.data;switch(n.type){case "READY":return M();case "STARTED":return m();case "STOPPED":return I();case "DESTROYED":return b();case "FACT_CHANGED":return h(n);case "DERIVATION_CHANGED":return O(n);case "REQUIREMENT_CREATED":return W(n);case "REQUIREMENT_MET":return C(n);case "ERROR":return P(n);case "SNAPSHOT_RESULT":return D(n);case "INSPECT_RESULT":return w(n);case "SETTLE_RESULT":return q(n)}},c.onerror=e=>{r?.(e.message,"worker");};function p(e){c.postMessage(e);}function k(e){return new Promise((n,S)=>{s.set(e.requestId,{resolve:n,reject:S}),p(e);})}return {init(e){return new Promise(n=>{t=n,p({type:"INIT",config:e});})},start(){return new Promise(e=>{i=e,p({type:"START"});})},stop(){return new Promise(e=>{d=e,p({type:"STOP"});})},destroy(){return new Promise(e=>{T=e,p({type:"DESTROY"});})},setFact(e,n){p({type:"SET_FACT",key:e,value:n});},setFacts(e){p({type:"SET_FACTS",facts:e});},dispatch(e){p({type:"DISPATCH",event:e});},getSnapshot(e){let n=`snapshot-${++u}`;return k({type:"GET_SNAPSHOT",options:e,requestId:n})},inspect(){let e=`inspect-${++u}`;return k({type:"INSPECT",requestId:e})},settle(e){let n=`settle-${++u}`;return k({type:"SETTLE",timeout:e,requestId:n})},terminate(){c.terminate();}}}var v=null;function f(){return v||(v=new Map),v}function N(o,c){f().set(o,c);}function x(){let o=null;async function c(t){let i=await A(t.config);return postMessage({type:"READY"}),i}function l(t){t.start(),postMessage({type:"STARTED"});}function y(t){t.stop(),postMessage({type:"STOPPED"});}function E(t){t.destroy(),postMessage({type:"DESTROYED"});}function a(t,i){let d=t.getSnapshot(i.options);postMessage({type:"SNAPSHOT_RESULT",requestId:i.requestId,snapshot:d});}function r(t,i){let d=t.inspect();postMessage({type:"INSPECT_RESULT",requestId:i.requestId,inspection:d});}async function s(t,i){try{await t.settle(i.timeout),postMessage({type:"SETTLE_RESULT",requestId:i.requestId,success:!0});}catch(d){postMessage({type:"SETTLE_RESULT",requestId:i.requestId,success:false,error:d instanceof Error?d.message:String(d)});}}async function u(t){if(t.type==="INIT"){o=await c(t);return}if(o)switch(t.type){case "START":l(o);break;case "STOP":y(o);break;case "DESTROY":E(o),o=null;break;case "SET_FACT":o.setFact(t.key,t.value);break;case "SET_FACTS":o.setFacts(t.facts);break;case "DISPATCH":o.dispatch(t.event);break;case "GET_SNAPSHOT":a(o,t);break;case "INSPECT":r(o,t);break;case "SETTLE":await s(o,t);break}}self.onmessage=async t=>{try{await u(t.data);}catch(i){postMessage({type:"ERROR",error:i instanceof Error?i.message:String(i),source:t.data.type});}};}async function A(o){let{createSystem:c}=await import('./system-CDJMD5O5.cjs'),l=f(),y={};for(let r of o.moduleNames){let s=l.get(r);if(!s)throw new Error(`[Directive Worker] Module "${r}" not registered. Call registerWorkerModule('${r}', module) before handling messages.`);y[r]=s;}let a=c({modules:y,plugins:[{name:"__worker-tracking__",onFactSet:(r,s,u)=>{postMessage({type:"FACT_CHANGED",key:r,value:s,prev:u});},onDerivationCompute:(r,s)=>{postMessage({type:"DERIVATION_CHANGED",key:r,value:s});},onRequirementCreated:r=>{postMessage({type:"REQUIREMENT_CREATED",requirement:{...r.requirement,id:r.id}});},onRequirementMet:(r,s)=>{postMessage({type:"REQUIREMENT_MET",requirementId:r.id,resolverId:s});}}],history:o.history});return {start:()=>a.start(),stop:()=>a.stop(),destroy:()=>a.destroy(),setFact:(r,s)=>{a.facts[r]=s;},setFacts:r=>{let s=a.facts;if(s.$store?.batch)s.$store.batch(()=>{for(let[u,t]of Object.entries(r))s[u]=t;});else for(let[u,t]of Object.entries(r))s[u]=t;},dispatch:r=>{a.dispatch(r);},getSnapshot:r=>a.getDistributableSnapshot(r),inspect:()=>a.inspect(),settle:r=>a.settle(r)}}exports.createWorkerClient=_;exports.getWorkerModuleRegistry=f;exports.handleWorkerMessages=x;exports.registerWorkerModule=N;//# sourceMappingURL=worker.cjs.map
'use strict';function H(o){let{worker:c,onFactChange:T,onDerivationChange:y,onRequirementCreated:g,onRequirementMet:u,onError:n}=o,s=new Map,a=0,t=3e4;function i(e){let r=s.get(e);r?.timeoutHandle!==void 0&&clearTimeout(r.timeoutHandle);}let d=null,S=null,f=null,v=null;function k(e){return e?.(),null}function M(e,r){let p=s.get(e);p&&(i(e),p.resolve(r),s.delete(e));}function h(){d=k(d);}function O(){S=k(S);}function W(){f=k(f);}function C(){v=k(v);}function w(e){T?.(e.key,e.value,e.prev);}function D(e){y?.(e.key,e.value);}function P(e){g?.(e.requirement);}function q(e){u?.(e.requirementId,e.resolverId);}function _(e){n?.(e.error,e.source);}function A(e){M(e.requestId,e.snapshot);}function N(e){M(e.requestId,e.inspection);}function x(e){let r=s.get(e.requestId);r&&(i(e.requestId),e.success?r.resolve(void 0):r.reject(new Error(e.error||"Settle failed")),s.delete(e.requestId));}c.onmessage=e=>{let r=e.data;switch(r.type){case "READY":return h();case "STARTED":return O();case "STOPPED":return W();case "DESTROYED":return C();case "FACT_CHANGED":return w(r);case "DERIVATION_CHANGED":return D(r);case "REQUIREMENT_CREATED":return P(r);case "REQUIREMENT_MET":return q(r);case "ERROR":return _(r);case "SNAPSHOT_RESULT":return A(r);case "INSPECT_RESULT":return N(r);case "SETTLE_RESULT":return x(r)}},c.onerror=e=>{let r=e&&typeof e=="object"&&"message"in e?String(e.message??"unknown error"):"unknown error";if(s.size>0){let p=new Error(`[Directive] worker errored: ${r}`);for(let[,E]of s)E.timeoutHandle!==void 0&&clearTimeout(E.timeoutHandle),E.reject(p);s.clear();}n?.(r,"worker");};function l(e){c.postMessage(e);}function m(e,r=t){return new Promise((p,E)=>{let I={resolve:p,reject:E};Number.isFinite(r)&&r>0&&(I.timeoutHandle=setTimeout(()=>{s.has(e.requestId)&&(s.delete(e.requestId),E(new Error(`[Directive] worker request timed out after ${r}ms`)));},r)),s.set(e.requestId,I),l(e);})}return {init(e){return new Promise(r=>{d=r,l({type:"INIT",config:e});})},start(){return new Promise(e=>{S=e,l({type:"START"});})},stop(){return new Promise(e=>{f=e,l({type:"STOP"});})},destroy(){return new Promise(e=>{v=e,l({type:"DESTROY"});})},setFact(e,r){l({type:"SET_FACT",key:e,value:r});},setFacts(e){l({type:"SET_FACTS",facts:e});},dispatch(e){l({type:"DISPATCH",event:e});},getSnapshot(e,r){let p=`snapshot-${++a}`;return m({type:"GET_SNAPSHOT",options:e,requestId:p},r??t)},inspect(e){let r=`inspect-${++a}`;return m({type:"INSPECT",requestId:r},e??t)},settle(e,r){let p=`settle-${++a}`;return m({type:"SETTLE",timeout:e,requestId:p},r??t)},terminate(){c.terminate();}}}var R=null;function b(){return R||(R=new Map),R}function L(o,c){b().set(o,c);}function U(){let o=null;async function c(t){let i=await F(t.config);return postMessage({type:"READY"}),i}function T(t){t.start(),postMessage({type:"STARTED"});}function y(t){t.stop(),postMessage({type:"STOPPED"});}function g(t){t.destroy(),postMessage({type:"DESTROYED"});}function u(t,i){let d=t.getSnapshot(i.options);postMessage({type:"SNAPSHOT_RESULT",requestId:i.requestId,snapshot:d});}function n(t,i){let d=t.inspect();postMessage({type:"INSPECT_RESULT",requestId:i.requestId,inspection:d});}async function s(t,i){try{await t.settle(i.timeout),postMessage({type:"SETTLE_RESULT",requestId:i.requestId,success:!0});}catch(d){postMessage({type:"SETTLE_RESULT",requestId:i.requestId,success:false,error:d instanceof Error?d.message:String(d)});}}async function a(t){if(t.type==="INIT"){o=await c(t);return}if(o)switch(t.type){case "START":T(o);break;case "STOP":y(o);break;case "DESTROY":g(o),o=null;break;case "SET_FACT":o.setFact(t.key,t.value);break;case "SET_FACTS":o.setFacts(t.facts);break;case "DISPATCH":o.dispatch(t.event);break;case "GET_SNAPSHOT":u(o,t);break;case "INSPECT":n(o,t);break;case "SETTLE":await s(o,t);break}}self.onmessage=async t=>{try{await a(t.data);}catch(i){postMessage({type:"ERROR",error:i instanceof Error?i.message:String(i),source:t.data.type});}};}async function F(o){let{createSystem:c}=await import('./system-CDJMD5O5.cjs'),T=b(),y={};for(let n of o.moduleNames){let s=T.get(n);if(!s)throw new Error(`[Directive Worker] Module "${n}" not registered. Call registerWorkerModule('${n}', module) before handling messages.`);y[n]=s;}let u=c({modules:y,plugins:[{name:"__worker-tracking__",onFactSet:(n,s,a)=>{postMessage({type:"FACT_CHANGED",key:n,value:s,prev:a});},onDerivationCompute:(n,s)=>{postMessage({type:"DERIVATION_CHANGED",key:n,value:s});},onRequirementCreated:n=>{postMessage({type:"REQUIREMENT_CREATED",requirement:{...n.requirement,id:n.id}});},onRequirementMet:(n,s)=>{postMessage({type:"REQUIREMENT_MET",requirementId:n.id,resolverId:s});}}],history:o.history});return {start:()=>u.start(),stop:()=>u.stop(),destroy:()=>u.destroy(),setFact:(n,s)=>{u.facts[n]=s;},setFacts:n=>{let s=u.facts;if(s.$store?.batch)s.$store.batch(()=>{for(let[a,t]of Object.entries(n))s[a]=t;});else for(let[a,t]of Object.entries(n))s[a]=t;},dispatch:n=>{u.dispatch(n);},getSnapshot:n=>u.getDistributableSnapshot(n),inspect:()=>u.inspect(),settle:n=>u.settle(n)}}exports.createWorkerClient=H;exports.getWorkerModuleRegistry=b;exports.handleWorkerMessages=U;exports.registerWorkerModule=L;//# sourceMappingURL=worker.cjs.map
//# sourceMappingURL=worker.cjs.map

@@ -1,1 +0,1 @@

{"version":3,"sources":["../src/adapters/worker.ts"],"names":["createWorkerClient","options","worker","onFactChange","onDerivationChange","onRequirementCreated","onRequirementMet","onError","pendingRequests","requestIdCounter","initResolve","startResolve","stopResolve","destroyResolve","resolveLifecycle","resolve","resolvePendingRequest","requestId","value","pending","handleReady","handleStarted","handleStopped","handleDestroyed","handleFactChanged","message","handleDerivationChanged","handleRequirementCreated","handleRequirementMet","handleError","handleSnapshotResult","handleInspectResult","handleSettleResult","event","send","request","reject","config","key","facts","timeout","workerModuleRegistry","getWorkerModuleRegistry","registerWorkerModule","name","module","handleWorkerMessages","system","handleInit","created","createWorkerSystem","handleStart","sys","handleStop","handleDestroy","handleGetSnapshot","snapshot","handleInspect","inspection","handleSettle","error","dispatchMessage","createSystem","registry","modules","prev","id","req","resolverId","factsProxy"],"mappings":"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","file":"worker.cjs","sourcesContent":["/**\n * Web Worker Adapter - Run Directive engine off the main thread\n *\n * Features:\n * - Run computations in a dedicated worker\n * - Synchronized state between main thread and worker\n * - Automatic serialization of facts and derivations\n * - Event-based communication\n */\n\nimport type {\n DistributableSnapshot,\n DistributableSnapshotOptions,\n ModuleSchema,\n Requirement,\n SystemInspection,\n} from \"../core/types.js\";\n\n// ============================================================================\n// Message Types\n// ============================================================================\n\n/** Messages sent from main thread to worker */\nexport type WorkerInboundMessage =\n | { type: \"INIT\"; config: WorkerSystemConfig }\n | { type: \"START\" }\n | { type: \"STOP\" }\n | { type: \"DESTROY\" }\n | { type: \"SET_FACT\"; key: string; value: unknown }\n | { type: \"SET_FACTS\"; facts: Record<string, unknown> }\n | { type: \"DISPATCH\"; event: { type: string; [key: string]: unknown } }\n | {\n type: \"GET_SNAPSHOT\";\n options?: DistributableSnapshotOptions;\n requestId: string;\n }\n | { type: \"INSPECT\"; requestId: string }\n | { type: \"SETTLE\"; timeout?: number; requestId: string };\n\n/** Messages sent from worker to main thread */\nexport type WorkerOutboundMessage =\n | { type: \"READY\" }\n | { type: \"STARTED\" }\n | { type: \"STOPPED\" }\n | { type: \"DESTROYED\" }\n | { type: \"FACT_CHANGED\"; key: string; value: unknown; prev: unknown }\n | { type: \"DERIVATION_CHANGED\"; key: string; value: unknown }\n | { type: \"REQUIREMENT_CREATED\"; requirement: Requirement & { id: string } }\n | { type: \"REQUIREMENT_MET\"; requirementId: string; resolverId: string }\n | { type: \"ERROR\"; error: string; source?: string }\n | {\n type: \"SNAPSHOT_RESULT\";\n requestId: string;\n snapshot: DistributableSnapshot;\n }\n | { type: \"INSPECT_RESULT\"; requestId: string; inspection: SystemInspection }\n | {\n type: \"SETTLE_RESULT\";\n requestId: string;\n success: boolean;\n error?: string;\n };\n\n// ============================================================================\n// Worker System Config\n// ============================================================================\n\n/**\n * Configuration for creating a system inside a worker.\n * Note: Functions cannot be serialized, so modules must be defined\n * in the worker script itself using createWorkerModule.\n */\nexport interface WorkerSystemConfig {\n /** Module names to initialize (modules must be registered in worker) */\n moduleNames: string[];\n /** History configuration for snapshot-based state history */\n history?:\n | boolean\n | {\n maxSnapshots?: number;\n };\n}\n\n// ============================================================================\n// Main Thread API\n// ============================================================================\n\n/**\n * Options for creating a worker client.\n */\nexport interface WorkerClientOptions {\n /** The web worker instance */\n worker: Worker;\n /** Callback when a fact changes in the worker */\n onFactChange?: (key: string, value: unknown, prev: unknown) => void;\n /** Callback when a derivation changes in the worker */\n onDerivationChange?: (key: string, value: unknown) => void;\n /** Callback when a requirement is created */\n onRequirementCreated?: (requirement: Requirement & { id: string }) => void;\n /** Callback when a requirement is met */\n onRequirementMet?: (requirementId: string, resolverId: string) => void;\n /** Callback when an error occurs */\n onError?: (error: string, source?: string) => void;\n}\n\n/**\n * Client for interacting with a Directive system running in a Web Worker.\n */\nexport interface WorkerClient {\n /** Initialize the worker system */\n init(config: WorkerSystemConfig): Promise<void>;\n /** Start the worker system */\n start(): Promise<void>;\n /** Stop the worker system */\n stop(): Promise<void>;\n /** Destroy the worker system and terminate the worker */\n destroy(): Promise<void>;\n /** Set a single fact */\n setFact(key: string, value: unknown): void;\n /** Set multiple facts at once */\n setFacts(facts: Record<string, unknown>): void;\n /** Dispatch an event */\n dispatch(event: { type: string; [key: string]: unknown }): void;\n /** Get a distributable snapshot */\n getSnapshot(\n options?: DistributableSnapshotOptions,\n ): Promise<DistributableSnapshot>;\n /** Inspect the system state */\n inspect(): Promise<SystemInspection>;\n /** Wait for the system to settle */\n settle(timeout?: number): Promise<void>;\n /** Terminate the worker */\n terminate(): void;\n}\n\n/**\n * Create a client for communicating with a Directive worker.\n *\n * @example\n * ```typescript\n * // main.ts\n * const worker = new Worker(new URL('./directive.worker.ts', import.meta.url));\n * const client = createWorkerClient({\n * worker,\n * onFactChange: (key, value) => console.log(`Fact ${key} = ${value}`),\n * });\n *\n * await client.init({ moduleNames: ['myModule'] });\n * await client.start();\n * client.setFact('userId', '123');\n * ```\n */\nexport function createWorkerClient(options: WorkerClientOptions): WorkerClient {\n const {\n worker,\n onFactChange,\n onDerivationChange,\n onRequirementCreated,\n onRequirementMet,\n onError,\n } = options;\n\n // Pending request callbacks\n const pendingRequests = new Map<\n string,\n { resolve: (value: unknown) => void; reject: (error: Error) => void }\n >();\n let requestIdCounter = 0;\n\n // Promise resolvers for lifecycle events\n let initResolve: (() => void) | null = null;\n let startResolve: (() => void) | null = null;\n let stopResolve: (() => void) | null = null;\n let destroyResolve: (() => void) | null = null;\n\n // ---- Outbound message handlers ----\n\n function resolveLifecycle(resolve: (() => void) | null): (() => void) | null {\n resolve?.();\n\n return null;\n }\n\n function resolvePendingRequest(requestId: string, value: unknown): void {\n const pending = pendingRequests.get(requestId);\n if (pending) {\n pending.resolve(value);\n pendingRequests.delete(requestId);\n }\n }\n\n function handleReady(): void {\n initResolve = resolveLifecycle(initResolve);\n }\n\n function handleStarted(): void {\n startResolve = resolveLifecycle(startResolve);\n }\n\n function handleStopped(): void {\n stopResolve = resolveLifecycle(stopResolve);\n }\n\n function handleDestroyed(): void {\n destroyResolve = resolveLifecycle(destroyResolve);\n }\n\n function handleFactChanged(\n message: Extract<WorkerOutboundMessage, { type: \"FACT_CHANGED\" }>,\n ): void {\n onFactChange?.(message.key, message.value, message.prev);\n }\n\n function handleDerivationChanged(\n message: Extract<WorkerOutboundMessage, { type: \"DERIVATION_CHANGED\" }>,\n ): void {\n onDerivationChange?.(message.key, message.value);\n }\n\n function handleRequirementCreated(\n message: Extract<WorkerOutboundMessage, { type: \"REQUIREMENT_CREATED\" }>,\n ): void {\n onRequirementCreated?.(message.requirement);\n }\n\n function handleRequirementMet(\n message: Extract<WorkerOutboundMessage, { type: \"REQUIREMENT_MET\" }>,\n ): void {\n onRequirementMet?.(message.requirementId, message.resolverId);\n }\n\n function handleError(\n message: Extract<WorkerOutboundMessage, { type: \"ERROR\" }>,\n ): void {\n onError?.(message.error, message.source);\n }\n\n function handleSnapshotResult(\n message: Extract<WorkerOutboundMessage, { type: \"SNAPSHOT_RESULT\" }>,\n ): void {\n resolvePendingRequest(message.requestId, message.snapshot);\n }\n\n function handleInspectResult(\n message: Extract<WorkerOutboundMessage, { type: \"INSPECT_RESULT\" }>,\n ): void {\n resolvePendingRequest(message.requestId, message.inspection);\n }\n\n function handleSettleResult(\n message: Extract<WorkerOutboundMessage, { type: \"SETTLE_RESULT\" }>,\n ): void {\n const pending = pendingRequests.get(message.requestId);\n if (pending) {\n if (message.success) {\n pending.resolve(undefined);\n } else {\n pending.reject(new Error(message.error || \"Settle failed\"));\n }\n pendingRequests.delete(message.requestId);\n }\n }\n\n // Handle messages from worker\n worker.onmessage = (event: MessageEvent<WorkerOutboundMessage>) => {\n const message = event.data;\n\n switch (message.type) {\n case \"READY\":\n return handleReady();\n case \"STARTED\":\n return handleStarted();\n case \"STOPPED\":\n return handleStopped();\n case \"DESTROYED\":\n return handleDestroyed();\n case \"FACT_CHANGED\":\n return handleFactChanged(message);\n case \"DERIVATION_CHANGED\":\n return handleDerivationChanged(message);\n case \"REQUIREMENT_CREATED\":\n return handleRequirementCreated(message);\n case \"REQUIREMENT_MET\":\n return handleRequirementMet(message);\n case \"ERROR\":\n return handleError(message);\n case \"SNAPSHOT_RESULT\":\n return handleSnapshotResult(message);\n case \"INSPECT_RESULT\":\n return handleInspectResult(message);\n case \"SETTLE_RESULT\":\n return handleSettleResult(message);\n }\n };\n\n worker.onerror = (event) => {\n onError?.(event.message, \"worker\");\n };\n\n function send(message: WorkerInboundMessage): void {\n worker.postMessage(message);\n }\n\n function request<T>(\n message: WorkerInboundMessage & { requestId: string },\n ): Promise<T> {\n return new Promise((resolve, reject) => {\n pendingRequests.set(message.requestId, {\n resolve: resolve as (value: unknown) => void,\n reject,\n });\n send(message);\n });\n }\n\n return {\n init(config: WorkerSystemConfig): Promise<void> {\n return new Promise((resolve) => {\n initResolve = resolve;\n send({ type: \"INIT\", config });\n });\n },\n\n start(): Promise<void> {\n return new Promise((resolve) => {\n startResolve = resolve;\n send({ type: \"START\" });\n });\n },\n\n stop(): Promise<void> {\n return new Promise((resolve) => {\n stopResolve = resolve;\n send({ type: \"STOP\" });\n });\n },\n\n destroy(): Promise<void> {\n return new Promise((resolve) => {\n destroyResolve = resolve;\n send({ type: \"DESTROY\" });\n });\n },\n\n setFact(key: string, value: unknown): void {\n send({ type: \"SET_FACT\", key, value });\n },\n\n setFacts(facts: Record<string, unknown>): void {\n send({ type: \"SET_FACTS\", facts });\n },\n\n dispatch(event: { type: string; [key: string]: unknown }): void {\n send({ type: \"DISPATCH\", event });\n },\n\n getSnapshot(\n options?: DistributableSnapshotOptions,\n ): Promise<DistributableSnapshot> {\n const requestId = `snapshot-${++requestIdCounter}`;\n return request({ type: \"GET_SNAPSHOT\", options, requestId });\n },\n\n inspect(): Promise<SystemInspection> {\n const requestId = `inspect-${++requestIdCounter}`;\n return request({ type: \"INSPECT\", requestId });\n },\n\n settle(timeout?: number): Promise<void> {\n const requestId = `settle-${++requestIdCounter}`;\n return request({ type: \"SETTLE\", timeout, requestId });\n },\n\n terminate(): void {\n worker.terminate();\n },\n };\n}\n\n// ============================================================================\n// Worker-Side API\n// ============================================================================\n\n/**\n * Module registration for worker-side systems.\n * Since functions can't be serialized, modules must be registered in the worker.\n */\n// biome-ignore lint/suspicious/noExplicitAny: Module types vary\ntype ModuleRegistry = Map<string, any>;\n\nlet workerModuleRegistry: ModuleRegistry | null = null;\n\n/**\n * Get or create the module registry for worker-side modules.\n */\nexport function getWorkerModuleRegistry(): ModuleRegistry {\n if (!workerModuleRegistry) {\n workerModuleRegistry = new Map();\n }\n return workerModuleRegistry;\n}\n\n/**\n * Register a module for use in workers.\n * Call this in your worker script before handling INIT messages.\n *\n * @example\n * ```typescript\n * // directive.worker.ts\n * import { registerWorkerModule, handleWorkerMessages } from '@directive-run/core/worker';\n * import { myModule } from './modules/my-module';\n *\n * registerWorkerModule('myModule', myModule);\n * handleWorkerMessages();\n * ```\n */\n// biome-ignore lint/suspicious/noExplicitAny: Module type varies\nexport function registerWorkerModule(name: string, module: any): void {\n getWorkerModuleRegistry().set(name, module);\n}\n\n/**\n * Handler for worker-side message processing.\n * Sets up the message listener and creates/manages the Directive system.\n *\n * @example\n * ```typescript\n * // directive.worker.ts\n * import { registerWorkerModule, handleWorkerMessages } from '@directive-run/core/worker';\n *\n * registerWorkerModule('myModule', myModule);\n * handleWorkerMessages();\n * ```\n */\nexport function handleWorkerMessages(): void {\n // Dynamic import to avoid issues in non-worker contexts\n // The actual system creation happens when messages are received\n type WorkerSystem = Awaited<ReturnType<typeof createWorkerSystem>>;\n let system: WorkerSystem | null = null;\n\n // ---- Inbound message handlers ----\n\n async function handleInit(\n message: Extract<WorkerInboundMessage, { type: \"INIT\" }>,\n ): Promise<WorkerSystem> {\n const created = await createWorkerSystem(message.config);\n postMessage({ type: \"READY\" } satisfies WorkerOutboundMessage);\n\n return created;\n }\n\n function handleStart(sys: WorkerSystem): void {\n sys.start();\n postMessage({ type: \"STARTED\" } satisfies WorkerOutboundMessage);\n }\n\n function handleStop(sys: WorkerSystem): void {\n sys.stop();\n postMessage({ type: \"STOPPED\" } satisfies WorkerOutboundMessage);\n }\n\n function handleDestroy(sys: WorkerSystem): void {\n sys.destroy();\n postMessage({ type: \"DESTROYED\" } satisfies WorkerOutboundMessage);\n }\n\n function handleGetSnapshot(\n sys: WorkerSystem,\n message: Extract<WorkerInboundMessage, { type: \"GET_SNAPSHOT\" }>,\n ): void {\n const snapshot = sys.getSnapshot(message.options);\n postMessage({\n type: \"SNAPSHOT_RESULT\",\n requestId: message.requestId,\n snapshot,\n } satisfies WorkerOutboundMessage);\n }\n\n function handleInspect(\n sys: WorkerSystem,\n message: Extract<WorkerInboundMessage, { type: \"INSPECT\" }>,\n ): void {\n const inspection = sys.inspect();\n postMessage({\n type: \"INSPECT_RESULT\",\n requestId: message.requestId,\n inspection,\n } satisfies WorkerOutboundMessage);\n }\n\n async function handleSettle(\n sys: WorkerSystem,\n message: Extract<WorkerInboundMessage, { type: \"SETTLE\" }>,\n ): Promise<void> {\n try {\n await sys.settle(message.timeout);\n postMessage({\n type: \"SETTLE_RESULT\",\n requestId: message.requestId,\n success: true,\n } satisfies WorkerOutboundMessage);\n } catch (error) {\n postMessage({\n type: \"SETTLE_RESULT\",\n requestId: message.requestId,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n } satisfies WorkerOutboundMessage);\n }\n }\n\n // ---- Message dispatch ----\n\n async function dispatchMessage(message: WorkerInboundMessage): Promise<void> {\n if (message.type === \"INIT\") {\n system = await handleInit(message);\n\n return;\n }\n\n if (!system) {\n return;\n }\n\n switch (message.type) {\n case \"START\":\n handleStart(system);\n break;\n case \"STOP\":\n handleStop(system);\n break;\n case \"DESTROY\":\n handleDestroy(system);\n system = null;\n break;\n case \"SET_FACT\":\n system.setFact(message.key, message.value);\n break;\n case \"SET_FACTS\":\n system.setFacts(message.facts);\n break;\n case \"DISPATCH\":\n system.dispatch(message.event);\n break;\n case \"GET_SNAPSHOT\":\n handleGetSnapshot(system, message);\n break;\n case \"INSPECT\":\n handleInspect(system, message);\n break;\n case \"SETTLE\":\n await handleSettle(system, message);\n break;\n }\n }\n\n self.onmessage = async (event: MessageEvent<WorkerInboundMessage>) => {\n try {\n await dispatchMessage(event.data);\n } catch (error) {\n postMessage({\n type: \"ERROR\",\n error: error instanceof Error ? error.message : String(error),\n source: event.data.type,\n } satisfies WorkerOutboundMessage);\n }\n };\n}\n\n/**\n * Internal: Create a system inside the worker.\n */\nasync function createWorkerSystem(config: WorkerSystemConfig) {\n // Dynamically import createSystem to avoid circular dependencies\n const { createSystem } = await import(\"../core/system.js\");\n\n const registry = getWorkerModuleRegistry();\n const modules: Record<string, unknown> = {};\n\n for (const name of config.moduleNames) {\n const module = registry.get(name);\n if (!module) {\n throw new Error(\n `[Directive Worker] Module \"${name}\" not registered. ` +\n `Call registerWorkerModule('${name}', module) before handling messages.`,\n );\n }\n modules[name] = module;\n }\n\n // Create tracking plugin to notify main thread\n const trackingPlugin = {\n name: \"__worker-tracking__\",\n onFactSet: (key: string, value: unknown, prev: unknown) => {\n postMessage({\n type: \"FACT_CHANGED\",\n key,\n value,\n prev,\n } satisfies WorkerOutboundMessage);\n },\n onDerivationCompute: (id: string, value: unknown) => {\n postMessage({\n type: \"DERIVATION_CHANGED\",\n key: id,\n value,\n } satisfies WorkerOutboundMessage);\n },\n onRequirementCreated: (req: { id: string; requirement: Requirement }) => {\n postMessage({\n type: \"REQUIREMENT_CREATED\",\n requirement: { ...req.requirement, id: req.id },\n } satisfies WorkerOutboundMessage);\n },\n onRequirementMet: (req: { id: string }, resolverId: string) => {\n postMessage({\n type: \"REQUIREMENT_MET\",\n requirementId: req.id,\n resolverId,\n } satisfies WorkerOutboundMessage);\n },\n };\n\n const system = createSystem({\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic module types\n modules: modules as any,\n plugins: [trackingPlugin],\n history: config.history,\n });\n\n return {\n start: () => system.start(),\n stop: () => system.stop(),\n destroy: () => system.destroy(),\n setFact: (key: string, value: unknown) => {\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic facts access\n (system.facts as any)[key] = value;\n },\n setFacts: (facts: Record<string, unknown>) => {\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic facts access\n const factsProxy = system.facts as any;\n if (factsProxy.$store?.batch) {\n factsProxy.$store.batch(() => {\n for (const [key, value] of Object.entries(facts)) {\n factsProxy[key] = value;\n }\n });\n } else {\n // Fallback: set facts one by one\n for (const [key, value] of Object.entries(facts)) {\n factsProxy[key] = value;\n }\n }\n },\n dispatch: (event: { type: string }) => {\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic dispatch\n (system as any).dispatch(event);\n },\n getSnapshot: (options?: DistributableSnapshotOptions) => {\n return system.getDistributableSnapshot(options);\n },\n inspect: () => system.inspect(),\n settle: (timeout?: number) => system.settle(timeout),\n };\n}\n\n// ============================================================================\n// Type Helpers\n// ============================================================================\n\n/**\n * Type helper for creating type-safe worker clients.\n * Use this to get proper typing for facts and events.\n *\n * @example\n * ```typescript\n * type MyWorkerClient = TypedWorkerClient<typeof myModuleSchema>;\n * const client = createWorkerClient(options) as MyWorkerClient;\n * client.setFact('userId', '123'); // Type-checked!\n * ```\n */\nexport type TypedWorkerClient<M extends ModuleSchema> = Omit<\n WorkerClient,\n \"setFact\" | \"setFacts\" | \"dispatch\"\n> & {\n setFact<K extends keyof M[\"facts\"]>(\n key: K,\n value: M[\"facts\"][K] extends { _type: infer T } ? T : M[\"facts\"][K],\n ): void;\n setFacts(\n facts: Partial<{\n [K in keyof M[\"facts\"]]: M[\"facts\"][K] extends { _type: infer T }\n ? T\n : M[\"facts\"][K];\n }>,\n ): void;\n dispatch(\n event: M[\"events\"] extends Record<string, unknown>\n ? {\n [K in keyof M[\"events\"]]: { type: K } & M[\"events\"][K];\n }[keyof M[\"events\"]]\n : { type: string },\n ): void;\n};\n"]}
{"version":3,"sources":["../src/adapters/worker.ts"],"names":["createWorkerClient","options","worker","onFactChange","onDerivationChange","onRequirementCreated","onRequirementMet","onError","pendingRequests","requestIdCounter","DEFAULT_REQUEST_TIMEOUT_MS","clearPendingTimeout","requestId","pending","initResolve","startResolve","stopResolve","destroyResolve","resolveLifecycle","resolve","resolvePendingRequest","value","handleReady","handleStarted","handleStopped","handleDestroyed","handleFactChanged","message","handleDerivationChanged","handleRequirementCreated","handleRequirementMet","handleError","handleSnapshotResult","handleInspectResult","handleSettleResult","event","msg","err","send","request","timeoutMs","reject","entry","config","key","facts","timeout","workerModuleRegistry","getWorkerModuleRegistry","registerWorkerModule","name","module","handleWorkerMessages","system","handleInit","created","createWorkerSystem","handleStart","sys","handleStop","handleDestroy","handleGetSnapshot","snapshot","handleInspect","inspection","handleSettle","error","dispatchMessage","createSystem","registry","modules","prev","id","req","resolverId","factsProxy"],"mappings":"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","file":"worker.cjs","sourcesContent":["/**\n * Web Worker Adapter - Run Directive engine off the main thread\n *\n * Features:\n * - Run computations in a dedicated worker\n * - Synchronized state between main thread and worker\n * - Automatic serialization of facts and derivations\n * - Event-based communication\n */\n\nimport type {\n DistributableSnapshot,\n DistributableSnapshotOptions,\n ModuleSchema,\n Requirement,\n SystemInspection,\n} from \"../core/types.js\";\n\n// ============================================================================\n// Message Types\n// ============================================================================\n\n/** Messages sent from main thread to worker */\nexport type WorkerInboundMessage =\n | { type: \"INIT\"; config: WorkerSystemConfig }\n | { type: \"START\" }\n | { type: \"STOP\" }\n | { type: \"DESTROY\" }\n | { type: \"SET_FACT\"; key: string; value: unknown }\n | { type: \"SET_FACTS\"; facts: Record<string, unknown> }\n | { type: \"DISPATCH\"; event: { type: string; [key: string]: unknown } }\n | {\n type: \"GET_SNAPSHOT\";\n options?: DistributableSnapshotOptions;\n requestId: string;\n }\n | { type: \"INSPECT\"; requestId: string }\n | { type: \"SETTLE\"; timeout?: number; requestId: string };\n\n/** Messages sent from worker to main thread */\nexport type WorkerOutboundMessage =\n | { type: \"READY\" }\n | { type: \"STARTED\" }\n | { type: \"STOPPED\" }\n | { type: \"DESTROYED\" }\n | { type: \"FACT_CHANGED\"; key: string; value: unknown; prev: unknown }\n | { type: \"DERIVATION_CHANGED\"; key: string; value: unknown }\n | { type: \"REQUIREMENT_CREATED\"; requirement: Requirement & { id: string } }\n | { type: \"REQUIREMENT_MET\"; requirementId: string; resolverId: string }\n | { type: \"ERROR\"; error: string; source?: string }\n | {\n type: \"SNAPSHOT_RESULT\";\n requestId: string;\n snapshot: DistributableSnapshot;\n }\n | { type: \"INSPECT_RESULT\"; requestId: string; inspection: SystemInspection }\n | {\n type: \"SETTLE_RESULT\";\n requestId: string;\n success: boolean;\n error?: string;\n };\n\n// ============================================================================\n// Worker System Config\n// ============================================================================\n\n/**\n * Configuration for creating a system inside a worker.\n * Note: Functions cannot be serialized, so modules must be defined\n * in the worker script itself using createWorkerModule.\n */\nexport interface WorkerSystemConfig {\n /** Module names to initialize (modules must be registered in worker) */\n moduleNames: string[];\n /** History configuration for snapshot-based state history */\n history?:\n | boolean\n | {\n maxSnapshots?: number;\n };\n}\n\n// ============================================================================\n// Main Thread API\n// ============================================================================\n\n/**\n * Options for creating a worker client.\n */\nexport interface WorkerClientOptions {\n /** The web worker instance */\n worker: Worker;\n /** Callback when a fact changes in the worker */\n onFactChange?: (key: string, value: unknown, prev: unknown) => void;\n /** Callback when a derivation changes in the worker */\n onDerivationChange?: (key: string, value: unknown) => void;\n /** Callback when a requirement is created */\n onRequirementCreated?: (requirement: Requirement & { id: string }) => void;\n /** Callback when a requirement is met */\n onRequirementMet?: (requirementId: string, resolverId: string) => void;\n /** Callback when an error occurs */\n onError?: (error: string, source?: string) => void;\n}\n\n/**\n * Client for interacting with a Directive system running in a Web Worker.\n */\nexport interface WorkerClient {\n /** Initialize the worker system */\n init(config: WorkerSystemConfig): Promise<void>;\n /** Start the worker system */\n start(): Promise<void>;\n /** Stop the worker system */\n stop(): Promise<void>;\n /** Destroy the worker system and terminate the worker */\n destroy(): Promise<void>;\n /** Set a single fact */\n setFact(key: string, value: unknown): void;\n /** Set multiple facts at once */\n setFacts(facts: Record<string, unknown>): void;\n /** Dispatch an event */\n dispatch(event: { type: string; [key: string]: unknown }): void;\n /**\n * Get a distributable snapshot.\n *\n * @param options Snapshot options forwarded to the worker.\n * @param timeoutMs Per-request timeout in ms. Defaults to 30_000.\n * Pass `0` or `Infinity` to disable the timeout.\n */\n getSnapshot(\n options?: DistributableSnapshotOptions,\n timeoutMs?: number,\n ): Promise<DistributableSnapshot>;\n /**\n * Inspect the system state.\n *\n * @param timeoutMs Per-request timeout in ms. Defaults to 30_000.\n * Pass `0` or `Infinity` to disable the timeout.\n */\n inspect(timeoutMs?: number): Promise<SystemInspection>;\n /**\n * Wait for the system to settle.\n *\n * @param timeout Settle timeout forwarded to the worker (separate from request timeout).\n * @param timeoutMs Per-request timeout in ms. Defaults to 30_000.\n * Pass `0` or `Infinity` to disable the timeout.\n */\n settle(timeout?: number, timeoutMs?: number): Promise<void>;\n /** Terminate the worker */\n terminate(): void;\n}\n\n/**\n * Create a client for communicating with a Directive worker.\n *\n * @example\n * ```typescript\n * // main.ts\n * const worker = new Worker(new URL('./directive.worker.ts', import.meta.url));\n * const client = createWorkerClient({\n * worker,\n * onFactChange: (key, value) => console.log(`Fact ${key} = ${value}`),\n * });\n *\n * await client.init({ moduleNames: ['myModule'] });\n * await client.start();\n * client.setFact('userId', '123');\n * ```\n */\nexport function createWorkerClient(options: WorkerClientOptions): WorkerClient {\n const {\n worker,\n onFactChange,\n onDerivationChange,\n onRequirementCreated,\n onRequirementMet,\n onError,\n } = options;\n\n // Pending request callbacks. Each entry MAY hold a timeout handle so we\n // can clear it on resolve/reject without leaking the timer.\n const pendingRequests = new Map<\n string,\n {\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n timeoutHandle?: ReturnType<typeof setTimeout>;\n }\n >();\n let requestIdCounter = 0;\n\n /** Default per-request timeout (ms). 0 / Infinity = disabled. */\n const DEFAULT_REQUEST_TIMEOUT_MS = 30_000;\n\n function clearPendingTimeout(requestId: string): void {\n const pending = pendingRequests.get(requestId);\n if (pending?.timeoutHandle !== undefined) {\n clearTimeout(pending.timeoutHandle);\n }\n }\n\n // Promise resolvers for lifecycle events\n let initResolve: (() => void) | null = null;\n let startResolve: (() => void) | null = null;\n let stopResolve: (() => void) | null = null;\n let destroyResolve: (() => void) | null = null;\n\n // ---- Outbound message handlers ----\n\n function resolveLifecycle(resolve: (() => void) | null): (() => void) | null {\n resolve?.();\n\n return null;\n }\n\n function resolvePendingRequest(requestId: string, value: unknown): void {\n const pending = pendingRequests.get(requestId);\n if (pending) {\n clearPendingTimeout(requestId);\n pending.resolve(value);\n pendingRequests.delete(requestId);\n }\n }\n\n function handleReady(): void {\n initResolve = resolveLifecycle(initResolve);\n }\n\n function handleStarted(): void {\n startResolve = resolveLifecycle(startResolve);\n }\n\n function handleStopped(): void {\n stopResolve = resolveLifecycle(stopResolve);\n }\n\n function handleDestroyed(): void {\n destroyResolve = resolveLifecycle(destroyResolve);\n }\n\n function handleFactChanged(\n message: Extract<WorkerOutboundMessage, { type: \"FACT_CHANGED\" }>,\n ): void {\n onFactChange?.(message.key, message.value, message.prev);\n }\n\n function handleDerivationChanged(\n message: Extract<WorkerOutboundMessage, { type: \"DERIVATION_CHANGED\" }>,\n ): void {\n onDerivationChange?.(message.key, message.value);\n }\n\n function handleRequirementCreated(\n message: Extract<WorkerOutboundMessage, { type: \"REQUIREMENT_CREATED\" }>,\n ): void {\n onRequirementCreated?.(message.requirement);\n }\n\n function handleRequirementMet(\n message: Extract<WorkerOutboundMessage, { type: \"REQUIREMENT_MET\" }>,\n ): void {\n onRequirementMet?.(message.requirementId, message.resolverId);\n }\n\n function handleError(\n message: Extract<WorkerOutboundMessage, { type: \"ERROR\" }>,\n ): void {\n onError?.(message.error, message.source);\n }\n\n function handleSnapshotResult(\n message: Extract<WorkerOutboundMessage, { type: \"SNAPSHOT_RESULT\" }>,\n ): void {\n resolvePendingRequest(message.requestId, message.snapshot);\n }\n\n function handleInspectResult(\n message: Extract<WorkerOutboundMessage, { type: \"INSPECT_RESULT\" }>,\n ): void {\n resolvePendingRequest(message.requestId, message.inspection);\n }\n\n function handleSettleResult(\n message: Extract<WorkerOutboundMessage, { type: \"SETTLE_RESULT\" }>,\n ): void {\n const pending = pendingRequests.get(message.requestId);\n if (pending) {\n clearPendingTimeout(message.requestId);\n if (message.success) {\n pending.resolve(undefined);\n } else {\n pending.reject(new Error(message.error || \"Settle failed\"));\n }\n pendingRequests.delete(message.requestId);\n }\n }\n\n // Handle messages from worker\n worker.onmessage = (event: MessageEvent<WorkerOutboundMessage>) => {\n const message = event.data;\n\n switch (message.type) {\n case \"READY\":\n return handleReady();\n case \"STARTED\":\n return handleStarted();\n case \"STOPPED\":\n return handleStopped();\n case \"DESTROYED\":\n return handleDestroyed();\n case \"FACT_CHANGED\":\n return handleFactChanged(message);\n case \"DERIVATION_CHANGED\":\n return handleDerivationChanged(message);\n case \"REQUIREMENT_CREATED\":\n return handleRequirementCreated(message);\n case \"REQUIREMENT_MET\":\n return handleRequirementMet(message);\n case \"ERROR\":\n return handleError(message);\n case \"SNAPSHOT_RESULT\":\n return handleSnapshotResult(message);\n case \"INSPECT_RESULT\":\n return handleInspectResult(message);\n case \"SETTLE_RESULT\":\n return handleSettleResult(message);\n }\n };\n\n worker.onerror = (event) => {\n const msg =\n event && typeof event === \"object\" && \"message\" in event\n ? String((event as { message?: unknown }).message ?? \"unknown error\")\n : \"unknown error\";\n // Reject ALL pending requests so they don't leak when the worker dies.\n if (pendingRequests.size > 0) {\n const err = new Error(`[Directive] worker errored: ${msg}`);\n for (const [, pending] of pendingRequests) {\n if (pending.timeoutHandle !== undefined) {\n clearTimeout(pending.timeoutHandle);\n }\n pending.reject(err);\n }\n pendingRequests.clear();\n }\n onError?.(msg, \"worker\");\n };\n\n function send(message: WorkerInboundMessage): void {\n worker.postMessage(message);\n }\n\n function request<T>(\n message: WorkerInboundMessage & { requestId: string },\n timeoutMs: number = DEFAULT_REQUEST_TIMEOUT_MS,\n ): Promise<T> {\n return new Promise((resolve, reject) => {\n const entry: {\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n timeoutHandle?: ReturnType<typeof setTimeout>;\n } = {\n resolve: resolve as (value: unknown) => void,\n reject,\n };\n\n // Only arm the timer if a finite positive timeout was requested.\n if (\n Number.isFinite(timeoutMs) &&\n (timeoutMs as number) > 0\n ) {\n entry.timeoutHandle = setTimeout(() => {\n if (pendingRequests.has(message.requestId)) {\n pendingRequests.delete(message.requestId);\n reject(\n new Error(\n `[Directive] worker request timed out after ${timeoutMs}ms`,\n ),\n );\n }\n }, timeoutMs);\n }\n\n pendingRequests.set(message.requestId, entry);\n send(message);\n });\n }\n\n return {\n init(config: WorkerSystemConfig): Promise<void> {\n return new Promise((resolve) => {\n initResolve = resolve;\n send({ type: \"INIT\", config });\n });\n },\n\n start(): Promise<void> {\n return new Promise((resolve) => {\n startResolve = resolve;\n send({ type: \"START\" });\n });\n },\n\n stop(): Promise<void> {\n return new Promise((resolve) => {\n stopResolve = resolve;\n send({ type: \"STOP\" });\n });\n },\n\n destroy(): Promise<void> {\n return new Promise((resolve) => {\n destroyResolve = resolve;\n send({ type: \"DESTROY\" });\n });\n },\n\n setFact(key: string, value: unknown): void {\n send({ type: \"SET_FACT\", key, value });\n },\n\n setFacts(facts: Record<string, unknown>): void {\n send({ type: \"SET_FACTS\", facts });\n },\n\n dispatch(event: { type: string; [key: string]: unknown }): void {\n send({ type: \"DISPATCH\", event });\n },\n\n getSnapshot(\n options?: DistributableSnapshotOptions,\n timeoutMs?: number,\n ): Promise<DistributableSnapshot> {\n const requestId = `snapshot-${++requestIdCounter}`;\n return request(\n { type: \"GET_SNAPSHOT\", options, requestId },\n timeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS,\n );\n },\n\n inspect(timeoutMs?: number): Promise<SystemInspection> {\n const requestId = `inspect-${++requestIdCounter}`;\n return request(\n { type: \"INSPECT\", requestId },\n timeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS,\n );\n },\n\n settle(timeout?: number, timeoutMs?: number): Promise<void> {\n const requestId = `settle-${++requestIdCounter}`;\n return request(\n { type: \"SETTLE\", timeout, requestId },\n timeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS,\n );\n },\n\n terminate(): void {\n worker.terminate();\n },\n };\n}\n\n// ============================================================================\n// Worker-Side API\n// ============================================================================\n\n/**\n * Module registration for worker-side systems.\n * Since functions can't be serialized, modules must be registered in the worker.\n */\n// biome-ignore lint/suspicious/noExplicitAny: Module types vary\ntype ModuleRegistry = Map<string, any>;\n\nlet workerModuleRegistry: ModuleRegistry | null = null;\n\n/**\n * Get or create the module registry for worker-side modules.\n */\nexport function getWorkerModuleRegistry(): ModuleRegistry {\n if (!workerModuleRegistry) {\n workerModuleRegistry = new Map();\n }\n return workerModuleRegistry;\n}\n\n/**\n * Register a module for use in workers.\n * Call this in your worker script before handling INIT messages.\n *\n * @example\n * ```typescript\n * // directive.worker.ts\n * import { registerWorkerModule, handleWorkerMessages } from '@directive-run/core/worker';\n * import { myModule } from './modules/my-module';\n *\n * registerWorkerModule('myModule', myModule);\n * handleWorkerMessages();\n * ```\n */\n// biome-ignore lint/suspicious/noExplicitAny: Module type varies\nexport function registerWorkerModule(name: string, module: any): void {\n getWorkerModuleRegistry().set(name, module);\n}\n\n/**\n * Handler for worker-side message processing.\n * Sets up the message listener and creates/manages the Directive system.\n *\n * @example\n * ```typescript\n * // directive.worker.ts\n * import { registerWorkerModule, handleWorkerMessages } from '@directive-run/core/worker';\n *\n * registerWorkerModule('myModule', myModule);\n * handleWorkerMessages();\n * ```\n */\nexport function handleWorkerMessages(): void {\n // Dynamic import to avoid issues in non-worker contexts\n // The actual system creation happens when messages are received\n type WorkerSystem = Awaited<ReturnType<typeof createWorkerSystem>>;\n let system: WorkerSystem | null = null;\n\n // ---- Inbound message handlers ----\n\n async function handleInit(\n message: Extract<WorkerInboundMessage, { type: \"INIT\" }>,\n ): Promise<WorkerSystem> {\n const created = await createWorkerSystem(message.config);\n postMessage({ type: \"READY\" } satisfies WorkerOutboundMessage);\n\n return created;\n }\n\n function handleStart(sys: WorkerSystem): void {\n sys.start();\n postMessage({ type: \"STARTED\" } satisfies WorkerOutboundMessage);\n }\n\n function handleStop(sys: WorkerSystem): void {\n sys.stop();\n postMessage({ type: \"STOPPED\" } satisfies WorkerOutboundMessage);\n }\n\n function handleDestroy(sys: WorkerSystem): void {\n sys.destroy();\n postMessage({ type: \"DESTROYED\" } satisfies WorkerOutboundMessage);\n }\n\n function handleGetSnapshot(\n sys: WorkerSystem,\n message: Extract<WorkerInboundMessage, { type: \"GET_SNAPSHOT\" }>,\n ): void {\n const snapshot = sys.getSnapshot(message.options);\n postMessage({\n type: \"SNAPSHOT_RESULT\",\n requestId: message.requestId,\n snapshot,\n } satisfies WorkerOutboundMessage);\n }\n\n function handleInspect(\n sys: WorkerSystem,\n message: Extract<WorkerInboundMessage, { type: \"INSPECT\" }>,\n ): void {\n const inspection = sys.inspect();\n postMessage({\n type: \"INSPECT_RESULT\",\n requestId: message.requestId,\n inspection,\n } satisfies WorkerOutboundMessage);\n }\n\n async function handleSettle(\n sys: WorkerSystem,\n message: Extract<WorkerInboundMessage, { type: \"SETTLE\" }>,\n ): Promise<void> {\n try {\n await sys.settle(message.timeout);\n postMessage({\n type: \"SETTLE_RESULT\",\n requestId: message.requestId,\n success: true,\n } satisfies WorkerOutboundMessage);\n } catch (error) {\n postMessage({\n type: \"SETTLE_RESULT\",\n requestId: message.requestId,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n } satisfies WorkerOutboundMessage);\n }\n }\n\n // ---- Message dispatch ----\n\n async function dispatchMessage(message: WorkerInboundMessage): Promise<void> {\n if (message.type === \"INIT\") {\n system = await handleInit(message);\n\n return;\n }\n\n if (!system) {\n return;\n }\n\n switch (message.type) {\n case \"START\":\n handleStart(system);\n break;\n case \"STOP\":\n handleStop(system);\n break;\n case \"DESTROY\":\n handleDestroy(system);\n system = null;\n break;\n case \"SET_FACT\":\n system.setFact(message.key, message.value);\n break;\n case \"SET_FACTS\":\n system.setFacts(message.facts);\n break;\n case \"DISPATCH\":\n system.dispatch(message.event);\n break;\n case \"GET_SNAPSHOT\":\n handleGetSnapshot(system, message);\n break;\n case \"INSPECT\":\n handleInspect(system, message);\n break;\n case \"SETTLE\":\n await handleSettle(system, message);\n break;\n }\n }\n\n self.onmessage = async (event: MessageEvent<WorkerInboundMessage>) => {\n try {\n await dispatchMessage(event.data);\n } catch (error) {\n postMessage({\n type: \"ERROR\",\n error: error instanceof Error ? error.message : String(error),\n source: event.data.type,\n } satisfies WorkerOutboundMessage);\n }\n };\n}\n\n/**\n * Internal: Create a system inside the worker.\n */\nasync function createWorkerSystem(config: WorkerSystemConfig) {\n // Dynamically import createSystem to avoid circular dependencies\n const { createSystem } = await import(\"../core/system.js\");\n\n const registry = getWorkerModuleRegistry();\n const modules: Record<string, unknown> = {};\n\n for (const name of config.moduleNames) {\n const module = registry.get(name);\n if (!module) {\n throw new Error(\n `[Directive Worker] Module \"${name}\" not registered. ` +\n `Call registerWorkerModule('${name}', module) before handling messages.`,\n );\n }\n modules[name] = module;\n }\n\n // Create tracking plugin to notify main thread\n const trackingPlugin = {\n name: \"__worker-tracking__\",\n onFactSet: (key: string, value: unknown, prev: unknown) => {\n postMessage({\n type: \"FACT_CHANGED\",\n key,\n value,\n prev,\n } satisfies WorkerOutboundMessage);\n },\n onDerivationCompute: (id: string, value: unknown) => {\n postMessage({\n type: \"DERIVATION_CHANGED\",\n key: id,\n value,\n } satisfies WorkerOutboundMessage);\n },\n onRequirementCreated: (req: { id: string; requirement: Requirement }) => {\n postMessage({\n type: \"REQUIREMENT_CREATED\",\n requirement: { ...req.requirement, id: req.id },\n } satisfies WorkerOutboundMessage);\n },\n onRequirementMet: (req: { id: string }, resolverId: string) => {\n postMessage({\n type: \"REQUIREMENT_MET\",\n requirementId: req.id,\n resolverId,\n } satisfies WorkerOutboundMessage);\n },\n };\n\n const system = createSystem({\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic module types\n modules: modules as any,\n plugins: [trackingPlugin],\n history: config.history,\n });\n\n return {\n start: () => system.start(),\n stop: () => system.stop(),\n destroy: () => system.destroy(),\n setFact: (key: string, value: unknown) => {\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic facts access\n (system.facts as any)[key] = value;\n },\n setFacts: (facts: Record<string, unknown>) => {\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic facts access\n const factsProxy = system.facts as any;\n if (factsProxy.$store?.batch) {\n factsProxy.$store.batch(() => {\n for (const [key, value] of Object.entries(facts)) {\n factsProxy[key] = value;\n }\n });\n } else {\n // Fallback: set facts one by one\n for (const [key, value] of Object.entries(facts)) {\n factsProxy[key] = value;\n }\n }\n },\n dispatch: (event: { type: string }) => {\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic dispatch\n (system as any).dispatch(event);\n },\n getSnapshot: (options?: DistributableSnapshotOptions) => {\n return system.getDistributableSnapshot(options);\n },\n inspect: () => system.inspect(),\n settle: (timeout?: number) => system.settle(timeout),\n };\n}\n\n// ============================================================================\n// Type Helpers\n// ============================================================================\n\n/**\n * Type helper for creating type-safe worker clients.\n * Use this to get proper typing for facts and events.\n *\n * @example\n * ```typescript\n * type MyWorkerClient = TypedWorkerClient<typeof myModuleSchema>;\n * const client = createWorkerClient(options) as MyWorkerClient;\n * client.setFact('userId', '123'); // Type-checked!\n * ```\n */\nexport type TypedWorkerClient<M extends ModuleSchema> = Omit<\n WorkerClient,\n \"setFact\" | \"setFacts\" | \"dispatch\"\n> & {\n setFact<K extends keyof M[\"facts\"]>(\n key: K,\n value: M[\"facts\"][K] extends { _type: infer T } ? T : M[\"facts\"][K],\n ): void;\n setFacts(\n facts: Partial<{\n [K in keyof M[\"facts\"]]: M[\"facts\"][K] extends { _type: infer T }\n ? T\n : M[\"facts\"][K];\n }>,\n ): void;\n dispatch(\n event: M[\"events\"] extends Record<string, unknown>\n ? {\n [K in keyof M[\"events\"]]: { type: K } & M[\"events\"][K];\n }[keyof M[\"events\"]]\n : { type: string },\n ): void;\n};\n"]}

@@ -146,8 +146,25 @@ import { M as ModuleSchema, u as DistributableSnapshotOptions, t as DistributableSnapshot, ac as SystemInspection, q as Requirement } from './plugins-BIzXaYbg.cjs';

}): void;
/** Get a distributable snapshot */
getSnapshot(options?: DistributableSnapshotOptions): Promise<DistributableSnapshot>;
/** Inspect the system state */
inspect(): Promise<SystemInspection>;
/** Wait for the system to settle */
settle(timeout?: number): Promise<void>;
/**
* Get a distributable snapshot.
*
* @param options Snapshot options forwarded to the worker.
* @param timeoutMs Per-request timeout in ms. Defaults to 30_000.
* Pass `0` or `Infinity` to disable the timeout.
*/
getSnapshot(options?: DistributableSnapshotOptions, timeoutMs?: number): Promise<DistributableSnapshot>;
/**
* Inspect the system state.
*
* @param timeoutMs Per-request timeout in ms. Defaults to 30_000.
* Pass `0` or `Infinity` to disable the timeout.
*/
inspect(timeoutMs?: number): Promise<SystemInspection>;
/**
* Wait for the system to settle.
*
* @param timeout Settle timeout forwarded to the worker (separate from request timeout).
* @param timeoutMs Per-request timeout in ms. Defaults to 30_000.
* Pass `0` or `Infinity` to disable the timeout.
*/
settle(timeout?: number, timeoutMs?: number): Promise<void>;
/** Terminate the worker */

@@ -154,0 +171,0 @@ terminate(): void;

@@ -146,8 +146,25 @@ import { M as ModuleSchema, u as DistributableSnapshotOptions, t as DistributableSnapshot, ac as SystemInspection, q as Requirement } from './plugins-BIzXaYbg.js';

}): void;
/** Get a distributable snapshot */
getSnapshot(options?: DistributableSnapshotOptions): Promise<DistributableSnapshot>;
/** Inspect the system state */
inspect(): Promise<SystemInspection>;
/** Wait for the system to settle */
settle(timeout?: number): Promise<void>;
/**
* Get a distributable snapshot.
*
* @param options Snapshot options forwarded to the worker.
* @param timeoutMs Per-request timeout in ms. Defaults to 30_000.
* Pass `0` or `Infinity` to disable the timeout.
*/
getSnapshot(options?: DistributableSnapshotOptions, timeoutMs?: number): Promise<DistributableSnapshot>;
/**
* Inspect the system state.
*
* @param timeoutMs Per-request timeout in ms. Defaults to 30_000.
* Pass `0` or `Infinity` to disable the timeout.
*/
inspect(timeoutMs?: number): Promise<SystemInspection>;
/**
* Wait for the system to settle.
*
* @param timeout Settle timeout forwarded to the worker (separate from request timeout).
* @param timeoutMs Per-request timeout in ms. Defaults to 30_000.
* Pass `0` or `Infinity` to disable the timeout.
*/
settle(timeout?: number, timeoutMs?: number): Promise<void>;
/** Terminate the worker */

@@ -154,0 +171,0 @@ terminate(): void;

@@ -1,2 +0,2 @@

function _(o){let{worker:c,onFactChange:l,onDerivationChange:y,onRequirementCreated:E,onRequirementMet:a,onError:r}=o,s=new Map,u=0,t=null,i=null,d=null,T=null;function g(e){return e?.(),null}function R(e,n){let S=s.get(e);S&&(S.resolve(n),s.delete(e));}function M(){t=g(t);}function m(){i=g(i);}function I(){d=g(d);}function b(){T=g(T);}function h(e){l?.(e.key,e.value,e.prev);}function O(e){y?.(e.key,e.value);}function W(e){E?.(e.requirement);}function C(e){a?.(e.requirementId,e.resolverId);}function P(e){r?.(e.error,e.source);}function D(e){R(e.requestId,e.snapshot);}function w(e){R(e.requestId,e.inspection);}function q(e){let n=s.get(e.requestId);n&&(e.success?n.resolve(void 0):n.reject(new Error(e.error||"Settle failed")),s.delete(e.requestId));}c.onmessage=e=>{let n=e.data;switch(n.type){case "READY":return M();case "STARTED":return m();case "STOPPED":return I();case "DESTROYED":return b();case "FACT_CHANGED":return h(n);case "DERIVATION_CHANGED":return O(n);case "REQUIREMENT_CREATED":return W(n);case "REQUIREMENT_MET":return C(n);case "ERROR":return P(n);case "SNAPSHOT_RESULT":return D(n);case "INSPECT_RESULT":return w(n);case "SETTLE_RESULT":return q(n)}},c.onerror=e=>{r?.(e.message,"worker");};function p(e){c.postMessage(e);}function k(e){return new Promise((n,S)=>{s.set(e.requestId,{resolve:n,reject:S}),p(e);})}return {init(e){return new Promise(n=>{t=n,p({type:"INIT",config:e});})},start(){return new Promise(e=>{i=e,p({type:"START"});})},stop(){return new Promise(e=>{d=e,p({type:"STOP"});})},destroy(){return new Promise(e=>{T=e,p({type:"DESTROY"});})},setFact(e,n){p({type:"SET_FACT",key:e,value:n});},setFacts(e){p({type:"SET_FACTS",facts:e});},dispatch(e){p({type:"DISPATCH",event:e});},getSnapshot(e){let n=`snapshot-${++u}`;return k({type:"GET_SNAPSHOT",options:e,requestId:n})},inspect(){let e=`inspect-${++u}`;return k({type:"INSPECT",requestId:e})},settle(e){let n=`settle-${++u}`;return k({type:"SETTLE",timeout:e,requestId:n})},terminate(){c.terminate();}}}var v=null;function f(){return v||(v=new Map),v}function N(o,c){f().set(o,c);}function x(){let o=null;async function c(t){let i=await A(t.config);return postMessage({type:"READY"}),i}function l(t){t.start(),postMessage({type:"STARTED"});}function y(t){t.stop(),postMessage({type:"STOPPED"});}function E(t){t.destroy(),postMessage({type:"DESTROYED"});}function a(t,i){let d=t.getSnapshot(i.options);postMessage({type:"SNAPSHOT_RESULT",requestId:i.requestId,snapshot:d});}function r(t,i){let d=t.inspect();postMessage({type:"INSPECT_RESULT",requestId:i.requestId,inspection:d});}async function s(t,i){try{await t.settle(i.timeout),postMessage({type:"SETTLE_RESULT",requestId:i.requestId,success:!0});}catch(d){postMessage({type:"SETTLE_RESULT",requestId:i.requestId,success:false,error:d instanceof Error?d.message:String(d)});}}async function u(t){if(t.type==="INIT"){o=await c(t);return}if(o)switch(t.type){case "START":l(o);break;case "STOP":y(o);break;case "DESTROY":E(o),o=null;break;case "SET_FACT":o.setFact(t.key,t.value);break;case "SET_FACTS":o.setFacts(t.facts);break;case "DISPATCH":o.dispatch(t.event);break;case "GET_SNAPSHOT":a(o,t);break;case "INSPECT":r(o,t);break;case "SETTLE":await s(o,t);break}}self.onmessage=async t=>{try{await u(t.data);}catch(i){postMessage({type:"ERROR",error:i instanceof Error?i.message:String(i),source:t.data.type});}};}async function A(o){let{createSystem:c}=await import('./system-A6VYKLVF.js'),l=f(),y={};for(let r of o.moduleNames){let s=l.get(r);if(!s)throw new Error(`[Directive Worker] Module "${r}" not registered. Call registerWorkerModule('${r}', module) before handling messages.`);y[r]=s;}let a=c({modules:y,plugins:[{name:"__worker-tracking__",onFactSet:(r,s,u)=>{postMessage({type:"FACT_CHANGED",key:r,value:s,prev:u});},onDerivationCompute:(r,s)=>{postMessage({type:"DERIVATION_CHANGED",key:r,value:s});},onRequirementCreated:r=>{postMessage({type:"REQUIREMENT_CREATED",requirement:{...r.requirement,id:r.id}});},onRequirementMet:(r,s)=>{postMessage({type:"REQUIREMENT_MET",requirementId:r.id,resolverId:s});}}],history:o.history});return {start:()=>a.start(),stop:()=>a.stop(),destroy:()=>a.destroy(),setFact:(r,s)=>{a.facts[r]=s;},setFacts:r=>{let s=a.facts;if(s.$store?.batch)s.$store.batch(()=>{for(let[u,t]of Object.entries(r))s[u]=t;});else for(let[u,t]of Object.entries(r))s[u]=t;},dispatch:r=>{a.dispatch(r);},getSnapshot:r=>a.getDistributableSnapshot(r),inspect:()=>a.inspect(),settle:r=>a.settle(r)}}export{_ as createWorkerClient,f as getWorkerModuleRegistry,x as handleWorkerMessages,N as registerWorkerModule};//# sourceMappingURL=worker.js.map
function H(o){let{worker:c,onFactChange:T,onDerivationChange:y,onRequirementCreated:g,onRequirementMet:u,onError:n}=o,s=new Map,a=0,t=3e4;function i(e){let r=s.get(e);r?.timeoutHandle!==void 0&&clearTimeout(r.timeoutHandle);}let d=null,S=null,f=null,v=null;function k(e){return e?.(),null}function M(e,r){let p=s.get(e);p&&(i(e),p.resolve(r),s.delete(e));}function h(){d=k(d);}function O(){S=k(S);}function W(){f=k(f);}function C(){v=k(v);}function w(e){T?.(e.key,e.value,e.prev);}function D(e){y?.(e.key,e.value);}function P(e){g?.(e.requirement);}function q(e){u?.(e.requirementId,e.resolverId);}function _(e){n?.(e.error,e.source);}function A(e){M(e.requestId,e.snapshot);}function N(e){M(e.requestId,e.inspection);}function x(e){let r=s.get(e.requestId);r&&(i(e.requestId),e.success?r.resolve(void 0):r.reject(new Error(e.error||"Settle failed")),s.delete(e.requestId));}c.onmessage=e=>{let r=e.data;switch(r.type){case "READY":return h();case "STARTED":return O();case "STOPPED":return W();case "DESTROYED":return C();case "FACT_CHANGED":return w(r);case "DERIVATION_CHANGED":return D(r);case "REQUIREMENT_CREATED":return P(r);case "REQUIREMENT_MET":return q(r);case "ERROR":return _(r);case "SNAPSHOT_RESULT":return A(r);case "INSPECT_RESULT":return N(r);case "SETTLE_RESULT":return x(r)}},c.onerror=e=>{let r=e&&typeof e=="object"&&"message"in e?String(e.message??"unknown error"):"unknown error";if(s.size>0){let p=new Error(`[Directive] worker errored: ${r}`);for(let[,E]of s)E.timeoutHandle!==void 0&&clearTimeout(E.timeoutHandle),E.reject(p);s.clear();}n?.(r,"worker");};function l(e){c.postMessage(e);}function m(e,r=t){return new Promise((p,E)=>{let I={resolve:p,reject:E};Number.isFinite(r)&&r>0&&(I.timeoutHandle=setTimeout(()=>{s.has(e.requestId)&&(s.delete(e.requestId),E(new Error(`[Directive] worker request timed out after ${r}ms`)));},r)),s.set(e.requestId,I),l(e);})}return {init(e){return new Promise(r=>{d=r,l({type:"INIT",config:e});})},start(){return new Promise(e=>{S=e,l({type:"START"});})},stop(){return new Promise(e=>{f=e,l({type:"STOP"});})},destroy(){return new Promise(e=>{v=e,l({type:"DESTROY"});})},setFact(e,r){l({type:"SET_FACT",key:e,value:r});},setFacts(e){l({type:"SET_FACTS",facts:e});},dispatch(e){l({type:"DISPATCH",event:e});},getSnapshot(e,r){let p=`snapshot-${++a}`;return m({type:"GET_SNAPSHOT",options:e,requestId:p},r??t)},inspect(e){let r=`inspect-${++a}`;return m({type:"INSPECT",requestId:r},e??t)},settle(e,r){let p=`settle-${++a}`;return m({type:"SETTLE",timeout:e,requestId:p},r??t)},terminate(){c.terminate();}}}var R=null;function b(){return R||(R=new Map),R}function L(o,c){b().set(o,c);}function U(){let o=null;async function c(t){let i=await F(t.config);return postMessage({type:"READY"}),i}function T(t){t.start(),postMessage({type:"STARTED"});}function y(t){t.stop(),postMessage({type:"STOPPED"});}function g(t){t.destroy(),postMessage({type:"DESTROYED"});}function u(t,i){let d=t.getSnapshot(i.options);postMessage({type:"SNAPSHOT_RESULT",requestId:i.requestId,snapshot:d});}function n(t,i){let d=t.inspect();postMessage({type:"INSPECT_RESULT",requestId:i.requestId,inspection:d});}async function s(t,i){try{await t.settle(i.timeout),postMessage({type:"SETTLE_RESULT",requestId:i.requestId,success:!0});}catch(d){postMessage({type:"SETTLE_RESULT",requestId:i.requestId,success:false,error:d instanceof Error?d.message:String(d)});}}async function a(t){if(t.type==="INIT"){o=await c(t);return}if(o)switch(t.type){case "START":T(o);break;case "STOP":y(o);break;case "DESTROY":g(o),o=null;break;case "SET_FACT":o.setFact(t.key,t.value);break;case "SET_FACTS":o.setFacts(t.facts);break;case "DISPATCH":o.dispatch(t.event);break;case "GET_SNAPSHOT":u(o,t);break;case "INSPECT":n(o,t);break;case "SETTLE":await s(o,t);break}}self.onmessage=async t=>{try{await a(t.data);}catch(i){postMessage({type:"ERROR",error:i instanceof Error?i.message:String(i),source:t.data.type});}};}async function F(o){let{createSystem:c}=await import('./system-A6VYKLVF.js'),T=b(),y={};for(let n of o.moduleNames){let s=T.get(n);if(!s)throw new Error(`[Directive Worker] Module "${n}" not registered. Call registerWorkerModule('${n}', module) before handling messages.`);y[n]=s;}let u=c({modules:y,plugins:[{name:"__worker-tracking__",onFactSet:(n,s,a)=>{postMessage({type:"FACT_CHANGED",key:n,value:s,prev:a});},onDerivationCompute:(n,s)=>{postMessage({type:"DERIVATION_CHANGED",key:n,value:s});},onRequirementCreated:n=>{postMessage({type:"REQUIREMENT_CREATED",requirement:{...n.requirement,id:n.id}});},onRequirementMet:(n,s)=>{postMessage({type:"REQUIREMENT_MET",requirementId:n.id,resolverId:s});}}],history:o.history});return {start:()=>u.start(),stop:()=>u.stop(),destroy:()=>u.destroy(),setFact:(n,s)=>{u.facts[n]=s;},setFacts:n=>{let s=u.facts;if(s.$store?.batch)s.$store.batch(()=>{for(let[a,t]of Object.entries(n))s[a]=t;});else for(let[a,t]of Object.entries(n))s[a]=t;},dispatch:n=>{u.dispatch(n);},getSnapshot:n=>u.getDistributableSnapshot(n),inspect:()=>u.inspect(),settle:n=>u.settle(n)}}export{H as createWorkerClient,b as getWorkerModuleRegistry,U as handleWorkerMessages,L as registerWorkerModule};//# sourceMappingURL=worker.js.map
//# sourceMappingURL=worker.js.map

@@ -1,1 +0,1 @@

{"version":3,"sources":["../src/adapters/worker.ts"],"names":["createWorkerClient","options","worker","onFactChange","onDerivationChange","onRequirementCreated","onRequirementMet","onError","pendingRequests","requestIdCounter","initResolve","startResolve","stopResolve","destroyResolve","resolveLifecycle","resolve","resolvePendingRequest","requestId","value","pending","handleReady","handleStarted","handleStopped","handleDestroyed","handleFactChanged","message","handleDerivationChanged","handleRequirementCreated","handleRequirementMet","handleError","handleSnapshotResult","handleInspectResult","handleSettleResult","event","send","request","reject","config","key","facts","timeout","workerModuleRegistry","getWorkerModuleRegistry","registerWorkerModule","name","module","handleWorkerMessages","system","handleInit","created","createWorkerSystem","handleStart","sys","handleStop","handleDestroy","handleGetSnapshot","snapshot","handleInspect","inspection","handleSettle","error","dispatchMessage","createSystem","registry","modules","prev","id","req","resolverId","factsProxy"],"mappings":"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","file":"worker.js","sourcesContent":["/**\n * Web Worker Adapter - Run Directive engine off the main thread\n *\n * Features:\n * - Run computations in a dedicated worker\n * - Synchronized state between main thread and worker\n * - Automatic serialization of facts and derivations\n * - Event-based communication\n */\n\nimport type {\n DistributableSnapshot,\n DistributableSnapshotOptions,\n ModuleSchema,\n Requirement,\n SystemInspection,\n} from \"../core/types.js\";\n\n// ============================================================================\n// Message Types\n// ============================================================================\n\n/** Messages sent from main thread to worker */\nexport type WorkerInboundMessage =\n | { type: \"INIT\"; config: WorkerSystemConfig }\n | { type: \"START\" }\n | { type: \"STOP\" }\n | { type: \"DESTROY\" }\n | { type: \"SET_FACT\"; key: string; value: unknown }\n | { type: \"SET_FACTS\"; facts: Record<string, unknown> }\n | { type: \"DISPATCH\"; event: { type: string; [key: string]: unknown } }\n | {\n type: \"GET_SNAPSHOT\";\n options?: DistributableSnapshotOptions;\n requestId: string;\n }\n | { type: \"INSPECT\"; requestId: string }\n | { type: \"SETTLE\"; timeout?: number; requestId: string };\n\n/** Messages sent from worker to main thread */\nexport type WorkerOutboundMessage =\n | { type: \"READY\" }\n | { type: \"STARTED\" }\n | { type: \"STOPPED\" }\n | { type: \"DESTROYED\" }\n | { type: \"FACT_CHANGED\"; key: string; value: unknown; prev: unknown }\n | { type: \"DERIVATION_CHANGED\"; key: string; value: unknown }\n | { type: \"REQUIREMENT_CREATED\"; requirement: Requirement & { id: string } }\n | { type: \"REQUIREMENT_MET\"; requirementId: string; resolverId: string }\n | { type: \"ERROR\"; error: string; source?: string }\n | {\n type: \"SNAPSHOT_RESULT\";\n requestId: string;\n snapshot: DistributableSnapshot;\n }\n | { type: \"INSPECT_RESULT\"; requestId: string; inspection: SystemInspection }\n | {\n type: \"SETTLE_RESULT\";\n requestId: string;\n success: boolean;\n error?: string;\n };\n\n// ============================================================================\n// Worker System Config\n// ============================================================================\n\n/**\n * Configuration for creating a system inside a worker.\n * Note: Functions cannot be serialized, so modules must be defined\n * in the worker script itself using createWorkerModule.\n */\nexport interface WorkerSystemConfig {\n /** Module names to initialize (modules must be registered in worker) */\n moduleNames: string[];\n /** History configuration for snapshot-based state history */\n history?:\n | boolean\n | {\n maxSnapshots?: number;\n };\n}\n\n// ============================================================================\n// Main Thread API\n// ============================================================================\n\n/**\n * Options for creating a worker client.\n */\nexport interface WorkerClientOptions {\n /** The web worker instance */\n worker: Worker;\n /** Callback when a fact changes in the worker */\n onFactChange?: (key: string, value: unknown, prev: unknown) => void;\n /** Callback when a derivation changes in the worker */\n onDerivationChange?: (key: string, value: unknown) => void;\n /** Callback when a requirement is created */\n onRequirementCreated?: (requirement: Requirement & { id: string }) => void;\n /** Callback when a requirement is met */\n onRequirementMet?: (requirementId: string, resolverId: string) => void;\n /** Callback when an error occurs */\n onError?: (error: string, source?: string) => void;\n}\n\n/**\n * Client for interacting with a Directive system running in a Web Worker.\n */\nexport interface WorkerClient {\n /** Initialize the worker system */\n init(config: WorkerSystemConfig): Promise<void>;\n /** Start the worker system */\n start(): Promise<void>;\n /** Stop the worker system */\n stop(): Promise<void>;\n /** Destroy the worker system and terminate the worker */\n destroy(): Promise<void>;\n /** Set a single fact */\n setFact(key: string, value: unknown): void;\n /** Set multiple facts at once */\n setFacts(facts: Record<string, unknown>): void;\n /** Dispatch an event */\n dispatch(event: { type: string; [key: string]: unknown }): void;\n /** Get a distributable snapshot */\n getSnapshot(\n options?: DistributableSnapshotOptions,\n ): Promise<DistributableSnapshot>;\n /** Inspect the system state */\n inspect(): Promise<SystemInspection>;\n /** Wait for the system to settle */\n settle(timeout?: number): Promise<void>;\n /** Terminate the worker */\n terminate(): void;\n}\n\n/**\n * Create a client for communicating with a Directive worker.\n *\n * @example\n * ```typescript\n * // main.ts\n * const worker = new Worker(new URL('./directive.worker.ts', import.meta.url));\n * const client = createWorkerClient({\n * worker,\n * onFactChange: (key, value) => console.log(`Fact ${key} = ${value}`),\n * });\n *\n * await client.init({ moduleNames: ['myModule'] });\n * await client.start();\n * client.setFact('userId', '123');\n * ```\n */\nexport function createWorkerClient(options: WorkerClientOptions): WorkerClient {\n const {\n worker,\n onFactChange,\n onDerivationChange,\n onRequirementCreated,\n onRequirementMet,\n onError,\n } = options;\n\n // Pending request callbacks\n const pendingRequests = new Map<\n string,\n { resolve: (value: unknown) => void; reject: (error: Error) => void }\n >();\n let requestIdCounter = 0;\n\n // Promise resolvers for lifecycle events\n let initResolve: (() => void) | null = null;\n let startResolve: (() => void) | null = null;\n let stopResolve: (() => void) | null = null;\n let destroyResolve: (() => void) | null = null;\n\n // ---- Outbound message handlers ----\n\n function resolveLifecycle(resolve: (() => void) | null): (() => void) | null {\n resolve?.();\n\n return null;\n }\n\n function resolvePendingRequest(requestId: string, value: unknown): void {\n const pending = pendingRequests.get(requestId);\n if (pending) {\n pending.resolve(value);\n pendingRequests.delete(requestId);\n }\n }\n\n function handleReady(): void {\n initResolve = resolveLifecycle(initResolve);\n }\n\n function handleStarted(): void {\n startResolve = resolveLifecycle(startResolve);\n }\n\n function handleStopped(): void {\n stopResolve = resolveLifecycle(stopResolve);\n }\n\n function handleDestroyed(): void {\n destroyResolve = resolveLifecycle(destroyResolve);\n }\n\n function handleFactChanged(\n message: Extract<WorkerOutboundMessage, { type: \"FACT_CHANGED\" }>,\n ): void {\n onFactChange?.(message.key, message.value, message.prev);\n }\n\n function handleDerivationChanged(\n message: Extract<WorkerOutboundMessage, { type: \"DERIVATION_CHANGED\" }>,\n ): void {\n onDerivationChange?.(message.key, message.value);\n }\n\n function handleRequirementCreated(\n message: Extract<WorkerOutboundMessage, { type: \"REQUIREMENT_CREATED\" }>,\n ): void {\n onRequirementCreated?.(message.requirement);\n }\n\n function handleRequirementMet(\n message: Extract<WorkerOutboundMessage, { type: \"REQUIREMENT_MET\" }>,\n ): void {\n onRequirementMet?.(message.requirementId, message.resolverId);\n }\n\n function handleError(\n message: Extract<WorkerOutboundMessage, { type: \"ERROR\" }>,\n ): void {\n onError?.(message.error, message.source);\n }\n\n function handleSnapshotResult(\n message: Extract<WorkerOutboundMessage, { type: \"SNAPSHOT_RESULT\" }>,\n ): void {\n resolvePendingRequest(message.requestId, message.snapshot);\n }\n\n function handleInspectResult(\n message: Extract<WorkerOutboundMessage, { type: \"INSPECT_RESULT\" }>,\n ): void {\n resolvePendingRequest(message.requestId, message.inspection);\n }\n\n function handleSettleResult(\n message: Extract<WorkerOutboundMessage, { type: \"SETTLE_RESULT\" }>,\n ): void {\n const pending = pendingRequests.get(message.requestId);\n if (pending) {\n if (message.success) {\n pending.resolve(undefined);\n } else {\n pending.reject(new Error(message.error || \"Settle failed\"));\n }\n pendingRequests.delete(message.requestId);\n }\n }\n\n // Handle messages from worker\n worker.onmessage = (event: MessageEvent<WorkerOutboundMessage>) => {\n const message = event.data;\n\n switch (message.type) {\n case \"READY\":\n return handleReady();\n case \"STARTED\":\n return handleStarted();\n case \"STOPPED\":\n return handleStopped();\n case \"DESTROYED\":\n return handleDestroyed();\n case \"FACT_CHANGED\":\n return handleFactChanged(message);\n case \"DERIVATION_CHANGED\":\n return handleDerivationChanged(message);\n case \"REQUIREMENT_CREATED\":\n return handleRequirementCreated(message);\n case \"REQUIREMENT_MET\":\n return handleRequirementMet(message);\n case \"ERROR\":\n return handleError(message);\n case \"SNAPSHOT_RESULT\":\n return handleSnapshotResult(message);\n case \"INSPECT_RESULT\":\n return handleInspectResult(message);\n case \"SETTLE_RESULT\":\n return handleSettleResult(message);\n }\n };\n\n worker.onerror = (event) => {\n onError?.(event.message, \"worker\");\n };\n\n function send(message: WorkerInboundMessage): void {\n worker.postMessage(message);\n }\n\n function request<T>(\n message: WorkerInboundMessage & { requestId: string },\n ): Promise<T> {\n return new Promise((resolve, reject) => {\n pendingRequests.set(message.requestId, {\n resolve: resolve as (value: unknown) => void,\n reject,\n });\n send(message);\n });\n }\n\n return {\n init(config: WorkerSystemConfig): Promise<void> {\n return new Promise((resolve) => {\n initResolve = resolve;\n send({ type: \"INIT\", config });\n });\n },\n\n start(): Promise<void> {\n return new Promise((resolve) => {\n startResolve = resolve;\n send({ type: \"START\" });\n });\n },\n\n stop(): Promise<void> {\n return new Promise((resolve) => {\n stopResolve = resolve;\n send({ type: \"STOP\" });\n });\n },\n\n destroy(): Promise<void> {\n return new Promise((resolve) => {\n destroyResolve = resolve;\n send({ type: \"DESTROY\" });\n });\n },\n\n setFact(key: string, value: unknown): void {\n send({ type: \"SET_FACT\", key, value });\n },\n\n setFacts(facts: Record<string, unknown>): void {\n send({ type: \"SET_FACTS\", facts });\n },\n\n dispatch(event: { type: string; [key: string]: unknown }): void {\n send({ type: \"DISPATCH\", event });\n },\n\n getSnapshot(\n options?: DistributableSnapshotOptions,\n ): Promise<DistributableSnapshot> {\n const requestId = `snapshot-${++requestIdCounter}`;\n return request({ type: \"GET_SNAPSHOT\", options, requestId });\n },\n\n inspect(): Promise<SystemInspection> {\n const requestId = `inspect-${++requestIdCounter}`;\n return request({ type: \"INSPECT\", requestId });\n },\n\n settle(timeout?: number): Promise<void> {\n const requestId = `settle-${++requestIdCounter}`;\n return request({ type: \"SETTLE\", timeout, requestId });\n },\n\n terminate(): void {\n worker.terminate();\n },\n };\n}\n\n// ============================================================================\n// Worker-Side API\n// ============================================================================\n\n/**\n * Module registration for worker-side systems.\n * Since functions can't be serialized, modules must be registered in the worker.\n */\n// biome-ignore lint/suspicious/noExplicitAny: Module types vary\ntype ModuleRegistry = Map<string, any>;\n\nlet workerModuleRegistry: ModuleRegistry | null = null;\n\n/**\n * Get or create the module registry for worker-side modules.\n */\nexport function getWorkerModuleRegistry(): ModuleRegistry {\n if (!workerModuleRegistry) {\n workerModuleRegistry = new Map();\n }\n return workerModuleRegistry;\n}\n\n/**\n * Register a module for use in workers.\n * Call this in your worker script before handling INIT messages.\n *\n * @example\n * ```typescript\n * // directive.worker.ts\n * import { registerWorkerModule, handleWorkerMessages } from '@directive-run/core/worker';\n * import { myModule } from './modules/my-module';\n *\n * registerWorkerModule('myModule', myModule);\n * handleWorkerMessages();\n * ```\n */\n// biome-ignore lint/suspicious/noExplicitAny: Module type varies\nexport function registerWorkerModule(name: string, module: any): void {\n getWorkerModuleRegistry().set(name, module);\n}\n\n/**\n * Handler for worker-side message processing.\n * Sets up the message listener and creates/manages the Directive system.\n *\n * @example\n * ```typescript\n * // directive.worker.ts\n * import { registerWorkerModule, handleWorkerMessages } from '@directive-run/core/worker';\n *\n * registerWorkerModule('myModule', myModule);\n * handleWorkerMessages();\n * ```\n */\nexport function handleWorkerMessages(): void {\n // Dynamic import to avoid issues in non-worker contexts\n // The actual system creation happens when messages are received\n type WorkerSystem = Awaited<ReturnType<typeof createWorkerSystem>>;\n let system: WorkerSystem | null = null;\n\n // ---- Inbound message handlers ----\n\n async function handleInit(\n message: Extract<WorkerInboundMessage, { type: \"INIT\" }>,\n ): Promise<WorkerSystem> {\n const created = await createWorkerSystem(message.config);\n postMessage({ type: \"READY\" } satisfies WorkerOutboundMessage);\n\n return created;\n }\n\n function handleStart(sys: WorkerSystem): void {\n sys.start();\n postMessage({ type: \"STARTED\" } satisfies WorkerOutboundMessage);\n }\n\n function handleStop(sys: WorkerSystem): void {\n sys.stop();\n postMessage({ type: \"STOPPED\" } satisfies WorkerOutboundMessage);\n }\n\n function handleDestroy(sys: WorkerSystem): void {\n sys.destroy();\n postMessage({ type: \"DESTROYED\" } satisfies WorkerOutboundMessage);\n }\n\n function handleGetSnapshot(\n sys: WorkerSystem,\n message: Extract<WorkerInboundMessage, { type: \"GET_SNAPSHOT\" }>,\n ): void {\n const snapshot = sys.getSnapshot(message.options);\n postMessage({\n type: \"SNAPSHOT_RESULT\",\n requestId: message.requestId,\n snapshot,\n } satisfies WorkerOutboundMessage);\n }\n\n function handleInspect(\n sys: WorkerSystem,\n message: Extract<WorkerInboundMessage, { type: \"INSPECT\" }>,\n ): void {\n const inspection = sys.inspect();\n postMessage({\n type: \"INSPECT_RESULT\",\n requestId: message.requestId,\n inspection,\n } satisfies WorkerOutboundMessage);\n }\n\n async function handleSettle(\n sys: WorkerSystem,\n message: Extract<WorkerInboundMessage, { type: \"SETTLE\" }>,\n ): Promise<void> {\n try {\n await sys.settle(message.timeout);\n postMessage({\n type: \"SETTLE_RESULT\",\n requestId: message.requestId,\n success: true,\n } satisfies WorkerOutboundMessage);\n } catch (error) {\n postMessage({\n type: \"SETTLE_RESULT\",\n requestId: message.requestId,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n } satisfies WorkerOutboundMessage);\n }\n }\n\n // ---- Message dispatch ----\n\n async function dispatchMessage(message: WorkerInboundMessage): Promise<void> {\n if (message.type === \"INIT\") {\n system = await handleInit(message);\n\n return;\n }\n\n if (!system) {\n return;\n }\n\n switch (message.type) {\n case \"START\":\n handleStart(system);\n break;\n case \"STOP\":\n handleStop(system);\n break;\n case \"DESTROY\":\n handleDestroy(system);\n system = null;\n break;\n case \"SET_FACT\":\n system.setFact(message.key, message.value);\n break;\n case \"SET_FACTS\":\n system.setFacts(message.facts);\n break;\n case \"DISPATCH\":\n system.dispatch(message.event);\n break;\n case \"GET_SNAPSHOT\":\n handleGetSnapshot(system, message);\n break;\n case \"INSPECT\":\n handleInspect(system, message);\n break;\n case \"SETTLE\":\n await handleSettle(system, message);\n break;\n }\n }\n\n self.onmessage = async (event: MessageEvent<WorkerInboundMessage>) => {\n try {\n await dispatchMessage(event.data);\n } catch (error) {\n postMessage({\n type: \"ERROR\",\n error: error instanceof Error ? error.message : String(error),\n source: event.data.type,\n } satisfies WorkerOutboundMessage);\n }\n };\n}\n\n/**\n * Internal: Create a system inside the worker.\n */\nasync function createWorkerSystem(config: WorkerSystemConfig) {\n // Dynamically import createSystem to avoid circular dependencies\n const { createSystem } = await import(\"../core/system.js\");\n\n const registry = getWorkerModuleRegistry();\n const modules: Record<string, unknown> = {};\n\n for (const name of config.moduleNames) {\n const module = registry.get(name);\n if (!module) {\n throw new Error(\n `[Directive Worker] Module \"${name}\" not registered. ` +\n `Call registerWorkerModule('${name}', module) before handling messages.`,\n );\n }\n modules[name] = module;\n }\n\n // Create tracking plugin to notify main thread\n const trackingPlugin = {\n name: \"__worker-tracking__\",\n onFactSet: (key: string, value: unknown, prev: unknown) => {\n postMessage({\n type: \"FACT_CHANGED\",\n key,\n value,\n prev,\n } satisfies WorkerOutboundMessage);\n },\n onDerivationCompute: (id: string, value: unknown) => {\n postMessage({\n type: \"DERIVATION_CHANGED\",\n key: id,\n value,\n } satisfies WorkerOutboundMessage);\n },\n onRequirementCreated: (req: { id: string; requirement: Requirement }) => {\n postMessage({\n type: \"REQUIREMENT_CREATED\",\n requirement: { ...req.requirement, id: req.id },\n } satisfies WorkerOutboundMessage);\n },\n onRequirementMet: (req: { id: string }, resolverId: string) => {\n postMessage({\n type: \"REQUIREMENT_MET\",\n requirementId: req.id,\n resolverId,\n } satisfies WorkerOutboundMessage);\n },\n };\n\n const system = createSystem({\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic module types\n modules: modules as any,\n plugins: [trackingPlugin],\n history: config.history,\n });\n\n return {\n start: () => system.start(),\n stop: () => system.stop(),\n destroy: () => system.destroy(),\n setFact: (key: string, value: unknown) => {\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic facts access\n (system.facts as any)[key] = value;\n },\n setFacts: (facts: Record<string, unknown>) => {\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic facts access\n const factsProxy = system.facts as any;\n if (factsProxy.$store?.batch) {\n factsProxy.$store.batch(() => {\n for (const [key, value] of Object.entries(facts)) {\n factsProxy[key] = value;\n }\n });\n } else {\n // Fallback: set facts one by one\n for (const [key, value] of Object.entries(facts)) {\n factsProxy[key] = value;\n }\n }\n },\n dispatch: (event: { type: string }) => {\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic dispatch\n (system as any).dispatch(event);\n },\n getSnapshot: (options?: DistributableSnapshotOptions) => {\n return system.getDistributableSnapshot(options);\n },\n inspect: () => system.inspect(),\n settle: (timeout?: number) => system.settle(timeout),\n };\n}\n\n// ============================================================================\n// Type Helpers\n// ============================================================================\n\n/**\n * Type helper for creating type-safe worker clients.\n * Use this to get proper typing for facts and events.\n *\n * @example\n * ```typescript\n * type MyWorkerClient = TypedWorkerClient<typeof myModuleSchema>;\n * const client = createWorkerClient(options) as MyWorkerClient;\n * client.setFact('userId', '123'); // Type-checked!\n * ```\n */\nexport type TypedWorkerClient<M extends ModuleSchema> = Omit<\n WorkerClient,\n \"setFact\" | \"setFacts\" | \"dispatch\"\n> & {\n setFact<K extends keyof M[\"facts\"]>(\n key: K,\n value: M[\"facts\"][K] extends { _type: infer T } ? T : M[\"facts\"][K],\n ): void;\n setFacts(\n facts: Partial<{\n [K in keyof M[\"facts\"]]: M[\"facts\"][K] extends { _type: infer T }\n ? T\n : M[\"facts\"][K];\n }>,\n ): void;\n dispatch(\n event: M[\"events\"] extends Record<string, unknown>\n ? {\n [K in keyof M[\"events\"]]: { type: K } & M[\"events\"][K];\n }[keyof M[\"events\"]]\n : { type: string },\n ): void;\n};\n"]}
{"version":3,"sources":["../src/adapters/worker.ts"],"names":["createWorkerClient","options","worker","onFactChange","onDerivationChange","onRequirementCreated","onRequirementMet","onError","pendingRequests","requestIdCounter","DEFAULT_REQUEST_TIMEOUT_MS","clearPendingTimeout","requestId","pending","initResolve","startResolve","stopResolve","destroyResolve","resolveLifecycle","resolve","resolvePendingRequest","value","handleReady","handleStarted","handleStopped","handleDestroyed","handleFactChanged","message","handleDerivationChanged","handleRequirementCreated","handleRequirementMet","handleError","handleSnapshotResult","handleInspectResult","handleSettleResult","event","msg","err","send","request","timeoutMs","reject","entry","config","key","facts","timeout","workerModuleRegistry","getWorkerModuleRegistry","registerWorkerModule","name","module","handleWorkerMessages","system","handleInit","created","createWorkerSystem","handleStart","sys","handleStop","handleDestroy","handleGetSnapshot","snapshot","handleInspect","inspection","handleSettle","error","dispatchMessage","createSystem","registry","modules","prev","id","req","resolverId","factsProxy"],"mappings":"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","file":"worker.js","sourcesContent":["/**\n * Web Worker Adapter - Run Directive engine off the main thread\n *\n * Features:\n * - Run computations in a dedicated worker\n * - Synchronized state between main thread and worker\n * - Automatic serialization of facts and derivations\n * - Event-based communication\n */\n\nimport type {\n DistributableSnapshot,\n DistributableSnapshotOptions,\n ModuleSchema,\n Requirement,\n SystemInspection,\n} from \"../core/types.js\";\n\n// ============================================================================\n// Message Types\n// ============================================================================\n\n/** Messages sent from main thread to worker */\nexport type WorkerInboundMessage =\n | { type: \"INIT\"; config: WorkerSystemConfig }\n | { type: \"START\" }\n | { type: \"STOP\" }\n | { type: \"DESTROY\" }\n | { type: \"SET_FACT\"; key: string; value: unknown }\n | { type: \"SET_FACTS\"; facts: Record<string, unknown> }\n | { type: \"DISPATCH\"; event: { type: string; [key: string]: unknown } }\n | {\n type: \"GET_SNAPSHOT\";\n options?: DistributableSnapshotOptions;\n requestId: string;\n }\n | { type: \"INSPECT\"; requestId: string }\n | { type: \"SETTLE\"; timeout?: number; requestId: string };\n\n/** Messages sent from worker to main thread */\nexport type WorkerOutboundMessage =\n | { type: \"READY\" }\n | { type: \"STARTED\" }\n | { type: \"STOPPED\" }\n | { type: \"DESTROYED\" }\n | { type: \"FACT_CHANGED\"; key: string; value: unknown; prev: unknown }\n | { type: \"DERIVATION_CHANGED\"; key: string; value: unknown }\n | { type: \"REQUIREMENT_CREATED\"; requirement: Requirement & { id: string } }\n | { type: \"REQUIREMENT_MET\"; requirementId: string; resolverId: string }\n | { type: \"ERROR\"; error: string; source?: string }\n | {\n type: \"SNAPSHOT_RESULT\";\n requestId: string;\n snapshot: DistributableSnapshot;\n }\n | { type: \"INSPECT_RESULT\"; requestId: string; inspection: SystemInspection }\n | {\n type: \"SETTLE_RESULT\";\n requestId: string;\n success: boolean;\n error?: string;\n };\n\n// ============================================================================\n// Worker System Config\n// ============================================================================\n\n/**\n * Configuration for creating a system inside a worker.\n * Note: Functions cannot be serialized, so modules must be defined\n * in the worker script itself using createWorkerModule.\n */\nexport interface WorkerSystemConfig {\n /** Module names to initialize (modules must be registered in worker) */\n moduleNames: string[];\n /** History configuration for snapshot-based state history */\n history?:\n | boolean\n | {\n maxSnapshots?: number;\n };\n}\n\n// ============================================================================\n// Main Thread API\n// ============================================================================\n\n/**\n * Options for creating a worker client.\n */\nexport interface WorkerClientOptions {\n /** The web worker instance */\n worker: Worker;\n /** Callback when a fact changes in the worker */\n onFactChange?: (key: string, value: unknown, prev: unknown) => void;\n /** Callback when a derivation changes in the worker */\n onDerivationChange?: (key: string, value: unknown) => void;\n /** Callback when a requirement is created */\n onRequirementCreated?: (requirement: Requirement & { id: string }) => void;\n /** Callback when a requirement is met */\n onRequirementMet?: (requirementId: string, resolverId: string) => void;\n /** Callback when an error occurs */\n onError?: (error: string, source?: string) => void;\n}\n\n/**\n * Client for interacting with a Directive system running in a Web Worker.\n */\nexport interface WorkerClient {\n /** Initialize the worker system */\n init(config: WorkerSystemConfig): Promise<void>;\n /** Start the worker system */\n start(): Promise<void>;\n /** Stop the worker system */\n stop(): Promise<void>;\n /** Destroy the worker system and terminate the worker */\n destroy(): Promise<void>;\n /** Set a single fact */\n setFact(key: string, value: unknown): void;\n /** Set multiple facts at once */\n setFacts(facts: Record<string, unknown>): void;\n /** Dispatch an event */\n dispatch(event: { type: string; [key: string]: unknown }): void;\n /**\n * Get a distributable snapshot.\n *\n * @param options Snapshot options forwarded to the worker.\n * @param timeoutMs Per-request timeout in ms. Defaults to 30_000.\n * Pass `0` or `Infinity` to disable the timeout.\n */\n getSnapshot(\n options?: DistributableSnapshotOptions,\n timeoutMs?: number,\n ): Promise<DistributableSnapshot>;\n /**\n * Inspect the system state.\n *\n * @param timeoutMs Per-request timeout in ms. Defaults to 30_000.\n * Pass `0` or `Infinity` to disable the timeout.\n */\n inspect(timeoutMs?: number): Promise<SystemInspection>;\n /**\n * Wait for the system to settle.\n *\n * @param timeout Settle timeout forwarded to the worker (separate from request timeout).\n * @param timeoutMs Per-request timeout in ms. Defaults to 30_000.\n * Pass `0` or `Infinity` to disable the timeout.\n */\n settle(timeout?: number, timeoutMs?: number): Promise<void>;\n /** Terminate the worker */\n terminate(): void;\n}\n\n/**\n * Create a client for communicating with a Directive worker.\n *\n * @example\n * ```typescript\n * // main.ts\n * const worker = new Worker(new URL('./directive.worker.ts', import.meta.url));\n * const client = createWorkerClient({\n * worker,\n * onFactChange: (key, value) => console.log(`Fact ${key} = ${value}`),\n * });\n *\n * await client.init({ moduleNames: ['myModule'] });\n * await client.start();\n * client.setFact('userId', '123');\n * ```\n */\nexport function createWorkerClient(options: WorkerClientOptions): WorkerClient {\n const {\n worker,\n onFactChange,\n onDerivationChange,\n onRequirementCreated,\n onRequirementMet,\n onError,\n } = options;\n\n // Pending request callbacks. Each entry MAY hold a timeout handle so we\n // can clear it on resolve/reject without leaking the timer.\n const pendingRequests = new Map<\n string,\n {\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n timeoutHandle?: ReturnType<typeof setTimeout>;\n }\n >();\n let requestIdCounter = 0;\n\n /** Default per-request timeout (ms). 0 / Infinity = disabled. */\n const DEFAULT_REQUEST_TIMEOUT_MS = 30_000;\n\n function clearPendingTimeout(requestId: string): void {\n const pending = pendingRequests.get(requestId);\n if (pending?.timeoutHandle !== undefined) {\n clearTimeout(pending.timeoutHandle);\n }\n }\n\n // Promise resolvers for lifecycle events\n let initResolve: (() => void) | null = null;\n let startResolve: (() => void) | null = null;\n let stopResolve: (() => void) | null = null;\n let destroyResolve: (() => void) | null = null;\n\n // ---- Outbound message handlers ----\n\n function resolveLifecycle(resolve: (() => void) | null): (() => void) | null {\n resolve?.();\n\n return null;\n }\n\n function resolvePendingRequest(requestId: string, value: unknown): void {\n const pending = pendingRequests.get(requestId);\n if (pending) {\n clearPendingTimeout(requestId);\n pending.resolve(value);\n pendingRequests.delete(requestId);\n }\n }\n\n function handleReady(): void {\n initResolve = resolveLifecycle(initResolve);\n }\n\n function handleStarted(): void {\n startResolve = resolveLifecycle(startResolve);\n }\n\n function handleStopped(): void {\n stopResolve = resolveLifecycle(stopResolve);\n }\n\n function handleDestroyed(): void {\n destroyResolve = resolveLifecycle(destroyResolve);\n }\n\n function handleFactChanged(\n message: Extract<WorkerOutboundMessage, { type: \"FACT_CHANGED\" }>,\n ): void {\n onFactChange?.(message.key, message.value, message.prev);\n }\n\n function handleDerivationChanged(\n message: Extract<WorkerOutboundMessage, { type: \"DERIVATION_CHANGED\" }>,\n ): void {\n onDerivationChange?.(message.key, message.value);\n }\n\n function handleRequirementCreated(\n message: Extract<WorkerOutboundMessage, { type: \"REQUIREMENT_CREATED\" }>,\n ): void {\n onRequirementCreated?.(message.requirement);\n }\n\n function handleRequirementMet(\n message: Extract<WorkerOutboundMessage, { type: \"REQUIREMENT_MET\" }>,\n ): void {\n onRequirementMet?.(message.requirementId, message.resolverId);\n }\n\n function handleError(\n message: Extract<WorkerOutboundMessage, { type: \"ERROR\" }>,\n ): void {\n onError?.(message.error, message.source);\n }\n\n function handleSnapshotResult(\n message: Extract<WorkerOutboundMessage, { type: \"SNAPSHOT_RESULT\" }>,\n ): void {\n resolvePendingRequest(message.requestId, message.snapshot);\n }\n\n function handleInspectResult(\n message: Extract<WorkerOutboundMessage, { type: \"INSPECT_RESULT\" }>,\n ): void {\n resolvePendingRequest(message.requestId, message.inspection);\n }\n\n function handleSettleResult(\n message: Extract<WorkerOutboundMessage, { type: \"SETTLE_RESULT\" }>,\n ): void {\n const pending = pendingRequests.get(message.requestId);\n if (pending) {\n clearPendingTimeout(message.requestId);\n if (message.success) {\n pending.resolve(undefined);\n } else {\n pending.reject(new Error(message.error || \"Settle failed\"));\n }\n pendingRequests.delete(message.requestId);\n }\n }\n\n // Handle messages from worker\n worker.onmessage = (event: MessageEvent<WorkerOutboundMessage>) => {\n const message = event.data;\n\n switch (message.type) {\n case \"READY\":\n return handleReady();\n case \"STARTED\":\n return handleStarted();\n case \"STOPPED\":\n return handleStopped();\n case \"DESTROYED\":\n return handleDestroyed();\n case \"FACT_CHANGED\":\n return handleFactChanged(message);\n case \"DERIVATION_CHANGED\":\n return handleDerivationChanged(message);\n case \"REQUIREMENT_CREATED\":\n return handleRequirementCreated(message);\n case \"REQUIREMENT_MET\":\n return handleRequirementMet(message);\n case \"ERROR\":\n return handleError(message);\n case \"SNAPSHOT_RESULT\":\n return handleSnapshotResult(message);\n case \"INSPECT_RESULT\":\n return handleInspectResult(message);\n case \"SETTLE_RESULT\":\n return handleSettleResult(message);\n }\n };\n\n worker.onerror = (event) => {\n const msg =\n event && typeof event === \"object\" && \"message\" in event\n ? String((event as { message?: unknown }).message ?? \"unknown error\")\n : \"unknown error\";\n // Reject ALL pending requests so they don't leak when the worker dies.\n if (pendingRequests.size > 0) {\n const err = new Error(`[Directive] worker errored: ${msg}`);\n for (const [, pending] of pendingRequests) {\n if (pending.timeoutHandle !== undefined) {\n clearTimeout(pending.timeoutHandle);\n }\n pending.reject(err);\n }\n pendingRequests.clear();\n }\n onError?.(msg, \"worker\");\n };\n\n function send(message: WorkerInboundMessage): void {\n worker.postMessage(message);\n }\n\n function request<T>(\n message: WorkerInboundMessage & { requestId: string },\n timeoutMs: number = DEFAULT_REQUEST_TIMEOUT_MS,\n ): Promise<T> {\n return new Promise((resolve, reject) => {\n const entry: {\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n timeoutHandle?: ReturnType<typeof setTimeout>;\n } = {\n resolve: resolve as (value: unknown) => void,\n reject,\n };\n\n // Only arm the timer if a finite positive timeout was requested.\n if (\n Number.isFinite(timeoutMs) &&\n (timeoutMs as number) > 0\n ) {\n entry.timeoutHandle = setTimeout(() => {\n if (pendingRequests.has(message.requestId)) {\n pendingRequests.delete(message.requestId);\n reject(\n new Error(\n `[Directive] worker request timed out after ${timeoutMs}ms`,\n ),\n );\n }\n }, timeoutMs);\n }\n\n pendingRequests.set(message.requestId, entry);\n send(message);\n });\n }\n\n return {\n init(config: WorkerSystemConfig): Promise<void> {\n return new Promise((resolve) => {\n initResolve = resolve;\n send({ type: \"INIT\", config });\n });\n },\n\n start(): Promise<void> {\n return new Promise((resolve) => {\n startResolve = resolve;\n send({ type: \"START\" });\n });\n },\n\n stop(): Promise<void> {\n return new Promise((resolve) => {\n stopResolve = resolve;\n send({ type: \"STOP\" });\n });\n },\n\n destroy(): Promise<void> {\n return new Promise((resolve) => {\n destroyResolve = resolve;\n send({ type: \"DESTROY\" });\n });\n },\n\n setFact(key: string, value: unknown): void {\n send({ type: \"SET_FACT\", key, value });\n },\n\n setFacts(facts: Record<string, unknown>): void {\n send({ type: \"SET_FACTS\", facts });\n },\n\n dispatch(event: { type: string; [key: string]: unknown }): void {\n send({ type: \"DISPATCH\", event });\n },\n\n getSnapshot(\n options?: DistributableSnapshotOptions,\n timeoutMs?: number,\n ): Promise<DistributableSnapshot> {\n const requestId = `snapshot-${++requestIdCounter}`;\n return request(\n { type: \"GET_SNAPSHOT\", options, requestId },\n timeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS,\n );\n },\n\n inspect(timeoutMs?: number): Promise<SystemInspection> {\n const requestId = `inspect-${++requestIdCounter}`;\n return request(\n { type: \"INSPECT\", requestId },\n timeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS,\n );\n },\n\n settle(timeout?: number, timeoutMs?: number): Promise<void> {\n const requestId = `settle-${++requestIdCounter}`;\n return request(\n { type: \"SETTLE\", timeout, requestId },\n timeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS,\n );\n },\n\n terminate(): void {\n worker.terminate();\n },\n };\n}\n\n// ============================================================================\n// Worker-Side API\n// ============================================================================\n\n/**\n * Module registration for worker-side systems.\n * Since functions can't be serialized, modules must be registered in the worker.\n */\n// biome-ignore lint/suspicious/noExplicitAny: Module types vary\ntype ModuleRegistry = Map<string, any>;\n\nlet workerModuleRegistry: ModuleRegistry | null = null;\n\n/**\n * Get or create the module registry for worker-side modules.\n */\nexport function getWorkerModuleRegistry(): ModuleRegistry {\n if (!workerModuleRegistry) {\n workerModuleRegistry = new Map();\n }\n return workerModuleRegistry;\n}\n\n/**\n * Register a module for use in workers.\n * Call this in your worker script before handling INIT messages.\n *\n * @example\n * ```typescript\n * // directive.worker.ts\n * import { registerWorkerModule, handleWorkerMessages } from '@directive-run/core/worker';\n * import { myModule } from './modules/my-module';\n *\n * registerWorkerModule('myModule', myModule);\n * handleWorkerMessages();\n * ```\n */\n// biome-ignore lint/suspicious/noExplicitAny: Module type varies\nexport function registerWorkerModule(name: string, module: any): void {\n getWorkerModuleRegistry().set(name, module);\n}\n\n/**\n * Handler for worker-side message processing.\n * Sets up the message listener and creates/manages the Directive system.\n *\n * @example\n * ```typescript\n * // directive.worker.ts\n * import { registerWorkerModule, handleWorkerMessages } from '@directive-run/core/worker';\n *\n * registerWorkerModule('myModule', myModule);\n * handleWorkerMessages();\n * ```\n */\nexport function handleWorkerMessages(): void {\n // Dynamic import to avoid issues in non-worker contexts\n // The actual system creation happens when messages are received\n type WorkerSystem = Awaited<ReturnType<typeof createWorkerSystem>>;\n let system: WorkerSystem | null = null;\n\n // ---- Inbound message handlers ----\n\n async function handleInit(\n message: Extract<WorkerInboundMessage, { type: \"INIT\" }>,\n ): Promise<WorkerSystem> {\n const created = await createWorkerSystem(message.config);\n postMessage({ type: \"READY\" } satisfies WorkerOutboundMessage);\n\n return created;\n }\n\n function handleStart(sys: WorkerSystem): void {\n sys.start();\n postMessage({ type: \"STARTED\" } satisfies WorkerOutboundMessage);\n }\n\n function handleStop(sys: WorkerSystem): void {\n sys.stop();\n postMessage({ type: \"STOPPED\" } satisfies WorkerOutboundMessage);\n }\n\n function handleDestroy(sys: WorkerSystem): void {\n sys.destroy();\n postMessage({ type: \"DESTROYED\" } satisfies WorkerOutboundMessage);\n }\n\n function handleGetSnapshot(\n sys: WorkerSystem,\n message: Extract<WorkerInboundMessage, { type: \"GET_SNAPSHOT\" }>,\n ): void {\n const snapshot = sys.getSnapshot(message.options);\n postMessage({\n type: \"SNAPSHOT_RESULT\",\n requestId: message.requestId,\n snapshot,\n } satisfies WorkerOutboundMessage);\n }\n\n function handleInspect(\n sys: WorkerSystem,\n message: Extract<WorkerInboundMessage, { type: \"INSPECT\" }>,\n ): void {\n const inspection = sys.inspect();\n postMessage({\n type: \"INSPECT_RESULT\",\n requestId: message.requestId,\n inspection,\n } satisfies WorkerOutboundMessage);\n }\n\n async function handleSettle(\n sys: WorkerSystem,\n message: Extract<WorkerInboundMessage, { type: \"SETTLE\" }>,\n ): Promise<void> {\n try {\n await sys.settle(message.timeout);\n postMessage({\n type: \"SETTLE_RESULT\",\n requestId: message.requestId,\n success: true,\n } satisfies WorkerOutboundMessage);\n } catch (error) {\n postMessage({\n type: \"SETTLE_RESULT\",\n requestId: message.requestId,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n } satisfies WorkerOutboundMessage);\n }\n }\n\n // ---- Message dispatch ----\n\n async function dispatchMessage(message: WorkerInboundMessage): Promise<void> {\n if (message.type === \"INIT\") {\n system = await handleInit(message);\n\n return;\n }\n\n if (!system) {\n return;\n }\n\n switch (message.type) {\n case \"START\":\n handleStart(system);\n break;\n case \"STOP\":\n handleStop(system);\n break;\n case \"DESTROY\":\n handleDestroy(system);\n system = null;\n break;\n case \"SET_FACT\":\n system.setFact(message.key, message.value);\n break;\n case \"SET_FACTS\":\n system.setFacts(message.facts);\n break;\n case \"DISPATCH\":\n system.dispatch(message.event);\n break;\n case \"GET_SNAPSHOT\":\n handleGetSnapshot(system, message);\n break;\n case \"INSPECT\":\n handleInspect(system, message);\n break;\n case \"SETTLE\":\n await handleSettle(system, message);\n break;\n }\n }\n\n self.onmessage = async (event: MessageEvent<WorkerInboundMessage>) => {\n try {\n await dispatchMessage(event.data);\n } catch (error) {\n postMessage({\n type: \"ERROR\",\n error: error instanceof Error ? error.message : String(error),\n source: event.data.type,\n } satisfies WorkerOutboundMessage);\n }\n };\n}\n\n/**\n * Internal: Create a system inside the worker.\n */\nasync function createWorkerSystem(config: WorkerSystemConfig) {\n // Dynamically import createSystem to avoid circular dependencies\n const { createSystem } = await import(\"../core/system.js\");\n\n const registry = getWorkerModuleRegistry();\n const modules: Record<string, unknown> = {};\n\n for (const name of config.moduleNames) {\n const module = registry.get(name);\n if (!module) {\n throw new Error(\n `[Directive Worker] Module \"${name}\" not registered. ` +\n `Call registerWorkerModule('${name}', module) before handling messages.`,\n );\n }\n modules[name] = module;\n }\n\n // Create tracking plugin to notify main thread\n const trackingPlugin = {\n name: \"__worker-tracking__\",\n onFactSet: (key: string, value: unknown, prev: unknown) => {\n postMessage({\n type: \"FACT_CHANGED\",\n key,\n value,\n prev,\n } satisfies WorkerOutboundMessage);\n },\n onDerivationCompute: (id: string, value: unknown) => {\n postMessage({\n type: \"DERIVATION_CHANGED\",\n key: id,\n value,\n } satisfies WorkerOutboundMessage);\n },\n onRequirementCreated: (req: { id: string; requirement: Requirement }) => {\n postMessage({\n type: \"REQUIREMENT_CREATED\",\n requirement: { ...req.requirement, id: req.id },\n } satisfies WorkerOutboundMessage);\n },\n onRequirementMet: (req: { id: string }, resolverId: string) => {\n postMessage({\n type: \"REQUIREMENT_MET\",\n requirementId: req.id,\n resolverId,\n } satisfies WorkerOutboundMessage);\n },\n };\n\n const system = createSystem({\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic module types\n modules: modules as any,\n plugins: [trackingPlugin],\n history: config.history,\n });\n\n return {\n start: () => system.start(),\n stop: () => system.stop(),\n destroy: () => system.destroy(),\n setFact: (key: string, value: unknown) => {\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic facts access\n (system.facts as any)[key] = value;\n },\n setFacts: (facts: Record<string, unknown>) => {\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic facts access\n const factsProxy = system.facts as any;\n if (factsProxy.$store?.batch) {\n factsProxy.$store.batch(() => {\n for (const [key, value] of Object.entries(facts)) {\n factsProxy[key] = value;\n }\n });\n } else {\n // Fallback: set facts one by one\n for (const [key, value] of Object.entries(facts)) {\n factsProxy[key] = value;\n }\n }\n },\n dispatch: (event: { type: string }) => {\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic dispatch\n (system as any).dispatch(event);\n },\n getSnapshot: (options?: DistributableSnapshotOptions) => {\n return system.getDistributableSnapshot(options);\n },\n inspect: () => system.inspect(),\n settle: (timeout?: number) => system.settle(timeout),\n };\n}\n\n// ============================================================================\n// Type Helpers\n// ============================================================================\n\n/**\n * Type helper for creating type-safe worker clients.\n * Use this to get proper typing for facts and events.\n *\n * @example\n * ```typescript\n * type MyWorkerClient = TypedWorkerClient<typeof myModuleSchema>;\n * const client = createWorkerClient(options) as MyWorkerClient;\n * client.setFact('userId', '123'); // Type-checked!\n * ```\n */\nexport type TypedWorkerClient<M extends ModuleSchema> = Omit<\n WorkerClient,\n \"setFact\" | \"setFacts\" | \"dispatch\"\n> & {\n setFact<K extends keyof M[\"facts\"]>(\n key: K,\n value: M[\"facts\"][K] extends { _type: infer T } ? T : M[\"facts\"][K],\n ): void;\n setFacts(\n facts: Partial<{\n [K in keyof M[\"facts\"]]: M[\"facts\"][K] extends { _type: infer T }\n ? T\n : M[\"facts\"][K];\n }>,\n ): void;\n dispatch(\n event: M[\"events\"] extends Record<string, unknown>\n ? {\n [K in keyof M[\"events\"]]: { type: K } & M[\"events\"][K];\n }[keyof M[\"events\"]]\n : { type: string },\n ): void;\n};\n"]}
{
"name": "@directive-run/core",
"version": "1.13.0",
"version": "1.14.0",
"imports": {

@@ -5,0 +5,0 @@ "#is-development": {

import { F as FactPredicate, C as ClauseResult, P as Plugin, M as ModuleSchema } from './plugins-BIzXaYbg.cjs';
/**
* createAuditLedger — append-only, queryable, hash-chained
* (djb2; SHA-256 reserved for v2) audit of every state change. For
* forensics and "show me why this user got that decision."
*
* Captures (per observation event):
*
* - `constraint.evaluate` → { whenSpec, whenExplain, active, whenSource? }
* - `resolver.write.rejected` (rejection + summary kinds)
* - `fact.change` → { key, prior, next }
* - `resolver.complete` → { resolverId, requirementId, duration }
* - `system.init` / `system.start` / `system.stop` / `system.destroy`
* - `system.snapshot` / `system.history.navigate` (lifecycle markers)
* - `system.truncated` (ring-buffer overflow marker)
* - `system.entry-erased` / `system.subject-erased` (GDPR Art.17 stub)
*
* Hash chain: each entry stores `prevHash` — the djb2 (`hashObject`)
* hash of the previous entry's stable-stringified payload. Tampering
* with any entry's payload breaks the next entry's `prevHash` link —
* visible in `verify()`. v1 ships sync djb2 only; `verify({ strong: true })`
* is reserved for v2 (SHA-256) and throws today.
*
* PII redaction: by default, fact keys whose meta carries the `pii`
* tag (via `system.meta.byTag("pii")`) have their values replaced with
* `"[redacted]"` in `whenExplain.actual`, `fact.change.prior`,
* `fact.change.next`, and the cached `whenSpec` operands. Opt out with
* `capturePII: true`.
*/
/** Hash algorithm tag — bumped if canonicalization or hash function changes. */
declare const HASH_ALGO: "djb2-1";
/**
* Entry schema version. Bumped if `AuditEntry` field shape changes in
* a way that breaks back-compat parsers. Persisted on every entry so
* exports remain self-describing across library upgrades. (F-5)
*/
declare const SCHEMA_VERSION: 1;
/**
* Private sentinel stamped onto tombstone entries by {@link createAuditLedger.erase}.
* Never exported, never serialized — `verify()` checks for it before
* accepting a `system.entry-erased` entry as a legitimate chain break.
*
* (N7) Without this, a caller holding a raw `AuditLedgerSink` reference
* could write `{ kind: "system.entry-erased", … }` directly into the
* sink to mask real tampering as legitimate erasure. The sentinel
* raises the bar so only the in-process ledger plugin (which lives in
* this module's closure) can mint a valid tombstone.
*/
declare const LEDGER_INTERNAL_TOKEN: unique symbol;
type AuditEntryKind = "constraint.evaluate" | "resolver.write.rejected" | "fact.change" | "resolver.complete" | "resolver.error" | "system.init" | "system.start" | "system.stop" | "system.destroy" | "system.snapshot" | "system.history.navigate" | "system.truncated" | "system.entry-erased" | "system.subject-erased";
interface AuditEntryBase {
/** Monotonic sequence number, starting at 0. */
readonly seq: number;
/** Wall-clock timestamp (ms epoch). */
readonly ts: number;
/** Discriminator. */
readonly kind: AuditEntryKind;
/** Hash of the previous entry's full payload. null on the genesis entry. */
readonly prevHash: string | null;
/**
* Hash algorithm tag identifying the canonicalization + hash
* function in use. Bumped if the algorithm or canonical form
* changes, so exports remain verifiable across versions.
*/
readonly hashAlgo: typeof HASH_ALGO;
/**
* Entry schema version — bumped if any `AuditEntry` field shape
* changes in a way that breaks back-compat. Pair with `hashAlgo`
* when migrating older exports. (F-5)
*/
readonly schemaVersion: typeof SCHEMA_VERSION;
/**
* Private sentinel — present (and equal to the in-module token) only
* on legitimate tombstones minted by `ledger.erase()`. Filtered out
* of all public read paths (`query`, `recent`, `toJSON`, etc.) so
* consumers never see or copy it. (N7)
*
* NOT serialized. NOT exported. Forging this from outside the module
* is impossible without the symbol reference; `verify()` rejects any
* `system.entry-erased` entry that lacks it.
*
* @internal
*/
readonly __internal?: typeof LEDGER_INTERNAL_TOKEN;
}
type AuditEntry = (AuditEntryBase & {
kind: "constraint.evaluate";
constraintId: string;
active: boolean;
/** Cached at ledger start from `system.inspect().constraints[].whenSpec`. Refreshed on `register()`/`assign()`/`unregister()`. May be undefined for function-form constraints (see `whenSource`). PII operands redacted unless `capturePII: true`. */
whenSpec?: FactPredicate<unknown>;
whenExplain?: readonly ClauseResult[];
/**
* For function-form constraints (no `whenSpec`), a tamper-evident
* identity for the function. We DO NOT capture the raw source —
* closures routinely reference secrets, API keys, or PII (e.g.
* `if (apiKey === "sk-live-xxx")`) and a preview would leak them
* into the audit log. Instead, we capture a djb2 hash of the
* stringified function (`hashObject(String(fn))`). Auditors can
* detect "the function changed between deploys" by comparing
* hashes across entries, without ever seeing the function body.
*
* Informational only — NOT replayable. (N5, M22)
*/
whenSource?: {
kind: "function";
sourceHash: string;
};
}) | (AuditEntryBase & {
kind: "resolver.write.rejected";
rejection: "rejection" | "summary";
resolverId: string;
requirementId: string;
reason: string;
fact?: string;
expected?: unknown;
actual?: unknown;
dropped?: number;
}) | (AuditEntryBase & {
kind: "fact.change";
key: string;
prior: unknown;
next: unknown;
}) | (AuditEntryBase & {
kind: "resolver.complete";
resolverId: string;
requirementId: string;
duration: number;
}) | (AuditEntryBase & {
kind: "resolver.error";
resolverId: string;
requirementId: string;
error: string;
}) | (AuditEntryBase & {
kind: "system.init" | "system.start" | "system.stop" | "system.destroy";
}) | (AuditEntryBase & {
kind: "system.snapshot";
snapshotId: number;
trigger: string;
}) | (AuditEntryBase & {
kind: "system.history.navigate";
from: number;
to: number;
}) | (AuditEntryBase & {
kind: "system.truncated";
droppedSeq: number;
droppedCount: number;
}) | (AuditEntryBase & {
kind: "system.entry-erased";
originalKind: AuditEntryKind;
erasedAt: number;
}) | (AuditEntryBase & {
kind: "system.subject-erased";
/**
* djb2 hash of the filter (via `hashObject(filter)`). PII-safe —
* the raw filter values never land in the ledger. Pair with
* `filterShape` to see which filter fields were used. (N2)
*/
filterHash: string;
/**
* Stripped-values shape of the filter — captures WHICH fields were
* present without recording their values. (N2)
*/
filterShape: {
factPath: boolean;
constraintId: boolean;
kind: AuditEntryKind | readonly AuditEntryKind[] | undefined;
changedBetween: "[range]" | undefined;
};
erased: number;
});
interface QueryFilter {
/** Exact-match fact path. */
factPath?: string;
/** Filter by constraint id. */
constraintId?: string;
/** Filter by entry kind. */
kind?: AuditEntryKind | readonly AuditEntryKind[];
/** Time range as `[startMs, endMs]`, ISO strings, or epoch numbers. */
changedBetween?: [string | number | Date, string | number | Date];
/** Maximum entries returned. Default 1000. */
limit?: number;
}
/**
* Verify result — chain valid OR a break with full context for tamper visualization.
*
* Erased entries (via `ledger.erase()`) appear as legitimate chain breaks —
* `verify()` reports them in `erasedSeqs` and continues the walk from the
* tombstone's own hash. Real tamper still surfaces as `valid: false`.
*
* Forged tombstones (a caller writes `kind: "system.entry-erased"`
* directly via `sink.write()` to mask tamper as erasure) are detected:
* legitimate tombstones carry an in-module sentinel that forgeries
* cannot mint, so `verify()` reports them as tamper. (N7)
*/
type VerifyResult = {
valid: true;
entryCount: number;
/**
* Seq numbers of entries legitimately broken by `erase()`
* tombstones. NOT timestamps — each entry pairs this seq with
* the per-entry `system.entry-erased.erasedAt` (ms epoch) for
* the timestamp. Empty unless the chain contains erasures.
* (N1 + M1; renamed from `erasedAt` in R3)
*/
erasedSeqs?: number[];
} | {
valid: false;
brokenAt: number;
expectedHash: string;
actualHash: string;
entry: AuditEntry;
/**
* Human-readable reason for the break — populated for cases
* where the cause is more specific than "hash mismatch" (e.g.
* tombstone forgery detected via missing sentinel).
*/
reason?: string;
};
interface AuditLedgerSink {
write(entry: AuditEntry): void;
query(filter: QueryFilter): readonly AuditEntry[];
recent(n: number): readonly AuditEntry[];
forFact(path: string, opts?: {
limit?: number;
}): readonly AuditEntry[];
forConstraint(id: string, opts?: {
limit?: number;
}): readonly AuditEntry[];
toJSON(): {
entries: readonly AuditEntry[];
capturedAt: number;
};
clear(): void;
destroy(): void;
/**
* Replace matching entries with tombstones IN PLACE (preserving seq +
* prevHash so the hash chain still verifies). v1 implementation
* matches on the same `QueryFilter` shape used by `query()`.
* Returns the count of entries replaced.
*
* WARNING: erases only from this sink. Any external copies (toJSON
* exports, downstream pipelines) must be erased separately.
*/
erase?(filter: QueryFilter, tombstoneFactory: (e: AuditEntry) => AuditEntry): number;
/**
* Optional hook fired by the sink BEFORE shifting the oldest entry
* out of a bounded ring buffer. The ledger plugin uses this to emit
* a `system.truncated` marker so an auditor sees that the log was
* truncated and where. (M23)
*/
onTruncate?(handler: (droppedSeq: number, droppedCount: number) => void): void;
}
/**
* In-memory bounded ring-buffer sink. Drops oldest entries past
* `capacity` (default 10,000). Use this as the default sink for dev,
* tests, and StackBlitz demos.
*/
declare function memorySink(opts?: {
capacity?: number;
}): AuditLedgerSink;
interface AuditLedgerOptions {
/** Sink to write entries to. Default: in-memory ring buffer (capacity 10k). */
sink?: AuditLedgerSink;
/**
* Whether to capture raw fact values (`prior`/`next` on fact.change,
* `actual` in whenExplain). Default `false` — PII-tagged facts are
* redacted by default. Set `true` to opt out of redaction.
*/
capturePII?: boolean;
/**
* Optional caller-supplied redactor. Runs AFTER the default
* pii-tag-based redaction. Useful for additional sanitization.
*/
redact?: (entry: AuditEntry) => AuditEntry;
}
interface AuditLedger {
/** The plugin to pass to `createSystem({ plugins: [...] })`. */
readonly plugin: Plugin<ModuleSchema>;
/** Query entries matching the filter. */
query(filter?: QueryFilter): readonly AuditEntry[];
/** Most recent N entries (chronological). */
recent(n: number): readonly AuditEntry[];
/** All entries that touch this fact path (exact match). */
forFact(path: string, opts?: {
limit?: number;
}): readonly AuditEntry[];
/** All entries for this constraint id. */
forConstraint(id: string, opts?: {
limit?: number;
}): readonly AuditEntry[];
/** Full ledger snapshot for export / serialization. */
toJSON(): {
entries: readonly AuditEntry[];
capturedAt: number;
};
/**
* Walk the hash chain genesis → tip. Returns `{ valid: true }` iff
* every entry's `prevHash` matches the (sync, djb2-based) hash of
* the previous entry. On break, returns the index of the first
* broken link plus the expected vs actual hashes — feed into a
* "TAMPERED" visualization.
*
* Erased entries (via `ledger.erase()`) appear as legitimate chain
* breaks — `verify()` reports them in `erasedSeqs` and continues
* the walk from the tombstone's actual hash. Real tamper still
* surfaces as `valid: false`. (N1 + M1)
*
* Forged tombstones — `kind: "system.entry-erased"` entries written
* directly via `sink.write()` to mask tamper — are detected as
* forgery. Legitimate tombstones carry an in-module sentinel that
* forgeries cannot mint. (N7)
*
* v1 ships sync djb2 only. `verify({ strong: true })` is reserved
* for v2 (SHA-256) and THROWS today — there is no silent fallback.
* Call `verify()` (no args) for tamper detection.
*/
verify(opts?: {
strong?: boolean;
}): VerifyResult;
/**
* Per-subject erasure (GDPR Art. 17 stub). Replaces matching entries
* in this sink with `system.entry-erased` tombstones (preserving
* seq + prevHash so verify() can resync), then appends a chained
* `system.subject-erased` marker entry that summarises the erasure.
*
* Returns `{ erased, markerEntry }` — `markerEntry` is the chained
* `system.subject-erased` summary (the N per-entry tombstones live
* in the sink, not on the return value). (M7)
*
* When `erased === 0` (filter matched nothing), `markerEntry` is
* `null` and no marker is emitted into the chain — avoids polluting
* the audit trail with empty "erased: 0" records. (MAJOR-3)
*
* WARNING: v1 erases only from THIS sink. External copies (toJSON
* exports, downstream pipelines, persisted backups) must be erased
* separately. (C8)
*/
erase(filter: QueryFilter): {
erased: number;
markerEntry: AuditEntry | null;
};
/** Empty the sink. */
clear(): void;
/** Unsubscribe + drop the sink. */
destroy(): void;
}
/**
* Create an audit ledger that subscribes to the given system's
* observation stream. Returns a `Plugin` to install + a query/verify
* API for the ledger.
*
* @example
* ```ts
* import { createAuditLedger } from "@directive-run/core/plugins";
*
* const ledger = createAuditLedger();
* const system = createSystem({ module, plugins: [ledger.plugin] });
* system.start();
*
* // Six months later — auditor asks "what changed cart-total in March?"
* ledger.query({
* factPath: "cartTotal",
* changedBetween: ["2026-03-01", "2026-04-01"],
* });
*
* // Verify nobody tampered with the ledger
* const verdict = await ledger.verify();
* if (!verdict.valid) {
* console.error("Tamper at entry", verdict.brokenAt);
* }
* ```
*/
declare function createAuditLedger(opts?: AuditLedgerOptions): AuditLedger;
export { type AuditEntry as A, type QueryFilter as Q, type VerifyResult as V, type AuditEntryKind as a, type AuditLedger as b, type AuditLedgerOptions as c, type AuditLedgerSink as d, createAuditLedger as e, memorySink as m };
import { F as FactPredicate, C as ClauseResult, P as Plugin, M as ModuleSchema } from './plugins-BIzXaYbg.js';
/**
* createAuditLedger — append-only, queryable, hash-chained
* (djb2; SHA-256 reserved for v2) audit of every state change. For
* forensics and "show me why this user got that decision."
*
* Captures (per observation event):
*
* - `constraint.evaluate` → { whenSpec, whenExplain, active, whenSource? }
* - `resolver.write.rejected` (rejection + summary kinds)
* - `fact.change` → { key, prior, next }
* - `resolver.complete` → { resolverId, requirementId, duration }
* - `system.init` / `system.start` / `system.stop` / `system.destroy`
* - `system.snapshot` / `system.history.navigate` (lifecycle markers)
* - `system.truncated` (ring-buffer overflow marker)
* - `system.entry-erased` / `system.subject-erased` (GDPR Art.17 stub)
*
* Hash chain: each entry stores `prevHash` — the djb2 (`hashObject`)
* hash of the previous entry's stable-stringified payload. Tampering
* with any entry's payload breaks the next entry's `prevHash` link —
* visible in `verify()`. v1 ships sync djb2 only; `verify({ strong: true })`
* is reserved for v2 (SHA-256) and throws today.
*
* PII redaction: by default, fact keys whose meta carries the `pii`
* tag (via `system.meta.byTag("pii")`) have their values replaced with
* `"[redacted]"` in `whenExplain.actual`, `fact.change.prior`,
* `fact.change.next`, and the cached `whenSpec` operands. Opt out with
* `capturePII: true`.
*/
/** Hash algorithm tag — bumped if canonicalization or hash function changes. */
declare const HASH_ALGO: "djb2-1";
/**
* Entry schema version. Bumped if `AuditEntry` field shape changes in
* a way that breaks back-compat parsers. Persisted on every entry so
* exports remain self-describing across library upgrades. (F-5)
*/
declare const SCHEMA_VERSION: 1;
/**
* Private sentinel stamped onto tombstone entries by {@link createAuditLedger.erase}.
* Never exported, never serialized — `verify()` checks for it before
* accepting a `system.entry-erased` entry as a legitimate chain break.
*
* (N7) Without this, a caller holding a raw `AuditLedgerSink` reference
* could write `{ kind: "system.entry-erased", … }` directly into the
* sink to mask real tampering as legitimate erasure. The sentinel
* raises the bar so only the in-process ledger plugin (which lives in
* this module's closure) can mint a valid tombstone.
*/
declare const LEDGER_INTERNAL_TOKEN: unique symbol;
type AuditEntryKind = "constraint.evaluate" | "resolver.write.rejected" | "fact.change" | "resolver.complete" | "resolver.error" | "system.init" | "system.start" | "system.stop" | "system.destroy" | "system.snapshot" | "system.history.navigate" | "system.truncated" | "system.entry-erased" | "system.subject-erased";
interface AuditEntryBase {
/** Monotonic sequence number, starting at 0. */
readonly seq: number;
/** Wall-clock timestamp (ms epoch). */
readonly ts: number;
/** Discriminator. */
readonly kind: AuditEntryKind;
/** Hash of the previous entry's full payload. null on the genesis entry. */
readonly prevHash: string | null;
/**
* Hash algorithm tag identifying the canonicalization + hash
* function in use. Bumped if the algorithm or canonical form
* changes, so exports remain verifiable across versions.
*/
readonly hashAlgo: typeof HASH_ALGO;
/**
* Entry schema version — bumped if any `AuditEntry` field shape
* changes in a way that breaks back-compat. Pair with `hashAlgo`
* when migrating older exports. (F-5)
*/
readonly schemaVersion: typeof SCHEMA_VERSION;
/**
* Private sentinel — present (and equal to the in-module token) only
* on legitimate tombstones minted by `ledger.erase()`. Filtered out
* of all public read paths (`query`, `recent`, `toJSON`, etc.) so
* consumers never see or copy it. (N7)
*
* NOT serialized. NOT exported. Forging this from outside the module
* is impossible without the symbol reference; `verify()` rejects any
* `system.entry-erased` entry that lacks it.
*
* @internal
*/
readonly __internal?: typeof LEDGER_INTERNAL_TOKEN;
}
type AuditEntry = (AuditEntryBase & {
kind: "constraint.evaluate";
constraintId: string;
active: boolean;
/** Cached at ledger start from `system.inspect().constraints[].whenSpec`. Refreshed on `register()`/`assign()`/`unregister()`. May be undefined for function-form constraints (see `whenSource`). PII operands redacted unless `capturePII: true`. */
whenSpec?: FactPredicate<unknown>;
whenExplain?: readonly ClauseResult[];
/**
* For function-form constraints (no `whenSpec`), a tamper-evident
* identity for the function. We DO NOT capture the raw source —
* closures routinely reference secrets, API keys, or PII (e.g.
* `if (apiKey === "sk-live-xxx")`) and a preview would leak them
* into the audit log. Instead, we capture a djb2 hash of the
* stringified function (`hashObject(String(fn))`). Auditors can
* detect "the function changed between deploys" by comparing
* hashes across entries, without ever seeing the function body.
*
* Informational only — NOT replayable. (N5, M22)
*/
whenSource?: {
kind: "function";
sourceHash: string;
};
}) | (AuditEntryBase & {
kind: "resolver.write.rejected";
rejection: "rejection" | "summary";
resolverId: string;
requirementId: string;
reason: string;
fact?: string;
expected?: unknown;
actual?: unknown;
dropped?: number;
}) | (AuditEntryBase & {
kind: "fact.change";
key: string;
prior: unknown;
next: unknown;
}) | (AuditEntryBase & {
kind: "resolver.complete";
resolverId: string;
requirementId: string;
duration: number;
}) | (AuditEntryBase & {
kind: "resolver.error";
resolverId: string;
requirementId: string;
error: string;
}) | (AuditEntryBase & {
kind: "system.init" | "system.start" | "system.stop" | "system.destroy";
}) | (AuditEntryBase & {
kind: "system.snapshot";
snapshotId: number;
trigger: string;
}) | (AuditEntryBase & {
kind: "system.history.navigate";
from: number;
to: number;
}) | (AuditEntryBase & {
kind: "system.truncated";
droppedSeq: number;
droppedCount: number;
}) | (AuditEntryBase & {
kind: "system.entry-erased";
originalKind: AuditEntryKind;
erasedAt: number;
}) | (AuditEntryBase & {
kind: "system.subject-erased";
/**
* djb2 hash of the filter (via `hashObject(filter)`). PII-safe —
* the raw filter values never land in the ledger. Pair with
* `filterShape` to see which filter fields were used. (N2)
*/
filterHash: string;
/**
* Stripped-values shape of the filter — captures WHICH fields were
* present without recording their values. (N2)
*/
filterShape: {
factPath: boolean;
constraintId: boolean;
kind: AuditEntryKind | readonly AuditEntryKind[] | undefined;
changedBetween: "[range]" | undefined;
};
erased: number;
});
interface QueryFilter {
/** Exact-match fact path. */
factPath?: string;
/** Filter by constraint id. */
constraintId?: string;
/** Filter by entry kind. */
kind?: AuditEntryKind | readonly AuditEntryKind[];
/** Time range as `[startMs, endMs]`, ISO strings, or epoch numbers. */
changedBetween?: [string | number | Date, string | number | Date];
/** Maximum entries returned. Default 1000. */
limit?: number;
}
/**
* Verify result — chain valid OR a break with full context for tamper visualization.
*
* Erased entries (via `ledger.erase()`) appear as legitimate chain breaks —
* `verify()` reports them in `erasedSeqs` and continues the walk from the
* tombstone's own hash. Real tamper still surfaces as `valid: false`.
*
* Forged tombstones (a caller writes `kind: "system.entry-erased"`
* directly via `sink.write()` to mask tamper as erasure) are detected:
* legitimate tombstones carry an in-module sentinel that forgeries
* cannot mint, so `verify()` reports them as tamper. (N7)
*/
type VerifyResult = {
valid: true;
entryCount: number;
/**
* Seq numbers of entries legitimately broken by `erase()`
* tombstones. NOT timestamps — each entry pairs this seq with
* the per-entry `system.entry-erased.erasedAt` (ms epoch) for
* the timestamp. Empty unless the chain contains erasures.
* (N1 + M1; renamed from `erasedAt` in R3)
*/
erasedSeqs?: number[];
} | {
valid: false;
brokenAt: number;
expectedHash: string;
actualHash: string;
entry: AuditEntry;
/**
* Human-readable reason for the break — populated for cases
* where the cause is more specific than "hash mismatch" (e.g.
* tombstone forgery detected via missing sentinel).
*/
reason?: string;
};
interface AuditLedgerSink {
write(entry: AuditEntry): void;
query(filter: QueryFilter): readonly AuditEntry[];
recent(n: number): readonly AuditEntry[];
forFact(path: string, opts?: {
limit?: number;
}): readonly AuditEntry[];
forConstraint(id: string, opts?: {
limit?: number;
}): readonly AuditEntry[];
toJSON(): {
entries: readonly AuditEntry[];
capturedAt: number;
};
clear(): void;
destroy(): void;
/**
* Replace matching entries with tombstones IN PLACE (preserving seq +
* prevHash so the hash chain still verifies). v1 implementation
* matches on the same `QueryFilter` shape used by `query()`.
* Returns the count of entries replaced.
*
* WARNING: erases only from this sink. Any external copies (toJSON
* exports, downstream pipelines) must be erased separately.
*/
erase?(filter: QueryFilter, tombstoneFactory: (e: AuditEntry) => AuditEntry): number;
/**
* Optional hook fired by the sink BEFORE shifting the oldest entry
* out of a bounded ring buffer. The ledger plugin uses this to emit
* a `system.truncated` marker so an auditor sees that the log was
* truncated and where. (M23)
*/
onTruncate?(handler: (droppedSeq: number, droppedCount: number) => void): void;
}
/**
* In-memory bounded ring-buffer sink. Drops oldest entries past
* `capacity` (default 10,000). Use this as the default sink for dev,
* tests, and StackBlitz demos.
*/
declare function memorySink(opts?: {
capacity?: number;
}): AuditLedgerSink;
interface AuditLedgerOptions {
/** Sink to write entries to. Default: in-memory ring buffer (capacity 10k). */
sink?: AuditLedgerSink;
/**
* Whether to capture raw fact values (`prior`/`next` on fact.change,
* `actual` in whenExplain). Default `false` — PII-tagged facts are
* redacted by default. Set `true` to opt out of redaction.
*/
capturePII?: boolean;
/**
* Optional caller-supplied redactor. Runs AFTER the default
* pii-tag-based redaction. Useful for additional sanitization.
*/
redact?: (entry: AuditEntry) => AuditEntry;
}
interface AuditLedger {
/** The plugin to pass to `createSystem({ plugins: [...] })`. */
readonly plugin: Plugin<ModuleSchema>;
/** Query entries matching the filter. */
query(filter?: QueryFilter): readonly AuditEntry[];
/** Most recent N entries (chronological). */
recent(n: number): readonly AuditEntry[];
/** All entries that touch this fact path (exact match). */
forFact(path: string, opts?: {
limit?: number;
}): readonly AuditEntry[];
/** All entries for this constraint id. */
forConstraint(id: string, opts?: {
limit?: number;
}): readonly AuditEntry[];
/** Full ledger snapshot for export / serialization. */
toJSON(): {
entries: readonly AuditEntry[];
capturedAt: number;
};
/**
* Walk the hash chain genesis → tip. Returns `{ valid: true }` iff
* every entry's `prevHash` matches the (sync, djb2-based) hash of
* the previous entry. On break, returns the index of the first
* broken link plus the expected vs actual hashes — feed into a
* "TAMPERED" visualization.
*
* Erased entries (via `ledger.erase()`) appear as legitimate chain
* breaks — `verify()` reports them in `erasedSeqs` and continues
* the walk from the tombstone's actual hash. Real tamper still
* surfaces as `valid: false`. (N1 + M1)
*
* Forged tombstones — `kind: "system.entry-erased"` entries written
* directly via `sink.write()` to mask tamper — are detected as
* forgery. Legitimate tombstones carry an in-module sentinel that
* forgeries cannot mint. (N7)
*
* v1 ships sync djb2 only. `verify({ strong: true })` is reserved
* for v2 (SHA-256) and THROWS today — there is no silent fallback.
* Call `verify()` (no args) for tamper detection.
*/
verify(opts?: {
strong?: boolean;
}): VerifyResult;
/**
* Per-subject erasure (GDPR Art. 17 stub). Replaces matching entries
* in this sink with `system.entry-erased` tombstones (preserving
* seq + prevHash so verify() can resync), then appends a chained
* `system.subject-erased` marker entry that summarises the erasure.
*
* Returns `{ erased, markerEntry }` — `markerEntry` is the chained
* `system.subject-erased` summary (the N per-entry tombstones live
* in the sink, not on the return value). (M7)
*
* When `erased === 0` (filter matched nothing), `markerEntry` is
* `null` and no marker is emitted into the chain — avoids polluting
* the audit trail with empty "erased: 0" records. (MAJOR-3)
*
* WARNING: v1 erases only from THIS sink. External copies (toJSON
* exports, downstream pipelines, persisted backups) must be erased
* separately. (C8)
*/
erase(filter: QueryFilter): {
erased: number;
markerEntry: AuditEntry | null;
};
/** Empty the sink. */
clear(): void;
/** Unsubscribe + drop the sink. */
destroy(): void;
}
/**
* Create an audit ledger that subscribes to the given system's
* observation stream. Returns a `Plugin` to install + a query/verify
* API for the ledger.
*
* @example
* ```ts
* import { createAuditLedger } from "@directive-run/core/plugins";
*
* const ledger = createAuditLedger();
* const system = createSystem({ module, plugins: [ledger.plugin] });
* system.start();
*
* // Six months later — auditor asks "what changed cart-total in March?"
* ledger.query({
* factPath: "cartTotal",
* changedBetween: ["2026-03-01", "2026-04-01"],
* });
*
* // Verify nobody tampered with the ledger
* const verdict = await ledger.verify();
* if (!verdict.valid) {
* console.error("Tamper at entry", verdict.brokenAt);
* }
* ```
*/
declare function createAuditLedger(opts?: AuditLedgerOptions): AuditLedger;
export { type AuditEntry as A, type QueryFilter as Q, type VerifyResult as V, type AuditEntryKind as a, type AuditLedger as b, type AuditLedgerOptions as c, type AuditLedgerSink as d, createAuditLedger as e, memorySink as m };
'use strict';var chunkT4TRJEJN_cjs=require('./chunk-T4TRJEJN.cjs'),chunk4MNQDXH7_cjs=require('./chunk-4MNQDXH7.cjs');var $="djb2-1",F=1,x=Symbol("directive.audit-ledger.internal");function B(t,r,i){if(t===null||typeof t!="object")return;let o=[];for(let a of r.split(".")){if(!a)continue;let l=a.match(/^\[(\d+)\](.*)$/);if(l){o.push(Number(l[1])),l[2]&&o.push(l[2].replace(/^\./,""));continue}let f=a.match(/^([^[]+)\[(\d+)\](.*)$/);if(f){o.push(f[1]),o.push(Number(f[2])),f[3]&&o.push(f[3].replace(/^\./,""));continue}o.push(a);}let m=t;for(let a=0;a<o.length-1;a++){let l=o[a];if(m===null||typeof m!="object")return;m=m[l];}if(m===null||typeof m!="object")return;let d=o[o.length-1];d!==void 0&&(m[d]=i);}function N(t){for(let r of Object.keys(t)){let i=t[r];if(i!==null&&typeof i=="object"){if(Array.isArray(i)&&r==="whenExplain")for(let o of i)o!==null&&typeof o=="object"&&Object.freeze(o);Object.freeze(i);}}return Object.freeze(t),t}var U=1e4,G=1e3;function P(t){if(t instanceof Date)return t.getTime();if(typeof t=="number"){if(!Number.isFinite(t))throw new Error("[Directive] audit-ledger: changedBetween bound must be a finite number, ISO string, or Date.");return t}if(typeof t=="string"){let r=Date.parse(t);if(!Number.isFinite(r))throw new Error(`[Directive] audit-ledger: changedBetween bound "${t}" is not a parseable ISO date string.`);return r}throw new Error("[Directive] audit-ledger: changedBetween bound must be a number, ISO string, or Date.")}function T(t,r){if(r.kind&&!(Array.isArray(r.kind)?r.kind:[r.kind]).includes(t.kind))return false;if(r.factPath!==void 0)if(t.kind==="fact.change"){if(t.key!==r.factPath)return false}else if(t.kind==="resolver.write.rejected"){if(t.fact!==r.factPath)return false}else return false;if(r.constraintId!==void 0&&(t.kind!=="constraint.evaluate"||t.constraintId!==r.constraintId))return false;if(r.changedBetween){let[i,o]=r.changedBetween,m=P(i),d=P(o);if(t.ts<m||t.ts>d)return false}return true}function Y(t={}){let r=t.capacity??U,i=[],o=null;return {write(d){if(i.length>=r){let a=i[0];o?.(a.seq,1),i.shift();}for(i.push(d);i.length>r;)i.shift();},query(d){let a=d.limit??G,l=[];for(let f=i.length-1;f>=0;f--){let g=i[f];if(T(g,d)&&(l.push(g),l.length>=a))break}return l},recent(d){let a=Math.max(0,i.length-d);return i.slice(a)},forFact(d,a={}){return this.query({factPath:d,limit:a.limit})},forConstraint(d,a={}){return this.query({constraintId:d,limit:a.limit})},toJSON(){return {entries:i.slice(),capturedAt:Date.now()}},clear(){i=[];},destroy(){i=[],o=null;},erase(d,a){let l=0;for(let f=0;f<i.length;f++){let g=i[f];T(g,d)&&(i[f]=a(g),l++);}return l},onTruncate(d){o=d;}}}function W(t){return chunk4MNQDXH7_cjs.h(t)}function _(t){if(t.hashAlgo==="djb2-1")return W(t);throw new Error(`[Directive] audit-ledger: unknown hashAlgo "${String(t.hashAlgo)}" on entry seq=${t.seq}. Cannot verify chain integrity. Known algorithms: "djb2-1".`)}function ee(t={}){let r=t.sink??Y(),i=t.capturePII??false,o=t.redact,m=0,d=null,a=null,l=null,f=new Map,g=new Map,k=new Set;function L(e){if(i||k.size===0||e===null||typeof e!="object")return e;let n;try{n=JSON.parse(JSON.stringify(e));}catch{return e}return chunkT4TRJEJN_cjs.i(n,{operator(s,u,y,c){k.has(s)&&B(n,c,"[redacted]");},literal(s){k.has(s)&&B(n,s,"[redacted]");}}),n}function w(){if(f.clear(),g.clear(),!!a)try{let e=a.inspect;if(typeof e!="function")return;let s=e()?.constraints??[],u=a.$internal?.mergedConstraints;for(let y of s)if(y.whenSpec!==void 0)f.set(y.id,L(y.whenSpec));else {let c=u?.[y.id],h=c&&typeof c.when=="function"?c.when:void 0;h?g.set(y.id,chunk4MNQDXH7_cjs.h(String(h))):y.when!==void 0&&typeof y.when=="function"?g.set(y.id,chunk4MNQDXH7_cjs.h(String(y.when))):g.set(y.id,chunk4MNQDXH7_cjs.h("[function]"));}}catch{}}function j(){if(k.clear(),!(i||!a))try{let e=a.meta;if(!e||typeof e.byTag!="function")return;let n=e.byTag("pii")??[];for(let s of n)k.add(s.id);}catch{}}function E(e,n){return i?n:k.has(e)?"[redacted]":n}function C(e){if(!e||i||k.size===0)return e;let n=false,s=e.map(u=>{if(k.has(u.path))return n=true,{...u,actual:"[redacted]"};if(u.children){let y=C(u.children);if(y!==u.children)return n=true,{...u,children:y}}return u});return n?s:e}function p(e){let n={...e,seq:m++,ts:Date.now(),prevHash:d,hashAlgo:$,schemaVersion:F},s=o?o(n):n;return N(s),r.write(s),d=_(s),s}function M(e){switch(e.type){case "constraint.evaluate":{let n=f.get(e.id),s=g.get(e.id),u={kind:"constraint.evaluate",constraintId:e.id,active:e.active,whenExplain:C(e.whenExplain)};n!==void 0?u.whenSpec=n:s!==void 0&&(u.whenSource={kind:"function",sourceHash:s}),p(u);break}case "fact.change":p({kind:"fact.change",key:e.key,prior:E(e.key,e.prev),next:E(e.key,e.next)});break;case "resolver.write.rejected":e.kind==="summary"?p({kind:"resolver.write.rejected",rejection:"summary",resolverId:e.resolver,requirementId:e.requirementId,reason:e.reason,dropped:e.dropped}):p({kind:"resolver.write.rejected",rejection:"rejection",resolverId:e.resolver,requirementId:e.requirementId,reason:e.reason,fact:e.fact,expected:E(e.fact,e.expected),actual:E(e.fact,e.actual)});break;case "resolver.complete":p({kind:"resolver.complete",resolverId:e.resolver,requirementId:e.requirementId,duration:e.duration});break;case "resolver.error":p({kind:"resolver.error",resolverId:e.resolver,requirementId:e.requirementId,error:String(e.error)});break;case "system.init":case "system.start":case "system.stop":case "system.destroy":p({kind:e.type});break;}}let v=false;function K(e){a=e,j(),w(),l=e.observe(M),r.onTruncate?.((n,s)=>{if(!v){v=true;try{p({kind:"system.truncated",droppedSeq:n,droppedCount:s});}finally{v=false;}}});}function H(){l&&(l(),l=null),a=null,f.clear(),g.clear(),k.clear();}let V={name:"audit-ledger",onInit(e){K(e);},onStop(){l&&(l(),l=null);},onDestroy(){H();},onDefinitionRegister(e,n){e==="constraint"&&w(),(e==="constraint"||e==="resolver"||e==="effect")&&j();},onDefinitionAssign(e,n){e==="constraint"&&w();},onDefinitionUnregister(e,n){e==="constraint"&&w();},onSnapshot(e){p({kind:"system.snapshot",snapshotId:e.id,trigger:e.trigger});},onHistoryNavigate(e,n){p({kind:"system.history.navigate",from:e,to:n});}};function J(e){if(e.__internal===void 0)return e;let n={...e};return delete n.__internal,n}function b(e){let n=false;for(let s of e)if(s.__internal!==void 0){n=true;break}return n?e.map(J):e}return {plugin:V,query:(e={})=>b(r.query(e)),recent:e=>b(r.recent(e)),forFact:(e,n)=>b(r.forFact(e,n)),forConstraint:(e,n)=>b(r.forConstraint(e,n)),toJSON:()=>{let e=r.toJSON();return {entries:b(e.entries),capturedAt:e.capturedAt}},verify(e){if(e?.strong===true)throw new Error("[Directive] verify({ strong: true }) is reserved for v2 \u2014 v1 ships sync djb2 chain only. Use verify() (sync) for tamper detection.");let{entries:n}=r.toJSON();if(n.length===0)return {valid:true,entryCount:0};let s=new Set,u=null;for(let c=0;c<n.length;c++){let h=n[c];if(h.prevHash!==u){let S=c>0?n[c-1]:null,I=h.kind==="system.entry-erased",O=S?.kind==="system.entry-erased";if(I||O){let q=[];I&&q.push(h),O&&S!==null&&q.push(S);let R=q.find(Q=>Q.__internal!==x);if(R)return {valid:false,brokenAt:c,expectedHash:u??"<genesis>",actualHash:h.prevHash??"<genesis>",entry:R,reason:"tombstone forgery detected \u2014 missing internal sentinel. A 'system.entry-erased' entry was written via sink.write() rather than ledger.erase(); rejected as tamper."};let z=I?h:S;s.add(z.seq),u=_(h);continue}return {valid:false,brokenAt:c,expectedHash:u??"<genesis>",actualHash:h.prevHash??"<genesis>",entry:h}}u=_(h);}let y={valid:true,entryCount:n.length};return s.size>0&&(y.erasedSeqs=[...s].sort((c,h)=>c-h)),y},erase(e){let n=Date.now(),s=0;if(typeof r.erase=="function"&&(s=r.erase(e,c=>{let h={seq:c.seq,ts:c.ts,kind:"system.entry-erased",prevHash:c.prevHash,hashAlgo:c.hashAlgo,schemaVersion:c.schemaVersion??F,originalKind:c.kind,erasedAt:n,__internal:x};return N(h),h})),s===0)return {erased:0,markerEntry:null};let u={factPath:e.factPath!==void 0,constraintId:e.constraintId!==void 0,kind:e.kind,changedBetween:e.changedBetween!==void 0?"[range]":void 0},y=p({kind:"system.subject-erased",filterHash:chunk4MNQDXH7_cjs.h(e),filterShape:u,erased:s});return {erased:s,markerEntry:y}},clear(){r.clear(),m=0,d=null;},destroy(){H(),r.destroy();}}}exports.a=Y;exports.b=ee;//# sourceMappingURL=chunk-IXRS4LM4.cjs.map
//# sourceMappingURL=chunk-IXRS4LM4.cjs.map

Sorry, the diff of this file is too big to display

import {i}from'./chunk-2FF6QGOA.js';import {h}from'./chunk-PXRV64PA.js';var $="djb2-1",F=1,x=Symbol("directive.audit-ledger.internal");function B(t,r,i){if(t===null||typeof t!="object")return;let o=[];for(let a of r.split(".")){if(!a)continue;let l=a.match(/^\[(\d+)\](.*)$/);if(l){o.push(Number(l[1])),l[2]&&o.push(l[2].replace(/^\./,""));continue}let f=a.match(/^([^[]+)\[(\d+)\](.*)$/);if(f){o.push(f[1]),o.push(Number(f[2])),f[3]&&o.push(f[3].replace(/^\./,""));continue}o.push(a);}let m=t;for(let a=0;a<o.length-1;a++){let l=o[a];if(m===null||typeof m!="object")return;m=m[l];}if(m===null||typeof m!="object")return;let d=o[o.length-1];d!==void 0&&(m[d]=i);}function N(t){for(let r of Object.keys(t)){let i=t[r];if(i!==null&&typeof i=="object"){if(Array.isArray(i)&&r==="whenExplain")for(let o of i)o!==null&&typeof o=="object"&&Object.freeze(o);Object.freeze(i);}}return Object.freeze(t),t}var U=1e4,G=1e3;function P(t){if(t instanceof Date)return t.getTime();if(typeof t=="number"){if(!Number.isFinite(t))throw new Error("[Directive] audit-ledger: changedBetween bound must be a finite number, ISO string, or Date.");return t}if(typeof t=="string"){let r=Date.parse(t);if(!Number.isFinite(r))throw new Error(`[Directive] audit-ledger: changedBetween bound "${t}" is not a parseable ISO date string.`);return r}throw new Error("[Directive] audit-ledger: changedBetween bound must be a number, ISO string, or Date.")}function T(t,r){if(r.kind&&!(Array.isArray(r.kind)?r.kind:[r.kind]).includes(t.kind))return false;if(r.factPath!==void 0)if(t.kind==="fact.change"){if(t.key!==r.factPath)return false}else if(t.kind==="resolver.write.rejected"){if(t.fact!==r.factPath)return false}else return false;if(r.constraintId!==void 0&&(t.kind!=="constraint.evaluate"||t.constraintId!==r.constraintId))return false;if(r.changedBetween){let[i,o]=r.changedBetween,m=P(i),d=P(o);if(t.ts<m||t.ts>d)return false}return true}function Y(t={}){let r=t.capacity??U,i=[],o=null;return {write(d){if(i.length>=r){let a=i[0];o?.(a.seq,1),i.shift();}for(i.push(d);i.length>r;)i.shift();},query(d){let a=d.limit??G,l=[];for(let f=i.length-1;f>=0;f--){let g=i[f];if(T(g,d)&&(l.push(g),l.length>=a))break}return l},recent(d){let a=Math.max(0,i.length-d);return i.slice(a)},forFact(d,a={}){return this.query({factPath:d,limit:a.limit})},forConstraint(d,a={}){return this.query({constraintId:d,limit:a.limit})},toJSON(){return {entries:i.slice(),capturedAt:Date.now()}},clear(){i=[];},destroy(){i=[],o=null;},erase(d,a){let l=0;for(let f=0;f<i.length;f++){let g=i[f];T(g,d)&&(i[f]=a(g),l++);}return l},onTruncate(d){o=d;}}}function W(t){return h(t)}function _(t){if(t.hashAlgo==="djb2-1")return W(t);throw new Error(`[Directive] audit-ledger: unknown hashAlgo "${String(t.hashAlgo)}" on entry seq=${t.seq}. Cannot verify chain integrity. Known algorithms: "djb2-1".`)}function ee(t={}){let r=t.sink??Y(),i$1=t.capturePII??false,o=t.redact,m=0,d=null,a=null,l=null,f=new Map,g=new Map,k=new Set;function L(e){if(i$1||k.size===0||e===null||typeof e!="object")return e;let n;try{n=JSON.parse(JSON.stringify(e));}catch{return e}return i(n,{operator(s,u,y,c){k.has(s)&&B(n,c,"[redacted]");},literal(s){k.has(s)&&B(n,s,"[redacted]");}}),n}function w(){if(f.clear(),g.clear(),!!a)try{let e=a.inspect;if(typeof e!="function")return;let s=e()?.constraints??[],u=a.$internal?.mergedConstraints;for(let y of s)if(y.whenSpec!==void 0)f.set(y.id,L(y.whenSpec));else {let c=u?.[y.id],h$1=c&&typeof c.when=="function"?c.when:void 0;h$1?g.set(y.id,h(String(h$1))):y.when!==void 0&&typeof y.when=="function"?g.set(y.id,h(String(y.when))):g.set(y.id,h("[function]"));}}catch{}}function j(){if(k.clear(),!(i$1||!a))try{let e=a.meta;if(!e||typeof e.byTag!="function")return;let n=e.byTag("pii")??[];for(let s of n)k.add(s.id);}catch{}}function E(e,n){return i$1?n:k.has(e)?"[redacted]":n}function C(e){if(!e||i$1||k.size===0)return e;let n=false,s=e.map(u=>{if(k.has(u.path))return n=true,{...u,actual:"[redacted]"};if(u.children){let y=C(u.children);if(y!==u.children)return n=true,{...u,children:y}}return u});return n?s:e}function p(e){let n={...e,seq:m++,ts:Date.now(),prevHash:d,hashAlgo:$,schemaVersion:F},s=o?o(n):n;return N(s),r.write(s),d=_(s),s}function M(e){switch(e.type){case "constraint.evaluate":{let n=f.get(e.id),s=g.get(e.id),u={kind:"constraint.evaluate",constraintId:e.id,active:e.active,whenExplain:C(e.whenExplain)};n!==void 0?u.whenSpec=n:s!==void 0&&(u.whenSource={kind:"function",sourceHash:s}),p(u);break}case "fact.change":p({kind:"fact.change",key:e.key,prior:E(e.key,e.prev),next:E(e.key,e.next)});break;case "resolver.write.rejected":e.kind==="summary"?p({kind:"resolver.write.rejected",rejection:"summary",resolverId:e.resolver,requirementId:e.requirementId,reason:e.reason,dropped:e.dropped}):p({kind:"resolver.write.rejected",rejection:"rejection",resolverId:e.resolver,requirementId:e.requirementId,reason:e.reason,fact:e.fact,expected:E(e.fact,e.expected),actual:E(e.fact,e.actual)});break;case "resolver.complete":p({kind:"resolver.complete",resolverId:e.resolver,requirementId:e.requirementId,duration:e.duration});break;case "resolver.error":p({kind:"resolver.error",resolverId:e.resolver,requirementId:e.requirementId,error:String(e.error)});break;case "system.init":case "system.start":case "system.stop":case "system.destroy":p({kind:e.type});break;}}let v=false;function K(e){a=e,j(),w(),l=e.observe(M),r.onTruncate?.((n,s)=>{if(!v){v=true;try{p({kind:"system.truncated",droppedSeq:n,droppedCount:s});}finally{v=false;}}});}function H(){l&&(l(),l=null),a=null,f.clear(),g.clear(),k.clear();}let V={name:"audit-ledger",onInit(e){K(e);},onStop(){l&&(l(),l=null);},onDestroy(){H();},onDefinitionRegister(e,n){e==="constraint"&&w(),(e==="constraint"||e==="resolver"||e==="effect")&&j();},onDefinitionAssign(e,n){e==="constraint"&&w();},onDefinitionUnregister(e,n){e==="constraint"&&w();},onSnapshot(e){p({kind:"system.snapshot",snapshotId:e.id,trigger:e.trigger});},onHistoryNavigate(e,n){p({kind:"system.history.navigate",from:e,to:n});}};function J(e){if(e.__internal===void 0)return e;let n={...e};return delete n.__internal,n}function b(e){let n=false;for(let s of e)if(s.__internal!==void 0){n=true;break}return n?e.map(J):e}return {plugin:V,query:(e={})=>b(r.query(e)),recent:e=>b(r.recent(e)),forFact:(e,n)=>b(r.forFact(e,n)),forConstraint:(e,n)=>b(r.forConstraint(e,n)),toJSON:()=>{let e=r.toJSON();return {entries:b(e.entries),capturedAt:e.capturedAt}},verify(e){if(e?.strong===true)throw new Error("[Directive] verify({ strong: true }) is reserved for v2 \u2014 v1 ships sync djb2 chain only. Use verify() (sync) for tamper detection.");let{entries:n}=r.toJSON();if(n.length===0)return {valid:true,entryCount:0};let s=new Set,u=null;for(let c=0;c<n.length;c++){let h=n[c];if(h.prevHash!==u){let S=c>0?n[c-1]:null,I=h.kind==="system.entry-erased",O=S?.kind==="system.entry-erased";if(I||O){let q=[];I&&q.push(h),O&&S!==null&&q.push(S);let R=q.find(Q=>Q.__internal!==x);if(R)return {valid:false,brokenAt:c,expectedHash:u??"<genesis>",actualHash:h.prevHash??"<genesis>",entry:R,reason:"tombstone forgery detected \u2014 missing internal sentinel. A 'system.entry-erased' entry was written via sink.write() rather than ledger.erase(); rejected as tamper."};let z=I?h:S;s.add(z.seq),u=_(h);continue}return {valid:false,brokenAt:c,expectedHash:u??"<genesis>",actualHash:h.prevHash??"<genesis>",entry:h}}u=_(h);}let y={valid:true,entryCount:n.length};return s.size>0&&(y.erasedSeqs=[...s].sort((c,h)=>c-h)),y},erase(e){let n=Date.now(),s=0;if(typeof r.erase=="function"&&(s=r.erase(e,c=>{let h={seq:c.seq,ts:c.ts,kind:"system.entry-erased",prevHash:c.prevHash,hashAlgo:c.hashAlgo,schemaVersion:c.schemaVersion??F,originalKind:c.kind,erasedAt:n,__internal:x};return N(h),h})),s===0)return {erased:0,markerEntry:null};let u={factPath:e.factPath!==void 0,constraintId:e.constraintId!==void 0,kind:e.kind,changedBetween:e.changedBetween!==void 0?"[range]":void 0},y=p({kind:"system.subject-erased",filterHash:h(e),filterShape:u,erased:s});return {erased:s,markerEntry:y}},clear(){r.clear(),m=0,d=null;},destroy(){H(),r.destroy();}}}export{Y as a,ee as b};//# sourceMappingURL=chunk-PA6VC32N.js.map
//# sourceMappingURL=chunk-PA6VC32N.js.map

Sorry, the diff of this file is too big to display

/**
* Create a stable JSON string with sorted keys.
* Handles circular references and deeply nested objects safely.
*
* @param value - The value to stringify
* @param maxDepth - Maximum nesting depth (default: 50)
* @returns A stable JSON string
*/
declare function stableStringify(value: unknown, maxDepth?: number): string;
/**
* Shallow equality comparison for objects.
* Used by React hooks to avoid unnecessary re-renders.
*
* @param a - First object
* @param b - Second object
* @returns True if objects are shallowly equal
*/
declare function shallowEqual<T extends Record<string, unknown>>(a: T, b: T): boolean;
/**
* Generate a simple hash string from an object.
* Uses djb2 algorithm on the stable stringified value.
*
* **Limitations:**
* - 32-bit hash output means collision probability increases with data set size
* (birthday paradox: ~50% collision chance at ~77,000 distinct values)
* - Suitable for: cache invalidation, change detection, deduplication of small sets
* - NOT suitable for: cryptographic use, security-sensitive operations, large-scale deduplication
*
* For security-sensitive use cases requiring stronger collision resistance,
* consider using a cryptographic hash like SHA-256.
*
* @param value - The value to hash
* @returns A hex hash string (8 characters, 32 bits)
*/
declare function hashObject(value: unknown): string;
/**
* Distributable snapshot type for type-safe helper functions.
*/
interface DistributableSnapshotLike<T = Record<string, unknown>> {
data: T;
createdAt: number;
expiresAt?: number;
version?: string;
metadata?: Record<string, unknown>;
}
/**
* Check if a distributable snapshot has expired.
* Returns false if the snapshot has no expiresAt field.
*
* @example
* ```typescript
* const snapshot = system.getDistributableSnapshot({ ttlSeconds: 3600 });
* // ... later ...
* if (isSnapshotExpired(snapshot)) {
* // Refresh the snapshot
* }
* ```
*
* @param snapshot - The snapshot to check
* @param now - Optional current timestamp (defaults to Date.now())
* @returns True if the snapshot has expired, false otherwise
*/
declare function isSnapshotExpired<T>(snapshot: DistributableSnapshotLike<T>, now?: number): boolean;
/**
* Validate a distributable snapshot and return its data.
* Throws if the snapshot is malformed or has expired.
*
* @example
* ```typescript
* const cached = JSON.parse(await redis.get(`entitlements:${userId}`));
* try {
* const data = validateSnapshot(cached);
* // Use data.canUseFeature, etc.
* } catch (e) {
* // Snapshot invalid or expired, refresh it
* }
* ```
*
* @example Using custom timestamp for testing
* ```typescript
* const snapshot = { data: { test: true }, createdAt: 1000, expiresAt: 2000 };
* validateSnapshot(snapshot, 1500); // Returns { test: true }
* validateSnapshot(snapshot, 2500); // Throws: Snapshot expired
* ```
*
* @param snapshot - The snapshot to validate
* @param now - Optional current timestamp (defaults to Date.now())
* @returns The snapshot data if valid
* @throws Error if the snapshot is malformed or has expired
*/
declare function validateSnapshot<T>(snapshot: DistributableSnapshotLike<T>, now?: number): T;
/**
* Diff result for a single changed value.
*/
interface SnapshotDiffEntry {
/** The key path that changed (e.g., "canUseApi" or "limits.apiCalls") */
path: string;
/** The value in the old snapshot */
oldValue: unknown;
/** The value in the new snapshot */
newValue: unknown;
/** Type of change: "added", "removed", or "changed" */
type: "added" | "removed" | "changed";
}
/**
* Result of diffing two snapshots.
*/
interface SnapshotDiff {
/** Whether the snapshots are identical */
identical: boolean;
/** List of changes between snapshots */
changes: SnapshotDiffEntry[];
/** Whether the version changed (if both have versions) */
versionChanged: boolean;
/** Old version (if available) */
oldVersion?: string;
/** New version (if available) */
newVersion?: string;
}
/**
* Compare two distributable snapshots and return the differences.
* Useful for debugging, audit logs, and webhook payloads.
*
* @example
* ```typescript
* const oldSnapshot = system.getDistributableSnapshot({ includeVersion: true });
* system.dispatch({ type: "upgradePlan", plan: "pro" });
* const newSnapshot = system.getDistributableSnapshot({ includeVersion: true });
*
* const diff = diffSnapshots(oldSnapshot, newSnapshot);
* if (!diff.identical) {
* console.log("Changes:", diff.changes);
* // [{ path: "canUseApi", oldValue: false, newValue: true, type: "changed" }]
* }
* ```
*
* @param oldSnapshot - The previous snapshot
* @param newSnapshot - The new snapshot
* @returns A diff result with all changes
*/
declare function diffSnapshots<T = Record<string, unknown>>(oldSnapshot: DistributableSnapshotLike<T>, newSnapshot: DistributableSnapshotLike<T>): SnapshotDiff;
/**
* A signed distributable snapshot.
* Contains the original snapshot plus a cryptographic signature.
*/
interface SignedSnapshot<T = Record<string, unknown>> extends DistributableSnapshotLike<T> {
/** HMAC-SHA256 signature in hex format */
signature: string;
/** Signing algorithm used */
algorithm: "hmac-sha256";
}
/**
* Check if a snapshot is signed.
*
* @param snapshot - The snapshot to check
* @returns True if the snapshot has a signature
*/
declare function isSignedSnapshot<T>(snapshot: DistributableSnapshotLike<T> | SignedSnapshot<T>): snapshot is SignedSnapshot<T>;
/**
* Sign a distributable snapshot using HMAC-SHA256.
* Creates a tamper-proof signature that can be verified later.
*
* **Security Notes:**
* - Use a cryptographically random secret of at least 32 bytes
* - Store the secret securely (environment variable, secrets manager)
* - Never expose the secret to clients
* - The signature covers all snapshot fields for integrity
*
* @example
* ```typescript
* const snapshot = system.getDistributableSnapshot({
* includeDerivations: ['canUseFeature', 'limits'],
* ttlSeconds: 3600,
* });
*
* // Sign the snapshot (server-side only)
* const signed = await signSnapshot(snapshot, process.env.SNAPSHOT_SECRET);
*
* // Store in JWT, Redis, or send to client
* const jwt = createJWT({ snapshot: signed });
*
* // Later, verify the signature
* const isValid = await verifySnapshotSignature(signed, process.env.SNAPSHOT_SECRET);
* if (!isValid) {
* throw new Error('Snapshot has been tampered with');
* }
* ```
*
* @param snapshot - The snapshot to sign
* @param secret - The HMAC secret (string or Uint8Array)
* @returns A signed snapshot with the signature attached
*/
declare function signSnapshot<T>(snapshot: DistributableSnapshotLike<T>, secret: string | Uint8Array): Promise<SignedSnapshot<T>>;
/**
* Verify the signature of a signed snapshot.
* Returns true if the signature is valid, false otherwise.
*
* **Important:** Always verify signatures before trusting snapshot data,
* especially if the snapshot was received from an untrusted source (client, cache).
*
* @example
* ```typescript
* // Receive signed snapshot from client or cache
* const snapshot = JSON.parse(cachedData);
*
* // Verify before using
* const isValid = await verifySnapshotSignature(snapshot, process.env.SNAPSHOT_SECRET);
* if (!isValid) {
* throw new Error('Invalid snapshot signature - possible tampering');
* }
*
* // Now safe to use snapshot.data
* if (snapshot.data.canUseFeature.api) {
* // Grant access
* }
* ```
*
* @param signedSnapshot - The signed snapshot to verify
* @param secret - The HMAC secret (must match the signing secret)
* @returns True if signature is valid, false otherwise
*/
declare function verifySnapshotSignature<T>(signedSnapshot: SignedSnapshot<T>, secret: string | Uint8Array): Promise<boolean>;
/**
* Safely stringify any value for display. Handles circular references,
* BigInt, throwing toJSON, and optional truncation.
*
* This is the canonical implementation – all packages should import this
* instead of maintaining local copies.
*/
declare function safeStringify(data: unknown, maxLen?: number): string;
export { type DistributableSnapshotLike as D, type SignedSnapshot as S, type SnapshotDiff as a, type SnapshotDiffEntry as b, isSnapshotExpired as c, diffSnapshots as d, signSnapshot as e, verifySnapshotSignature as f, safeStringify as g, hashObject as h, isSignedSnapshot as i, stableStringify as j, shallowEqual as s, validateSnapshot as v };
/**
* Create a stable JSON string with sorted keys.
* Handles circular references and deeply nested objects safely.
*
* @param value - The value to stringify
* @param maxDepth - Maximum nesting depth (default: 50)
* @returns A stable JSON string
*/
declare function stableStringify(value: unknown, maxDepth?: number): string;
/**
* Shallow equality comparison for objects.
* Used by React hooks to avoid unnecessary re-renders.
*
* @param a - First object
* @param b - Second object
* @returns True if objects are shallowly equal
*/
declare function shallowEqual<T extends Record<string, unknown>>(a: T, b: T): boolean;
/**
* Generate a simple hash string from an object.
* Uses djb2 algorithm on the stable stringified value.
*
* **Limitations:**
* - 32-bit hash output means collision probability increases with data set size
* (birthday paradox: ~50% collision chance at ~77,000 distinct values)
* - Suitable for: cache invalidation, change detection, deduplication of small sets
* - NOT suitable for: cryptographic use, security-sensitive operations, large-scale deduplication
*
* For security-sensitive use cases requiring stronger collision resistance,
* consider using a cryptographic hash like SHA-256.
*
* @param value - The value to hash
* @returns A hex hash string (8 characters, 32 bits)
*/
declare function hashObject(value: unknown): string;
/**
* Distributable snapshot type for type-safe helper functions.
*/
interface DistributableSnapshotLike<T = Record<string, unknown>> {
data: T;
createdAt: number;
expiresAt?: number;
version?: string;
metadata?: Record<string, unknown>;
}
/**
* Check if a distributable snapshot has expired.
* Returns false if the snapshot has no expiresAt field.
*
* @example
* ```typescript
* const snapshot = system.getDistributableSnapshot({ ttlSeconds: 3600 });
* // ... later ...
* if (isSnapshotExpired(snapshot)) {
* // Refresh the snapshot
* }
* ```
*
* @param snapshot - The snapshot to check
* @param now - Optional current timestamp (defaults to Date.now())
* @returns True if the snapshot has expired, false otherwise
*/
declare function isSnapshotExpired<T>(snapshot: DistributableSnapshotLike<T>, now?: number): boolean;
/**
* Validate a distributable snapshot and return its data.
* Throws if the snapshot is malformed or has expired.
*
* @example
* ```typescript
* const cached = JSON.parse(await redis.get(`entitlements:${userId}`));
* try {
* const data = validateSnapshot(cached);
* // Use data.canUseFeature, etc.
* } catch (e) {
* // Snapshot invalid or expired, refresh it
* }
* ```
*
* @example Using custom timestamp for testing
* ```typescript
* const snapshot = { data: { test: true }, createdAt: 1000, expiresAt: 2000 };
* validateSnapshot(snapshot, 1500); // Returns { test: true }
* validateSnapshot(snapshot, 2500); // Throws: Snapshot expired
* ```
*
* @param snapshot - The snapshot to validate
* @param now - Optional current timestamp (defaults to Date.now())
* @returns The snapshot data if valid
* @throws Error if the snapshot is malformed or has expired
*/
declare function validateSnapshot<T>(snapshot: DistributableSnapshotLike<T>, now?: number): T;
/**
* Diff result for a single changed value.
*/
interface SnapshotDiffEntry {
/** The key path that changed (e.g., "canUseApi" or "limits.apiCalls") */
path: string;
/** The value in the old snapshot */
oldValue: unknown;
/** The value in the new snapshot */
newValue: unknown;
/** Type of change: "added", "removed", or "changed" */
type: "added" | "removed" | "changed";
}
/**
* Result of diffing two snapshots.
*/
interface SnapshotDiff {
/** Whether the snapshots are identical */
identical: boolean;
/** List of changes between snapshots */
changes: SnapshotDiffEntry[];
/** Whether the version changed (if both have versions) */
versionChanged: boolean;
/** Old version (if available) */
oldVersion?: string;
/** New version (if available) */
newVersion?: string;
}
/**
* Compare two distributable snapshots and return the differences.
* Useful for debugging, audit logs, and webhook payloads.
*
* @example
* ```typescript
* const oldSnapshot = system.getDistributableSnapshot({ includeVersion: true });
* system.dispatch({ type: "upgradePlan", plan: "pro" });
* const newSnapshot = system.getDistributableSnapshot({ includeVersion: true });
*
* const diff = diffSnapshots(oldSnapshot, newSnapshot);
* if (!diff.identical) {
* console.log("Changes:", diff.changes);
* // [{ path: "canUseApi", oldValue: false, newValue: true, type: "changed" }]
* }
* ```
*
* @param oldSnapshot - The previous snapshot
* @param newSnapshot - The new snapshot
* @returns A diff result with all changes
*/
declare function diffSnapshots<T = Record<string, unknown>>(oldSnapshot: DistributableSnapshotLike<T>, newSnapshot: DistributableSnapshotLike<T>): SnapshotDiff;
/**
* A signed distributable snapshot.
* Contains the original snapshot plus a cryptographic signature.
*/
interface SignedSnapshot<T = Record<string, unknown>> extends DistributableSnapshotLike<T> {
/** HMAC-SHA256 signature in hex format */
signature: string;
/** Signing algorithm used */
algorithm: "hmac-sha256";
}
/**
* Check if a snapshot is signed.
*
* @param snapshot - The snapshot to check
* @returns True if the snapshot has a signature
*/
declare function isSignedSnapshot<T>(snapshot: DistributableSnapshotLike<T> | SignedSnapshot<T>): snapshot is SignedSnapshot<T>;
/**
* Sign a distributable snapshot using HMAC-SHA256.
* Creates a tamper-proof signature that can be verified later.
*
* **Security Notes:**
* - Use a cryptographically random secret of at least 32 bytes
* - Store the secret securely (environment variable, secrets manager)
* - Never expose the secret to clients
* - The signature covers all snapshot fields for integrity
*
* @example
* ```typescript
* const snapshot = system.getDistributableSnapshot({
* includeDerivations: ['canUseFeature', 'limits'],
* ttlSeconds: 3600,
* });
*
* // Sign the snapshot (server-side only)
* const signed = await signSnapshot(snapshot, process.env.SNAPSHOT_SECRET);
*
* // Store in JWT, Redis, or send to client
* const jwt = createJWT({ snapshot: signed });
*
* // Later, verify the signature
* const isValid = await verifySnapshotSignature(signed, process.env.SNAPSHOT_SECRET);
* if (!isValid) {
* throw new Error('Snapshot has been tampered with');
* }
* ```
*
* @param snapshot - The snapshot to sign
* @param secret - The HMAC secret (string or Uint8Array)
* @returns A signed snapshot with the signature attached
*/
declare function signSnapshot<T>(snapshot: DistributableSnapshotLike<T>, secret: string | Uint8Array): Promise<SignedSnapshot<T>>;
/**
* Verify the signature of a signed snapshot.
* Returns true if the signature is valid, false otherwise.
*
* **Important:** Always verify signatures before trusting snapshot data,
* especially if the snapshot was received from an untrusted source (client, cache).
*
* @example
* ```typescript
* // Receive signed snapshot from client or cache
* const snapshot = JSON.parse(cachedData);
*
* // Verify before using
* const isValid = await verifySnapshotSignature(snapshot, process.env.SNAPSHOT_SECRET);
* if (!isValid) {
* throw new Error('Invalid snapshot signature - possible tampering');
* }
*
* // Now safe to use snapshot.data
* if (snapshot.data.canUseFeature.api) {
* // Grant access
* }
* ```
*
* @param signedSnapshot - The signed snapshot to verify
* @param secret - The HMAC secret (must match the signing secret)
* @returns True if signature is valid, false otherwise
*/
declare function verifySnapshotSignature<T>(signedSnapshot: SignedSnapshot<T>, secret: string | Uint8Array): Promise<boolean>;
/**
* Safely stringify any value for display. Handles circular references,
* BigInt, throwing toJSON, and optional truncation.
*
* This is the canonical implementation – all packages should import this
* instead of maintaining local copies.
*/
declare function safeStringify(data: unknown, maxLen?: number): string;
export { type DistributableSnapshotLike as D, type SignedSnapshot as S, type SnapshotDiff as a, type SnapshotDiffEntry as b, isSnapshotExpired as c, diffSnapshots as d, signSnapshot as e, verifySnapshotSignature as f, safeStringify as g, hashObject as h, isSignedSnapshot as i, stableStringify as j, shallowEqual as s, validateSnapshot as v };

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display