@directive-run/core
Advanced tools
| import { b as FactPredicate, C as ClauseResult, q as Plugin, M as ModuleSchema } from './plugins-Ykl_sAPE.js'; | ||
| /** | ||
| * createAuditLedger — append-only, queryable, cryptographically-chained | ||
| * audit of every state change. For compliance, forensics, "show me why | ||
| * this user got that decision." | ||
| * | ||
| * Captures (per observation event): | ||
| * | ||
| * - `constraint.evaluate` → { whenSpec, whenExplain, active } | ||
| * - `resolver.write.rejected` (rejection + summary kinds) | ||
| * - `fact.change` → { key, prior, next } | ||
| * - `resolver.complete` → { resolverId, requirementId, duration } | ||
| * - `system.init` / `system.start` / `system.stop` / `system.destroy` | ||
| * | ||
| * Hash chain: each entry stores `prevHash` (the genesis entry's is null); | ||
| * `hash` is computed *lazily* at `verify()` / `toJSON()` time via | ||
| * `stableStringify` + SHA-256 (`crypto.subtle.digest`). Tampering with | ||
| * any entry's payload breaks the next entry's `prevHash` link — visible | ||
| * in `verify()`. | ||
| * | ||
| * 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`, and | ||
| * `fact.change.next`. Opt out with `capturePII: true`. | ||
| */ | ||
| type AuditEntryKind = "constraint.evaluate" | "resolver.write.rejected" | "fact.change" | "resolver.complete" | "resolver.error" | "system.init" | "system.start" | "system.stop" | "system.destroy"; | ||
| 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; | ||
| } | ||
| type AuditEntry = (AuditEntryBase & { | ||
| kind: "constraint.evaluate"; | ||
| constraintId: string; | ||
| active: boolean; | ||
| /** Cached at ledger start from `system.inspect().constraints[].whenSpec`. May be undefined for function-form constraints. */ | ||
| whenSpec?: FactPredicate<unknown>; | ||
| whenExplain?: readonly ClauseResult[]; | ||
| }) | (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"; | ||
| }); | ||
| 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. */ | ||
| type VerifyResult = { | ||
| valid: true; | ||
| entryCount: number; | ||
| } | { | ||
| valid: false; | ||
| brokenAt: number; | ||
| expectedHash: string; | ||
| actualHash: string; | ||
| entry: AuditEntry; | ||
| }; | ||
| 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; | ||
| } | ||
| /** | ||
| * 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. | ||
| * | ||
| * Sync by default (djb2 chain). For compliance-grade collision | ||
| * resistance, pass `{ strong: true }` — verify walks the chain a | ||
| * second time with SHA-256 and returns a Promise. Callers must | ||
| * `await` the result when `strong: true` is passed. | ||
| */ | ||
| verify(opts?: { | ||
| strong?: boolean; | ||
| }): VerifyResult | Promise<VerifyResult>; | ||
| /** 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 AuditEntryKind as a, type AuditLedger as b, type AuditLedgerOptions as c, type AuditLedgerSink as d, createAuditLedger as e, memorySink as m }; |
| import { b as FactPredicate, C as ClauseResult, q as Plugin, M as ModuleSchema } from './plugins-Ykl_sAPE.cjs'; | ||
| /** | ||
| * createAuditLedger — append-only, queryable, cryptographically-chained | ||
| * audit of every state change. For compliance, forensics, "show me why | ||
| * this user got that decision." | ||
| * | ||
| * Captures (per observation event): | ||
| * | ||
| * - `constraint.evaluate` → { whenSpec, whenExplain, active } | ||
| * - `resolver.write.rejected` (rejection + summary kinds) | ||
| * - `fact.change` → { key, prior, next } | ||
| * - `resolver.complete` → { resolverId, requirementId, duration } | ||
| * - `system.init` / `system.start` / `system.stop` / `system.destroy` | ||
| * | ||
| * Hash chain: each entry stores `prevHash` (the genesis entry's is null); | ||
| * `hash` is computed *lazily* at `verify()` / `toJSON()` time via | ||
| * `stableStringify` + SHA-256 (`crypto.subtle.digest`). Tampering with | ||
| * any entry's payload breaks the next entry's `prevHash` link — visible | ||
| * in `verify()`. | ||
| * | ||
| * 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`, and | ||
| * `fact.change.next`. Opt out with `capturePII: true`. | ||
| */ | ||
| type AuditEntryKind = "constraint.evaluate" | "resolver.write.rejected" | "fact.change" | "resolver.complete" | "resolver.error" | "system.init" | "system.start" | "system.stop" | "system.destroy"; | ||
| 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; | ||
| } | ||
| type AuditEntry = (AuditEntryBase & { | ||
| kind: "constraint.evaluate"; | ||
| constraintId: string; | ||
| active: boolean; | ||
| /** Cached at ledger start from `system.inspect().constraints[].whenSpec`. May be undefined for function-form constraints. */ | ||
| whenSpec?: FactPredicate<unknown>; | ||
| whenExplain?: readonly ClauseResult[]; | ||
| }) | (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"; | ||
| }); | ||
| 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. */ | ||
| type VerifyResult = { | ||
| valid: true; | ||
| entryCount: number; | ||
| } | { | ||
| valid: false; | ||
| brokenAt: number; | ||
| expectedHash: string; | ||
| actualHash: string; | ||
| entry: AuditEntry; | ||
| }; | ||
| 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; | ||
| } | ||
| /** | ||
| * 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. | ||
| * | ||
| * Sync by default (djb2 chain). For compliance-grade collision | ||
| * resistance, pass `{ strong: true }` — verify walks the chain a | ||
| * second time with SHA-256 and returns a Promise. Callers must | ||
| * `await` the result when `strong: true` is passed. | ||
| */ | ||
| verify(opts?: { | ||
| strong?: boolean; | ||
| }): VerifyResult | Promise<VerifyResult>; | ||
| /** 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 AuditEntryKind as a, type AuditLedger as b, type AuditLedgerOptions as c, type AuditLedgerSink as d, createAuditLedger as e, memorySink as m }; |
| import {T,j,h,o,u,q,t}from'./chunk-TPOKS4RY.js';import {a,l,m as m$1,n}from'./chunk-TZHC4E6S.js';import {e,a as a$1}from'./chunk-T6IJUWYR.js';var m="::",he=Symbol.for("nodejs.util.inspect.custom");function we(e){if(!e.ownKeys)return {};let n={};for(let t of e.ownKeys())n[t]=e.get(t);return n}function D(e){return new Proxy({},{get(n,t){if(typeof t=="symbol")return t===he?()=>we(e):void 0;if(!l.has(t))return e.get(t)},set(n,t,s){return typeof t=="symbol"||l.has(t)?false:e.set?e.set(t,s):false},has(n,t){return typeof t=="symbol"||l.has(t)?false:e.has?e.has(t):false},deleteProperty(n,t){return typeof t=="symbol"||l.has(t)?false:e.delete?e.delete(t):false},ownKeys(){return e.ownKeys?e.ownKeys():[]},getOwnPropertyDescriptor(n,t){if(typeof t!="symbol"&&e.has&&typeof t=="string"&&e.has(t))return {configurable:true,enumerable:true}},defineProperty(){return false},getPrototypeOf(){return null},setPrototypeOf(){return false}})}var Z=new WeakMap,Q=new WeakMap,X=new WeakMap,ee=new WeakMap,ne=new WeakMap,te=new WeakMap;function $(e,n$1){let t=Z.get(e);if(t){let r=t.get(n$1);if(r)return r}else t=new Map,Z.set(e,t);let s=D({get:r=>r==="$store"||r==="$snapshot"?e[r]:e[`${n$1}${m}${r}`],set:(r,u)=>{if(a){let i=m$1(u);i&&n(`${n$1}.${r}`,i);}return e[`${n$1}${m}${r}`]=u,true},has:r=>`${n$1}${m}${r}`in e,delete:r=>(delete e[`${n$1}${m}${r}`],true)});return t.set(n$1,s),s}function re(e,n,t){let s=Q.get(e);if(s)return s;let r=D({get:u=>{if(Object.hasOwn(n,u))return $(e,u)},has:u=>Object.hasOwn(n,u),ownKeys:()=>t()});return Q.set(e,r),r}function oe(e,n,t){let s=`${n}|${t.join(",")}`,r=ne.get(e);if(r){let o=r.get(s);if(o)return o}else r=new Map,ne.set(e,r);let u=new Set(t),i=["self",...t],c=D({get:o=>{if(o==="self")return $(e,n);if(u.has(o))return $(e,o);a&&console.warn(`[Directive] Module "${n}" accessed undeclared cross-module property "${o}". Add it to crossModuleDeps or use "facts.self.${o}" for own module facts.`);},has:o=>o==="self"||u.has(o),ownKeys:()=>i});return r.set(s,c),c}function B(e,n){let t=ee.get(e);if(t){let r=t.get(n);if(r)return r}else t=new Map,ee.set(e,t);let s=D({get:r=>e[`${n}${m}${r}`],has:r=>`${n}${m}${r}`in e});return t.set(n,s),s}function se(e,n,t){let s=X.get(e);if(s)return s;let r=D({get:u=>{if(Object.hasOwn(n,u))return B(e,u)},has:u=>Object.hasOwn(n,u),ownKeys:()=>t()});return X.set(e,r),r}function ie(e,n,t){let s=te.get(e);return s||(s=new Map,te.set(e,s)),D({get:r=>{if(!Object.hasOwn(n,r))return;let u=s.get(r);if(u)return u;let i=D({get:c=>o=>{e.dispatch({type:`${r}${m}${c}`,...o});}});return s.set(r,i),i},has:r=>Object.hasOwn(n,r),ownKeys:()=>t()})}function R(e){if(e.includes(".")){let[n,...t]=e.split(".");return `${n}${m}${t.join(m)}`}return e}function H(e){let n={};for(let[t,s]of Object.entries(e)){let r=t.indexOf(m);if(r>0){let u=t.slice(0,r),i=t.slice(r+m.length);n[u]||(n[u]={}),n[u][i]=s;}else n._root||(n._root={}),n._root[t]=s;}return n}function P(e,n,t,s){return t?oe(e,n,s):$(e,n)}function b(e,n){return `${e}${m}${n}`}function ae(e){return e.includes(m)}function E(e,n,t){if(Array.isArray(e)){let i=e.map(c=>{if(c&&typeof c=="object"&&typeof c.fact=="string"){let o=c.fact;return ae(o)?c:{...c,fact:b(n,o)}}return c});return a$1(i),i}if(!e||typeof e!="object")return e;let s=e;if("$all"in s||"$any"in s){let i="$all"in s?"$all":"$any",c=s[i],o={[i]:c.map(f=>E(f,n,t))};return a$1(o),o}if("$not"in s){let i={$not:E(s.$not,n,t)};return a$1(i),i}function r(i,c){return E(i,c,ce)}let u={};for(let i of Object.keys(s)){if(i.startsWith("$")||ae(i)){u[i]=s[i];continue}if(i==="self"){let c=s[i];if(c&&typeof c=="object"){let o=r(c,n);if(o&&typeof o=="object"&&!Array.isArray(o)){for(let[f,l]of Object.entries(o))u[f]=l;continue}}}if(t.has(i)){let c=s[i];if(c&&typeof c=="object"){let o=r(c,i);if(o&&typeof o=="object"&&!Array.isArray(o)){for(let[f,l]of Object.entries(o))u[f]=l;continue}}}u[b(n,i)]=s[i];}return a$1(u),u}var ce=new Set;function me(e,n){let t$1=e.crossModuleDeps?new Set(Object.keys(e.crossModuleDeps)):ce,s=e.constraints;if(s){let c=false,o={};for(let[f,l]of Object.entries(s)){let d=l;if(d.when!==void 0&&typeof d.when!="function"){o[f]={...d,when:E(d.when,n,t$1)},c=true;continue}o[f]=l;}c&&(s=o);}let r=e.derive;if(r){let c=false,o$1={};for(let[f,l]of Object.entries(r)){let d=l&&typeof l=="object"&&Object.hasOwn(l,"compute")?l:null;if(!d){o$1[f]=l;continue}let g=d.compute;if(typeof g=="function"){o$1[f]=l;continue}if(j(g)){a$1(g);let k=w=>q(g,w);o$1[f]=d.meta?{compute:k,meta:d.meta}:k,c=true;continue}if(h(g)){a$1(g);let k=o(g),w=j=>k(j);o$1[f]=d.meta?{compute:w,meta:d.meta}:w,c=true;continue}o$1[f]=l;}c&&(r=o$1);}let u=e.events;if(u){let c=false,o={};for(let[f,l]of Object.entries(u)){if(l&&typeof l=="object"){let d=Object.hasOwn(l,"handler"),g=Object.hasOwn(l,"patch");if(d&&g&&a&&console.warn(`[Directive] event "${f}": both \`handler\` and \`patch\` provided \u2014 using \`handler\` (patch is ignored).`),g&&!d){let k=l;a$1(k.patch);let w=(j,O)=>t(k.patch,j,O??{});o[f]=k.meta?{handler:w,meta:k.meta}:w,c=true;continue}}o[f]=l;}c&&(u=o);}let i=e.effects;if(i){let c=false,o={};for(let[f,l]of Object.entries(i)){let d=l;if(d.on!==void 0&&h(d.on)){o[f]={...d,on:E(d.on,n,t$1)},c=true;continue}o[f]=l;}c&&(i=o);}return s===e.constraints&&r===e.derive&&u===e.events&&i===e.effects?e:{...e,constraints:s,derive:r,events:u,effects:i}}function C(e){return Object.keys(e).length>0?e:void 0}function ke(e,n){let t={};for(let[s,r]of Object.entries(e.schema.facts))t[b(n,s)]=r;return t}function pe(e,n){if(e.init)return t=>{let s=$(t,n);e.init(s);}}function ve(e,n,t,s){if(!e.derive)return;let r={};for(let[u$1,i]of Object.entries(e.derive)){let c=u(i),o=c?i.compute:i,f=c?i.meta:void 0,l=(d,g)=>{let k=P(d,n,t,s),w=B(g,n);return o(k,w)};r[b(n,u$1)]=f?{compute:l,meta:f}:l;}return C(r)}function be(e,n){if(!e.events)return;let t={};for(let[s,r]of Object.entries(e.events)){let u=typeof r=="object"&&r!==null&&Object.hasOwn(r,"handler"),i=u?r.handler:r,c=u?r.meta:void 0,o=(f,l)=>{let d=$(f,n);i(d,l);};t[b(n,s)]=c?{handler:o,meta:c}:o;}return C(t)}function Me(e,n,t,s){if(!e.constraints)return;let r={};for(let[u,i]of Object.entries(e.constraints)){let c=i,o=typeof c.when=="function";r[b(n,u)]={...c,deps:c.deps?.map(f=>b(n,f)),after:c.after?.map(f=>f.includes(m)?f:b(n,f)),owns:c.owns?.map(f=>f.includes(m)?f:b(n,f)),when:o?f=>{let l=P(f,n,t,s);return c.when(l)}:c.when,require:typeof c.require=="function"?f=>{let l=P(f,n,t,s);return c.require(l)}:c.require};}return C(r)}function Re(e,n,t,s){if(!e.resolvers)return;let r={};for(let[i,c]of Object.entries(e.resolvers)){let f=function(l){return {facts:P(l.facts,n,t,s),signal:l.signal}};let o=c;r[b(n,i)]={...o,...o.resolve&&{resolve:async(l,d)=>{await o.resolve(l,f(d));}},...o.resolveBatch&&{resolveBatch:async(l,d)=>{await o.resolveBatch(l,f(d));}},...o.resolveBatchWithResults&&{resolveBatchWithResults:async(l,d)=>o.resolveBatchWithResults(l,f(d))}};}return C(r)}function Se(e,n,t,s){if(!e.effects)return;let r={};for(let[u,i]of Object.entries(e.effects)){let c=i;r[b(n,u)]={...c,run:(o,f)=>{let l=P(o,n,t,s),d=f?P(f,n,t,s):void 0;return c.run(l,d)},deps:c.deps?.map(o=>b(n,o))};}return C(r)}function Oe(e,n,t){return {snapshotEvents:t&&!t.has(n)?[]:e.history?.snapshotEvents?.map(s=>b(n,s))}}function I(e){let{mod:n,namespace:t,snapshotModulesSet:s}=e,r=me(n,t),u=!!(r.crossModuleDeps&&Object.keys(r.crossModuleDeps).length>0),i=u?Object.keys(r.crossModuleDeps):[];return {id:r.id,schema:ke(r,t),requirements:r.schema.requirements??{},init:pe(r,t),derive:ve(r,t,u,i),events:be(r,t),effects:Se(r,t,u,i),constraints:Me(r,t,u,i),resolvers:Re(r,t,u,i),hooks:r.hooks,meta:r.meta,history:Oe(r,t,s)}}function xe(e){let n=Object.keys(e),t=new Set(n),s=new Set,r=new Set,u=[],i=[];function c(o){if(s.has(o))return;if(r.has(o)){let l=i.indexOf(o),d=[...i.slice(l),o].join(" \u2192 ");throw new Error(`[Directive] Circular dependency detected: ${d}. Modules cannot have circular crossModuleDeps. Break the cycle by removing one of the cross-module references.`)}r.add(o),i.push(o);let f=e[o];if(f?.crossModuleDeps)for(let l of Object.keys(f.crossModuleDeps))t.has(l)&&c(l);i.pop(),r.delete(o),s.add(o),u.push(o);}for(let o of n)c(o);return u}function ue(e,n){let t=[];for(let s of Object.keys(n.schema.facts))t.push(`${e}${m}${s}`);if(n.schema.derivations)for(let s of Object.keys(n.schema.derivations))t.push(`${e}${m}${s}`);return t}function ze(e){if("module"in e){if(!e.module)throw new Error("[Directive] createSystem requires a module. Got: "+typeof e.module);return $e(e)}let n=e;if(Array.isArray(n.modules))throw new Error(`[Directive] createSystem expects modules as an object, not an array. | ||
| Instead of: | ||
| createSystem({ modules: [authModule, dataModule] }) | ||
| Use: | ||
| createSystem({ modules: { auth: authModule, data: dataModule } }) | ||
| Or for a single module: | ||
| createSystem({ module: counterModule })`);let t=n.modules;if(t&&typeof t=="object"&&"id"in t&&"schema"in t)throw new Error(`[Directive] A single module was passed to \`modules:\`. For a single module, use \`module:\` instead: | ||
| createSystem({ module: myModule }) | ||
| For multiple modules, wrap in an object: | ||
| createSystem({ modules: { myName: myModule } })`);return De(n)}function De(e$1){let n=e$1.modules,t=new Set(Object.keys(n)),s=typeof e$1.history=="object"?e$1.history:null,r=s?.snapshotModules?new Set(s.snapshotModules):null;if(e$1.tickMs!==void 0&&e$1.tickMs<=0)throw new Error("[Directive] tickMs must be a positive number");if(a){for(let[a,y]of Object.entries(n))if(y.crossModuleDeps)for(let h of Object.keys(y.crossModuleDeps))h===a?console.warn(`[Directive] Module "${a}" references itself in crossModuleDeps. Use "facts.self" to access own module's facts instead.`):t.has(h)||console.warn(`[Directive] Module "${a}" declares crossModuleDeps.${h}, but no module with namespace "${h}" exists in the system. Available modules: ${[...t].join(", ")}`);}if(a&&s?.snapshotModules)for(let a of s.snapshotModules)t.has(a)||console.warn(`[Directive] history.snapshotModules entry "${a}" doesn't match any module. Available modules: ${[...t].join(", ")}`);let u,i=e$1.initOrder??"auto";if(Array.isArray(i)){let a=i,y=Object.keys(n).filter(h=>!a.includes(h));if(y.length>0)throw new Error(`[Directive] initOrder is missing modules: ${y.join(", ")}. All modules must be included in the explicit order.`);u=a;}else i==="declaration"?u=Object.keys(n):u=xe(n);let{history:c,trace:o,errorBoundary:f}=de(e$1);for(let a of Object.keys(n)){if(a.includes(m))throw new Error(`[Directive] Module name "${a}" contains the reserved separator "${m}". Module names cannot contain "${m}".`);let y=n[a];if(y){for(let h of Object.keys(y.schema.facts))if(h.includes(m))throw new Error(`[Directive] Schema key "${h}" in module "${a}" contains the reserved separator "${m}". Schema keys cannot contain "${m}".`)}}let l$1={names:null};function d(){return l$1.names===null&&(l$1.names=Object.keys(n)),l$1.names}let g=u.map(a=>{let y=n[a];return y?I({mod:y,namespace:a,snapshotModulesSet:r}):null}).filter(a=>a!==null);a&&e$1.tickMs&&e$1.tickMs>0&&(g.some(y=>y.events&&Object.keys(y.events).some(h=>h.endsWith(`${m}tick`)))||console.warn(`[Directive] tickMs is set to ${e$1.tickMs}ms but no module defines a "tick" event handler.`));let k=null,w=null;function j(a$1){for(let[y,h]of Object.entries(a$1)){if(l.has(y)){a&&console.warn(`[Directive] initialFacts/hydrate contains blocked namespace "${y}". Skipping.`);continue}if(!t.has(y)){a&&console.warn(`[Directive] initialFacts/hydrate contains unknown namespace "${y}". Available modules: ${[...t].join(", ")}`);continue}if(h&&typeof h=="object"&&!e(h))throw new Error(`[Directive] initialFacts/hydrate for namespace "${y}" contains potentially dangerous keys (__proto__, constructor, or prototype). This may indicate a prototype pollution attack.`);for(let[M,x]of Object.entries(h))l.has(M)||(w.facts[`${y}${m}${M}`]=x);}}w=T({modules:g,plugins:e$1.plugins,history:c,trace:o,errorBoundary:f,tickMs:e$1.tickMs,cloud:e$1.cloud,onAfterModuleInit:()=>{e$1.initialFacts&&j(e$1.initialFacts),k&&(j(k),k=null);}});let O=new Map;for(let a of Object.keys(n)){let y=n[a];y&&O.set(a,ue(a,y));}let q=re(w.facts,n,d),ye=se(w.derive,n,d),ge=ie(w,n,d),A=null,F=e$1.tickMs,_={_mode:"namespaced",facts:q,history:w.history,derive:ye,events:ge,constraints:w.constraints,effects:w.effects,resolvers:w.resolvers,async hydrate(a){if(w.isRunning)throw new Error("[Directive] hydrate() must be called before start(). The system is already running.");let y=await a();y&&typeof y=="object"&&(k=y);},initialize(){w.initialize();},start(){if(w.start(),F&&F>0){let a;for(let y of g)if(y?.events&&(a=Object.keys(y.events).find(h=>h.endsWith(`${m}tick`)),a))break;if(a){let y=a;A=setInterval(()=>{w.dispatch({type:y});},F);}}},stop(){A&&(clearInterval(A),A=null),w.stop();},destroy(){this.stop(),w.destroy();},dispatch(a){w.dispatch(a);},read(a){return w.read(R(a))},subscribe(a$1,y){let h=[];for(let M of a$1)if(M.endsWith(".*")){let x=M.slice(0,-2),W=O.get(x);W?h.push(...W):a&&console.warn(`[Directive] subscribe wildcard "${M}" \u2014 namespace "${x}" not found.`);}else h.push(R(M));return w.subscribe(h,y)},subscribeModule(a$1,y){let h=O.get(a$1);return !h||h.length===0?(a&&console.warn(`[Directive] subscribeModule("${a$1}") \u2014 namespace not found. Available: ${[...O.keys()].join(", ")}`),()=>{}):w.subscribe(h,y)},watch(a,y,h){return w.watch(R(a),y,h)},when(a,y){return w.when(()=>a(q),y)},getDistributableSnapshot(a){let y={...a,includeDerivations:a?.includeDerivations?.map(R),excludeDerivations:a?.excludeDerivations?.map(R),includeFacts:a?.includeFacts?.map(R)},h=w.getDistributableSnapshot(y);return {...h,data:H(h.data)}},watchDistributableSnapshot(a,y){let h={...a,includeDerivations:a?.includeDerivations?.map(R),excludeDerivations:a?.excludeDerivations?.map(R),includeFacts:a?.includeFacts?.map(R)};return w.watchDistributableSnapshot(h,M=>{y({...M,data:H(M.data)});})},registerModule(a,y){if(t.has(a))throw new Error(`[Directive] Module namespace "${a}" already exists. Cannot register a duplicate namespace.`);if(a.includes(m))throw new Error(`[Directive] Module name "${a}" contains the reserved separator "${m}".`);if(l.has(a))throw new Error(`[Directive] Module name "${a}" is a blocked property.`);for(let x of Object.keys(y.schema.facts))if(x.includes(m))throw new Error(`[Directive] Schema key "${x}" in module "${a}" contains the reserved separator "${m}".`);let h=y,M=I({mod:h,namespace:a,snapshotModulesSet:r});t.add(a),n[a]=h,l$1.names=null,O.set(a,ue(a,h)),w.registerModule(M);}};return le(_,w),fe(_),_}function de(e){let n=e.history,t=e.trace,s=e.errorBoundary;return e.zeroConfig&&(n=n??a,s={onConstraintError:"skip",onResolverError:"skip",onEffectError:"skip",onDerivationError:"skip",...e.errorBoundary}),{history:n,trace:t,errorBoundary:s}}function le(e,n){Object.defineProperties(e,{trace:{get(){return n.trace},enumerable:true,configurable:true},meta:{value:n.meta,enumerable:true,configurable:true},isRunning:{get(){return n.isRunning},enumerable:true,configurable:true},isSettled:{get(){return n.isSettled},enumerable:true,configurable:true},isInitialized:{get(){return n.isInitialized},enumerable:true,configurable:true},isReady:{get(){return n.isReady},enumerable:true,configurable:true}}),e.whenReady=n.whenReady.bind(n),e.batch=n.batch.bind(n),e.onSettledChange=n.onSettledChange.bind(n),e.onHistoryChange=n.onHistoryChange.bind(n),e.inspect=n.inspect.bind(n),e.settle=n.settle.bind(n),e.explain=n.explain.bind(n),e.getSnapshot=n.getSnapshot.bind(n),e.restore=n.restore.bind(n),e.observe=n.observe.bind(n);let t=["dispatch","read","subscribe","watch","when","getDistributableSnapshot","watchDistributableSnapshot"];for(let s of t)s in e||(e[s]=n[s].bind(n));}function fe(e){a&&(typeof process>"u"||process.env?.NODE_ENV!=="test")&&setTimeout(()=>{!e.isRunning&&!e.isInitialized&&console.warn("[Directive] System created but start() was never called. Constraints, resolvers, and effects will not run until you call system.start().");},0);}function $e(e$1){let n=e$1.module;if(!n)throw new Error("[Directive] createSystem requires a module. Got: "+typeof n);if(e$1.tickMs!==void 0&&e$1.tickMs<=0)throw new Error("[Directive] tickMs must be a positive number");if(e$1.initialFacts&&!e(e$1.initialFacts))throw new Error("[Directive] initialFacts contains potentially dangerous keys (__proto__, constructor, or prototype). This may indicate a prototype pollution attack.");a&&(n.crossModuleDeps&&Object.keys(n.crossModuleDeps).length>0&&console.warn("[Directive] Single module mode ignores crossModuleDeps. Use multiple modules if cross-module access is needed: createSystem({ modules: { ... } })"),e$1.tickMs&&e$1.tickMs>0&&(n.events&&"tick"in n.events||console.warn(`[Directive] tickMs is set to ${e$1.tickMs}ms but module has no "tick" event handler.`)),(typeof e$1.history=="object"?e$1.history:null)?.snapshotModules&&console.warn("[Directive] history.snapshotModules has no effect in single-module mode. Use history.snapshotEvents on the module definition instead, or switch to createSystem({ modules: { ... } }) for multi-module filtering."));let{history:t,trace:s,errorBoundary:r}=de(e$1),u=null,i=null;i=T({modules:[{id:n.id,schema:n.schema.facts,requirements:n.schema.requirements,init:n.init,derive:n.derive,events:n.events,effects:n.effects,constraints:n.constraints,resolvers:n.resolvers,hooks:n.hooks,meta:n.meta,history:n.history}],plugins:e$1.plugins,history:t,trace:s,errorBoundary:r,tickMs:e$1.tickMs,cloud:e$1.cloud,onAfterModuleInit:()=>{if(e$1.initialFacts)for(let[d,g]of Object.entries(e$1.initialFacts))l.has(d)||(i.facts[d]=g);if(u){if(!e(u))a&&console.warn("[Directive] hydrate() data contains potentially dangerous keys. Skipping.");else for(let[d,g]of Object.entries(u))l.has(d)||(i.facts[d]=g);u=null;}}});let c=new Proxy({},{get(d,g){if(typeof g!="symbol"&&!l.has(g))return k=>{i.dispatch({type:g,...k});}},has(d,g){return typeof g=="symbol"||l.has(g)?false:n.events?g in n.events:false},ownKeys(){return n.events?Object.keys(n.events):[]},getOwnPropertyDescriptor(d,g){if(typeof g!="symbol"&&!l.has(g)&&n.events&&g in n.events)return {configurable:true,enumerable:true}},set(){return false},deleteProperty(){return false},defineProperty(){return false},getPrototypeOf(){return null},setPrototypeOf(){return false}}),o=null,f=e$1.tickMs,l$1={_mode:"single",facts:i.facts,history:i.history,derive:i.derive,events:c,constraints:i.constraints,effects:i.effects,resolvers:i.resolvers,async hydrate(d){if(i.isRunning)throw new Error("[Directive] hydrate() must be called before start(). The system is already running.");let g=await d();g&&typeof g=="object"&&(u=g);},initialize(){i.initialize();},start(){i.start(),f&&f>0&&n.events&&"tick"in n.events&&(o=setInterval(()=>{i.dispatch({type:"tick"});},f));},stop(){o&&(clearInterval(o),o=null),i.stop();},destroy(){this.stop(),i.destroy();},registerModule(d){i.registerModule({id:d.id,schema:d.schema.facts,requirements:d.schema.requirements,init:d.init,derive:d.derive,events:d.events,effects:d.effects,constraints:d.constraints,resolvers:d.resolvers,hooks:d.hooks,history:d.history});}};return le(l$1,i),fe(l$1),l$1}export{ze as a};//# sourceMappingURL=chunk-26Z5VNPZ.js.map | ||
| //# sourceMappingURL=chunk-26Z5VNPZ.js.map |
Sorry, the diff of this file is too big to display
| 'use strict';var chunkEOLY64E6_cjs=require('./chunk-EOLY64E6.cjs');var q=1e4,x=1e3;function E(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 C(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,a]=r.changedBetween,o=E(i),l=E(a);if(t.ts<o||t.ts>l)return false}return true}function P(t={}){let r=t.capacity??q,i=[];return {write(a){i.push(a),i.length>r&&i.shift();},query(a){let o=a.limit??x,l=[];for(let d=i.length-1;d>=0;d--){let c=i[d];if(C(c,a)&&(l.push(c),l.length>=o))break}return l},recent(a){let o=Math.max(0,i.length-a);return i.slice(o)},forFact(a,o={}){return this.query({factPath:a,limit:o.limit})},forConstraint(a,o={}){return this.query({constraintId:a,limit:o.limit})},toJSON(){return {entries:i.slice(),capturedAt:Date.now()}},clear(){i=[];},destroy(){i=[];}}}function I(t){return chunkEOLY64E6_cjs.g(t)}function R(t={}){let r=t.sink??P(),i=t.capturePII??false,a=t.redact,o=0,l=null,d=null,c=null,g=new Map,m=new Set;function h(){if(g.clear(),!!d)try{let e=d.inspect;if(typeof e!="function")return;let u=e()?.constraints??[];for(let s of u)s.whenSpec!==void 0&&g.set(s.id,s.whenSpec);}catch{}}function k(){if(m.clear(),!(i||!d))try{let e=d.meta;if(!e||typeof e.byTag!="function")return;let n=e.byTag("pii")??[];for(let u of n)m.add(u.id);}catch{}}function p(e,n){return i?n:m.has(e)?"[redacted]":n}function b(e){if(!e||i||m.size===0)return e;let n=false,u=e.map(s=>{if(m.has(s.path))return n=true,{...s,actual:"[redacted]"};if(s.children){let f=b(s.children);if(f!==s.children)return n=true,{...s,children:f}}return s});return n?u:e}function y(e){let n={...e,seq:o++,ts:Date.now(),prevHash:l},u=a?a(n):n;r.write(u),l=I(u);}function v(e){switch(e.type){case "constraint.evaluate":y({kind:"constraint.evaluate",constraintId:e.id,active:e.active,whenSpec:g.get(e.id),whenExplain:b(e.whenExplain)});break;case "fact.change":y({kind:"fact.change",key:e.key,prior:p(e.key,e.prev),next:p(e.key,e.next)});break;case "resolver.write.rejected":e.kind==="summary"?y({kind:"resolver.write.rejected",rejection:"summary",resolverId:e.resolver,requirementId:e.requirementId,reason:e.reason,dropped:e.dropped}):y({kind:"resolver.write.rejected",rejection:"rejection",resolverId:e.resolver,requirementId:e.requirementId,reason:e.reason,fact:e.fact,expected:p(e.fact,e.expected),actual:p(e.fact,e.actual)});break;case "resolver.complete":y({kind:"resolver.complete",resolverId:e.resolver,requirementId:e.requirementId,duration:e.duration});break;case "resolver.error":y({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":y({kind:e.type});break;}}function S(e){d=e,k(),h(),c=e.observe(v);}function A(){c&&(c(),c=null),d=null,g.clear(),m.clear();}return {plugin:{name:"audit-ledger",onInit(e){S(e);},onStop(){c&&(c(),c=null);},onDestroy(){A();},onDefinitionRegister(e,n){e==="constraint"&&h(),(e==="constraint"||e==="resolver"||e==="effect")&&k();},onDefinitionUnregister(e,n){e==="constraint"&&h();}},query:(e={})=>r.query(e),recent:e=>r.recent(e),forFact:(e,n)=>r.forFact(e,n),forConstraint:(e,n)=>r.forConstraint(e,n),toJSON:()=>r.toJSON(),verify(e){let{entries:n}=r.toJSON();if(n.length===0)return e?.strong?Promise.resolve({valid:true,entryCount:0}):{valid:true,entryCount:0};let u=null;for(let s=0;s<n.length;s++){let f=n[s];if(f.prevHash!==u)return {valid:false,brokenAt:s,expectedHash:u??"<genesis>",actualHash:f.prevHash??"<genesis>",entry:f};u=I(f);}return e?.strong?(async()=>({valid:true,entryCount:n.length}))():{valid:true,entryCount:n.length}},clear(){r.clear(),o=0,l=null;},destroy(){A(),r.destroy();}}}exports.a=P;exports.b=R;//# sourceMappingURL=chunk-4VZOZWXM.cjs.map | ||
| //# sourceMappingURL=chunk-4VZOZWXM.cjs.map |
| {"version":3,"sources":["../src/plugins/audit-ledger.ts"],"names":["DEFAULT_MEMORY_CAPACITY","DEFAULT_QUERY_LIMIT","parseRangeBound","v","t","matchesFilter","entry","filter","a","b","start","end","memorySink","opts","capacity","entries","limit","out","i","e","n","path","opts2","id","syncHash","hashObject","createAuditLedger","sink","capturePII","userRedact","seq","lastHashCache","system","unobserve","whenSpecCache","piiTaggedFacts","refreshWhenSpecCache","inspect","constraints","c","refreshPIITags","meta","tagged","m","redactValue","factPath","value","redactClauses","clauses","mutated","inner","emit","partial","finalEntry","onEvent","event","attach","sys","detach","type","prevHash"],"mappings":"mEA4IA,IAAMA,CAAAA,CAA0B,GAAA,CAC1BC,CAAAA,CAAsB,GAAA,CAE5B,SAASC,CAAAA,CAAgBC,CAAAA,CAAmC,CAC1D,GAAIA,CAAAA,YAAa,IAAA,CAAM,OAAOA,CAAAA,CAAE,SAAQ,CACxC,GAAI,OAAOA,CAAAA,EAAM,QAAA,CAAU,CACzB,GAAI,CAAC,MAAA,CAAO,QAAA,CAASA,CAAC,CAAA,CACpB,MAAM,IAAI,MACR,8FACF,CAAA,CAGF,OAAOA,CACT,CACA,GAAI,OAAOA,CAAAA,EAAM,QAAA,CAAU,CACzB,IAAMC,CAAAA,CAAI,IAAA,CAAK,KAAA,CAAMD,CAAC,CAAA,CACtB,GAAI,CAAC,MAAA,CAAO,QAAA,CAASC,CAAC,CAAA,CACpB,MAAM,IAAI,KAAA,CACR,CAAA,gDAAA,EAAmDD,CAAC,CAAA,qCAAA,CACtD,CAAA,CAGF,OAAOC,CACT,CACA,MAAM,IAAI,KAAA,CACR,uFACF,CACF,CAEA,SAASC,CAAAA,CAAcC,CAAAA,CAAmBC,CAAAA,CAA8B,CACtE,GAAIA,CAAAA,CAAO,IAAA,EAEL,CAAA,CADU,KAAA,CAAM,OAAA,CAAQA,CAAAA,CAAO,IAAI,CAAA,CAAIA,CAAAA,CAAO,IAAA,CAAO,CAACA,CAAAA,CAAO,IAAI,CAAA,EAC1D,QAAA,CAASD,CAAAA,CAAM,IAAI,EAAG,OAAO,MAAA,CAE1C,GAAIC,CAAAA,CAAO,QAAA,GAAa,MAAA,CAEtB,GAAID,CAAAA,CAAM,IAAA,GAAS,aAAA,CAAA,CACjB,GAAIA,CAAAA,CAAM,GAAA,GAAQC,CAAAA,CAAO,QAAA,CAAU,OAAO,MAAA,CAAA,KAAA,GACjCD,CAAAA,CAAM,IAAA,GAAS,yBAAA,CAAA,CACxB,GAAIA,CAAAA,CAAM,IAAA,GAASC,CAAAA,CAAO,QAAA,CAAU,OAAO,MAAA,CAAA,KAE3C,OAAO,MAAA,CAGX,GAAIA,EAAO,YAAA,GAAiB,MAAA,GACtBD,CAAAA,CAAM,IAAA,GAAS,qBAAA,EACfA,CAAAA,CAAM,YAAA,GAAiBC,CAAAA,CAAO,YAAA,CAAA,CAAc,OAAO,MAAA,CAEzD,GAAIA,CAAAA,CAAO,cAAA,CAAgB,CACzB,GAAM,CAACC,CAAAA,CAAGC,CAAC,CAAA,CAAIF,CAAAA,CAAO,cAAA,CAChBG,CAAAA,CAAQR,CAAAA,CAAgBM,CAAC,CAAA,CACzBG,CAAAA,CAAMT,CAAAA,CAAgBO,CAAC,EAC7B,GAAIH,CAAAA,CAAM,EAAA,CAAKI,CAAAA,EAASJ,CAAAA,CAAM,EAAA,CAAKK,CAAAA,CAAK,OAAO,MACjD,CAEA,OAAO,KACT,CAOO,SAASC,CAAAA,CACdC,CAAAA,CAA8B,EAAC,CACd,CACjB,IAAMC,CAAAA,CAAWD,CAAAA,CAAK,QAAA,EAAYb,CAAAA,CAC9Be,CAAAA,CAAwB,EAAC,CAE7B,OAAO,CACL,KAAA,CAAMT,EAAO,CACXS,CAAAA,CAAQ,IAAA,CAAKT,CAAK,CAAA,CACdS,CAAAA,CAAQ,MAAA,CAASD,CAAAA,EAGnBC,CAAAA,CAAQ,KAAA,GAEZ,CAAA,CACA,KAAA,CAAMR,CAAAA,CAAQ,CACZ,IAAMS,CAAAA,CAAQT,CAAAA,CAAO,KAAA,EAASN,CAAAA,CACxBgB,CAAAA,CAAoB,EAAC,CAC3B,IAAA,IAASC,CAAAA,CAAIH,CAAAA,CAAQ,MAAA,CAAS,CAAA,CAAGG,CAAAA,EAAK,CAAA,CAAGA,IAAK,CAC5C,IAAMC,CAAAA,CAAIJ,CAAAA,CAAQG,CAAC,CAAA,CACnB,GAAIb,CAAAA,CAAcc,CAAAA,CAAGZ,CAAM,CAAA,GACzBU,CAAAA,CAAI,IAAA,CAAKE,CAAC,CAAA,CACNF,CAAAA,CAAI,MAAA,EAAUD,CAAAA,CAAAA,CAAO,KAE7B,CAEA,OAAOC,CACT,CAAA,CACA,MAAA,CAAOG,CAAAA,CAAG,CACR,IAAMV,CAAAA,CAAQ,IAAA,CAAK,GAAA,CAAI,EAAGK,CAAAA,CAAQ,MAAA,CAASK,CAAC,CAAA,CAE5C,OAAOL,CAAAA,CAAQ,KAAA,CAAML,CAAK,CAC5B,CAAA,CACA,OAAA,CAAQW,CAAAA,CAAMC,CAAAA,CAAQ,GAAI,CACxB,OAAO,IAAA,CAAK,KAAA,CAAM,CAAE,QAAA,CAAUD,CAAAA,CAAM,KAAA,CAAOC,CAAAA,CAAM,KAAM,CAAC,CAC1D,CAAA,CACA,aAAA,CAAcC,EAAID,CAAAA,CAAQ,EAAC,CAAG,CAC5B,OAAO,IAAA,CAAK,KAAA,CAAM,CAAE,YAAA,CAAcC,CAAAA,CAAI,KAAA,CAAOD,CAAAA,CAAM,KAAM,CAAC,CAC5D,CAAA,CACA,MAAA,EAAS,CACP,OAAO,CAAE,OAAA,CAASP,CAAAA,CAAQ,KAAA,EAAM,CAAG,UAAA,CAAY,IAAA,CAAK,GAAA,EAAM,CAC5D,CAAA,CACA,OAAQ,CACNA,CAAAA,CAAU,GACZ,CAAA,CACA,OAAA,EAAU,CACRA,CAAAA,CAAU,GACZ,CACF,CACF,CAoBA,SAASS,CAAAA,CAASlB,CAAAA,CAA2B,CAG3C,OAAOmB,mBAAAA,CAAWnB,CAAK,CACzB,CAqFO,SAASoB,CAAAA,CACdb,CAAAA,CAA2B,EAAC,CACf,CACb,IAAMc,CAAAA,CAAOd,EAAK,IAAA,EAAQD,CAAAA,EAAW,CAC/BgB,CAAAA,CAAaf,CAAAA,CAAK,UAAA,EAAc,KAAA,CAChCgB,CAAAA,CAAahB,CAAAA,CAAK,MAAA,CAEpBiB,CAAAA,CAAM,CAAA,CACNC,CAAAA,CAA+B,IAAA,CAE/BC,CAAAA,CAAsC,IAAA,CACtCC,CAAAA,CAAiC,IAAA,CAG/BC,CAAAA,CAAgB,IAAI,GAAA,CAGpBC,CAAAA,CAAiB,IAAI,GAAA,CAE3B,SAASC,CAAAA,EAA6B,CAEpC,GADAF,CAAAA,CAAc,KAAA,GACV,CAAA,CAACF,CAAAA,CACL,GAAI,CACF,IAAMK,CAAAA,CAAWL,CAAAA,CAA2F,OAAA,CAC5G,GAAI,OAAOK,CAAAA,EAAY,UAAA,CAAY,OAEnC,IAAMC,EADaD,CAAAA,EAAQ,EACK,WAAA,EAAe,EAAC,CAChD,IAAA,IAAWE,CAAAA,IAAKD,CAAAA,CACVC,CAAAA,CAAE,QAAA,GAAa,KAAA,CAAA,EACjBL,CAAAA,CAAc,GAAA,CAAIK,CAAAA,CAAE,GAAIA,CAAAA,CAAE,QAAkC,EAGlE,CAAA,KAAQ,CAER,CACF,CAEA,SAASC,CAAAA,EAAuB,CAE9B,GADAL,CAAAA,CAAe,KAAA,EAAM,CACjB,EAAAP,CAAAA,EAAc,CAACI,CAAAA,CAAAA,CACnB,GAAI,CACF,IAAMS,CAAAA,CAAQT,CAAAA,CAAyE,IAAA,CACvF,GAAI,CAACS,CAAAA,EAAQ,OAAOA,CAAAA,CAAK,KAAA,EAAU,WAAY,OAC/C,IAAMC,CAAAA,CAASD,CAAAA,CAAK,KAAA,CAAM,KAAK,CAAA,EAAK,EAAC,CACrC,IAAA,IAAWE,CAAAA,IAAKD,CAAAA,CACdP,CAAAA,CAAe,GAAA,CAAIQ,CAAAA,CAAE,EAAE,EAE3B,CAAA,KAAQ,CAER,CACF,CAEA,SAASC,CAAAA,CAAYC,CAAAA,CAAkBC,CAAAA,CAAyB,CAC9D,OAAIlB,CAAAA,CAAmBkB,CAAAA,CACnBX,CAAAA,CAAe,IAAIU,CAAQ,CAAA,CAAU,YAAA,CAElCC,CACT,CAEA,SAASC,CAAAA,CACPC,CAAAA,CAC4B,CAE5B,GADI,CAACA,CAAAA,EACDpB,CAAAA,EAAcO,CAAAA,CAAe,IAAA,GAAS,CAAA,CAAG,OAAOa,CAAAA,CACpD,IAAIC,CAAAA,CAAU,KAAA,CACRhC,CAAAA,CAAsB+B,CAAAA,CAAQ,GAAA,CAAKT,CAAAA,EAAM,CAC7C,GAAIJ,CAAAA,CAAe,GAAA,CAAII,CAAAA,CAAE,IAAI,CAAA,CAC3B,OAAAU,CAAAA,CAAU,IAAA,CACH,CAAE,GAAGV,CAAAA,CAAG,MAAA,CAAQ,YAAa,CAAA,CAGtC,GAAIA,CAAAA,CAAE,QAAA,CAAU,CACd,IAAMW,CAAAA,CAAQH,CAAAA,CAAcR,CAAAA,CAAE,QAAQ,CAAA,CACtC,GAAIW,CAAAA,GAAUX,CAAAA,CAAE,QAAA,CACd,OAAAU,CAAAA,CAAU,IAAA,CACH,CAAE,GAAGV,EAAG,QAAA,CAAUW,CAAM,CAEnC,CAEA,OAAOX,CACT,CAAC,CAAA,CAED,OAAOU,CAAAA,CAAUhC,CAAAA,CAAM+B,CACzB,CASA,SAASG,CAAAA,CAAKC,CAAAA,CAAwC,CACpD,IAAM9C,CAAAA,CAAQ,CACZ,GAAG8C,CAAAA,CACH,GAAA,CAAKtB,CAAAA,EAAAA,CACL,EAAA,CAAI,IAAA,CAAK,GAAA,EAAI,CACb,QAAA,CAAUC,CACZ,EAEMsB,CAAAA,CAAaxB,CAAAA,CAAaA,CAAAA,CAAWvB,CAAK,CAAA,CAAIA,CAAAA,CACpDqB,CAAAA,CAAK,KAAA,CAAM0B,CAAU,CAAA,CAKrBtB,CAAAA,CAAgBP,CAAAA,CAAS6B,CAAU,EACrC,CAEA,SAASC,CAAAA,CAAQC,CAAAA,CAA+B,CAC9C,OAAQA,CAAAA,CAAM,IAAA,EACZ,KAAK,qBAAA,CACHJ,CAAAA,CAAK,CACH,IAAA,CAAM,qBAAA,CACN,YAAA,CAAcI,EAAM,EAAA,CACpB,MAAA,CAAQA,CAAAA,CAAM,MAAA,CACd,QAAA,CAAUrB,CAAAA,CAAc,GAAA,CAAIqB,CAAAA,CAAM,EAAE,CAAA,CACpC,WAAA,CAAaR,CAAAA,CAAcQ,CAAAA,CAAM,WAAW,CAC9C,CAAC,CAAA,CACD,MACF,KAAK,aAAA,CACHJ,CAAAA,CAAK,CACH,IAAA,CAAM,aAAA,CACN,GAAA,CAAKI,CAAAA,CAAM,GAAA,CACX,KAAA,CAAOX,CAAAA,CAAYW,CAAAA,CAAM,IAAKA,CAAAA,CAAM,IAAI,CAAA,CACxC,IAAA,CAAMX,CAAAA,CAAYW,CAAAA,CAAM,GAAA,CAAKA,CAAAA,CAAM,IAAI,CACzC,CAAC,CAAA,CACD,MACF,KAAK,0BACCA,CAAAA,CAAM,IAAA,GAAS,SAAA,CACjBJ,CAAAA,CAAK,CACH,IAAA,CAAM,yBAAA,CACN,SAAA,CAAW,SAAA,CACX,UAAA,CAAYI,CAAAA,CAAM,QAAA,CAClB,aAAA,CAAeA,CAAAA,CAAM,cACrB,MAAA,CAAQA,CAAAA,CAAM,MAAA,CACd,OAAA,CAASA,CAAAA,CAAM,OACjB,CAAC,CAAA,CAEDJ,CAAAA,CAAK,CACH,IAAA,CAAM,yBAAA,CACN,SAAA,CAAW,WAAA,CACX,UAAA,CAAYI,CAAAA,CAAM,QAAA,CAClB,aAAA,CAAeA,CAAAA,CAAM,aAAA,CACrB,MAAA,CAAQA,CAAAA,CAAM,MAAA,CACd,IAAA,CAAMA,CAAAA,CAAM,IAAA,CACZ,QAAA,CAAUX,CAAAA,CAAYW,CAAAA,CAAM,IAAA,CAAMA,EAAM,QAAQ,CAAA,CAChD,MAAA,CAAQX,CAAAA,CAAYW,CAAAA,CAAM,IAAA,CAAMA,CAAAA,CAAM,MAAM,CAC9C,CAAC,CAAA,CAEH,MACF,KAAK,mBAAA,CACHJ,CAAAA,CAAK,CACH,IAAA,CAAM,mBAAA,CACN,UAAA,CAAYI,CAAAA,CAAM,QAAA,CAClB,aAAA,CAAeA,CAAAA,CAAM,aAAA,CACrB,QAAA,CAAUA,CAAAA,CAAM,QAClB,CAAC,CAAA,CACD,MACF,KAAK,gBAAA,CACHJ,CAAAA,CAAK,CACH,IAAA,CAAM,gBAAA,CACN,UAAA,CAAYI,CAAAA,CAAM,QAAA,CAClB,aAAA,CAAeA,CAAAA,CAAM,aAAA,CACrB,KAAA,CAAO,MAAA,CAAOA,CAAAA,CAAM,KAAK,CAC3B,CAAC,CAAA,CACD,MACF,KAAK,aAAA,CACL,KAAK,cAAA,CACL,KAAK,aAAA,CACL,KAAK,gBAAA,CACHJ,CAAAA,CAAK,CAAE,IAAA,CAAMI,EAAM,IAAK,CAAC,CAAA,CACzB,MAOJ,CACF,CAEA,SAASC,CAAAA,CAAOC,CAAAA,CAAiC,CAC/CzB,CAAAA,CAASyB,CAAAA,CACTjB,GAAe,CACfJ,CAAAA,EAAqB,CACrBH,CAAAA,CAAYwB,CAAAA,CAAI,OAAA,CAAQH,CAAO,EACjC,CAEA,SAASI,CAAAA,EAAe,CAClBzB,CAAAA,GACFA,CAAAA,GACAA,CAAAA,CAAY,IAAA,CAAA,CAEdD,CAAAA,CAAS,IAAA,CACTE,CAAAA,CAAc,KAAA,EAAM,CACpBC,CAAAA,CAAe,KAAA,GACjB,CAiCA,OAAO,CACL,MAAA,CAhCmC,CACnC,IAAA,CAAM,cAAA,CACN,MAAA,CAAOsB,CAAAA,CAAK,CACVD,CAAAA,CAAOC,CAA2B,EACpC,CAAA,CACA,MAAA,EAAS,CAGHxB,CAAAA,GACFA,CAAAA,EAAU,CACVA,CAAAA,CAAY,MAEhB,CAAA,CACA,SAAA,EAAY,CACVyB,CAAAA,GACF,CAAA,CACA,oBAAA,CAAqBC,CAAAA,CAAMpC,CAAAA,CAAI,CACzBoC,CAAAA,GAAS,YAAA,EAAcvB,CAAAA,EAAqB,CAAA,CAC5CuB,CAAAA,GAAS,YAAA,EAAgBA,CAAAA,GAAS,UAAA,EAAcA,CAAAA,GAAS,QAAA,GAG3DnB,CAAAA,GAGJ,CAAA,CACA,sBAAA,CAAuBmB,CAAAA,CAAMpC,CAAAA,CAAI,CAC3BoC,CAAAA,GAAS,YAAA,EAAcvB,CAAAA,GAE7B,CACF,CAAA,CAIE,KAAA,CAAO,CAAC7B,CAAAA,CAAS,EAAC,GAAMoB,CAAAA,CAAK,KAAA,CAAMpB,CAAM,CAAA,CACzC,MAAA,CAASa,CAAAA,EAAMO,CAAAA,CAAK,MAAA,CAAOP,CAAC,CAAA,CAC5B,OAAA,CAAS,CAACC,CAAAA,CAAMC,CAAAA,GAAUK,CAAAA,CAAK,OAAA,CAAQN,CAAAA,CAAMC,CAAK,CAAA,CAClD,aAAA,CAAe,CAACC,CAAAA,CAAID,CAAAA,GAAUK,EAAK,aAAA,CAAcJ,CAAAA,CAAID,CAAK,CAAA,CAC1D,MAAA,CAAQ,IAAMK,CAAAA,CAAK,MAAA,EAAO,CAC1B,MAAA,CAAOd,CAAAA,CAAmE,CACxE,GAAM,CAAE,OAAA,CAAAE,CAAQ,CAAA,CAAIY,CAAAA,CAAK,MAAA,EAAO,CAChC,GAAIZ,CAAAA,CAAQ,MAAA,GAAW,CAAA,CACrB,OAAOF,CAAAA,EAAM,MAAA,CACT,OAAA,CAAQ,OAAA,CAAQ,CAAE,MAAO,IAAA,CAAM,UAAA,CAAY,CAAE,CAAC,CAAA,CAC9C,CAAE,KAAA,CAAO,IAAA,CAAM,UAAA,CAAY,CAAE,CAAA,CAInC,IAAI+C,CAAAA,CAA0B,IAAA,CAC9B,IAAA,IAAS1C,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAIH,CAAAA,CAAQ,MAAA,CAAQG,CAAAA,EAAAA,CAAK,CACvC,IAAMZ,CAAAA,CAAQS,CAAAA,CAAQG,CAAC,CAAA,CACvB,GAAIZ,CAAAA,CAAM,QAAA,GAAasD,EACrB,OAAO,CACL,KAAA,CAAO,KAAA,CACP,QAAA,CAAU1C,CAAAA,CACV,YAAA,CAAc0C,CAAAA,EAAY,WAAA,CAC1B,UAAA,CAAYtD,CAAAA,CAAM,QAAA,EAAY,WAAA,CAC9B,KAAA,CAAAA,CACF,CAAA,CAEFsD,CAAAA,CAAWpC,CAAAA,CAASlB,CAAK,EAC3B,CAEA,OAAKO,CAAAA,EAAM,MAAA,CAAA,CAQH,UAIC,CAAE,KAAA,CAAO,IAAA,CAAM,UAAA,CAAYE,CAAAA,CAAQ,MAAO,CAAA,CAAA,GAChD,CAZM,CAAE,KAAA,CAAO,IAAA,CAAM,UAAA,CAAYA,CAAAA,CAAQ,MAAO,CAarD,CAAA,CACA,KAAA,EAAQ,CACNY,CAAAA,CAAK,KAAA,EAAM,CACXG,CAAAA,CAAM,CAAA,CACNC,CAAAA,CAAgB,KAClB,CAAA,CACA,OAAA,EAAU,CACR2B,CAAAA,EAAO,CACP/B,CAAAA,CAAK,OAAA,GACP,CACF,CACF","file":"chunk-4VZOZWXM.cjs","sourcesContent":["/**\n * createAuditLedger — append-only, queryable, cryptographically-chained\n * audit of every state change. For compliance, forensics, \"show me why\n * this user got that decision.\"\n *\n * Captures (per observation event):\n *\n * - `constraint.evaluate` → { whenSpec, whenExplain, active }\n * - `resolver.write.rejected` (rejection + summary kinds)\n * - `fact.change` → { key, prior, next }\n * - `resolver.complete` → { resolverId, requirementId, duration }\n * - `system.init` / `system.start` / `system.stop` / `system.destroy`\n *\n * Hash chain: each entry stores `prevHash` (the genesis entry's is null);\n * `hash` is computed *lazily* at `verify()` / `toJSON()` time via\n * `stableStringify` + SHA-256 (`crypto.subtle.digest`). Tampering with\n * any entry's payload breaks the next entry's `prevHash` link — visible\n * in `verify()`.\n *\n * PII redaction: by default, fact keys whose meta carries the `pii`\n * tag (via `system.meta.byTag(\"pii\")`) have their values replaced with\n * `\"[redacted]\"` in `whenExplain.actual`, `fact.change.prior`, and\n * `fact.change.next`. Opt out with `capturePII: true`.\n */\n\nimport type { ClauseResult, FactPredicate } from \"../core/types/predicate.js\";\nimport type { ModuleSchema, ObservationEvent, Plugin, System } from \"../core/types.js\";\nimport { hashObject } from \"../utils/utils.js\";\n\n// ============================================================================\n// AuditEntry types\n// ============================================================================\n\nexport type AuditEntryKind =\n | \"constraint.evaluate\"\n | \"resolver.write.rejected\"\n | \"fact.change\"\n | \"resolver.complete\"\n | \"resolver.error\"\n | \"system.init\"\n | \"system.start\"\n | \"system.stop\"\n | \"system.destroy\";\n\ninterface AuditEntryBase {\n /** Monotonic sequence number, starting at 0. */\n readonly seq: number;\n /** Wall-clock timestamp (ms epoch). */\n readonly ts: number;\n /** Discriminator. */\n readonly kind: AuditEntryKind;\n /** Hash of the previous entry's full payload. null on the genesis entry. */\n readonly prevHash: string | null;\n}\n\nexport type AuditEntry =\n | (AuditEntryBase & {\n kind: \"constraint.evaluate\";\n constraintId: string;\n active: boolean;\n /** Cached at ledger start from `system.inspect().constraints[].whenSpec`. May be undefined for function-form constraints. */\n whenSpec?: FactPredicate<unknown>;\n whenExplain?: readonly ClauseResult[];\n })\n | (AuditEntryBase & {\n kind: \"resolver.write.rejected\";\n rejection: \"rejection\" | \"summary\";\n resolverId: string;\n requirementId: string;\n reason: string;\n fact?: string;\n expected?: unknown;\n actual?: unknown;\n dropped?: number;\n })\n | (AuditEntryBase & {\n kind: \"fact.change\";\n key: string;\n prior: unknown;\n next: unknown;\n })\n | (AuditEntryBase & {\n kind: \"resolver.complete\";\n resolverId: string;\n requirementId: string;\n duration: number;\n })\n | (AuditEntryBase & {\n kind: \"resolver.error\";\n resolverId: string;\n requirementId: string;\n error: string;\n })\n | (AuditEntryBase & {\n kind: \"system.init\" | \"system.start\" | \"system.stop\" | \"system.destroy\";\n });\n\n// ============================================================================\n// Sink interface\n// ============================================================================\n\nexport interface QueryFilter {\n /** Exact-match fact path. */\n factPath?: string;\n /** Filter by constraint id. */\n constraintId?: string;\n /** Filter by entry kind. */\n kind?: AuditEntryKind | readonly AuditEntryKind[];\n /** Time range as `[startMs, endMs]`, ISO strings, or epoch numbers. */\n changedBetween?: [string | number | Date, string | number | Date];\n /** Maximum entries returned. Default 1000. */\n limit?: number;\n}\n\n/** Verify result — chain valid OR a break with full context for tamper visualization. */\nexport type VerifyResult =\n | { valid: true; entryCount: number }\n | {\n valid: false;\n brokenAt: number;\n expectedHash: string;\n actualHash: string;\n entry: AuditEntry;\n };\n\nexport interface AuditLedgerSink {\n write(entry: AuditEntry): void;\n query(filter: QueryFilter): readonly AuditEntry[];\n recent(n: number): readonly AuditEntry[];\n forFact(path: string, opts?: { limit?: number }): readonly AuditEntry[];\n forConstraint(id: string, opts?: { limit?: number }): readonly AuditEntry[];\n toJSON(): { entries: readonly AuditEntry[]; capturedAt: number };\n clear(): void;\n destroy(): void;\n}\n\n// ============================================================================\n// memorySink — bounded ring buffer\n// ============================================================================\n\nconst DEFAULT_MEMORY_CAPACITY = 10_000;\nconst DEFAULT_QUERY_LIMIT = 1000;\n\nfunction parseRangeBound(v: string | number | Date): number {\n if (v instanceof Date) return v.getTime();\n if (typeof v === \"number\") {\n if (!Number.isFinite(v)) {\n throw new Error(\n `[Directive] audit-ledger: changedBetween bound must be a finite number, ISO string, or Date.`,\n );\n }\n\n return v;\n }\n if (typeof v === \"string\") {\n const t = Date.parse(v);\n if (!Number.isFinite(t)) {\n throw new Error(\n `[Directive] audit-ledger: changedBetween bound \"${v}\" is not a parseable ISO date string.`,\n );\n }\n\n return t;\n }\n throw new Error(\n `[Directive] audit-ledger: changedBetween bound must be a number, ISO string, or Date.`,\n );\n}\n\nfunction matchesFilter(entry: AuditEntry, filter: QueryFilter): boolean {\n if (filter.kind) {\n const kinds = Array.isArray(filter.kind) ? filter.kind : [filter.kind];\n if (!kinds.includes(entry.kind)) return false;\n }\n if (filter.factPath !== undefined) {\n // Exact match — no LIKE wildcards. (SEC M2)\n if (entry.kind === \"fact.change\") {\n if (entry.key !== filter.factPath) return false;\n } else if (entry.kind === \"resolver.write.rejected\") {\n if (entry.fact !== filter.factPath) return false;\n } else {\n return false;\n }\n }\n if (filter.constraintId !== undefined) {\n if (entry.kind !== \"constraint.evaluate\") return false;\n if (entry.constraintId !== filter.constraintId) return false;\n }\n if (filter.changedBetween) {\n const [a, b] = filter.changedBetween;\n const start = parseRangeBound(a);\n const end = parseRangeBound(b);\n if (entry.ts < start || entry.ts > end) return false;\n }\n\n return true;\n}\n\n/**\n * In-memory bounded ring-buffer sink. Drops oldest entries past\n * `capacity` (default 10,000). Use this as the default sink for dev,\n * tests, and StackBlitz demos.\n */\nexport function memorySink(\n opts: { capacity?: number } = {},\n): AuditLedgerSink {\n const capacity = opts.capacity ?? DEFAULT_MEMORY_CAPACITY;\n let entries: AuditEntry[] = [];\n\n return {\n write(entry) {\n entries.push(entry);\n if (entries.length > capacity) {\n // Drop oldest. This is a ring; entries.shift() is O(n) but for\n // bounded capacity it's acceptable.\n entries.shift();\n }\n },\n query(filter) {\n const limit = filter.limit ?? DEFAULT_QUERY_LIMIT;\n const out: AuditEntry[] = [];\n for (let i = entries.length - 1; i >= 0; i--) {\n const e = entries[i]!;\n if (matchesFilter(e, filter)) {\n out.push(e);\n if (out.length >= limit) break;\n }\n }\n\n return out;\n },\n recent(n) {\n const start = Math.max(0, entries.length - n);\n\n return entries.slice(start);\n },\n forFact(path, opts2 = {}) {\n return this.query({ factPath: path, limit: opts2.limit });\n },\n forConstraint(id, opts2 = {}) {\n return this.query({ constraintId: id, limit: opts2.limit });\n },\n toJSON() {\n return { entries: entries.slice(), capturedAt: Date.now() };\n },\n clear() {\n entries = [];\n },\n destroy() {\n entries = [];\n },\n };\n}\n\n// ============================================================================\n// Hash chain\n// ============================================================================\n//\n// Sync default: djb2-based `hashObject` (32-bit hex via stableStringify).\n// - Fast, sync, isomorphic Node/Bun/Deno/browser.\n// - Tamper-detection against accidental + light adversarial probing.\n// - Collision-prone against a determined attacker, by design (32 bits).\n//\n// Optional async strong verify: SHA-256 via Web Crypto (`crypto.subtle.digest`).\n// - Compliance-grade collision resistance.\n// - Async (returns Promise) — verify({ strong: true }).\n//\n// `prevHash` stores the SYNC hash of the previous entry (always). Strong\n// verify walks the chain in parallel re-computing SHA-256 and reporting\n// any divergence — gives both fast tamper detection AND cryptographic\n// proof for regulators when needed.\n\nfunction syncHash(entry: AuditEntry): string {\n // stableStringify guarantees same hash across runtimes regardless of\n // key insertion order (architecture review #11, security review C1).\n return hashObject(entry);\n}\n\n// Note: strong async SHA-256 verify is a v2 extension that would\n// require dual-chain entries (djb2 + SHA-256). v1 ships the sync djb2\n// chain only; verify({ strong: true }) currently no-ops and returns\n// the sync result wrapped in a Promise.\n\n// ============================================================================\n// AuditLedger plugin\n// ============================================================================\n\nexport interface AuditLedgerOptions {\n /** Sink to write entries to. Default: in-memory ring buffer (capacity 10k). */\n sink?: AuditLedgerSink;\n /**\n * Whether to capture raw fact values (`prior`/`next` on fact.change,\n * `actual` in whenExplain). Default `false` — PII-tagged facts are\n * redacted by default. Set `true` to opt out of redaction.\n */\n capturePII?: boolean;\n /**\n * Optional caller-supplied redactor. Runs AFTER the default\n * pii-tag-based redaction. Useful for additional sanitization.\n */\n redact?: (entry: AuditEntry) => AuditEntry;\n}\n\nexport interface AuditLedger {\n /** The plugin to pass to `createSystem({ plugins: [...] })`. */\n readonly plugin: Plugin<ModuleSchema>;\n /** Query entries matching the filter. */\n query(filter?: QueryFilter): readonly AuditEntry[];\n /** Most recent N entries (chronological). */\n recent(n: number): readonly AuditEntry[];\n /** All entries that touch this fact path (exact match). */\n forFact(path: string, opts?: { limit?: number }): readonly AuditEntry[];\n /** All entries for this constraint id. */\n forConstraint(id: string, opts?: { limit?: number }): readonly AuditEntry[];\n /** Full ledger snapshot for export / serialization. */\n toJSON(): { entries: readonly AuditEntry[]; capturedAt: number };\n /**\n * Walk the hash chain genesis → tip. Returns `{ valid: true }` iff\n * every entry's `prevHash` matches the (sync, djb2-based) hash of\n * the previous entry. On break, returns the index of the first\n * broken link plus the expected vs actual hashes — feed into a\n * \"TAMPERED\" visualization.\n *\n * Sync by default (djb2 chain). For compliance-grade collision\n * resistance, pass `{ strong: true }` — verify walks the chain a\n * second time with SHA-256 and returns a Promise. Callers must\n * `await` the result when `strong: true` is passed.\n */\n verify(opts?: { strong?: boolean }): VerifyResult | Promise<VerifyResult>;\n /** Empty the sink. */\n clear(): void;\n /** Unsubscribe + drop the sink. */\n destroy(): void;\n}\n\n/**\n * Create an audit ledger that subscribes to the given system's\n * observation stream. Returns a `Plugin` to install + a query/verify\n * API for the ledger.\n *\n * @example\n * ```ts\n * import { createAuditLedger } from \"@directive-run/core/plugins\";\n *\n * const ledger = createAuditLedger();\n * const system = createSystem({ module, plugins: [ledger.plugin] });\n * system.start();\n *\n * // Six months later — auditor asks \"what changed cart-total in March?\"\n * ledger.query({\n * factPath: \"cartTotal\",\n * changedBetween: [\"2026-03-01\", \"2026-04-01\"],\n * });\n *\n * // Verify nobody tampered with the ledger\n * const verdict = await ledger.verify();\n * if (!verdict.valid) {\n * console.error(\"Tamper at entry\", verdict.brokenAt);\n * }\n * ```\n */\nexport function createAuditLedger(\n opts: AuditLedgerOptions = {},\n): AuditLedger {\n const sink = opts.sink ?? memorySink();\n const capturePII = opts.capturePII ?? false;\n const userRedact = opts.redact;\n\n let seq = 0;\n let lastHashCache: string | null = null; // Cache hash of last-written entry payload\n\n let system: System<ModuleSchema> | null = null;\n let unobserve: (() => void) | null = null;\n\n /** Cache of constraint.id → whenSpec (snapshotted at start, refreshed on register/unregister). */\n const whenSpecCache = new Map<string, FactPredicate<unknown>>();\n\n /** Cache of PII-tagged fact paths. */\n const piiTaggedFacts = new Set<string>();\n\n function refreshWhenSpecCache(): void {\n whenSpecCache.clear();\n if (!system) return;\n try {\n const inspect = (system as { inspect?: () => { constraints?: Array<{ id: string; whenSpec?: unknown }> } }).inspect;\n if (typeof inspect !== \"function\") return;\n const inspection = inspect();\n const constraints = inspection?.constraints ?? [];\n for (const c of constraints) {\n if (c.whenSpec !== undefined) {\n whenSpecCache.set(c.id, c.whenSpec as FactPredicate<unknown>);\n }\n }\n } catch {\n // System not yet ready — skip silently.\n }\n }\n\n function refreshPIITags(): void {\n piiTaggedFacts.clear();\n if (capturePII || !system) return;\n try {\n const meta = (system as { meta?: { byTag?: (tag: string) => Array<{ id: string }> } }).meta;\n if (!meta || typeof meta.byTag !== \"function\") return;\n const tagged = meta.byTag(\"pii\") ?? [];\n for (const m of tagged) {\n piiTaggedFacts.add(m.id);\n }\n } catch {\n // No meta accessor — skip.\n }\n }\n\n function redactValue(factPath: string, value: unknown): unknown {\n if (capturePII) return value;\n if (piiTaggedFacts.has(factPath)) return \"[redacted]\";\n\n return value;\n }\n\n function redactClauses(\n clauses: ClauseResult[] | undefined,\n ): ClauseResult[] | undefined {\n if (!clauses) return clauses;\n if (capturePII || piiTaggedFacts.size === 0) return clauses;\n let mutated = false;\n const out: ClauseResult[] = clauses.map((c) => {\n if (piiTaggedFacts.has(c.path)) {\n mutated = true;\n return { ...c, actual: \"[redacted]\" };\n }\n // Recurse into combinator children.\n if (c.children) {\n const inner = redactClauses(c.children);\n if (inner !== c.children) {\n mutated = true;\n return { ...c, children: inner };\n }\n }\n\n return c;\n });\n\n return mutated ? out : clauses;\n }\n\n /**\n * `partial` is the entry-specific payload (no seq/ts/prevHash). It's\n * typed as `Record<string, unknown>` because TS's distributed Omit\n * over the AuditEntry discriminated union doesn't compose cleanly;\n * runtime construction is safe because each call site passes a\n * known-shape literal.\n */\n function emit(partial: Record<string, unknown>): void {\n const entry = {\n ...partial,\n seq: seq++,\n ts: Date.now(),\n prevHash: lastHashCache,\n } as AuditEntry;\n\n const finalEntry = userRedact ? userRedact(entry) : entry;\n sink.write(finalEntry);\n\n // Sync hash of this entry — stashed as the next entry's prevHash.\n // Whole entry is hashed (including its own prevHash field) so\n // verify() can rebuild the chain deterministically.\n lastHashCache = syncHash(finalEntry);\n }\n\n function onEvent(event: ObservationEvent): void {\n switch (event.type) {\n case \"constraint.evaluate\":\n emit({\n kind: \"constraint.evaluate\",\n constraintId: event.id,\n active: event.active,\n whenSpec: whenSpecCache.get(event.id),\n whenExplain: redactClauses(event.whenExplain),\n });\n break;\n case \"fact.change\":\n emit({\n kind: \"fact.change\",\n key: event.key,\n prior: redactValue(event.key, event.prev),\n next: redactValue(event.key, event.next),\n });\n break;\n case \"resolver.write.rejected\":\n if (event.kind === \"summary\") {\n emit({\n kind: \"resolver.write.rejected\",\n rejection: \"summary\",\n resolverId: event.resolver,\n requirementId: event.requirementId,\n reason: event.reason,\n dropped: event.dropped,\n });\n } else {\n emit({\n kind: \"resolver.write.rejected\",\n rejection: \"rejection\",\n resolverId: event.resolver,\n requirementId: event.requirementId,\n reason: event.reason,\n fact: event.fact,\n expected: redactValue(event.fact, event.expected),\n actual: redactValue(event.fact, event.actual),\n });\n }\n break;\n case \"resolver.complete\":\n emit({\n kind: \"resolver.complete\",\n resolverId: event.resolver,\n requirementId: event.requirementId,\n duration: event.duration,\n });\n break;\n case \"resolver.error\":\n emit({\n kind: \"resolver.error\",\n resolverId: event.resolver,\n requirementId: event.requirementId,\n error: String(event.error),\n });\n break;\n case \"system.init\":\n case \"system.start\":\n case \"system.stop\":\n case \"system.destroy\":\n emit({ kind: event.type });\n break;\n default:\n // Other observation events ignored in v1 (derivation.compute,\n // requirement.created/met/canceled, effect.run/error,\n // reconcile.start/end). They're available via .observe()\n // directly if a consumer wants them.\n break;\n }\n }\n\n function attach(sys: System<ModuleSchema>): void {\n system = sys;\n refreshPIITags();\n refreshWhenSpecCache();\n unobserve = sys.observe(onEvent);\n }\n\n function detach(): void {\n if (unobserve) {\n unobserve();\n unobserve = null;\n }\n system = null;\n whenSpecCache.clear();\n piiTaggedFacts.clear();\n }\n\n const plugin: Plugin<ModuleSchema> = {\n name: \"audit-ledger\",\n onInit(sys) {\n attach(sys as System<ModuleSchema>);\n },\n onStop() {\n // Keep the sink populated so query() works after stop, but\n // drop the subscription to avoid leaks.\n if (unobserve) {\n unobserve();\n unobserve = null;\n }\n },\n onDestroy() {\n detach();\n },\n onDefinitionRegister(type, id) {\n if (type === \"constraint\") refreshWhenSpecCache();\n if (type === \"constraint\" || type === \"resolver\" || type === \"effect\") {\n // Re-pull PII tags too — a dynamically-registered fact (rare)\n // could have brought new meta.\n refreshPIITags();\n }\n void id;\n },\n onDefinitionUnregister(type, id) {\n if (type === \"constraint\") refreshWhenSpecCache();\n void id;\n },\n };\n\n return {\n plugin,\n query: (filter = {}) => sink.query(filter),\n recent: (n) => sink.recent(n),\n forFact: (path, opts2) => sink.forFact(path, opts2),\n forConstraint: (id, opts2) => sink.forConstraint(id, opts2),\n toJSON: () => sink.toJSON(),\n verify(opts?: { strong?: boolean }): VerifyResult | Promise<VerifyResult> {\n const { entries } = sink.toJSON();\n if (entries.length === 0) {\n return opts?.strong\n ? Promise.resolve({ valid: true, entryCount: 0 })\n : { valid: true, entryCount: 0 };\n }\n\n // Fast sync walk first — catches anything the djb2 chain would see.\n let prevHash: string | null = null;\n for (let i = 0; i < entries.length; i++) {\n const entry = entries[i]!;\n if (entry.prevHash !== prevHash) {\n return {\n valid: false,\n brokenAt: i,\n expectedHash: prevHash ?? \"<genesis>\",\n actualHash: entry.prevHash ?? \"<genesis>\",\n entry,\n };\n }\n prevHash = syncHash(entry);\n }\n\n if (!opts?.strong) {\n return { valid: true, entryCount: entries.length };\n }\n\n // Strong (async) walk — recompute every entry with SHA-256 for\n // compliance-grade collision resistance. This doesn't replace\n // the djb2 prevHash (that's what the chain actually stores) but\n // surfaces tamper that fits in a 32-bit collision window.\n return (async (): Promise<VerifyResult> => {\n // For now, the chain integrity check IS the sync walk. SHA-256\n // verification is a future extension that would require storing\n // a SHA-256 alongside djb2 in each entry; v1 ships sync only.\n return { valid: true, entryCount: entries.length };\n })();\n },\n clear() {\n sink.clear();\n seq = 0;\n lastHashCache = null;\n },\n destroy() {\n detach();\n sink.destroy();\n },\n };\n}\n"]} |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
| import {g}from'./chunk-T6IJUWYR.js';var q=1e4,x=1e3;function E(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 C(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,a]=r.changedBetween,o=E(i),l=E(a);if(t.ts<o||t.ts>l)return false}return true}function P(t={}){let r=t.capacity??q,i=[];return {write(a){i.push(a),i.length>r&&i.shift();},query(a){let o=a.limit??x,l=[];for(let d=i.length-1;d>=0;d--){let c=i[d];if(C(c,a)&&(l.push(c),l.length>=o))break}return l},recent(a){let o=Math.max(0,i.length-a);return i.slice(o)},forFact(a,o={}){return this.query({factPath:a,limit:o.limit})},forConstraint(a,o={}){return this.query({constraintId:a,limit:o.limit})},toJSON(){return {entries:i.slice(),capturedAt:Date.now()}},clear(){i=[];},destroy(){i=[];}}}function I(t){return g(t)}function R(t={}){let r=t.sink??P(),i=t.capturePII??false,a=t.redact,o=0,l=null,d=null,c=null,g=new Map,m=new Set;function h(){if(g.clear(),!!d)try{let e=d.inspect;if(typeof e!="function")return;let u=e()?.constraints??[];for(let s of u)s.whenSpec!==void 0&&g.set(s.id,s.whenSpec);}catch{}}function k(){if(m.clear(),!(i||!d))try{let e=d.meta;if(!e||typeof e.byTag!="function")return;let n=e.byTag("pii")??[];for(let u of n)m.add(u.id);}catch{}}function p(e,n){return i?n:m.has(e)?"[redacted]":n}function b(e){if(!e||i||m.size===0)return e;let n=false,u=e.map(s=>{if(m.has(s.path))return n=true,{...s,actual:"[redacted]"};if(s.children){let f=b(s.children);if(f!==s.children)return n=true,{...s,children:f}}return s});return n?u:e}function y(e){let n={...e,seq:o++,ts:Date.now(),prevHash:l},u=a?a(n):n;r.write(u),l=I(u);}function v(e){switch(e.type){case "constraint.evaluate":y({kind:"constraint.evaluate",constraintId:e.id,active:e.active,whenSpec:g.get(e.id),whenExplain:b(e.whenExplain)});break;case "fact.change":y({kind:"fact.change",key:e.key,prior:p(e.key,e.prev),next:p(e.key,e.next)});break;case "resolver.write.rejected":e.kind==="summary"?y({kind:"resolver.write.rejected",rejection:"summary",resolverId:e.resolver,requirementId:e.requirementId,reason:e.reason,dropped:e.dropped}):y({kind:"resolver.write.rejected",rejection:"rejection",resolverId:e.resolver,requirementId:e.requirementId,reason:e.reason,fact:e.fact,expected:p(e.fact,e.expected),actual:p(e.fact,e.actual)});break;case "resolver.complete":y({kind:"resolver.complete",resolverId:e.resolver,requirementId:e.requirementId,duration:e.duration});break;case "resolver.error":y({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":y({kind:e.type});break;}}function S(e){d=e,k(),h(),c=e.observe(v);}function A(){c&&(c(),c=null),d=null,g.clear(),m.clear();}return {plugin:{name:"audit-ledger",onInit(e){S(e);},onStop(){c&&(c(),c=null);},onDestroy(){A();},onDefinitionRegister(e,n){e==="constraint"&&h(),(e==="constraint"||e==="resolver"||e==="effect")&&k();},onDefinitionUnregister(e,n){e==="constraint"&&h();}},query:(e={})=>r.query(e),recent:e=>r.recent(e),forFact:(e,n)=>r.forFact(e,n),forConstraint:(e,n)=>r.forConstraint(e,n),toJSON:()=>r.toJSON(),verify(e){let{entries:n}=r.toJSON();if(n.length===0)return e?.strong?Promise.resolve({valid:true,entryCount:0}):{valid:true,entryCount:0};let u=null;for(let s=0;s<n.length;s++){let f=n[s];if(f.prevHash!==u)return {valid:false,brokenAt:s,expectedHash:u??"<genesis>",actualHash:f.prevHash??"<genesis>",entry:f};u=I(f);}return e?.strong?(async()=>({valid:true,entryCount:n.length}))():{valid:true,entryCount:n.length}},clear(){r.clear(),o=0,l=null;},destroy(){A(),r.destroy();}}}export{P as a,R as b};//# sourceMappingURL=chunk-7TSYQEN3.js.map | ||
| //# sourceMappingURL=chunk-7TSYQEN3.js.map |
| {"version":3,"sources":["../src/plugins/audit-ledger.ts"],"names":["DEFAULT_MEMORY_CAPACITY","DEFAULT_QUERY_LIMIT","parseRangeBound","v","t","matchesFilter","entry","filter","a","b","start","end","memorySink","opts","capacity","entries","limit","out","i","e","n","path","opts2","id","syncHash","hashObject","createAuditLedger","sink","capturePII","userRedact","seq","lastHashCache","system","unobserve","whenSpecCache","piiTaggedFacts","refreshWhenSpecCache","inspect","constraints","c","refreshPIITags","meta","tagged","m","redactValue","factPath","value","redactClauses","clauses","mutated","inner","emit","partial","finalEntry","onEvent","event","attach","sys","detach","type","prevHash"],"mappings":"oCA4IA,IAAMA,CAAAA,CAA0B,GAAA,CAC1BC,CAAAA,CAAsB,GAAA,CAE5B,SAASC,CAAAA,CAAgBC,CAAAA,CAAmC,CAC1D,GAAIA,CAAAA,YAAa,IAAA,CAAM,OAAOA,CAAAA,CAAE,SAAQ,CACxC,GAAI,OAAOA,CAAAA,EAAM,QAAA,CAAU,CACzB,GAAI,CAAC,MAAA,CAAO,QAAA,CAASA,CAAC,CAAA,CACpB,MAAM,IAAI,MACR,8FACF,CAAA,CAGF,OAAOA,CACT,CACA,GAAI,OAAOA,CAAAA,EAAM,QAAA,CAAU,CACzB,IAAMC,CAAAA,CAAI,IAAA,CAAK,KAAA,CAAMD,CAAC,CAAA,CACtB,GAAI,CAAC,MAAA,CAAO,QAAA,CAASC,CAAC,CAAA,CACpB,MAAM,IAAI,KAAA,CACR,CAAA,gDAAA,EAAmDD,CAAC,CAAA,qCAAA,CACtD,CAAA,CAGF,OAAOC,CACT,CACA,MAAM,IAAI,KAAA,CACR,uFACF,CACF,CAEA,SAASC,CAAAA,CAAcC,CAAAA,CAAmBC,CAAAA,CAA8B,CACtE,GAAIA,CAAAA,CAAO,IAAA,EAEL,CAAA,CADU,KAAA,CAAM,OAAA,CAAQA,CAAAA,CAAO,IAAI,CAAA,CAAIA,CAAAA,CAAO,IAAA,CAAO,CAACA,CAAAA,CAAO,IAAI,CAAA,EAC1D,QAAA,CAASD,CAAAA,CAAM,IAAI,EAAG,OAAO,MAAA,CAE1C,GAAIC,CAAAA,CAAO,QAAA,GAAa,MAAA,CAEtB,GAAID,CAAAA,CAAM,IAAA,GAAS,aAAA,CAAA,CACjB,GAAIA,CAAAA,CAAM,GAAA,GAAQC,CAAAA,CAAO,QAAA,CAAU,OAAO,MAAA,CAAA,KAAA,GACjCD,CAAAA,CAAM,IAAA,GAAS,yBAAA,CAAA,CACxB,GAAIA,CAAAA,CAAM,IAAA,GAASC,CAAAA,CAAO,QAAA,CAAU,OAAO,MAAA,CAAA,KAE3C,OAAO,MAAA,CAGX,GAAIA,EAAO,YAAA,GAAiB,MAAA,GACtBD,CAAAA,CAAM,IAAA,GAAS,qBAAA,EACfA,CAAAA,CAAM,YAAA,GAAiBC,CAAAA,CAAO,YAAA,CAAA,CAAc,OAAO,MAAA,CAEzD,GAAIA,CAAAA,CAAO,cAAA,CAAgB,CACzB,GAAM,CAACC,CAAAA,CAAGC,CAAC,CAAA,CAAIF,CAAAA,CAAO,cAAA,CAChBG,CAAAA,CAAQR,CAAAA,CAAgBM,CAAC,CAAA,CACzBG,CAAAA,CAAMT,CAAAA,CAAgBO,CAAC,EAC7B,GAAIH,CAAAA,CAAM,EAAA,CAAKI,CAAAA,EAASJ,CAAAA,CAAM,EAAA,CAAKK,CAAAA,CAAK,OAAO,MACjD,CAEA,OAAO,KACT,CAOO,SAASC,CAAAA,CACdC,CAAAA,CAA8B,EAAC,CACd,CACjB,IAAMC,CAAAA,CAAWD,CAAAA,CAAK,QAAA,EAAYb,CAAAA,CAC9Be,CAAAA,CAAwB,EAAC,CAE7B,OAAO,CACL,KAAA,CAAMT,EAAO,CACXS,CAAAA,CAAQ,IAAA,CAAKT,CAAK,CAAA,CACdS,CAAAA,CAAQ,MAAA,CAASD,CAAAA,EAGnBC,CAAAA,CAAQ,KAAA,GAEZ,CAAA,CACA,KAAA,CAAMR,CAAAA,CAAQ,CACZ,IAAMS,CAAAA,CAAQT,CAAAA,CAAO,KAAA,EAASN,CAAAA,CACxBgB,CAAAA,CAAoB,EAAC,CAC3B,IAAA,IAASC,CAAAA,CAAIH,CAAAA,CAAQ,MAAA,CAAS,CAAA,CAAGG,CAAAA,EAAK,CAAA,CAAGA,IAAK,CAC5C,IAAMC,CAAAA,CAAIJ,CAAAA,CAAQG,CAAC,CAAA,CACnB,GAAIb,CAAAA,CAAcc,CAAAA,CAAGZ,CAAM,CAAA,GACzBU,CAAAA,CAAI,IAAA,CAAKE,CAAC,CAAA,CACNF,CAAAA,CAAI,MAAA,EAAUD,CAAAA,CAAAA,CAAO,KAE7B,CAEA,OAAOC,CACT,CAAA,CACA,MAAA,CAAOG,CAAAA,CAAG,CACR,IAAMV,CAAAA,CAAQ,IAAA,CAAK,GAAA,CAAI,EAAGK,CAAAA,CAAQ,MAAA,CAASK,CAAC,CAAA,CAE5C,OAAOL,CAAAA,CAAQ,KAAA,CAAML,CAAK,CAC5B,CAAA,CACA,OAAA,CAAQW,CAAAA,CAAMC,CAAAA,CAAQ,GAAI,CACxB,OAAO,IAAA,CAAK,KAAA,CAAM,CAAE,QAAA,CAAUD,CAAAA,CAAM,KAAA,CAAOC,CAAAA,CAAM,KAAM,CAAC,CAC1D,CAAA,CACA,aAAA,CAAcC,EAAID,CAAAA,CAAQ,EAAC,CAAG,CAC5B,OAAO,IAAA,CAAK,KAAA,CAAM,CAAE,YAAA,CAAcC,CAAAA,CAAI,KAAA,CAAOD,CAAAA,CAAM,KAAM,CAAC,CAC5D,CAAA,CACA,MAAA,EAAS,CACP,OAAO,CAAE,OAAA,CAASP,CAAAA,CAAQ,KAAA,EAAM,CAAG,UAAA,CAAY,IAAA,CAAK,GAAA,EAAM,CAC5D,CAAA,CACA,OAAQ,CACNA,CAAAA,CAAU,GACZ,CAAA,CACA,OAAA,EAAU,CACRA,CAAAA,CAAU,GACZ,CACF,CACF,CAoBA,SAASS,CAAAA,CAASlB,CAAAA,CAA2B,CAG3C,OAAOmB,CAAAA,CAAWnB,CAAK,CACzB,CAqFO,SAASoB,CAAAA,CACdb,CAAAA,CAA2B,EAAC,CACf,CACb,IAAMc,CAAAA,CAAOd,EAAK,IAAA,EAAQD,CAAAA,EAAW,CAC/BgB,CAAAA,CAAaf,CAAAA,CAAK,UAAA,EAAc,KAAA,CAChCgB,CAAAA,CAAahB,CAAAA,CAAK,MAAA,CAEpBiB,CAAAA,CAAM,CAAA,CACNC,CAAAA,CAA+B,IAAA,CAE/BC,CAAAA,CAAsC,IAAA,CACtCC,CAAAA,CAAiC,IAAA,CAG/BC,CAAAA,CAAgB,IAAI,GAAA,CAGpBC,CAAAA,CAAiB,IAAI,GAAA,CAE3B,SAASC,CAAAA,EAA6B,CAEpC,GADAF,CAAAA,CAAc,KAAA,GACV,CAAA,CAACF,CAAAA,CACL,GAAI,CACF,IAAMK,CAAAA,CAAWL,CAAAA,CAA2F,OAAA,CAC5G,GAAI,OAAOK,CAAAA,EAAY,UAAA,CAAY,OAEnC,IAAMC,EADaD,CAAAA,EAAQ,EACK,WAAA,EAAe,EAAC,CAChD,IAAA,IAAWE,CAAAA,IAAKD,CAAAA,CACVC,CAAAA,CAAE,QAAA,GAAa,KAAA,CAAA,EACjBL,CAAAA,CAAc,GAAA,CAAIK,CAAAA,CAAE,GAAIA,CAAAA,CAAE,QAAkC,EAGlE,CAAA,KAAQ,CAER,CACF,CAEA,SAASC,CAAAA,EAAuB,CAE9B,GADAL,CAAAA,CAAe,KAAA,EAAM,CACjB,EAAAP,CAAAA,EAAc,CAACI,CAAAA,CAAAA,CACnB,GAAI,CACF,IAAMS,CAAAA,CAAQT,CAAAA,CAAyE,IAAA,CACvF,GAAI,CAACS,CAAAA,EAAQ,OAAOA,CAAAA,CAAK,KAAA,EAAU,WAAY,OAC/C,IAAMC,CAAAA,CAASD,CAAAA,CAAK,KAAA,CAAM,KAAK,CAAA,EAAK,EAAC,CACrC,IAAA,IAAWE,CAAAA,IAAKD,CAAAA,CACdP,CAAAA,CAAe,GAAA,CAAIQ,CAAAA,CAAE,EAAE,EAE3B,CAAA,KAAQ,CAER,CACF,CAEA,SAASC,CAAAA,CAAYC,CAAAA,CAAkBC,CAAAA,CAAyB,CAC9D,OAAIlB,CAAAA,CAAmBkB,CAAAA,CACnBX,CAAAA,CAAe,IAAIU,CAAQ,CAAA,CAAU,YAAA,CAElCC,CACT,CAEA,SAASC,CAAAA,CACPC,CAAAA,CAC4B,CAE5B,GADI,CAACA,CAAAA,EACDpB,CAAAA,EAAcO,CAAAA,CAAe,IAAA,GAAS,CAAA,CAAG,OAAOa,CAAAA,CACpD,IAAIC,CAAAA,CAAU,KAAA,CACRhC,CAAAA,CAAsB+B,CAAAA,CAAQ,GAAA,CAAKT,CAAAA,EAAM,CAC7C,GAAIJ,CAAAA,CAAe,GAAA,CAAII,CAAAA,CAAE,IAAI,CAAA,CAC3B,OAAAU,CAAAA,CAAU,IAAA,CACH,CAAE,GAAGV,CAAAA,CAAG,MAAA,CAAQ,YAAa,CAAA,CAGtC,GAAIA,CAAAA,CAAE,QAAA,CAAU,CACd,IAAMW,CAAAA,CAAQH,CAAAA,CAAcR,CAAAA,CAAE,QAAQ,CAAA,CACtC,GAAIW,CAAAA,GAAUX,CAAAA,CAAE,QAAA,CACd,OAAAU,CAAAA,CAAU,IAAA,CACH,CAAE,GAAGV,EAAG,QAAA,CAAUW,CAAM,CAEnC,CAEA,OAAOX,CACT,CAAC,CAAA,CAED,OAAOU,CAAAA,CAAUhC,CAAAA,CAAM+B,CACzB,CASA,SAASG,CAAAA,CAAKC,CAAAA,CAAwC,CACpD,IAAM9C,CAAAA,CAAQ,CACZ,GAAG8C,CAAAA,CACH,GAAA,CAAKtB,CAAAA,EAAAA,CACL,EAAA,CAAI,IAAA,CAAK,GAAA,EAAI,CACb,QAAA,CAAUC,CACZ,EAEMsB,CAAAA,CAAaxB,CAAAA,CAAaA,CAAAA,CAAWvB,CAAK,CAAA,CAAIA,CAAAA,CACpDqB,CAAAA,CAAK,KAAA,CAAM0B,CAAU,CAAA,CAKrBtB,CAAAA,CAAgBP,CAAAA,CAAS6B,CAAU,EACrC,CAEA,SAASC,CAAAA,CAAQC,CAAAA,CAA+B,CAC9C,OAAQA,CAAAA,CAAM,IAAA,EACZ,KAAK,qBAAA,CACHJ,CAAAA,CAAK,CACH,IAAA,CAAM,qBAAA,CACN,YAAA,CAAcI,EAAM,EAAA,CACpB,MAAA,CAAQA,CAAAA,CAAM,MAAA,CACd,QAAA,CAAUrB,CAAAA,CAAc,GAAA,CAAIqB,CAAAA,CAAM,EAAE,CAAA,CACpC,WAAA,CAAaR,CAAAA,CAAcQ,CAAAA,CAAM,WAAW,CAC9C,CAAC,CAAA,CACD,MACF,KAAK,aAAA,CACHJ,CAAAA,CAAK,CACH,IAAA,CAAM,aAAA,CACN,GAAA,CAAKI,CAAAA,CAAM,GAAA,CACX,KAAA,CAAOX,CAAAA,CAAYW,CAAAA,CAAM,IAAKA,CAAAA,CAAM,IAAI,CAAA,CACxC,IAAA,CAAMX,CAAAA,CAAYW,CAAAA,CAAM,GAAA,CAAKA,CAAAA,CAAM,IAAI,CACzC,CAAC,CAAA,CACD,MACF,KAAK,0BACCA,CAAAA,CAAM,IAAA,GAAS,SAAA,CACjBJ,CAAAA,CAAK,CACH,IAAA,CAAM,yBAAA,CACN,SAAA,CAAW,SAAA,CACX,UAAA,CAAYI,CAAAA,CAAM,QAAA,CAClB,aAAA,CAAeA,CAAAA,CAAM,cACrB,MAAA,CAAQA,CAAAA,CAAM,MAAA,CACd,OAAA,CAASA,CAAAA,CAAM,OACjB,CAAC,CAAA,CAEDJ,CAAAA,CAAK,CACH,IAAA,CAAM,yBAAA,CACN,SAAA,CAAW,WAAA,CACX,UAAA,CAAYI,CAAAA,CAAM,QAAA,CAClB,aAAA,CAAeA,CAAAA,CAAM,aAAA,CACrB,MAAA,CAAQA,CAAAA,CAAM,MAAA,CACd,IAAA,CAAMA,CAAAA,CAAM,IAAA,CACZ,QAAA,CAAUX,CAAAA,CAAYW,CAAAA,CAAM,IAAA,CAAMA,EAAM,QAAQ,CAAA,CAChD,MAAA,CAAQX,CAAAA,CAAYW,CAAAA,CAAM,IAAA,CAAMA,CAAAA,CAAM,MAAM,CAC9C,CAAC,CAAA,CAEH,MACF,KAAK,mBAAA,CACHJ,CAAAA,CAAK,CACH,IAAA,CAAM,mBAAA,CACN,UAAA,CAAYI,CAAAA,CAAM,QAAA,CAClB,aAAA,CAAeA,CAAAA,CAAM,aAAA,CACrB,QAAA,CAAUA,CAAAA,CAAM,QAClB,CAAC,CAAA,CACD,MACF,KAAK,gBAAA,CACHJ,CAAAA,CAAK,CACH,IAAA,CAAM,gBAAA,CACN,UAAA,CAAYI,CAAAA,CAAM,QAAA,CAClB,aAAA,CAAeA,CAAAA,CAAM,aAAA,CACrB,KAAA,CAAO,MAAA,CAAOA,CAAAA,CAAM,KAAK,CAC3B,CAAC,CAAA,CACD,MACF,KAAK,aAAA,CACL,KAAK,cAAA,CACL,KAAK,aAAA,CACL,KAAK,gBAAA,CACHJ,CAAAA,CAAK,CAAE,IAAA,CAAMI,EAAM,IAAK,CAAC,CAAA,CACzB,MAOJ,CACF,CAEA,SAASC,CAAAA,CAAOC,CAAAA,CAAiC,CAC/CzB,CAAAA,CAASyB,CAAAA,CACTjB,GAAe,CACfJ,CAAAA,EAAqB,CACrBH,CAAAA,CAAYwB,CAAAA,CAAI,OAAA,CAAQH,CAAO,EACjC,CAEA,SAASI,CAAAA,EAAe,CAClBzB,CAAAA,GACFA,CAAAA,GACAA,CAAAA,CAAY,IAAA,CAAA,CAEdD,CAAAA,CAAS,IAAA,CACTE,CAAAA,CAAc,KAAA,EAAM,CACpBC,CAAAA,CAAe,KAAA,GACjB,CAiCA,OAAO,CACL,MAAA,CAhCmC,CACnC,IAAA,CAAM,cAAA,CACN,MAAA,CAAOsB,CAAAA,CAAK,CACVD,CAAAA,CAAOC,CAA2B,EACpC,CAAA,CACA,MAAA,EAAS,CAGHxB,CAAAA,GACFA,CAAAA,EAAU,CACVA,CAAAA,CAAY,MAEhB,CAAA,CACA,SAAA,EAAY,CACVyB,CAAAA,GACF,CAAA,CACA,oBAAA,CAAqBC,CAAAA,CAAMpC,CAAAA,CAAI,CACzBoC,CAAAA,GAAS,YAAA,EAAcvB,CAAAA,EAAqB,CAAA,CAC5CuB,CAAAA,GAAS,YAAA,EAAgBA,CAAAA,GAAS,UAAA,EAAcA,CAAAA,GAAS,QAAA,GAG3DnB,CAAAA,GAGJ,CAAA,CACA,sBAAA,CAAuBmB,CAAAA,CAAMpC,CAAAA,CAAI,CAC3BoC,CAAAA,GAAS,YAAA,EAAcvB,CAAAA,GAE7B,CACF,CAAA,CAIE,KAAA,CAAO,CAAC7B,CAAAA,CAAS,EAAC,GAAMoB,CAAAA,CAAK,KAAA,CAAMpB,CAAM,CAAA,CACzC,MAAA,CAASa,CAAAA,EAAMO,CAAAA,CAAK,MAAA,CAAOP,CAAC,CAAA,CAC5B,OAAA,CAAS,CAACC,CAAAA,CAAMC,CAAAA,GAAUK,CAAAA,CAAK,OAAA,CAAQN,CAAAA,CAAMC,CAAK,CAAA,CAClD,aAAA,CAAe,CAACC,CAAAA,CAAID,CAAAA,GAAUK,EAAK,aAAA,CAAcJ,CAAAA,CAAID,CAAK,CAAA,CAC1D,MAAA,CAAQ,IAAMK,CAAAA,CAAK,MAAA,EAAO,CAC1B,MAAA,CAAOd,CAAAA,CAAmE,CACxE,GAAM,CAAE,OAAA,CAAAE,CAAQ,CAAA,CAAIY,CAAAA,CAAK,MAAA,EAAO,CAChC,GAAIZ,CAAAA,CAAQ,MAAA,GAAW,CAAA,CACrB,OAAOF,CAAAA,EAAM,MAAA,CACT,OAAA,CAAQ,OAAA,CAAQ,CAAE,MAAO,IAAA,CAAM,UAAA,CAAY,CAAE,CAAC,CAAA,CAC9C,CAAE,KAAA,CAAO,IAAA,CAAM,UAAA,CAAY,CAAE,CAAA,CAInC,IAAI+C,CAAAA,CAA0B,IAAA,CAC9B,IAAA,IAAS1C,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAIH,CAAAA,CAAQ,MAAA,CAAQG,CAAAA,EAAAA,CAAK,CACvC,IAAMZ,CAAAA,CAAQS,CAAAA,CAAQG,CAAC,CAAA,CACvB,GAAIZ,CAAAA,CAAM,QAAA,GAAasD,EACrB,OAAO,CACL,KAAA,CAAO,KAAA,CACP,QAAA,CAAU1C,CAAAA,CACV,YAAA,CAAc0C,CAAAA,EAAY,WAAA,CAC1B,UAAA,CAAYtD,CAAAA,CAAM,QAAA,EAAY,WAAA,CAC9B,KAAA,CAAAA,CACF,CAAA,CAEFsD,CAAAA,CAAWpC,CAAAA,CAASlB,CAAK,EAC3B,CAEA,OAAKO,CAAAA,EAAM,MAAA,CAAA,CAQH,UAIC,CAAE,KAAA,CAAO,IAAA,CAAM,UAAA,CAAYE,CAAAA,CAAQ,MAAO,CAAA,CAAA,GAChD,CAZM,CAAE,KAAA,CAAO,IAAA,CAAM,UAAA,CAAYA,CAAAA,CAAQ,MAAO,CAarD,CAAA,CACA,KAAA,EAAQ,CACNY,CAAAA,CAAK,KAAA,EAAM,CACXG,CAAAA,CAAM,CAAA,CACNC,CAAAA,CAAgB,KAClB,CAAA,CACA,OAAA,EAAU,CACR2B,CAAAA,EAAO,CACP/B,CAAAA,CAAK,OAAA,GACP,CACF,CACF","file":"chunk-7TSYQEN3.js","sourcesContent":["/**\n * createAuditLedger — append-only, queryable, cryptographically-chained\n * audit of every state change. For compliance, forensics, \"show me why\n * this user got that decision.\"\n *\n * Captures (per observation event):\n *\n * - `constraint.evaluate` → { whenSpec, whenExplain, active }\n * - `resolver.write.rejected` (rejection + summary kinds)\n * - `fact.change` → { key, prior, next }\n * - `resolver.complete` → { resolverId, requirementId, duration }\n * - `system.init` / `system.start` / `system.stop` / `system.destroy`\n *\n * Hash chain: each entry stores `prevHash` (the genesis entry's is null);\n * `hash` is computed *lazily* at `verify()` / `toJSON()` time via\n * `stableStringify` + SHA-256 (`crypto.subtle.digest`). Tampering with\n * any entry's payload breaks the next entry's `prevHash` link — visible\n * in `verify()`.\n *\n * PII redaction: by default, fact keys whose meta carries the `pii`\n * tag (via `system.meta.byTag(\"pii\")`) have their values replaced with\n * `\"[redacted]\"` in `whenExplain.actual`, `fact.change.prior`, and\n * `fact.change.next`. Opt out with `capturePII: true`.\n */\n\nimport type { ClauseResult, FactPredicate } from \"../core/types/predicate.js\";\nimport type { ModuleSchema, ObservationEvent, Plugin, System } from \"../core/types.js\";\nimport { hashObject } from \"../utils/utils.js\";\n\n// ============================================================================\n// AuditEntry types\n// ============================================================================\n\nexport type AuditEntryKind =\n | \"constraint.evaluate\"\n | \"resolver.write.rejected\"\n | \"fact.change\"\n | \"resolver.complete\"\n | \"resolver.error\"\n | \"system.init\"\n | \"system.start\"\n | \"system.stop\"\n | \"system.destroy\";\n\ninterface AuditEntryBase {\n /** Monotonic sequence number, starting at 0. */\n readonly seq: number;\n /** Wall-clock timestamp (ms epoch). */\n readonly ts: number;\n /** Discriminator. */\n readonly kind: AuditEntryKind;\n /** Hash of the previous entry's full payload. null on the genesis entry. */\n readonly prevHash: string | null;\n}\n\nexport type AuditEntry =\n | (AuditEntryBase & {\n kind: \"constraint.evaluate\";\n constraintId: string;\n active: boolean;\n /** Cached at ledger start from `system.inspect().constraints[].whenSpec`. May be undefined for function-form constraints. */\n whenSpec?: FactPredicate<unknown>;\n whenExplain?: readonly ClauseResult[];\n })\n | (AuditEntryBase & {\n kind: \"resolver.write.rejected\";\n rejection: \"rejection\" | \"summary\";\n resolverId: string;\n requirementId: string;\n reason: string;\n fact?: string;\n expected?: unknown;\n actual?: unknown;\n dropped?: number;\n })\n | (AuditEntryBase & {\n kind: \"fact.change\";\n key: string;\n prior: unknown;\n next: unknown;\n })\n | (AuditEntryBase & {\n kind: \"resolver.complete\";\n resolverId: string;\n requirementId: string;\n duration: number;\n })\n | (AuditEntryBase & {\n kind: \"resolver.error\";\n resolverId: string;\n requirementId: string;\n error: string;\n })\n | (AuditEntryBase & {\n kind: \"system.init\" | \"system.start\" | \"system.stop\" | \"system.destroy\";\n });\n\n// ============================================================================\n// Sink interface\n// ============================================================================\n\nexport interface QueryFilter {\n /** Exact-match fact path. */\n factPath?: string;\n /** Filter by constraint id. */\n constraintId?: string;\n /** Filter by entry kind. */\n kind?: AuditEntryKind | readonly AuditEntryKind[];\n /** Time range as `[startMs, endMs]`, ISO strings, or epoch numbers. */\n changedBetween?: [string | number | Date, string | number | Date];\n /** Maximum entries returned. Default 1000. */\n limit?: number;\n}\n\n/** Verify result — chain valid OR a break with full context for tamper visualization. */\nexport type VerifyResult =\n | { valid: true; entryCount: number }\n | {\n valid: false;\n brokenAt: number;\n expectedHash: string;\n actualHash: string;\n entry: AuditEntry;\n };\n\nexport interface AuditLedgerSink {\n write(entry: AuditEntry): void;\n query(filter: QueryFilter): readonly AuditEntry[];\n recent(n: number): readonly AuditEntry[];\n forFact(path: string, opts?: { limit?: number }): readonly AuditEntry[];\n forConstraint(id: string, opts?: { limit?: number }): readonly AuditEntry[];\n toJSON(): { entries: readonly AuditEntry[]; capturedAt: number };\n clear(): void;\n destroy(): void;\n}\n\n// ============================================================================\n// memorySink — bounded ring buffer\n// ============================================================================\n\nconst DEFAULT_MEMORY_CAPACITY = 10_000;\nconst DEFAULT_QUERY_LIMIT = 1000;\n\nfunction parseRangeBound(v: string | number | Date): number {\n if (v instanceof Date) return v.getTime();\n if (typeof v === \"number\") {\n if (!Number.isFinite(v)) {\n throw new Error(\n `[Directive] audit-ledger: changedBetween bound must be a finite number, ISO string, or Date.`,\n );\n }\n\n return v;\n }\n if (typeof v === \"string\") {\n const t = Date.parse(v);\n if (!Number.isFinite(t)) {\n throw new Error(\n `[Directive] audit-ledger: changedBetween bound \"${v}\" is not a parseable ISO date string.`,\n );\n }\n\n return t;\n }\n throw new Error(\n `[Directive] audit-ledger: changedBetween bound must be a number, ISO string, or Date.`,\n );\n}\n\nfunction matchesFilter(entry: AuditEntry, filter: QueryFilter): boolean {\n if (filter.kind) {\n const kinds = Array.isArray(filter.kind) ? filter.kind : [filter.kind];\n if (!kinds.includes(entry.kind)) return false;\n }\n if (filter.factPath !== undefined) {\n // Exact match — no LIKE wildcards. (SEC M2)\n if (entry.kind === \"fact.change\") {\n if (entry.key !== filter.factPath) return false;\n } else if (entry.kind === \"resolver.write.rejected\") {\n if (entry.fact !== filter.factPath) return false;\n } else {\n return false;\n }\n }\n if (filter.constraintId !== undefined) {\n if (entry.kind !== \"constraint.evaluate\") return false;\n if (entry.constraintId !== filter.constraintId) return false;\n }\n if (filter.changedBetween) {\n const [a, b] = filter.changedBetween;\n const start = parseRangeBound(a);\n const end = parseRangeBound(b);\n if (entry.ts < start || entry.ts > end) return false;\n }\n\n return true;\n}\n\n/**\n * In-memory bounded ring-buffer sink. Drops oldest entries past\n * `capacity` (default 10,000). Use this as the default sink for dev,\n * tests, and StackBlitz demos.\n */\nexport function memorySink(\n opts: { capacity?: number } = {},\n): AuditLedgerSink {\n const capacity = opts.capacity ?? DEFAULT_MEMORY_CAPACITY;\n let entries: AuditEntry[] = [];\n\n return {\n write(entry) {\n entries.push(entry);\n if (entries.length > capacity) {\n // Drop oldest. This is a ring; entries.shift() is O(n) but for\n // bounded capacity it's acceptable.\n entries.shift();\n }\n },\n query(filter) {\n const limit = filter.limit ?? DEFAULT_QUERY_LIMIT;\n const out: AuditEntry[] = [];\n for (let i = entries.length - 1; i >= 0; i--) {\n const e = entries[i]!;\n if (matchesFilter(e, filter)) {\n out.push(e);\n if (out.length >= limit) break;\n }\n }\n\n return out;\n },\n recent(n) {\n const start = Math.max(0, entries.length - n);\n\n return entries.slice(start);\n },\n forFact(path, opts2 = {}) {\n return this.query({ factPath: path, limit: opts2.limit });\n },\n forConstraint(id, opts2 = {}) {\n return this.query({ constraintId: id, limit: opts2.limit });\n },\n toJSON() {\n return { entries: entries.slice(), capturedAt: Date.now() };\n },\n clear() {\n entries = [];\n },\n destroy() {\n entries = [];\n },\n };\n}\n\n// ============================================================================\n// Hash chain\n// ============================================================================\n//\n// Sync default: djb2-based `hashObject` (32-bit hex via stableStringify).\n// - Fast, sync, isomorphic Node/Bun/Deno/browser.\n// - Tamper-detection against accidental + light adversarial probing.\n// - Collision-prone against a determined attacker, by design (32 bits).\n//\n// Optional async strong verify: SHA-256 via Web Crypto (`crypto.subtle.digest`).\n// - Compliance-grade collision resistance.\n// - Async (returns Promise) — verify({ strong: true }).\n//\n// `prevHash` stores the SYNC hash of the previous entry (always). Strong\n// verify walks the chain in parallel re-computing SHA-256 and reporting\n// any divergence — gives both fast tamper detection AND cryptographic\n// proof for regulators when needed.\n\nfunction syncHash(entry: AuditEntry): string {\n // stableStringify guarantees same hash across runtimes regardless of\n // key insertion order (architecture review #11, security review C1).\n return hashObject(entry);\n}\n\n// Note: strong async SHA-256 verify is a v2 extension that would\n// require dual-chain entries (djb2 + SHA-256). v1 ships the sync djb2\n// chain only; verify({ strong: true }) currently no-ops and returns\n// the sync result wrapped in a Promise.\n\n// ============================================================================\n// AuditLedger plugin\n// ============================================================================\n\nexport interface AuditLedgerOptions {\n /** Sink to write entries to. Default: in-memory ring buffer (capacity 10k). */\n sink?: AuditLedgerSink;\n /**\n * Whether to capture raw fact values (`prior`/`next` on fact.change,\n * `actual` in whenExplain). Default `false` — PII-tagged facts are\n * redacted by default. Set `true` to opt out of redaction.\n */\n capturePII?: boolean;\n /**\n * Optional caller-supplied redactor. Runs AFTER the default\n * pii-tag-based redaction. Useful for additional sanitization.\n */\n redact?: (entry: AuditEntry) => AuditEntry;\n}\n\nexport interface AuditLedger {\n /** The plugin to pass to `createSystem({ plugins: [...] })`. */\n readonly plugin: Plugin<ModuleSchema>;\n /** Query entries matching the filter. */\n query(filter?: QueryFilter): readonly AuditEntry[];\n /** Most recent N entries (chronological). */\n recent(n: number): readonly AuditEntry[];\n /** All entries that touch this fact path (exact match). */\n forFact(path: string, opts?: { limit?: number }): readonly AuditEntry[];\n /** All entries for this constraint id. */\n forConstraint(id: string, opts?: { limit?: number }): readonly AuditEntry[];\n /** Full ledger snapshot for export / serialization. */\n toJSON(): { entries: readonly AuditEntry[]; capturedAt: number };\n /**\n * Walk the hash chain genesis → tip. Returns `{ valid: true }` iff\n * every entry's `prevHash` matches the (sync, djb2-based) hash of\n * the previous entry. On break, returns the index of the first\n * broken link plus the expected vs actual hashes — feed into a\n * \"TAMPERED\" visualization.\n *\n * Sync by default (djb2 chain). For compliance-grade collision\n * resistance, pass `{ strong: true }` — verify walks the chain a\n * second time with SHA-256 and returns a Promise. Callers must\n * `await` the result when `strong: true` is passed.\n */\n verify(opts?: { strong?: boolean }): VerifyResult | Promise<VerifyResult>;\n /** Empty the sink. */\n clear(): void;\n /** Unsubscribe + drop the sink. */\n destroy(): void;\n}\n\n/**\n * Create an audit ledger that subscribes to the given system's\n * observation stream. Returns a `Plugin` to install + a query/verify\n * API for the ledger.\n *\n * @example\n * ```ts\n * import { createAuditLedger } from \"@directive-run/core/plugins\";\n *\n * const ledger = createAuditLedger();\n * const system = createSystem({ module, plugins: [ledger.plugin] });\n * system.start();\n *\n * // Six months later — auditor asks \"what changed cart-total in March?\"\n * ledger.query({\n * factPath: \"cartTotal\",\n * changedBetween: [\"2026-03-01\", \"2026-04-01\"],\n * });\n *\n * // Verify nobody tampered with the ledger\n * const verdict = await ledger.verify();\n * if (!verdict.valid) {\n * console.error(\"Tamper at entry\", verdict.brokenAt);\n * }\n * ```\n */\nexport function createAuditLedger(\n opts: AuditLedgerOptions = {},\n): AuditLedger {\n const sink = opts.sink ?? memorySink();\n const capturePII = opts.capturePII ?? false;\n const userRedact = opts.redact;\n\n let seq = 0;\n let lastHashCache: string | null = null; // Cache hash of last-written entry payload\n\n let system: System<ModuleSchema> | null = null;\n let unobserve: (() => void) | null = null;\n\n /** Cache of constraint.id → whenSpec (snapshotted at start, refreshed on register/unregister). */\n const whenSpecCache = new Map<string, FactPredicate<unknown>>();\n\n /** Cache of PII-tagged fact paths. */\n const piiTaggedFacts = new Set<string>();\n\n function refreshWhenSpecCache(): void {\n whenSpecCache.clear();\n if (!system) return;\n try {\n const inspect = (system as { inspect?: () => { constraints?: Array<{ id: string; whenSpec?: unknown }> } }).inspect;\n if (typeof inspect !== \"function\") return;\n const inspection = inspect();\n const constraints = inspection?.constraints ?? [];\n for (const c of constraints) {\n if (c.whenSpec !== undefined) {\n whenSpecCache.set(c.id, c.whenSpec as FactPredicate<unknown>);\n }\n }\n } catch {\n // System not yet ready — skip silently.\n }\n }\n\n function refreshPIITags(): void {\n piiTaggedFacts.clear();\n if (capturePII || !system) return;\n try {\n const meta = (system as { meta?: { byTag?: (tag: string) => Array<{ id: string }> } }).meta;\n if (!meta || typeof meta.byTag !== \"function\") return;\n const tagged = meta.byTag(\"pii\") ?? [];\n for (const m of tagged) {\n piiTaggedFacts.add(m.id);\n }\n } catch {\n // No meta accessor — skip.\n }\n }\n\n function redactValue(factPath: string, value: unknown): unknown {\n if (capturePII) return value;\n if (piiTaggedFacts.has(factPath)) return \"[redacted]\";\n\n return value;\n }\n\n function redactClauses(\n clauses: ClauseResult[] | undefined,\n ): ClauseResult[] | undefined {\n if (!clauses) return clauses;\n if (capturePII || piiTaggedFacts.size === 0) return clauses;\n let mutated = false;\n const out: ClauseResult[] = clauses.map((c) => {\n if (piiTaggedFacts.has(c.path)) {\n mutated = true;\n return { ...c, actual: \"[redacted]\" };\n }\n // Recurse into combinator children.\n if (c.children) {\n const inner = redactClauses(c.children);\n if (inner !== c.children) {\n mutated = true;\n return { ...c, children: inner };\n }\n }\n\n return c;\n });\n\n return mutated ? out : clauses;\n }\n\n /**\n * `partial` is the entry-specific payload (no seq/ts/prevHash). It's\n * typed as `Record<string, unknown>` because TS's distributed Omit\n * over the AuditEntry discriminated union doesn't compose cleanly;\n * runtime construction is safe because each call site passes a\n * known-shape literal.\n */\n function emit(partial: Record<string, unknown>): void {\n const entry = {\n ...partial,\n seq: seq++,\n ts: Date.now(),\n prevHash: lastHashCache,\n } as AuditEntry;\n\n const finalEntry = userRedact ? userRedact(entry) : entry;\n sink.write(finalEntry);\n\n // Sync hash of this entry — stashed as the next entry's prevHash.\n // Whole entry is hashed (including its own prevHash field) so\n // verify() can rebuild the chain deterministically.\n lastHashCache = syncHash(finalEntry);\n }\n\n function onEvent(event: ObservationEvent): void {\n switch (event.type) {\n case \"constraint.evaluate\":\n emit({\n kind: \"constraint.evaluate\",\n constraintId: event.id,\n active: event.active,\n whenSpec: whenSpecCache.get(event.id),\n whenExplain: redactClauses(event.whenExplain),\n });\n break;\n case \"fact.change\":\n emit({\n kind: \"fact.change\",\n key: event.key,\n prior: redactValue(event.key, event.prev),\n next: redactValue(event.key, event.next),\n });\n break;\n case \"resolver.write.rejected\":\n if (event.kind === \"summary\") {\n emit({\n kind: \"resolver.write.rejected\",\n rejection: \"summary\",\n resolverId: event.resolver,\n requirementId: event.requirementId,\n reason: event.reason,\n dropped: event.dropped,\n });\n } else {\n emit({\n kind: \"resolver.write.rejected\",\n rejection: \"rejection\",\n resolverId: event.resolver,\n requirementId: event.requirementId,\n reason: event.reason,\n fact: event.fact,\n expected: redactValue(event.fact, event.expected),\n actual: redactValue(event.fact, event.actual),\n });\n }\n break;\n case \"resolver.complete\":\n emit({\n kind: \"resolver.complete\",\n resolverId: event.resolver,\n requirementId: event.requirementId,\n duration: event.duration,\n });\n break;\n case \"resolver.error\":\n emit({\n kind: \"resolver.error\",\n resolverId: event.resolver,\n requirementId: event.requirementId,\n error: String(event.error),\n });\n break;\n case \"system.init\":\n case \"system.start\":\n case \"system.stop\":\n case \"system.destroy\":\n emit({ kind: event.type });\n break;\n default:\n // Other observation events ignored in v1 (derivation.compute,\n // requirement.created/met/canceled, effect.run/error,\n // reconcile.start/end). They're available via .observe()\n // directly if a consumer wants them.\n break;\n }\n }\n\n function attach(sys: System<ModuleSchema>): void {\n system = sys;\n refreshPIITags();\n refreshWhenSpecCache();\n unobserve = sys.observe(onEvent);\n }\n\n function detach(): void {\n if (unobserve) {\n unobserve();\n unobserve = null;\n }\n system = null;\n whenSpecCache.clear();\n piiTaggedFacts.clear();\n }\n\n const plugin: Plugin<ModuleSchema> = {\n name: \"audit-ledger\",\n onInit(sys) {\n attach(sys as System<ModuleSchema>);\n },\n onStop() {\n // Keep the sink populated so query() works after stop, but\n // drop the subscription to avoid leaks.\n if (unobserve) {\n unobserve();\n unobserve = null;\n }\n },\n onDestroy() {\n detach();\n },\n onDefinitionRegister(type, id) {\n if (type === \"constraint\") refreshWhenSpecCache();\n if (type === \"constraint\" || type === \"resolver\" || type === \"effect\") {\n // Re-pull PII tags too — a dynamically-registered fact (rare)\n // could have brought new meta.\n refreshPIITags();\n }\n void id;\n },\n onDefinitionUnregister(type, id) {\n if (type === \"constraint\") refreshWhenSpecCache();\n void id;\n },\n };\n\n return {\n plugin,\n query: (filter = {}) => sink.query(filter),\n recent: (n) => sink.recent(n),\n forFact: (path, opts2) => sink.forFact(path, opts2),\n forConstraint: (id, opts2) => sink.forConstraint(id, opts2),\n toJSON: () => sink.toJSON(),\n verify(opts?: { strong?: boolean }): VerifyResult | Promise<VerifyResult> {\n const { entries } = sink.toJSON();\n if (entries.length === 0) {\n return opts?.strong\n ? Promise.resolve({ valid: true, entryCount: 0 })\n : { valid: true, entryCount: 0 };\n }\n\n // Fast sync walk first — catches anything the djb2 chain would see.\n let prevHash: string | null = null;\n for (let i = 0; i < entries.length; i++) {\n const entry = entries[i]!;\n if (entry.prevHash !== prevHash) {\n return {\n valid: false,\n brokenAt: i,\n expectedHash: prevHash ?? \"<genesis>\",\n actualHash: entry.prevHash ?? \"<genesis>\",\n entry,\n };\n }\n prevHash = syncHash(entry);\n }\n\n if (!opts?.strong) {\n return { valid: true, entryCount: entries.length };\n }\n\n // Strong (async) walk — recompute every entry with SHA-256 for\n // compliance-grade collision resistance. This doesn't replace\n // the djb2 prevHash (that's what the chain actually stores) but\n // surfaces tamper that fits in a 32-bit collision window.\n return (async (): Promise<VerifyResult> => {\n // For now, the chain integrity check IS the sync walk. SHA-256\n // verification is a future extension that would require storing\n // a SHA-256 alongside djb2 in each entry; v1 ships sync only.\n return { valid: true, entryCount: entries.length };\n })();\n },\n clear() {\n sink.clear();\n seq = 0;\n lastHashCache = null;\n },\n destroy() {\n detach();\n sink.destroy();\n },\n };\n}\n"]} |
| 'use strict';var chunk7NMXRATK_cjs=require('./chunk-7NMXRATK.cjs'),chunkN4KTCKOI_cjs=require('./chunk-N4KTCKOI.cjs'),chunkEOLY64E6_cjs=require('./chunk-EOLY64E6.cjs');var m="::",he=Symbol.for("nodejs.util.inspect.custom");function we(e){if(!e.ownKeys)return {};let n={};for(let t of e.ownKeys())n[t]=e.get(t);return n}function D(e){return new Proxy({},{get(n,t){if(typeof t=="symbol")return t===he?()=>we(e):void 0;if(!chunkN4KTCKOI_cjs.l.has(t))return e.get(t)},set(n,t,s){return typeof t=="symbol"||chunkN4KTCKOI_cjs.l.has(t)?false:e.set?e.set(t,s):false},has(n,t){return typeof t=="symbol"||chunkN4KTCKOI_cjs.l.has(t)?false:e.has?e.has(t):false},deleteProperty(n,t){return typeof t=="symbol"||chunkN4KTCKOI_cjs.l.has(t)?false:e.delete?e.delete(t):false},ownKeys(){return e.ownKeys?e.ownKeys():[]},getOwnPropertyDescriptor(n,t){if(typeof t!="symbol"&&e.has&&typeof t=="string"&&e.has(t))return {configurable:true,enumerable:true}},defineProperty(){return false},getPrototypeOf(){return null},setPrototypeOf(){return false}})}var Z=new WeakMap,Q=new WeakMap,X=new WeakMap,ee=new WeakMap,ne=new WeakMap,te=new WeakMap;function $(e,n){let t=Z.get(e);if(t){let r=t.get(n);if(r)return r}else t=new Map,Z.set(e,t);let s=D({get:r=>r==="$store"||r==="$snapshot"?e[r]:e[`${n}${m}${r}`],set:(r,u)=>{if(chunkN4KTCKOI_cjs.a){let i=chunkN4KTCKOI_cjs.m(u);i&&chunkN4KTCKOI_cjs.n(`${n}.${r}`,i);}return e[`${n}${m}${r}`]=u,true},has:r=>`${n}${m}${r}`in e,delete:r=>(delete e[`${n}${m}${r}`],true)});return t.set(n,s),s}function re(e,n,t){let s=Q.get(e);if(s)return s;let r=D({get:u=>{if(Object.hasOwn(n,u))return $(e,u)},has:u=>Object.hasOwn(n,u),ownKeys:()=>t()});return Q.set(e,r),r}function oe(e,n,t){let s=`${n}|${t.join(",")}`,r=ne.get(e);if(r){let o=r.get(s);if(o)return o}else r=new Map,ne.set(e,r);let u=new Set(t),i=["self",...t],c=D({get:o=>{if(o==="self")return $(e,n);if(u.has(o))return $(e,o);chunkN4KTCKOI_cjs.a&&console.warn(`[Directive] Module "${n}" accessed undeclared cross-module property "${o}". Add it to crossModuleDeps or use "facts.self.${o}" for own module facts.`);},has:o=>o==="self"||u.has(o),ownKeys:()=>i});return r.set(s,c),c}function B(e,n){let t=ee.get(e);if(t){let r=t.get(n);if(r)return r}else t=new Map,ee.set(e,t);let s=D({get:r=>e[`${n}${m}${r}`],has:r=>`${n}${m}${r}`in e});return t.set(n,s),s}function se(e,n,t){let s=X.get(e);if(s)return s;let r=D({get:u=>{if(Object.hasOwn(n,u))return B(e,u)},has:u=>Object.hasOwn(n,u),ownKeys:()=>t()});return X.set(e,r),r}function ie(e,n,t){let s=te.get(e);return s||(s=new Map,te.set(e,s)),D({get:r=>{if(!Object.hasOwn(n,r))return;let u=s.get(r);if(u)return u;let i=D({get:c=>o=>{e.dispatch({type:`${r}${m}${c}`,...o});}});return s.set(r,i),i},has:r=>Object.hasOwn(n,r),ownKeys:()=>t()})}function R(e){if(e.includes(".")){let[n,...t]=e.split(".");return `${n}${m}${t.join(m)}`}return e}function H(e){let n={};for(let[t,s]of Object.entries(e)){let r=t.indexOf(m);if(r>0){let u=t.slice(0,r),i=t.slice(r+m.length);n[u]||(n[u]={}),n[u][i]=s;}else n._root||(n._root={}),n._root[t]=s;}return n}function P(e,n,t,s){return t?oe(e,n,s):$(e,n)}function b(e,n){return `${e}${m}${n}`}function ae(e){return e.includes(m)}function E(e,n,t){if(Array.isArray(e)){let i=e.map(c=>{if(c&&typeof c=="object"&&typeof c.fact=="string"){let o=c.fact;return ae(o)?c:{...c,fact:b(n,o)}}return c});return chunkEOLY64E6_cjs.a(i),i}if(!e||typeof e!="object")return e;let s=e;if("$all"in s||"$any"in s){let i="$all"in s?"$all":"$any",c=s[i],o={[i]:c.map(f=>E(f,n,t))};return chunkEOLY64E6_cjs.a(o),o}if("$not"in s){let i={$not:E(s.$not,n,t)};return chunkEOLY64E6_cjs.a(i),i}function r(i,c){return E(i,c,ce)}let u={};for(let i of Object.keys(s)){if(i.startsWith("$")||ae(i)){u[i]=s[i];continue}if(i==="self"){let c=s[i];if(c&&typeof c=="object"){let o=r(c,n);if(o&&typeof o=="object"&&!Array.isArray(o)){for(let[f,l]of Object.entries(o))u[f]=l;continue}}}if(t.has(i)){let c=s[i];if(c&&typeof c=="object"){let o=r(c,i);if(o&&typeof o=="object"&&!Array.isArray(o)){for(let[f,l]of Object.entries(o))u[f]=l;continue}}}u[b(n,i)]=s[i];}return chunkEOLY64E6_cjs.a(u),u}var ce=new Set;function me(e,n){let t=e.crossModuleDeps?new Set(Object.keys(e.crossModuleDeps)):ce,s=e.constraints;if(s){let c=false,o={};for(let[f,l]of Object.entries(s)){let d=l;if(d.when!==void 0&&typeof d.when!="function"){o[f]={...d,when:E(d.when,n,t)},c=true;continue}o[f]=l;}c&&(s=o);}let r=e.derive;if(r){let c=false,o={};for(let[f,l]of Object.entries(r)){let d=l&&typeof l=="object"&&Object.hasOwn(l,"compute")?l:null;if(!d){o[f]=l;continue}let g=d.compute;if(typeof g=="function"){o[f]=l;continue}if(chunk7NMXRATK_cjs.j(g)){chunkEOLY64E6_cjs.a(g);let k=w=>chunk7NMXRATK_cjs.q(g,w);o[f]=d.meta?{compute:k,meta:d.meta}:k,c=true;continue}if(chunk7NMXRATK_cjs.h(g)){chunkEOLY64E6_cjs.a(g);let k=chunk7NMXRATK_cjs.o(g),w=j=>k(j);o[f]=d.meta?{compute:w,meta:d.meta}:w,c=true;continue}o[f]=l;}c&&(r=o);}let u=e.events;if(u){let c=false,o={};for(let[f,l]of Object.entries(u)){if(l&&typeof l=="object"){let d=Object.hasOwn(l,"handler"),g=Object.hasOwn(l,"patch");if(d&&g&&chunkN4KTCKOI_cjs.a&&console.warn(`[Directive] event "${f}": both \`handler\` and \`patch\` provided \u2014 using \`handler\` (patch is ignored).`),g&&!d){let k=l;chunkEOLY64E6_cjs.a(k.patch);let w=(j,O)=>chunk7NMXRATK_cjs.t(k.patch,j,O??{});o[f]=k.meta?{handler:w,meta:k.meta}:w,c=true;continue}}o[f]=l;}c&&(u=o);}let i=e.effects;if(i){let c=false,o={};for(let[f,l]of Object.entries(i)){let d=l;if(d.on!==void 0&&chunk7NMXRATK_cjs.h(d.on)){o[f]={...d,on:E(d.on,n,t)},c=true;continue}o[f]=l;}c&&(i=o);}return s===e.constraints&&r===e.derive&&u===e.events&&i===e.effects?e:{...e,constraints:s,derive:r,events:u,effects:i}}function C(e){return Object.keys(e).length>0?e:void 0}function ke(e,n){let t={};for(let[s,r]of Object.entries(e.schema.facts))t[b(n,s)]=r;return t}function pe(e,n){if(e.init)return t=>{let s=$(t,n);e.init(s);}}function ve(e,n,t,s){if(!e.derive)return;let r={};for(let[u,i]of Object.entries(e.derive)){let c=chunk7NMXRATK_cjs.u(i),o=c?i.compute:i,f=c?i.meta:void 0,l=(d,g)=>{let k=P(d,n,t,s),w=B(g,n);return o(k,w)};r[b(n,u)]=f?{compute:l,meta:f}:l;}return C(r)}function be(e,n){if(!e.events)return;let t={};for(let[s,r]of Object.entries(e.events)){let u=typeof r=="object"&&r!==null&&Object.hasOwn(r,"handler"),i=u?r.handler:r,c=u?r.meta:void 0,o=(f,l)=>{let d=$(f,n);i(d,l);};t[b(n,s)]=c?{handler:o,meta:c}:o;}return C(t)}function Me(e,n,t,s){if(!e.constraints)return;let r={};for(let[u,i]of Object.entries(e.constraints)){let c=i,o=typeof c.when=="function";r[b(n,u)]={...c,deps:c.deps?.map(f=>b(n,f)),after:c.after?.map(f=>f.includes(m)?f:b(n,f)),owns:c.owns?.map(f=>f.includes(m)?f:b(n,f)),when:o?f=>{let l=P(f,n,t,s);return c.when(l)}:c.when,require:typeof c.require=="function"?f=>{let l=P(f,n,t,s);return c.require(l)}:c.require};}return C(r)}function Re(e,n,t,s){if(!e.resolvers)return;let r={};for(let[i,c]of Object.entries(e.resolvers)){let f=function(l){return {facts:P(l.facts,n,t,s),signal:l.signal}};let o=c;r[b(n,i)]={...o,...o.resolve&&{resolve:async(l,d)=>{await o.resolve(l,f(d));}},...o.resolveBatch&&{resolveBatch:async(l,d)=>{await o.resolveBatch(l,f(d));}},...o.resolveBatchWithResults&&{resolveBatchWithResults:async(l,d)=>o.resolveBatchWithResults(l,f(d))}};}return C(r)}function Se(e,n,t,s){if(!e.effects)return;let r={};for(let[u,i]of Object.entries(e.effects)){let c=i;r[b(n,u)]={...c,run:(o,f)=>{let l=P(o,n,t,s),d=f?P(f,n,t,s):void 0;return c.run(l,d)},deps:c.deps?.map(o=>b(n,o))};}return C(r)}function Oe(e,n,t){return {snapshotEvents:t&&!t.has(n)?[]:e.history?.snapshotEvents?.map(s=>b(n,s))}}function I(e){let{mod:n,namespace:t,snapshotModulesSet:s}=e,r=me(n,t),u=!!(r.crossModuleDeps&&Object.keys(r.crossModuleDeps).length>0),i=u?Object.keys(r.crossModuleDeps):[];return {id:r.id,schema:ke(r,t),requirements:r.schema.requirements??{},init:pe(r,t),derive:ve(r,t,u,i),events:be(r,t),effects:Se(r,t,u,i),constraints:Me(r,t,u,i),resolvers:Re(r,t,u,i),hooks:r.hooks,meta:r.meta,history:Oe(r,t,s)}}function xe(e){let n=Object.keys(e),t=new Set(n),s=new Set,r=new Set,u=[],i=[];function c(o){if(s.has(o))return;if(r.has(o)){let l=i.indexOf(o),d=[...i.slice(l),o].join(" \u2192 ");throw new Error(`[Directive] Circular dependency detected: ${d}. Modules cannot have circular crossModuleDeps. Break the cycle by removing one of the cross-module references.`)}r.add(o),i.push(o);let f=e[o];if(f?.crossModuleDeps)for(let l of Object.keys(f.crossModuleDeps))t.has(l)&&c(l);i.pop(),r.delete(o),s.add(o),u.push(o);}for(let o of n)c(o);return u}function ue(e,n){let t=[];for(let s of Object.keys(n.schema.facts))t.push(`${e}${m}${s}`);if(n.schema.derivations)for(let s of Object.keys(n.schema.derivations))t.push(`${e}${m}${s}`);return t}function ze(e){if("module"in e){if(!e.module)throw new Error("[Directive] createSystem requires a module. Got: "+typeof e.module);return $e(e)}let n=e;if(Array.isArray(n.modules))throw new Error(`[Directive] createSystem expects modules as an object, not an array. | ||
| Instead of: | ||
| createSystem({ modules: [authModule, dataModule] }) | ||
| Use: | ||
| createSystem({ modules: { auth: authModule, data: dataModule } }) | ||
| Or for a single module: | ||
| createSystem({ module: counterModule })`);let t=n.modules;if(t&&typeof t=="object"&&"id"in t&&"schema"in t)throw new Error(`[Directive] A single module was passed to \`modules:\`. For a single module, use \`module:\` instead: | ||
| createSystem({ module: myModule }) | ||
| For multiple modules, wrap in an object: | ||
| createSystem({ modules: { myName: myModule } })`);return De(n)}function De(e){let n=e.modules,t=new Set(Object.keys(n)),s=typeof e.history=="object"?e.history:null,r=s?.snapshotModules?new Set(s.snapshotModules):null;if(e.tickMs!==void 0&&e.tickMs<=0)throw new Error("[Directive] tickMs must be a positive number");if(chunkN4KTCKOI_cjs.a){for(let[a,y]of Object.entries(n))if(y.crossModuleDeps)for(let h of Object.keys(y.crossModuleDeps))h===a?console.warn(`[Directive] Module "${a}" references itself in crossModuleDeps. Use "facts.self" to access own module's facts instead.`):t.has(h)||console.warn(`[Directive] Module "${a}" declares crossModuleDeps.${h}, but no module with namespace "${h}" exists in the system. Available modules: ${[...t].join(", ")}`);}if(chunkN4KTCKOI_cjs.a&&s?.snapshotModules)for(let a of s.snapshotModules)t.has(a)||console.warn(`[Directive] history.snapshotModules entry "${a}" doesn't match any module. Available modules: ${[...t].join(", ")}`);let u,i=e.initOrder??"auto";if(Array.isArray(i)){let a=i,y=Object.keys(n).filter(h=>!a.includes(h));if(y.length>0)throw new Error(`[Directive] initOrder is missing modules: ${y.join(", ")}. All modules must be included in the explicit order.`);u=a;}else i==="declaration"?u=Object.keys(n):u=xe(n);let{history:c,trace:o,errorBoundary:f}=de(e);for(let a of Object.keys(n)){if(a.includes(m))throw new Error(`[Directive] Module name "${a}" contains the reserved separator "${m}". Module names cannot contain "${m}".`);let y=n[a];if(y){for(let h of Object.keys(y.schema.facts))if(h.includes(m))throw new Error(`[Directive] Schema key "${h}" in module "${a}" contains the reserved separator "${m}". Schema keys cannot contain "${m}".`)}}let l={names:null};function d(){return l.names===null&&(l.names=Object.keys(n)),l.names}let g=u.map(a=>{let y=n[a];return y?I({mod:y,namespace:a,snapshotModulesSet:r}):null}).filter(a=>a!==null);chunkN4KTCKOI_cjs.a&&e.tickMs&&e.tickMs>0&&(g.some(y=>y.events&&Object.keys(y.events).some(h=>h.endsWith(`${m}tick`)))||console.warn(`[Directive] tickMs is set to ${e.tickMs}ms but no module defines a "tick" event handler.`));let k=null,w=null;function j(a){for(let[y,h]of Object.entries(a)){if(chunkN4KTCKOI_cjs.l.has(y)){chunkN4KTCKOI_cjs.a&&console.warn(`[Directive] initialFacts/hydrate contains blocked namespace "${y}". Skipping.`);continue}if(!t.has(y)){chunkN4KTCKOI_cjs.a&&console.warn(`[Directive] initialFacts/hydrate contains unknown namespace "${y}". Available modules: ${[...t].join(", ")}`);continue}if(h&&typeof h=="object"&&!chunkEOLY64E6_cjs.e(h))throw new Error(`[Directive] initialFacts/hydrate for namespace "${y}" contains potentially dangerous keys (__proto__, constructor, or prototype). This may indicate a prototype pollution attack.`);for(let[M,x]of Object.entries(h))chunkN4KTCKOI_cjs.l.has(M)||(w.facts[`${y}${m}${M}`]=x);}}w=chunk7NMXRATK_cjs.T({modules:g,plugins:e.plugins,history:c,trace:o,errorBoundary:f,tickMs:e.tickMs,cloud:e.cloud,onAfterModuleInit:()=>{e.initialFacts&&j(e.initialFacts),k&&(j(k),k=null);}});let O=new Map;for(let a of Object.keys(n)){let y=n[a];y&&O.set(a,ue(a,y));}let q=re(w.facts,n,d),ye=se(w.derive,n,d),ge=ie(w,n,d),A=null,F=e.tickMs,_={_mode:"namespaced",facts:q,history:w.history,derive:ye,events:ge,constraints:w.constraints,effects:w.effects,resolvers:w.resolvers,async hydrate(a){if(w.isRunning)throw new Error("[Directive] hydrate() must be called before start(). The system is already running.");let y=await a();y&&typeof y=="object"&&(k=y);},initialize(){w.initialize();},start(){if(w.start(),F&&F>0){let a;for(let y of g)if(y?.events&&(a=Object.keys(y.events).find(h=>h.endsWith(`${m}tick`)),a))break;if(a){let y=a;A=setInterval(()=>{w.dispatch({type:y});},F);}}},stop(){A&&(clearInterval(A),A=null),w.stop();},destroy(){this.stop(),w.destroy();},dispatch(a){w.dispatch(a);},read(a){return w.read(R(a))},subscribe(a,y){let h=[];for(let M of a)if(M.endsWith(".*")){let x=M.slice(0,-2),W=O.get(x);W?h.push(...W):chunkN4KTCKOI_cjs.a&&console.warn(`[Directive] subscribe wildcard "${M}" \u2014 namespace "${x}" not found.`);}else h.push(R(M));return w.subscribe(h,y)},subscribeModule(a,y){let h=O.get(a);return !h||h.length===0?(chunkN4KTCKOI_cjs.a&&console.warn(`[Directive] subscribeModule("${a}") \u2014 namespace not found. Available: ${[...O.keys()].join(", ")}`),()=>{}):w.subscribe(h,y)},watch(a,y,h){return w.watch(R(a),y,h)},when(a,y){return w.when(()=>a(q),y)},getDistributableSnapshot(a){let y={...a,includeDerivations:a?.includeDerivations?.map(R),excludeDerivations:a?.excludeDerivations?.map(R),includeFacts:a?.includeFacts?.map(R)},h=w.getDistributableSnapshot(y);return {...h,data:H(h.data)}},watchDistributableSnapshot(a,y){let h={...a,includeDerivations:a?.includeDerivations?.map(R),excludeDerivations:a?.excludeDerivations?.map(R),includeFacts:a?.includeFacts?.map(R)};return w.watchDistributableSnapshot(h,M=>{y({...M,data:H(M.data)});})},registerModule(a,y){if(t.has(a))throw new Error(`[Directive] Module namespace "${a}" already exists. Cannot register a duplicate namespace.`);if(a.includes(m))throw new Error(`[Directive] Module name "${a}" contains the reserved separator "${m}".`);if(chunkN4KTCKOI_cjs.l.has(a))throw new Error(`[Directive] Module name "${a}" is a blocked property.`);for(let x of Object.keys(y.schema.facts))if(x.includes(m))throw new Error(`[Directive] Schema key "${x}" in module "${a}" contains the reserved separator "${m}".`);let h=y,M=I({mod:h,namespace:a,snapshotModulesSet:r});t.add(a),n[a]=h,l.names=null,O.set(a,ue(a,h)),w.registerModule(M);}};return le(_,w),fe(_),_}function de(e){let n=e.history,t=e.trace,s=e.errorBoundary;return e.zeroConfig&&(n=n??chunkN4KTCKOI_cjs.a,s={onConstraintError:"skip",onResolverError:"skip",onEffectError:"skip",onDerivationError:"skip",...e.errorBoundary}),{history:n,trace:t,errorBoundary:s}}function le(e,n){Object.defineProperties(e,{trace:{get(){return n.trace},enumerable:true,configurable:true},meta:{value:n.meta,enumerable:true,configurable:true},isRunning:{get(){return n.isRunning},enumerable:true,configurable:true},isSettled:{get(){return n.isSettled},enumerable:true,configurable:true},isInitialized:{get(){return n.isInitialized},enumerable:true,configurable:true},isReady:{get(){return n.isReady},enumerable:true,configurable:true}}),e.whenReady=n.whenReady.bind(n),e.batch=n.batch.bind(n),e.onSettledChange=n.onSettledChange.bind(n),e.onHistoryChange=n.onHistoryChange.bind(n),e.inspect=n.inspect.bind(n),e.settle=n.settle.bind(n),e.explain=n.explain.bind(n),e.getSnapshot=n.getSnapshot.bind(n),e.restore=n.restore.bind(n),e.observe=n.observe.bind(n);let t=["dispatch","read","subscribe","watch","when","getDistributableSnapshot","watchDistributableSnapshot"];for(let s of t)s in e||(e[s]=n[s].bind(n));}function fe(e){chunkN4KTCKOI_cjs.a&&(typeof process>"u"||process.env?.NODE_ENV!=="test")&&setTimeout(()=>{!e.isRunning&&!e.isInitialized&&console.warn("[Directive] System created but start() was never called. Constraints, resolvers, and effects will not run until you call system.start().");},0);}function $e(e){let n=e.module;if(!n)throw new Error("[Directive] createSystem requires a module. Got: "+typeof n);if(e.tickMs!==void 0&&e.tickMs<=0)throw new Error("[Directive] tickMs must be a positive number");if(e.initialFacts&&!chunkEOLY64E6_cjs.e(e.initialFacts))throw new Error("[Directive] initialFacts contains potentially dangerous keys (__proto__, constructor, or prototype). This may indicate a prototype pollution attack.");chunkN4KTCKOI_cjs.a&&(n.crossModuleDeps&&Object.keys(n.crossModuleDeps).length>0&&console.warn("[Directive] Single module mode ignores crossModuleDeps. Use multiple modules if cross-module access is needed: createSystem({ modules: { ... } })"),e.tickMs&&e.tickMs>0&&(n.events&&"tick"in n.events||console.warn(`[Directive] tickMs is set to ${e.tickMs}ms but module has no "tick" event handler.`)),(typeof e.history=="object"?e.history:null)?.snapshotModules&&console.warn("[Directive] history.snapshotModules has no effect in single-module mode. Use history.snapshotEvents on the module definition instead, or switch to createSystem({ modules: { ... } }) for multi-module filtering."));let{history:t,trace:s,errorBoundary:r}=de(e),u=null,i=null;i=chunk7NMXRATK_cjs.T({modules:[{id:n.id,schema:n.schema.facts,requirements:n.schema.requirements,init:n.init,derive:n.derive,events:n.events,effects:n.effects,constraints:n.constraints,resolvers:n.resolvers,hooks:n.hooks,meta:n.meta,history:n.history}],plugins:e.plugins,history:t,trace:s,errorBoundary:r,tickMs:e.tickMs,cloud:e.cloud,onAfterModuleInit:()=>{if(e.initialFacts)for(let[d,g]of Object.entries(e.initialFacts))chunkN4KTCKOI_cjs.l.has(d)||(i.facts[d]=g);if(u){if(!chunkEOLY64E6_cjs.e(u))chunkN4KTCKOI_cjs.a&&console.warn("[Directive] hydrate() data contains potentially dangerous keys. Skipping.");else for(let[d,g]of Object.entries(u))chunkN4KTCKOI_cjs.l.has(d)||(i.facts[d]=g);u=null;}}});let c=new Proxy({},{get(d,g){if(typeof g!="symbol"&&!chunkN4KTCKOI_cjs.l.has(g))return k=>{i.dispatch({type:g,...k});}},has(d,g){return typeof g=="symbol"||chunkN4KTCKOI_cjs.l.has(g)?false:n.events?g in n.events:false},ownKeys(){return n.events?Object.keys(n.events):[]},getOwnPropertyDescriptor(d,g){if(typeof g!="symbol"&&!chunkN4KTCKOI_cjs.l.has(g)&&n.events&&g in n.events)return {configurable:true,enumerable:true}},set(){return false},deleteProperty(){return false},defineProperty(){return false},getPrototypeOf(){return null},setPrototypeOf(){return false}}),o=null,f=e.tickMs,l={_mode:"single",facts:i.facts,history:i.history,derive:i.derive,events:c,constraints:i.constraints,effects:i.effects,resolvers:i.resolvers,async hydrate(d){if(i.isRunning)throw new Error("[Directive] hydrate() must be called before start(). The system is already running.");let g=await d();g&&typeof g=="object"&&(u=g);},initialize(){i.initialize();},start(){i.start(),f&&f>0&&n.events&&"tick"in n.events&&(o=setInterval(()=>{i.dispatch({type:"tick"});},f));},stop(){o&&(clearInterval(o),o=null),i.stop();},destroy(){this.stop(),i.destroy();},registerModule(d){i.registerModule({id:d.id,schema:d.schema.facts,requirements:d.schema.requirements,init:d.init,derive:d.derive,events:d.events,effects:d.effects,constraints:d.constraints,resolvers:d.resolvers,hooks:d.hooks,history:d.history});}};return le(l,i),fe(l),l}exports.a=ze;//# sourceMappingURL=chunk-EX3XG667.cjs.map | ||
| //# sourceMappingURL=chunk-EX3XG667.cjs.map |
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
| import { a8 as Schema, c as Facts, b as FactPredicate, aS as InferSchema, F as FactTemplate, D as DefinitionMeta, t as Requirement, b9 as RequirementOutput, a7 as RetryPolicy, B as BatchConfig, b0 as ResolverContext } from './plugins-Ykl_sAPE.js'; | ||
| /** | ||
| * Derivation Types - Type definitions for derivations | ||
| */ | ||
| /** Derivation definition function signature. */ | ||
| interface DerivationDef<S extends Schema, T, D extends DerivationsDef<S>> { | ||
| (facts: Facts<S>, derived: DerivedValues<S, D>): T; | ||
| } | ||
| /** | ||
| * Derivation definition with metadata (object form). | ||
| * Use this when you want to attach debugging metadata to a derivation. | ||
| * | ||
| * @example | ||
| * ```typescript | ||
| * derive: { | ||
| * displayName: { | ||
| * compute: (facts) => `${facts.firstName} ${facts.lastName}`, | ||
| * meta: { label: "Display Name", description: "Full name for UI" }, | ||
| * }, | ||
| * }, | ||
| * ``` | ||
| */ | ||
| interface DerivationDefWithMeta<S extends Schema, T, D extends DerivationsDef<S>> { | ||
| /** | ||
| * The derivation body. Either: | ||
| * - a function `(facts, derived) => T` (original form), or | ||
| * - a {@link FactPredicate} data spec — boolean derivations only, or | ||
| * - a {@link FactTemplate} `{ $template: "..." }` — string derivations only. | ||
| * | ||
| * Data forms are normalized to a wrapper function at registration; the | ||
| * wrapper reads through the facts proxy so existing auto-tracking | ||
| * captures dependencies. | ||
| */ | ||
| compute: DerivationDef<S, T, D> | ([T] extends [boolean] ? FactPredicate<InferSchema<S>> : never) | ([T] extends [string] ? FactTemplate : never); | ||
| meta?: DefinitionMeta; | ||
| } | ||
| /** Map of derivation definitions (internal — always bare functions after unwrap). */ | ||
| type DerivationsDef<S extends Schema> = Record<string, DerivationDef<S, unknown, DerivationsDef<S>>>; | ||
| /** Computed derived values. */ | ||
| type DerivedValues<S extends Schema, D extends DerivationsDef<S>> = { | ||
| readonly [K in keyof D]: ReturnType<D[K]>; | ||
| }; | ||
| /** Internal derivation state */ | ||
| interface DerivationState<T> { | ||
| id: string; | ||
| compute: () => T; | ||
| cachedValue: T | undefined; | ||
| dependencies: Set<string>; | ||
| isStale: boolean; | ||
| isComputing: boolean; | ||
| /** Consecutive runs producing the same deps (auto-tracked only) */ | ||
| stableRunCount: number; | ||
| /** Once true, skip withTracking() overhead until a tracked fact mutates */ | ||
| depsStable: boolean; | ||
| } | ||
| /** | ||
| * Type Helpers - External typed constraint and resolver definitions | ||
| * | ||
| * These types enable defining constraints and resolvers with full type safety | ||
| * outside of module definitions, while maintaining proper type inference. | ||
| */ | ||
| /** | ||
| * External constraint definition with full typing. | ||
| * Use this when defining constraints outside of createModule(). | ||
| * | ||
| * @typeParam S - The schema type | ||
| * @typeParam R - The requirement type (defaults to Requirement) | ||
| * | ||
| * @example | ||
| * ```typescript | ||
| * // Define a typed constraint factory | ||
| * const createMaxCountConstraint = <S extends Schema>( | ||
| * maxCount: number | ||
| * ): TypedConstraint<S, { type: "RESET_COUNT" }> => ({ | ||
| * priority: 10, | ||
| * when: (facts) => (facts as { count: number }).count > maxCount, | ||
| * require: { type: "RESET_COUNT" }, | ||
| * }); | ||
| * | ||
| * // Use in module | ||
| * const module = createModule("counter", { | ||
| * schema: { count: t.number() }, | ||
| * constraints: { | ||
| * maxCount: createMaxCountConstraint(100), | ||
| * }, | ||
| * }); | ||
| * ``` | ||
| */ | ||
| interface TypedConstraint<S extends Schema, R extends Requirement = Requirement> { | ||
| /** Priority for ordering (higher runs first) */ | ||
| priority?: number; | ||
| /** Mark this constraint as async (avoids runtime detection) */ | ||
| async?: boolean; | ||
| /** Condition function (sync or async) */ | ||
| when: (facts: Facts<S>) => boolean | Promise<boolean>; | ||
| /** | ||
| * Requirement(s) to produce when condition is met. | ||
| */ | ||
| require: RequirementOutput<R> | ((facts: Facts<S>) => RequirementOutput<R>); | ||
| /** Timeout for async constraints (ms) */ | ||
| timeout?: number; | ||
| /** | ||
| * Constraint IDs whose resolvers must complete before this constraint is evaluated. | ||
| * - If dependency's `when()` returns false, this constraint proceeds (nothing to wait for) | ||
| * - If dependency's resolver fails, this constraint remains blocked until it succeeds | ||
| * - Cross-module: use the constraint ID as it appears in the merged system | ||
| */ | ||
| after?: string[]; | ||
| } | ||
| /** | ||
| * External resolver definition with full typing. | ||
| * Use this when defining resolvers outside of createModule(). | ||
| * | ||
| * @typeParam S - The schema type | ||
| * @typeParam R - The requirement type (defaults to Requirement) | ||
| * | ||
| * @example | ||
| * ```typescript | ||
| * // Define a typed resolver factory | ||
| * interface FetchUserReq extends Requirement { | ||
| * type: "FETCH_USER"; | ||
| * userId: string; | ||
| * } | ||
| * | ||
| * const createFetchUserResolver = <S extends Schema>( | ||
| * fetchFn: (userId: string) => Promise<User> | ||
| * ): TypedResolver<S, FetchUserReq> => ({ | ||
| * requirement: (req): req is FetchUserReq => req.type === "FETCH_USER", | ||
| * key: (req) => `fetch-user-${req.userId}`, | ||
| * retry: { attempts: 3, backoff: "exponential" }, | ||
| * resolve: async (req, ctx) => { | ||
| * const user = await fetchFn(req.userId); | ||
| * (ctx.facts as { user: User }).user = user; | ||
| * }, | ||
| * }); | ||
| * ``` | ||
| */ | ||
| interface TypedResolver<S extends Schema, R extends Requirement = Requirement> { | ||
| /** | ||
| * Requirement type to handle. | ||
| * - String: matches `req.type` directly (e.g., `requirement: "FETCH_USER"`) | ||
| * - Function: type guard predicate (e.g., `requirement: (req) => req.type === "FETCH_USER"`) | ||
| */ | ||
| requirement: R["type"] | ((req: Requirement) => req is R); | ||
| /** Custom key function for deduplication */ | ||
| key?: (req: R) => string; | ||
| /** Retry policy */ | ||
| retry?: RetryPolicy; | ||
| /** Timeout for resolver execution (ms) */ | ||
| timeout?: number; | ||
| /** Batch configuration */ | ||
| batch?: BatchConfig; | ||
| /** Resolve function for single requirement */ | ||
| resolve?: (req: R, ctx: ResolverContext<S>) => Promise<void>; | ||
| /** Resolve function for batched requirements */ | ||
| resolveBatch?: (reqs: R[], ctx: ResolverContext<S>) => Promise<void>; | ||
| } | ||
| /** | ||
| * Create a typed constraint factory for a specific schema. | ||
| * This enables creating reusable constraint definitions with proper typing. | ||
| * | ||
| * @example | ||
| * ```typescript | ||
| * const schema = { count: t.number(), threshold: t.number() }; | ||
| * const factory = createConstraintFactory<typeof schema>(); | ||
| * | ||
| * const maxCountConstraint = factory.create({ | ||
| * when: (facts) => facts.count > facts.threshold, | ||
| * require: { type: "RESET" }, | ||
| * }); | ||
| * ``` | ||
| */ | ||
| declare function createConstraintFactory<S extends Schema>(): { | ||
| /** | ||
| * Create a typed constraint | ||
| */ | ||
| create<R extends Requirement = Requirement>(constraint: TypedConstraint<S, R>): TypedConstraint<S, R>; | ||
| }; | ||
| /** | ||
| * Create a typed resolver factory for a specific schema. | ||
| * This enables creating reusable resolver definitions with proper typing. | ||
| * | ||
| * @example | ||
| * ```typescript | ||
| * const schema = { user: t.object<User>() }; | ||
| * const factory = createResolverFactory<typeof schema>(); | ||
| * | ||
| * const fetchUserResolver = factory.create<FetchUserReq>({ | ||
| * requirement: (req): req is FetchUserReq => req.type === "FETCH_USER", | ||
| * resolve: async (req, ctx) => { | ||
| * ctx.facts.user = await fetchUser(req.userId); | ||
| * }, | ||
| * }); | ||
| * ``` | ||
| */ | ||
| declare function createResolverFactory<S extends Schema>(): { | ||
| /** | ||
| * Create a typed resolver | ||
| */ | ||
| create<R extends Requirement = Requirement>(resolver: TypedResolver<S, R>): TypedResolver<S, R>; | ||
| }; | ||
| /** | ||
| * Type-safe constraint creator. | ||
| * Simpler alternative to createConstraintFactory when you don't need a factory pattern. | ||
| * | ||
| * @example | ||
| * ```typescript | ||
| * const constraint = typedConstraint<typeof schema, { type: "RESET" }>({ | ||
| * when: (facts) => facts.count > 100, | ||
| * require: { type: "RESET" }, | ||
| * }); | ||
| * ``` | ||
| */ | ||
| declare function typedConstraint<S extends Schema, R extends Requirement = Requirement>(constraint: TypedConstraint<S, R>): TypedConstraint<S, R>; | ||
| /** | ||
| * Type-safe resolver creator. | ||
| * Simpler alternative to createResolverFactory when you don't need a factory pattern. | ||
| * | ||
| * @example | ||
| * ```typescript | ||
| * const resolver = typedResolver<typeof schema, FetchUserReq>({ | ||
| * requirement: (req): req is FetchUserReq => req.type === "FETCH_USER", | ||
| * resolve: async (req, ctx) => { | ||
| * ctx.facts.user = await fetchUser(req.userId); | ||
| * }, | ||
| * }); | ||
| * ``` | ||
| */ | ||
| declare function typedResolver<S extends Schema, R extends Requirement = Requirement>(resolver: TypedResolver<S, R>): TypedResolver<S, R>; | ||
| export { type DerivationDefWithMeta as D, type TypedConstraint as T, typedResolver as a, type DerivationsDef as b, type DerivedValues as c, type DerivationState as d, type TypedResolver as e, createConstraintFactory as f, createResolverFactory as g, typedConstraint as t }; |
| import { a8 as Schema, c as Facts, b as FactPredicate, aS as InferSchema, F as FactTemplate, D as DefinitionMeta, t as Requirement, b9 as RequirementOutput, a7 as RetryPolicy, B as BatchConfig, b0 as ResolverContext } from './plugins-Ykl_sAPE.cjs'; | ||
| /** | ||
| * Derivation Types - Type definitions for derivations | ||
| */ | ||
| /** Derivation definition function signature. */ | ||
| interface DerivationDef<S extends Schema, T, D extends DerivationsDef<S>> { | ||
| (facts: Facts<S>, derived: DerivedValues<S, D>): T; | ||
| } | ||
| /** | ||
| * Derivation definition with metadata (object form). | ||
| * Use this when you want to attach debugging metadata to a derivation. | ||
| * | ||
| * @example | ||
| * ```typescript | ||
| * derive: { | ||
| * displayName: { | ||
| * compute: (facts) => `${facts.firstName} ${facts.lastName}`, | ||
| * meta: { label: "Display Name", description: "Full name for UI" }, | ||
| * }, | ||
| * }, | ||
| * ``` | ||
| */ | ||
| interface DerivationDefWithMeta<S extends Schema, T, D extends DerivationsDef<S>> { | ||
| /** | ||
| * The derivation body. Either: | ||
| * - a function `(facts, derived) => T` (original form), or | ||
| * - a {@link FactPredicate} data spec — boolean derivations only, or | ||
| * - a {@link FactTemplate} `{ $template: "..." }` — string derivations only. | ||
| * | ||
| * Data forms are normalized to a wrapper function at registration; the | ||
| * wrapper reads through the facts proxy so existing auto-tracking | ||
| * captures dependencies. | ||
| */ | ||
| compute: DerivationDef<S, T, D> | ([T] extends [boolean] ? FactPredicate<InferSchema<S>> : never) | ([T] extends [string] ? FactTemplate : never); | ||
| meta?: DefinitionMeta; | ||
| } | ||
| /** Map of derivation definitions (internal — always bare functions after unwrap). */ | ||
| type DerivationsDef<S extends Schema> = Record<string, DerivationDef<S, unknown, DerivationsDef<S>>>; | ||
| /** Computed derived values. */ | ||
| type DerivedValues<S extends Schema, D extends DerivationsDef<S>> = { | ||
| readonly [K in keyof D]: ReturnType<D[K]>; | ||
| }; | ||
| /** Internal derivation state */ | ||
| interface DerivationState<T> { | ||
| id: string; | ||
| compute: () => T; | ||
| cachedValue: T | undefined; | ||
| dependencies: Set<string>; | ||
| isStale: boolean; | ||
| isComputing: boolean; | ||
| /** Consecutive runs producing the same deps (auto-tracked only) */ | ||
| stableRunCount: number; | ||
| /** Once true, skip withTracking() overhead until a tracked fact mutates */ | ||
| depsStable: boolean; | ||
| } | ||
| /** | ||
| * Type Helpers - External typed constraint and resolver definitions | ||
| * | ||
| * These types enable defining constraints and resolvers with full type safety | ||
| * outside of module definitions, while maintaining proper type inference. | ||
| */ | ||
| /** | ||
| * External constraint definition with full typing. | ||
| * Use this when defining constraints outside of createModule(). | ||
| * | ||
| * @typeParam S - The schema type | ||
| * @typeParam R - The requirement type (defaults to Requirement) | ||
| * | ||
| * @example | ||
| * ```typescript | ||
| * // Define a typed constraint factory | ||
| * const createMaxCountConstraint = <S extends Schema>( | ||
| * maxCount: number | ||
| * ): TypedConstraint<S, { type: "RESET_COUNT" }> => ({ | ||
| * priority: 10, | ||
| * when: (facts) => (facts as { count: number }).count > maxCount, | ||
| * require: { type: "RESET_COUNT" }, | ||
| * }); | ||
| * | ||
| * // Use in module | ||
| * const module = createModule("counter", { | ||
| * schema: { count: t.number() }, | ||
| * constraints: { | ||
| * maxCount: createMaxCountConstraint(100), | ||
| * }, | ||
| * }); | ||
| * ``` | ||
| */ | ||
| interface TypedConstraint<S extends Schema, R extends Requirement = Requirement> { | ||
| /** Priority for ordering (higher runs first) */ | ||
| priority?: number; | ||
| /** Mark this constraint as async (avoids runtime detection) */ | ||
| async?: boolean; | ||
| /** Condition function (sync or async) */ | ||
| when: (facts: Facts<S>) => boolean | Promise<boolean>; | ||
| /** | ||
| * Requirement(s) to produce when condition is met. | ||
| */ | ||
| require: RequirementOutput<R> | ((facts: Facts<S>) => RequirementOutput<R>); | ||
| /** Timeout for async constraints (ms) */ | ||
| timeout?: number; | ||
| /** | ||
| * Constraint IDs whose resolvers must complete before this constraint is evaluated. | ||
| * - If dependency's `when()` returns false, this constraint proceeds (nothing to wait for) | ||
| * - If dependency's resolver fails, this constraint remains blocked until it succeeds | ||
| * - Cross-module: use the constraint ID as it appears in the merged system | ||
| */ | ||
| after?: string[]; | ||
| } | ||
| /** | ||
| * External resolver definition with full typing. | ||
| * Use this when defining resolvers outside of createModule(). | ||
| * | ||
| * @typeParam S - The schema type | ||
| * @typeParam R - The requirement type (defaults to Requirement) | ||
| * | ||
| * @example | ||
| * ```typescript | ||
| * // Define a typed resolver factory | ||
| * interface FetchUserReq extends Requirement { | ||
| * type: "FETCH_USER"; | ||
| * userId: string; | ||
| * } | ||
| * | ||
| * const createFetchUserResolver = <S extends Schema>( | ||
| * fetchFn: (userId: string) => Promise<User> | ||
| * ): TypedResolver<S, FetchUserReq> => ({ | ||
| * requirement: (req): req is FetchUserReq => req.type === "FETCH_USER", | ||
| * key: (req) => `fetch-user-${req.userId}`, | ||
| * retry: { attempts: 3, backoff: "exponential" }, | ||
| * resolve: async (req, ctx) => { | ||
| * const user = await fetchFn(req.userId); | ||
| * (ctx.facts as { user: User }).user = user; | ||
| * }, | ||
| * }); | ||
| * ``` | ||
| */ | ||
| interface TypedResolver<S extends Schema, R extends Requirement = Requirement> { | ||
| /** | ||
| * Requirement type to handle. | ||
| * - String: matches `req.type` directly (e.g., `requirement: "FETCH_USER"`) | ||
| * - Function: type guard predicate (e.g., `requirement: (req) => req.type === "FETCH_USER"`) | ||
| */ | ||
| requirement: R["type"] | ((req: Requirement) => req is R); | ||
| /** Custom key function for deduplication */ | ||
| key?: (req: R) => string; | ||
| /** Retry policy */ | ||
| retry?: RetryPolicy; | ||
| /** Timeout for resolver execution (ms) */ | ||
| timeout?: number; | ||
| /** Batch configuration */ | ||
| batch?: BatchConfig; | ||
| /** Resolve function for single requirement */ | ||
| resolve?: (req: R, ctx: ResolverContext<S>) => Promise<void>; | ||
| /** Resolve function for batched requirements */ | ||
| resolveBatch?: (reqs: R[], ctx: ResolverContext<S>) => Promise<void>; | ||
| } | ||
| /** | ||
| * Create a typed constraint factory for a specific schema. | ||
| * This enables creating reusable constraint definitions with proper typing. | ||
| * | ||
| * @example | ||
| * ```typescript | ||
| * const schema = { count: t.number(), threshold: t.number() }; | ||
| * const factory = createConstraintFactory<typeof schema>(); | ||
| * | ||
| * const maxCountConstraint = factory.create({ | ||
| * when: (facts) => facts.count > facts.threshold, | ||
| * require: { type: "RESET" }, | ||
| * }); | ||
| * ``` | ||
| */ | ||
| declare function createConstraintFactory<S extends Schema>(): { | ||
| /** | ||
| * Create a typed constraint | ||
| */ | ||
| create<R extends Requirement = Requirement>(constraint: TypedConstraint<S, R>): TypedConstraint<S, R>; | ||
| }; | ||
| /** | ||
| * Create a typed resolver factory for a specific schema. | ||
| * This enables creating reusable resolver definitions with proper typing. | ||
| * | ||
| * @example | ||
| * ```typescript | ||
| * const schema = { user: t.object<User>() }; | ||
| * const factory = createResolverFactory<typeof schema>(); | ||
| * | ||
| * const fetchUserResolver = factory.create<FetchUserReq>({ | ||
| * requirement: (req): req is FetchUserReq => req.type === "FETCH_USER", | ||
| * resolve: async (req, ctx) => { | ||
| * ctx.facts.user = await fetchUser(req.userId); | ||
| * }, | ||
| * }); | ||
| * ``` | ||
| */ | ||
| declare function createResolverFactory<S extends Schema>(): { | ||
| /** | ||
| * Create a typed resolver | ||
| */ | ||
| create<R extends Requirement = Requirement>(resolver: TypedResolver<S, R>): TypedResolver<S, R>; | ||
| }; | ||
| /** | ||
| * Type-safe constraint creator. | ||
| * Simpler alternative to createConstraintFactory when you don't need a factory pattern. | ||
| * | ||
| * @example | ||
| * ```typescript | ||
| * const constraint = typedConstraint<typeof schema, { type: "RESET" }>({ | ||
| * when: (facts) => facts.count > 100, | ||
| * require: { type: "RESET" }, | ||
| * }); | ||
| * ``` | ||
| */ | ||
| declare function typedConstraint<S extends Schema, R extends Requirement = Requirement>(constraint: TypedConstraint<S, R>): TypedConstraint<S, R>; | ||
| /** | ||
| * Type-safe resolver creator. | ||
| * Simpler alternative to createResolverFactory when you don't need a factory pattern. | ||
| * | ||
| * @example | ||
| * ```typescript | ||
| * const resolver = typedResolver<typeof schema, FetchUserReq>({ | ||
| * requirement: (req): req is FetchUserReq => req.type === "FETCH_USER", | ||
| * resolve: async (req, ctx) => { | ||
| * ctx.facts.user = await fetchUser(req.userId); | ||
| * }, | ||
| * }); | ||
| * ``` | ||
| */ | ||
| declare function typedResolver<S extends Schema, R extends Requirement = Requirement>(resolver: TypedResolver<S, R>): TypedResolver<S, R>; | ||
| export { type DerivationDefWithMeta as D, type TypedConstraint as T, typedResolver as a, type DerivationsDef as b, type DerivedValues as c, type DerivationState as d, type TypedResolver as e, createConstraintFactory as f, createResolverFactory as g, typedConstraint as t }; |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
| 'use strict';var chunkEX3XG667_cjs=require('./chunk-EX3XG667.cjs');require('./chunk-7NMXRATK.cjs'),require('./chunk-N4KTCKOI.cjs'),require('./chunk-EOLY64E6.cjs');Object.defineProperty(exports,"createSystem",{enumerable:true,get:function(){return chunkEX3XG667_cjs.a}});//# sourceMappingURL=system-GK3NSFQH.cjs.map | ||
| //# sourceMappingURL=system-GK3NSFQH.cjs.map |
| {"version":3,"sources":[],"names":[],"mappings":"","file":"system-GK3NSFQH.cjs"} |
| export{a as createSystem}from'./chunk-26Z5VNPZ.js';import'./chunk-TPOKS4RY.js';import'./chunk-TZHC4E6S.js';import'./chunk-T6IJUWYR.js';//# sourceMappingURL=system-VZWB6WXX.js.map | ||
| //# sourceMappingURL=system-VZWB6WXX.js.map |
| {"version":3,"sources":[],"names":[],"mappings":"","file":"system-VZWB6WXX.js"} |
@@ -1,2 +0,2 @@ | ||
| import { s as Requirement, p as Plugin, b as Facts, a8 as Schema, H as HistoryAPI, ac as SystemInspection, J as HistoryState } from './plugins-DvrsPhzx.cjs'; | ||
| import { t as Requirement, q as Plugin, c as Facts, a8 as Schema, I as HistoryAPI, ac as SystemInspection, K as HistoryState } from './plugins-Ykl_sAPE.cjs'; | ||
| export { s as shallowEqual } from './utils-BnQajqPu.cjs'; | ||
@@ -3,0 +3,0 @@ |
@@ -1,2 +0,2 @@ | ||
| import { s as Requirement, p as Plugin, b as Facts, a8 as Schema, H as HistoryAPI, ac as SystemInspection, J as HistoryState } from './plugins-DvrsPhzx.js'; | ||
| import { t as Requirement, q as Plugin, c as Facts, a8 as Schema, I as HistoryAPI, ac as SystemInspection, K as HistoryState } from './plugins-Ykl_sAPE.js'; | ||
| export { s as shallowEqual } from './utils-BnQajqPu.js'; | ||
@@ -3,0 +3,0 @@ |
+4
-4
@@ -1,5 +0,5 @@ | ||
| 'use strict';var chunk2OS4RCLV_cjs=require('./chunk-2OS4RCLV.cjs'),chunkWIZHZF4G_cjs=require('./chunk-WIZHZF4G.cjs'),chunkN4KTCKOI_cjs=require('./chunk-N4KTCKOI.cjs'),chunkEOLY64E6_cjs=require('./chunk-EOLY64E6.cjs');var R=1e6;function fe(e,t){try{chunkWIZHZF4G_cjs.g(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(!chunkWIZHZF4G_cjs.d(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(chunkWIZHZF4G_cjs.e(e,{operator(r,i){n===void 0&&i.startsWith("$")&&!chunkWIZHZF4G_cjs.a.has(i)&&(n=i);},strayOperatorKey(r){n===void 0&&!chunkWIZHZF4G_cjs.a.has(r)&&!chunkWIZHZF4G_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: ${[...chunkWIZHZF4G_cjs.a].join(", ")}`)}function he(e){if(e&&typeof e=="object"&&!Array.isArray(e)&&Array.isArray(e.snapshots))return me(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>R)throw new Error(`[Directive] toReplayFrames: history has ${t.length} frames, exceeds the MAX_REPLAY_FRAMES limit (${R}) \u2014 split or down-sample the history`);return t.map((n,r)=>{if(n&&typeof n=="object"&&"facts"in n){let i=n,o={id:i.id??`#${r}`,facts:i.facts??{}};return typeof i.timestamp=="number"&&(o.timestamp=i.timestamp),o}return {id:`#${r}`,facts:n??{}}})}function me(e){let t=typeof e=="string"?JSON.parse(e):e;if(Array.isArray(t))return Q(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 Q(n.snapshots)}function Q(e){if(!Array.isArray(e))throw new Error("[Directive] framesFromSnapshots: expected an array of fact-state snapshots");if(e.length>R)throw new Error(`[Directive] framesFromSnapshots: history has ${e.length} snapshots, exceeds the MAX_REPLAY_FRAMES limit (${R}) \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 he(e)}function N(e){let{frames:t,original:n,proposed:r,entityKey:i}=e,o=e.maxSamples??20,s=o>0?o:0;if(t.length>R)throw new Error(`[Directive] replayUnder: history has ${t.length} frames, exceeds the MAX_REPLAY_FRAMES limit (${R}) \u2014 split or down-sample the history`);fe(n,"original"),fe(r,"proposed");let c=0,a=0,u=0,l=0,d=0,f=[],g=[],y=i?new Set:void 0,h=i?new Set:void 0,v;for(let C of t){let b=C.facts,S=chunkWIZHZF4G_cjs.h(n,b,v),k=chunkWIZHZF4G_cjs.h(r,b,v);S&&(c++,y?.add(b[i])),k&&(a++,h?.add(b[i])),S===k?d++:!S&&k?(u++,f.length<s&&f.push(ge(C,n,r,v))):(l++,g.length<s&&g.push(ge(C,n,r,v))),v=b;}let E={framesEvaluated:t.length,original:{matched:c},proposed:{matched:a},delta:a-c,newMatchCount:u,lostMatchCount:l,unchanged:d,newMatches:f,lostMatches:g};return y&&h&&(E.original.matchedEntities=y.size,E.proposed.matchedEntities=h.size),E}function ge(e,t,n,r){let i=e.facts,o={frameId:e.id,facts:i,originalExplain:chunkWIZHZF4G_cjs.i(t,i,r),proposedExplain:chunkWIZHZF4G_cjs.i(n,i,r)};return e.timestamp!==void 0&&(o.timestamp=e.timestamp),o}var Z=1e4,ye=5e7;function dt(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)&&Object.keys(e).length===1&&typeof e.$hole=="string"}function X(e,t,n=new Set,r=0){if(r>chunkWIZHZF4G_cjs.c)throw new Error(`[Directive] sweepUnder: template exceeds MAX_PREDICATE_DEPTH (${chunkWIZHZF4G_cjs.c}) \u2014 flatten the template or split the sweep`);if(dt(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(o=>X(o,t,n,r+1));let i={};for(let[o,s]of Object.entries(e))i[o]=X(s,t,n,r+1);return i}finally{n.delete(e);}}function*we(e,t){if(e.length===0){yield {};return}let n=e[0],r=e.slice(1),i=t[n]??[];for(let o of i)for(let s of we(r,t))yield {[n]:o,...s};}function pt(e){let t=1;for(let n of Object.values(e))t*=n.length;return t}function ft(e){let{frames:t,original:n,template:r,sweep:i,objective:o=b=>b.proposed.matched,entityKey:s,maxSamples:c=0}=e,a=Object.keys(i);if(a.length===0)throw new Error("[Directive] sweepUnder: `sweep` must contain at least one hole name");let u=pt(i);if(u>Z)throw new Error(`[Directive] sweepUnder: grid has ${u} points, exceeds the MAX_SWEEP_POINTS limit (${Z}) \u2014 narrow the sweep ranges or split the run`);if(u===0)throw new Error("[Directive] sweepUnder: at least one hole has zero candidate values");let l=u*t.length;if(l>ye)throw new Error(`[Directive] sweepUnder: ${u} points \xD7 ${t.length} frames = ${l} per-frame evaluations, exceeds the MAX_SWEEP_EVALUATIONS limit (${ye}) \u2014 narrow the sweep, down-sample the history, or split the run`);let d=false,f=b=>{let S;try{S=o(b);}catch(k){return d||(d=true,console.warn(`[Directive] sweepUnder: objective threw \u2014 point will not rank (${k.message})`)),Number.NEGATIVE_INFINITY}return typeof S!="number"||!Number.isFinite(S)?(d||(d=true,console.warn(`[Directive] sweepUnder: objective returned a non-finite number (${String(S)}) \u2014 point will not rank`)),Number.NEGATIVE_INFINITY):S},g=N({frames:t,original:n,proposed:n,entityKey:s,maxSamples:c}),y={values:{},report:g,score:f(g)},h=[],v=0,E=Number.NEGATIVE_INFINITY;for(let b of we(a,i)){let S=X(r,b),k=N({frames:t,original:n,proposed:S,entityKey:s,maxSamples:c}),U=f(k);U>E&&(E=U,v=h.length),h.push({values:b,report:k,score:U});}let C=h[v];return {points:h,bestIndex:v,best:C,baseline:y}}function Y(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 gt=new Set(["$eq","$ne","$in","$nin","$exists","$gt","$gte","$lt","$lte","$between","$matches","$startsWith","$endsWith","$contains","$changed"]),ht=new Set(["$all","$any","$not"]);function be(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function mt(e){if(!be(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;gt.has(r)&&(n=true);}return n}function M(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,o)=>{M(i,`${t}$all[${o}]`,n);}),n;if("$any"in e&&Array.isArray(e.$any))return e.$any.forEach((i,o)=>{M(i,`${t}$any[${o}]`,n);}),n;if("$not"in e)return M(e.$not,`${t}$not`,n),n;for(let[r,i]of Object.entries(e)){let o=t?`${t}.${r}`:r;if(mt(i))for(let[s,c]of Object.entries(i))n.push({path:o,op:s,value:c});else be(i)&&!ht.has(r)?M(i,o,n):n.push({path:o,op:"$eq",value:i});}return n}function D(e){return typeof e=="number"&&Number.isFinite(e)}function yt(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 wt(e){let t=Y(e.before),n=Y(e.after),i=[...new Set([...Object.keys(t),...Object.keys(n)])].sort(),o=[],s={added:0,removed:0,changed:0,unchanged:0,totalClauseChanges:0};for(let c of i){let a=t[c],u=n[c],l=c in t,d=c in n;if(l&&!d){let g=M(a),y=g.length===0?[{path:"(function-form predicate)",kind:"removed"}]:g.map(h=>({path:h.path,kind:"removed",before:{op:h.op,value:h.value}}));J(y),o.push({id:c,status:"removed",changes:y}),s.removed++,s.totalClauseChanges+=y.length;continue}if(!l&&d){let g=M(u),y=g.length===0?[{path:"(function-form predicate)",kind:"added"}]:g.map(h=>({path:h.path,kind:"added",after:{op:h.op,value:h.value}}));J(y),o.push({id:c,status:"added",changes:y}),s.added++,s.totalClauseChanges+=y.length;continue}let f=Te(a,u);f.length===0?(o.push({id:c,status:"unchanged",changes:[]}),s.unchanged++):(o.push({id:c,status:"changed",changes:f}),s.changed++,s.totalClauseChanges+=f.length);}return {constraints:o,summary:s}}function Te(e,t){if(e!==void 0&&t!==void 0&&(e===null||t===null||typeof e!="object"||typeof t!="object"))return chunkEOLY64E6_cjs.d(e)===chunkEOLY64E6_cjs.d(t)?[]:[{path:"",kind:"changed",before:{op:"$eq",value:e},after:{op:"$eq",value:t}}];let n=e===void 0?[]:M(e),r=t===void 0?[]:M(t),i=u=>`${u.path}::${u.op}`,o=new Map(n.map(u=>[i(u),u])),s=new Map(r.map(u=>[i(u),u])),c=new Set([...o.keys(),...s.keys()]),a=[];for(let u of c){let l=o.get(u),d=s.get(u);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(chunkEOLY64E6_cjs.d(l.value)===chunkEOLY64E6_cjs.d(d.value))continue;let f=yt(l.op,l.value,d.value);a.push({path:l.path,kind:f??"changed",before:{op:l.op,value:l.value},after:{op:d.op,value:d.value}});}}return J(a),a}function J(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??"",o=n.before?.op??n.after?.op??"";return i.localeCompare(o)});}var bt=/^[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)?$/;function F(e,t){if(typeof e!="string"||!bt.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 $e(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 Tt(e){if(Array.isArray(e)){if(e.length===0)throw new Error("[Directive] predicateToSQL: select must not be empty");for(let n of e)F(n,"column");return e.join(", ")}let t=e;return t==="*"?"*":(F(t,"column"),t)}function w(e,t){return e.params.push(t),e.placeholder(e.params.length)}function G(e,t,n,r){switch(t){case "$eq":return `${e} = ${w(r,n)}`;case "$ne":return `${e} <> ${w(r,n)}`;case "$gt":return `${e} > ${w(r,n)}`;case "$gte":return `${e} >= ${w(r,n)}`;case "$lt":return `${e} < ${w(r,n)}`;case "$lte":return `${e} <= ${w(r,n)}`;case "$in":if(!Array.isArray(n))throw new Error("[Directive] predicateToSQL: $in operand must be an array");return `${e} = ANY(${w(r,n)})`;case "$nin":if(!Array.isArray(n))throw new Error("[Directive] predicateToSQL: $nin operand must be an array");return `NOT (${e} = ANY(${w(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 ${w(r,n[0])} AND ${w(r,n[1])}`}case "$startsWith":if(typeof n!="string")throw new Error("[Directive] predicateToSQL: $startsWith operand must be a string");return `${e} LIKE ${w(r,V(n))} || '%' ESCAPE '\\'`;case "$endsWith":if(typeof n!="string")throw new Error("[Directive] predicateToSQL: $endsWith operand must be a string");return `${e} LIKE '%' || ${w(r,V(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 '%' || ${w(r,V(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} ${w(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: ${[...chunkWIZHZF4G_cjs.a].join(", ")}`)}}function V(e){return e.replace(/[\\%_]/g,"\\$&")}function Se(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function $t(e){if(!Se(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 ee(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 O(e,t,n){if(n>chunkWIZHZF4G_cjs.c)throw new Error(`[Directive] predicateToSQL: predicate depth limit (${chunkWIZHZF4G_cjs.c}) 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(o=>{if(!o||typeof o!="object"||!("fact"in o)||!("op"in o))throw new Error("[Directive] predicateToSQL: array-form clause must be { fact, op, value }");let s=o;return F(s.fact,"column"),$e(s.fact,t.allowed),G(s.fact,s.op,s.value,t)});return i.length===1?i[0]:`(${i.join(" AND ")})`}if("$all"in e){ee(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 o=i.map(s=>O(s,t,n+1));return o.length===1?o[0]:`(${o.join(" AND ")})`}if("$any"in e){ee(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 o=i.map(s=>O(s,t,n+1));return o.length===1?o[0]:`(${o.join(" OR ")})`}if("$not"in e){ee(e,"$not");let i=e.$not;return `NOT (${O(i,t,n+1)})`}let r=[];for(let[i,o]of Object.entries(e))if(F(i,"column"),$e(i,t.allowed),$t(o))for(let[s,c]of Object.entries(o)){if(!chunkWIZHZF4G_cjs.a.has(s))throw new Error(`[Directive] predicateToSQL: unknown operator "${s}" on column "${i}" \u2014 known: ${[...chunkWIZHZF4G_cjs.a].join(", ")}`);r.push(G(i,s,c,t));}else {if(Se(o))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(G(i,"$eq",o,t));}return r.length===0?"TRUE":r.length===1?r[0]:`(${r.join(" AND ")})`}var ve=e=>`$${e}`;function St(e,t){let{table:n,allowedKeys:r}=t,i=t.placeholder??ve,o=t.select??"*";F(n,"table");let s=Tt(o),c={params:[],placeholder:i,allowed:r},a=O(e,c,0);return {sql:`SELECT ${s} FROM ${n} WHERE ${a}`,where:a,params:c.params}}function vt(e,t={}){let n=t.placeholder??ve,r={params:[],placeholder:n,allowed:t.allowedKeys};return {where:O(e,r,0),params:r.params}}function te(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function re(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Mt(e){if(!re(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 kt=/^[A-Za-z_][A-Za-z0-9_]*$/,Dt=/^[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*$/;function Me(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?Dt:kt).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 ke(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 ne(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 De(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:`^${te(t)}`};case "$endsWith":if(typeof t!="string")throw new Error("[Directive] predicateToMongo: $endsWith operand must be a string");return {$regex:`${te(t)}$`};case "$contains":if(typeof t=="string")return {$regex:te(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: ${[...chunkWIZHZF4G_cjs.a].join(", ")}`)}}function A(e,t,n){if(n>chunkWIZHZF4G_cjs.c)throw new Error(`[Directive] predicateToMongo: predicate depth limit (${chunkWIZHZF4G_cjs.c}) 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={},o=[];for(let s of e){if(!s||typeof s!="object"||!("fact"in s)||!("op"in s))throw new Error("[Directive] predicateToMongo: array-form clause must be { fact, op, value }");let c=s;Me(c.fact,t),ke(c.fact,t.allowedKeys);let a=De(c.op,c.value);if(c.fact in i&&re(i[c.fact])){let u=i[c.fact];Object.keys(a).some(d=>d in u)?o.push({[c.fact]:a}):i[c.fact]={...u,...a};}else c.fact in i?o.push({[c.fact]:a}):i[c.fact]=a;}if(o.length>0){let s=[];for(let[c,a]of Object.entries(i))s.push({[c]:a});return s.push(...o),{$and:s}}return i}if("$all"in e){ne(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?A(i[0],t,n+1):{$and:i.map(o=>A(o,t,n+1))}}if("$any"in e){ne(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?A(i[0],t,n+1):{$or:i.map(o=>A(o,t,n+1))}}if("$not"in e){ne(e,"$not");let i=e.$not;return {$nor:[A(i,t,n+1)]}}let r={};for(let[i,o]of Object.entries(e))if(Me(i,t),ke(i,t.allowedKeys),Mt(o)){let s={};for(let[c,a]of Object.entries(o)){if(!chunkWIZHZF4G_cjs.a.has(c))throw new Error(`[Directive] predicateToMongo: unknown operator "${c}" on field "${i}" \u2014 known: ${[...chunkWIZHZF4G_cjs.a].join(", ")}`);Object.assign(s,De(c,a));}r[i]=s;}else r[i]=o;return r}function Rt(e,t={}){return A(e,t,0)}var Et=/^[A-Za-z_][A-Za-z0-9_]*$/;function Re(e,t){if(typeof e!="string"||!Et.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 ie(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 $(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 Ee(e){return `(${e.map($).join(",")})`}function oe(e){return e.replace(/[\\%_*]/g,"\\$&")}function x(e,t){switch(e){case "$eq":return `eq.${$(t)}`;case "$ne":return `neq.${$(t)}`;case "$gt":return `gt.${$(t)}`;case "$gte":return `gte.${$(t)}`;case "$lt":return `lt.${$(t)}`;case "$lte":return `lte.${$(t)}`;case "$in":if(!Array.isArray(t))throw new Error("[Directive] predicateToPostgrest: $in operand must be an array");return `in.${Ee(t)}`;case "$nin":if(!Array.isArray(t))throw new Error("[Directive] predicateToPostgrest: $nin operand must be an array");return `not.in.${Ee(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.${$(oe(t)+"*")}`;case "$endsWith":if(typeof t!="string")throw new Error("[Directive] predicateToPostgrest: $endsWith operand must be a string");return `like.${$("*"+oe(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.${$("*"+oe(t)+"*")}`;case "$matches":if(t instanceof RegExp)return `${t.flags.includes("i")?"imatch":"match"}.${$(t.source)}`;if(typeof t=="string")return `match.${$(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: ${[...chunkWIZHZF4G_cjs.a].join(", ")}`)}}function Ae(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function At(e){if(!Ae(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 se(e,t){return `${e}=${t}`}function L(e,t){return `${e}=(${t.join(",")})`}function ae(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?se(e,x("$gte",n[0])):`${e}.${x("$gte",n[0])}`,o=r?se(e,x("$lte",n[1])):`${e}.${x("$lte",n[1])}`;return [i,o]}return [r?se(e,x(t,n)):`${e}.${x(t,n)}`]}function _(e,t,n,r){if(r>chunkWIZHZF4G_cjs.c)throw new Error(`[Directive] predicateToPostgrest: predicate depth limit (${chunkWIZHZF4G_cjs.c}) 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 o=[];for(let s of e){if(!s||typeof s!="object"||!("fact"in s)||!("op"in s))throw new Error("[Directive] predicateToPostgrest: array-form clause must be { fact, op, value }");let c=s;Re(c.fact,t),o.push(...ae(c.fact,c.op,c.value,n));}return o}if("$all"in e){ie(e,"$all");let o=e.$all;if(!Array.isArray(o))throw new Error("[Directive] predicateToPostgrest: $all must be an array");if(n){let c=[];for(let a of o)c.push(..._(a,t,true,r+1));return c}let s=[];for(let c of o)s.push(..._(c,t,false,r+1));return [L("and",s)]}if("$any"in e){ie(e,"$any");let o=e.$any;if(!Array.isArray(o))throw new Error("[Directive] predicateToPostgrest: $any must be an array");if(o.length===0)return n?["id=is.null","id=not.is.null"]:[L("and",["id.is.null","id.not.is.null"])];let s=[];for(let c of o)s.push(..._(c,t,false,r+1));return [L("or",s)]}if("$not"in e){ie(e,"$not");let o=e.$not,s=_(o,t,false,r+1);return [L("not.and",s)]}let i=[];for(let[o,s]of Object.entries(e))if(Re(o,t),At(s))for(let[c,a]of Object.entries(s)){if(!chunkWIZHZF4G_cjs.a.has(c))throw new Error(`[Directive] predicateToPostgrest: unknown operator "${c}" on column "${o}" \u2014 known: ${[...chunkWIZHZF4G_cjs.a].join(", ")}`);i.push(...ae(o,c,a,n));}else {if(Ae(s))throw new Error(`[Directive] predicateToPostgrest: nested predicate at "${o}" \u2014 single-table queries only`);i.push(...ae(o,"$eq",s,n));}return i}function xt(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 Ct(e,t={}){let n=t.mode??"querystring",r=_(e,t.allowedKeys,true,0);return r.length===0?"":n==="raw"?r.join("&"):r.map(xt).join("&")}function B(e=[],t,n,r,i,o,s){return {_type:void 0,_validators:e,_typeName:t,_default:n,_transform:r,_description:i,_refinements:o,_meta:s,validate(c){return B([...e,c],t,n,r,i,o,s)}}}function p(e,t,n,r,i,o,s){return {...B(e,t,n,r,i,o,s),default(a){return p(e,t,a,r,i,o,s)},transform(a){return p([],t,void 0,l=>{let d=r?r(l):l;return a(d)},i,void 0,s)},brand(){return p(e,`Branded<${t}>`,n,r,i,o,s)},describe(a){return p(e,t,n,r,a,o,s)},refine(a,u){let l=[...o??[],{predicate:a,message:u}];return p([...e,a],t,n,r,i,l,s)},nullable(){return p([a=>a===null||e.every(u=>u(a))],`${t} | null`,n,r,i,void 0,s)},optional(){return p([a=>a===void 0||e.every(u=>u(a))],`${t} | undefined`,n,r,i,void 0,s)},meta(a){return p(e,t,n,r,i,o,a)}}}var jt=((...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(" | "))}),Pt={string(){let e=(t,n,r,i,o,s)=>({...p(t,"string",n,r,i,o,s),minLength(a){return e([...t,u=>u.length>=a],n,r,i,o,s)},maxLength(a){return e([...t,u=>u.length<=a],n,r,i,o,s)},pattern(a){return e([...t,u=>a.test(u)],n,r,i,o,s)},default(a){return e(t,a,r,i,o,s)},describe(a){return e(t,n,r,a,o,s)},refine(a,u){let l=[...o??[],{predicate:a,message:u}];return e([...t,a],n,r,i,l,s)},meta(a){return e(t,n,r,i,o,a)}});return e([t=>typeof t=="string"])},number(){let e=(t,n,r,i,o,s)=>({...p(t,"number",n,r,i,o,s),min(a){return e([...t,u=>u>=a],n,r,i,o,s)},max(a){return e([...t,u=>u<=a],n,r,i,o,s)},default(a){return e(t,a,r,i,o,s)},describe(a){return e(t,n,r,a,o,s)},refine(a,u){let l=[...o??[],{predicate:a,message:u}];return e([...t,a],n,r,i,l,s)},meta(a){return e(t,n,r,i,o,a)}});return e([t=>typeof t=="number"])},boolean(){return p([e=>typeof e=="boolean"],"boolean")},array(){let e=(t,n,r,i,o,s)=>{let c=p(t,"array",r,void 0,i,void 0,s),a=o??{value:-1};return {...c,get _lastFailedIndex(){return a.value},set _lastFailedIndex(l){a.value=l;},of(l){let d={value:-1};return e([...t,f=>{for(let g=0;g<f.length;g++)if(!l._validators.every(y=>y(f[g])))return d.value=g,false;return true}],l,r,i,d,s)},nonEmpty(){return e([...t,l=>l.length>0],n,r,i,a,s)},maxLength(l){return e([...t,d=>d.length<=l],n,r,i,a,s)},minLength(l){return e([...t,d=>d.length>=l],n,r,i,a,s)},default(l){return e(t,n,l,i,a,s)},describe(l){return e(t,n,r,l,a,s)},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(s){return e([...t,c=>{for(let[a,u]of Object.entries(s)){let l=c[a],d=u;if(d&&!d._validators.every(f=>f(l)))return false}return true}],n,r,i)},nonNull(){return e([...t,s=>s!=null],n,r,i)},hasKeys(...s){return e([...t,c=>s.every(a=>a in c)],n,r,i)},default(s){return e(t,s,r,i)},describe(s){return e(t,n,s,i)},meta(s){return e(t,n,r,s)}});return e([t=>typeof t=="object"&&t!==null&&!Array.isArray(t)])},enum(...e){chunkN4KTCKOI_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 B([n=>n===null?true:e._validators.every(r=>r(n))],`${t} | null`)},optional(e){let t=e._typeName??"unknown";return B([n=>n===void 0?true:e._validators.every(r=>r(n))],`${t} | undefined`)},union:jt,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){chunkN4KTCKOI_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(o=>o(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 Ot(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 xe(e,t,n,r,i){for(let o of e)t.has(o)||console.warn(`[Directive] ${n} "${o}" not declared in ${r}`);for(let o of t)e.has(o)||console.warn(`[Directive] ${r}["${o}"] ${i}`);}function Ft(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 _t(e,t){let n=new Set(Object.keys(t));for(let[r,i]of Object.entries(e)){let o=i;typeof o.requirement=="string"&&!n.has(o.requirement)&&console.warn(`[Directive] Resolver "${r}" references unknown requirement type "${o.requirement}". Available types: ${[...n].join(", ")||"(none)"}`);}}function It(e,t){let n=t.schema?.facts??{},r=Object.keys(n);if(r.length===0)return;let i=new Set(["self","prev","current"]),o="crossModuleDeps"in t&&t.crossModuleDeps?Object.keys(t.crossModuleDeps):[];for(let s of o)i.add(s);for(let s of r)if(i.has(s))throw new Error(`[Directive] module '${e}': fact key '${s}' conflicts with a reserved namespace pivot or evaluation alias (self / prev / current / a crossModuleDep namespace). Three fixes: | ||
| 1. Rename the fact (e.g. ${s}_) | ||
| 2. Remove '${s}' from this module's crossModuleDeps if it's not actually needed | ||
| 3. Move the fact under a wrapping namespace (t.object({ inner: ... }))`)}function qt(e,t){let n=t.constraints;if(n)for(let[r,i]of Object.entries(n)){let o=i?.owns;if(o){for(let s of o)if(chunkN4KTCKOI_cjs.l.has(s)||s.startsWith("$"))throw new Error(`[Directive] module '${e}' constraint '${r}': owns key '${s}' is reserved (BLOCKED_PROPS or $-prefixed)`)}}}function Nt(e,t){Ot(e),t.schema?t.schema.facts||console.warn("[Directive] Module schema.facts is required"):console.warn("[Directive] Module schema is required"),xe(new Set(Object.keys(t.derive??{})),new Set(Object.keys(t.schema?.derivations??{})),"Derivation","schema.derivations","has no matching implementation in derive"),xe(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&&Ft(t.history.snapshotEvents,t.schema?.events??{}),t.resolvers&&t.schema?.requirements&&_t(t.resolvers,t.schema.requirements);}function Ce(e,t){It(e,t),qt(e,t),chunkN4KTCKOI_cjs.a&&Nt(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 Lt(e){return t=>Ce(t,e)}function ue(){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,u){let l=a.get(u);return l||(l=new Set,a.set(u,l)),l}function r(a){let u=e.pending.get(a)??new Set,l=e.inflight.get(a)??new Set,d=e.failed.get(a)??new Set,f=e.errors.get(a)??null;return {pending:u.size,inflight:l.size,failed:d.size,isLoading:u.size>0||l.size>0,hasError:d.size>0,lastError:f}}function i(){let a=new Set([...e.pending.keys(),...e.inflight.keys(),...e.failed.keys()]),u=new Map;for(let l of a)u.set(l,r(l));return u}function o(a){return e.listeners.add(a),()=>e.listeners.delete(a)}function s(){e.pending.clear(),e.inflight.clear(),e.failed.clear(),e.errors.clear(),t();}return {plugin:{name:"requirement-status",onRequirementCreated(a){let u=a.requirement.type;n(e.pending,u).add(a.id),e.failed.get(u)?.delete(a.id),t();},onResolverStart(a,u){let l=u.requirement.type;e.pending.get(l)?.delete(u.id),n(e.inflight,l).add(u.id),t();},onResolverComplete(a,u){let l=u.requirement.type;e.inflight.get(l)?.delete(u.id),e.pending.get(l)?.delete(u.id),t();},onResolverError(a,u,l){let d=u.requirement.type;e.inflight.get(d)?.delete(u.id),n(e.failed,d).add(u.id),e.errors.set(d,l instanceof Error?l:new Error(String(l))),t();},onResolverCancel(a,u){let l=u.requirement.type;e.pending.get(l)?.delete(u.id),e.inflight.get(l)?.delete(u.id),t();},onRequirementMet(a){let u=a.requirement.type;e.pending.get(u)?.delete(a.id),e.inflight.get(u)?.delete(a.id),t();}},getStatus:r,getAllStatus:i,subscribe:o,reset:s}}function Bt(e){return t=>e.getStatus(t)}function Wt(e){let t=ue(),r=[...e.plugins??[],t.plugin];return {system:chunk2OS4RCLV_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 je(){return {now:()=>Date.now(),setTimeout:(e,t)=>{let n=globalThis.setTimeout(e,t);return ()=>globalThis.clearTimeout(n)}}}function Ut(e=0){let t=e,n=0,r=[];return {now:()=>t,setTimeout:(i,o)=>{let s={id:n++,deadlineMs:t+o,cb:i,canceled:false};return r.push(s),()=>{s.canceled=true;}},advanceBy:i=>{let o=t+i;for(;;){let s=r.filter(a=>!a.canceled&&a.deadlineMs<=o).sort((a,u)=>a.deadlineMs!==u.deadlineMs?a.deadlineMs-u.deadlineMs:a.id-u.id);if(s.length===0)break;let c=s[0];t=Math.max(t,c.deadlineMs),c.canceled=true,c.cb();}t=Math.max(t,o);}}}function Kt(){return je()}function ce(){return {startedAtMs:null,pausedDurationMs:0,pausedAtMs:null,status:"idle",repeats:0}}function W(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 Pe(e,t,n){return Math.max(0,n-W(e,t))}function Oe(e,t){return e.status==="running"||e.status==="paused"?e:{...e,startedAtMs:t,pausedDurationMs:0,pausedAtMs:null,status:"running",repeats:0}}function Fe(e,t){return e.status!=="running"?e:{...e,pausedAtMs:t,status:"paused"}}function _e(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 Ie(){return ce()}function qe(e){return {...e,status:"completed"}}function Ne(e,t){return e.startedAtMs===null||e.status==="paused"?e:{...e,startedAtMs:e.startedAtMs+t,pausedDurationMs:0,pausedAtMs:null,repeats:e.repeats+1}}function Le(e,t,n){if(e.status!=="running")return {kind:"no-op"};let r=W(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 zt(e){return {initial:ce,start:Oe,pause:Fe,resume:_e,reset:Ie,complete:qe,registerRepeat:t=>Ne(t,e.ms),tick:(t,n)=>Le(t,n,e),elapsedMs:W,remainingMs:(t,n)=>Pe(t,n,e.ms)}}var $n={None:"none",Linear:"linear",Exponential:"exponential"};Object.defineProperty(exports,"createSystem",{enumerable:true,get:function(){return chunk2OS4RCLV_cjs.a}});Object.defineProperty(exports,"DirectiveError",{enumerable:true,get:function(){return chunkWIZHZF4G_cjs.q}});Object.defineProperty(exports,"RequirementSet",{enumerable:true,get:function(){return chunkWIZHZF4G_cjs.D}});Object.defineProperty(exports,"applyPatch",{enumerable:true,get:function(){return chunkWIZHZF4G_cjs.o}});Object.defineProperty(exports,"evaluateKeySelector",{enumerable:true,get:function(){return chunkWIZHZF4G_cjs.n}});Object.defineProperty(exports,"evaluatePredicate",{enumerable:true,get:function(){return chunkWIZHZF4G_cjs.h}});Object.defineProperty(exports,"evaluatePredicateExplained",{enumerable:true,get:function(){return chunkWIZHZF4G_cjs.i}});Object.defineProperty(exports,"evaluateTemplate",{enumerable:true,get:function(){return chunkWIZHZF4G_cjs.l}});Object.defineProperty(exports,"extractDeps",{enumerable:true,get:function(){return chunkWIZHZF4G_cjs.k}});Object.defineProperty(exports,"extractTemplateKeys",{enumerable:true,get:function(){return chunkWIZHZF4G_cjs.m}});Object.defineProperty(exports,"forType",{enumerable:true,get:function(){return chunkWIZHZF4G_cjs.C}});Object.defineProperty(exports,"generateRequirementId",{enumerable:true,get:function(){return chunkWIZHZF4G_cjs.z}});Object.defineProperty(exports,"isNamespacedSystem",{enumerable:true,get:function(){return chunkWIZHZF4G_cjs.w}});Object.defineProperty(exports,"isPredicate",{enumerable:true,get:function(){return chunkWIZHZF4G_cjs.d}});Object.defineProperty(exports,"isRequirementType",{enumerable:true,get:function(){return chunkWIZHZF4G_cjs.B}});Object.defineProperty(exports,"isSingleModuleSystem",{enumerable:true,get:function(){return chunkWIZHZF4G_cjs.v}});Object.defineProperty(exports,"isTemplate",{enumerable:true,get:function(){return chunkWIZHZF4G_cjs.f}});Object.defineProperty(exports,"memoizePredicate",{enumerable:true,get:function(){return chunkWIZHZF4G_cjs.j}});Object.defineProperty(exports,"req",{enumerable:true,get:function(){return chunkWIZHZF4G_cjs.A}});Object.defineProperty(exports,"typedConstraint",{enumerable:true,get:function(){return chunkWIZHZF4G_cjs.t}});Object.defineProperty(exports,"typedResolver",{enumerable:true,get:function(){return chunkWIZHZF4G_cjs.u}});Object.defineProperty(exports,"validatePredicate",{enumerable:true,get:function(){return chunkWIZHZF4G_cjs.g}});Object.defineProperty(exports,"diffSnapshots",{enumerable:true,get:function(){return chunkEOLY64E6_cjs.j}});Object.defineProperty(exports,"isSignedSnapshot",{enumerable:true,get:function(){return chunkEOLY64E6_cjs.k}});Object.defineProperty(exports,"isSnapshotExpired",{enumerable:true,get:function(){return chunkEOLY64E6_cjs.h}});Object.defineProperty(exports,"shallowEqual",{enumerable:true,get:function(){return chunkEOLY64E6_cjs.f}});Object.defineProperty(exports,"signSnapshot",{enumerable:true,get:function(){return chunkEOLY64E6_cjs.l}});Object.defineProperty(exports,"validateSnapshot",{enumerable:true,get:function(){return chunkEOLY64E6_cjs.i}});Object.defineProperty(exports,"verifySnapshotSignature",{enumerable:true,get:function(){return chunkEOLY64E6_cjs.m}});exports.Backoff=$n;exports.MAX_REPLAY_FRAMES=R;exports.MAX_SWEEP_POINTS=Z;exports.completeTimer=qe;exports.createModule=Ce;exports.createModuleFactory=Lt;exports.createRequirementStatusPlugin=ue;exports.createStatusHook=Bt;exports.createSystemWithStatus=Wt;exports.defaultClock=Kt;exports.diffClauses=Te;exports.diffRules=wt;exports.elapsedMs=W;exports.flattenPredicate=M;exports.framesFromHistory=me;exports.framesFromSnapshots=Q;exports.initialTimerState=ce;exports.pauseTimer=Fe;exports.predicateToMongo=Rt;exports.predicateToPostgrest=Ct;exports.predicateToSQL=St;exports.predicateToWhere=vt;exports.realClock=je;exports.registerRepeat=Ne;exports.remainingMs=Pe;exports.replayUnder=N;exports.resetTimer=Ie;exports.resumeTimer=_e;exports.startTimer=Oe;exports.sweepUnder=ft;exports.t=Pt;exports.tickTimer=Le;exports.timerOps=zt;exports.toReplayFrames=he;exports.toRulesMap=Y;exports.virtualClock=Ut;//# sourceMappingURL=index.cjs.map | ||
| 'use strict';var chunk4VZOZWXM_cjs=require('./chunk-4VZOZWXM.cjs'),chunkEX3XG667_cjs=require('./chunk-EX3XG667.cjs'),chunk7NMXRATK_cjs=require('./chunk-7NMXRATK.cjs'),chunkN4KTCKOI_cjs=require('./chunk-N4KTCKOI.cjs'),chunkEOLY64E6_cjs=require('./chunk-EOLY64E6.cjs');var R=1e6;function ye(e,t){try{chunk7NMXRATK_cjs.k(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(!chunk7NMXRATK_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(chunk7NMXRATK_cjs.i(e,{operator(r,i){n===void 0&&i.startsWith("$")&&!chunk7NMXRATK_cjs.a.has(i)&&(n=i);},strayOperatorKey(r){n===void 0&&!chunk7NMXRATK_cjs.a.has(r)&&!chunk7NMXRATK_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: ${[...chunk7NMXRATK_cjs.a].join(", ")}`)}function we(e){if(e&&typeof e=="object"&&!Array.isArray(e)&&Array.isArray(e.snapshots))return $e(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>R)throw new Error(`[Directive] toReplayFrames: history has ${t.length} frames, exceeds the MAX_REPLAY_FRAMES limit (${R}) \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 $e(e){let t=typeof e=="string"?JSON.parse(e):e;if(Array.isArray(t))return X(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 X(n.snapshots)}function X(e){if(!Array.isArray(e))throw new Error("[Directive] framesFromSnapshots: expected an array of fact-state snapshots");if(e.length>R)throw new Error(`[Directive] framesFromSnapshots: history has ${e.length} snapshots, exceeds the MAX_REPLAY_FRAMES limit (${R}) \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 we(e)}function L(e){let{frames:t,original:n,proposed:r,entityKey:i}=e,s=e.maxSamples??20,o=s>0?s:0;if(t.length>R)throw new Error(`[Directive] replayUnder: history has ${t.length} frames, exceeds the MAX_REPLAY_FRAMES limit (${R}) \u2014 split or down-sample the history`);ye(n,"original"),ye(r,"proposed");let c=0,a=0,u=0,l=0,d=0,f=[],g=[],m=i?new Set:void 0,h=i?new Set:void 0,k;for(let P of t){let $=P.facts,v=chunk7NMXRATK_cjs.m(n,$,k),M=chunk7NMXRATK_cjs.m(r,$,k);v&&(c++,m?.add($[i])),M&&(a++,h?.add($[i])),v===M?d++:!v&&M?(u++,f.length<o&&f.push(me(P,n,r,k))):(l++,g.length<o&&g.push(me(P,n,r,k))),k=$;}let E={framesEvaluated:t.length,original:{matched:c},proposed:{matched:a},delta:a-c,newMatchCount:u,lostMatchCount:l,unchanged:d,newMatches:f,lostMatches:g};return m&&h&&(E.original.matchedEntities=m.size,E.proposed.matchedEntities=h.size),E}function me(e,t,n,r){let i=e.facts,s={frameId:e.id,facts:i,originalExplain:chunk7NMXRATK_cjs.n(t,i,r),proposedExplain:chunk7NMXRATK_cjs.n(n,i,r)};return e.timestamp!==void 0&&(s.timestamp=e.timestamp),s}var Y=1e4,be=5e7;function vt(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)&&Object.keys(e).length===1&&typeof e.$hole=="string"}function G(e,t,n=new Set,r=0){if(r>chunk7NMXRATK_cjs.g)throw new Error(`[Directive] sweepUnder: template exceeds MAX_PREDICATE_DEPTH (${chunk7NMXRATK_cjs.g}) \u2014 flatten the template or split the sweep`);if(vt(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=>G(s,t,n,r+1));let i={};for(let[s,o]of Object.entries(e))i[s]=G(o,t,n,r+1);return i}finally{n.delete(e);}}function*Te(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 Te(r,t))yield {[n]:s,...o};}function kt(e){let t=1;for(let n of Object.values(e))t*=n.length;return t}function Mt(e){let{frames:t,original:n,template:r,sweep:i,objective:s=$=>$.proposed.matched,entityKey:o,maxSamples:c=0}=e,a=Object.keys(i);if(a.length===0)throw new Error("[Directive] sweepUnder: `sweep` must contain at least one hole name");let u=kt(i);if(u>Y)throw new Error(`[Directive] sweepUnder: grid has ${u} points, exceeds the MAX_SWEEP_POINTS limit (${Y}) \u2014 narrow the sweep ranges or split the run`);if(u===0)throw new Error("[Directive] sweepUnder: at least one hole has zero candidate values");let l=u*t.length;if(l>be)throw new Error(`[Directive] sweepUnder: ${u} points \xD7 ${t.length} frames = ${l} per-frame evaluations, exceeds the MAX_SWEEP_EVALUATIONS limit (${be}) \u2014 narrow the sweep, down-sample the history, or split the run`);let d=false,f=$=>{let v;try{v=s($);}catch(M){return d||(d=true,console.warn(`[Directive] sweepUnder: objective threw \u2014 point will not rank (${M.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},g=L({frames:t,original:n,proposed:n,entityKey:o,maxSamples:c}),m={values:{},report:g,score:f(g)},h=[],k=0,E=Number.NEGATIVE_INFINITY;for(let $ of Te(a,i)){let v=G(r,$),M=L({frames:t,original:n,proposed:v,entityKey:o,maxSamples:c}),H=f(M);H>E&&(E=H,k=h.length),h.push({values:$,report:M,score:H});}let P=h[k];return {points:h,bestIndex:k,best:P,baseline:m}}function V(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 Dt=new Set(["$eq","$ne","$in","$nin","$exists","$gt","$gte","$lt","$lte","$between","$matches","$startsWith","$endsWith","$contains","$changed"]),Rt=new Set(["$all","$any","$not"]);function Se(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Et(e){if(!Se(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;Dt.has(r)&&(n=true);}return n}function T(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)=>{T(i,`${t}$all[${s}]`,n);}),n;if("$any"in e&&Array.isArray(e.$any))return e.$any.forEach((i,s)=>{T(i,`${t}$any[${s}]`,n);}),n;if("$not"in e)return T(e.$not,`${t}$not`,n),n;for(let[r,i]of Object.entries(e)){let s=t?`${t}.${r}`:r;if(Et(i))for(let[o,c]of Object.entries(i))n.push({path:s,op:o,value:c});else Se(i)&&!Rt.has(r)?T(i,s,n):n.push({path:s,op:"$eq",value:i});}return n}function D(e){return typeof e=="number"&&Number.isFinite(e)}function xt(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 At(e){let t=V(e.before),n=V(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 c of i){let a=t[c],u=n[c],l=c in t,d=c in n;if(l&&!d){let g=T(a),m=g.length===0?[{path:"(function-form predicate)",kind:"removed"}]:g.map(h=>({path:h.path,kind:"removed",before:{op:h.op,value:h.value}}));ee(m),s.push({id:c,status:"removed",changes:m}),o.removed++,o.totalClauseChanges+=m.length;continue}if(!l&&d){let g=T(u),m=g.length===0?[{path:"(function-form predicate)",kind:"added"}]:g.map(h=>({path:h.path,kind:"added",after:{op:h.op,value:h.value}}));ee(m),s.push({id:c,status:"added",changes:m}),o.added++,o.totalClauseChanges+=m.length;continue}let f=ve(a,u);f.length===0?(s.push({id:c,status:"unchanged",changes:[]}),o.unchanged++):(s.push({id:c,status:"changed",changes:f}),o.changed++,o.totalClauseChanges+=f.length);}return {constraints:s,summary:o}}function ve(e,t){if(e!==void 0&&t!==void 0&&(e===null||t===null||typeof e!="object"||typeof t!="object"))return chunkEOLY64E6_cjs.d(e)===chunkEOLY64E6_cjs.d(t)?[]:[{path:"",kind:"changed",before:{op:"$eq",value:e},after:{op:"$eq",value:t}}];let n=e===void 0?[]:T(e),r=t===void 0?[]:T(t),i=u=>`${u.path}::${u.op}`,s=new Map(n.map(u=>[i(u),u])),o=new Map(r.map(u=>[i(u),u])),c=new Set([...s.keys(),...o.keys()]),a=[];for(let u of c){let l=s.get(u),d=o.get(u);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(chunkEOLY64E6_cjs.d(l.value)===chunkEOLY64E6_cjs.d(d.value))continue;let f=xt(l.op,l.value,d.value);a.push({path:l.path,kind:f??"changed",before:{op:l.op,value:l.value},after:{op:d.op,value:d.value}});}}return ee(a),a}function ee(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 B(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 Ct(e){let t=e.path,n=B(e.expected),r=B(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 ${B(e.expected[0])} and ${B(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 ke(e,t){for(let n of e)if(!n.pass){if((n.op==="$all"||n.op==="$any"||n.op==="$not")&&n.children){ke(n.children,t);continue}t.push({path:n.path,op:n.op,expected:n.expected,actual:n.actual,suggestion:Ct(n)});}}function Pt(e,t,n){let r=chunk7NMXRATK_cjs.n(e,t,n),i=r.every(o=>o.pass),s=[];return i||ke(r,s),{wouldFire:i,whenExplain:r,missingChanges:s,predicate:e}}var Me=new Set(["$eq","$ne","$gt","$gte","$lt","$lte","$in","$nin"]);function W(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 F(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(!F(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(!F(e[i],t[i]))return false;return true}function jt(e,t){if(!Me.has(e.op)||!Me.has(t.op))return {type:"overlap",reason:`Both rules touch "${e.path}".`};if(e.op==="$eq"&&t.op==="$eq")return F(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 F(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 F(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:[]),c=new Set(Array.isArray(t.value)?t.value:[]),a=[...o].filter(u=>c.has(u));return a.length===0?{type:"direct",reason:`Candidate $in set for ${e.path} (${JSON.stringify([...o])}) and existing $in set (${JSON.stringify([...c])}) have no values in common \u2014 the candidate can never fire while the existing rule holds.`}:a.length===o.size&&a.length<c.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=W(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=W(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=W(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=W(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 Ot(e){return typeof e=="object"&&e!==null&&typeof e.id=="string"}var Ft={checkAgainst(e,t){let n=Array.isArray(t)?t:"constraints"in t&&Array.isArray(t.constraints)?t.constraints:[],r=T(e);if(r.length===0)return {contradictions:[],warnings:[]};let i=new Map;for(let c of r){let a=i.get(c.path)??[];a.push(c),i.set(c.path,a);}let s=[],o=[];for(let c of n){if(!Ot(c)||c.whenSpec===void 0)continue;let a=T(c.whenSpec);for(let u of a){let l=i.get(u.path);if(l)for(let d of l){let f=jt(d,u);if(!f)continue;let g={constraintId:c.id,type:f.type,reason:f.reason,candidatePath:d.path,candidate:{op:d.op,value:d.value},existing:{op:u.op,value:u.value}};f.type==="overlap"?o.push(g):s.push(g);}}}return {contradictions:s,warnings:o}}};var _t=/^[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)?$/;function N(e,t){if(typeof e!="string"||!_t.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 De(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 Nt(e){if(Array.isArray(e)){if(e.length===0)throw new Error("[Directive] predicateToSQL: select must not be empty");for(let n of e)N(n,"column");return e.join(", ")}let t=e;return t==="*"?"*":(N(t,"column"),t)}function w(e,t){return e.params.push(t),e.placeholder(e.params.length)}function te(e,t,n,r){switch(t){case "$eq":return `${e} = ${w(r,n)}`;case "$ne":return `${e} <> ${w(r,n)}`;case "$gt":return `${e} > ${w(r,n)}`;case "$gte":return `${e} >= ${w(r,n)}`;case "$lt":return `${e} < ${w(r,n)}`;case "$lte":return `${e} <= ${w(r,n)}`;case "$in":if(!Array.isArray(n))throw new Error("[Directive] predicateToSQL: $in operand must be an array");return `${e} = ANY(${w(r,n)})`;case "$nin":if(!Array.isArray(n))throw new Error("[Directive] predicateToSQL: $nin operand must be an array");return `NOT (${e} = ANY(${w(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 ${w(r,n[0])} AND ${w(r,n[1])}`}case "$startsWith":if(typeof n!="string")throw new Error("[Directive] predicateToSQL: $startsWith operand must be a string");return `${e} LIKE ${w(r,ne(n))} || '%' ESCAPE '\\'`;case "$endsWith":if(typeof n!="string")throw new Error("[Directive] predicateToSQL: $endsWith operand must be a string");return `${e} LIKE '%' || ${w(r,ne(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 '%' || ${w(r,ne(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} ${w(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: ${[...chunk7NMXRATK_cjs.a].join(", ")}`)}}function ne(e){return e.replace(/[\\%_]/g,"\\$&")}function Re(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function qt(e){if(!Re(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 re(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 _(e,t,n){if(n>chunk7NMXRATK_cjs.g)throw new Error(`[Directive] predicateToSQL: predicate depth limit (${chunk7NMXRATK_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 N(o.fact,"column"),De(o.fact,t.allowed),te(o.fact,o.op,o.value,t)});return i.length===1?i[0]:`(${i.join(" AND ")})`}if("$all"in e){re(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=>_(o,t,n+1));return s.length===1?s[0]:`(${s.join(" AND ")})`}if("$any"in e){re(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=>_(o,t,n+1));return s.length===1?s[0]:`(${s.join(" OR ")})`}if("$not"in e){re(e,"$not");let i=e.$not;return `NOT (${_(i,t,n+1)})`}let r=[];for(let[i,s]of Object.entries(e))if(N(i,"column"),De(i,t.allowed),qt(s))for(let[o,c]of Object.entries(s)){if(!chunk7NMXRATK_cjs.a.has(o))throw new Error(`[Directive] predicateToSQL: unknown operator "${o}" on column "${i}" \u2014 known: ${[...chunk7NMXRATK_cjs.a].join(", ")}`);r.push(te(i,o,c,t));}else {if(Re(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(te(i,"$eq",s,t));}return r.length===0?"TRUE":r.length===1?r[0]:`(${r.join(" AND ")})`}var Ee=e=>`$${e}`;function It(e,t){let{table:n,allowedKeys:r}=t,i=t.placeholder??Ee,s=t.select??"*";N(n,"table");let o=Nt(s),c={params:[],placeholder:i,allowed:r},a=_(e,c,0);return {sql:`SELECT ${o} FROM ${n} WHERE ${a}`,where:a,params:c.params}}function Lt(e,t={}){let n=t.placeholder??Ee,r={params:[],placeholder:n,allowed:t.allowedKeys};return {where:_(e,r,0),params:r.params}}function ie(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function se(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Bt(e){if(!se(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 Wt=/^[A-Za-z_][A-Za-z0-9_]*$/,Kt=/^[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*$/;function xe(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?Kt:Wt).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 Ae(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 oe(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 Ce(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:`^${ie(t)}`};case "$endsWith":if(typeof t!="string")throw new Error("[Directive] predicateToMongo: $endsWith operand must be a string");return {$regex:`${ie(t)}$`};case "$contains":if(typeof t=="string")return {$regex:ie(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: ${[...chunk7NMXRATK_cjs.a].join(", ")}`)}}function A(e,t,n){if(n>chunk7NMXRATK_cjs.g)throw new Error(`[Directive] predicateToMongo: predicate depth limit (${chunk7NMXRATK_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 c=o;xe(c.fact,t),Ae(c.fact,t.allowedKeys);let a=Ce(c.op,c.value);if(c.fact in i&&se(i[c.fact])){let u=i[c.fact];Object.keys(a).some(d=>d in u)?s.push({[c.fact]:a}):i[c.fact]={...u,...a};}else c.fact in i?s.push({[c.fact]:a}):i[c.fact]=a;}if(s.length>0){let o=[];for(let[c,a]of Object.entries(i))o.push({[c]:a});return o.push(...s),{$and:o}}return i}if("$all"in e){oe(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?A(i[0],t,n+1):{$and:i.map(s=>A(s,t,n+1))}}if("$any"in e){oe(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?A(i[0],t,n+1):{$or:i.map(s=>A(s,t,n+1))}}if("$not"in e){oe(e,"$not");let i=e.$not;return {$nor:[A(i,t,n+1)]}}let r={};for(let[i,s]of Object.entries(e))if(xe(i,t),Ae(i,t.allowedKeys),Bt(s)){let o={};for(let[c,a]of Object.entries(s)){if(!chunk7NMXRATK_cjs.a.has(c))throw new Error(`[Directive] predicateToMongo: unknown operator "${c}" on field "${i}" \u2014 known: ${[...chunk7NMXRATK_cjs.a].join(", ")}`);Object.assign(o,Ce(c,a));}r[i]=o;}else r[i]=s;return r}function Ut(e,t={}){return A(e,t,0)}var zt=/^[A-Za-z_][A-Za-z0-9_]*$/;function Pe(e,t){if(typeof e!="string"||!zt.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 ae(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 S(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 je(e){return `(${e.map(S).join(",")})`}function ue(e){return e.replace(/[\\%_*]/g,"\\$&")}function C(e,t){switch(e){case "$eq":return `eq.${S(t)}`;case "$ne":return `neq.${S(t)}`;case "$gt":return `gt.${S(t)}`;case "$gte":return `gte.${S(t)}`;case "$lt":return `lt.${S(t)}`;case "$lte":return `lte.${S(t)}`;case "$in":if(!Array.isArray(t))throw new Error("[Directive] predicateToPostgrest: $in operand must be an array");return `in.${je(t)}`;case "$nin":if(!Array.isArray(t))throw new Error("[Directive] predicateToPostgrest: $nin operand must be an array");return `not.in.${je(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.${S(ue(t)+"*")}`;case "$endsWith":if(typeof t!="string")throw new Error("[Directive] predicateToPostgrest: $endsWith operand must be a string");return `like.${S("*"+ue(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.${S("*"+ue(t)+"*")}`;case "$matches":if(t instanceof RegExp)return `${t.flags.includes("i")?"imatch":"match"}.${S(t.source)}`;if(typeof t=="string")return `match.${S(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: ${[...chunk7NMXRATK_cjs.a].join(", ")}`)}}function Oe(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Ht(e){if(!Oe(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 ce(e,t){return `${e}=${t}`}function K(e,t){return `${e}=(${t.join(",")})`}function le(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?ce(e,C("$gte",n[0])):`${e}.${C("$gte",n[0])}`,s=r?ce(e,C("$lte",n[1])):`${e}.${C("$lte",n[1])}`;return [i,s]}return [r?ce(e,C(t,n)):`${e}.${C(t,n)}`]}function q(e,t,n,r){if(r>chunk7NMXRATK_cjs.g)throw new Error(`[Directive] predicateToPostgrest: predicate depth limit (${chunk7NMXRATK_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 c=o;Pe(c.fact,t),s.push(...le(c.fact,c.op,c.value,n));}return s}if("$all"in e){ae(e,"$all");let s=e.$all;if(!Array.isArray(s))throw new Error("[Directive] predicateToPostgrest: $all must be an array");if(n){let c=[];for(let a of s)c.push(...q(a,t,true,r+1));return c}let o=[];for(let c of s)o.push(...q(c,t,false,r+1));return [K("and",o)]}if("$any"in e){ae(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"]:[K("and",["id.is.null","id.not.is.null"])];let o=[];for(let c of s)o.push(...q(c,t,false,r+1));return [K("or",o)]}if("$not"in e){ae(e,"$not");let s=e.$not,o=q(s,t,false,r+1);return [K("not.and",o)]}let i=[];for(let[s,o]of Object.entries(e))if(Pe(s,t),Ht(o))for(let[c,a]of Object.entries(o)){if(!chunk7NMXRATK_cjs.a.has(c))throw new Error(`[Directive] predicateToPostgrest: unknown operator "${c}" on column "${s}" \u2014 known: ${[...chunk7NMXRATK_cjs.a].join(", ")}`);i.push(...le(s,c,a,n));}else {if(Oe(o))throw new Error(`[Directive] predicateToPostgrest: nested predicate at "${s}" \u2014 single-table queries only`);i.push(...le(s,"$eq",o,n));}return i}function Qt(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 Jt(e,t={}){let n=t.mode??"querystring",r=q(e,t.allowedKeys,true,0);return r.length===0?"":n==="raw"?r.join("&"):r.map(Qt).join("&")}function U(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(c){return U([...e,c],t,n,r,i,s,o)}}}function p(e,t,n,r,i,s,o){return {...U(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,u){let l=[...s??[],{predicate:a,message:u}];return p([...e,a],t,n,r,i,l,o)},nullable(){return p([a=>a===null||e.every(u=>u(a))],`${t} | null`,n,r,i,void 0,o)},optional(){return p([a=>a===void 0||e.every(u=>u(a))],`${t} | undefined`,n,r,i,void 0,o)},meta(a){return p(e,t,n,r,i,s,a)}}}var Zt=((...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(" | "))}),Xt={string(){let e=(t,n,r,i,s,o)=>({...p(t,"string",n,r,i,s,o),minLength(a){return e([...t,u=>u.length>=a],n,r,i,s,o)},maxLength(a){return e([...t,u=>u.length<=a],n,r,i,s,o)},pattern(a){return e([...t,u=>a.test(u)],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,u){let l=[...s??[],{predicate:a,message:u}];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,u=>u>=a],n,r,i,s,o)},max(a){return e([...t,u=>u<=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,u){let l=[...s??[],{predicate:a,message:u}];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 c=p(t,"array",r,void 0,i,void 0,o),a=s??{value:-1};return {...c,get _lastFailedIndex(){return a.value},set _lastFailedIndex(l){a.value=l;},of(l){let d={value:-1};return e([...t,f=>{for(let g=0;g<f.length;g++)if(!l._validators.every(m=>m(f[g])))return d.value=g,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,c=>{for(let[a,u]of Object.entries(o)){let l=c[a],d=u;if(d&&!d._validators.every(f=>f(l)))return false}return true}],n,r,i)},nonNull(){return e([...t,o=>o!=null],n,r,i)},hasKeys(...o){return e([...t,c=>o.every(a=>a in c)],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){chunkN4KTCKOI_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 U([n=>n===null?true:e._validators.every(r=>r(n))],`${t} | null`)},optional(e){let t=e._typeName??"unknown";return U([n=>n===void 0?true:e._validators.every(r=>r(n))],`${t} | undefined`)},union:Zt,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){chunkN4KTCKOI_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 Yt(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 Fe(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 Gt(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 Vt(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 en(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 tn(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(chunkN4KTCKOI_cjs.l.has(o)||o.startsWith("$"))throw new Error(`[Directive] module '${e}' constraint '${r}': owns key '${o}' is reserved (BLOCKED_PROPS or $-prefixed)`)}}}function nn(e,t){Yt(e),t.schema?t.schema.facts||console.warn("[Directive] Module schema.facts is required"):console.warn("[Directive] Module schema is required"),Fe(new Set(Object.keys(t.derive??{})),new Set(Object.keys(t.schema?.derivations??{})),"Derivation","schema.derivations","has no matching implementation in derive"),Fe(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&&Gt(t.history.snapshotEvents,t.schema?.events??{}),t.resolvers&&t.schema?.requirements&&Vt(t.resolvers,t.schema.requirements);}function _e(e,t){en(e,t),tn(e,t),chunkN4KTCKOI_cjs.a&&nn(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 rn(e){return t=>_e(t,e)}function de(){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,u){let l=a.get(u);return l||(l=new Set,a.set(u,l)),l}function r(a){let u=e.pending.get(a)??new Set,l=e.inflight.get(a)??new Set,d=e.failed.get(a)??new Set,f=e.errors.get(a)??null;return {pending:u.size,inflight:l.size,failed:d.size,isLoading:u.size>0||l.size>0,hasError:d.size>0,lastError:f}}function i(){let a=new Set([...e.pending.keys(),...e.inflight.keys(),...e.failed.keys()]),u=new Map;for(let l of a)u.set(l,r(l));return u}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 u=a.requirement.type;n(e.pending,u).add(a.id),e.failed.get(u)?.delete(a.id),t();},onResolverStart(a,u){let l=u.requirement.type;e.pending.get(l)?.delete(u.id),n(e.inflight,l).add(u.id),t();},onResolverComplete(a,u){let l=u.requirement.type;e.inflight.get(l)?.delete(u.id),e.pending.get(l)?.delete(u.id),t();},onResolverError(a,u,l){let d=u.requirement.type;e.inflight.get(d)?.delete(u.id),n(e.failed,d).add(u.id),e.errors.set(d,l instanceof Error?l:new Error(String(l))),t();},onResolverCancel(a,u){let l=u.requirement.type;e.pending.get(l)?.delete(u.id),e.inflight.get(l)?.delete(u.id),t();},onRequirementMet(a){let u=a.requirement.type;e.pending.get(u)?.delete(a.id),e.inflight.get(u)?.delete(a.id),t();}},getStatus:r,getAllStatus:i,subscribe:s,reset:o}}function on(e){return t=>e.getStatus(t)}function sn(e){let t=de(),r=[...e.plugins??[],t.plugin];return {system:chunkEX3XG667_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 Ne(){return {now:()=>Date.now(),setTimeout:(e,t)=>{let n=globalThis.setTimeout(e,t);return ()=>globalThis.clearTimeout(n)}}}function an(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,u)=>a.deadlineMs!==u.deadlineMs?a.deadlineMs-u.deadlineMs:a.id-u.id);if(o.length===0)break;let c=o[0];t=Math.max(t,c.deadlineMs),c.canceled=true,c.cb();}t=Math.max(t,s);}}}function un(){return Ne()}function pe(){return {startedAtMs:null,pausedDurationMs:0,pausedAtMs:null,status:"idle",repeats:0}}function z(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 qe(e,t,n){return Math.max(0,n-z(e,t))}function Ie(e,t){return e.status==="running"||e.status==="paused"?e:{...e,startedAtMs:t,pausedDurationMs:0,pausedAtMs:null,status:"running",repeats:0}}function Le(e,t){return e.status!=="running"?e:{...e,pausedAtMs:t,status:"paused"}}function Be(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 We(){return pe()}function Ke(e){return {...e,status:"completed"}}function Ue(e,t){return e.startedAtMs===null||e.status==="paused"?e:{...e,startedAtMs:e.startedAtMs+t,pausedDurationMs:0,pausedAtMs:null,repeats:e.repeats+1}}function ze(e,t,n){if(e.status!=="running")return {kind:"no-op"};let r=z(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 cn(e){return {initial:pe,start:Ie,pause:Le,resume:Be,reset:We,complete:Ke,registerRepeat:t=>Ue(t,e.ms),tick:(t,n)=>ze(t,n,e),elapsedMs:z,remainingMs:(t,n)=>qe(t,n,e.ms)}}var Wn={None:"none",Linear:"linear",Exponential:"exponential"};Object.defineProperty(exports,"createAuditLedger",{enumerable:true,get:function(){return chunk4VZOZWXM_cjs.b}});Object.defineProperty(exports,"memorySink",{enumerable:true,get:function(){return chunk4VZOZWXM_cjs.a}});Object.defineProperty(exports,"createSystem",{enumerable:true,get:function(){return chunkEX3XG667_cjs.a}});Object.defineProperty(exports,"DirectiveError",{enumerable:true,get:function(){return chunk7NMXRATK_cjs.v}});Object.defineProperty(exports,"RequirementSet",{enumerable:true,get:function(){return chunk7NMXRATK_cjs.I}});Object.defineProperty(exports,"applyPatch",{enumerable:true,get:function(){return chunk7NMXRATK_cjs.t}});Object.defineProperty(exports,"evaluateKeySelector",{enumerable:true,get:function(){return chunk7NMXRATK_cjs.s}});Object.defineProperty(exports,"evaluatePredicate",{enumerable:true,get:function(){return chunk7NMXRATK_cjs.m}});Object.defineProperty(exports,"evaluatePredicateExplained",{enumerable:true,get:function(){return chunk7NMXRATK_cjs.n}});Object.defineProperty(exports,"evaluateTemplate",{enumerable:true,get:function(){return chunk7NMXRATK_cjs.q}});Object.defineProperty(exports,"extractDeps",{enumerable:true,get:function(){return chunk7NMXRATK_cjs.p}});Object.defineProperty(exports,"extractTemplateKeys",{enumerable:true,get:function(){return chunk7NMXRATK_cjs.r}});Object.defineProperty(exports,"forType",{enumerable:true,get:function(){return chunk7NMXRATK_cjs.H}});Object.defineProperty(exports,"generateRequirementId",{enumerable:true,get:function(){return chunk7NMXRATK_cjs.E}});Object.defineProperty(exports,"getKind",{enumerable:true,get:function(){return chunk7NMXRATK_cjs.c}});Object.defineProperty(exports,"getOperatorsForKind",{enumerable:true,get:function(){return chunk7NMXRATK_cjs.e}});Object.defineProperty(exports,"getSchemaFieldKinds",{enumerable:true,get:function(){return chunk7NMXRATK_cjs.d}});Object.defineProperty(exports,"isNamespacedSystem",{enumerable:true,get:function(){return chunk7NMXRATK_cjs.B}});Object.defineProperty(exports,"isPredicate",{enumerable:true,get:function(){return chunk7NMXRATK_cjs.h}});Object.defineProperty(exports,"isRequirementType",{enumerable:true,get:function(){return chunk7NMXRATK_cjs.G}});Object.defineProperty(exports,"isSingleModuleSystem",{enumerable:true,get:function(){return chunk7NMXRATK_cjs.A}});Object.defineProperty(exports,"isTemplate",{enumerable:true,get:function(){return chunk7NMXRATK_cjs.j}});Object.defineProperty(exports,"listAllPredicateOperators",{enumerable:true,get:function(){return chunk7NMXRATK_cjs.f}});Object.defineProperty(exports,"memoizePredicate",{enumerable:true,get:function(){return chunk7NMXRATK_cjs.o}});Object.defineProperty(exports,"req",{enumerable:true,get:function(){return chunk7NMXRATK_cjs.F}});Object.defineProperty(exports,"typedConstraint",{enumerable:true,get:function(){return chunk7NMXRATK_cjs.y}});Object.defineProperty(exports,"typedResolver",{enumerable:true,get:function(){return chunk7NMXRATK_cjs.z}});Object.defineProperty(exports,"validatePredicate",{enumerable:true,get:function(){return chunk7NMXRATK_cjs.k}});Object.defineProperty(exports,"validatePredicateAgainstSchema",{enumerable:true,get:function(){return chunk7NMXRATK_cjs.l}});Object.defineProperty(exports,"diffSnapshots",{enumerable:true,get:function(){return chunkEOLY64E6_cjs.j}});Object.defineProperty(exports,"isSignedSnapshot",{enumerable:true,get:function(){return chunkEOLY64E6_cjs.k}});Object.defineProperty(exports,"isSnapshotExpired",{enumerable:true,get:function(){return chunkEOLY64E6_cjs.h}});Object.defineProperty(exports,"shallowEqual",{enumerable:true,get:function(){return chunkEOLY64E6_cjs.f}});Object.defineProperty(exports,"signSnapshot",{enumerable:true,get:function(){return chunkEOLY64E6_cjs.l}});Object.defineProperty(exports,"validateSnapshot",{enumerable:true,get:function(){return chunkEOLY64E6_cjs.i}});Object.defineProperty(exports,"verifySnapshotSignature",{enumerable:true,get:function(){return chunkEOLY64E6_cjs.m}});exports.Backoff=Wn;exports.MAX_REPLAY_FRAMES=R;exports.MAX_SWEEP_POINTS=Y;exports.completeTimer=Ke;exports.createModule=_e;exports.createModuleFactory=rn;exports.createRequirementStatusPlugin=de;exports.createStatusHook=on;exports.createSystemWithStatus=sn;exports.defaultClock=un;exports.diffClauses=ve;exports.diffRules=At;exports.doctor=Ft;exports.elapsedMs=z;exports.flattenPredicate=T;exports.framesFromHistory=$e;exports.framesFromSnapshots=X;exports.initialTimerState=pe;exports.pauseTimer=Le;exports.predicateToMongo=Ut;exports.predicateToPostgrest=Jt;exports.predicateToSQL=It;exports.predicateToWhere=Lt;exports.predict=Pt;exports.realClock=Ne;exports.registerRepeat=Ue;exports.remainingMs=qe;exports.replayUnder=L;exports.resetTimer=We;exports.resumeTimer=Be;exports.startTimer=Ie;exports.sweepUnder=Mt;exports.t=Xt;exports.tickTimer=ze;exports.timerOps=cn;exports.toReplayFrames=we;exports.toRulesMap=V;exports.virtualClock=an;//# sourceMappingURL=index.cjs.map | ||
| //# sourceMappingURL=index.cjs.map |
+4
-4
@@ -1,5 +0,5 @@ | ||
| import {a as a$1}from'./chunk-FCOZCTLY.js';export{a as createSystem}from'./chunk-FCOZCTLY.js';import {h,i,g,d as d$1,e,a as a$2,b,c}from'./chunk-ZE2RY5KP.js';export{q as DirectiveError,D as RequirementSet,o as applyPatch,n as evaluateKeySelector,h as evaluatePredicate,i as evaluatePredicateExplained,l as evaluateTemplate,k as extractDeps,m as extractTemplateKeys,C as forType,z as generateRequirementId,w as isNamespacedSystem,d as isPredicate,B as isRequirementType,v as isSingleModuleSystem,f as isTemplate,j as memoizePredicate,A as req,t as typedConstraint,u as typedResolver,g as validatePredicate}from'./chunk-ZE2RY5KP.js';import {a,l}from'./chunk-TZHC4E6S.js';import {d}from'./chunk-T6IJUWYR.js';export{j as diffSnapshots,k as isSignedSnapshot,h as isSnapshotExpired,f as shallowEqual,l as signSnapshot,i as validateSnapshot,m as verifySnapshotSignature}from'./chunk-T6IJUWYR.js';var R=1e6;function fe(e$1,t){try{g(e$1);}catch(r){let i=r instanceof Error?r.message:String(r);throw new Error(`[Directive] replayUnder: the ${t} predicate is invalid \u2014 ${i}`)}if(!d$1(e$1)){let r=e$1===null||typeof e$1!="object"?`${typeof e$1} \u2014 ${JSON.stringify(e$1)}`:JSON.stringify(e$1).slice(0,80);throw new Error(`[Directive] replayUnder: the ${t} predicate is not a valid FactPredicate (got ${r})`)}let n;if(e(e$1,{operator(r,i){n===void 0&&i.startsWith("$")&&!a$2.has(i)&&(n=i);},strayOperatorKey(r){n===void 0&&!a$2.has(r)&&!b.has(r)&&(n=r);}}),n!==void 0)throw new Error(`[Directive] replayUnder: the ${t} predicate uses an unknown operator "${n}" \u2014 known operators: ${[...a$2].join(", ")}`)}function he(e){if(e&&typeof e=="object"&&!Array.isArray(e)&&Array.isArray(e.snapshots))return me(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>R)throw new Error(`[Directive] toReplayFrames: history has ${t.length} frames, exceeds the MAX_REPLAY_FRAMES limit (${R}) \u2014 split or down-sample the history`);return t.map((n,r)=>{if(n&&typeof n=="object"&&"facts"in n){let i=n,o={id:i.id??`#${r}`,facts:i.facts??{}};return typeof i.timestamp=="number"&&(o.timestamp=i.timestamp),o}return {id:`#${r}`,facts:n??{}}})}function me(e){let t=typeof e=="string"?JSON.parse(e):e;if(Array.isArray(t))return Q(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 Q(n.snapshots)}function Q(e){if(!Array.isArray(e))throw new Error("[Directive] framesFromSnapshots: expected an array of fact-state snapshots");if(e.length>R)throw new Error(`[Directive] framesFromSnapshots: history has ${e.length} snapshots, exceeds the MAX_REPLAY_FRAMES limit (${R}) \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 he(e)}function N(e){let{frames:t,original:n,proposed:r,entityKey:i}=e,o=e.maxSamples??20,s=o>0?o:0;if(t.length>R)throw new Error(`[Directive] replayUnder: history has ${t.length} frames, exceeds the MAX_REPLAY_FRAMES limit (${R}) \u2014 split or down-sample the history`);fe(n,"original"),fe(r,"proposed");let c=0,a=0,u=0,l=0,d=0,f=[],g=[],y=i?new Set:void 0,h$1=i?new Set:void 0,v;for(let C of t){let b=C.facts,S=h(n,b,v),k=h(r,b,v);S&&(c++,y?.add(b[i])),k&&(a++,h$1?.add(b[i])),S===k?d++:!S&&k?(u++,f.length<s&&f.push(ge(C,n,r,v))):(l++,g.length<s&&g.push(ge(C,n,r,v))),v=b;}let E={framesEvaluated:t.length,original:{matched:c},proposed:{matched:a},delta:a-c,newMatchCount:u,lostMatchCount:l,unchanged:d,newMatches:f,lostMatches:g};return y&&h$1&&(E.original.matchedEntities=y.size,E.proposed.matchedEntities=h$1.size),E}function ge(e,t,n,r){let i$1=e.facts,o={frameId:e.id,facts:i$1,originalExplain:i(t,i$1,r),proposedExplain:i(n,i$1,r)};return e.timestamp!==void 0&&(o.timestamp=e.timestamp),o}var Z=1e4,ye=5e7;function dt(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)&&Object.keys(e).length===1&&typeof e.$hole=="string"}function X(e,t,n=new Set,r=0){if(r>c)throw new Error(`[Directive] sweepUnder: template exceeds MAX_PREDICATE_DEPTH (${c}) \u2014 flatten the template or split the sweep`);if(dt(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(o=>X(o,t,n,r+1));let i={};for(let[o,s]of Object.entries(e))i[o]=X(s,t,n,r+1);return i}finally{n.delete(e);}}function*we(e,t){if(e.length===0){yield {};return}let n=e[0],r=e.slice(1),i=t[n]??[];for(let o of i)for(let s of we(r,t))yield {[n]:o,...s};}function pt(e){let t=1;for(let n of Object.values(e))t*=n.length;return t}function ft(e){let{frames:t,original:n,template:r,sweep:i,objective:o=b=>b.proposed.matched,entityKey:s,maxSamples:c=0}=e,a=Object.keys(i);if(a.length===0)throw new Error("[Directive] sweepUnder: `sweep` must contain at least one hole name");let u=pt(i);if(u>Z)throw new Error(`[Directive] sweepUnder: grid has ${u} points, exceeds the MAX_SWEEP_POINTS limit (${Z}) \u2014 narrow the sweep ranges or split the run`);if(u===0)throw new Error("[Directive] sweepUnder: at least one hole has zero candidate values");let l=u*t.length;if(l>ye)throw new Error(`[Directive] sweepUnder: ${u} points \xD7 ${t.length} frames = ${l} per-frame evaluations, exceeds the MAX_SWEEP_EVALUATIONS limit (${ye}) \u2014 narrow the sweep, down-sample the history, or split the run`);let d=false,f=b=>{let S;try{S=o(b);}catch(k){return d||(d=true,console.warn(`[Directive] sweepUnder: objective threw \u2014 point will not rank (${k.message})`)),Number.NEGATIVE_INFINITY}return typeof S!="number"||!Number.isFinite(S)?(d||(d=true,console.warn(`[Directive] sweepUnder: objective returned a non-finite number (${String(S)}) \u2014 point will not rank`)),Number.NEGATIVE_INFINITY):S},g=N({frames:t,original:n,proposed:n,entityKey:s,maxSamples:c}),y={values:{},report:g,score:f(g)},h=[],v=0,E=Number.NEGATIVE_INFINITY;for(let b of we(a,i)){let S=X(r,b),k=N({frames:t,original:n,proposed:S,entityKey:s,maxSamples:c}),U=f(k);U>E&&(E=U,v=h.length),h.push({values:b,report:k,score:U});}let C=h[v];return {points:h,bestIndex:v,best:C,baseline:y}}function Y(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 gt=new Set(["$eq","$ne","$in","$nin","$exists","$gt","$gte","$lt","$lte","$between","$matches","$startsWith","$endsWith","$contains","$changed"]),ht=new Set(["$all","$any","$not"]);function be(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function mt(e){if(!be(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;gt.has(r)&&(n=true);}return n}function M(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,o)=>{M(i,`${t}$all[${o}]`,n);}),n;if("$any"in e&&Array.isArray(e.$any))return e.$any.forEach((i,o)=>{M(i,`${t}$any[${o}]`,n);}),n;if("$not"in e)return M(e.$not,`${t}$not`,n),n;for(let[r,i]of Object.entries(e)){let o=t?`${t}.${r}`:r;if(mt(i))for(let[s,c]of Object.entries(i))n.push({path:o,op:s,value:c});else be(i)&&!ht.has(r)?M(i,o,n):n.push({path:o,op:"$eq",value:i});}return n}function D(e){return typeof e=="number"&&Number.isFinite(e)}function yt(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 wt(e){let t=Y(e.before),n=Y(e.after),i=[...new Set([...Object.keys(t),...Object.keys(n)])].sort(),o=[],s={added:0,removed:0,changed:0,unchanged:0,totalClauseChanges:0};for(let c of i){let a=t[c],u=n[c],l=c in t,d=c in n;if(l&&!d){let g=M(a),y=g.length===0?[{path:"(function-form predicate)",kind:"removed"}]:g.map(h=>({path:h.path,kind:"removed",before:{op:h.op,value:h.value}}));J(y),o.push({id:c,status:"removed",changes:y}),s.removed++,s.totalClauseChanges+=y.length;continue}if(!l&&d){let g=M(u),y=g.length===0?[{path:"(function-form predicate)",kind:"added"}]:g.map(h=>({path:h.path,kind:"added",after:{op:h.op,value:h.value}}));J(y),o.push({id:c,status:"added",changes:y}),s.added++,s.totalClauseChanges+=y.length;continue}let f=Te(a,u);f.length===0?(o.push({id:c,status:"unchanged",changes:[]}),s.unchanged++):(o.push({id:c,status:"changed",changes:f}),s.changed++,s.totalClauseChanges+=f.length);}return {constraints:o,summary:s}}function Te(e,t){if(e!==void 0&&t!==void 0&&(e===null||t===null||typeof e!="object"||typeof t!="object"))return d(e)===d(t)?[]:[{path:"",kind:"changed",before:{op:"$eq",value:e},after:{op:"$eq",value:t}}];let n=e===void 0?[]:M(e),r=t===void 0?[]:M(t),i=u=>`${u.path}::${u.op}`,o=new Map(n.map(u=>[i(u),u])),s=new Map(r.map(u=>[i(u),u])),c=new Set([...o.keys(),...s.keys()]),a=[];for(let u of c){let l=o.get(u),d$1=s.get(u);if(l&&!d$1){a.push({path:l.path,kind:"removed",before:{op:l.op,value:l.value}});continue}if(!l&&d$1){a.push({path:d$1.path,kind:"added",after:{op:d$1.op,value:d$1.value}});continue}if(l&&d$1){if(d(l.value)===d(d$1.value))continue;let f=yt(l.op,l.value,d$1.value);a.push({path:l.path,kind:f??"changed",before:{op:l.op,value:l.value},after:{op:d$1.op,value:d$1.value}});}}return J(a),a}function J(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??"",o=n.before?.op??n.after?.op??"";return i.localeCompare(o)});}var bt=/^[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)?$/;function F(e,t){if(typeof e!="string"||!bt.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 $e(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 Tt(e){if(Array.isArray(e)){if(e.length===0)throw new Error("[Directive] predicateToSQL: select must not be empty");for(let n of e)F(n,"column");return e.join(", ")}let t=e;return t==="*"?"*":(F(t,"column"),t)}function w(e,t){return e.params.push(t),e.placeholder(e.params.length)}function G(e,t,n,r){switch(t){case "$eq":return `${e} = ${w(r,n)}`;case "$ne":return `${e} <> ${w(r,n)}`;case "$gt":return `${e} > ${w(r,n)}`;case "$gte":return `${e} >= ${w(r,n)}`;case "$lt":return `${e} < ${w(r,n)}`;case "$lte":return `${e} <= ${w(r,n)}`;case "$in":if(!Array.isArray(n))throw new Error("[Directive] predicateToSQL: $in operand must be an array");return `${e} = ANY(${w(r,n)})`;case "$nin":if(!Array.isArray(n))throw new Error("[Directive] predicateToSQL: $nin operand must be an array");return `NOT (${e} = ANY(${w(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 ${w(r,n[0])} AND ${w(r,n[1])}`}case "$startsWith":if(typeof n!="string")throw new Error("[Directive] predicateToSQL: $startsWith operand must be a string");return `${e} LIKE ${w(r,V(n))} || '%' ESCAPE '\\'`;case "$endsWith":if(typeof n!="string")throw new Error("[Directive] predicateToSQL: $endsWith operand must be a string");return `${e} LIKE '%' || ${w(r,V(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 '%' || ${w(r,V(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} ${w(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$2].join(", ")}`)}}function V(e){return e.replace(/[\\%_]/g,"\\$&")}function Se(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function $t(e){if(!Se(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 ee(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 O(e,t,n){if(n>c)throw new Error(`[Directive] predicateToSQL: predicate depth limit (${c}) 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(o=>{if(!o||typeof o!="object"||!("fact"in o)||!("op"in o))throw new Error("[Directive] predicateToSQL: array-form clause must be { fact, op, value }");let s=o;return F(s.fact,"column"),$e(s.fact,t.allowed),G(s.fact,s.op,s.value,t)});return i.length===1?i[0]:`(${i.join(" AND ")})`}if("$all"in e){ee(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 o=i.map(s=>O(s,t,n+1));return o.length===1?o[0]:`(${o.join(" AND ")})`}if("$any"in e){ee(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 o=i.map(s=>O(s,t,n+1));return o.length===1?o[0]:`(${o.join(" OR ")})`}if("$not"in e){ee(e,"$not");let i=e.$not;return `NOT (${O(i,t,n+1)})`}let r=[];for(let[i,o]of Object.entries(e))if(F(i,"column"),$e(i,t.allowed),$t(o))for(let[s,c]of Object.entries(o)){if(!a$2.has(s))throw new Error(`[Directive] predicateToSQL: unknown operator "${s}" on column "${i}" \u2014 known: ${[...a$2].join(", ")}`);r.push(G(i,s,c,t));}else {if(Se(o))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(G(i,"$eq",o,t));}return r.length===0?"TRUE":r.length===1?r[0]:`(${r.join(" AND ")})`}var ve=e=>`$${e}`;function St(e,t){let{table:n,allowedKeys:r}=t,i=t.placeholder??ve,o=t.select??"*";F(n,"table");let s=Tt(o),c={params:[],placeholder:i,allowed:r},a=O(e,c,0);return {sql:`SELECT ${s} FROM ${n} WHERE ${a}`,where:a,params:c.params}}function vt(e,t={}){let n=t.placeholder??ve,r={params:[],placeholder:n,allowed:t.allowedKeys};return {where:O(e,r,0),params:r.params}}function te(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function re(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Mt(e){if(!re(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 kt=/^[A-Za-z_][A-Za-z0-9_]*$/,Dt=/^[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*$/;function Me(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?Dt:kt).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 ke(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 ne(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 De(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:`^${te(t)}`};case "$endsWith":if(typeof t!="string")throw new Error("[Directive] predicateToMongo: $endsWith operand must be a string");return {$regex:`${te(t)}$`};case "$contains":if(typeof t=="string")return {$regex:te(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$2].join(", ")}`)}}function A(e,t,n){if(n>c)throw new Error(`[Directive] predicateToMongo: predicate depth limit (${c}) 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={},o=[];for(let s of e){if(!s||typeof s!="object"||!("fact"in s)||!("op"in s))throw new Error("[Directive] predicateToMongo: array-form clause must be { fact, op, value }");let c=s;Me(c.fact,t),ke(c.fact,t.allowedKeys);let a=De(c.op,c.value);if(c.fact in i&&re(i[c.fact])){let u=i[c.fact];Object.keys(a).some(d=>d in u)?o.push({[c.fact]:a}):i[c.fact]={...u,...a};}else c.fact in i?o.push({[c.fact]:a}):i[c.fact]=a;}if(o.length>0){let s=[];for(let[c,a]of Object.entries(i))s.push({[c]:a});return s.push(...o),{$and:s}}return i}if("$all"in e){ne(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?A(i[0],t,n+1):{$and:i.map(o=>A(o,t,n+1))}}if("$any"in e){ne(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?A(i[0],t,n+1):{$or:i.map(o=>A(o,t,n+1))}}if("$not"in e){ne(e,"$not");let i=e.$not;return {$nor:[A(i,t,n+1)]}}let r={};for(let[i,o]of Object.entries(e))if(Me(i,t),ke(i,t.allowedKeys),Mt(o)){let s={};for(let[c,a]of Object.entries(o)){if(!a$2.has(c))throw new Error(`[Directive] predicateToMongo: unknown operator "${c}" on field "${i}" \u2014 known: ${[...a$2].join(", ")}`);Object.assign(s,De(c,a));}r[i]=s;}else r[i]=o;return r}function Rt(e,t={}){return A(e,t,0)}var Et=/^[A-Za-z_][A-Za-z0-9_]*$/;function Re(e,t){if(typeof e!="string"||!Et.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 ie(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 $(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 Ee(e){return `(${e.map($).join(",")})`}function oe(e){return e.replace(/[\\%_*]/g,"\\$&")}function x(e,t){switch(e){case "$eq":return `eq.${$(t)}`;case "$ne":return `neq.${$(t)}`;case "$gt":return `gt.${$(t)}`;case "$gte":return `gte.${$(t)}`;case "$lt":return `lt.${$(t)}`;case "$lte":return `lte.${$(t)}`;case "$in":if(!Array.isArray(t))throw new Error("[Directive] predicateToPostgrest: $in operand must be an array");return `in.${Ee(t)}`;case "$nin":if(!Array.isArray(t))throw new Error("[Directive] predicateToPostgrest: $nin operand must be an array");return `not.in.${Ee(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.${$(oe(t)+"*")}`;case "$endsWith":if(typeof t!="string")throw new Error("[Directive] predicateToPostgrest: $endsWith operand must be a string");return `like.${$("*"+oe(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.${$("*"+oe(t)+"*")}`;case "$matches":if(t instanceof RegExp)return `${t.flags.includes("i")?"imatch":"match"}.${$(t.source)}`;if(typeof t=="string")return `match.${$(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$2].join(", ")}`)}}function Ae(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function At(e){if(!Ae(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 se(e,t){return `${e}=${t}`}function L(e,t){return `${e}=(${t.join(",")})`}function ae(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?se(e,x("$gte",n[0])):`${e}.${x("$gte",n[0])}`,o=r?se(e,x("$lte",n[1])):`${e}.${x("$lte",n[1])}`;return [i,o]}return [r?se(e,x(t,n)):`${e}.${x(t,n)}`]}function _(e,t,n,r){if(r>c)throw new Error(`[Directive] predicateToPostgrest: predicate depth limit (${c}) 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 o=[];for(let s of e){if(!s||typeof s!="object"||!("fact"in s)||!("op"in s))throw new Error("[Directive] predicateToPostgrest: array-form clause must be { fact, op, value }");let c=s;Re(c.fact,t),o.push(...ae(c.fact,c.op,c.value,n));}return o}if("$all"in e){ie(e,"$all");let o=e.$all;if(!Array.isArray(o))throw new Error("[Directive] predicateToPostgrest: $all must be an array");if(n){let c=[];for(let a of o)c.push(..._(a,t,true,r+1));return c}let s=[];for(let c of o)s.push(..._(c,t,false,r+1));return [L("and",s)]}if("$any"in e){ie(e,"$any");let o=e.$any;if(!Array.isArray(o))throw new Error("[Directive] predicateToPostgrest: $any must be an array");if(o.length===0)return n?["id=is.null","id=not.is.null"]:[L("and",["id.is.null","id.not.is.null"])];let s=[];for(let c of o)s.push(..._(c,t,false,r+1));return [L("or",s)]}if("$not"in e){ie(e,"$not");let o=e.$not,s=_(o,t,false,r+1);return [L("not.and",s)]}let i=[];for(let[o,s]of Object.entries(e))if(Re(o,t),At(s))for(let[c,a]of Object.entries(s)){if(!a$2.has(c))throw new Error(`[Directive] predicateToPostgrest: unknown operator "${c}" on column "${o}" \u2014 known: ${[...a$2].join(", ")}`);i.push(...ae(o,c,a,n));}else {if(Ae(s))throw new Error(`[Directive] predicateToPostgrest: nested predicate at "${o}" \u2014 single-table queries only`);i.push(...ae(o,"$eq",s,n));}return i}function xt(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 Ct(e,t={}){let n=t.mode??"querystring",r=_(e,t.allowedKeys,true,0);return r.length===0?"":n==="raw"?r.join("&"):r.map(xt).join("&")}function B(e=[],t,n,r,i,o,s){return {_type:void 0,_validators:e,_typeName:t,_default:n,_transform:r,_description:i,_refinements:o,_meta:s,validate(c){return B([...e,c],t,n,r,i,o,s)}}}function p(e,t,n,r,i,o,s){return {...B(e,t,n,r,i,o,s),default(a){return p(e,t,a,r,i,o,s)},transform(a){return p([],t,void 0,l=>{let d=r?r(l):l;return a(d)},i,void 0,s)},brand(){return p(e,`Branded<${t}>`,n,r,i,o,s)},describe(a){return p(e,t,n,r,a,o,s)},refine(a,u){let l=[...o??[],{predicate:a,message:u}];return p([...e,a],t,n,r,i,l,s)},nullable(){return p([a=>a===null||e.every(u=>u(a))],`${t} | null`,n,r,i,void 0,s)},optional(){return p([a=>a===void 0||e.every(u=>u(a))],`${t} | undefined`,n,r,i,void 0,s)},meta(a){return p(e,t,n,r,i,o,a)}}}var jt=((...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(" | "))}),Pt={string(){let e=(t,n,r,i,o,s)=>({...p(t,"string",n,r,i,o,s),minLength(a){return e([...t,u=>u.length>=a],n,r,i,o,s)},maxLength(a){return e([...t,u=>u.length<=a],n,r,i,o,s)},pattern(a){return e([...t,u=>a.test(u)],n,r,i,o,s)},default(a){return e(t,a,r,i,o,s)},describe(a){return e(t,n,r,a,o,s)},refine(a,u){let l=[...o??[],{predicate:a,message:u}];return e([...t,a],n,r,i,l,s)},meta(a){return e(t,n,r,i,o,a)}});return e([t=>typeof t=="string"])},number(){let e=(t,n,r,i,o,s)=>({...p(t,"number",n,r,i,o,s),min(a){return e([...t,u=>u>=a],n,r,i,o,s)},max(a){return e([...t,u=>u<=a],n,r,i,o,s)},default(a){return e(t,a,r,i,o,s)},describe(a){return e(t,n,r,a,o,s)},refine(a,u){let l=[...o??[],{predicate:a,message:u}];return e([...t,a],n,r,i,l,s)},meta(a){return e(t,n,r,i,o,a)}});return e([t=>typeof t=="number"])},boolean(){return p([e=>typeof e=="boolean"],"boolean")},array(){let e=(t,n,r,i,o,s)=>{let c=p(t,"array",r,void 0,i,void 0,s),a=o??{value:-1};return {...c,get _lastFailedIndex(){return a.value},set _lastFailedIndex(l){a.value=l;},of(l){let d={value:-1};return e([...t,f=>{for(let g=0;g<f.length;g++)if(!l._validators.every(y=>y(f[g])))return d.value=g,false;return true}],l,r,i,d,s)},nonEmpty(){return e([...t,l=>l.length>0],n,r,i,a,s)},maxLength(l){return e([...t,d=>d.length<=l],n,r,i,a,s)},minLength(l){return e([...t,d=>d.length>=l],n,r,i,a,s)},default(l){return e(t,n,l,i,a,s)},describe(l){return e(t,n,r,l,a,s)},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(s){return e([...t,c=>{for(let[a,u]of Object.entries(s)){let l=c[a],d=u;if(d&&!d._validators.every(f=>f(l)))return false}return true}],n,r,i)},nonNull(){return e([...t,s=>s!=null],n,r,i)},hasKeys(...s){return e([...t,c=>s.every(a=>a in c)],n,r,i)},default(s){return e(t,s,r,i)},describe(s){return e(t,n,s,i)},meta(s){return e(t,n,r,s)}});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 B([n=>n===null?true:e._validators.every(r=>r(n))],`${t} | null`)},optional(e){let t=e._typeName??"unknown";return B([n=>n===void 0?true:e._validators.every(r=>r(n))],`${t} | undefined`)},union:jt,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(o=>o(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 Ot(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 xe(e,t,n,r,i){for(let o of e)t.has(o)||console.warn(`[Directive] ${n} "${o}" not declared in ${r}`);for(let o of t)e.has(o)||console.warn(`[Directive] ${r}["${o}"] ${i}`);}function Ft(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 _t(e,t){let n=new Set(Object.keys(t));for(let[r,i]of Object.entries(e)){let o=i;typeof o.requirement=="string"&&!n.has(o.requirement)&&console.warn(`[Directive] Resolver "${r}" references unknown requirement type "${o.requirement}". Available types: ${[...n].join(", ")||"(none)"}`);}}function It(e,t){let n=t.schema?.facts??{},r=Object.keys(n);if(r.length===0)return;let i=new Set(["self","prev","current"]),o="crossModuleDeps"in t&&t.crossModuleDeps?Object.keys(t.crossModuleDeps):[];for(let s of o)i.add(s);for(let s of r)if(i.has(s))throw new Error(`[Directive] module '${e}': fact key '${s}' conflicts with a reserved namespace pivot or evaluation alias (self / prev / current / a crossModuleDep namespace). Three fixes: | ||
| 1. Rename the fact (e.g. ${s}_) | ||
| 2. Remove '${s}' from this module's crossModuleDeps if it's not actually needed | ||
| 3. Move the fact under a wrapping namespace (t.object({ inner: ... }))`)}function qt(e,t){let n=t.constraints;if(n)for(let[r,i]of Object.entries(n)){let o=i?.owns;if(o){for(let s of o)if(l.has(s)||s.startsWith("$"))throw new Error(`[Directive] module '${e}' constraint '${r}': owns key '${s}' is reserved (BLOCKED_PROPS or $-prefixed)`)}}}function Nt(e,t){Ot(e),t.schema?t.schema.facts||console.warn("[Directive] Module schema.facts is required"):console.warn("[Directive] Module schema is required"),xe(new Set(Object.keys(t.derive??{})),new Set(Object.keys(t.schema?.derivations??{})),"Derivation","schema.derivations","has no matching implementation in derive"),xe(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&&Ft(t.history.snapshotEvents,t.schema?.events??{}),t.resolvers&&t.schema?.requirements&&_t(t.resolvers,t.schema.requirements);}function Ce(e,t){It(e,t),qt(e,t),a&&Nt(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 Lt(e){return t=>Ce(t,e)}function ue(){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,u){let l=a.get(u);return l||(l=new Set,a.set(u,l)),l}function r(a){let u=e.pending.get(a)??new Set,l=e.inflight.get(a)??new Set,d=e.failed.get(a)??new Set,f=e.errors.get(a)??null;return {pending:u.size,inflight:l.size,failed:d.size,isLoading:u.size>0||l.size>0,hasError:d.size>0,lastError:f}}function i(){let a=new Set([...e.pending.keys(),...e.inflight.keys(),...e.failed.keys()]),u=new Map;for(let l of a)u.set(l,r(l));return u}function o(a){return e.listeners.add(a),()=>e.listeners.delete(a)}function s(){e.pending.clear(),e.inflight.clear(),e.failed.clear(),e.errors.clear(),t();}return {plugin:{name:"requirement-status",onRequirementCreated(a){let u=a.requirement.type;n(e.pending,u).add(a.id),e.failed.get(u)?.delete(a.id),t();},onResolverStart(a,u){let l=u.requirement.type;e.pending.get(l)?.delete(u.id),n(e.inflight,l).add(u.id),t();},onResolverComplete(a,u){let l=u.requirement.type;e.inflight.get(l)?.delete(u.id),e.pending.get(l)?.delete(u.id),t();},onResolverError(a,u,l){let d=u.requirement.type;e.inflight.get(d)?.delete(u.id),n(e.failed,d).add(u.id),e.errors.set(d,l instanceof Error?l:new Error(String(l))),t();},onResolverCancel(a,u){let l=u.requirement.type;e.pending.get(l)?.delete(u.id),e.inflight.get(l)?.delete(u.id),t();},onRequirementMet(a){let u=a.requirement.type;e.pending.get(u)?.delete(a.id),e.inflight.get(u)?.delete(a.id),t();}},getStatus:r,getAllStatus:i,subscribe:o,reset:s}}function Bt(e){return t=>e.getStatus(t)}function Wt(e){let t=ue(),r=[...e.plugins??[],t.plugin];return {system:a$1({module:e.module,plugins:r,trace:e.trace,errorBoundary:e.errorBoundary,tickMs:e.tickMs,zeroConfig:e.zeroConfig,initialFacts:e.initialFacts}),statusPlugin:t}}function je(){return {now:()=>Date.now(),setTimeout:(e,t)=>{let n=globalThis.setTimeout(e,t);return ()=>globalThis.clearTimeout(n)}}}function Ut(e=0){let t=e,n=0,r=[];return {now:()=>t,setTimeout:(i,o)=>{let s={id:n++,deadlineMs:t+o,cb:i,canceled:false};return r.push(s),()=>{s.canceled=true;}},advanceBy:i=>{let o=t+i;for(;;){let s=r.filter(a=>!a.canceled&&a.deadlineMs<=o).sort((a,u)=>a.deadlineMs!==u.deadlineMs?a.deadlineMs-u.deadlineMs:a.id-u.id);if(s.length===0)break;let c=s[0];t=Math.max(t,c.deadlineMs),c.canceled=true,c.cb();}t=Math.max(t,o);}}}function Kt(){return je()}function ce(){return {startedAtMs:null,pausedDurationMs:0,pausedAtMs:null,status:"idle",repeats:0}}function W(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 Pe(e,t,n){return Math.max(0,n-W(e,t))}function Oe(e,t){return e.status==="running"||e.status==="paused"?e:{...e,startedAtMs:t,pausedDurationMs:0,pausedAtMs:null,status:"running",repeats:0}}function Fe(e,t){return e.status!=="running"?e:{...e,pausedAtMs:t,status:"paused"}}function _e(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 Ie(){return ce()}function qe(e){return {...e,status:"completed"}}function Ne(e,t){return e.startedAtMs===null||e.status==="paused"?e:{...e,startedAtMs:e.startedAtMs+t,pausedDurationMs:0,pausedAtMs:null,repeats:e.repeats+1}}function Le(e,t,n){if(e.status!=="running")return {kind:"no-op"};let r=W(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 zt(e){return {initial:ce,start:Oe,pause:Fe,resume:_e,reset:Ie,complete:qe,registerRepeat:t=>Ne(t,e.ms),tick:(t,n)=>Le(t,n,e),elapsedMs:W,remainingMs:(t,n)=>Pe(t,n,e.ms)}}var $n={None:"none",Linear:"linear",Exponential:"exponential"};export{$n as Backoff,R as MAX_REPLAY_FRAMES,Z as MAX_SWEEP_POINTS,qe as completeTimer,Ce as createModule,Lt as createModuleFactory,ue as createRequirementStatusPlugin,Bt as createStatusHook,Wt as createSystemWithStatus,Kt as defaultClock,Te as diffClauses,wt as diffRules,W as elapsedMs,M as flattenPredicate,me as framesFromHistory,Q as framesFromSnapshots,ce as initialTimerState,Fe as pauseTimer,Rt as predicateToMongo,Ct as predicateToPostgrest,St as predicateToSQL,vt as predicateToWhere,je as realClock,Ne as registerRepeat,Pe as remainingMs,N as replayUnder,Ie as resetTimer,_e as resumeTimer,Oe as startTimer,ft as sweepUnder,Pt as t,Le as tickTimer,zt as timerOps,he as toReplayFrames,Y as toRulesMap,Ut as virtualClock};//# sourceMappingURL=index.js.map | ||
| export{b as createAuditLedger,a as memorySink}from'./chunk-7TSYQEN3.js';import {a as a$1}from'./chunk-26Z5VNPZ.js';export{a as createSystem}from'./chunk-26Z5VNPZ.js';import {m,n,k,h,i,a as a$2,b,g}from'./chunk-TPOKS4RY.js';export{v as DirectiveError,I as RequirementSet,t as applyPatch,s as evaluateKeySelector,m as evaluatePredicate,n as evaluatePredicateExplained,q as evaluateTemplate,p as extractDeps,r as extractTemplateKeys,H as forType,E as generateRequirementId,c as getKind,e as getOperatorsForKind,d as getSchemaFieldKinds,B as isNamespacedSystem,h as isPredicate,G as isRequirementType,A as isSingleModuleSystem,j as isTemplate,f as listAllPredicateOperators,o as memoizePredicate,F as req,y as typedConstraint,z as typedResolver,k as validatePredicate,l as validatePredicateAgainstSchema}from'./chunk-TPOKS4RY.js';import {a,l}from'./chunk-TZHC4E6S.js';import {d}from'./chunk-T6IJUWYR.js';export{j as diffSnapshots,k as isSignedSnapshot,h as isSnapshotExpired,f as shallowEqual,l as signSnapshot,i as validateSnapshot,m as verifySnapshotSignature}from'./chunk-T6IJUWYR.js';var R=1e6;function ye(e,t){try{k(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(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$2.has(i)&&(n=i);},strayOperatorKey(r){n===void 0&&!a$2.has(r)&&!b.has(r)&&(n=r);}}),n!==void 0)throw new Error(`[Directive] replayUnder: the ${t} predicate uses an unknown operator "${n}" \u2014 known operators: ${[...a$2].join(", ")}`)}function we(e){if(e&&typeof e=="object"&&!Array.isArray(e)&&Array.isArray(e.snapshots))return $e(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>R)throw new Error(`[Directive] toReplayFrames: history has ${t.length} frames, exceeds the MAX_REPLAY_FRAMES limit (${R}) \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 $e(e){let t=typeof e=="string"?JSON.parse(e):e;if(Array.isArray(t))return X(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 X(n.snapshots)}function X(e){if(!Array.isArray(e))throw new Error("[Directive] framesFromSnapshots: expected an array of fact-state snapshots");if(e.length>R)throw new Error(`[Directive] framesFromSnapshots: history has ${e.length} snapshots, exceeds the MAX_REPLAY_FRAMES limit (${R}) \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 we(e)}function L(e){let{frames:t,original:n,proposed:r,entityKey:i}=e,s=e.maxSamples??20,o=s>0?s:0;if(t.length>R)throw new Error(`[Directive] replayUnder: history has ${t.length} frames, exceeds the MAX_REPLAY_FRAMES limit (${R}) \u2014 split or down-sample the history`);ye(n,"original"),ye(r,"proposed");let c=0,a=0,u=0,l=0,d=0,f=[],g=[],m$1=i?new Set:void 0,h=i?new Set:void 0,k;for(let P of t){let $=P.facts,v=m(n,$,k),M=m(r,$,k);v&&(c++,m$1?.add($[i])),M&&(a++,h?.add($[i])),v===M?d++:!v&&M?(u++,f.length<o&&f.push(me(P,n,r,k))):(l++,g.length<o&&g.push(me(P,n,r,k))),k=$;}let E={framesEvaluated:t.length,original:{matched:c},proposed:{matched:a},delta:a-c,newMatchCount:u,lostMatchCount:l,unchanged:d,newMatches:f,lostMatches:g};return m$1&&h&&(E.original.matchedEntities=m$1.size,E.proposed.matchedEntities=h.size),E}function me(e,t,n$1,r){let i=e.facts,s={frameId:e.id,facts:i,originalExplain:n(t,i,r),proposedExplain:n(n$1,i,r)};return e.timestamp!==void 0&&(s.timestamp=e.timestamp),s}var Y=1e4,be=5e7;function vt(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)&&Object.keys(e).length===1&&typeof e.$hole=="string"}function G(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(vt(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=>G(s,t,n,r+1));let i={};for(let[s,o]of Object.entries(e))i[s]=G(o,t,n,r+1);return i}finally{n.delete(e);}}function*Te(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 Te(r,t))yield {[n]:s,...o};}function kt(e){let t=1;for(let n of Object.values(e))t*=n.length;return t}function Mt(e){let{frames:t,original:n,template:r,sweep:i,objective:s=$=>$.proposed.matched,entityKey:o,maxSamples:c=0}=e,a=Object.keys(i);if(a.length===0)throw new Error("[Directive] sweepUnder: `sweep` must contain at least one hole name");let u=kt(i);if(u>Y)throw new Error(`[Directive] sweepUnder: grid has ${u} points, exceeds the MAX_SWEEP_POINTS limit (${Y}) \u2014 narrow the sweep ranges or split the run`);if(u===0)throw new Error("[Directive] sweepUnder: at least one hole has zero candidate values");let l=u*t.length;if(l>be)throw new Error(`[Directive] sweepUnder: ${u} points \xD7 ${t.length} frames = ${l} per-frame evaluations, exceeds the MAX_SWEEP_EVALUATIONS limit (${be}) \u2014 narrow the sweep, down-sample the history, or split the run`);let d=false,f=$=>{let v;try{v=s($);}catch(M){return d||(d=true,console.warn(`[Directive] sweepUnder: objective threw \u2014 point will not rank (${M.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},g=L({frames:t,original:n,proposed:n,entityKey:o,maxSamples:c}),m={values:{},report:g,score:f(g)},h=[],k=0,E=Number.NEGATIVE_INFINITY;for(let $ of Te(a,i)){let v=G(r,$),M=L({frames:t,original:n,proposed:v,entityKey:o,maxSamples:c}),H=f(M);H>E&&(E=H,k=h.length),h.push({values:$,report:M,score:H});}let P=h[k];return {points:h,bestIndex:k,best:P,baseline:m}}function V(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 Dt=new Set(["$eq","$ne","$in","$nin","$exists","$gt","$gte","$lt","$lte","$between","$matches","$startsWith","$endsWith","$contains","$changed"]),Rt=new Set(["$all","$any","$not"]);function Se(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Et(e){if(!Se(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;Dt.has(r)&&(n=true);}return n}function T(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)=>{T(i,`${t}$all[${s}]`,n);}),n;if("$any"in e&&Array.isArray(e.$any))return e.$any.forEach((i,s)=>{T(i,`${t}$any[${s}]`,n);}),n;if("$not"in e)return T(e.$not,`${t}$not`,n),n;for(let[r,i]of Object.entries(e)){let s=t?`${t}.${r}`:r;if(Et(i))for(let[o,c]of Object.entries(i))n.push({path:s,op:o,value:c});else Se(i)&&!Rt.has(r)?T(i,s,n):n.push({path:s,op:"$eq",value:i});}return n}function D(e){return typeof e=="number"&&Number.isFinite(e)}function xt(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 At(e){let t=V(e.before),n=V(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 c of i){let a=t[c],u=n[c],l=c in t,d=c in n;if(l&&!d){let g=T(a),m=g.length===0?[{path:"(function-form predicate)",kind:"removed"}]:g.map(h=>({path:h.path,kind:"removed",before:{op:h.op,value:h.value}}));ee(m),s.push({id:c,status:"removed",changes:m}),o.removed++,o.totalClauseChanges+=m.length;continue}if(!l&&d){let g=T(u),m=g.length===0?[{path:"(function-form predicate)",kind:"added"}]:g.map(h=>({path:h.path,kind:"added",after:{op:h.op,value:h.value}}));ee(m),s.push({id:c,status:"added",changes:m}),o.added++,o.totalClauseChanges+=m.length;continue}let f=ve(a,u);f.length===0?(s.push({id:c,status:"unchanged",changes:[]}),o.unchanged++):(s.push({id:c,status:"changed",changes:f}),o.changed++,o.totalClauseChanges+=f.length);}return {constraints:s,summary:o}}function ve(e,t){if(e!==void 0&&t!==void 0&&(e===null||t===null||typeof e!="object"||typeof t!="object"))return d(e)===d(t)?[]:[{path:"",kind:"changed",before:{op:"$eq",value:e},after:{op:"$eq",value:t}}];let n=e===void 0?[]:T(e),r=t===void 0?[]:T(t),i=u=>`${u.path}::${u.op}`,s=new Map(n.map(u=>[i(u),u])),o=new Map(r.map(u=>[i(u),u])),c=new Set([...s.keys(),...o.keys()]),a=[];for(let u of c){let l=s.get(u),d$1=o.get(u);if(l&&!d$1){a.push({path:l.path,kind:"removed",before:{op:l.op,value:l.value}});continue}if(!l&&d$1){a.push({path:d$1.path,kind:"added",after:{op:d$1.op,value:d$1.value}});continue}if(l&&d$1){if(d(l.value)===d(d$1.value))continue;let f=xt(l.op,l.value,d$1.value);a.push({path:l.path,kind:f??"changed",before:{op:l.op,value:l.value},after:{op:d$1.op,value:d$1.value}});}}return ee(a),a}function ee(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 B(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 Ct(e){let t=e.path,n=B(e.expected),r=B(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 ${B(e.expected[0])} and ${B(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 ke(e,t){for(let n of e)if(!n.pass){if((n.op==="$all"||n.op==="$any"||n.op==="$not")&&n.children){ke(n.children,t);continue}t.push({path:n.path,op:n.op,expected:n.expected,actual:n.actual,suggestion:Ct(n)});}}function Pt(e,t,n$1){let r=n(e,t,n$1),i=r.every(o=>o.pass),s=[];return i||ke(r,s),{wouldFire:i,whenExplain:r,missingChanges:s,predicate:e}}var Me=new Set(["$eq","$ne","$gt","$gte","$lt","$lte","$in","$nin"]);function W(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 F(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(!F(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(!F(e[i],t[i]))return false;return true}function jt(e,t){if(!Me.has(e.op)||!Me.has(t.op))return {type:"overlap",reason:`Both rules touch "${e.path}".`};if(e.op==="$eq"&&t.op==="$eq")return F(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 F(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 F(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:[]),c=new Set(Array.isArray(t.value)?t.value:[]),a=[...o].filter(u=>c.has(u));return a.length===0?{type:"direct",reason:`Candidate $in set for ${e.path} (${JSON.stringify([...o])}) and existing $in set (${JSON.stringify([...c])}) have no values in common \u2014 the candidate can never fire while the existing rule holds.`}:a.length===o.size&&a.length<c.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=W(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=W(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=W(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=W(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 Ot(e){return typeof e=="object"&&e!==null&&typeof e.id=="string"}var Ft={checkAgainst(e,t){let n=Array.isArray(t)?t:"constraints"in t&&Array.isArray(t.constraints)?t.constraints:[],r=T(e);if(r.length===0)return {contradictions:[],warnings:[]};let i=new Map;for(let c of r){let a=i.get(c.path)??[];a.push(c),i.set(c.path,a);}let s=[],o=[];for(let c of n){if(!Ot(c)||c.whenSpec===void 0)continue;let a=T(c.whenSpec);for(let u of a){let l=i.get(u.path);if(l)for(let d of l){let f=jt(d,u);if(!f)continue;let g={constraintId:c.id,type:f.type,reason:f.reason,candidatePath:d.path,candidate:{op:d.op,value:d.value},existing:{op:u.op,value:u.value}};f.type==="overlap"?o.push(g):s.push(g);}}}return {contradictions:s,warnings:o}}};var _t=/^[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)?$/;function N(e,t){if(typeof e!="string"||!_t.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 De(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 Nt(e){if(Array.isArray(e)){if(e.length===0)throw new Error("[Directive] predicateToSQL: select must not be empty");for(let n of e)N(n,"column");return e.join(", ")}let t=e;return t==="*"?"*":(N(t,"column"),t)}function w(e,t){return e.params.push(t),e.placeholder(e.params.length)}function te(e,t,n,r){switch(t){case "$eq":return `${e} = ${w(r,n)}`;case "$ne":return `${e} <> ${w(r,n)}`;case "$gt":return `${e} > ${w(r,n)}`;case "$gte":return `${e} >= ${w(r,n)}`;case "$lt":return `${e} < ${w(r,n)}`;case "$lte":return `${e} <= ${w(r,n)}`;case "$in":if(!Array.isArray(n))throw new Error("[Directive] predicateToSQL: $in operand must be an array");return `${e} = ANY(${w(r,n)})`;case "$nin":if(!Array.isArray(n))throw new Error("[Directive] predicateToSQL: $nin operand must be an array");return `NOT (${e} = ANY(${w(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 ${w(r,n[0])} AND ${w(r,n[1])}`}case "$startsWith":if(typeof n!="string")throw new Error("[Directive] predicateToSQL: $startsWith operand must be a string");return `${e} LIKE ${w(r,ne(n))} || '%' ESCAPE '\\'`;case "$endsWith":if(typeof n!="string")throw new Error("[Directive] predicateToSQL: $endsWith operand must be a string");return `${e} LIKE '%' || ${w(r,ne(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 '%' || ${w(r,ne(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} ${w(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$2].join(", ")}`)}}function ne(e){return e.replace(/[\\%_]/g,"\\$&")}function Re(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function qt(e){if(!Re(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 re(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 _(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 N(o.fact,"column"),De(o.fact,t.allowed),te(o.fact,o.op,o.value,t)});return i.length===1?i[0]:`(${i.join(" AND ")})`}if("$all"in e){re(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=>_(o,t,n+1));return s.length===1?s[0]:`(${s.join(" AND ")})`}if("$any"in e){re(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=>_(o,t,n+1));return s.length===1?s[0]:`(${s.join(" OR ")})`}if("$not"in e){re(e,"$not");let i=e.$not;return `NOT (${_(i,t,n+1)})`}let r=[];for(let[i,s]of Object.entries(e))if(N(i,"column"),De(i,t.allowed),qt(s))for(let[o,c]of Object.entries(s)){if(!a$2.has(o))throw new Error(`[Directive] predicateToSQL: unknown operator "${o}" on column "${i}" \u2014 known: ${[...a$2].join(", ")}`);r.push(te(i,o,c,t));}else {if(Re(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(te(i,"$eq",s,t));}return r.length===0?"TRUE":r.length===1?r[0]:`(${r.join(" AND ")})`}var Ee=e=>`$${e}`;function It(e,t){let{table:n,allowedKeys:r}=t,i=t.placeholder??Ee,s=t.select??"*";N(n,"table");let o=Nt(s),c={params:[],placeholder:i,allowed:r},a=_(e,c,0);return {sql:`SELECT ${o} FROM ${n} WHERE ${a}`,where:a,params:c.params}}function Lt(e,t={}){let n=t.placeholder??Ee,r={params:[],placeholder:n,allowed:t.allowedKeys};return {where:_(e,r,0),params:r.params}}function ie(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function se(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Bt(e){if(!se(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 Wt=/^[A-Za-z_][A-Za-z0-9_]*$/,Kt=/^[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*$/;function xe(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?Kt:Wt).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 Ae(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 oe(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 Ce(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:`^${ie(t)}`};case "$endsWith":if(typeof t!="string")throw new Error("[Directive] predicateToMongo: $endsWith operand must be a string");return {$regex:`${ie(t)}$`};case "$contains":if(typeof t=="string")return {$regex:ie(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$2].join(", ")}`)}}function A(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 c=o;xe(c.fact,t),Ae(c.fact,t.allowedKeys);let a=Ce(c.op,c.value);if(c.fact in i&&se(i[c.fact])){let u=i[c.fact];Object.keys(a).some(d=>d in u)?s.push({[c.fact]:a}):i[c.fact]={...u,...a};}else c.fact in i?s.push({[c.fact]:a}):i[c.fact]=a;}if(s.length>0){let o=[];for(let[c,a]of Object.entries(i))o.push({[c]:a});return o.push(...s),{$and:o}}return i}if("$all"in e){oe(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?A(i[0],t,n+1):{$and:i.map(s=>A(s,t,n+1))}}if("$any"in e){oe(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?A(i[0],t,n+1):{$or:i.map(s=>A(s,t,n+1))}}if("$not"in e){oe(e,"$not");let i=e.$not;return {$nor:[A(i,t,n+1)]}}let r={};for(let[i,s]of Object.entries(e))if(xe(i,t),Ae(i,t.allowedKeys),Bt(s)){let o={};for(let[c,a]of Object.entries(s)){if(!a$2.has(c))throw new Error(`[Directive] predicateToMongo: unknown operator "${c}" on field "${i}" \u2014 known: ${[...a$2].join(", ")}`);Object.assign(o,Ce(c,a));}r[i]=o;}else r[i]=s;return r}function Ut(e,t={}){return A(e,t,0)}var zt=/^[A-Za-z_][A-Za-z0-9_]*$/;function Pe(e,t){if(typeof e!="string"||!zt.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 ae(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 S(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 je(e){return `(${e.map(S).join(",")})`}function ue(e){return e.replace(/[\\%_*]/g,"\\$&")}function C(e,t){switch(e){case "$eq":return `eq.${S(t)}`;case "$ne":return `neq.${S(t)}`;case "$gt":return `gt.${S(t)}`;case "$gte":return `gte.${S(t)}`;case "$lt":return `lt.${S(t)}`;case "$lte":return `lte.${S(t)}`;case "$in":if(!Array.isArray(t))throw new Error("[Directive] predicateToPostgrest: $in operand must be an array");return `in.${je(t)}`;case "$nin":if(!Array.isArray(t))throw new Error("[Directive] predicateToPostgrest: $nin operand must be an array");return `not.in.${je(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.${S(ue(t)+"*")}`;case "$endsWith":if(typeof t!="string")throw new Error("[Directive] predicateToPostgrest: $endsWith operand must be a string");return `like.${S("*"+ue(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.${S("*"+ue(t)+"*")}`;case "$matches":if(t instanceof RegExp)return `${t.flags.includes("i")?"imatch":"match"}.${S(t.source)}`;if(typeof t=="string")return `match.${S(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$2].join(", ")}`)}}function Oe(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Ht(e){if(!Oe(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 ce(e,t){return `${e}=${t}`}function K(e,t){return `${e}=(${t.join(",")})`}function le(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?ce(e,C("$gte",n[0])):`${e}.${C("$gte",n[0])}`,s=r?ce(e,C("$lte",n[1])):`${e}.${C("$lte",n[1])}`;return [i,s]}return [r?ce(e,C(t,n)):`${e}.${C(t,n)}`]}function q(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 c=o;Pe(c.fact,t),s.push(...le(c.fact,c.op,c.value,n));}return s}if("$all"in e){ae(e,"$all");let s=e.$all;if(!Array.isArray(s))throw new Error("[Directive] predicateToPostgrest: $all must be an array");if(n){let c=[];for(let a of s)c.push(...q(a,t,true,r+1));return c}let o=[];for(let c of s)o.push(...q(c,t,false,r+1));return [K("and",o)]}if("$any"in e){ae(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"]:[K("and",["id.is.null","id.not.is.null"])];let o=[];for(let c of s)o.push(...q(c,t,false,r+1));return [K("or",o)]}if("$not"in e){ae(e,"$not");let s=e.$not,o=q(s,t,false,r+1);return [K("not.and",o)]}let i=[];for(let[s,o]of Object.entries(e))if(Pe(s,t),Ht(o))for(let[c,a]of Object.entries(o)){if(!a$2.has(c))throw new Error(`[Directive] predicateToPostgrest: unknown operator "${c}" on column "${s}" \u2014 known: ${[...a$2].join(", ")}`);i.push(...le(s,c,a,n));}else {if(Oe(o))throw new Error(`[Directive] predicateToPostgrest: nested predicate at "${s}" \u2014 single-table queries only`);i.push(...le(s,"$eq",o,n));}return i}function Qt(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 Jt(e,t={}){let n=t.mode??"querystring",r=q(e,t.allowedKeys,true,0);return r.length===0?"":n==="raw"?r.join("&"):r.map(Qt).join("&")}function U(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(c){return U([...e,c],t,n,r,i,s,o)}}}function p(e,t,n,r,i,s,o){return {...U(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,u){let l=[...s??[],{predicate:a,message:u}];return p([...e,a],t,n,r,i,l,o)},nullable(){return p([a=>a===null||e.every(u=>u(a))],`${t} | null`,n,r,i,void 0,o)},optional(){return p([a=>a===void 0||e.every(u=>u(a))],`${t} | undefined`,n,r,i,void 0,o)},meta(a){return p(e,t,n,r,i,s,a)}}}var Zt=((...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(" | "))}),Xt={string(){let e=(t,n,r,i,s,o)=>({...p(t,"string",n,r,i,s,o),minLength(a){return e([...t,u=>u.length>=a],n,r,i,s,o)},maxLength(a){return e([...t,u=>u.length<=a],n,r,i,s,o)},pattern(a){return e([...t,u=>a.test(u)],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,u){let l=[...s??[],{predicate:a,message:u}];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,u=>u>=a],n,r,i,s,o)},max(a){return e([...t,u=>u<=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,u){let l=[...s??[],{predicate:a,message:u}];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 c=p(t,"array",r,void 0,i,void 0,o),a=s??{value:-1};return {...c,get _lastFailedIndex(){return a.value},set _lastFailedIndex(l){a.value=l;},of(l){let d={value:-1};return e([...t,f=>{for(let g=0;g<f.length;g++)if(!l._validators.every(m=>m(f[g])))return d.value=g,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,c=>{for(let[a,u]of Object.entries(o)){let l=c[a],d=u;if(d&&!d._validators.every(f=>f(l)))return false}return true}],n,r,i)},nonNull(){return e([...t,o=>o!=null],n,r,i)},hasKeys(...o){return e([...t,c=>o.every(a=>a in c)],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 U([n=>n===null?true:e._validators.every(r=>r(n))],`${t} | null`)},optional(e){let t=e._typeName??"unknown";return U([n=>n===void 0?true:e._validators.every(r=>r(n))],`${t} | undefined`)},union:Zt,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 Yt(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 Fe(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 Gt(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 Vt(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 en(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 tn(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(l.has(o)||o.startsWith("$"))throw new Error(`[Directive] module '${e}' constraint '${r}': owns key '${o}' is reserved (BLOCKED_PROPS or $-prefixed)`)}}}function nn(e,t){Yt(e),t.schema?t.schema.facts||console.warn("[Directive] Module schema.facts is required"):console.warn("[Directive] Module schema is required"),Fe(new Set(Object.keys(t.derive??{})),new Set(Object.keys(t.schema?.derivations??{})),"Derivation","schema.derivations","has no matching implementation in derive"),Fe(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&&Gt(t.history.snapshotEvents,t.schema?.events??{}),t.resolvers&&t.schema?.requirements&&Vt(t.resolvers,t.schema.requirements);}function _e(e,t){en(e,t),tn(e,t),a&&nn(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 rn(e){return t=>_e(t,e)}function de(){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,u){let l=a.get(u);return l||(l=new Set,a.set(u,l)),l}function r(a){let u=e.pending.get(a)??new Set,l=e.inflight.get(a)??new Set,d=e.failed.get(a)??new Set,f=e.errors.get(a)??null;return {pending:u.size,inflight:l.size,failed:d.size,isLoading:u.size>0||l.size>0,hasError:d.size>0,lastError:f}}function i(){let a=new Set([...e.pending.keys(),...e.inflight.keys(),...e.failed.keys()]),u=new Map;for(let l of a)u.set(l,r(l));return u}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 u=a.requirement.type;n(e.pending,u).add(a.id),e.failed.get(u)?.delete(a.id),t();},onResolverStart(a,u){let l=u.requirement.type;e.pending.get(l)?.delete(u.id),n(e.inflight,l).add(u.id),t();},onResolverComplete(a,u){let l=u.requirement.type;e.inflight.get(l)?.delete(u.id),e.pending.get(l)?.delete(u.id),t();},onResolverError(a,u,l){let d=u.requirement.type;e.inflight.get(d)?.delete(u.id),n(e.failed,d).add(u.id),e.errors.set(d,l instanceof Error?l:new Error(String(l))),t();},onResolverCancel(a,u){let l=u.requirement.type;e.pending.get(l)?.delete(u.id),e.inflight.get(l)?.delete(u.id),t();},onRequirementMet(a){let u=a.requirement.type;e.pending.get(u)?.delete(a.id),e.inflight.get(u)?.delete(a.id),t();}},getStatus:r,getAllStatus:i,subscribe:s,reset:o}}function on(e){return t=>e.getStatus(t)}function sn(e){let t=de(),r=[...e.plugins??[],t.plugin];return {system:a$1({module:e.module,plugins:r,trace:e.trace,errorBoundary:e.errorBoundary,tickMs:e.tickMs,zeroConfig:e.zeroConfig,initialFacts:e.initialFacts}),statusPlugin:t}}function Ne(){return {now:()=>Date.now(),setTimeout:(e,t)=>{let n=globalThis.setTimeout(e,t);return ()=>globalThis.clearTimeout(n)}}}function an(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,u)=>a.deadlineMs!==u.deadlineMs?a.deadlineMs-u.deadlineMs:a.id-u.id);if(o.length===0)break;let c=o[0];t=Math.max(t,c.deadlineMs),c.canceled=true,c.cb();}t=Math.max(t,s);}}}function un(){return Ne()}function pe(){return {startedAtMs:null,pausedDurationMs:0,pausedAtMs:null,status:"idle",repeats:0}}function z(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 qe(e,t,n){return Math.max(0,n-z(e,t))}function Ie(e,t){return e.status==="running"||e.status==="paused"?e:{...e,startedAtMs:t,pausedDurationMs:0,pausedAtMs:null,status:"running",repeats:0}}function Le(e,t){return e.status!=="running"?e:{...e,pausedAtMs:t,status:"paused"}}function Be(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 We(){return pe()}function Ke(e){return {...e,status:"completed"}}function Ue(e,t){return e.startedAtMs===null||e.status==="paused"?e:{...e,startedAtMs:e.startedAtMs+t,pausedDurationMs:0,pausedAtMs:null,repeats:e.repeats+1}}function ze(e,t,n){if(e.status!=="running")return {kind:"no-op"};let r=z(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 cn(e){return {initial:pe,start:Ie,pause:Le,resume:Be,reset:We,complete:Ke,registerRepeat:t=>Ue(t,e.ms),tick:(t,n)=>ze(t,n,e),elapsedMs:z,remainingMs:(t,n)=>qe(t,n,e.ms)}}var Wn={None:"none",Linear:"linear",Exponential:"exponential"};export{Wn as Backoff,R as MAX_REPLAY_FRAMES,Y as MAX_SWEEP_POINTS,Ke as completeTimer,_e as createModule,rn as createModuleFactory,de as createRequirementStatusPlugin,on as createStatusHook,sn as createSystemWithStatus,un as defaultClock,ve as diffClauses,At as diffRules,Ft as doctor,z as elapsedMs,T as flattenPredicate,$e as framesFromHistory,X as framesFromSnapshots,pe as initialTimerState,Le as pauseTimer,Ut as predicateToMongo,Jt as predicateToPostgrest,It as predicateToSQL,Lt as predicateToWhere,Pt as predict,Ne as realClock,Ue as registerRepeat,qe as remainingMs,L as replayUnder,We as resetTimer,Be as resumeTimer,Ie as startTimer,Mt as sweepUnder,Xt as t,ze as tickTimer,cn as timerOps,we as toReplayFrames,V as toRulesMap,an as virtualClock};//# sourceMappingURL=index.js.map | ||
| //# sourceMappingURL=index.js.map |
@@ -1,2 +0,2 @@ | ||
| 'use strict';var chunkWIZHZF4G_cjs=require('./chunk-WIZHZF4G.cjs'),chunkN4KTCKOI_cjs=require('./chunk-N4KTCKOI.cjs'),chunkEOLY64E6_cjs=require('./chunk-EOLY64E6.cjs');Object.defineProperty(exports,"createConstraintFactory",{enumerable:true,get:function(){return chunkWIZHZF4G_cjs.r}});Object.defineProperty(exports,"createConstraintsManager",{enumerable:true,get:function(){return chunkWIZHZF4G_cjs.E}});Object.defineProperty(exports,"createDerivationsManager",{enumerable:true,get:function(){return chunkWIZHZF4G_cjs.F}});Object.defineProperty(exports,"createDisabledHistory",{enumerable:true,get:function(){return chunkWIZHZF4G_cjs.y}});Object.defineProperty(exports,"createEffectsManager",{enumerable:true,get:function(){return chunkWIZHZF4G_cjs.G}});Object.defineProperty(exports,"createEngine",{enumerable:true,get:function(){return chunkWIZHZF4G_cjs.O}});Object.defineProperty(exports,"createErrorBoundaryManager",{enumerable:true,get:function(){return chunkWIZHZF4G_cjs.I}});Object.defineProperty(exports,"createFacts",{enumerable:true,get:function(){return chunkWIZHZF4G_cjs.L}});Object.defineProperty(exports,"createFactsProxy",{enumerable:true,get:function(){return chunkWIZHZF4G_cjs.K}});Object.defineProperty(exports,"createFactsStore",{enumerable:true,get:function(){return chunkWIZHZF4G_cjs.J}});Object.defineProperty(exports,"createHistoryManager",{enumerable:true,get:function(){return chunkWIZHZF4G_cjs.x}});Object.defineProperty(exports,"createPluginManager",{enumerable:true,get:function(){return chunkWIZHZF4G_cjs.M}});Object.defineProperty(exports,"createResolverFactory",{enumerable:true,get:function(){return chunkWIZHZF4G_cjs.s}});Object.defineProperty(exports,"createResolversManager",{enumerable:true,get:function(){return chunkWIZHZF4G_cjs.N}});Object.defineProperty(exports,"createRetryLaterManager",{enumerable:true,get:function(){return chunkWIZHZF4G_cjs.H}});Object.defineProperty(exports,"getCurrentDeps",{enumerable:true,get:function(){return chunkN4KTCKOI_cjs.g}});Object.defineProperty(exports,"isTracking",{enumerable:true,get:function(){return chunkN4KTCKOI_cjs.h}});Object.defineProperty(exports,"trackAccess",{enumerable:true,get:function(){return chunkN4KTCKOI_cjs.k}});Object.defineProperty(exports,"withTracking",{enumerable:true,get:function(){return chunkN4KTCKOI_cjs.i}});Object.defineProperty(exports,"withoutTracking",{enumerable:true,get:function(){return chunkN4KTCKOI_cjs.j}});Object.defineProperty(exports,"safeStringify",{enumerable:true,get:function(){return chunkEOLY64E6_cjs.n}});//# sourceMappingURL=internals.cjs.map | ||
| 'use strict';var chunk7NMXRATK_cjs=require('./chunk-7NMXRATK.cjs'),chunkN4KTCKOI_cjs=require('./chunk-N4KTCKOI.cjs'),chunkEOLY64E6_cjs=require('./chunk-EOLY64E6.cjs');Object.defineProperty(exports,"createConstraintFactory",{enumerable:true,get:function(){return chunk7NMXRATK_cjs.w}});Object.defineProperty(exports,"createConstraintsManager",{enumerable:true,get:function(){return chunk7NMXRATK_cjs.J}});Object.defineProperty(exports,"createDerivationsManager",{enumerable:true,get:function(){return chunk7NMXRATK_cjs.K}});Object.defineProperty(exports,"createDisabledHistory",{enumerable:true,get:function(){return chunk7NMXRATK_cjs.D}});Object.defineProperty(exports,"createEffectsManager",{enumerable:true,get:function(){return chunk7NMXRATK_cjs.L}});Object.defineProperty(exports,"createEngine",{enumerable:true,get:function(){return chunk7NMXRATK_cjs.T}});Object.defineProperty(exports,"createErrorBoundaryManager",{enumerable:true,get:function(){return chunk7NMXRATK_cjs.N}});Object.defineProperty(exports,"createFacts",{enumerable:true,get:function(){return chunk7NMXRATK_cjs.Q}});Object.defineProperty(exports,"createFactsProxy",{enumerable:true,get:function(){return chunk7NMXRATK_cjs.P}});Object.defineProperty(exports,"createFactsStore",{enumerable:true,get:function(){return chunk7NMXRATK_cjs.O}});Object.defineProperty(exports,"createHistoryManager",{enumerable:true,get:function(){return chunk7NMXRATK_cjs.C}});Object.defineProperty(exports,"createPluginManager",{enumerable:true,get:function(){return chunk7NMXRATK_cjs.R}});Object.defineProperty(exports,"createResolverFactory",{enumerable:true,get:function(){return chunk7NMXRATK_cjs.x}});Object.defineProperty(exports,"createResolversManager",{enumerable:true,get:function(){return chunk7NMXRATK_cjs.S}});Object.defineProperty(exports,"createRetryLaterManager",{enumerable:true,get:function(){return chunk7NMXRATK_cjs.M}});Object.defineProperty(exports,"getCurrentDeps",{enumerable:true,get:function(){return chunkN4KTCKOI_cjs.g}});Object.defineProperty(exports,"isTracking",{enumerable:true,get:function(){return chunkN4KTCKOI_cjs.h}});Object.defineProperty(exports,"trackAccess",{enumerable:true,get:function(){return chunkN4KTCKOI_cjs.k}});Object.defineProperty(exports,"withTracking",{enumerable:true,get:function(){return chunkN4KTCKOI_cjs.i}});Object.defineProperty(exports,"withoutTracking",{enumerable:true,get:function(){return chunkN4KTCKOI_cjs.j}});Object.defineProperty(exports,"safeStringify",{enumerable:true,get:function(){return chunkEOLY64E6_cjs.n}});//# sourceMappingURL=internals.cjs.map | ||
| //# sourceMappingURL=internals.cjs.map |
@@ -1,5 +0,5 @@ | ||
| import { a8 as Schema, ai as FactsStore, b as Facts, D as DefinitionMeta, E as EffectsDef, aj as ConstraintsDef, t as RequirementKeyFn, R as RequirementWithId, ak as ConstraintState, a as FactPredicate, C as ClauseResult, al as ResolversDef, am as ResolverStatus, s as Requirement, p as Plugin, aa as System, an as FactChange, G as FactsSnapshot, ao as ReconcileResult, a9 as Snapshot, u as DirectiveError, ap as RecoveryStrategy, af as TraceEntry, aq as ErrorSource, r as ErrorBoundaryConfig, ar as RetryLaterConfig, H as HistoryAPI, I as HistoryOption, ab as SystemConfig } from './plugins-DvrsPhzx.cjs'; | ||
| export { as as BatchItemResult, at as BatchResolveResults, au as ConstraintsControl, av as CrossModuleConstraintDef, j as CrossModuleConstraintsDef, aw as CrossModuleDerivationFn, h as CrossModuleDerivationsDef, ax as CrossModuleEffectDef, i as CrossModuleEffectsDef, ay as CrossModuleFactsWithSelf, az as DerivationKeys, aA as DerivationReturnType, aB as DerivationsControl, aC as DerivationsSchema, aD as DeriveAccessor, aE as DispatchEventsFromSchema, v as DistributableSnapshot, w as DistributableSnapshotOptions, aF as EffectCleanup, aG as EffectsControl, aH as EventPayloadSchema, aI as EventsAccessor, aJ as EventsAccessorFromSchema, aK as EventsDef, aL as EventsSchema, aM as FactKeys, aN as FactReturnType, aO as FlexibleEventHandler, aP as HistoryConfig, aQ as InferEventPayloadFromSchema, aR as InferRequirementPayloadFromSchema, aS as InferSchema, aT as MutableNamespacedFacts, aU as NamespacedDerivations, aV as NamespacedEventsAccessor, aW as NamespacedFacts, aX as ObservableKeys, aY as RequirementExplanation, aZ as RequirementOutput, a_ as RequirementPayloadSchema, a$ as RequirementsSchema, b0 as ResolverContext, b1 as ResolversControl, b2 as SnapshotMeta, b3 as SystemEvent, b4 as TraceConfig, b5 as TypedConstraintDef, d as TypedConstraintsDef, T as TypedDerivationsDef, c as TypedEventsDef, b6 as TypedResolverContext, b7 as TypedResolverDef, e as TypedResolversDef, b8 as UnionEvents } from './plugins-DvrsPhzx.cjs'; | ||
| import { b as DerivationsDef, c as DerivedValues } from './helpers-CG27mEGG.cjs'; | ||
| export { d as DerivationState, T as TypedConstraint, e as TypedResolver, f as createConstraintFactory, g as createResolverFactory } from './helpers-CG27mEGG.cjs'; | ||
| import { a8 as Schema, ai as FactsStore, c as Facts, D as DefinitionMeta, E as EffectsDef, aj as ConstraintsDef, u as RequirementKeyFn, R as RequirementWithId, ak as ConstraintState, b as FactPredicate, C as ClauseResult, al as ResolversDef, am as ResolverStatus, t as Requirement, q as Plugin, aa as System, an as FactChange, H as FactsSnapshot, ao as ReconcileResult, a9 as Snapshot, v as DirectiveError, ap as RecoveryStrategy, af as TraceEntry, aq as ErrorSource, s as ErrorBoundaryConfig, ar as RetryLaterConfig, I as HistoryAPI, J as HistoryOption, ab as SystemConfig } from './plugins-Ykl_sAPE.cjs'; | ||
| export { as as BatchItemResult, at as BatchResolveResults, au as ConstraintsControl, av as CrossModuleConstraintDef, k as CrossModuleConstraintsDef, aw as CrossModuleDerivationFn, i as CrossModuleDerivationsDef, ax as CrossModuleEffectDef, j as CrossModuleEffectsDef, ay as CrossModuleFactsWithSelf, az as DerivationKeys, aA as DerivationReturnType, aB as DerivationsControl, aC as DerivationsSchema, aD as DeriveAccessor, aE as DispatchEventsFromSchema, w as DistributableSnapshot, x as DistributableSnapshotOptions, aF as EffectCleanup, aG as EffectsControl, aH as EventPayloadSchema, aI as EventsAccessor, aJ as EventsAccessorFromSchema, aK as EventsDef, aL as EventsSchema, aM as FactKeys, aN as FactReturnType, aO as FlexibleEventHandler, aP as HistoryConfig, aQ as InferEventPayloadFromSchema, aR as InferRequirementPayloadFromSchema, aS as InferSchema, aT as MutableNamespacedFacts, aU as NamespacedDerivations, aV as NamespacedEventsAccessor, aW as NamespacedFacts, aX as ObservableKeys, aY as RequirementExplanation, aZ as RequirementOutput, a_ as RequirementPayloadSchema, a$ as RequirementsSchema, b0 as ResolverContext, b1 as ResolversControl, b2 as SnapshotMeta, b3 as SystemEvent, b4 as TraceConfig, b5 as TypedConstraintDef, e as TypedConstraintsDef, T as TypedDerivationsDef, d as TypedEventsDef, b6 as TypedResolverContext, b7 as TypedResolverDef, f as TypedResolversDef, b8 as UnionEvents } from './plugins-Ykl_sAPE.cjs'; | ||
| import { b as DerivationsDef, c as DerivedValues } from './helpers-hh6UanB1.cjs'; | ||
| export { d as DerivationState, T as TypedConstraint, e as TypedResolver, f as createConstraintFactory, g as createResolverFactory } from './helpers-hh6UanB1.cjs'; | ||
| export { g as safeStringify } from './utils-BnQajqPu.cjs'; | ||
@@ -6,0 +6,0 @@ |
@@ -1,5 +0,5 @@ | ||
| import { a8 as Schema, ai as FactsStore, b as Facts, D as DefinitionMeta, E as EffectsDef, aj as ConstraintsDef, t as RequirementKeyFn, R as RequirementWithId, ak as ConstraintState, a as FactPredicate, C as ClauseResult, al as ResolversDef, am as ResolverStatus, s as Requirement, p as Plugin, aa as System, an as FactChange, G as FactsSnapshot, ao as ReconcileResult, a9 as Snapshot, u as DirectiveError, ap as RecoveryStrategy, af as TraceEntry, aq as ErrorSource, r as ErrorBoundaryConfig, ar as RetryLaterConfig, H as HistoryAPI, I as HistoryOption, ab as SystemConfig } from './plugins-DvrsPhzx.js'; | ||
| export { as as BatchItemResult, at as BatchResolveResults, au as ConstraintsControl, av as CrossModuleConstraintDef, j as CrossModuleConstraintsDef, aw as CrossModuleDerivationFn, h as CrossModuleDerivationsDef, ax as CrossModuleEffectDef, i as CrossModuleEffectsDef, ay as CrossModuleFactsWithSelf, az as DerivationKeys, aA as DerivationReturnType, aB as DerivationsControl, aC as DerivationsSchema, aD as DeriveAccessor, aE as DispatchEventsFromSchema, v as DistributableSnapshot, w as DistributableSnapshotOptions, aF as EffectCleanup, aG as EffectsControl, aH as EventPayloadSchema, aI as EventsAccessor, aJ as EventsAccessorFromSchema, aK as EventsDef, aL as EventsSchema, aM as FactKeys, aN as FactReturnType, aO as FlexibleEventHandler, aP as HistoryConfig, aQ as InferEventPayloadFromSchema, aR as InferRequirementPayloadFromSchema, aS as InferSchema, aT as MutableNamespacedFacts, aU as NamespacedDerivations, aV as NamespacedEventsAccessor, aW as NamespacedFacts, aX as ObservableKeys, aY as RequirementExplanation, aZ as RequirementOutput, a_ as RequirementPayloadSchema, a$ as RequirementsSchema, b0 as ResolverContext, b1 as ResolversControl, b2 as SnapshotMeta, b3 as SystemEvent, b4 as TraceConfig, b5 as TypedConstraintDef, d as TypedConstraintsDef, T as TypedDerivationsDef, c as TypedEventsDef, b6 as TypedResolverContext, b7 as TypedResolverDef, e as TypedResolversDef, b8 as UnionEvents } from './plugins-DvrsPhzx.js'; | ||
| import { b as DerivationsDef, c as DerivedValues } from './helpers-BwAThjnJ.js'; | ||
| export { d as DerivationState, T as TypedConstraint, e as TypedResolver, f as createConstraintFactory, g as createResolverFactory } from './helpers-BwAThjnJ.js'; | ||
| import { a8 as Schema, ai as FactsStore, c as Facts, D as DefinitionMeta, E as EffectsDef, aj as ConstraintsDef, u as RequirementKeyFn, R as RequirementWithId, ak as ConstraintState, b as FactPredicate, C as ClauseResult, al as ResolversDef, am as ResolverStatus, t as Requirement, q as Plugin, aa as System, an as FactChange, H as FactsSnapshot, ao as ReconcileResult, a9 as Snapshot, v as DirectiveError, ap as RecoveryStrategy, af as TraceEntry, aq as ErrorSource, s as ErrorBoundaryConfig, ar as RetryLaterConfig, I as HistoryAPI, J as HistoryOption, ab as SystemConfig } from './plugins-Ykl_sAPE.js'; | ||
| export { as as BatchItemResult, at as BatchResolveResults, au as ConstraintsControl, av as CrossModuleConstraintDef, k as CrossModuleConstraintsDef, aw as CrossModuleDerivationFn, i as CrossModuleDerivationsDef, ax as CrossModuleEffectDef, j as CrossModuleEffectsDef, ay as CrossModuleFactsWithSelf, az as DerivationKeys, aA as DerivationReturnType, aB as DerivationsControl, aC as DerivationsSchema, aD as DeriveAccessor, aE as DispatchEventsFromSchema, w as DistributableSnapshot, x as DistributableSnapshotOptions, aF as EffectCleanup, aG as EffectsControl, aH as EventPayloadSchema, aI as EventsAccessor, aJ as EventsAccessorFromSchema, aK as EventsDef, aL as EventsSchema, aM as FactKeys, aN as FactReturnType, aO as FlexibleEventHandler, aP as HistoryConfig, aQ as InferEventPayloadFromSchema, aR as InferRequirementPayloadFromSchema, aS as InferSchema, aT as MutableNamespacedFacts, aU as NamespacedDerivations, aV as NamespacedEventsAccessor, aW as NamespacedFacts, aX as ObservableKeys, aY as RequirementExplanation, aZ as RequirementOutput, a_ as RequirementPayloadSchema, a$ as RequirementsSchema, b0 as ResolverContext, b1 as ResolversControl, b2 as SnapshotMeta, b3 as SystemEvent, b4 as TraceConfig, b5 as TypedConstraintDef, e as TypedConstraintsDef, T as TypedDerivationsDef, d as TypedEventsDef, b6 as TypedResolverContext, b7 as TypedResolverDef, f as TypedResolversDef, b8 as UnionEvents } from './plugins-Ykl_sAPE.js'; | ||
| import { b as DerivationsDef, c as DerivedValues } from './helpers-D2pfb6vT.js'; | ||
| export { d as DerivationState, T as TypedConstraint, e as TypedResolver, f as createConstraintFactory, g as createResolverFactory } from './helpers-D2pfb6vT.js'; | ||
| export { g as safeStringify } from './utils-BnQajqPu.js'; | ||
@@ -6,0 +6,0 @@ |
@@ -1,2 +0,2 @@ | ||
| export{r as createConstraintFactory,E as createConstraintsManager,F as createDerivationsManager,y as createDisabledHistory,G as createEffectsManager,O as createEngine,I as createErrorBoundaryManager,L as createFacts,K as createFactsProxy,J as createFactsStore,x as createHistoryManager,M as createPluginManager,s as createResolverFactory,N as createResolversManager,H as createRetryLaterManager}from'./chunk-ZE2RY5KP.js';export{g as getCurrentDeps,h as isTracking,k as trackAccess,i as withTracking,j as withoutTracking}from'./chunk-TZHC4E6S.js';export{n as safeStringify}from'./chunk-T6IJUWYR.js';//# sourceMappingURL=internals.js.map | ||
| export{w as createConstraintFactory,J as createConstraintsManager,K as createDerivationsManager,D as createDisabledHistory,L as createEffectsManager,T as createEngine,N as createErrorBoundaryManager,Q as createFacts,P as createFactsProxy,O as createFactsStore,C as createHistoryManager,R as createPluginManager,x as createResolverFactory,S as createResolversManager,M as createRetryLaterManager}from'./chunk-TPOKS4RY.js';export{g as getCurrentDeps,h as isTracking,k as trackAccess,i as withTracking,j as withoutTracking}from'./chunk-TZHC4E6S.js';export{n as safeStringify}from'./chunk-T6IJUWYR.js';//# sourceMappingURL=internals.js.map | ||
| //# sourceMappingURL=internals.js.map |
@@ -1,3 +0,3 @@ | ||
| 'use strict';var chunkEOLY64E6_cjs=require('../chunk-EOLY64E6.cjs');var _documentCurrentScript=typeof document!=='undefined'?document.currentScript:null;var Oe={debug:0,info:1,warn:2,error:3};function rt(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 ot=200,ie=340,ae=16,ce=80,he=2,Se=["#8b9aff","#4ade80","#fbbf24","#c084fc","#f472b6","#22d3ee"];function $e(){return {entries:new ue(ot),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 E(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=E("Facts",true);i.appendChild(P.details);let F=E("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 C=document.createElement("details");C.style.marginBottom="4px";let q=document.createElement("summary");Object.assign(q.style,{cursor:"pointer",color:b.accent,marginBottom:"4px"}),q.textContent="Timeline",C.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),C.appendChild(j),i.appendChild(C);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:C,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 Ce(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 Ee(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 st(e){return Object.hasOwn(qe,e)?qe[e]:e}function Fe(e){return e instanceof RegExp?ee(String(e),40):fe(e)}var it=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",it.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=st(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 at(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 ct(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=at(a,p,l,d,c,y),N=we.get(e.flowSvg);if(N&&N.fingerprint===I){ct(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 E=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(E.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,C=new Map,q=new Map,j=new Map;for(let u of E){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);C.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=C.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 E=document.createElementNS("http://www.w3.org/2000/svg","line");E.setAttribute("x1",String(w)),E.setAttribute("y1","10"),E.setAttribute("x2",String(w)),E.setAttribute("y2",String(I)),E.setAttribute("stroke",b.border),E.setAttribute("stroke-width","0.5"),e.timelineSvg.appendChild(E);}for(let R=0;R<y.length;R++){let w=y[R],g=12+R*ae,f=R%Se.length,E=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:E),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",E),$.setAttribute("opacity","0.4"),$.setAttribute("stroke",E),$.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 lt(){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 ut(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=lt(),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(),E=$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,C=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&&Ce(n,N,m,y.flashTimers),v&C){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&&Ee(n,m),v&x&&Ze(n,E);}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{}Ce(v,N,m);let D=se(m);D&&(ye(v,D.inflight.length,D.unmet.length),be(v,D.inflight,D.unmet)),Ee(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(C)),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),E.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=E.inflight.get(n);E.inflight.delete(n),U!==void 0&&E.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=E.inflight.get(n);E.inflight.delete(n),B!==void 0&&E.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}),E.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(C));},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"]),dt=Math.random().toString(36).slice(2,8);function mt(){if(typeof window<"u"){let e=`__DIRECTIVE_BRIDGE_ID_${dt}__`,s=window,o=s[e]??0;return s[e]=o+1,o+1}return 1}function pt(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 gt(e){if(!(typeof window>"u"))try{let s=pt(e),o={id:mt(),timestamp:Date.now(),snapshotId:null,...s};window.dispatchEvent(new CustomEvent(tt,{detail:o}));}catch{}}function ft(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:chunkEOLY64E6_cjs.e(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[E,T]of Object.entries(f))I(E)&&(d.facts[E]=T,y.add(E));}),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 E of g)E.type==="set"?y.add(E.key):y.delete(E.key),I(E.key)&&(f=true);f&&w();}}}function bt(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 E=performance.now(),T=I(g);if(T.evaluations++,T.lastEvaluatedAt=Date.now(),y>0){let P=E-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=E;},onResolverStart(g,f){let E=N(g);E.starts++;},onResolverComplete(g,f,E){let T=N(g);T.completions++,T.totalDurationMs+=E,T.avgDurationMs=T.totalDurationMs/T.completions,E>T.maxDurationMs&&(T.maxDurationMs=E),T.lastCompletedAt=Date.now(),E>a&&o?.(g,E);},onResolverError(g,f,E){N(g).errors++;},onResolverRetry(g,f,E){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 E={};for(let[T,P]of t)E[T]={...P};return {constraints:g,resolvers:f,effects:E,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 yt(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,E=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()))}`,C=f.get(x);C||(C=[],f.set(x,C)),C.push(h),C.length>y&&C.shift(),V(h.name,C),l.onMetricRecorded?.(h),_(h.name);}function V(h,x){if(x.length===0)return;let C=x.map(S=>S.value),q=C.reduce((S,A)=>S+A,0),j=x[0],u=C[C.length-1],M={name:h,type:j.type,count:x.length,sum:q,min:Math.min(...C),max:Math.max(...C),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 C=O.get(h);if(!C)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=C.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?.(C,A);break}}}}function H(h){let x=[];for(let[C,q]of f)if(C.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={},C=1){$({name:h,type:"counter",value:C,labels:x,timestamp:Date.now()});},setGauge(h,x,C={}){$({name:h,type:"gauge",value:x,labels:C,timestamp:Date.now()});},observeHistogram(h,x,C={}){$({name:h,type:"histogram",value:x,labels:C,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 C={traceId:x?E.get(x)?.traceId??ve():ve(),spanId:ve(),parentSpanId:x,operationName:h,serviceName:s,startTime:Date.now(),status:"ok",tags:{},logs:[]};return I&&(E.set(C.spanId,C),l.onSpanStart?.(C)),C},endSpan(h,x="ok"){if(h==="sampled-out")return;let C=E.get(h);if(C){for(C.endTime=Date.now(),C.duration=C.endTime-C.startTime,C.status=x,E.delete(h),T.push(C);T.length>R;)T.shift();$({name:`${C.operationName}.latency`,type:"histogram",value:C.duration,labels:{},timestamp:Date.now()}),x==="error"&&$({name:`${C.operationName}.errors`,type:"counter",value:1,labels:{},timestamp:Date.now()}),l.onSpanEnd?.(C);}},addSpanLog(h,x,C="info"){if(h==="sampled-out")return;let q=E.get(h);q&&q.logs.push({timestamp:Date.now(),message:x,level:C});},addSpanTag(h,x,C){if(h==="sampled-out")return;let q=E.get(h);q&&(q.tags[x]=C);},getDashboard(){let h=O.get(t.requests),x=O.get(t.errors),C=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=C?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:C?.avg??0,p99Latency:A.p99??0,activeSpans:E.size,totalTokens:q?.sum??0,totalCost:j?.sum??0}}},getMetric(h){let x=O.get(h);if(!x)return;let C=H(h);return {...x,...C}},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(),E.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(),E.clear(),T.length=0,P.length=0,F.clear();},getHealthStatus(){let h=O.get(t.requests),x=O.get(t.errors),C=h?.sum??0,q=x?.sum??0,j=C>0?q/C: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 vt(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 ht(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 St(e){switch(e){case "counter":return "sum";case "gauge":return "gauge";case "histogram":return "histogram";default:return "gauge"}}function xt(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=St(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 Ct(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 Et(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=ht(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=xt(c,t,r);await i("/v1/metrics",d,"metrics");},async exportTraces(c){if(c.length===0)return;let d=Ct(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 wt(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,E=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 $(){E++,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:E,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,E=0,T=0,P=null,F=null,_!=="CLOSED"&&c?.(_,"CLOSED");},isAllowed(){return d==="CLOSED"?true:d==="OPEN"?Date.now()-w>=o:I<r}}} | ||
| exports.CircuitBreakerOpenError=me;exports.DEVTOOLS_EVENT_NAME=tt;exports.createAgentMetrics=vt;exports.createCircuitBreaker=wt;exports.createOTLPExporter=Et;exports.createObservability=yt;exports.devtoolsPlugin=ut;exports.emitDevToolsEvent=gt;exports.loggingPlugin=rt;exports.performancePlugin=bt;exports.persistencePlugin=ft;//# sourceMappingURL=index.cjs.map | ||
| 'use strict';var chunk4VZOZWXM_cjs=require('../chunk-4VZOZWXM.cjs'),chunkEOLY64E6_cjs=require('../chunk-EOLY64E6.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:chunkEOLY64E6_cjs.e(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 chunk4VZOZWXM_cjs.b}});Object.defineProperty(exports,"memorySink",{enumerable:true,get:function(){return chunk4VZOZWXM_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,3 @@ | ||
| import { M as ModuleSchema, p as Plugin, aa as System } from '../plugins-DvrsPhzx.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 '../audit-ledger-qMjEBqiP.cjs'; | ||
| import { M as ModuleSchema, q as Plugin, aa as System } from '../plugins-Ykl_sAPE.cjs'; | ||
@@ -3,0 +4,0 @@ /** |
@@ -1,2 +0,3 @@ | ||
| import { M as ModuleSchema, p as Plugin, aa as System } from '../plugins-DvrsPhzx.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 '../audit-ledger-9IElAHH9.js'; | ||
| import { M as ModuleSchema, q as Plugin, aa as System } from '../plugins-Ykl_sAPE.js'; | ||
@@ -3,0 +4,0 @@ /** |
@@ -1,3 +0,3 @@ | ||
| import {e}from'../chunk-T6IJUWYR.js';var Oe={debug:0,info:1,warn:2,error:3};function rt(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 ot=200,ie=340,ae=16,ce=80,he=2,Se=["#8b9aff","#4ade80","#fbbf24","#c084fc","#f472b6","#22d3ee"];function $e(){return {entries:new ue(ot),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 E(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=E("Facts",true);i.appendChild(P.details);let F=E("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 C=document.createElement("details");C.style.marginBottom="4px";let q=document.createElement("summary");Object.assign(q.style,{cursor:"pointer",color:b.accent,marginBottom:"4px"}),q.textContent="Timeline",C.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),C.appendChild(j),i.appendChild(C);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:C,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 Ce(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 Ee(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 st(e){return Object.hasOwn(qe,e)?qe[e]:e}function Fe(e){return e instanceof RegExp?ee(String(e),40):fe(e)}var it=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",it.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=st(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 at(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 ct(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=at(a,p,l,d,c,y),N=we.get(e.flowSvg);if(N&&N.fingerprint===I){ct(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 E=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(E.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,C=new Map,q=new Map,j=new Map;for(let u of E){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);C.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=C.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 E=document.createElementNS("http://www.w3.org/2000/svg","line");E.setAttribute("x1",String(w)),E.setAttribute("y1","10"),E.setAttribute("x2",String(w)),E.setAttribute("y2",String(I)),E.setAttribute("stroke",b.border),E.setAttribute("stroke-width","0.5"),e.timelineSvg.appendChild(E);}for(let R=0;R<y.length;R++){let w=y[R],g=12+R*ae,f=R%Se.length,E=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:E),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",E),$.setAttribute("opacity","0.4"),$.setAttribute("stroke",E),$.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 lt(){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 ut(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=lt(),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(),E=$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,C=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&&Ce(n,N,m,y.flashTimers),v&C){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&&Ee(n,m),v&x&&Ze(n,E);}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{}Ce(v,N,m);let D=se(m);D&&(ye(v,D.inflight.length,D.unmet.length),be(v,D.inflight,D.unmet)),Ee(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(C)),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),E.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=E.inflight.get(n);E.inflight.delete(n),U!==void 0&&E.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=E.inflight.get(n);E.inflight.delete(n),B!==void 0&&E.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}),E.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(C));},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"]),dt=Math.random().toString(36).slice(2,8);function mt(){if(typeof window<"u"){let e=`__DIRECTIVE_BRIDGE_ID_${dt}__`,s=window,o=s[e]??0;return s[e]=o+1,o+1}return 1}function pt(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 gt(e){if(!(typeof window>"u"))try{let s=pt(e),o={id:mt(),timestamp:Date.now(),snapshotId:null,...s};window.dispatchEvent(new CustomEvent(tt,{detail:o}));}catch{}}function ft(e$1){let{storage:s,key:o,include:r,exclude:a=[],debounce:p=100,onRestore:l,onSave:t,onError:i}=e$1,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:e(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[E,T]of Object.entries(f))I(E)&&(d.facts[E]=T,y.add(E));}),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 E of g)E.type==="set"?y.add(E.key):y.delete(E.key),I(E.key)&&(f=true);f&&w();}}}function bt(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 E=performance.now(),T=I(g);if(T.evaluations++,T.lastEvaluatedAt=Date.now(),y>0){let P=E-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=E;},onResolverStart(g,f){let E=N(g);E.starts++;},onResolverComplete(g,f,E){let T=N(g);T.completions++,T.totalDurationMs+=E,T.avgDurationMs=T.totalDurationMs/T.completions,E>T.maxDurationMs&&(T.maxDurationMs=E),T.lastCompletedAt=Date.now(),E>a&&o?.(g,E);},onResolverError(g,f,E){N(g).errors++;},onResolverRetry(g,f,E){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 E={};for(let[T,P]of t)E[T]={...P};return {constraints:g,resolvers:f,effects:E,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 yt(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,E=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()))}`,C=f.get(x);C||(C=[],f.set(x,C)),C.push(h),C.length>y&&C.shift(),V(h.name,C),l.onMetricRecorded?.(h),_(h.name);}function V(h,x){if(x.length===0)return;let C=x.map(S=>S.value),q=C.reduce((S,A)=>S+A,0),j=x[0],u=C[C.length-1],M={name:h,type:j.type,count:x.length,sum:q,min:Math.min(...C),max:Math.max(...C),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 C=O.get(h);if(!C)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=C.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?.(C,A);break}}}}function H(h){let x=[];for(let[C,q]of f)if(C.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={},C=1){$({name:h,type:"counter",value:C,labels:x,timestamp:Date.now()});},setGauge(h,x,C={}){$({name:h,type:"gauge",value:x,labels:C,timestamp:Date.now()});},observeHistogram(h,x,C={}){$({name:h,type:"histogram",value:x,labels:C,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 C={traceId:x?E.get(x)?.traceId??ve():ve(),spanId:ve(),parentSpanId:x,operationName:h,serviceName:s,startTime:Date.now(),status:"ok",tags:{},logs:[]};return I&&(E.set(C.spanId,C),l.onSpanStart?.(C)),C},endSpan(h,x="ok"){if(h==="sampled-out")return;let C=E.get(h);if(C){for(C.endTime=Date.now(),C.duration=C.endTime-C.startTime,C.status=x,E.delete(h),T.push(C);T.length>R;)T.shift();$({name:`${C.operationName}.latency`,type:"histogram",value:C.duration,labels:{},timestamp:Date.now()}),x==="error"&&$({name:`${C.operationName}.errors`,type:"counter",value:1,labels:{},timestamp:Date.now()}),l.onSpanEnd?.(C);}},addSpanLog(h,x,C="info"){if(h==="sampled-out")return;let q=E.get(h);q&&q.logs.push({timestamp:Date.now(),message:x,level:C});},addSpanTag(h,x,C){if(h==="sampled-out")return;let q=E.get(h);q&&(q.tags[x]=C);},getDashboard(){let h=O.get(t.requests),x=O.get(t.errors),C=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=C?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:C?.avg??0,p99Latency:A.p99??0,activeSpans:E.size,totalTokens:q?.sum??0,totalCost:j?.sum??0}}},getMetric(h){let x=O.get(h);if(!x)return;let C=H(h);return {...x,...C}},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(),E.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(),E.clear(),T.length=0,P.length=0,F.clear();},getHealthStatus(){let h=O.get(t.requests),x=O.get(t.errors),C=h?.sum??0,q=x?.sum??0,j=C>0?q/C: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 vt(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 ht(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 St(e){switch(e){case "counter":return "sum";case "gauge":return "gauge";case "histogram":return "histogram";default:return "gauge"}}function xt(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=St(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 Ct(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 Et(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=ht(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=xt(c,t,r);await i("/v1/metrics",d,"metrics");},async exportTraces(c){if(c.length===0)return;let d=Ct(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 wt(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,E=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 $(){E++,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:E,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,E=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,vt as createAgentMetrics,wt as createCircuitBreaker,Et as createOTLPExporter,yt as createObservability,ut as devtoolsPlugin,gt as emitDevToolsEvent,rt as loggingPlugin,bt as performancePlugin,ft as persistencePlugin};//# sourceMappingURL=index.js.map | ||
| export{b as createAuditLedger,a as memorySink}from'../chunk-7TSYQEN3.js';import {e}from'../chunk-T6IJUWYR.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$1){let{storage:s,key:o,include:r,exclude:a=[],debounce:p=100,onRestore:l,onSave:t,onError:i}=e$1,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:e(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}}} | ||
| 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
-1
@@ -1,2 +0,2 @@ | ||
| 'use strict';var chunk2OS4RCLV_cjs=require('./chunk-2OS4RCLV.cjs');require('./chunk-WIZHZF4G.cjs'),require('./chunk-N4KTCKOI.cjs'),require('./chunk-EOLY64E6.cjs');async function R(){for(let e=0;e<10;e++)await Promise.resolve();}async function T(){for(let e=0;e<10;e++)await Promise.resolve();await new Promise(e=>setTimeout(e,0));for(let e=0;e<10;e++)await Promise.resolve();await new Promise(e=>setTimeout(e,0));for(let e=0;e<10;e++)await Promise.resolve();}async function D(e,s,r={}){let{totalTime:o=5e3,stepSize:c=10,maxIterations:l=1e3}=r,m=0,d=0;for(;m<o&&d<l;){if(await R(),e.inspect().inflight.length===0){await R();return}s(c),m+=c,d++;}let v=e.inspect();if(v.inflight.length>0){let f=v.inflight.map(p=>p.resolverId).join(", ");throw new Error(`[Directive] settleWithFakeTimers did not settle after ${o}ms. ${v.inflight.length} resolvers still inflight: ${f}`)}}function C(){let e=0,s=[];return {async advance(r){let o=e+r;for(;s.length>0&&s[0].time<=o;){let c=s.shift();e=c.time,c.callback(),await Promise.resolve();}e=o;},async next(){if(s.length===0)return;let r=s.shift();e=r.time,r.callback(),await Promise.resolve();},async runAll(){for(;s.length>0;)await this.next();},now(){return e},reset(){e=0,s.length=0;}}}function b(e){let s=typeof e=="string"?{requirement:(o=>o.type===e)}:e,r=s.calls??[];return {requirement:s.requirement??(o=>true),async resolve(o,c){if(r.push(o),s.delay&&await new Promise(l=>setTimeout(l,s.delay)),s.error)throw typeof s.error=="string"?new Error(s.error):s.error;s.resolve&&await s.resolve(o,c);}}}function E(e){let s=[],r=[];return {...{get calls(){return s},get pending(){return r},resolve(l){let m=r.shift();m&&m.resolve(l);},reject(l){let m=r.shift();m&&m.reject(l);},resolveAll(l){for(;r.length>0;)this.resolve(l);},rejectAll(l){for(;r.length>0;)this.reject(l);},reset(){s.length=0,r.length=0;}},handler:(l,m)=>(s.push(l),new Promise((d,v)=>{r.push({requirement:l,resolve:f=>d(f),reject:v});}))}}function P(e){return "module"in e?x(e):M(e)}function x(e){let s=[],r=new Map,o=[],c=[],l={};if(e.mocks?.resolvers)for(let[i,t]of Object.entries(e.mocks.resolvers)){let n=[];r.set(i,n),l[i]=b({...t,calls:n});}let m={...e.module,resolvers:{...e.module.resolvers,...l}},v=chunk2OS4RCLV_cjs.a({...e,module:m,plugins:[{name:"__test-tracking__",onFactSet:(i,t,n)=>{c.push({key:i,fullKey:i,namespace:void 0,previousValue:n,newValue:t,timestamp:Date.now()});},onRequirementCreated:i=>{o.push(i);}},...e.plugins??[]]}),f=v.dispatch.bind(v);return v.dispatch=i=>{s.push(i),f(i);},{...v,eventHistory:s,resolverCalls:r,get allRequirements(){return o},getFactsHistory(){return [...c]},resetFactsHistory(){c.length=0;},async waitForIdle(i=5e3){let t=Date.now(),n=async()=>{await new Promise(u=>setTimeout(u,0));let a=v.inspect();if(a.inflight.length>0){if(Date.now()-t>i){let u=a.inflight.map(g=>g.id).join(", ");throw new Error(`[Directive] waitForIdle timed out after ${i}ms. ${a.inflight.length} resolvers still inflight: ${u}`)}return await new Promise(u=>setTimeout(u,10)),n()}};return n()},assertRequirement(i){if(!o.some(n=>n.requirement.type===i))throw new Error(`[Directive] Expected requirement of type "${i}" but none found`)},assertResolverCalled(i,t){let n=r.get(i)??[];if(t!==void 0){if(n.length!==t)throw new Error(`[Directive] Expected resolver "${i}" to be called ${t} times but was called ${n.length} times`)}else if(n.length===0)throw new Error(`[Directive] Expected resolver "${i}" to be called but it was not`)},assertFactSet(i,t){let n=c.filter(a=>a.key===i);if(n.length===0)throw new Error(`[Directive] Expected fact "${i}" to be set but it was not`);if(t!==void 0&&!n.some(u=>u.newValue===t)){let u=n.map(g=>JSON.stringify(g.newValue)).join(", ");throw new Error(`[Directive] Expected fact "${i}" to be set to ${JSON.stringify(t)} but got: ${u}`)}},assertFactChanges(i,t){let n=c.filter(a=>a.key===i);if(n.length!==t)throw new Error(`[Directive] Expected fact "${i}" to change ${t} times but it changed ${n.length} times`)}}}function M(e){let s=[],r=new Map,o=[],c=[],l={};if(e.mocks?.resolvers)for(let[t,n]of Object.entries(e.mocks.resolvers)){let a=[];r.set(t,a),l[t]=b({...n,calls:a});}let m={};for(let[t,n]of Object.entries(e.modules))m[t]={...n,resolvers:{...n.resolvers,...l}};let d=new Set(Object.keys(e.modules)),f=chunk2OS4RCLV_cjs.a({...e,modules:m,plugins:[{name:"__test-tracking__",onFactSet:(t,n,a)=>{let g=t.indexOf("::"),y,h;if(g>0){let S=t.substring(0,g);d.has(S)?(y=S,h=t.substring(g+2)):h=t;}else h=t;c.push({key:h,fullKey:t,namespace:y,previousValue:a,newValue:n,timestamp:Date.now()});},onRequirementCreated:t=>{o.push(t);}},...e.plugins??[]]}),p=f.dispatch.bind(f);return f.dispatch=t=>{s.push(t),p(t);},{...f,eventHistory:s,resolverCalls:r,get allRequirements(){return o},getFactsHistory(){return [...c]},resetFactsHistory(){c.length=0;},async waitForIdle(t=5e3){let n=Date.now(),a=async()=>{await new Promise(g=>setTimeout(g,0));let u=f.inspect();if(u.inflight.length>0){if(Date.now()-n>t){let g=u.inflight.map(y=>y.id).join(", ");throw new Error(`[Directive] waitForIdle timed out after ${t}ms. ${u.inflight.length} resolvers still inflight: ${g}`)}return await new Promise(g=>setTimeout(g,10)),a()}};return a()},assertRequirement(t){if(!o.some(a=>a.requirement.type===t))throw new Error(`[Directive] Expected requirement of type "${t}" but none found`)},assertResolverCalled(t,n){let a=r.get(t)??[];if(n!==void 0){if(a.length!==n)throw new Error(`[Directive] Expected resolver "${t}" to be called ${n} times but was called ${a.length} times`)}else if(a.length===0)throw new Error(`[Directive] Expected resolver "${t}" to be called but it was not`)},assertFactSet(t,n){let a=c.filter(u=>u.key===t);if(a.length===0)throw new Error(`[Directive] Expected fact "${t}" to be set but it was not`);if(n!==void 0&&!a.some(g=>g.newValue===n)){let g=a.map(y=>JSON.stringify(y.newValue)).join(", ");throw new Error(`[Directive] Expected fact "${t}" to be set to ${JSON.stringify(n)} but got: ${g}`)}},assertFactChanges(t,n){let a=c.filter(u=>u.key===t);if(a.length!==n)throw new Error(`[Directive] Expected fact "${t}" to change ${n} times but it changed ${a.length} times`)}}}function O(e,s,r){if(!k(e,s,r))throw new Error(`[Directive] Expected ${s} "${r}" to be dynamic, but it is not.`)}function $(e,s,r){if(k(e,s,r))throw new Error(`[Directive] Expected ${s} "${r}" to NOT be dynamic, but it is.`)}function k(e,s,r){switch(s){case "constraint":return e.constraints.isDynamic(r);case "resolver":return e.resolvers.isDynamic(r);case "derivation":return e.derive.isDynamic(r);case "effect":return e.effects.isDynamic(r)}}function F(e){let s=new Set,r=new Set,o=new Set,c=new Set,l=null;return {async run(m){l=e.observe(d=>{switch(d.type){case "constraint.evaluate":d.active&&s.add(d.id);break;case "resolver.start":r.add(d.resolver);break;case "effect.run":o.add(d.id);break;case "derivation.compute":c.add(d.id);break}});try{await m();}finally{l?.(),l=null;}},report(){let m=e.inspect(),d=new Set(m.constraints.map(i=>i.id)),v=new Set(m.resolverDefs.map(i=>i.id)),f=new Set;for(let i of d)s.has(i)||f.add(i);let p=new Set;for(let i of v)r.has(i)||p.add(i);return {constraintsHit:s,constraintsMissed:f,resolversRun:r,resolversMissed:p,effectsRun:o,derivationsComputed:c,constraintCoverage:d.size===0?1:s.size/d.size,resolverCoverage:v.size===0?1:r.size/v.size,effectCoverage:m.effects.length===0?1:o.size/m.effects.length,derivationCoverage:m.derivations.length===0?1:c.size/m.derivations.length}}}}function I(e){let s=[],r=e.observe(o=>s.push(o));return {events:s,ofType(o){return s.filter(c=>c.type===o)},clear(){s.length=0;},dispose(){r();}}}exports.assertDynamic=O;exports.assertNotDynamic=$;exports.createCoverageTracker=F;exports.createFakeTimers=C;exports.createMockResolver=b;exports.createTestObserver=I;exports.createTestSystem=P;exports.flushAsync=T;exports.flushMicrotasks=R;exports.mockResolver=E;exports.settleWithFakeTimers=D;//# sourceMappingURL=testing.cjs.map | ||
| 'use strict';var chunkEX3XG667_cjs=require('./chunk-EX3XG667.cjs');require('./chunk-7NMXRATK.cjs'),require('./chunk-N4KTCKOI.cjs'),require('./chunk-EOLY64E6.cjs');async function R(){for(let e=0;e<10;e++)await Promise.resolve();}async function T(){for(let e=0;e<10;e++)await Promise.resolve();await new Promise(e=>setTimeout(e,0));for(let e=0;e<10;e++)await Promise.resolve();await new Promise(e=>setTimeout(e,0));for(let e=0;e<10;e++)await Promise.resolve();}async function D(e,s,r={}){let{totalTime:o=5e3,stepSize:c=10,maxIterations:l=1e3}=r,m=0,d=0;for(;m<o&&d<l;){if(await R(),e.inspect().inflight.length===0){await R();return}s(c),m+=c,d++;}let v=e.inspect();if(v.inflight.length>0){let f=v.inflight.map(p=>p.resolverId).join(", ");throw new Error(`[Directive] settleWithFakeTimers did not settle after ${o}ms. ${v.inflight.length} resolvers still inflight: ${f}`)}}function C(){let e=0,s=[];return {async advance(r){let o=e+r;for(;s.length>0&&s[0].time<=o;){let c=s.shift();e=c.time,c.callback(),await Promise.resolve();}e=o;},async next(){if(s.length===0)return;let r=s.shift();e=r.time,r.callback(),await Promise.resolve();},async runAll(){for(;s.length>0;)await this.next();},now(){return e},reset(){e=0,s.length=0;}}}function b(e){let s=typeof e=="string"?{requirement:(o=>o.type===e)}:e,r=s.calls??[];return {requirement:s.requirement??(o=>true),async resolve(o,c){if(r.push(o),s.delay&&await new Promise(l=>setTimeout(l,s.delay)),s.error)throw typeof s.error=="string"?new Error(s.error):s.error;s.resolve&&await s.resolve(o,c);}}}function E(e){let s=[],r=[];return {...{get calls(){return s},get pending(){return r},resolve(l){let m=r.shift();m&&m.resolve(l);},reject(l){let m=r.shift();m&&m.reject(l);},resolveAll(l){for(;r.length>0;)this.resolve(l);},rejectAll(l){for(;r.length>0;)this.reject(l);},reset(){s.length=0,r.length=0;}},handler:(l,m)=>(s.push(l),new Promise((d,v)=>{r.push({requirement:l,resolve:f=>d(f),reject:v});}))}}function P(e){return "module"in e?x(e):M(e)}function x(e){let s=[],r=new Map,o=[],c=[],l={};if(e.mocks?.resolvers)for(let[i,t]of Object.entries(e.mocks.resolvers)){let n=[];r.set(i,n),l[i]=b({...t,calls:n});}let m={...e.module,resolvers:{...e.module.resolvers,...l}},v=chunkEX3XG667_cjs.a({...e,module:m,plugins:[{name:"__test-tracking__",onFactSet:(i,t,n)=>{c.push({key:i,fullKey:i,namespace:void 0,previousValue:n,newValue:t,timestamp:Date.now()});},onRequirementCreated:i=>{o.push(i);}},...e.plugins??[]]}),f=v.dispatch.bind(v);return v.dispatch=i=>{s.push(i),f(i);},{...v,eventHistory:s,resolverCalls:r,get allRequirements(){return o},getFactsHistory(){return [...c]},resetFactsHistory(){c.length=0;},async waitForIdle(i=5e3){let t=Date.now(),n=async()=>{await new Promise(u=>setTimeout(u,0));let a=v.inspect();if(a.inflight.length>0){if(Date.now()-t>i){let u=a.inflight.map(g=>g.id).join(", ");throw new Error(`[Directive] waitForIdle timed out after ${i}ms. ${a.inflight.length} resolvers still inflight: ${u}`)}return await new Promise(u=>setTimeout(u,10)),n()}};return n()},assertRequirement(i){if(!o.some(n=>n.requirement.type===i))throw new Error(`[Directive] Expected requirement of type "${i}" but none found`)},assertResolverCalled(i,t){let n=r.get(i)??[];if(t!==void 0){if(n.length!==t)throw new Error(`[Directive] Expected resolver "${i}" to be called ${t} times but was called ${n.length} times`)}else if(n.length===0)throw new Error(`[Directive] Expected resolver "${i}" to be called but it was not`)},assertFactSet(i,t){let n=c.filter(a=>a.key===i);if(n.length===0)throw new Error(`[Directive] Expected fact "${i}" to be set but it was not`);if(t!==void 0&&!n.some(u=>u.newValue===t)){let u=n.map(g=>JSON.stringify(g.newValue)).join(", ");throw new Error(`[Directive] Expected fact "${i}" to be set to ${JSON.stringify(t)} but got: ${u}`)}},assertFactChanges(i,t){let n=c.filter(a=>a.key===i);if(n.length!==t)throw new Error(`[Directive] Expected fact "${i}" to change ${t} times but it changed ${n.length} times`)}}}function M(e){let s=[],r=new Map,o=[],c=[],l={};if(e.mocks?.resolvers)for(let[t,n]of Object.entries(e.mocks.resolvers)){let a=[];r.set(t,a),l[t]=b({...n,calls:a});}let m={};for(let[t,n]of Object.entries(e.modules))m[t]={...n,resolvers:{...n.resolvers,...l}};let d=new Set(Object.keys(e.modules)),f=chunkEX3XG667_cjs.a({...e,modules:m,plugins:[{name:"__test-tracking__",onFactSet:(t,n,a)=>{let g=t.indexOf("::"),y,h;if(g>0){let S=t.substring(0,g);d.has(S)?(y=S,h=t.substring(g+2)):h=t;}else h=t;c.push({key:h,fullKey:t,namespace:y,previousValue:a,newValue:n,timestamp:Date.now()});},onRequirementCreated:t=>{o.push(t);}},...e.plugins??[]]}),p=f.dispatch.bind(f);return f.dispatch=t=>{s.push(t),p(t);},{...f,eventHistory:s,resolverCalls:r,get allRequirements(){return o},getFactsHistory(){return [...c]},resetFactsHistory(){c.length=0;},async waitForIdle(t=5e3){let n=Date.now(),a=async()=>{await new Promise(g=>setTimeout(g,0));let u=f.inspect();if(u.inflight.length>0){if(Date.now()-n>t){let g=u.inflight.map(y=>y.id).join(", ");throw new Error(`[Directive] waitForIdle timed out after ${t}ms. ${u.inflight.length} resolvers still inflight: ${g}`)}return await new Promise(g=>setTimeout(g,10)),a()}};return a()},assertRequirement(t){if(!o.some(a=>a.requirement.type===t))throw new Error(`[Directive] Expected requirement of type "${t}" but none found`)},assertResolverCalled(t,n){let a=r.get(t)??[];if(n!==void 0){if(a.length!==n)throw new Error(`[Directive] Expected resolver "${t}" to be called ${n} times but was called ${a.length} times`)}else if(a.length===0)throw new Error(`[Directive] Expected resolver "${t}" to be called but it was not`)},assertFactSet(t,n){let a=c.filter(u=>u.key===t);if(a.length===0)throw new Error(`[Directive] Expected fact "${t}" to be set but it was not`);if(n!==void 0&&!a.some(g=>g.newValue===n)){let g=a.map(y=>JSON.stringify(y.newValue)).join(", ");throw new Error(`[Directive] Expected fact "${t}" to be set to ${JSON.stringify(n)} but got: ${g}`)}},assertFactChanges(t,n){let a=c.filter(u=>u.key===t);if(a.length!==n)throw new Error(`[Directive] Expected fact "${t}" to change ${n} times but it changed ${a.length} times`)}}}function O(e,s,r){if(!k(e,s,r))throw new Error(`[Directive] Expected ${s} "${r}" to be dynamic, but it is not.`)}function $(e,s,r){if(k(e,s,r))throw new Error(`[Directive] Expected ${s} "${r}" to NOT be dynamic, but it is.`)}function k(e,s,r){switch(s){case "constraint":return e.constraints.isDynamic(r);case "resolver":return e.resolvers.isDynamic(r);case "derivation":return e.derive.isDynamic(r);case "effect":return e.effects.isDynamic(r)}}function F(e){let s=new Set,r=new Set,o=new Set,c=new Set,l=null;return {async run(m){l=e.observe(d=>{switch(d.type){case "constraint.evaluate":d.active&&s.add(d.id);break;case "resolver.start":r.add(d.resolver);break;case "effect.run":o.add(d.id);break;case "derivation.compute":c.add(d.id);break}});try{await m();}finally{l?.(),l=null;}},report(){let m=e.inspect(),d=new Set(m.constraints.map(i=>i.id)),v=new Set(m.resolverDefs.map(i=>i.id)),f=new Set;for(let i of d)s.has(i)||f.add(i);let p=new Set;for(let i of v)r.has(i)||p.add(i);return {constraintsHit:s,constraintsMissed:f,resolversRun:r,resolversMissed:p,effectsRun:o,derivationsComputed:c,constraintCoverage:d.size===0?1:s.size/d.size,resolverCoverage:v.size===0?1:r.size/v.size,effectCoverage:m.effects.length===0?1:o.size/m.effects.length,derivationCoverage:m.derivations.length===0?1:c.size/m.derivations.length}}}}function I(e){let s=[],r=e.observe(o=>s.push(o));return {events:s,ofType(o){return s.filter(c=>c.type===o)},clear(){s.length=0;},dispose(){r();}}}exports.assertDynamic=O;exports.assertNotDynamic=$;exports.createCoverageTracker=F;exports.createFakeTimers=C;exports.createMockResolver=b;exports.createTestObserver=I;exports.createTestSystem=P;exports.flushAsync=T;exports.flushMicrotasks=R;exports.mockResolver=E;exports.settleWithFakeTimers=D;//# sourceMappingURL=testing.cjs.map | ||
| //# sourceMappingURL=testing.cjs.map |
@@ -1,2 +0,2 @@ | ||
| import { n as ModulesMap, o as CreateSystemOptionsNamed, s as Requirement, M as ModuleSchema, l as CreateSystemOptionsSingle, N as NamespacedSystem, R as RequirementWithId, m as SingleModuleSystem, _ as ObservationEvent, ac as SystemInspection } from './plugins-DvrsPhzx.cjs'; | ||
| import { o as ModulesMap, p as CreateSystemOptionsNamed, t as Requirement, M as ModuleSchema, m as CreateSystemOptionsSingle, N as NamespacedSystem, R as RequirementWithId, n as SingleModuleSystem, $ as ObservationEvent, ac as SystemInspection } from './plugins-Ykl_sAPE.cjs'; | ||
@@ -3,0 +3,0 @@ /** |
@@ -1,2 +0,2 @@ | ||
| import { n as ModulesMap, o as CreateSystemOptionsNamed, s as Requirement, M as ModuleSchema, l as CreateSystemOptionsSingle, N as NamespacedSystem, R as RequirementWithId, m as SingleModuleSystem, _ as ObservationEvent, ac as SystemInspection } from './plugins-DvrsPhzx.js'; | ||
| import { o as ModulesMap, p as CreateSystemOptionsNamed, t as Requirement, M as ModuleSchema, m as CreateSystemOptionsSingle, N as NamespacedSystem, R as RequirementWithId, n as SingleModuleSystem, $ as ObservationEvent, ac as SystemInspection } from './plugins-Ykl_sAPE.js'; | ||
@@ -3,0 +3,0 @@ /** |
+1
-1
@@ -1,2 +0,2 @@ | ||
| import {a}from'./chunk-FCOZCTLY.js';import'./chunk-ZE2RY5KP.js';import'./chunk-TZHC4E6S.js';import'./chunk-T6IJUWYR.js';async function R(){for(let e=0;e<10;e++)await Promise.resolve();}async function T(){for(let e=0;e<10;e++)await Promise.resolve();await new Promise(e=>setTimeout(e,0));for(let e=0;e<10;e++)await Promise.resolve();await new Promise(e=>setTimeout(e,0));for(let e=0;e<10;e++)await Promise.resolve();}async function D(e,s,r={}){let{totalTime:o=5e3,stepSize:c=10,maxIterations:l=1e3}=r,m=0,d=0;for(;m<o&&d<l;){if(await R(),e.inspect().inflight.length===0){await R();return}s(c),m+=c,d++;}let v=e.inspect();if(v.inflight.length>0){let f=v.inflight.map(p=>p.resolverId).join(", ");throw new Error(`[Directive] settleWithFakeTimers did not settle after ${o}ms. ${v.inflight.length} resolvers still inflight: ${f}`)}}function C(){let e=0,s=[];return {async advance(r){let o=e+r;for(;s.length>0&&s[0].time<=o;){let c=s.shift();e=c.time,c.callback(),await Promise.resolve();}e=o;},async next(){if(s.length===0)return;let r=s.shift();e=r.time,r.callback(),await Promise.resolve();},async runAll(){for(;s.length>0;)await this.next();},now(){return e},reset(){e=0,s.length=0;}}}function b(e){let s=typeof e=="string"?{requirement:(o=>o.type===e)}:e,r=s.calls??[];return {requirement:s.requirement??(o=>true),async resolve(o,c){if(r.push(o),s.delay&&await new Promise(l=>setTimeout(l,s.delay)),s.error)throw typeof s.error=="string"?new Error(s.error):s.error;s.resolve&&await s.resolve(o,c);}}}function E(e){let s=[],r=[];return {...{get calls(){return s},get pending(){return r},resolve(l){let m=r.shift();m&&m.resolve(l);},reject(l){let m=r.shift();m&&m.reject(l);},resolveAll(l){for(;r.length>0;)this.resolve(l);},rejectAll(l){for(;r.length>0;)this.reject(l);},reset(){s.length=0,r.length=0;}},handler:(l,m)=>(s.push(l),new Promise((d,v)=>{r.push({requirement:l,resolve:f=>d(f),reject:v});}))}}function P(e){return "module"in e?x(e):M(e)}function x(e){let s=[],r=new Map,o=[],c=[],l={};if(e.mocks?.resolvers)for(let[i,t]of Object.entries(e.mocks.resolvers)){let n=[];r.set(i,n),l[i]=b({...t,calls:n});}let m={...e.module,resolvers:{...e.module.resolvers,...l}},v=a({...e,module:m,plugins:[{name:"__test-tracking__",onFactSet:(i,t,n)=>{c.push({key:i,fullKey:i,namespace:void 0,previousValue:n,newValue:t,timestamp:Date.now()});},onRequirementCreated:i=>{o.push(i);}},...e.plugins??[]]}),f=v.dispatch.bind(v);return v.dispatch=i=>{s.push(i),f(i);},{...v,eventHistory:s,resolverCalls:r,get allRequirements(){return o},getFactsHistory(){return [...c]},resetFactsHistory(){c.length=0;},async waitForIdle(i=5e3){let t=Date.now(),n=async()=>{await new Promise(u=>setTimeout(u,0));let a=v.inspect();if(a.inflight.length>0){if(Date.now()-t>i){let u=a.inflight.map(g=>g.id).join(", ");throw new Error(`[Directive] waitForIdle timed out after ${i}ms. ${a.inflight.length} resolvers still inflight: ${u}`)}return await new Promise(u=>setTimeout(u,10)),n()}};return n()},assertRequirement(i){if(!o.some(n=>n.requirement.type===i))throw new Error(`[Directive] Expected requirement of type "${i}" but none found`)},assertResolverCalled(i,t){let n=r.get(i)??[];if(t!==void 0){if(n.length!==t)throw new Error(`[Directive] Expected resolver "${i}" to be called ${t} times but was called ${n.length} times`)}else if(n.length===0)throw new Error(`[Directive] Expected resolver "${i}" to be called but it was not`)},assertFactSet(i,t){let n=c.filter(a=>a.key===i);if(n.length===0)throw new Error(`[Directive] Expected fact "${i}" to be set but it was not`);if(t!==void 0&&!n.some(u=>u.newValue===t)){let u=n.map(g=>JSON.stringify(g.newValue)).join(", ");throw new Error(`[Directive] Expected fact "${i}" to be set to ${JSON.stringify(t)} but got: ${u}`)}},assertFactChanges(i,t){let n=c.filter(a=>a.key===i);if(n.length!==t)throw new Error(`[Directive] Expected fact "${i}" to change ${t} times but it changed ${n.length} times`)}}}function M(e){let s=[],r=new Map,o=[],c=[],l={};if(e.mocks?.resolvers)for(let[t,n]of Object.entries(e.mocks.resolvers)){let a=[];r.set(t,a),l[t]=b({...n,calls:a});}let m={};for(let[t,n]of Object.entries(e.modules))m[t]={...n,resolvers:{...n.resolvers,...l}};let d=new Set(Object.keys(e.modules)),f=a({...e,modules:m,plugins:[{name:"__test-tracking__",onFactSet:(t,n,a)=>{let g=t.indexOf("::"),y,h;if(g>0){let S=t.substring(0,g);d.has(S)?(y=S,h=t.substring(g+2)):h=t;}else h=t;c.push({key:h,fullKey:t,namespace:y,previousValue:a,newValue:n,timestamp:Date.now()});},onRequirementCreated:t=>{o.push(t);}},...e.plugins??[]]}),p=f.dispatch.bind(f);return f.dispatch=t=>{s.push(t),p(t);},{...f,eventHistory:s,resolverCalls:r,get allRequirements(){return o},getFactsHistory(){return [...c]},resetFactsHistory(){c.length=0;},async waitForIdle(t=5e3){let n=Date.now(),a=async()=>{await new Promise(g=>setTimeout(g,0));let u=f.inspect();if(u.inflight.length>0){if(Date.now()-n>t){let g=u.inflight.map(y=>y.id).join(", ");throw new Error(`[Directive] waitForIdle timed out after ${t}ms. ${u.inflight.length} resolvers still inflight: ${g}`)}return await new Promise(g=>setTimeout(g,10)),a()}};return a()},assertRequirement(t){if(!o.some(a=>a.requirement.type===t))throw new Error(`[Directive] Expected requirement of type "${t}" but none found`)},assertResolverCalled(t,n){let a=r.get(t)??[];if(n!==void 0){if(a.length!==n)throw new Error(`[Directive] Expected resolver "${t}" to be called ${n} times but was called ${a.length} times`)}else if(a.length===0)throw new Error(`[Directive] Expected resolver "${t}" to be called but it was not`)},assertFactSet(t,n){let a=c.filter(u=>u.key===t);if(a.length===0)throw new Error(`[Directive] Expected fact "${t}" to be set but it was not`);if(n!==void 0&&!a.some(g=>g.newValue===n)){let g=a.map(y=>JSON.stringify(y.newValue)).join(", ");throw new Error(`[Directive] Expected fact "${t}" to be set to ${JSON.stringify(n)} but got: ${g}`)}},assertFactChanges(t,n){let a=c.filter(u=>u.key===t);if(a.length!==n)throw new Error(`[Directive] Expected fact "${t}" to change ${n} times but it changed ${a.length} times`)}}}function O(e,s,r){if(!k(e,s,r))throw new Error(`[Directive] Expected ${s} "${r}" to be dynamic, but it is not.`)}function $(e,s,r){if(k(e,s,r))throw new Error(`[Directive] Expected ${s} "${r}" to NOT be dynamic, but it is.`)}function k(e,s,r){switch(s){case "constraint":return e.constraints.isDynamic(r);case "resolver":return e.resolvers.isDynamic(r);case "derivation":return e.derive.isDynamic(r);case "effect":return e.effects.isDynamic(r)}}function F(e){let s=new Set,r=new Set,o=new Set,c=new Set,l=null;return {async run(m){l=e.observe(d=>{switch(d.type){case "constraint.evaluate":d.active&&s.add(d.id);break;case "resolver.start":r.add(d.resolver);break;case "effect.run":o.add(d.id);break;case "derivation.compute":c.add(d.id);break}});try{await m();}finally{l?.(),l=null;}},report(){let m=e.inspect(),d=new Set(m.constraints.map(i=>i.id)),v=new Set(m.resolverDefs.map(i=>i.id)),f=new Set;for(let i of d)s.has(i)||f.add(i);let p=new Set;for(let i of v)r.has(i)||p.add(i);return {constraintsHit:s,constraintsMissed:f,resolversRun:r,resolversMissed:p,effectsRun:o,derivationsComputed:c,constraintCoverage:d.size===0?1:s.size/d.size,resolverCoverage:v.size===0?1:r.size/v.size,effectCoverage:m.effects.length===0?1:o.size/m.effects.length,derivationCoverage:m.derivations.length===0?1:c.size/m.derivations.length}}}}function I(e){let s=[],r=e.observe(o=>s.push(o));return {events:s,ofType(o){return s.filter(c=>c.type===o)},clear(){s.length=0;},dispose(){r();}}}export{O as assertDynamic,$ as assertNotDynamic,F as createCoverageTracker,C as createFakeTimers,b as createMockResolver,I as createTestObserver,P as createTestSystem,T as flushAsync,R as flushMicrotasks,E as mockResolver,D as settleWithFakeTimers};//# sourceMappingURL=testing.js.map | ||
| import {a}from'./chunk-26Z5VNPZ.js';import'./chunk-TPOKS4RY.js';import'./chunk-TZHC4E6S.js';import'./chunk-T6IJUWYR.js';async function R(){for(let e=0;e<10;e++)await Promise.resolve();}async function T(){for(let e=0;e<10;e++)await Promise.resolve();await new Promise(e=>setTimeout(e,0));for(let e=0;e<10;e++)await Promise.resolve();await new Promise(e=>setTimeout(e,0));for(let e=0;e<10;e++)await Promise.resolve();}async function D(e,s,r={}){let{totalTime:o=5e3,stepSize:c=10,maxIterations:l=1e3}=r,m=0,d=0;for(;m<o&&d<l;){if(await R(),e.inspect().inflight.length===0){await R();return}s(c),m+=c,d++;}let v=e.inspect();if(v.inflight.length>0){let f=v.inflight.map(p=>p.resolverId).join(", ");throw new Error(`[Directive] settleWithFakeTimers did not settle after ${o}ms. ${v.inflight.length} resolvers still inflight: ${f}`)}}function C(){let e=0,s=[];return {async advance(r){let o=e+r;for(;s.length>0&&s[0].time<=o;){let c=s.shift();e=c.time,c.callback(),await Promise.resolve();}e=o;},async next(){if(s.length===0)return;let r=s.shift();e=r.time,r.callback(),await Promise.resolve();},async runAll(){for(;s.length>0;)await this.next();},now(){return e},reset(){e=0,s.length=0;}}}function b(e){let s=typeof e=="string"?{requirement:(o=>o.type===e)}:e,r=s.calls??[];return {requirement:s.requirement??(o=>true),async resolve(o,c){if(r.push(o),s.delay&&await new Promise(l=>setTimeout(l,s.delay)),s.error)throw typeof s.error=="string"?new Error(s.error):s.error;s.resolve&&await s.resolve(o,c);}}}function E(e){let s=[],r=[];return {...{get calls(){return s},get pending(){return r},resolve(l){let m=r.shift();m&&m.resolve(l);},reject(l){let m=r.shift();m&&m.reject(l);},resolveAll(l){for(;r.length>0;)this.resolve(l);},rejectAll(l){for(;r.length>0;)this.reject(l);},reset(){s.length=0,r.length=0;}},handler:(l,m)=>(s.push(l),new Promise((d,v)=>{r.push({requirement:l,resolve:f=>d(f),reject:v});}))}}function P(e){return "module"in e?x(e):M(e)}function x(e){let s=[],r=new Map,o=[],c=[],l={};if(e.mocks?.resolvers)for(let[i,t]of Object.entries(e.mocks.resolvers)){let n=[];r.set(i,n),l[i]=b({...t,calls:n});}let m={...e.module,resolvers:{...e.module.resolvers,...l}},v=a({...e,module:m,plugins:[{name:"__test-tracking__",onFactSet:(i,t,n)=>{c.push({key:i,fullKey:i,namespace:void 0,previousValue:n,newValue:t,timestamp:Date.now()});},onRequirementCreated:i=>{o.push(i);}},...e.plugins??[]]}),f=v.dispatch.bind(v);return v.dispatch=i=>{s.push(i),f(i);},{...v,eventHistory:s,resolverCalls:r,get allRequirements(){return o},getFactsHistory(){return [...c]},resetFactsHistory(){c.length=0;},async waitForIdle(i=5e3){let t=Date.now(),n=async()=>{await new Promise(u=>setTimeout(u,0));let a=v.inspect();if(a.inflight.length>0){if(Date.now()-t>i){let u=a.inflight.map(g=>g.id).join(", ");throw new Error(`[Directive] waitForIdle timed out after ${i}ms. ${a.inflight.length} resolvers still inflight: ${u}`)}return await new Promise(u=>setTimeout(u,10)),n()}};return n()},assertRequirement(i){if(!o.some(n=>n.requirement.type===i))throw new Error(`[Directive] Expected requirement of type "${i}" but none found`)},assertResolverCalled(i,t){let n=r.get(i)??[];if(t!==void 0){if(n.length!==t)throw new Error(`[Directive] Expected resolver "${i}" to be called ${t} times but was called ${n.length} times`)}else if(n.length===0)throw new Error(`[Directive] Expected resolver "${i}" to be called but it was not`)},assertFactSet(i,t){let n=c.filter(a=>a.key===i);if(n.length===0)throw new Error(`[Directive] Expected fact "${i}" to be set but it was not`);if(t!==void 0&&!n.some(u=>u.newValue===t)){let u=n.map(g=>JSON.stringify(g.newValue)).join(", ");throw new Error(`[Directive] Expected fact "${i}" to be set to ${JSON.stringify(t)} but got: ${u}`)}},assertFactChanges(i,t){let n=c.filter(a=>a.key===i);if(n.length!==t)throw new Error(`[Directive] Expected fact "${i}" to change ${t} times but it changed ${n.length} times`)}}}function M(e){let s=[],r=new Map,o=[],c=[],l={};if(e.mocks?.resolvers)for(let[t,n]of Object.entries(e.mocks.resolvers)){let a=[];r.set(t,a),l[t]=b({...n,calls:a});}let m={};for(let[t,n]of Object.entries(e.modules))m[t]={...n,resolvers:{...n.resolvers,...l}};let d=new Set(Object.keys(e.modules)),f=a({...e,modules:m,plugins:[{name:"__test-tracking__",onFactSet:(t,n,a)=>{let g=t.indexOf("::"),y,h;if(g>0){let S=t.substring(0,g);d.has(S)?(y=S,h=t.substring(g+2)):h=t;}else h=t;c.push({key:h,fullKey:t,namespace:y,previousValue:a,newValue:n,timestamp:Date.now()});},onRequirementCreated:t=>{o.push(t);}},...e.plugins??[]]}),p=f.dispatch.bind(f);return f.dispatch=t=>{s.push(t),p(t);},{...f,eventHistory:s,resolverCalls:r,get allRequirements(){return o},getFactsHistory(){return [...c]},resetFactsHistory(){c.length=0;},async waitForIdle(t=5e3){let n=Date.now(),a=async()=>{await new Promise(g=>setTimeout(g,0));let u=f.inspect();if(u.inflight.length>0){if(Date.now()-n>t){let g=u.inflight.map(y=>y.id).join(", ");throw new Error(`[Directive] waitForIdle timed out after ${t}ms. ${u.inflight.length} resolvers still inflight: ${g}`)}return await new Promise(g=>setTimeout(g,10)),a()}};return a()},assertRequirement(t){if(!o.some(a=>a.requirement.type===t))throw new Error(`[Directive] Expected requirement of type "${t}" but none found`)},assertResolverCalled(t,n){let a=r.get(t)??[];if(n!==void 0){if(a.length!==n)throw new Error(`[Directive] Expected resolver "${t}" to be called ${n} times but was called ${a.length} times`)}else if(a.length===0)throw new Error(`[Directive] Expected resolver "${t}" to be called but it was not`)},assertFactSet(t,n){let a=c.filter(u=>u.key===t);if(a.length===0)throw new Error(`[Directive] Expected fact "${t}" to be set but it was not`);if(n!==void 0&&!a.some(g=>g.newValue===n)){let g=a.map(y=>JSON.stringify(y.newValue)).join(", ");throw new Error(`[Directive] Expected fact "${t}" to be set to ${JSON.stringify(n)} but got: ${g}`)}},assertFactChanges(t,n){let a=c.filter(u=>u.key===t);if(a.length!==n)throw new Error(`[Directive] Expected fact "${t}" to change ${n} times but it changed ${a.length} times`)}}}function O(e,s,r){if(!k(e,s,r))throw new Error(`[Directive] Expected ${s} "${r}" to be dynamic, but it is not.`)}function $(e,s,r){if(k(e,s,r))throw new Error(`[Directive] Expected ${s} "${r}" to NOT be dynamic, but it is.`)}function k(e,s,r){switch(s){case "constraint":return e.constraints.isDynamic(r);case "resolver":return e.resolvers.isDynamic(r);case "derivation":return e.derive.isDynamic(r);case "effect":return e.effects.isDynamic(r)}}function F(e){let s=new Set,r=new Set,o=new Set,c=new Set,l=null;return {async run(m){l=e.observe(d=>{switch(d.type){case "constraint.evaluate":d.active&&s.add(d.id);break;case "resolver.start":r.add(d.resolver);break;case "effect.run":o.add(d.id);break;case "derivation.compute":c.add(d.id);break}});try{await m();}finally{l?.(),l=null;}},report(){let m=e.inspect(),d=new Set(m.constraints.map(i=>i.id)),v=new Set(m.resolverDefs.map(i=>i.id)),f=new Set;for(let i of d)s.has(i)||f.add(i);let p=new Set;for(let i of v)r.has(i)||p.add(i);return {constraintsHit:s,constraintsMissed:f,resolversRun:r,resolversMissed:p,effectsRun:o,derivationsComputed:c,constraintCoverage:d.size===0?1:s.size/d.size,resolverCoverage:v.size===0?1:r.size/v.size,effectCoverage:m.effects.length===0?1:o.size/m.effects.length,derivationCoverage:m.derivations.length===0?1:c.size/m.derivations.length}}}}function I(e){let s=[],r=e.observe(o=>s.push(o));return {events:s,ofType(o){return s.filter(c=>c.type===o)},clear(){s.length=0;},dispose(){r();}}}export{O as assertDynamic,$ as assertNotDynamic,F as createCoverageTracker,C as createFakeTimers,b as createMockResolver,I as createTestObserver,P as createTestSystem,T as flushAsync,R as flushMicrotasks,E as mockResolver,D as settleWithFakeTimers};//# sourceMappingURL=testing.js.map | ||
| //# sourceMappingURL=testing.js.map |
+1
-1
@@ -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-DEMPYZHI.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 _(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-GK3NSFQH.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 | ||
| //# sourceMappingURL=worker.cjs.map |
@@ -1,2 +0,2 @@ | ||
| import { M as ModuleSchema, w as DistributableSnapshotOptions, v as DistributableSnapshot, ac as SystemInspection, s as Requirement } from './plugins-DvrsPhzx.cjs'; | ||
| import { M as ModuleSchema, x as DistributableSnapshotOptions, w as DistributableSnapshot, ac as SystemInspection, t as Requirement } from './plugins-Ykl_sAPE.cjs'; | ||
@@ -3,0 +3,0 @@ /** |
+1
-1
@@ -1,2 +0,2 @@ | ||
| import { M as ModuleSchema, w as DistributableSnapshotOptions, v as DistributableSnapshot, ac as SystemInspection, s as Requirement } from './plugins-DvrsPhzx.js'; | ||
| import { M as ModuleSchema, x as DistributableSnapshotOptions, w as DistributableSnapshot, ac as SystemInspection, t as Requirement } from './plugins-Ykl_sAPE.js'; | ||
@@ -3,0 +3,0 @@ /** |
+1
-1
@@ -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-R4JL6U4S.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 _(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-VZWB6WXX.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 | ||
| //# sourceMappingURL=worker.js.map |
+1
-1
| { | ||
| "name": "@directive-run/core", | ||
| "version": "1.10.0", | ||
| "version": "1.11.0", | ||
| "imports": { | ||
@@ -5,0 +5,0 @@ "#is-development": { |
| 'use strict';var chunkWIZHZF4G_cjs=require('./chunk-WIZHZF4G.cjs'),chunkN4KTCKOI_cjs=require('./chunk-N4KTCKOI.cjs'),chunkEOLY64E6_cjs=require('./chunk-EOLY64E6.cjs');var m="::",he=Symbol.for("nodejs.util.inspect.custom");function we(e){if(!e.ownKeys)return {};let n={};for(let t of e.ownKeys())n[t]=e.get(t);return n}function D(e){return new Proxy({},{get(n,t){if(typeof t=="symbol")return t===he?()=>we(e):void 0;if(!chunkN4KTCKOI_cjs.l.has(t))return e.get(t)},set(n,t,s){return typeof t=="symbol"||chunkN4KTCKOI_cjs.l.has(t)?false:e.set?e.set(t,s):false},has(n,t){return typeof t=="symbol"||chunkN4KTCKOI_cjs.l.has(t)?false:e.has?e.has(t):false},deleteProperty(n,t){return typeof t=="symbol"||chunkN4KTCKOI_cjs.l.has(t)?false:e.delete?e.delete(t):false},ownKeys(){return e.ownKeys?e.ownKeys():[]},getOwnPropertyDescriptor(n,t){if(typeof t!="symbol"&&e.has&&typeof t=="string"&&e.has(t))return {configurable:true,enumerable:true}},defineProperty(){return false},getPrototypeOf(){return null},setPrototypeOf(){return false}})}var Z=new WeakMap,Q=new WeakMap,X=new WeakMap,ee=new WeakMap,ne=new WeakMap,te=new WeakMap;function $(e,n){let t=Z.get(e);if(t){let r=t.get(n);if(r)return r}else t=new Map,Z.set(e,t);let s=D({get:r=>r==="$store"||r==="$snapshot"?e[r]:e[`${n}${m}${r}`],set:(r,u)=>{if(chunkN4KTCKOI_cjs.a){let i=chunkN4KTCKOI_cjs.m(u);i&&chunkN4KTCKOI_cjs.n(`${n}.${r}`,i);}return e[`${n}${m}${r}`]=u,true},has:r=>`${n}${m}${r}`in e,delete:r=>(delete e[`${n}${m}${r}`],true)});return t.set(n,s),s}function re(e,n,t){let s=Q.get(e);if(s)return s;let r=D({get:u=>{if(Object.hasOwn(n,u))return $(e,u)},has:u=>Object.hasOwn(n,u),ownKeys:()=>t()});return Q.set(e,r),r}function oe(e,n,t){let s=`${n}|${t.join(",")}`,r=ne.get(e);if(r){let o=r.get(s);if(o)return o}else r=new Map,ne.set(e,r);let u=new Set(t),i=["self",...t],c=D({get:o=>{if(o==="self")return $(e,n);if(u.has(o))return $(e,o);chunkN4KTCKOI_cjs.a&&console.warn(`[Directive] Module "${n}" accessed undeclared cross-module property "${o}". Add it to crossModuleDeps or use "facts.self.${o}" for own module facts.`);},has:o=>o==="self"||u.has(o),ownKeys:()=>i});return r.set(s,c),c}function B(e,n){let t=ee.get(e);if(t){let r=t.get(n);if(r)return r}else t=new Map,ee.set(e,t);let s=D({get:r=>e[`${n}${m}${r}`],has:r=>`${n}${m}${r}`in e});return t.set(n,s),s}function se(e,n,t){let s=X.get(e);if(s)return s;let r=D({get:u=>{if(Object.hasOwn(n,u))return B(e,u)},has:u=>Object.hasOwn(n,u),ownKeys:()=>t()});return X.set(e,r),r}function ie(e,n,t){let s=te.get(e);return s||(s=new Map,te.set(e,s)),D({get:r=>{if(!Object.hasOwn(n,r))return;let u=s.get(r);if(u)return u;let i=D({get:c=>o=>{e.dispatch({type:`${r}${m}${c}`,...o});}});return s.set(r,i),i},has:r=>Object.hasOwn(n,r),ownKeys:()=>t()})}function R(e){if(e.includes(".")){let[n,...t]=e.split(".");return `${n}${m}${t.join(m)}`}return e}function H(e){let n={};for(let[t,s]of Object.entries(e)){let r=t.indexOf(m);if(r>0){let u=t.slice(0,r),i=t.slice(r+m.length);n[u]||(n[u]={}),n[u][i]=s;}else n._root||(n._root={}),n._root[t]=s;}return n}function P(e,n,t,s){return t?oe(e,n,s):$(e,n)}function b(e,n){return `${e}${m}${n}`}function ae(e){return e.includes(m)}function E(e,n,t){if(Array.isArray(e)){let i=e.map(c=>{if(c&&typeof c=="object"&&typeof c.fact=="string"){let o=c.fact;return ae(o)?c:{...c,fact:b(n,o)}}return c});return chunkEOLY64E6_cjs.a(i),i}if(!e||typeof e!="object")return e;let s=e;if("$all"in s||"$any"in s){let i="$all"in s?"$all":"$any",c=s[i],o={[i]:c.map(f=>E(f,n,t))};return chunkEOLY64E6_cjs.a(o),o}if("$not"in s){let i={$not:E(s.$not,n,t)};return chunkEOLY64E6_cjs.a(i),i}function r(i,c){return E(i,c,ce)}let u={};for(let i of Object.keys(s)){if(i.startsWith("$")||ae(i)){u[i]=s[i];continue}if(i==="self"){let c=s[i];if(c&&typeof c=="object"){let o=r(c,n);if(o&&typeof o=="object"&&!Array.isArray(o)){for(let[f,l]of Object.entries(o))u[f]=l;continue}}}if(t.has(i)){let c=s[i];if(c&&typeof c=="object"){let o=r(c,i);if(o&&typeof o=="object"&&!Array.isArray(o)){for(let[f,l]of Object.entries(o))u[f]=l;continue}}}u[b(n,i)]=s[i];}return chunkEOLY64E6_cjs.a(u),u}var ce=new Set;function me(e,n){let t=e.crossModuleDeps?new Set(Object.keys(e.crossModuleDeps)):ce,s=e.constraints;if(s){let c=false,o={};for(let[f,l]of Object.entries(s)){let d=l;if(d.when!==void 0&&typeof d.when!="function"){o[f]={...d,when:E(d.when,n,t)},c=true;continue}o[f]=l;}c&&(s=o);}let r=e.derive;if(r){let c=false,o={};for(let[f,l]of Object.entries(r)){let d=l&&typeof l=="object"&&Object.hasOwn(l,"compute")?l:null;if(!d){o[f]=l;continue}let g=d.compute;if(typeof g=="function"){o[f]=l;continue}if(chunkWIZHZF4G_cjs.f(g)){chunkEOLY64E6_cjs.a(g);let k=w=>chunkWIZHZF4G_cjs.l(g,w);o[f]=d.meta?{compute:k,meta:d.meta}:k,c=true;continue}if(chunkWIZHZF4G_cjs.d(g)){chunkEOLY64E6_cjs.a(g);let k=chunkWIZHZF4G_cjs.j(g),w=j=>k(j);o[f]=d.meta?{compute:w,meta:d.meta}:w,c=true;continue}o[f]=l;}c&&(r=o);}let u=e.events;if(u){let c=false,o={};for(let[f,l]of Object.entries(u)){if(l&&typeof l=="object"){let d=Object.hasOwn(l,"handler"),g=Object.hasOwn(l,"patch");if(d&&g&&chunkN4KTCKOI_cjs.a&&console.warn(`[Directive] event "${f}": both \`handler\` and \`patch\` provided \u2014 using \`handler\` (patch is ignored).`),g&&!d){let k=l;chunkEOLY64E6_cjs.a(k.patch);let w=(j,O)=>chunkWIZHZF4G_cjs.o(k.patch,j,O??{});o[f]=k.meta?{handler:w,meta:k.meta}:w,c=true;continue}}o[f]=l;}c&&(u=o);}let i=e.effects;if(i){let c=false,o={};for(let[f,l]of Object.entries(i)){let d=l;if(d.on!==void 0&&chunkWIZHZF4G_cjs.d(d.on)){o[f]={...d,on:E(d.on,n,t)},c=true;continue}o[f]=l;}c&&(i=o);}return s===e.constraints&&r===e.derive&&u===e.events&&i===e.effects?e:{...e,constraints:s,derive:r,events:u,effects:i}}function C(e){return Object.keys(e).length>0?e:void 0}function ke(e,n){let t={};for(let[s,r]of Object.entries(e.schema.facts))t[b(n,s)]=r;return t}function pe(e,n){if(e.init)return t=>{let s=$(t,n);e.init(s);}}function ve(e,n,t,s){if(!e.derive)return;let r={};for(let[u,i]of Object.entries(e.derive)){let c=chunkWIZHZF4G_cjs.p(i),o=c?i.compute:i,f=c?i.meta:void 0,l=(d,g)=>{let k=P(d,n,t,s),w=B(g,n);return o(k,w)};r[b(n,u)]=f?{compute:l,meta:f}:l;}return C(r)}function be(e,n){if(!e.events)return;let t={};for(let[s,r]of Object.entries(e.events)){let u=typeof r=="object"&&r!==null&&Object.hasOwn(r,"handler"),i=u?r.handler:r,c=u?r.meta:void 0,o=(f,l)=>{let d=$(f,n);i(d,l);};t[b(n,s)]=c?{handler:o,meta:c}:o;}return C(t)}function Me(e,n,t,s){if(!e.constraints)return;let r={};for(let[u,i]of Object.entries(e.constraints)){let c=i,o=typeof c.when=="function";r[b(n,u)]={...c,deps:c.deps?.map(f=>b(n,f)),after:c.after?.map(f=>f.includes(m)?f:b(n,f)),owns:c.owns?.map(f=>f.includes(m)?f:b(n,f)),when:o?f=>{let l=P(f,n,t,s);return c.when(l)}:c.when,require:typeof c.require=="function"?f=>{let l=P(f,n,t,s);return c.require(l)}:c.require};}return C(r)}function Re(e,n,t,s){if(!e.resolvers)return;let r={};for(let[i,c]of Object.entries(e.resolvers)){let f=function(l){return {facts:P(l.facts,n,t,s),signal:l.signal}};let o=c;r[b(n,i)]={...o,...o.resolve&&{resolve:async(l,d)=>{await o.resolve(l,f(d));}},...o.resolveBatch&&{resolveBatch:async(l,d)=>{await o.resolveBatch(l,f(d));}},...o.resolveBatchWithResults&&{resolveBatchWithResults:async(l,d)=>o.resolveBatchWithResults(l,f(d))}};}return C(r)}function Se(e,n,t,s){if(!e.effects)return;let r={};for(let[u,i]of Object.entries(e.effects)){let c=i;r[b(n,u)]={...c,run:(o,f)=>{let l=P(o,n,t,s),d=f?P(f,n,t,s):void 0;return c.run(l,d)},deps:c.deps?.map(o=>b(n,o))};}return C(r)}function Oe(e,n,t){return {snapshotEvents:t&&!t.has(n)?[]:e.history?.snapshotEvents?.map(s=>b(n,s))}}function I(e){let{mod:n,namespace:t,snapshotModulesSet:s}=e,r=me(n,t),u=!!(r.crossModuleDeps&&Object.keys(r.crossModuleDeps).length>0),i=u?Object.keys(r.crossModuleDeps):[];return {id:r.id,schema:ke(r,t),requirements:r.schema.requirements??{},init:pe(r,t),derive:ve(r,t,u,i),events:be(r,t),effects:Se(r,t,u,i),constraints:Me(r,t,u,i),resolvers:Re(r,t,u,i),hooks:r.hooks,meta:r.meta,history:Oe(r,t,s)}}function xe(e){let n=Object.keys(e),t=new Set(n),s=new Set,r=new Set,u=[],i=[];function c(o){if(s.has(o))return;if(r.has(o)){let l=i.indexOf(o),d=[...i.slice(l),o].join(" \u2192 ");throw new Error(`[Directive] Circular dependency detected: ${d}. Modules cannot have circular crossModuleDeps. Break the cycle by removing one of the cross-module references.`)}r.add(o),i.push(o);let f=e[o];if(f?.crossModuleDeps)for(let l of Object.keys(f.crossModuleDeps))t.has(l)&&c(l);i.pop(),r.delete(o),s.add(o),u.push(o);}for(let o of n)c(o);return u}function ue(e,n){let t=[];for(let s of Object.keys(n.schema.facts))t.push(`${e}${m}${s}`);if(n.schema.derivations)for(let s of Object.keys(n.schema.derivations))t.push(`${e}${m}${s}`);return t}function ze(e){if("module"in e){if(!e.module)throw new Error("[Directive] createSystem requires a module. Got: "+typeof e.module);return $e(e)}let n=e;if(Array.isArray(n.modules))throw new Error(`[Directive] createSystem expects modules as an object, not an array. | ||
| Instead of: | ||
| createSystem({ modules: [authModule, dataModule] }) | ||
| Use: | ||
| createSystem({ modules: { auth: authModule, data: dataModule } }) | ||
| Or for a single module: | ||
| createSystem({ module: counterModule })`);let t=n.modules;if(t&&typeof t=="object"&&"id"in t&&"schema"in t)throw new Error(`[Directive] A single module was passed to \`modules:\`. For a single module, use \`module:\` instead: | ||
| createSystem({ module: myModule }) | ||
| For multiple modules, wrap in an object: | ||
| createSystem({ modules: { myName: myModule } })`);return De(n)}function De(e){let n=e.modules,t=new Set(Object.keys(n)),s=typeof e.history=="object"?e.history:null,r=s?.snapshotModules?new Set(s.snapshotModules):null;if(e.tickMs!==void 0&&e.tickMs<=0)throw new Error("[Directive] tickMs must be a positive number");if(chunkN4KTCKOI_cjs.a){for(let[a,y]of Object.entries(n))if(y.crossModuleDeps)for(let h of Object.keys(y.crossModuleDeps))h===a?console.warn(`[Directive] Module "${a}" references itself in crossModuleDeps. Use "facts.self" to access own module's facts instead.`):t.has(h)||console.warn(`[Directive] Module "${a}" declares crossModuleDeps.${h}, but no module with namespace "${h}" exists in the system. Available modules: ${[...t].join(", ")}`);}if(chunkN4KTCKOI_cjs.a&&s?.snapshotModules)for(let a of s.snapshotModules)t.has(a)||console.warn(`[Directive] history.snapshotModules entry "${a}" doesn't match any module. Available modules: ${[...t].join(", ")}`);let u,i=e.initOrder??"auto";if(Array.isArray(i)){let a=i,y=Object.keys(n).filter(h=>!a.includes(h));if(y.length>0)throw new Error(`[Directive] initOrder is missing modules: ${y.join(", ")}. All modules must be included in the explicit order.`);u=a;}else i==="declaration"?u=Object.keys(n):u=xe(n);let{history:c,trace:o,errorBoundary:f}=de(e);for(let a of Object.keys(n)){if(a.includes(m))throw new Error(`[Directive] Module name "${a}" contains the reserved separator "${m}". Module names cannot contain "${m}".`);let y=n[a];if(y){for(let h of Object.keys(y.schema.facts))if(h.includes(m))throw new Error(`[Directive] Schema key "${h}" in module "${a}" contains the reserved separator "${m}". Schema keys cannot contain "${m}".`)}}let l={names:null};function d(){return l.names===null&&(l.names=Object.keys(n)),l.names}let g=u.map(a=>{let y=n[a];return y?I({mod:y,namespace:a,snapshotModulesSet:r}):null}).filter(a=>a!==null);chunkN4KTCKOI_cjs.a&&e.tickMs&&e.tickMs>0&&(g.some(y=>y.events&&Object.keys(y.events).some(h=>h.endsWith(`${m}tick`)))||console.warn(`[Directive] tickMs is set to ${e.tickMs}ms but no module defines a "tick" event handler.`));let k=null,w=null;function j(a){for(let[y,h]of Object.entries(a)){if(chunkN4KTCKOI_cjs.l.has(y)){chunkN4KTCKOI_cjs.a&&console.warn(`[Directive] initialFacts/hydrate contains blocked namespace "${y}". Skipping.`);continue}if(!t.has(y)){chunkN4KTCKOI_cjs.a&&console.warn(`[Directive] initialFacts/hydrate contains unknown namespace "${y}". Available modules: ${[...t].join(", ")}`);continue}if(h&&typeof h=="object"&&!chunkEOLY64E6_cjs.e(h))throw new Error(`[Directive] initialFacts/hydrate for namespace "${y}" contains potentially dangerous keys (__proto__, constructor, or prototype). This may indicate a prototype pollution attack.`);for(let[M,x]of Object.entries(h))chunkN4KTCKOI_cjs.l.has(M)||(w.facts[`${y}${m}${M}`]=x);}}w=chunkWIZHZF4G_cjs.O({modules:g,plugins:e.plugins,history:c,trace:o,errorBoundary:f,tickMs:e.tickMs,cloud:e.cloud,onAfterModuleInit:()=>{e.initialFacts&&j(e.initialFacts),k&&(j(k),k=null);}});let O=new Map;for(let a of Object.keys(n)){let y=n[a];y&&O.set(a,ue(a,y));}let q=re(w.facts,n,d),ye=se(w.derive,n,d),ge=ie(w,n,d),A=null,F=e.tickMs,_={_mode:"namespaced",facts:q,history:w.history,derive:ye,events:ge,constraints:w.constraints,effects:w.effects,resolvers:w.resolvers,async hydrate(a){if(w.isRunning)throw new Error("[Directive] hydrate() must be called before start(). The system is already running.");let y=await a();y&&typeof y=="object"&&(k=y);},initialize(){w.initialize();},start(){if(w.start(),F&&F>0){let a;for(let y of g)if(y?.events&&(a=Object.keys(y.events).find(h=>h.endsWith(`${m}tick`)),a))break;if(a){let y=a;A=setInterval(()=>{w.dispatch({type:y});},F);}}},stop(){A&&(clearInterval(A),A=null),w.stop();},destroy(){this.stop(),w.destroy();},dispatch(a){w.dispatch(a);},read(a){return w.read(R(a))},subscribe(a,y){let h=[];for(let M of a)if(M.endsWith(".*")){let x=M.slice(0,-2),W=O.get(x);W?h.push(...W):chunkN4KTCKOI_cjs.a&&console.warn(`[Directive] subscribe wildcard "${M}" \u2014 namespace "${x}" not found.`);}else h.push(R(M));return w.subscribe(h,y)},subscribeModule(a,y){let h=O.get(a);return !h||h.length===0?(chunkN4KTCKOI_cjs.a&&console.warn(`[Directive] subscribeModule("${a}") \u2014 namespace not found. Available: ${[...O.keys()].join(", ")}`),()=>{}):w.subscribe(h,y)},watch(a,y,h){return w.watch(R(a),y,h)},when(a,y){return w.when(()=>a(q),y)},getDistributableSnapshot(a){let y={...a,includeDerivations:a?.includeDerivations?.map(R),excludeDerivations:a?.excludeDerivations?.map(R),includeFacts:a?.includeFacts?.map(R)},h=w.getDistributableSnapshot(y);return {...h,data:H(h.data)}},watchDistributableSnapshot(a,y){let h={...a,includeDerivations:a?.includeDerivations?.map(R),excludeDerivations:a?.excludeDerivations?.map(R),includeFacts:a?.includeFacts?.map(R)};return w.watchDistributableSnapshot(h,M=>{y({...M,data:H(M.data)});})},registerModule(a,y){if(t.has(a))throw new Error(`[Directive] Module namespace "${a}" already exists. Cannot register a duplicate namespace.`);if(a.includes(m))throw new Error(`[Directive] Module name "${a}" contains the reserved separator "${m}".`);if(chunkN4KTCKOI_cjs.l.has(a))throw new Error(`[Directive] Module name "${a}" is a blocked property.`);for(let x of Object.keys(y.schema.facts))if(x.includes(m))throw new Error(`[Directive] Schema key "${x}" in module "${a}" contains the reserved separator "${m}".`);let h=y,M=I({mod:h,namespace:a,snapshotModulesSet:r});t.add(a),n[a]=h,l.names=null,O.set(a,ue(a,h)),w.registerModule(M);}};return le(_,w),fe(_),_}function de(e){let n=e.history,t=e.trace,s=e.errorBoundary;return e.zeroConfig&&(n=n??chunkN4KTCKOI_cjs.a,s={onConstraintError:"skip",onResolverError:"skip",onEffectError:"skip",onDerivationError:"skip",...e.errorBoundary}),{history:n,trace:t,errorBoundary:s}}function le(e,n){Object.defineProperties(e,{trace:{get(){return n.trace},enumerable:true,configurable:true},meta:{value:n.meta,enumerable:true,configurable:true},isRunning:{get(){return n.isRunning},enumerable:true,configurable:true},isSettled:{get(){return n.isSettled},enumerable:true,configurable:true},isInitialized:{get(){return n.isInitialized},enumerable:true,configurable:true},isReady:{get(){return n.isReady},enumerable:true,configurable:true}}),e.whenReady=n.whenReady.bind(n),e.batch=n.batch.bind(n),e.onSettledChange=n.onSettledChange.bind(n),e.onHistoryChange=n.onHistoryChange.bind(n),e.inspect=n.inspect.bind(n),e.settle=n.settle.bind(n),e.explain=n.explain.bind(n),e.getSnapshot=n.getSnapshot.bind(n),e.restore=n.restore.bind(n),e.observe=n.observe.bind(n);let t=["dispatch","read","subscribe","watch","when","getDistributableSnapshot","watchDistributableSnapshot"];for(let s of t)s in e||(e[s]=n[s].bind(n));}function fe(e){chunkN4KTCKOI_cjs.a&&(typeof process>"u"||process.env?.NODE_ENV!=="test")&&setTimeout(()=>{!e.isRunning&&!e.isInitialized&&console.warn("[Directive] System created but start() was never called. Constraints, resolvers, and effects will not run until you call system.start().");},0);}function $e(e){let n=e.module;if(!n)throw new Error("[Directive] createSystem requires a module. Got: "+typeof n);if(e.tickMs!==void 0&&e.tickMs<=0)throw new Error("[Directive] tickMs must be a positive number");if(e.initialFacts&&!chunkEOLY64E6_cjs.e(e.initialFacts))throw new Error("[Directive] initialFacts contains potentially dangerous keys (__proto__, constructor, or prototype). This may indicate a prototype pollution attack.");chunkN4KTCKOI_cjs.a&&(n.crossModuleDeps&&Object.keys(n.crossModuleDeps).length>0&&console.warn("[Directive] Single module mode ignores crossModuleDeps. Use multiple modules if cross-module access is needed: createSystem({ modules: { ... } })"),e.tickMs&&e.tickMs>0&&(n.events&&"tick"in n.events||console.warn(`[Directive] tickMs is set to ${e.tickMs}ms but module has no "tick" event handler.`)),(typeof e.history=="object"?e.history:null)?.snapshotModules&&console.warn("[Directive] history.snapshotModules has no effect in single-module mode. Use history.snapshotEvents on the module definition instead, or switch to createSystem({ modules: { ... } }) for multi-module filtering."));let{history:t,trace:s,errorBoundary:r}=de(e),u=null,i=null;i=chunkWIZHZF4G_cjs.O({modules:[{id:n.id,schema:n.schema.facts,requirements:n.schema.requirements,init:n.init,derive:n.derive,events:n.events,effects:n.effects,constraints:n.constraints,resolvers:n.resolvers,hooks:n.hooks,meta:n.meta,history:n.history}],plugins:e.plugins,history:t,trace:s,errorBoundary:r,tickMs:e.tickMs,cloud:e.cloud,onAfterModuleInit:()=>{if(e.initialFacts)for(let[d,g]of Object.entries(e.initialFacts))chunkN4KTCKOI_cjs.l.has(d)||(i.facts[d]=g);if(u){if(!chunkEOLY64E6_cjs.e(u))chunkN4KTCKOI_cjs.a&&console.warn("[Directive] hydrate() data contains potentially dangerous keys. Skipping.");else for(let[d,g]of Object.entries(u))chunkN4KTCKOI_cjs.l.has(d)||(i.facts[d]=g);u=null;}}});let c=new Proxy({},{get(d,g){if(typeof g!="symbol"&&!chunkN4KTCKOI_cjs.l.has(g))return k=>{i.dispatch({type:g,...k});}},has(d,g){return typeof g=="symbol"||chunkN4KTCKOI_cjs.l.has(g)?false:n.events?g in n.events:false},ownKeys(){return n.events?Object.keys(n.events):[]},getOwnPropertyDescriptor(d,g){if(typeof g!="symbol"&&!chunkN4KTCKOI_cjs.l.has(g)&&n.events&&g in n.events)return {configurable:true,enumerable:true}},set(){return false},deleteProperty(){return false},defineProperty(){return false},getPrototypeOf(){return null},setPrototypeOf(){return false}}),o=null,f=e.tickMs,l={_mode:"single",facts:i.facts,history:i.history,derive:i.derive,events:c,constraints:i.constraints,effects:i.effects,resolvers:i.resolvers,async hydrate(d){if(i.isRunning)throw new Error("[Directive] hydrate() must be called before start(). The system is already running.");let g=await d();g&&typeof g=="object"&&(u=g);},initialize(){i.initialize();},start(){i.start(),f&&f>0&&n.events&&"tick"in n.events&&(o=setInterval(()=>{i.dispatch({type:"tick"});},f));},stop(){o&&(clearInterval(o),o=null),i.stop();},destroy(){this.stop(),i.destroy();},registerModule(d){i.registerModule({id:d.id,schema:d.schema.facts,requirements:d.schema.requirements,init:d.init,derive:d.derive,events:d.events,effects:d.effects,constraints:d.constraints,resolvers:d.resolvers,hooks:d.hooks,history:d.history});}};return le(l,i),fe(l),l}exports.a=ze;//# sourceMappingURL=chunk-2OS4RCLV.cjs.map | ||
| //# sourceMappingURL=chunk-2OS4RCLV.cjs.map |
Sorry, the diff of this file is too big to display
| import {O,f,d,j,p,l as l$1,o}from'./chunk-ZE2RY5KP.js';import {a,l,m as m$1,n}from'./chunk-TZHC4E6S.js';import {e,a as a$1}from'./chunk-T6IJUWYR.js';var m="::",he=Symbol.for("nodejs.util.inspect.custom");function we(e){if(!e.ownKeys)return {};let n={};for(let t of e.ownKeys())n[t]=e.get(t);return n}function D(e){return new Proxy({},{get(n,t){if(typeof t=="symbol")return t===he?()=>we(e):void 0;if(!l.has(t))return e.get(t)},set(n,t,s){return typeof t=="symbol"||l.has(t)?false:e.set?e.set(t,s):false},has(n,t){return typeof t=="symbol"||l.has(t)?false:e.has?e.has(t):false},deleteProperty(n,t){return typeof t=="symbol"||l.has(t)?false:e.delete?e.delete(t):false},ownKeys(){return e.ownKeys?e.ownKeys():[]},getOwnPropertyDescriptor(n,t){if(typeof t!="symbol"&&e.has&&typeof t=="string"&&e.has(t))return {configurable:true,enumerable:true}},defineProperty(){return false},getPrototypeOf(){return null},setPrototypeOf(){return false}})}var Z=new WeakMap,Q=new WeakMap,X=new WeakMap,ee=new WeakMap,ne=new WeakMap,te=new WeakMap;function $(e,n$1){let t=Z.get(e);if(t){let r=t.get(n$1);if(r)return r}else t=new Map,Z.set(e,t);let s=D({get:r=>r==="$store"||r==="$snapshot"?e[r]:e[`${n$1}${m}${r}`],set:(r,u)=>{if(a){let i=m$1(u);i&&n(`${n$1}.${r}`,i);}return e[`${n$1}${m}${r}`]=u,true},has:r=>`${n$1}${m}${r}`in e,delete:r=>(delete e[`${n$1}${m}${r}`],true)});return t.set(n$1,s),s}function re(e,n,t){let s=Q.get(e);if(s)return s;let r=D({get:u=>{if(Object.hasOwn(n,u))return $(e,u)},has:u=>Object.hasOwn(n,u),ownKeys:()=>t()});return Q.set(e,r),r}function oe(e,n,t){let s=`${n}|${t.join(",")}`,r=ne.get(e);if(r){let o=r.get(s);if(o)return o}else r=new Map,ne.set(e,r);let u=new Set(t),i=["self",...t],c=D({get:o=>{if(o==="self")return $(e,n);if(u.has(o))return $(e,o);a&&console.warn(`[Directive] Module "${n}" accessed undeclared cross-module property "${o}". Add it to crossModuleDeps or use "facts.self.${o}" for own module facts.`);},has:o=>o==="self"||u.has(o),ownKeys:()=>i});return r.set(s,c),c}function B(e,n){let t=ee.get(e);if(t){let r=t.get(n);if(r)return r}else t=new Map,ee.set(e,t);let s=D({get:r=>e[`${n}${m}${r}`],has:r=>`${n}${m}${r}`in e});return t.set(n,s),s}function se(e,n,t){let s=X.get(e);if(s)return s;let r=D({get:u=>{if(Object.hasOwn(n,u))return B(e,u)},has:u=>Object.hasOwn(n,u),ownKeys:()=>t()});return X.set(e,r),r}function ie(e,n,t){let s=te.get(e);return s||(s=new Map,te.set(e,s)),D({get:r=>{if(!Object.hasOwn(n,r))return;let u=s.get(r);if(u)return u;let i=D({get:c=>o=>{e.dispatch({type:`${r}${m}${c}`,...o});}});return s.set(r,i),i},has:r=>Object.hasOwn(n,r),ownKeys:()=>t()})}function R(e){if(e.includes(".")){let[n,...t]=e.split(".");return `${n}${m}${t.join(m)}`}return e}function H(e){let n={};for(let[t,s]of Object.entries(e)){let r=t.indexOf(m);if(r>0){let u=t.slice(0,r),i=t.slice(r+m.length);n[u]||(n[u]={}),n[u][i]=s;}else n._root||(n._root={}),n._root[t]=s;}return n}function P(e,n,t,s){return t?oe(e,n,s):$(e,n)}function b(e,n){return `${e}${m}${n}`}function ae(e){return e.includes(m)}function E(e,n,t){if(Array.isArray(e)){let i=e.map(c=>{if(c&&typeof c=="object"&&typeof c.fact=="string"){let o=c.fact;return ae(o)?c:{...c,fact:b(n,o)}}return c});return a$1(i),i}if(!e||typeof e!="object")return e;let s=e;if("$all"in s||"$any"in s){let i="$all"in s?"$all":"$any",c=s[i],o={[i]:c.map(f=>E(f,n,t))};return a$1(o),o}if("$not"in s){let i={$not:E(s.$not,n,t)};return a$1(i),i}function r(i,c){return E(i,c,ce)}let u={};for(let i of Object.keys(s)){if(i.startsWith("$")||ae(i)){u[i]=s[i];continue}if(i==="self"){let c=s[i];if(c&&typeof c=="object"){let o=r(c,n);if(o&&typeof o=="object"&&!Array.isArray(o)){for(let[f,l]of Object.entries(o))u[f]=l;continue}}}if(t.has(i)){let c=s[i];if(c&&typeof c=="object"){let o=r(c,i);if(o&&typeof o=="object"&&!Array.isArray(o)){for(let[f,l]of Object.entries(o))u[f]=l;continue}}}u[b(n,i)]=s[i];}return a$1(u),u}var ce=new Set;function me(e,n){let t=e.crossModuleDeps?new Set(Object.keys(e.crossModuleDeps)):ce,s=e.constraints;if(s){let c=false,o={};for(let[f,l]of Object.entries(s)){let d=l;if(d.when!==void 0&&typeof d.when!="function"){o[f]={...d,when:E(d.when,n,t)},c=true;continue}o[f]=l;}c&&(s=o);}let r=e.derive;if(r){let c=false,o={};for(let[f$1,l]of Object.entries(r)){let d$1=l&&typeof l=="object"&&Object.hasOwn(l,"compute")?l:null;if(!d$1){o[f$1]=l;continue}let g=d$1.compute;if(typeof g=="function"){o[f$1]=l;continue}if(f(g)){a$1(g);let k=w=>l$1(g,w);o[f$1]=d$1.meta?{compute:k,meta:d$1.meta}:k,c=true;continue}if(d(g)){a$1(g);let k=j(g),w=j=>k(j);o[f$1]=d$1.meta?{compute:w,meta:d$1.meta}:w,c=true;continue}o[f$1]=l;}c&&(r=o);}let u=e.events;if(u){let c=false,o$1={};for(let[f,l]of Object.entries(u)){if(l&&typeof l=="object"){let d=Object.hasOwn(l,"handler"),g=Object.hasOwn(l,"patch");if(d&&g&&a&&console.warn(`[Directive] event "${f}": both \`handler\` and \`patch\` provided \u2014 using \`handler\` (patch is ignored).`),g&&!d){let k=l;a$1(k.patch);let w=(j,O)=>o(k.patch,j,O??{});o$1[f]=k.meta?{handler:w,meta:k.meta}:w,c=true;continue}}o$1[f]=l;}c&&(u=o$1);}let i=e.effects;if(i){let c=false,o={};for(let[f,l]of Object.entries(i)){let d$1=l;if(d$1.on!==void 0&&d(d$1.on)){o[f]={...d$1,on:E(d$1.on,n,t)},c=true;continue}o[f]=l;}c&&(i=o);}return s===e.constraints&&r===e.derive&&u===e.events&&i===e.effects?e:{...e,constraints:s,derive:r,events:u,effects:i}}function C(e){return Object.keys(e).length>0?e:void 0}function ke(e,n){let t={};for(let[s,r]of Object.entries(e.schema.facts))t[b(n,s)]=r;return t}function pe(e,n){if(e.init)return t=>{let s=$(t,n);e.init(s);}}function ve(e,n,t,s){if(!e.derive)return;let r={};for(let[u,i]of Object.entries(e.derive)){let c=p(i),o=c?i.compute:i,f=c?i.meta:void 0,l=(d,g)=>{let k=P(d,n,t,s),w=B(g,n);return o(k,w)};r[b(n,u)]=f?{compute:l,meta:f}:l;}return C(r)}function be(e,n){if(!e.events)return;let t={};for(let[s,r]of Object.entries(e.events)){let u=typeof r=="object"&&r!==null&&Object.hasOwn(r,"handler"),i=u?r.handler:r,c=u?r.meta:void 0,o=(f,l)=>{let d=$(f,n);i(d,l);};t[b(n,s)]=c?{handler:o,meta:c}:o;}return C(t)}function Me(e,n,t,s){if(!e.constraints)return;let r={};for(let[u,i]of Object.entries(e.constraints)){let c=i,o=typeof c.when=="function";r[b(n,u)]={...c,deps:c.deps?.map(f=>b(n,f)),after:c.after?.map(f=>f.includes(m)?f:b(n,f)),owns:c.owns?.map(f=>f.includes(m)?f:b(n,f)),when:o?f=>{let l=P(f,n,t,s);return c.when(l)}:c.when,require:typeof c.require=="function"?f=>{let l=P(f,n,t,s);return c.require(l)}:c.require};}return C(r)}function Re(e,n,t,s){if(!e.resolvers)return;let r={};for(let[i,c]of Object.entries(e.resolvers)){let f=function(l){return {facts:P(l.facts,n,t,s),signal:l.signal}};let o=c;r[b(n,i)]={...o,...o.resolve&&{resolve:async(l,d)=>{await o.resolve(l,f(d));}},...o.resolveBatch&&{resolveBatch:async(l,d)=>{await o.resolveBatch(l,f(d));}},...o.resolveBatchWithResults&&{resolveBatchWithResults:async(l,d)=>o.resolveBatchWithResults(l,f(d))}};}return C(r)}function Se(e,n,t,s){if(!e.effects)return;let r={};for(let[u,i]of Object.entries(e.effects)){let c=i;r[b(n,u)]={...c,run:(o,f)=>{let l=P(o,n,t,s),d=f?P(f,n,t,s):void 0;return c.run(l,d)},deps:c.deps?.map(o=>b(n,o))};}return C(r)}function Oe(e,n,t){return {snapshotEvents:t&&!t.has(n)?[]:e.history?.snapshotEvents?.map(s=>b(n,s))}}function I(e){let{mod:n,namespace:t,snapshotModulesSet:s}=e,r=me(n,t),u=!!(r.crossModuleDeps&&Object.keys(r.crossModuleDeps).length>0),i=u?Object.keys(r.crossModuleDeps):[];return {id:r.id,schema:ke(r,t),requirements:r.schema.requirements??{},init:pe(r,t),derive:ve(r,t,u,i),events:be(r,t),effects:Se(r,t,u,i),constraints:Me(r,t,u,i),resolvers:Re(r,t,u,i),hooks:r.hooks,meta:r.meta,history:Oe(r,t,s)}}function xe(e){let n=Object.keys(e),t=new Set(n),s=new Set,r=new Set,u=[],i=[];function c(o){if(s.has(o))return;if(r.has(o)){let l=i.indexOf(o),d=[...i.slice(l),o].join(" \u2192 ");throw new Error(`[Directive] Circular dependency detected: ${d}. Modules cannot have circular crossModuleDeps. Break the cycle by removing one of the cross-module references.`)}r.add(o),i.push(o);let f=e[o];if(f?.crossModuleDeps)for(let l of Object.keys(f.crossModuleDeps))t.has(l)&&c(l);i.pop(),r.delete(o),s.add(o),u.push(o);}for(let o of n)c(o);return u}function ue(e,n){let t=[];for(let s of Object.keys(n.schema.facts))t.push(`${e}${m}${s}`);if(n.schema.derivations)for(let s of Object.keys(n.schema.derivations))t.push(`${e}${m}${s}`);return t}function ze(e){if("module"in e){if(!e.module)throw new Error("[Directive] createSystem requires a module. Got: "+typeof e.module);return $e(e)}let n=e;if(Array.isArray(n.modules))throw new Error(`[Directive] createSystem expects modules as an object, not an array. | ||
| Instead of: | ||
| createSystem({ modules: [authModule, dataModule] }) | ||
| Use: | ||
| createSystem({ modules: { auth: authModule, data: dataModule } }) | ||
| Or for a single module: | ||
| createSystem({ module: counterModule })`);let t=n.modules;if(t&&typeof t=="object"&&"id"in t&&"schema"in t)throw new Error(`[Directive] A single module was passed to \`modules:\`. For a single module, use \`module:\` instead: | ||
| createSystem({ module: myModule }) | ||
| For multiple modules, wrap in an object: | ||
| createSystem({ modules: { myName: myModule } })`);return De(n)}function De(e$1){let n=e$1.modules,t=new Set(Object.keys(n)),s=typeof e$1.history=="object"?e$1.history:null,r=s?.snapshotModules?new Set(s.snapshotModules):null;if(e$1.tickMs!==void 0&&e$1.tickMs<=0)throw new Error("[Directive] tickMs must be a positive number");if(a){for(let[a,y]of Object.entries(n))if(y.crossModuleDeps)for(let h of Object.keys(y.crossModuleDeps))h===a?console.warn(`[Directive] Module "${a}" references itself in crossModuleDeps. Use "facts.self" to access own module's facts instead.`):t.has(h)||console.warn(`[Directive] Module "${a}" declares crossModuleDeps.${h}, but no module with namespace "${h}" exists in the system. Available modules: ${[...t].join(", ")}`);}if(a&&s?.snapshotModules)for(let a of s.snapshotModules)t.has(a)||console.warn(`[Directive] history.snapshotModules entry "${a}" doesn't match any module. Available modules: ${[...t].join(", ")}`);let u,i=e$1.initOrder??"auto";if(Array.isArray(i)){let a=i,y=Object.keys(n).filter(h=>!a.includes(h));if(y.length>0)throw new Error(`[Directive] initOrder is missing modules: ${y.join(", ")}. All modules must be included in the explicit order.`);u=a;}else i==="declaration"?u=Object.keys(n):u=xe(n);let{history:c,trace:o,errorBoundary:f}=de(e$1);for(let a of Object.keys(n)){if(a.includes(m))throw new Error(`[Directive] Module name "${a}" contains the reserved separator "${m}". Module names cannot contain "${m}".`);let y=n[a];if(y){for(let h of Object.keys(y.schema.facts))if(h.includes(m))throw new Error(`[Directive] Schema key "${h}" in module "${a}" contains the reserved separator "${m}". Schema keys cannot contain "${m}".`)}}let l$1={names:null};function d(){return l$1.names===null&&(l$1.names=Object.keys(n)),l$1.names}let g=u.map(a=>{let y=n[a];return y?I({mod:y,namespace:a,snapshotModulesSet:r}):null}).filter(a=>a!==null);a&&e$1.tickMs&&e$1.tickMs>0&&(g.some(y=>y.events&&Object.keys(y.events).some(h=>h.endsWith(`${m}tick`)))||console.warn(`[Directive] tickMs is set to ${e$1.tickMs}ms but no module defines a "tick" event handler.`));let k=null,w=null;function j(a$1){for(let[y,h]of Object.entries(a$1)){if(l.has(y)){a&&console.warn(`[Directive] initialFacts/hydrate contains blocked namespace "${y}". Skipping.`);continue}if(!t.has(y)){a&&console.warn(`[Directive] initialFacts/hydrate contains unknown namespace "${y}". Available modules: ${[...t].join(", ")}`);continue}if(h&&typeof h=="object"&&!e(h))throw new Error(`[Directive] initialFacts/hydrate for namespace "${y}" contains potentially dangerous keys (__proto__, constructor, or prototype). This may indicate a prototype pollution attack.`);for(let[M,x]of Object.entries(h))l.has(M)||(w.facts[`${y}${m}${M}`]=x);}}w=O({modules:g,plugins:e$1.plugins,history:c,trace:o,errorBoundary:f,tickMs:e$1.tickMs,cloud:e$1.cloud,onAfterModuleInit:()=>{e$1.initialFacts&&j(e$1.initialFacts),k&&(j(k),k=null);}});let O$1=new Map;for(let a of Object.keys(n)){let y=n[a];y&&O$1.set(a,ue(a,y));}let q=re(w.facts,n,d),ye=se(w.derive,n,d),ge=ie(w,n,d),A=null,F=e$1.tickMs,_={_mode:"namespaced",facts:q,history:w.history,derive:ye,events:ge,constraints:w.constraints,effects:w.effects,resolvers:w.resolvers,async hydrate(a){if(w.isRunning)throw new Error("[Directive] hydrate() must be called before start(). The system is already running.");let y=await a();y&&typeof y=="object"&&(k=y);},initialize(){w.initialize();},start(){if(w.start(),F&&F>0){let a;for(let y of g)if(y?.events&&(a=Object.keys(y.events).find(h=>h.endsWith(`${m}tick`)),a))break;if(a){let y=a;A=setInterval(()=>{w.dispatch({type:y});},F);}}},stop(){A&&(clearInterval(A),A=null),w.stop();},destroy(){this.stop(),w.destroy();},dispatch(a){w.dispatch(a);},read(a){return w.read(R(a))},subscribe(a$1,y){let h=[];for(let M of a$1)if(M.endsWith(".*")){let x=M.slice(0,-2),W=O$1.get(x);W?h.push(...W):a&&console.warn(`[Directive] subscribe wildcard "${M}" \u2014 namespace "${x}" not found.`);}else h.push(R(M));return w.subscribe(h,y)},subscribeModule(a$1,y){let h=O$1.get(a$1);return !h||h.length===0?(a&&console.warn(`[Directive] subscribeModule("${a$1}") \u2014 namespace not found. Available: ${[...O$1.keys()].join(", ")}`),()=>{}):w.subscribe(h,y)},watch(a,y,h){return w.watch(R(a),y,h)},when(a,y){return w.when(()=>a(q),y)},getDistributableSnapshot(a){let y={...a,includeDerivations:a?.includeDerivations?.map(R),excludeDerivations:a?.excludeDerivations?.map(R),includeFacts:a?.includeFacts?.map(R)},h=w.getDistributableSnapshot(y);return {...h,data:H(h.data)}},watchDistributableSnapshot(a,y){let h={...a,includeDerivations:a?.includeDerivations?.map(R),excludeDerivations:a?.excludeDerivations?.map(R),includeFacts:a?.includeFacts?.map(R)};return w.watchDistributableSnapshot(h,M=>{y({...M,data:H(M.data)});})},registerModule(a,y){if(t.has(a))throw new Error(`[Directive] Module namespace "${a}" already exists. Cannot register a duplicate namespace.`);if(a.includes(m))throw new Error(`[Directive] Module name "${a}" contains the reserved separator "${m}".`);if(l.has(a))throw new Error(`[Directive] Module name "${a}" is a blocked property.`);for(let x of Object.keys(y.schema.facts))if(x.includes(m))throw new Error(`[Directive] Schema key "${x}" in module "${a}" contains the reserved separator "${m}".`);let h=y,M=I({mod:h,namespace:a,snapshotModulesSet:r});t.add(a),n[a]=h,l$1.names=null,O$1.set(a,ue(a,h)),w.registerModule(M);}};return le(_,w),fe(_),_}function de(e){let n=e.history,t=e.trace,s=e.errorBoundary;return e.zeroConfig&&(n=n??a,s={onConstraintError:"skip",onResolverError:"skip",onEffectError:"skip",onDerivationError:"skip",...e.errorBoundary}),{history:n,trace:t,errorBoundary:s}}function le(e,n){Object.defineProperties(e,{trace:{get(){return n.trace},enumerable:true,configurable:true},meta:{value:n.meta,enumerable:true,configurable:true},isRunning:{get(){return n.isRunning},enumerable:true,configurable:true},isSettled:{get(){return n.isSettled},enumerable:true,configurable:true},isInitialized:{get(){return n.isInitialized},enumerable:true,configurable:true},isReady:{get(){return n.isReady},enumerable:true,configurable:true}}),e.whenReady=n.whenReady.bind(n),e.batch=n.batch.bind(n),e.onSettledChange=n.onSettledChange.bind(n),e.onHistoryChange=n.onHistoryChange.bind(n),e.inspect=n.inspect.bind(n),e.settle=n.settle.bind(n),e.explain=n.explain.bind(n),e.getSnapshot=n.getSnapshot.bind(n),e.restore=n.restore.bind(n),e.observe=n.observe.bind(n);let t=["dispatch","read","subscribe","watch","when","getDistributableSnapshot","watchDistributableSnapshot"];for(let s of t)s in e||(e[s]=n[s].bind(n));}function fe(e){a&&(typeof process>"u"||process.env?.NODE_ENV!=="test")&&setTimeout(()=>{!e.isRunning&&!e.isInitialized&&console.warn("[Directive] System created but start() was never called. Constraints, resolvers, and effects will not run until you call system.start().");},0);}function $e(e$1){let n=e$1.module;if(!n)throw new Error("[Directive] createSystem requires a module. Got: "+typeof n);if(e$1.tickMs!==void 0&&e$1.tickMs<=0)throw new Error("[Directive] tickMs must be a positive number");if(e$1.initialFacts&&!e(e$1.initialFacts))throw new Error("[Directive] initialFacts contains potentially dangerous keys (__proto__, constructor, or prototype). This may indicate a prototype pollution attack.");a&&(n.crossModuleDeps&&Object.keys(n.crossModuleDeps).length>0&&console.warn("[Directive] Single module mode ignores crossModuleDeps. Use multiple modules if cross-module access is needed: createSystem({ modules: { ... } })"),e$1.tickMs&&e$1.tickMs>0&&(n.events&&"tick"in n.events||console.warn(`[Directive] tickMs is set to ${e$1.tickMs}ms but module has no "tick" event handler.`)),(typeof e$1.history=="object"?e$1.history:null)?.snapshotModules&&console.warn("[Directive] history.snapshotModules has no effect in single-module mode. Use history.snapshotEvents on the module definition instead, or switch to createSystem({ modules: { ... } }) for multi-module filtering."));let{history:t,trace:s,errorBoundary:r}=de(e$1),u=null,i=null;i=O({modules:[{id:n.id,schema:n.schema.facts,requirements:n.schema.requirements,init:n.init,derive:n.derive,events:n.events,effects:n.effects,constraints:n.constraints,resolvers:n.resolvers,hooks:n.hooks,meta:n.meta,history:n.history}],plugins:e$1.plugins,history:t,trace:s,errorBoundary:r,tickMs:e$1.tickMs,cloud:e$1.cloud,onAfterModuleInit:()=>{if(e$1.initialFacts)for(let[d,g]of Object.entries(e$1.initialFacts))l.has(d)||(i.facts[d]=g);if(u){if(!e(u))a&&console.warn("[Directive] hydrate() data contains potentially dangerous keys. Skipping.");else for(let[d,g]of Object.entries(u))l.has(d)||(i.facts[d]=g);u=null;}}});let c=new Proxy({},{get(d,g){if(typeof g!="symbol"&&!l.has(g))return k=>{i.dispatch({type:g,...k});}},has(d,g){return typeof g=="symbol"||l.has(g)?false:n.events?g in n.events:false},ownKeys(){return n.events?Object.keys(n.events):[]},getOwnPropertyDescriptor(d,g){if(typeof g!="symbol"&&!l.has(g)&&n.events&&g in n.events)return {configurable:true,enumerable:true}},set(){return false},deleteProperty(){return false},defineProperty(){return false},getPrototypeOf(){return null},setPrototypeOf(){return false}}),o=null,f=e$1.tickMs,l$1={_mode:"single",facts:i.facts,history:i.history,derive:i.derive,events:c,constraints:i.constraints,effects:i.effects,resolvers:i.resolvers,async hydrate(d){if(i.isRunning)throw new Error("[Directive] hydrate() must be called before start(). The system is already running.");let g=await d();g&&typeof g=="object"&&(u=g);},initialize(){i.initialize();},start(){i.start(),f&&f>0&&n.events&&"tick"in n.events&&(o=setInterval(()=>{i.dispatch({type:"tick"});},f));},stop(){o&&(clearInterval(o),o=null),i.stop();},destroy(){this.stop(),i.destroy();},registerModule(d){i.registerModule({id:d.id,schema:d.schema.facts,requirements:d.schema.requirements,init:d.init,derive:d.derive,events:d.events,effects:d.effects,constraints:d.constraints,resolvers:d.resolvers,hooks:d.hooks,history:d.history});}};return le(l$1,i),fe(l$1),l$1}export{ze as a};//# sourceMappingURL=chunk-FCOZCTLY.js.map | ||
| //# sourceMappingURL=chunk-FCOZCTLY.js.map |
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
Sorry, the diff of this file is too big to display
| import { a8 as Schema, b as Facts, a as FactPredicate, aS as InferSchema, F as FactTemplate, D as DefinitionMeta, s as Requirement, b9 as RequirementOutput, a7 as RetryPolicy, B as BatchConfig, b0 as ResolverContext } from './plugins-DvrsPhzx.js'; | ||
| /** | ||
| * Derivation Types - Type definitions for derivations | ||
| */ | ||
| /** Derivation definition function signature. */ | ||
| interface DerivationDef<S extends Schema, T, D extends DerivationsDef<S>> { | ||
| (facts: Facts<S>, derived: DerivedValues<S, D>): T; | ||
| } | ||
| /** | ||
| * Derivation definition with metadata (object form). | ||
| * Use this when you want to attach debugging metadata to a derivation. | ||
| * | ||
| * @example | ||
| * ```typescript | ||
| * derive: { | ||
| * displayName: { | ||
| * compute: (facts) => `${facts.firstName} ${facts.lastName}`, | ||
| * meta: { label: "Display Name", description: "Full name for UI" }, | ||
| * }, | ||
| * }, | ||
| * ``` | ||
| */ | ||
| interface DerivationDefWithMeta<S extends Schema, T, D extends DerivationsDef<S>> { | ||
| /** | ||
| * The derivation body. Either: | ||
| * - a function `(facts, derived) => T` (original form), or | ||
| * - a {@link FactPredicate} data spec — boolean derivations only, or | ||
| * - a {@link FactTemplate} `{ $template: "..." }` — string derivations only. | ||
| * | ||
| * Data forms are normalized to a wrapper function at registration; the | ||
| * wrapper reads through the facts proxy so existing auto-tracking | ||
| * captures dependencies. | ||
| */ | ||
| compute: DerivationDef<S, T, D> | ([T] extends [boolean] ? FactPredicate<InferSchema<S>> : never) | ([T] extends [string] ? FactTemplate : never); | ||
| meta?: DefinitionMeta; | ||
| } | ||
| /** Map of derivation definitions (internal — always bare functions after unwrap). */ | ||
| type DerivationsDef<S extends Schema> = Record<string, DerivationDef<S, unknown, DerivationsDef<S>>>; | ||
| /** Computed derived values. */ | ||
| type DerivedValues<S extends Schema, D extends DerivationsDef<S>> = { | ||
| readonly [K in keyof D]: ReturnType<D[K]>; | ||
| }; | ||
| /** Internal derivation state */ | ||
| interface DerivationState<T> { | ||
| id: string; | ||
| compute: () => T; | ||
| cachedValue: T | undefined; | ||
| dependencies: Set<string>; | ||
| isStale: boolean; | ||
| isComputing: boolean; | ||
| /** Consecutive runs producing the same deps (auto-tracked only) */ | ||
| stableRunCount: number; | ||
| /** Once true, skip withTracking() overhead until a tracked fact mutates */ | ||
| depsStable: boolean; | ||
| } | ||
| /** | ||
| * Type Helpers - External typed constraint and resolver definitions | ||
| * | ||
| * These types enable defining constraints and resolvers with full type safety | ||
| * outside of module definitions, while maintaining proper type inference. | ||
| */ | ||
| /** | ||
| * External constraint definition with full typing. | ||
| * Use this when defining constraints outside of createModule(). | ||
| * | ||
| * @typeParam S - The schema type | ||
| * @typeParam R - The requirement type (defaults to Requirement) | ||
| * | ||
| * @example | ||
| * ```typescript | ||
| * // Define a typed constraint factory | ||
| * const createMaxCountConstraint = <S extends Schema>( | ||
| * maxCount: number | ||
| * ): TypedConstraint<S, { type: "RESET_COUNT" }> => ({ | ||
| * priority: 10, | ||
| * when: (facts) => (facts as { count: number }).count > maxCount, | ||
| * require: { type: "RESET_COUNT" }, | ||
| * }); | ||
| * | ||
| * // Use in module | ||
| * const module = createModule("counter", { | ||
| * schema: { count: t.number() }, | ||
| * constraints: { | ||
| * maxCount: createMaxCountConstraint(100), | ||
| * }, | ||
| * }); | ||
| * ``` | ||
| */ | ||
| interface TypedConstraint<S extends Schema, R extends Requirement = Requirement> { | ||
| /** Priority for ordering (higher runs first) */ | ||
| priority?: number; | ||
| /** Mark this constraint as async (avoids runtime detection) */ | ||
| async?: boolean; | ||
| /** Condition function (sync or async) */ | ||
| when: (facts: Facts<S>) => boolean | Promise<boolean>; | ||
| /** | ||
| * Requirement(s) to produce when condition is met. | ||
| */ | ||
| require: RequirementOutput<R> | ((facts: Facts<S>) => RequirementOutput<R>); | ||
| /** Timeout for async constraints (ms) */ | ||
| timeout?: number; | ||
| /** | ||
| * Constraint IDs whose resolvers must complete before this constraint is evaluated. | ||
| * - If dependency's `when()` returns false, this constraint proceeds (nothing to wait for) | ||
| * - If dependency's resolver fails, this constraint remains blocked until it succeeds | ||
| * - Cross-module: use the constraint ID as it appears in the merged system | ||
| */ | ||
| after?: string[]; | ||
| } | ||
| /** | ||
| * External resolver definition with full typing. | ||
| * Use this when defining resolvers outside of createModule(). | ||
| * | ||
| * @typeParam S - The schema type | ||
| * @typeParam R - The requirement type (defaults to Requirement) | ||
| * | ||
| * @example | ||
| * ```typescript | ||
| * // Define a typed resolver factory | ||
| * interface FetchUserReq extends Requirement { | ||
| * type: "FETCH_USER"; | ||
| * userId: string; | ||
| * } | ||
| * | ||
| * const createFetchUserResolver = <S extends Schema>( | ||
| * fetchFn: (userId: string) => Promise<User> | ||
| * ): TypedResolver<S, FetchUserReq> => ({ | ||
| * requirement: (req): req is FetchUserReq => req.type === "FETCH_USER", | ||
| * key: (req) => `fetch-user-${req.userId}`, | ||
| * retry: { attempts: 3, backoff: "exponential" }, | ||
| * resolve: async (req, ctx) => { | ||
| * const user = await fetchFn(req.userId); | ||
| * (ctx.facts as { user: User }).user = user; | ||
| * }, | ||
| * }); | ||
| * ``` | ||
| */ | ||
| interface TypedResolver<S extends Schema, R extends Requirement = Requirement> { | ||
| /** | ||
| * Requirement type to handle. | ||
| * - String: matches `req.type` directly (e.g., `requirement: "FETCH_USER"`) | ||
| * - Function: type guard predicate (e.g., `requirement: (req) => req.type === "FETCH_USER"`) | ||
| */ | ||
| requirement: R["type"] | ((req: Requirement) => req is R); | ||
| /** Custom key function for deduplication */ | ||
| key?: (req: R) => string; | ||
| /** Retry policy */ | ||
| retry?: RetryPolicy; | ||
| /** Timeout for resolver execution (ms) */ | ||
| timeout?: number; | ||
| /** Batch configuration */ | ||
| batch?: BatchConfig; | ||
| /** Resolve function for single requirement */ | ||
| resolve?: (req: R, ctx: ResolverContext<S>) => Promise<void>; | ||
| /** Resolve function for batched requirements */ | ||
| resolveBatch?: (reqs: R[], ctx: ResolverContext<S>) => Promise<void>; | ||
| } | ||
| /** | ||
| * Create a typed constraint factory for a specific schema. | ||
| * This enables creating reusable constraint definitions with proper typing. | ||
| * | ||
| * @example | ||
| * ```typescript | ||
| * const schema = { count: t.number(), threshold: t.number() }; | ||
| * const factory = createConstraintFactory<typeof schema>(); | ||
| * | ||
| * const maxCountConstraint = factory.create({ | ||
| * when: (facts) => facts.count > facts.threshold, | ||
| * require: { type: "RESET" }, | ||
| * }); | ||
| * ``` | ||
| */ | ||
| declare function createConstraintFactory<S extends Schema>(): { | ||
| /** | ||
| * Create a typed constraint | ||
| */ | ||
| create<R extends Requirement = Requirement>(constraint: TypedConstraint<S, R>): TypedConstraint<S, R>; | ||
| }; | ||
| /** | ||
| * Create a typed resolver factory for a specific schema. | ||
| * This enables creating reusable resolver definitions with proper typing. | ||
| * | ||
| * @example | ||
| * ```typescript | ||
| * const schema = { user: t.object<User>() }; | ||
| * const factory = createResolverFactory<typeof schema>(); | ||
| * | ||
| * const fetchUserResolver = factory.create<FetchUserReq>({ | ||
| * requirement: (req): req is FetchUserReq => req.type === "FETCH_USER", | ||
| * resolve: async (req, ctx) => { | ||
| * ctx.facts.user = await fetchUser(req.userId); | ||
| * }, | ||
| * }); | ||
| * ``` | ||
| */ | ||
| declare function createResolverFactory<S extends Schema>(): { | ||
| /** | ||
| * Create a typed resolver | ||
| */ | ||
| create<R extends Requirement = Requirement>(resolver: TypedResolver<S, R>): TypedResolver<S, R>; | ||
| }; | ||
| /** | ||
| * Type-safe constraint creator. | ||
| * Simpler alternative to createConstraintFactory when you don't need a factory pattern. | ||
| * | ||
| * @example | ||
| * ```typescript | ||
| * const constraint = typedConstraint<typeof schema, { type: "RESET" }>({ | ||
| * when: (facts) => facts.count > 100, | ||
| * require: { type: "RESET" }, | ||
| * }); | ||
| * ``` | ||
| */ | ||
| declare function typedConstraint<S extends Schema, R extends Requirement = Requirement>(constraint: TypedConstraint<S, R>): TypedConstraint<S, R>; | ||
| /** | ||
| * Type-safe resolver creator. | ||
| * Simpler alternative to createResolverFactory when you don't need a factory pattern. | ||
| * | ||
| * @example | ||
| * ```typescript | ||
| * const resolver = typedResolver<typeof schema, FetchUserReq>({ | ||
| * requirement: (req): req is FetchUserReq => req.type === "FETCH_USER", | ||
| * resolve: async (req, ctx) => { | ||
| * ctx.facts.user = await fetchUser(req.userId); | ||
| * }, | ||
| * }); | ||
| * ``` | ||
| */ | ||
| declare function typedResolver<S extends Schema, R extends Requirement = Requirement>(resolver: TypedResolver<S, R>): TypedResolver<S, R>; | ||
| export { type DerivationDefWithMeta as D, type TypedConstraint as T, typedResolver as a, type DerivationsDef as b, type DerivedValues as c, type DerivationState as d, type TypedResolver as e, createConstraintFactory as f, createResolverFactory as g, typedConstraint as t }; |
| import { a8 as Schema, b as Facts, a as FactPredicate, aS as InferSchema, F as FactTemplate, D as DefinitionMeta, s as Requirement, b9 as RequirementOutput, a7 as RetryPolicy, B as BatchConfig, b0 as ResolverContext } from './plugins-DvrsPhzx.cjs'; | ||
| /** | ||
| * Derivation Types - Type definitions for derivations | ||
| */ | ||
| /** Derivation definition function signature. */ | ||
| interface DerivationDef<S extends Schema, T, D extends DerivationsDef<S>> { | ||
| (facts: Facts<S>, derived: DerivedValues<S, D>): T; | ||
| } | ||
| /** | ||
| * Derivation definition with metadata (object form). | ||
| * Use this when you want to attach debugging metadata to a derivation. | ||
| * | ||
| * @example | ||
| * ```typescript | ||
| * derive: { | ||
| * displayName: { | ||
| * compute: (facts) => `${facts.firstName} ${facts.lastName}`, | ||
| * meta: { label: "Display Name", description: "Full name for UI" }, | ||
| * }, | ||
| * }, | ||
| * ``` | ||
| */ | ||
| interface DerivationDefWithMeta<S extends Schema, T, D extends DerivationsDef<S>> { | ||
| /** | ||
| * The derivation body. Either: | ||
| * - a function `(facts, derived) => T` (original form), or | ||
| * - a {@link FactPredicate} data spec — boolean derivations only, or | ||
| * - a {@link FactTemplate} `{ $template: "..." }` — string derivations only. | ||
| * | ||
| * Data forms are normalized to a wrapper function at registration; the | ||
| * wrapper reads through the facts proxy so existing auto-tracking | ||
| * captures dependencies. | ||
| */ | ||
| compute: DerivationDef<S, T, D> | ([T] extends [boolean] ? FactPredicate<InferSchema<S>> : never) | ([T] extends [string] ? FactTemplate : never); | ||
| meta?: DefinitionMeta; | ||
| } | ||
| /** Map of derivation definitions (internal — always bare functions after unwrap). */ | ||
| type DerivationsDef<S extends Schema> = Record<string, DerivationDef<S, unknown, DerivationsDef<S>>>; | ||
| /** Computed derived values. */ | ||
| type DerivedValues<S extends Schema, D extends DerivationsDef<S>> = { | ||
| readonly [K in keyof D]: ReturnType<D[K]>; | ||
| }; | ||
| /** Internal derivation state */ | ||
| interface DerivationState<T> { | ||
| id: string; | ||
| compute: () => T; | ||
| cachedValue: T | undefined; | ||
| dependencies: Set<string>; | ||
| isStale: boolean; | ||
| isComputing: boolean; | ||
| /** Consecutive runs producing the same deps (auto-tracked only) */ | ||
| stableRunCount: number; | ||
| /** Once true, skip withTracking() overhead until a tracked fact mutates */ | ||
| depsStable: boolean; | ||
| } | ||
| /** | ||
| * Type Helpers - External typed constraint and resolver definitions | ||
| * | ||
| * These types enable defining constraints and resolvers with full type safety | ||
| * outside of module definitions, while maintaining proper type inference. | ||
| */ | ||
| /** | ||
| * External constraint definition with full typing. | ||
| * Use this when defining constraints outside of createModule(). | ||
| * | ||
| * @typeParam S - The schema type | ||
| * @typeParam R - The requirement type (defaults to Requirement) | ||
| * | ||
| * @example | ||
| * ```typescript | ||
| * // Define a typed constraint factory | ||
| * const createMaxCountConstraint = <S extends Schema>( | ||
| * maxCount: number | ||
| * ): TypedConstraint<S, { type: "RESET_COUNT" }> => ({ | ||
| * priority: 10, | ||
| * when: (facts) => (facts as { count: number }).count > maxCount, | ||
| * require: { type: "RESET_COUNT" }, | ||
| * }); | ||
| * | ||
| * // Use in module | ||
| * const module = createModule("counter", { | ||
| * schema: { count: t.number() }, | ||
| * constraints: { | ||
| * maxCount: createMaxCountConstraint(100), | ||
| * }, | ||
| * }); | ||
| * ``` | ||
| */ | ||
| interface TypedConstraint<S extends Schema, R extends Requirement = Requirement> { | ||
| /** Priority for ordering (higher runs first) */ | ||
| priority?: number; | ||
| /** Mark this constraint as async (avoids runtime detection) */ | ||
| async?: boolean; | ||
| /** Condition function (sync or async) */ | ||
| when: (facts: Facts<S>) => boolean | Promise<boolean>; | ||
| /** | ||
| * Requirement(s) to produce when condition is met. | ||
| */ | ||
| require: RequirementOutput<R> | ((facts: Facts<S>) => RequirementOutput<R>); | ||
| /** Timeout for async constraints (ms) */ | ||
| timeout?: number; | ||
| /** | ||
| * Constraint IDs whose resolvers must complete before this constraint is evaluated. | ||
| * - If dependency's `when()` returns false, this constraint proceeds (nothing to wait for) | ||
| * - If dependency's resolver fails, this constraint remains blocked until it succeeds | ||
| * - Cross-module: use the constraint ID as it appears in the merged system | ||
| */ | ||
| after?: string[]; | ||
| } | ||
| /** | ||
| * External resolver definition with full typing. | ||
| * Use this when defining resolvers outside of createModule(). | ||
| * | ||
| * @typeParam S - The schema type | ||
| * @typeParam R - The requirement type (defaults to Requirement) | ||
| * | ||
| * @example | ||
| * ```typescript | ||
| * // Define a typed resolver factory | ||
| * interface FetchUserReq extends Requirement { | ||
| * type: "FETCH_USER"; | ||
| * userId: string; | ||
| * } | ||
| * | ||
| * const createFetchUserResolver = <S extends Schema>( | ||
| * fetchFn: (userId: string) => Promise<User> | ||
| * ): TypedResolver<S, FetchUserReq> => ({ | ||
| * requirement: (req): req is FetchUserReq => req.type === "FETCH_USER", | ||
| * key: (req) => `fetch-user-${req.userId}`, | ||
| * retry: { attempts: 3, backoff: "exponential" }, | ||
| * resolve: async (req, ctx) => { | ||
| * const user = await fetchFn(req.userId); | ||
| * (ctx.facts as { user: User }).user = user; | ||
| * }, | ||
| * }); | ||
| * ``` | ||
| */ | ||
| interface TypedResolver<S extends Schema, R extends Requirement = Requirement> { | ||
| /** | ||
| * Requirement type to handle. | ||
| * - String: matches `req.type` directly (e.g., `requirement: "FETCH_USER"`) | ||
| * - Function: type guard predicate (e.g., `requirement: (req) => req.type === "FETCH_USER"`) | ||
| */ | ||
| requirement: R["type"] | ((req: Requirement) => req is R); | ||
| /** Custom key function for deduplication */ | ||
| key?: (req: R) => string; | ||
| /** Retry policy */ | ||
| retry?: RetryPolicy; | ||
| /** Timeout for resolver execution (ms) */ | ||
| timeout?: number; | ||
| /** Batch configuration */ | ||
| batch?: BatchConfig; | ||
| /** Resolve function for single requirement */ | ||
| resolve?: (req: R, ctx: ResolverContext<S>) => Promise<void>; | ||
| /** Resolve function for batched requirements */ | ||
| resolveBatch?: (reqs: R[], ctx: ResolverContext<S>) => Promise<void>; | ||
| } | ||
| /** | ||
| * Create a typed constraint factory for a specific schema. | ||
| * This enables creating reusable constraint definitions with proper typing. | ||
| * | ||
| * @example | ||
| * ```typescript | ||
| * const schema = { count: t.number(), threshold: t.number() }; | ||
| * const factory = createConstraintFactory<typeof schema>(); | ||
| * | ||
| * const maxCountConstraint = factory.create({ | ||
| * when: (facts) => facts.count > facts.threshold, | ||
| * require: { type: "RESET" }, | ||
| * }); | ||
| * ``` | ||
| */ | ||
| declare function createConstraintFactory<S extends Schema>(): { | ||
| /** | ||
| * Create a typed constraint | ||
| */ | ||
| create<R extends Requirement = Requirement>(constraint: TypedConstraint<S, R>): TypedConstraint<S, R>; | ||
| }; | ||
| /** | ||
| * Create a typed resolver factory for a specific schema. | ||
| * This enables creating reusable resolver definitions with proper typing. | ||
| * | ||
| * @example | ||
| * ```typescript | ||
| * const schema = { user: t.object<User>() }; | ||
| * const factory = createResolverFactory<typeof schema>(); | ||
| * | ||
| * const fetchUserResolver = factory.create<FetchUserReq>({ | ||
| * requirement: (req): req is FetchUserReq => req.type === "FETCH_USER", | ||
| * resolve: async (req, ctx) => { | ||
| * ctx.facts.user = await fetchUser(req.userId); | ||
| * }, | ||
| * }); | ||
| * ``` | ||
| */ | ||
| declare function createResolverFactory<S extends Schema>(): { | ||
| /** | ||
| * Create a typed resolver | ||
| */ | ||
| create<R extends Requirement = Requirement>(resolver: TypedResolver<S, R>): TypedResolver<S, R>; | ||
| }; | ||
| /** | ||
| * Type-safe constraint creator. | ||
| * Simpler alternative to createConstraintFactory when you don't need a factory pattern. | ||
| * | ||
| * @example | ||
| * ```typescript | ||
| * const constraint = typedConstraint<typeof schema, { type: "RESET" }>({ | ||
| * when: (facts) => facts.count > 100, | ||
| * require: { type: "RESET" }, | ||
| * }); | ||
| * ``` | ||
| */ | ||
| declare function typedConstraint<S extends Schema, R extends Requirement = Requirement>(constraint: TypedConstraint<S, R>): TypedConstraint<S, R>; | ||
| /** | ||
| * Type-safe resolver creator. | ||
| * Simpler alternative to createResolverFactory when you don't need a factory pattern. | ||
| * | ||
| * @example | ||
| * ```typescript | ||
| * const resolver = typedResolver<typeof schema, FetchUserReq>({ | ||
| * requirement: (req): req is FetchUserReq => req.type === "FETCH_USER", | ||
| * resolve: async (req, ctx) => { | ||
| * ctx.facts.user = await fetchUser(req.userId); | ||
| * }, | ||
| * }); | ||
| * ``` | ||
| */ | ||
| declare function typedResolver<S extends Schema, R extends Requirement = Requirement>(resolver: TypedResolver<S, R>): TypedResolver<S, R>; | ||
| export { type DerivationDefWithMeta as D, type TypedConstraint as T, typedResolver as a, type DerivationsDef as b, type DerivedValues as c, type DerivationState as d, type TypedResolver as e, createConstraintFactory as f, createResolverFactory as g, typedConstraint as t }; |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
| 'use strict';var chunk2OS4RCLV_cjs=require('./chunk-2OS4RCLV.cjs');require('./chunk-WIZHZF4G.cjs'),require('./chunk-N4KTCKOI.cjs'),require('./chunk-EOLY64E6.cjs');Object.defineProperty(exports,"createSystem",{enumerable:true,get:function(){return chunk2OS4RCLV_cjs.a}});//# sourceMappingURL=system-DEMPYZHI.cjs.map | ||
| //# sourceMappingURL=system-DEMPYZHI.cjs.map |
| {"version":3,"sources":[],"names":[],"mappings":"","file":"system-DEMPYZHI.cjs"} |
| export{a as createSystem}from'./chunk-FCOZCTLY.js';import'./chunk-ZE2RY5KP.js';import'./chunk-TZHC4E6S.js';import'./chunk-T6IJUWYR.js';//# sourceMappingURL=system-R4JL6U4S.js.map | ||
| //# sourceMappingURL=system-R4JL6U4S.js.map |
| {"version":3,"sources":[],"names":[],"mappings":"","file":"system-R4JL6U4S.js"} |
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
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Found 2 instances in 1 package
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Found 2 instances in 1 package
4475445
6.12%77
8.45%11277
6.08%24
9.09%