@directive-run/core 0.2.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapter-utils.cjs.map +1 -1
- package/dist/adapter-utils.d.cts +1 -1
- package/dist/adapter-utils.d.ts +1 -1
- package/dist/adapter-utils.js.map +1 -1
- package/dist/index.cjs +19 -19
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +13 -6
- package/dist/index.d.ts +13 -6
- package/dist/index.js +19 -19
- package/dist/index.js.map +1 -1
- package/dist/migration.cjs.map +1 -1
- package/dist/migration.js.map +1 -1
- package/dist/plugins/index.cjs +2 -2
- package/dist/plugins/index.cjs.map +1 -1
- package/dist/plugins/index.d.cts +103 -23
- package/dist/plugins/index.d.ts +103 -23
- package/dist/plugins/index.js +2 -2
- package/dist/plugins/index.js.map +1 -1
- package/dist/{plugins-KKRG7lDP.d.cts → plugins-cDWoL7A7.d.cts} +146 -47
- package/dist/{plugins-KKRG7lDP.d.ts → plugins-cDWoL7A7.d.ts} +146 -47
- package/dist/testing.cjs +3 -3
- package/dist/testing.cjs.map +1 -1
- package/dist/testing.d.cts +1 -1
- package/dist/testing.d.ts +1 -1
- package/dist/testing.js +3 -3
- package/dist/testing.js.map +1 -1
- package/dist/worker.cjs +3 -3
- package/dist/worker.cjs.map +1 -1
- package/dist/worker.d.cts +1 -1
- package/dist/worker.d.ts +1 -1
- package/dist/worker.js +3 -3
- package/dist/worker.js.map +1 -1
- package/package.json +1 -1
package/dist/testing.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/utils.ts","../src/core/requirements.ts","../src/core/tracking.ts","../src/core/constraints.ts","../src/core/derivations.ts","../src/core/effects.ts","../src/core/types/errors.ts","../src/core/errors.ts","../src/core/facts.ts","../src/core/plugins.ts","../src/core/resolvers.ts","../src/utils/time-travel.ts","../src/core/engine.ts","../src/core/system.ts","../src/utils/testing.ts"],"names":["withTimeout","promise","ms","errorMessage","timeoutId","timeoutPromise","_","reject","stableStringify","value","maxDepth","seen","stringify","val","depth","type","result","v","obj","k","isPrototypeSafe","dangerousKeys","check","objVal","item","key","hashObject","str","hash","i","generateRequirementId","req","keyFn","rest","sortedRest","createRequirementWithId","requirement","fromConstraint","RequirementSet","_RequirementSet","id","copy","other","added","removed","unchanged","trackingStack","createTrackingContext","dependencies","nullContext","getCurrentTracker","withTracking","fn","context","withoutTracking","saved","trackAccess","DEFAULT_TIMEOUT","createConstraintsManager","options","definitions","facts","requirementKeys","defaultTimeout","onEvaluate","onError","states","disabled","asyncConstraintIds","constraintDeps","factToConstraints","dirtyConstraints","latestWhenDeps","lastRequirements","hasEvaluated","resolvedConstraints","noFireConstraints","dependsOnMe","topologicalOrder","topologicalIndex","buildReverseDependencyMap","def","depId","detectCyclesAndComputeTopoOrder","visited","visiting","postOrder","visit","path","cycleStart","cycle","index","isAsyncConstraint","initState","isAsync","state","getState","updateDependencies","newDeps","oldDeps","dep","constraints","evaluateSync","tracked","asyncResult","error","evaluateAsync","timeout","depsSet","resultPromise","MAX_REQUIREMENTS_WARNING_THRESHOLD","normalizeRequirements","output","constraintId","filtered","r","getRequirements","requireDef","deps","mergeDependencies","additionalDeps","existingDeps","sortedConstraintIds","getSortedConstraintIds","a","b","stateA","priorityDiff","topoA","topoB","areAfterDependenciesSatisfied","changedKeys","requirements","allConstraintIds","constraintsToEvaluate","affected","dependentConstraints","lastReqs","processConstraintResult","active","whenDeps","reqs","requireDeps","combinedDeps","reqsWithId","reqWithId","evaluateConstraintBatch","constraintIds","blockedConstraints","readyToEvaluate","syncConstraints","asyncConstraints","unexpectedAsync","asyncResults","remainingToEvaluate","maxPasses","previousRemaining","factKey","dependents","newDefs","createDerivationsManager","onCompute","onInvalidate","listeners","factToDerivedDeps","derivedToDerivedDeps","BLOCKED_PROPS","invalidationDepth","pendingNotifications","isFlushing","MAX_FLUSH_ITERATIONS","derivedProxy","computeDerivation","depSet","flushNotifications","iterations","remaining","ids","listener","invalidateDerivation","dependent","prop","factKeys","idStr","listenerSet","createEffectsManager","store","onRun","previousSnapshot","stopped","createSnapshot","shouldRun","runCleanup","storeCleanup","runEffect","effectPromise","trackedDeps","trackingResult","effectsToRun","effectIds","DirectiveError","message","source","sourceId","recoverable","createRetryLaterManager","config","delayMs","maxRetries","backoffMultiplier","maxDelayMs","pendingRetries","calculateDelay","attempt","delay","callback","entry","now","dueRetries","DEFAULT_STRATEGIES","createErrorBoundaryManager","onRecovery","errors","maxErrors","retryLaterManager","retryAttempts","toDirectiveError","getStrategy","handler","e","directiveError","strategy","safeStringify","maxLength","createFactsStore","schema","onChange","onBatch","isTypeAssertionSchema","validate","strictKeys","redactErrors","map","knownKeys","keyListeners","allListeners","batching","batchChanges","dirtyKeys","isNotifying","pendingNonBatchedChanges","MAX_NOTIFY_ITERATIONS","isZodSchema","getExpectedType","schemaType","st","formatValueForError","validateValue","valueType","valuePreview","expectedType","validators","validator","indexHint","validatorHint","notifyKey","notifyAll","notifyNonBatched","prev","deferred","change","flush","keys","keyStr","set","newSchema","createFactsProxy","snapshot","createFacts","createPluginManager","plugins","safeCall","safeCallAsync","plugin","p","name","system","changes","byResolver","resolver","duration","from","to","DEFAULT_RETRY","DEFAULT_BATCH","policy","backoff","initialDelay","maxDelay","createResolversManager","onStart","onComplete","onRetry","onCancel","onResolutionComplete","inflight","statuses","MAX_STATUSES","batches","resolversByType","MAX_RESOLVER_CACHE","cleanupStatuses","entriesToRemove","iterator","hasStringRequirement","hasFunctionRequirement","resolverHandles","findResolver","reqType","cached","oldest","typeResolvers","createContext","signal","executeResolve","resolverId","controller","retryPolicy","lastError","ctx","resolvePromise","resolve","abortHandler","executeBatch","batchConfig","startedAt","reqPayloads","results","hasFailures","addToBatch","batch","processBatch","requirementId","status","createTimeTravelManager","onSnapshot","onTimeTravel","isEnabled","maxSnapshots","snapshots","currentIndex","nextId","paused","restoring","changesets","pendingChangesetLabel","pendingChangesetStart","getCurrentFacts","serializeFacts","factsObj","deserializeFacts","serialized","trigger","steps","fromIndex","toIndex","cs","c","earlierCs","snapshotId","s","json","data","snap","label","createDisabledTimeTravel","noopSnapshot","createEngine","mergedSchema","mergedEvents","mergedDerive","mergedEffects","mergedConstraints","mergedResolvers","schemaOwners","module","validateKeys","section","existingOwner","snapshotEventNames","m","mod","eventName","dispatchDepth","shouldTakeSnapshot","derivationNames","pluginManager","errorBoundary","invalidateManyDerivations","timeTravelRef","scheduleReconcile","derivationsManager","effectsManager","constraintsManager","resolversManager","notifySettlementChange","timeTravelListeners","notifyTimeTravelChange","timeTravelManager","settlementListeners","MAX_RECONCILE_DEPTH","reconcileDepth","reconcile","keysForConstraints","currentRequirements","currentSet","inflightInfo","deriveAccessor","eventsAccessor","payload","event","derivationId","derivationIds","unsubs","u","isEqual","previousValue","newValue","oldValue","next","old","predicate","unsub","timer","cleanup","current","constraintState","resolverStatus","relevantFacts","factsSnapshot","lines","reqDetails","factEntries","prefix","valueStr","maxWait","startTime","inspection","details","unmet","includeDerivations","excludeDerivations","includeFacts","ttlSeconds","metadata","includeVersion","allDerivationKeys","derivationKeys","unknown","excludeSet","allFactKeys","createdAt","previousVersion","registerModule","existingFactKeys","SEPARATOR","topologicalSort","modulesMap","namespaces","namespace","depNamespace","moduleFactsProxyCache","namespacedFactsProxyCache","namespacedDeriveProxyCache","moduleDeriveProxyCache","createSystem","createSingleModuleSystem","namedOptions","createNamespacedSystem","moduleNamespaces","snapshotModulesSet","orderedNamespaces","initOrder","explicitOrder","missingModules","ns","debug","flatModules","hasCrossModuleDeps","depNamespaces","prefixedFacts","prefixedDerivations","prefixedEvents","prefixedInit","moduleFactsProxy","createModuleFactsProxy","prefixedDerive","derive","factsProxy","createCrossModuleFactsProxy","deriveProxy","createModuleDeriveProxy","prefixedEventHandlers","prefixedConstraints","constraint","constraintDef","prefixedResolvers","resolverDef","namespacedFacts","createNamespacedFactsProxy","prefixedEffects","effect","effectDef","prevProxy","hydratedFacts","engine","applyNamespacedFacts","namespaceKeysMap","moduleNamesCache","getModuleNames","namespacedFactsProxy","namespacedDeriveProxy","createNamespacedDeriveProxy","namespacedEventsProxy","createNamespacedEventsProxy","tickInterval","tickMs","loader","tickEventKey","toInternalKey","internalIds","internalOptions","namespacedData","sepIndex","localKey","moduleDef","namespaceCache","proxy","crossModuleFactsProxyCache","selfNamespace","cacheKey","depNamesSet","allKeys","moduleEventsProxyCache","moduleEventsProxy","eventsProxy","flushMicrotasks","settleWithFakeTimers","advanceTime","totalTime","stepSize","maxIterations","elapsed","finalInspection","resolverIds","createFakeTimers","currentTime","timers","targetTime","createMockResolver","typeOrOptions","calls","_req","mockResolver","_requirementType","pending","_ctx","createTestSystem","eventHistory","resolverCalls","allRequirements","factsHistory","mockResolvers","mockOptions","modulesWithMocks","fullKey","possibleNamespace","originalDispatch","checkIdle","times","actualValues"],"mappings":"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","file":"testing.cjs","sourcesContent":["/**\n * Shared utilities for Directive\n */\n\n/**\n * Execute a promise with a timeout, properly cleaning up the timer.\n * Used by both constraints and resolvers for timeout handling.\n *\n * @param promise - The promise to wrap with a timeout\n * @param ms - Timeout duration in milliseconds\n * @param errorMessage - Error message if timeout occurs\n * @returns The promise result\n * @throws Error if timeout is exceeded\n */\nexport async function withTimeout<T>(\n\tpromise: Promise<T>,\n\tms: number,\n\terrorMessage: string,\n): Promise<T> {\n\tlet timeoutId: ReturnType<typeof setTimeout>;\n\n\tconst timeoutPromise = new Promise<never>((_, reject) => {\n\t\ttimeoutId = setTimeout(() => reject(new Error(errorMessage)), ms);\n\t});\n\n\ttry {\n\t\treturn await Promise.race([promise, timeoutPromise]);\n\t} finally {\n\t\tclearTimeout(timeoutId!);\n\t}\n}\n\n/**\n * Normalize an error to an Error instance.\n * Ensures consistent error handling throughout the library.\n *\n * @param error - The error to normalize (can be anything)\n * @returns An Error instance\n */\nexport function normalizeError(error: unknown): Error {\n\tif (error instanceof Error) {\n\t\treturn error;\n\t}\n\treturn new Error(String(error));\n}\n\n/**\n * Create a stable JSON string with sorted keys.\n * Handles circular references and deeply nested objects safely.\n *\n * @param value - The value to stringify\n * @param maxDepth - Maximum nesting depth (default: 50)\n * @returns A stable JSON string\n */\nexport function stableStringify(value: unknown, maxDepth = 50): string {\n\tconst seen = new WeakSet();\n\n\tfunction stringify(val: unknown, depth: number): string {\n\t\tif (depth > maxDepth) {\n\t\t\treturn '\"[max depth exceeded]\"';\n\t\t}\n\n\t\tif (val === null) return \"null\";\n\t\tif (val === undefined) return \"undefined\";\n\n\t\tconst type = typeof val;\n\n\t\tif (type === \"string\") return JSON.stringify(val);\n\t\tif (type === \"number\" || type === \"boolean\") return String(val);\n\t\tif (type === \"function\") return '\"[function]\"';\n\t\tif (type === \"symbol\") return '\"[symbol]\"';\n\n\t\tif (Array.isArray(val)) {\n\t\t\t// Check for circular reference\n\t\t\tif (seen.has(val)) {\n\t\t\t\treturn '\"[circular]\"';\n\t\t\t}\n\t\t\tseen.add(val);\n\t\t\tconst result = `[${val.map((v) => stringify(v, depth + 1)).join(\",\")}]`;\n\t\t\tseen.delete(val);\n\t\t\treturn result;\n\t\t}\n\n\t\tif (type === \"object\") {\n\t\t\tconst obj = val as Record<string, unknown>;\n\t\t\t// Check for circular reference\n\t\t\tif (seen.has(obj)) {\n\t\t\t\treturn '\"[circular]\"';\n\t\t\t}\n\t\t\tseen.add(obj);\n\t\t\tconst keys = Object.keys(obj).sort();\n\t\t\tconst pairs = keys.map((k) => `${JSON.stringify(k)}:${stringify(obj[k], depth + 1)}`);\n\t\t\tconst result = `{${pairs.join(\",\")}}`;\n\t\t\tseen.delete(obj);\n\t\t\treturn result;\n\t\t}\n\n\t\treturn '\"[unknown]\"';\n\t}\n\n\treturn stringify(value, 0);\n}\n\n/**\n * Check for prototype pollution in an object, including nested objects.\n * Returns true if the object is safe, false if dangerous keys are found.\n *\n * @param obj - The object to check\n * @param maxDepth - Maximum nesting depth to check (default: 50)\n * @returns True if safe, false if dangerous keys found\n */\nexport function isPrototypeSafe(obj: unknown, maxDepth = 50): boolean {\n\tconst dangerousKeys = new Set([\"__proto__\", \"constructor\", \"prototype\"]);\n\tconst seen = new WeakSet();\n\n\tfunction check(val: unknown, depth: number): boolean {\n\t\tif (depth > maxDepth) return false; // Fail safe at max depth - don't assume safety\n\t\tif (val === null || val === undefined) return true;\n\t\tif (typeof val !== \"object\") return true;\n\n\t\tconst objVal = val as Record<string, unknown>;\n\n\t\t// Check for circular reference\n\t\tif (seen.has(objVal)) return true;\n\t\tseen.add(objVal);\n\n\t\t// Check array elements\n\t\tif (Array.isArray(objVal)) {\n\t\t\tfor (const item of objVal) {\n\t\t\t\tif (!check(item, depth + 1)) {\n\t\t\t\t\tseen.delete(objVal);\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tseen.delete(objVal);\n\t\t\treturn true;\n\t\t}\n\n\t\t// Check object keys and values\n\t\tfor (const key of Object.keys(objVal)) {\n\t\t\tif (dangerousKeys.has(key)) {\n\t\t\t\tseen.delete(objVal);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (!check(objVal[key], depth + 1)) {\n\t\t\t\tseen.delete(objVal);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tseen.delete(objVal);\n\t\treturn true;\n\t}\n\n\treturn check(obj, 0);\n}\n\n/**\n * Shallow equality comparison for objects.\n * Used by React hooks to avoid unnecessary re-renders.\n *\n * @param a - First object\n * @param b - Second object\n * @returns True if objects are shallowly equal\n */\nexport function shallowEqual<T extends Record<string, unknown>>(a: T, b: T): boolean {\n\tif (a === b) return true;\n\tif (!a || !b) return false;\n\n\tconst keysA = Object.keys(a);\n\tconst keysB = Object.keys(b);\n\n\tif (keysA.length !== keysB.length) return false;\n\n\tfor (const key of keysA) {\n\t\tif (a[key] !== b[key]) return false;\n\t}\n\n\treturn true;\n}\n\n/**\n * Generate a simple hash string from an object.\n * Uses djb2 algorithm on the stable stringified value.\n *\n * **Limitations:**\n * - 32-bit hash output means collision probability increases with data set size\n * (birthday paradox: ~50% collision chance at ~77,000 distinct values)\n * - Suitable for: cache invalidation, change detection, deduplication of small sets\n * - NOT suitable for: cryptographic use, security-sensitive operations, large-scale deduplication\n *\n * For security-sensitive use cases requiring stronger collision resistance,\n * consider using a cryptographic hash like SHA-256.\n *\n * @param value - The value to hash\n * @returns A hex hash string (8 characters, 32 bits)\n */\nexport function hashObject(value: unknown): string {\n\tconst str = stableStringify(value);\n\tlet hash = 5381;\n\tfor (let i = 0; i < str.length; i++) {\n\t\thash = ((hash << 5) + hash) ^ str.charCodeAt(i);\n\t}\n\t// Convert to unsigned 32-bit and then to hex\n\treturn (hash >>> 0).toString(16);\n}\n\n// ============================================================================\n// Distributable Snapshot Utilities\n// ============================================================================\n\n/**\n * Distributable snapshot type for type-safe helper functions.\n */\nexport interface DistributableSnapshotLike<T = Record<string, unknown>> {\n\tdata: T;\n\tcreatedAt: number;\n\texpiresAt?: number;\n\tversion?: string;\n\tmetadata?: Record<string, unknown>;\n}\n\n/**\n * Check if a distributable snapshot has expired.\n * Returns false if the snapshot has no expiresAt field.\n *\n * @example\n * ```typescript\n * const snapshot = system.getDistributableSnapshot({ ttlSeconds: 3600 });\n * // ... later ...\n * if (isSnapshotExpired(snapshot)) {\n * // Refresh the snapshot\n * }\n * ```\n *\n * @param snapshot - The snapshot to check\n * @param now - Optional current timestamp (defaults to Date.now())\n * @returns True if the snapshot has expired, false otherwise\n */\nexport function isSnapshotExpired<T>(\n\tsnapshot: DistributableSnapshotLike<T>,\n\tnow: number = Date.now(),\n): boolean {\n\treturn snapshot.expiresAt !== undefined && now > snapshot.expiresAt;\n}\n\n/**\n * Validate a distributable snapshot and return its data.\n * Throws if the snapshot is malformed or has expired.\n *\n * @example\n * ```typescript\n * const cached = JSON.parse(await redis.get(`entitlements:${userId}`));\n * try {\n * const data = validateSnapshot(cached);\n * // Use data.canUseFeature, etc.\n * } catch (e) {\n * // Snapshot invalid or expired, refresh it\n * }\n * ```\n *\n * @example Using custom timestamp for testing\n * ```typescript\n * const snapshot = { data: { test: true }, createdAt: 1000, expiresAt: 2000 };\n * validateSnapshot(snapshot, 1500); // Returns { test: true }\n * validateSnapshot(snapshot, 2500); // Throws: Snapshot expired\n * ```\n *\n * @param snapshot - The snapshot to validate\n * @param now - Optional current timestamp (defaults to Date.now())\n * @returns The snapshot data if valid\n * @throws Error if the snapshot is malformed or has expired\n */\nexport function validateSnapshot<T>(\n\tsnapshot: DistributableSnapshotLike<T>,\n\tnow: number = Date.now(),\n): T {\n\t// Structural validation\n\tif (!snapshot || typeof snapshot !== \"object\") {\n\t\tthrow new Error(\n\t\t\t\"[Directive] Invalid snapshot: expected an object with 'data' and 'createdAt' properties.\",\n\t\t);\n\t}\n\tif (!(\"data\" in snapshot)) {\n\t\tthrow new Error(\n\t\t\t\"[Directive] Invalid snapshot: missing required 'data' property.\",\n\t\t);\n\t}\n\tif (!(\"createdAt\" in snapshot) || typeof snapshot.createdAt !== \"number\") {\n\t\tthrow new Error(\n\t\t\t\"[Directive] Invalid snapshot: missing or invalid 'createdAt' property (expected number).\",\n\t\t);\n\t}\n\n\t// Expiration validation\n\tif (isSnapshotExpired(snapshot, now)) {\n\t\tconst expiredAt = new Date(snapshot.expiresAt!).toISOString();\n\t\tthrow new Error(\n\t\t\t`[Directive] Snapshot expired at ${expiredAt}. Obtain a fresh snapshot from the source.`,\n\t\t);\n\t}\n\treturn snapshot.data;\n}\n\n/**\n * Diff result for a single changed value.\n */\nexport interface SnapshotDiffEntry {\n\t/** The key path that changed (e.g., \"canUseApi\" or \"limits.apiCalls\") */\n\tpath: string;\n\t/** The value in the old snapshot */\n\toldValue: unknown;\n\t/** The value in the new snapshot */\n\tnewValue: unknown;\n\t/** Type of change: \"added\", \"removed\", or \"changed\" */\n\ttype: \"added\" | \"removed\" | \"changed\";\n}\n\n/**\n * Result of diffing two snapshots.\n */\nexport interface SnapshotDiff {\n\t/** Whether the snapshots are identical */\n\tidentical: boolean;\n\t/** List of changes between snapshots */\n\tchanges: SnapshotDiffEntry[];\n\t/** Whether the version changed (if both have versions) */\n\tversionChanged: boolean;\n\t/** Old version (if available) */\n\toldVersion?: string;\n\t/** New version (if available) */\n\tnewVersion?: string;\n}\n\n/**\n * Compare two distributable snapshots and return the differences.\n * Useful for debugging, audit logs, and webhook payloads.\n *\n * @example\n * ```typescript\n * const oldSnapshot = system.getDistributableSnapshot({ includeVersion: true });\n * system.dispatch({ type: \"upgradePlan\", plan: \"pro\" });\n * const newSnapshot = system.getDistributableSnapshot({ includeVersion: true });\n *\n * const diff = diffSnapshots(oldSnapshot, newSnapshot);\n * if (!diff.identical) {\n * console.log(\"Changes:\", diff.changes);\n * // [{ path: \"canUseApi\", oldValue: false, newValue: true, type: \"changed\" }]\n * }\n * ```\n *\n * @param oldSnapshot - The previous snapshot\n * @param newSnapshot - The new snapshot\n * @returns A diff result with all changes\n */\nexport function diffSnapshots<T = Record<string, unknown>>(\n\toldSnapshot: DistributableSnapshotLike<T>,\n\tnewSnapshot: DistributableSnapshotLike<T>,\n): SnapshotDiff {\n\tconst changes: SnapshotDiffEntry[] = [];\n\n\t// Deep compare function\n\tfunction compare(\n\t\toldObj: unknown,\n\t\tnewObj: unknown,\n\t\tpath: string,\n\t): void {\n\t\t// Handle null/undefined\n\t\tif (oldObj === null || oldObj === undefined) {\n\t\t\tif (newObj !== null && newObj !== undefined) {\n\t\t\t\tchanges.push({ path, oldValue: oldObj, newValue: newObj, type: \"added\" });\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (newObj === null || newObj === undefined) {\n\t\t\tchanges.push({ path, oldValue: oldObj, newValue: newObj, type: \"removed\" });\n\t\t\treturn;\n\t\t}\n\n\t\t// Handle primitives\n\t\tif (typeof oldObj !== \"object\" || typeof newObj !== \"object\") {\n\t\t\tif (!Object.is(oldObj, newObj)) {\n\t\t\t\tchanges.push({ path, oldValue: oldObj, newValue: newObj, type: \"changed\" });\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Handle arrays\n\t\tif (Array.isArray(oldObj) && Array.isArray(newObj)) {\n\t\t\tif (oldObj.length !== newObj.length) {\n\t\t\t\tchanges.push({ path, oldValue: oldObj, newValue: newObj, type: \"changed\" });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfor (let i = 0; i < oldObj.length; i++) {\n\t\t\t\tcompare(oldObj[i], newObj[i], `${path}[${i}]`);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Handle objects\n\t\tconst oldRecord = oldObj as Record<string, unknown>;\n\t\tconst newRecord = newObj as Record<string, unknown>;\n\t\tconst allKeys = new Set([...Object.keys(oldRecord), ...Object.keys(newRecord)]);\n\n\t\tfor (const key of allKeys) {\n\t\t\tconst childPath = path ? `${path}.${key}` : key;\n\t\t\tif (!(key in oldRecord)) {\n\t\t\t\tchanges.push({ path: childPath, oldValue: undefined, newValue: newRecord[key], type: \"added\" });\n\t\t\t} else if (!(key in newRecord)) {\n\t\t\t\tchanges.push({ path: childPath, oldValue: oldRecord[key], newValue: undefined, type: \"removed\" });\n\t\t\t} else {\n\t\t\t\tcompare(oldRecord[key], newRecord[key], childPath);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compare data\n\tcompare(oldSnapshot.data, newSnapshot.data, \"\");\n\n\t// Check version change\n\tconst versionChanged = oldSnapshot.version !== newSnapshot.version &&\n\t\t(oldSnapshot.version !== undefined || newSnapshot.version !== undefined);\n\n\treturn {\n\t\tidentical: changes.length === 0,\n\t\tchanges,\n\t\tversionChanged,\n\t\toldVersion: oldSnapshot.version,\n\t\tnewVersion: newSnapshot.version,\n\t};\n}\n\n// ============================================================================\n// Snapshot Signing (HMAC)\n// ============================================================================\n\n/**\n * A signed distributable snapshot.\n * Contains the original snapshot plus a cryptographic signature.\n */\nexport interface SignedSnapshot<T = Record<string, unknown>>\n\textends DistributableSnapshotLike<T> {\n\t/** HMAC-SHA256 signature in hex format */\n\tsignature: string;\n\t/** Signing algorithm used */\n\talgorithm: \"hmac-sha256\";\n}\n\n/**\n * Check if a snapshot is signed.\n *\n * @param snapshot - The snapshot to check\n * @returns True if the snapshot has a signature\n */\nexport function isSignedSnapshot<T>(\n\tsnapshot: DistributableSnapshotLike<T> | SignedSnapshot<T>,\n): snapshot is SignedSnapshot<T> {\n\treturn \"signature\" in snapshot && typeof snapshot.signature === \"string\";\n}\n\n/**\n * Sign a distributable snapshot using HMAC-SHA256.\n * Creates a tamper-proof signature that can be verified later.\n *\n * **Security Notes:**\n * - Use a cryptographically random secret of at least 32 bytes\n * - Store the secret securely (environment variable, secrets manager)\n * - Never expose the secret to clients\n * - The signature covers all snapshot fields for integrity\n *\n * @example\n * ```typescript\n * const snapshot = system.getDistributableSnapshot({\n * includeDerivations: ['canUseFeature', 'limits'],\n * ttlSeconds: 3600,\n * });\n *\n * // Sign the snapshot (server-side only)\n * const signed = await signSnapshot(snapshot, process.env.SNAPSHOT_SECRET);\n *\n * // Store in JWT, Redis, or send to client\n * const jwt = createJWT({ snapshot: signed });\n *\n * // Later, verify the signature\n * const isValid = await verifySnapshotSignature(signed, process.env.SNAPSHOT_SECRET);\n * if (!isValid) {\n * throw new Error('Snapshot has been tampered with');\n * }\n * ```\n *\n * @param snapshot - The snapshot to sign\n * @param secret - The HMAC secret (string or Uint8Array)\n * @returns A signed snapshot with the signature attached\n */\nexport async function signSnapshot<T>(\n\tsnapshot: DistributableSnapshotLike<T>,\n\tsecret: string | Uint8Array,\n): Promise<SignedSnapshot<T>> {\n\t// Create a canonical representation for signing\n\tconst payload = stableStringify({\n\t\tdata: snapshot.data,\n\t\tcreatedAt: snapshot.createdAt,\n\t\texpiresAt: snapshot.expiresAt,\n\t\tversion: snapshot.version,\n\t\tmetadata: snapshot.metadata,\n\t});\n\n\tconst signature = await hmacSha256(payload, secret);\n\n\treturn {\n\t\t...snapshot,\n\t\tsignature,\n\t\talgorithm: \"hmac-sha256\",\n\t};\n}\n\n/**\n * Verify the signature of a signed snapshot.\n * Returns true if the signature is valid, false otherwise.\n *\n * **Important:** Always verify signatures before trusting snapshot data,\n * especially if the snapshot was received from an untrusted source (client, cache).\n *\n * @example\n * ```typescript\n * // Receive signed snapshot from client or cache\n * const snapshot = JSON.parse(cachedData);\n *\n * // Verify before using\n * const isValid = await verifySnapshotSignature(snapshot, process.env.SNAPSHOT_SECRET);\n * if (!isValid) {\n * throw new Error('Invalid snapshot signature - possible tampering');\n * }\n *\n * // Now safe to use snapshot.data\n * if (snapshot.data.canUseFeature.api) {\n * // Grant access\n * }\n * ```\n *\n * @param signedSnapshot - The signed snapshot to verify\n * @param secret - The HMAC secret (must match the signing secret)\n * @returns True if signature is valid, false otherwise\n */\nexport async function verifySnapshotSignature<T>(\n\tsignedSnapshot: SignedSnapshot<T>,\n\tsecret: string | Uint8Array,\n): Promise<boolean> {\n\tif (!signedSnapshot.signature || signedSnapshot.algorithm !== \"hmac-sha256\") {\n\t\treturn false;\n\t}\n\n\t// Recreate the canonical payload (same as signing)\n\tconst payload = stableStringify({\n\t\tdata: signedSnapshot.data,\n\t\tcreatedAt: signedSnapshot.createdAt,\n\t\texpiresAt: signedSnapshot.expiresAt,\n\t\tversion: signedSnapshot.version,\n\t\tmetadata: signedSnapshot.metadata,\n\t});\n\n\tconst expectedSignature = await hmacSha256(payload, secret);\n\n\t// Use timing-safe comparison\n\treturn timingSafeEqual(signedSnapshot.signature, expectedSignature);\n}\n\n/**\n * Create HMAC-SHA256 signature of a message.\n * Uses Web Crypto API for cross-platform support (Node.js, browsers, Deno, Bun).\n */\nasync function hmacSha256(\n\tmessage: string,\n\tsecret: string | Uint8Array,\n): Promise<string> {\n\t// Convert secret to Uint8Array if string\n\tconst secretBytes: Uint8Array =\n\t\ttypeof secret === \"string\" ? new TextEncoder().encode(secret) : secret;\n\n\t// Import key for HMAC\n\tconst algorithm: HmacImportParams = { name: \"HMAC\", hash: { name: \"SHA-256\" } };\n\tconst key = await crypto.subtle.importKey(\n\t\t\"raw\",\n\t\tsecretBytes as unknown as ArrayBuffer,\n\t\talgorithm,\n\t\tfalse,\n\t\t[\"sign\"],\n\t);\n\n\t// Sign the message\n\tconst messageBytes = new TextEncoder().encode(message);\n\tconst signature = await crypto.subtle.sign(\"HMAC\", key, messageBytes);\n\n\t// Convert to hex string\n\treturn Array.from(new Uint8Array(signature))\n\t\t.map((b) => b.toString(16).padStart(2, \"0\"))\n\t\t.join(\"\");\n}\n\n/**\n * Timing-safe string comparison to prevent timing attacks.\n * Both strings should be the same length (hex signatures from same algorithm).\n */\nfunction timingSafeEqual(a: string, b: string): boolean {\n\tif (a.length !== b.length) {\n\t\treturn false;\n\t}\n\n\tlet result = 0;\n\tfor (let i = 0; i < a.length; i++) {\n\t\tresult |= a.charCodeAt(i) ^ b.charCodeAt(i);\n\t}\n\treturn result === 0;\n}\n","/**\n * Requirements - Typed requirement identity with custom dedupe keys\n *\n * Features:\n * - Type-safe requirement definitions\n * - Stable identity generation\n * - Custom key functions for deduplication control\n * - Requirement comparison and hashing\n */\n\nimport type { Requirement, RequirementKeyFn, RequirementWithId } from \"./types.js\";\nimport { stableStringify } from \"../utils/utils.js\";\n\n// ============================================================================\n// Requirement Identity\n// ============================================================================\n\n/**\n * Generate a stable ID for a requirement.\n * Uses type + sorted properties by default.\n */\nexport function generateRequirementId(\n\treq: Requirement,\n\tkeyFn?: RequirementKeyFn,\n): string {\n\t// Use custom key function if provided\n\tif (keyFn) {\n\t\treturn keyFn(req);\n\t}\n\n\t// Default: type + stable JSON of other properties\n\tconst { type, ...rest } = req;\n\tconst sortedRest = stableStringify(rest);\n\treturn `${type}:${sortedRest}`;\n}\n\n/**\n * Check if two requirements are equal by their IDs.\n */\nexport function requirementsEqual(\n\ta: RequirementWithId,\n\tb: RequirementWithId,\n): boolean {\n\treturn a.id === b.id;\n}\n\n/**\n * Create a requirement with its computed ID.\n */\nexport function createRequirementWithId(\n\trequirement: Requirement,\n\tfromConstraint: string,\n\tkeyFn?: RequirementKeyFn,\n): RequirementWithId {\n\treturn {\n\t\trequirement,\n\t\tid: generateRequirementId(requirement, keyFn),\n\t\tfromConstraint,\n\t};\n}\n\n// ============================================================================\n// Requirement Helpers\n// ============================================================================\n\n/**\n * Helper to create typed requirements with a fluent API.\n *\n * Creates a factory function that produces requirements with a specific type.\n * Useful for creating requirements in constraint definitions.\n *\n * @param type - The requirement type string\n * @returns A factory function that creates requirements with the given type\n *\n * @example\n * ```typescript\n * // Create a requirement factory\n * const fetchUser = req(\"FETCH_USER\");\n *\n * // Use in constraint definition\n * constraints: {\n * needsUser: {\n * when: (facts) => facts.userId && !facts.user,\n * require: fetchUser({ userId: 123, priority: \"high\" }),\n * },\n * }\n *\n * // Results in: { type: \"FETCH_USER\", userId: 123, priority: \"high\" }\n * ```\n */\nexport function req<T extends string>(type: T) {\n\treturn <P extends Record<string, unknown>>(props: P) => ({\n\t\ttype,\n\t\t...props,\n\t}) as Requirement & { type: T } & P;\n}\n\n/**\n * Check if a requirement matches a type.\n */\nexport function isRequirementType<T extends string>(\n\treq: Requirement,\n\ttype: T,\n): req is Requirement & { type: T } {\n\treturn req.type === type;\n}\n\n/**\n * Create a type guard for resolver `requirement` predicate.\n * Cleaner alternative to writing verbose type guards.\n *\n * @example\n * ```typescript\n * // With explicit requirement type (recommended for complex types)\n * interface FetchUserRequirement { type: \"FETCH_USER\"; userId: string }\n * requirement: forType<FetchUserRequirement>(\"FETCH_USER\"),\n * key: (req) => req.userId, // req is FetchUserRequirement\n *\n * // Or simple string literal (for basic types)\n * requirement: forType(\"FETCH_USER\"),\n * key: (req) => req.type, // req is Requirement & { type: \"FETCH_USER\" }\n * ```\n */\nexport function forType<R extends Requirement>(\n\ttype: R[\"type\"],\n): (req: Requirement) => req is R;\nexport function forType<T extends string>(\n\ttype: T,\n): (req: Requirement) => req is Requirement & { type: T };\nexport function forType<T extends string>(\n\ttype: T,\n): (req: Requirement) => req is Requirement & { type: T } {\n\treturn (req): req is Requirement & { type: T } => req.type === type;\n}\n\n// ============================================================================\n// Requirement Set Management\n// ============================================================================\n\n/**\n * A set of requirements with automatic deduplication by ID.\n *\n * Requirements are uniquely identified by their ID (generated from type + properties).\n * When adding a requirement with a duplicate ID, the first one wins.\n *\n * @example\n * ```typescript\n * const set = new RequirementSet();\n *\n * // Add requirements\n * set.add(createRequirementWithId({ type: \"FETCH_USER\", userId: 1 }, \"constraint1\"));\n * set.add(createRequirementWithId({ type: \"FETCH_USER\", userId: 1 }, \"constraint2\")); // Ignored (duplicate)\n *\n * // Check and retrieve\n * console.log(set.size); // 1\n * console.log(set.has(\"FETCH_USER:{\\\"userId\\\":1}\")); // true\n *\n * // Diff with another set\n * const newSet = new RequirementSet();\n * newSet.add(createRequirementWithId({ type: \"FETCH_USER\", userId: 2 }, \"constraint1\"));\n * const { added, removed } = newSet.diff(set);\n * // added: [{ type: \"FETCH_USER\", userId: 2 }]\n * // removed: [{ type: \"FETCH_USER\", userId: 1 }]\n * ```\n */\nexport class RequirementSet {\n\tprivate map = new Map<string, RequirementWithId>();\n\n\t/**\n\t * Add a requirement to the set.\n\t * If a requirement with the same ID already exists, it is ignored (first wins).\n\t * @param req - The requirement with its computed ID\n\t */\n\tadd(req: RequirementWithId): void {\n\t\t// If already exists, keep the existing one (first wins)\n\t\tif (!this.map.has(req.id)) {\n\t\t\tthis.map.set(req.id, req);\n\t\t}\n\t}\n\n\t/** Remove a requirement by ID */\n\tremove(id: string): boolean {\n\t\treturn this.map.delete(id);\n\t}\n\n\t/** Check if a requirement exists */\n\thas(id: string): boolean {\n\t\treturn this.map.has(id);\n\t}\n\n\t/** Get a requirement by ID */\n\tget(id: string): RequirementWithId | undefined {\n\t\treturn this.map.get(id);\n\t}\n\n\t/** Get all requirements */\n\tall(): RequirementWithId[] {\n\t\treturn [...this.map.values()];\n\t}\n\n\t/** Get all requirement IDs */\n\tids(): string[] {\n\t\treturn [...this.map.keys()];\n\t}\n\n\t/** Get the count of requirements */\n\tget size(): number {\n\t\treturn this.map.size;\n\t}\n\n\t/** Clear all requirements */\n\tclear(): void {\n\t\tthis.map.clear();\n\t}\n\n\t/** Create a copy */\n\tclone(): RequirementSet {\n\t\tconst copy = new RequirementSet();\n\t\tfor (const req of this.map.values()) {\n\t\t\tcopy.add(req);\n\t\t}\n\t\treturn copy;\n\t}\n\n\t/** Diff with another set - returns added and removed */\n\tdiff(other: RequirementSet): {\n\t\tadded: RequirementWithId[];\n\t\tremoved: RequirementWithId[];\n\t\tunchanged: RequirementWithId[];\n\t} {\n\t\tconst added: RequirementWithId[] = [];\n\t\tconst removed: RequirementWithId[] = [];\n\t\tconst unchanged: RequirementWithId[] = [];\n\n\t\t// Find added (in this but not in other)\n\t\tfor (const req of this.map.values()) {\n\t\t\tif (!other.has(req.id)) {\n\t\t\t\tadded.push(req);\n\t\t\t} else {\n\t\t\t\tunchanged.push(req);\n\t\t\t}\n\t\t}\n\n\t\t// Find removed (in other but not in this)\n\t\tfor (const req of other.map.values()) {\n\t\t\tif (!this.map.has(req.id)) {\n\t\t\t\tremoved.push(req);\n\t\t\t}\n\t\t}\n\n\t\treturn { added, removed, unchanged };\n\t}\n}\n","/**\n * Dependency tracking context for auto-tracking derivations\n *\n * Uses a stack-based approach to handle nested derivation computations.\n * When a derivation accesses a fact, the tracking context records it.\n */\n\nimport type { TrackingContext } from \"./types.js\";\n\n/** Stack of active tracking contexts */\nconst trackingStack: TrackingContext[] = [];\n\n/** Create a new tracking context */\nfunction createTrackingContext(): TrackingContext {\n\tconst dependencies = new Set<string>();\n\n\treturn {\n\t\tget isTracking() {\n\t\t\treturn true;\n\t\t},\n\t\ttrack(key: string) {\n\t\t\tdependencies.add(key);\n\t\t},\n\t\tgetDependencies() {\n\t\t\treturn dependencies;\n\t\t},\n\t};\n}\n\n/** Null tracking context when not tracking */\nconst nullContext: TrackingContext = {\n\tisTracking: false,\n\ttrack() {},\n\tgetDependencies() {\n\t\treturn new Set();\n\t},\n};\n\n/**\n * Get the current tracking context.\n * Returns null context if no tracking is active.\n */\nexport function getCurrentTracker(): TrackingContext {\n\treturn trackingStack[trackingStack.length - 1] ?? nullContext;\n}\n\n/**\n * Check if we're currently tracking dependencies.\n */\nexport function isTracking(): boolean {\n\treturn trackingStack.length > 0;\n}\n\n/**\n * Run a function with dependency tracking.\n * Returns the computed value and the set of dependencies accessed.\n */\nexport function withTracking<T>(fn: () => T): { value: T; deps: Set<string> } {\n\tconst context = createTrackingContext();\n\ttrackingStack.push(context);\n\n\ttry {\n\t\tconst value = fn();\n\t\treturn { value, deps: context.getDependencies() };\n\t} finally {\n\t\ttrackingStack.pop();\n\t}\n}\n\n/**\n * Run a function without tracking.\n * Useful for reading facts without creating dependencies.\n */\nexport function withoutTracking<T>(fn: () => T): T {\n\t// Temporarily clear the stack\n\tconst saved = trackingStack.splice(0, trackingStack.length);\n\n\ttry {\n\t\treturn fn();\n\t} finally {\n\t\t// Restore the stack\n\t\ttrackingStack.push(...saved);\n\t}\n}\n\n/**\n * Track a specific key in the current context.\n * No-op if not currently tracking.\n */\nexport function trackAccess(key: string): void {\n\tgetCurrentTracker().track(key);\n}\n","/**\n * Constraints - Rules that produce requirements when conditions aren't met\n *\n * Features:\n * - Sync and async constraint evaluation\n * - Priority ordering (higher runs first)\n * - Timeout handling for async constraints\n * - Error isolation\n */\n\nimport { createRequirementWithId, RequirementSet } from \"./requirements.js\";\nimport { withTracking } from \"./tracking.js\";\nimport type {\n\tConstraintsDef,\n\tConstraintState,\n\tFacts,\n\tRequirement,\n\tRequirementKeyFn,\n\tRequirementWithId,\n\tSchema,\n} from \"./types.js\";\nimport { withTimeout } from \"../utils/utils.js\";\n\n// Local type alias for requirement output (avoid type arg issues)\ntype RequirementOutput = Requirement | Requirement[] | null;\n\n// ============================================================================\n// Constraints Manager\n// ============================================================================\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport interface ConstraintsManager<_S extends Schema> {\n\t/** Evaluate all constraints and return unmet requirements */\n\tevaluate(changedKeys?: Set<string>): Promise<RequirementWithId[]>;\n\t/** Get the current state of a constraint */\n\tgetState(id: string): ConstraintState | undefined;\n\t/** Get all constraint states */\n\tgetAllStates(): ConstraintState[];\n\t/** Disable a constraint */\n\tdisable(id: string): void;\n\t/** Enable a constraint */\n\tenable(id: string): void;\n\t/** Invalidate constraints that depend on the given fact key */\n\tinvalidate(factKey: string): void;\n\t/** Mark a constraint's resolver as completed (for `after` ordering) */\n\tmarkResolved(constraintId: string): void;\n\t/** Check if a constraint has been resolved (for `after` ordering) */\n\tisResolved(constraintId: string): boolean;\n\t/** Register new constraint definitions (for dynamic module registration) */\n\tregisterDefinitions(newDefs: ConstraintsDef<Schema>): void;\n}\n\n/** Options for creating a constraints manager */\nexport interface CreateConstraintsOptions<S extends Schema> {\n\tdefinitions: ConstraintsDef<S>;\n\tfacts: Facts<S>;\n\t/** Custom key functions for requirements (by constraint ID) */\n\trequirementKeys?: Record<string, RequirementKeyFn>;\n\t/** Default timeout for async constraints (ms) */\n\tdefaultTimeout?: number;\n\t/** Callback when a constraint is evaluated */\n\tonEvaluate?: (id: string, active: boolean) => void;\n\t/** Callback when a constraint errors */\n\tonError?: (id: string, error: unknown) => void;\n}\n\n/** Default async constraint timeout (5 seconds) */\nconst DEFAULT_TIMEOUT = 5000;\n\n/**\n * Create a manager that evaluates constraint rules and produces unmet\n * requirements.\n *\n * Constraints are evaluated in priority order (higher first), with\n * topological ordering for same-priority constraints connected by `after`\n * dependencies. Supports sync and async `when()` predicates, incremental\n * evaluation based on changed fact keys, and per-constraint enable/disable.\n *\n * @param options - Constraint definitions, facts proxy, custom requirement key functions, and lifecycle callbacks\n * @returns A `ConstraintsManager` with evaluate/invalidate/enable/disable/markResolved methods\n */\nexport function createConstraintsManager<S extends Schema>(\n\toptions: CreateConstraintsOptions<S>,\n): ConstraintsManager<S> {\n\tconst {\n\t\tdefinitions,\n\t\tfacts,\n\t\trequirementKeys = {},\n\t\tdefaultTimeout = DEFAULT_TIMEOUT,\n\t\tonEvaluate,\n\t\tonError,\n\t} = options;\n\n\t// Internal state for each constraint\n\tconst states = new Map<string, ConstraintState>();\n\tconst disabled = new Set<string>();\n\n\t// Track which constraints are async\n\tconst asyncConstraintIds = new Set<string>();\n\n\t// Dependency tracking: which facts each constraint depends on\n\tconst constraintDeps = new Map<string, Set<string>>();\n\t// Reverse mapping: which constraints depend on each fact\n\tconst factToConstraints = new Map<string, Set<string>>();\n\t// Track which constraints need re-evaluation\n\tconst dirtyConstraints = new Set<string>();\n\t// Cache latest when() deps so they can be combined with require() deps atomically\n\tconst latestWhenDeps = new Map<string, Set<string>>();\n\t// Track last requirements for each constraint (for incremental updates)\n\tconst lastRequirements = new Map<string, RequirementWithId[]>();\n\t// First evaluation flag\n\tlet hasEvaluated = false;\n\t// Track resolved constraints (for `after` ordering)\n\tconst resolvedConstraints = new Set<string>();\n\t// Track constraints that didn't fire (when() returned false) - they don't block\n\tconst noFireConstraints = new Set<string>();\n\t// Reverse dependency map: which constraints depend on this one (for O(1) markResolved)\n\tconst dependsOnMe = new Map<string, Set<string>>();\n\t// Topological order of constraints (dependencies before dependents)\n\tlet topologicalOrder: string[] = [];\n\t// Cached topological index map for O(1) lookups during sorting\n\tlet topologicalIndex: Map<string, number> = new Map();\n\n\t/**\n\t * Build reverse dependency map for O(1) lookups in markResolved.\n\t * Maps each constraint ID to the set of constraints that depend on it via `after`.\n\t */\n\tfunction buildReverseDependencyMap(): void {\n\t\tfor (const [id, def] of Object.entries(definitions)) {\n\t\t\tif (def.after) {\n\t\t\t\tfor (const depId of def.after) {\n\t\t\t\t\tif (definitions[depId]) {\n\t\t\t\t\t\tif (!dependsOnMe.has(depId)) {\n\t\t\t\t\t\t\tdependsOnMe.set(depId, new Set());\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdependsOnMe.get(depId)!.add(id);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Detect cycles in the constraint dependency graph and compute topological order.\n\t * Uses DFS to find back edges and post-order for topological sort.\n\t *\n\t * The DFS visits dependencies first (via `after`), so post-order naturally gives us\n\t * topological order where dependencies appear before their dependents.\n\t */\n\tfunction detectCyclesAndComputeTopoOrder(): void {\n\t\tconst visited = new Set<string>();\n\t\tconst visiting = new Set<string>();\n\t\tconst postOrder: string[] = [];\n\n\t\tfunction visit(id: string, path: string[]): void {\n\t\t\tif (visited.has(id)) return;\n\n\t\t\tif (visiting.has(id)) {\n\t\t\t\tconst cycleStart = path.indexOf(id);\n\t\t\t\tconst cycle = [...path.slice(cycleStart), id].join(\" → \");\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`[Directive] Constraint cycle detected: ${cycle}. ` +\n\t\t\t\t\t`Remove one of the \\`after\\` dependencies to break the cycle.`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tvisiting.add(id);\n\t\t\tpath.push(id);\n\n\t\t\tconst def = definitions[id];\n\t\t\tif (def?.after) {\n\t\t\t\tfor (const depId of def.after) {\n\t\t\t\t\t// Only check deps that exist in this manager\n\t\t\t\t\tif (definitions[depId]) {\n\t\t\t\t\t\tvisit(depId, path);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpath.pop();\n\t\t\tvisiting.delete(id);\n\t\t\tvisited.add(id);\n\t\t\tpostOrder.push(id);\n\t\t}\n\n\t\tfor (const id of Object.keys(definitions)) {\n\t\t\tvisit(id, []);\n\t\t}\n\n\t\t// Post-order with dependency-first traversal gives us topological order\n\t\t// (dependencies are added before dependents)\n\t\ttopologicalOrder = postOrder;\n\n\t\t// Build index map for O(1) lookups during sorting\n\t\ttopologicalIndex = new Map(topologicalOrder.map((id, index) => [id, index]));\n\t}\n\n\t// Validate constraint graph (always run - cycle in production would cause deadlock)\n\t// Also computes topological order for O(n) evaluation\n\tdetectCyclesAndComputeTopoOrder();\n\n\t// Build reverse dependency map for O(1) markResolved lookups\n\tbuildReverseDependencyMap();\n\n\t// Validate `after` references in dev mode (catch typos early)\n\tif (process.env.NODE_ENV !== \"production\") {\n\t\tfor (const [id, def] of Object.entries(definitions)) {\n\t\t\tif (def.after) {\n\t\t\t\tfor (const depId of def.after) {\n\t\t\t\t\tif (!definitions[depId]) {\n\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t`[Directive] Constraint \"${id}\" references unknown constraint \"${depId}\" in \\`after\\`. ` +\n\t\t\t\t\t\t\t\t`This dependency will be ignored. Check for typos or ensure the constraint exists.`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Determine if a constraint is async.\n\t * Uses the explicit `async` flag if provided, otherwise falls back to runtime detection.\n\t * Runtime detection is only used on first evaluation and logs a dev warning.\n\t */\n\tfunction isAsyncConstraint(id: string, def: ConstraintsDef<S>[string]): boolean {\n\t\t// Prefer explicit flag to avoid runtime detection side effects\n\t\tif (def.async !== undefined) {\n\t\t\treturn def.async;\n\t\t}\n\n\t\t// Check if we've already detected this constraint as async\n\t\tif (asyncConstraintIds.has(id)) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Runtime detection is deferred to first evaluation\n\t\t// We'll detect it in evaluateSync if it returns a Promise\n\t\treturn false;\n\t}\n\n\t/** Initialize state for a constraint */\n\tfunction initState(id: string): ConstraintState {\n\t\tconst def = definitions[id];\n\t\tif (!def) {\n\t\t\tthrow new Error(`[Directive] Unknown constraint: ${id}`);\n\t\t}\n\n\t\tconst isAsync = isAsyncConstraint(id, def);\n\t\tif (isAsync) {\n\t\t\tasyncConstraintIds.add(id);\n\t\t}\n\n\t\tconst state: ConstraintState = {\n\t\t\tid,\n\t\t\tpriority: def.priority ?? 0,\n\t\t\tisAsync,\n\t\t\tlastResult: null,\n\t\t\tisEvaluating: false,\n\t\t\terror: null,\n\t\t\tlastResolvedAt: null,\n\t\t\tafter: def.after ?? [],\n\t\t};\n\n\t\tstates.set(id, state);\n\t\treturn state;\n\t}\n\n\t/** Get or create state for a constraint */\n\tfunction getState(id: string): ConstraintState {\n\t\treturn states.get(id) ?? initState(id);\n\t}\n\n\t/** Update dependency tracking for a constraint */\n\tfunction updateDependencies(id: string, newDeps: Set<string>): void {\n\t\tconst oldDeps = constraintDeps.get(id) ?? new Set();\n\n\t\t// Remove old dependencies\n\t\tfor (const dep of oldDeps) {\n\t\t\tconst constraints = factToConstraints.get(dep);\n\t\t\tconstraints?.delete(id);\n\t\t\tif (constraints && constraints.size === 0) {\n\t\t\t\tfactToConstraints.delete(dep);\n\t\t\t}\n\t\t}\n\n\t\t// Add new dependencies\n\t\tfor (const dep of newDeps) {\n\t\t\tif (!factToConstraints.has(dep)) {\n\t\t\t\tfactToConstraints.set(dep, new Set());\n\t\t\t}\n\t\t\tfactToConstraints.get(dep)!.add(id);\n\t\t}\n\n\t\tconstraintDeps.set(id, newDeps);\n\t}\n\n\t/** Evaluate a single sync constraint */\n\tfunction evaluateSync(id: string): boolean | Promise<boolean> {\n\t\tconst def = definitions[id];\n\t\tif (!def) return false;\n\n\t\tconst state = getState(id);\n\n\t\tstate.isEvaluating = true;\n\t\tstate.error = null;\n\n\t\ttry {\n\t\t\t// If explicit deps are provided, skip auto-tracking overhead\n\t\t\tlet result: boolean | Promise<boolean>;\n\t\t\tif (def.deps) {\n\t\t\t\tresult = def.when(facts);\n\t\t\t\tlatestWhenDeps.set(id, new Set(def.deps));\n\t\t\t} else {\n\t\t\t\t// Track dependencies during evaluation\n\t\t\t\tconst tracked = withTracking(() => def.when(facts));\n\t\t\t\tresult = tracked.value;\n\t\t\t\t// Save when deps — combined with require deps in processConstraintResult\n\t\t\t\tlatestWhenDeps.set(id, tracked.deps);\n\t\t\t}\n\n\t\t\t// Runtime async detection: if this was thought to be sync but returns a Promise\n\t\t\tif (result instanceof Promise) {\n\t\t\t\t// Mark as async for future evaluations\n\t\t\t\tasyncConstraintIds.add(id);\n\t\t\t\tstate.isAsync = true;\n\n\t\t\t\tif (process.env.NODE_ENV !== \"production\") {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t`[Directive] Constraint \"${id}\" returned a Promise but was not marked as async. ` +\n\t\t\t\t\t\t\t`Add \\`async: true\\` to the constraint definition to avoid this warning and improve performance.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Return the promise to be handled as async\n\t\t\t\treturn result.then((asyncResult) => {\n\t\t\t\t\tstate.lastResult = asyncResult;\n\t\t\t\t\tstate.isEvaluating = false;\n\t\t\t\t\tonEvaluate?.(id, asyncResult);\n\t\t\t\t\treturn asyncResult;\n\t\t\t\t}).catch((error) => {\n\t\t\t\t\tstate.error = error instanceof Error ? error : new Error(String(error));\n\t\t\t\t\tstate.lastResult = false;\n\t\t\t\t\tstate.isEvaluating = false;\n\t\t\t\t\tonError?.(id, error);\n\t\t\t\t\treturn false;\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tstate.lastResult = result;\n\t\t\tstate.isEvaluating = false;\n\t\t\tonEvaluate?.(id, result);\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tstate.error = error instanceof Error ? error : new Error(String(error));\n\t\t\tstate.lastResult = false;\n\t\t\tstate.isEvaluating = false;\n\t\t\tonError?.(id, error);\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/** Evaluate a single async constraint with timeout */\n\tasync function evaluateAsync(id: string): Promise<boolean> {\n\t\tconst def = definitions[id];\n\t\tif (!def) return false;\n\n\t\tconst state = getState(id);\n\t\tconst timeout = def.timeout ?? defaultTimeout;\n\n\t\tstate.isEvaluating = true;\n\t\tstate.error = null;\n\n\t\t// Register explicit deps before await (auto-tracking can't work across async boundaries)\n\t\tif (def.deps?.length) {\n\t\t\tconst depsSet = new Set(def.deps);\n\t\t\tupdateDependencies(id, depsSet);\n\t\t\tlatestWhenDeps.set(id, depsSet);\n\t\t}\n\n\t\ttry {\n\t\t\tconst resultPromise = def.when(facts) as Promise<boolean>;\n\n\t\t\t// Race against timeout (with proper cleanup)\n\t\t\tconst result = await withTimeout(\n\t\t\t\tresultPromise,\n\t\t\t\ttimeout,\n\t\t\t\t`Constraint \"${id}\" timed out after ${timeout}ms`,\n\t\t\t);\n\n\t\t\tstate.lastResult = result;\n\t\t\tstate.isEvaluating = false;\n\t\t\tonEvaluate?.(id, result);\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tstate.error = error instanceof Error ? error : new Error(String(error));\n\t\t\tstate.lastResult = false;\n\t\t\tstate.isEvaluating = false;\n\t\t\tonError?.(id, error);\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/** Max requirements per constraint before warning in dev mode */\n\tconst MAX_REQUIREMENTS_WARNING_THRESHOLD = 10;\n\n\t/**\n\t * Normalize a requirement output to an array of requirements.\n\t * - null/undefined → []\n\t * - single requirement → [requirement]\n\t * - array → filtered to remove null/undefined\n\t */\n\tfunction normalizeRequirements(output: RequirementOutput, constraintId?: string): Requirement[] {\n\t\tif (output === null || output === undefined) {\n\t\t\treturn [];\n\t\t}\n\t\tif (Array.isArray(output)) {\n\t\t\t// Filter out null/undefined from arrays\n\t\t\tconst filtered = output.filter((r): r is Requirement => r !== null && r !== undefined);\n\n\t\t\t// Warn in dev mode if constraint produces many requirements\n\t\t\tif (\n\t\t\t\tprocess.env.NODE_ENV !== \"production\" &&\n\t\t\t\tfiltered.length > MAX_REQUIREMENTS_WARNING_THRESHOLD &&\n\t\t\t\tconstraintId\n\t\t\t) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`[Directive] Constraint \"${constraintId}\" produced ${filtered.length} requirements. ` +\n\t\t\t\t\t\t`Consider splitting into multiple constraints for better performance.`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn filtered;\n\t\t}\n\t\treturn [output];\n\t}\n\n\t/** Get the requirements for a constraint, tracking dependencies if require is a function */\n\tfunction getRequirements(id: string): { requirements: Requirement[]; deps: Set<string> } {\n\t\tconst def = definitions[id];\n\t\tif (!def) return { requirements: [], deps: new Set() };\n\n\t\tconst requireDef = def.require;\n\t\tif (typeof requireDef === \"function\") {\n\t\t\t// Track dependencies when require is a function\n\t\t\tconst { value: output, deps } = withTracking(() => requireDef(facts));\n\t\t\tconst requirements = normalizeRequirements(output as RequirementOutput, id);\n\t\t\treturn { requirements, deps };\n\t\t}\n\n\t\tconst requirements = normalizeRequirements(requireDef as RequirementOutput, id);\n\t\treturn { requirements, deps: new Set() };\n\t}\n\n\t/** Merge additional dependencies into existing constraint deps */\n\tfunction mergeDependencies(id: string, additionalDeps: Set<string>): void {\n\t\tif (additionalDeps.size === 0) return;\n\n\t\tconst existingDeps = constraintDeps.get(id) ?? new Set();\n\t\tfor (const dep of additionalDeps) {\n\t\t\texistingDeps.add(dep);\n\t\t\t// Update reverse mapping\n\t\t\tif (!factToConstraints.has(dep)) {\n\t\t\t\tfactToConstraints.set(dep, new Set());\n\t\t\t}\n\t\t\tfactToConstraints.get(dep)!.add(id);\n\t\t}\n\t\tconstraintDeps.set(id, existingDeps);\n\t}\n\n\t// Initialize all constraint states and cache sorted order\n\tlet sortedConstraintIds: string[] | null = null;\n\n\t/**\n\t * Get constraint IDs sorted by:\n\t * 1. Priority (higher first)\n\t * 2. Topological order (dependencies before dependents) for same priority\n\t * This enables O(n) evaluation in the best case when priorities align with dependencies.\n\t *\n\t * Uses cached topologicalIndex for O(1) lookups during comparison.\n\t */\n\tfunction getSortedConstraintIds(): string[] {\n\t\tif (!sortedConstraintIds) {\n\t\t\tsortedConstraintIds = Object.keys(definitions).sort((a, b) => {\n\t\t\t\tconst stateA = getState(a);\n\t\t\t\tconst stateB = getState(b);\n\n\t\t\t\t// Primary sort: priority (higher first)\n\t\t\t\tconst priorityDiff = stateB.priority - stateA.priority;\n\t\t\t\tif (priorityDiff !== 0) return priorityDiff;\n\n\t\t\t\t// Secondary sort: topological order (dependencies first)\n\t\t\t\t// Uses cached topologicalIndex for O(1) lookups\n\t\t\t\tconst topoA = topologicalIndex.get(a) ?? 0;\n\t\t\t\tconst topoB = topologicalIndex.get(b) ?? 0;\n\t\t\t\treturn topoA - topoB;\n\t\t\t});\n\t\t}\n\t\treturn sortedConstraintIds;\n\t}\n\n\tfor (const id of Object.keys(definitions)) {\n\t\tinitState(id);\n\t}\n\n\t// Dev-mode: warn about async constraints without explicit deps\n\tif (process.env.NODE_ENV !== \"production\") {\n\t\tfor (const [id, def] of Object.entries(definitions)) {\n\t\t\tif (def.async && !def.deps) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`[Directive] Async constraint \"${id}\" has no \\`deps\\` declared. ` +\n\t\t\t\t\t`Auto-tracking cannot work across async boundaries. ` +\n\t\t\t\t\t`Add \\`deps: [\"key1\", \"key2\"]\\` to enable dependency tracking.`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Check if a constraint's `after` dependencies are satisfied.\n\t * A dependency is satisfied if:\n\t * - It has been resolved (resolver completed successfully)\n\t * - It didn't fire (when() returned false) - nothing to wait for\n\t * - It is disabled - can't fire\n\t * - It doesn't exist in this manager (cross-module, handled externally)\n\t */\n\tfunction areAfterDependenciesSatisfied(id: string): boolean {\n\t\tconst state = states.get(id);\n\t\tif (!state || state.after.length === 0) return true;\n\n\t\tfor (const depId of state.after) {\n\t\t\t// Skip deps that don't exist (cross-module, handled externally)\n\t\t\tif (!definitions[depId]) continue;\n\n\t\t\t// Skip disabled deps - they can't fire\n\t\t\tif (disabled.has(depId)) continue;\n\n\t\t\t// If dep didn't fire (when returned false), no need to wait\n\t\t\tif (noFireConstraints.has(depId)) continue;\n\n\t\t\t// If dep hasn't been resolved yet, we're blocked\n\t\t\tif (!resolvedConstraints.has(depId)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tconst manager: ConstraintsManager<S> = {\n\t\tasync evaluate(changedKeys?: Set<string>): Promise<RequirementWithId[]> {\n\t\t\tconst requirements = new RequirementSet();\n\n\t\t\t// Note: resolvedConstraints persists across reconcile cycles intentionally.\n\t\t\t// `after` ordering means \"wait until dependency's resolver has completed\",\n\t\t\t// and that completion happens in a different cycle than the evaluation.\n\t\t\t// noFireConstraints is re-populated during each evaluation pass.\n\t\t\tnoFireConstraints.clear();\n\n\t\t\t// Get all enabled constraints (use cached sort order)\n\t\t\tconst allConstraintIds = getSortedConstraintIds().filter((id) => !disabled.has(id));\n\n\t\t\t// Determine which constraints to evaluate\n\t\t\tlet constraintsToEvaluate: string[];\n\n\t\t\tif (!hasEvaluated || !changedKeys || changedKeys.size === 0) {\n\t\t\t\t// First evaluation or no specific changes: evaluate all\n\t\t\t\tconstraintsToEvaluate = allConstraintIds;\n\t\t\t\thasEvaluated = true;\n\t\t\t} else {\n\t\t\t\t// Incremental: only evaluate constraints affected by changed keys\n\t\t\t\tconst affected = new Set<string>();\n\t\t\t\tfor (const key of changedKeys) {\n\t\t\t\t\tconst dependentConstraints = factToConstraints.get(key);\n\t\t\t\t\tif (dependentConstraints) {\n\t\t\t\t\t\tfor (const id of dependentConstraints) {\n\t\t\t\t\t\t\tif (!disabled.has(id)) {\n\t\t\t\t\t\t\t\taffected.add(id);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Also include any dirty constraints\n\t\t\t\tfor (const id of dirtyConstraints) {\n\t\t\t\t\tif (!disabled.has(id)) {\n\t\t\t\t\t\taffected.add(id);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tdirtyConstraints.clear();\n\t\t\t\tconstraintsToEvaluate = [...affected];\n\n\t\t\t\t// For constraints NOT being re-evaluated, add their last requirements\n\t\t\t\tfor (const id of allConstraintIds) {\n\t\t\t\t\tif (!affected.has(id)) {\n\t\t\t\t\t\tconst lastReqs = lastRequirements.get(id);\n\t\t\t\t\t\tif (lastReqs) {\n\t\t\t\t\t\t\tfor (const req of lastReqs) {\n\t\t\t\t\t\t\t\trequirements.add(req);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Process a constraint result: handle requirements and track no-fire state\n\t\t\t */\n\t\t\tfunction processConstraintResult(id: string, active: boolean): void {\n\t\t\t\tif (disabled.has(id)) return;\n\n\t\t\t\tconst whenDeps = latestWhenDeps.get(id);\n\n\t\t\t\tif (!active) {\n\t\t\t\t\t// when() returned false — update with just when deps (no require deps needed)\n\t\t\t\t\tif (whenDeps !== undefined) {\n\t\t\t\t\t\tupdateDependencies(id, whenDeps);\n\t\t\t\t\t}\n\t\t\t\t\tnoFireConstraints.add(id);\n\t\t\t\t\tlastRequirements.set(id, []);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Remove from no-fire tracking since it fired\n\t\t\t\tnoFireConstraints.delete(id);\n\n\t\t\t\tlet reqs: Requirement[];\n\t\t\t\tlet requireDeps: Set<string>;\n\t\t\t\ttry {\n\t\t\t\t\tconst result = getRequirements(id);\n\t\t\t\t\treqs = result.requirements;\n\t\t\t\t\trequireDeps = result.deps;\n\t\t\t\t} catch (error) {\n\t\t\t\t\tonError?.(id, error);\n\t\t\t\t\tif (whenDeps !== undefined) {\n\t\t\t\t\t\tupdateDependencies(id, whenDeps);\n\t\t\t\t\t}\n\t\t\t\t\tlastRequirements.set(id, []);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// Combine when() + require() deps atomically to prevent\n\t\t\t\t// require deps from being temporarily lost between updates\n\t\t\t\tif (whenDeps !== undefined) {\n\t\t\t\t\tconst combinedDeps = new Set(whenDeps);\n\t\t\t\t\tfor (const dep of requireDeps) {\n\t\t\t\t\t\tcombinedDeps.add(dep);\n\t\t\t\t\t}\n\t\t\t\t\tupdateDependencies(id, combinedDeps);\n\t\t\t\t} else {\n\t\t\t\t\t// Async constraint (no when deps tracked) — merge additively\n\t\t\t\t\tmergeDependencies(id, requireDeps);\n\t\t\t\t}\n\t\t\t\tif (reqs.length > 0) {\n\t\t\t\t\tconst keyFn = requirementKeys[id];\n\t\t\t\t\tconst reqsWithId = reqs.map((req) => createRequirementWithId(req, id, keyFn));\n\t\t\t\t\tfor (const reqWithId of reqsWithId) {\n\t\t\t\t\t\trequirements.add(reqWithId);\n\t\t\t\t\t}\n\t\t\t\t\tlastRequirements.set(id, reqsWithId);\n\t\t\t\t} else {\n\t\t\t\t\tlastRequirements.set(id, []);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Evaluate constraints, respecting `after` dependencies.\n\t\t\t * Returns list of constraints that are still blocked after this pass.\n\t\t\t */\n\t\t\tasync function evaluateConstraintBatch(constraintIds: string[]): Promise<string[]> {\n\t\t\t\t// Filter out constraints blocked by `after` dependencies\n\t\t\t\tconst blockedConstraints: string[] = [];\n\t\t\t\tconst readyToEvaluate: string[] = [];\n\n\t\t\t\tfor (const id of constraintIds) {\n\t\t\t\t\tif (areAfterDependenciesSatisfied(id)) {\n\t\t\t\t\t\treadyToEvaluate.push(id);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tblockedConstraints.push(id);\n\t\t\t\t\t\t// Keep last requirements for blocked constraints\n\t\t\t\t\t\tconst lastReqs = lastRequirements.get(id);\n\t\t\t\t\t\tif (lastReqs) {\n\t\t\t\t\t\t\tfor (const req of lastReqs) {\n\t\t\t\t\t\t\t\trequirements.add(req);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (readyToEvaluate.length === 0) {\n\t\t\t\t\treturn blockedConstraints;\n\t\t\t\t}\n\n\t\t\t\t// Separate sync and async constraints from ready-to-evaluate\n\t\t\t\tconst syncConstraints: string[] = [];\n\t\t\t\tconst asyncConstraints: string[] = [];\n\n\t\t\t\tfor (const id of readyToEvaluate) {\n\t\t\t\t\tconst state = getState(id);\n\t\t\t\t\tif (state.isAsync) {\n\t\t\t\t\t\tasyncConstraints.push(id);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsyncConstraints.push(id);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Evaluate sync constraints first (they're fast)\n\t\t\t\t// Some may turn out to be async at runtime - collect those for async evaluation\n\t\t\t\tconst unexpectedAsync: Array<{ id: string; promise: Promise<boolean> }> = [];\n\n\t\t\t\tfor (const id of syncConstraints) {\n\t\t\t\t\tconst result = evaluateSync(id);\n\n\t\t\t\t\t// Handle runtime-detected async constraints\n\t\t\t\t\tif (result instanceof Promise) {\n\t\t\t\t\t\tunexpectedAsync.push({ id, promise: result });\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tprocessConstraintResult(id, result);\n\t\t\t\t}\n\n\t\t\t\t// Handle any sync constraints that turned out to be async\n\t\t\t\tif (unexpectedAsync.length > 0) {\n\t\t\t\t\tconst asyncResults = await Promise.all(\n\t\t\t\t\t\tunexpectedAsync.map(async ({ id, promise }) => ({\n\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\tactive: await promise,\n\t\t\t\t\t\t})),\n\t\t\t\t\t);\n\n\t\t\t\t\tfor (const { id, active } of asyncResults) {\n\t\t\t\t\t\tprocessConstraintResult(id, active);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Evaluate async constraints in parallel\n\t\t\t\tif (asyncConstraints.length > 0) {\n\t\t\t\t\tconst asyncResults = await Promise.all(\n\t\t\t\t\t\tasyncConstraints.map(async (id) => ({\n\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\tactive: await evaluateAsync(id),\n\t\t\t\t\t\t})),\n\t\t\t\t\t);\n\n\t\t\t\t\tfor (const { id, active } of asyncResults) {\n\t\t\t\t\t\tprocessConstraintResult(id, active);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn blockedConstraints;\n\t\t\t}\n\n\t\t\t// Evaluate constraints in passes until no blocked constraints become unblocked\n\t\t\tlet remainingToEvaluate = constraintsToEvaluate;\n\t\t\tlet maxPasses = constraintsToEvaluate.length + 1; // Prevent infinite loops\n\n\t\t\twhile (remainingToEvaluate.length > 0 && maxPasses > 0) {\n\t\t\t\tconst previousRemaining = remainingToEvaluate.length;\n\t\t\t\tremainingToEvaluate = await evaluateConstraintBatch(remainingToEvaluate);\n\n\t\t\t\t// If no progress was made (all still blocked), break\n\t\t\t\tif (remainingToEvaluate.length === previousRemaining) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tmaxPasses--;\n\t\t\t}\n\n\t\t\treturn requirements.all();\n\t\t},\n\n\t\tgetState(id: string): ConstraintState | undefined {\n\t\t\treturn states.get(id);\n\t\t},\n\n\t\tgetAllStates(): ConstraintState[] {\n\t\t\treturn [...states.values()];\n\t\t},\n\n\t\tdisable(id: string): void {\n\t\t\tdisabled.add(id);\n\t\t\t// Invalidate cache when constraints change\n\t\t\tsortedConstraintIds = null;\n\t\t\t// Mark as dirty so it gets removed from requirements on next evaluate\n\t\t\tlastRequirements.delete(id);\n\n\t\t\t// Clean up dependency maps for disabled constraint\n\t\t\tconst deps = constraintDeps.get(id);\n\t\t\tif (deps) {\n\t\t\t\tfor (const dep of deps) {\n\t\t\t\t\tconst constraints = factToConstraints.get(dep);\n\t\t\t\t\tif (constraints) {\n\t\t\t\t\t\tconstraints.delete(id);\n\t\t\t\t\t\tif (constraints.size === 0) {\n\t\t\t\t\t\t\tfactToConstraints.delete(dep);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconstraintDeps.delete(id);\n\t\t\t}\n\t\t\tlatestWhenDeps.delete(id);\n\t\t},\n\n\t\tenable(id: string): void {\n\t\t\tdisabled.delete(id);\n\t\t\t// Invalidate cache when constraints change\n\t\t\tsortedConstraintIds = null;\n\t\t\t// Mark as dirty so it gets evaluated on next cycle\n\t\t\tdirtyConstraints.add(id);\n\t\t},\n\n\t\tinvalidate(factKey: string): void {\n\t\t\t// Mark all constraints that depend on this fact as dirty\n\t\t\tconst dependentConstraints = factToConstraints.get(factKey);\n\t\t\tif (dependentConstraints) {\n\t\t\t\tfor (const id of dependentConstraints) {\n\t\t\t\t\tdirtyConstraints.add(id);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tmarkResolved(constraintId: string): void {\n\t\t\tresolvedConstraints.add(constraintId);\n\t\t\tconst state = states.get(constraintId);\n\t\t\tif (state) {\n\t\t\t\tstate.lastResolvedAt = Date.now();\n\t\t\t}\n\n\t\t\t// Mark all constraints that depend on this one (via `after`) as dirty\n\t\t\t// so they get re-evaluated on the next reconcile\n\t\t\t// Uses reverse dependency map for O(1) lookup instead of O(n*m) iteration\n\t\t\tconst dependents = dependsOnMe.get(constraintId);\n\t\t\tif (dependents) {\n\t\t\t\tfor (const id of dependents) {\n\t\t\t\t\tdirtyConstraints.add(id);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tisResolved(constraintId: string): boolean {\n\t\t\treturn resolvedConstraints.has(constraintId);\n\t\t},\n\n\t\tregisterDefinitions(newDefs: ConstraintsDef<Schema>): void {\n\t\t\tfor (const [key, def] of Object.entries(newDefs)) {\n\t\t\t\t(definitions as Record<string, unknown>)[key] = def;\n\t\t\t\tinitState(key);\n\t\t\t\tdirtyConstraints.add(key);\n\t\t\t}\n\t\t\t// Invalidate cached sort order\n\t\t\tsortedConstraintIds = null;\n\t\t\t// Rebuild topological order and reverse dependency map\n\t\t\t// so new `after` deps are validated for cycles and indexed\n\t\t\tdetectCyclesAndComputeTopoOrder();\n\t\t\tbuildReverseDependencyMap();\n\t\t},\n\t};\n\n\treturn manager;\n}\n","/**\n * Derivations - Auto-tracked computed values with composition\n *\n * Features:\n * - Automatic dependency tracking (no manual deps arrays)\n * - Memoization with smart invalidation\n * - Derivation composition (derivations can depend on other derivations)\n * - Circular dependency detection\n * - Lazy evaluation\n */\n\nimport { trackAccess, withTracking } from \"./tracking.js\";\nimport type {\n\tDerivationsDef,\n\tDerivationState,\n\tDerivedValues,\n\tFacts,\n\tFactsStore,\n\tSchema,\n} from \"./types.js\";\n\n// ============================================================================\n// Derivations Manager\n// ============================================================================\n\nexport interface DerivationsManager<S extends Schema, D extends DerivationsDef<S>> {\n\t/** Get a derived value (computes if stale) */\n\tget<K extends keyof D>(id: K): ReturnType<D[K]>;\n\t/** Check if a derivation is stale */\n\tisStale(id: keyof D): boolean;\n\t/** Invalidate derivations that depend on a fact key */\n\tinvalidate(factKey: string): void;\n\t/** Invalidate derivations for multiple fact keys, notifying listeners once at the end */\n\tinvalidateMany(factKeys: Iterable<string>): void;\n\t/** Invalidate all derivations */\n\tinvalidateAll(): void;\n\t/** Subscribe to derivation changes */\n\tsubscribe(ids: Array<keyof D>, listener: () => void): () => void;\n\t/** Get the proxy for composition */\n\tgetProxy(): DerivedValues<S, D>;\n\t/** Get dependencies for a derivation */\n\tgetDependencies(id: keyof D): Set<string>;\n\t/** Register new derivation definitions (for dynamic module registration) */\n\tregisterDefinitions(newDefs: DerivationsDef<S>): void;\n}\n\n/** Options for creating a derivations manager */\nexport interface CreateDerivationsOptions<S extends Schema, D extends DerivationsDef<S>> {\n\tdefinitions: D;\n\tfacts: Facts<S>;\n\tstore: FactsStore<S>;\n\t/** Callback when a derivation is computed */\n\tonCompute?: (id: string, value: unknown, deps: string[]) => void;\n\t/** Callback when a derivation is invalidated */\n\tonInvalidate?: (id: string) => void;\n\t/** Callback when a derivation errors */\n\tonError?: (id: string, error: unknown) => void;\n}\n\n/**\n * Create a manager for lazily-evaluated, auto-tracked derived values.\n *\n * Derivations are memoized computations that automatically track which facts\n * they read. When a tracked fact changes, the derivation is invalidated and\n * recomputed on next access. Derivations can depend on other derivations\n * (composition), and circular dependencies are detected at compute time.\n *\n * Notifications are deferred during invalidation so listeners always see\n * consistent state across multiple simultaneous fact changes.\n *\n * @param options - Derivation definitions, facts proxy, store, and optional lifecycle callbacks\n * @returns A `DerivationsManager` with get/invalidate/subscribe/getProxy methods\n */\nexport function createDerivationsManager<S extends Schema, D extends DerivationsDef<S>>(\n\toptions: CreateDerivationsOptions<S, D>,\n): DerivationsManager<S, D> {\n\tconst { definitions, facts, store: _store, onCompute, onInvalidate, onError } = options;\n\t// Note: _store is kept for API compatibility but invalidation is handled by the engine calling invalidate()\n\n\t// Internal state for each derivation\n\tconst states = new Map<string, DerivationState<unknown>>();\n\tconst listeners = new Map<string, Set<() => void>>();\n\n\t// Track which derivations depend on which fact keys\n\tconst factToDerivedDeps = new Map<string, Set<string>>();\n\t// Track which derivations depend on which other derivations\n\tconst derivedToDerivedDeps = new Map<string, Set<string>>();\n\n\t// Prototype pollution guard (same pattern as engine.ts, facts.ts, system.ts)\n\tconst BLOCKED_PROPS = new Set([\"__proto__\", \"constructor\", \"prototype\"]);\n\n\t// Deferred notification: during invalidation, collect IDs to notify.\n\t// Listeners fire AFTER all invalidations complete so they see consistent state.\n\tlet invalidationDepth = 0;\n\tconst pendingNotifications = new Set<string>();\n\tlet isFlushing = false;\n\tconst MAX_FLUSH_ITERATIONS = 100;\n\n\t// The proxy for composition (derivations accessing other derivations)\n\tlet derivedProxy: DerivedValues<S, D>;\n\n\t/** Initialize state for a derivation */\n\tfunction initState(id: string): DerivationState<unknown> {\n\t\tconst def = definitions[id as keyof D];\n\t\tif (!def) {\n\t\t\tthrow new Error(`[Directive] Unknown derivation: ${id}`);\n\t\t}\n\n\t\tconst state: DerivationState<unknown> = {\n\t\t\tid,\n\t\t\tcompute: () => computeDerivation(id),\n\t\t\tcachedValue: undefined,\n\t\t\tdependencies: new Set(),\n\t\t\tisStale: true,\n\t\t\tisComputing: false,\n\t\t};\n\n\t\tstates.set(id, state);\n\t\treturn state;\n\t}\n\n\t/** Get or create state for a derivation */\n\tfunction getState(id: string): DerivationState<unknown> {\n\t\treturn states.get(id) ?? initState(id);\n\t}\n\n\t/** Compute a derivation and track its dependencies */\n\tfunction computeDerivation(id: string): unknown {\n\t\tconst state = getState(id);\n\t\tconst def = definitions[id as keyof D];\n\n\t\tif (!def) {\n\t\t\tthrow new Error(`[Directive] Unknown derivation: ${id}`);\n\t\t}\n\n\t\t// Circular dependency detection\n\t\tif (state.isComputing) {\n\t\t\tthrow new Error(`[Directive] Circular dependency detected in derivation: ${id}`);\n\t\t}\n\n\t\tstate.isComputing = true;\n\n\t\ttry {\n\t\t\t// Compute with tracking\n\t\t\tconst { value, deps } = withTracking(() => def(facts, derivedProxy));\n\n\t\t\t// Update state\n\t\t\tstate.cachedValue = value;\n\t\t\tstate.isStale = false;\n\n\t\t\t// Update dependency tracking\n\t\t\tupdateDependencies(id, deps);\n\n\t\t\t// Notify callback\n\t\t\tonCompute?.(id, value, [...deps]);\n\n\t\t\treturn value;\n\t\t} catch (error) {\n\t\t\tonError?.(id, error);\n\t\t\tthrow error;\n\t\t} finally {\n\t\t\tstate.isComputing = false;\n\t\t}\n\t}\n\n\t/** Update dependency tracking for a derivation */\n\tfunction updateDependencies(id: string, newDeps: Set<string>): void {\n\t\tconst state = getState(id);\n\t\tconst oldDeps = state.dependencies;\n\n\t\t// Remove old fact dependencies\n\t\tfor (const dep of oldDeps) {\n\t\t\t// Check if it's a fact key or a derived key\n\t\t\tif (states.has(dep)) {\n\t\t\t\tconst depSet = derivedToDerivedDeps.get(dep);\n\t\t\t\tdepSet?.delete(id);\n\t\t\t\t// Clean up empty Sets to prevent memory leaks\n\t\t\t\tif (depSet && depSet.size === 0) {\n\t\t\t\t\tderivedToDerivedDeps.delete(dep);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst depSet = factToDerivedDeps.get(dep);\n\t\t\t\tdepSet?.delete(id);\n\t\t\t\t// Clean up empty Sets to prevent memory leaks\n\t\t\t\tif (depSet && depSet.size === 0) {\n\t\t\t\t\tfactToDerivedDeps.delete(dep);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add new dependencies\n\t\tfor (const dep of newDeps) {\n\t\t\t// Check if it's a derivation or a fact\n\t\t\tif (definitions[dep as keyof D]) {\n\t\t\t\t// It's a derivation-to-derivation dependency\n\t\t\t\tif (!derivedToDerivedDeps.has(dep)) {\n\t\t\t\t\tderivedToDerivedDeps.set(dep, new Set());\n\t\t\t\t}\n\t\t\t\tderivedToDerivedDeps.get(dep)!.add(id);\n\t\t\t} else {\n\t\t\t\t// It's a fact dependency\n\t\t\t\tif (!factToDerivedDeps.has(dep)) {\n\t\t\t\t\tfactToDerivedDeps.set(dep, new Set());\n\t\t\t\t}\n\t\t\t\tfactToDerivedDeps.get(dep)!.add(id);\n\t\t\t}\n\t\t}\n\n\t\tstate.dependencies = newDeps;\n\t}\n\n\t/** Flush deferred notifications after all invalidations complete */\n\tfunction flushNotifications(): void {\n\t\tif (invalidationDepth > 0 || isFlushing) return;\n\n\t\tisFlushing = true;\n\t\ttry {\n\t\t\t// Loop until no more pending — listeners may trigger new invalidations\n\t\t\t// that add to pendingNotifications via re-entrant invalidate() calls.\n\t\t\tlet iterations = 0;\n\t\t\twhile (pendingNotifications.size > 0) {\n\t\t\t\tif (++iterations > MAX_FLUSH_ITERATIONS) {\n\t\t\t\t\tconst remaining = [...pendingNotifications];\n\t\t\t\t\tpendingNotifications.clear();\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`[Directive] Infinite derivation notification loop detected after ${MAX_FLUSH_ITERATIONS} iterations. ` +\n\t\t\t\t\t\t\t`Remaining: ${remaining.join(\", \")}. ` +\n\t\t\t\t\t\t\t`This usually means a derivation listener is mutating facts that re-trigger the same derivation.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst ids = [...pendingNotifications];\n\t\t\t\tpendingNotifications.clear();\n\n\t\t\t\tfor (const id of ids) {\n\t\t\t\t\tlisteners.get(id)?.forEach((listener) => listener());\n\t\t\t\t}\n\t\t\t}\n\t\t} finally {\n\t\t\tisFlushing = false;\n\t\t}\n\t}\n\n\t/** Invalidate a derivation and its dependents */\n\tfunction invalidateDerivation(id: string, visited = new Set<string>()): void {\n\t\tif (visited.has(id)) return;\n\t\tvisited.add(id);\n\n\t\tconst state = states.get(id);\n\t\tif (!state || state.isStale) return;\n\n\t\tstate.isStale = true;\n\t\tonInvalidate?.(id);\n\n\t\t// Defer listener notification until all invalidations complete.\n\t\t// This prevents listeners from observing partially-stale state and\n\t\t// avoids infinite loops from Set mutation during iteration (listeners\n\t\t// recompute derivations → updateDependencies → modify dep Sets).\n\t\tpendingNotifications.add(id);\n\n\t\t// Invalidate derivations that depend on this one\n\t\tconst dependents = derivedToDerivedDeps.get(id);\n\t\tif (dependents) {\n\t\t\tfor (const dependent of dependents) {\n\t\t\t\tinvalidateDerivation(dependent, visited);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Create the proxy for composition\n\tderivedProxy = new Proxy({} as DerivedValues<S, D>, {\n\t\tget(_, prop: string | symbol) {\n\t\t\tif (typeof prop === \"symbol\") return undefined;\n\t\t\tif (BLOCKED_PROPS.has(prop)) return undefined;\n\n\t\t\t// Track this derivation access so the consuming derivation\n\t\t\t// records a dependency on it (enables composition invalidation)\n\t\t\ttrackAccess(prop);\n\n\t\t\tconst state = getState(prop);\n\n\t\t\t// Recompute if stale\n\t\t\tif (state.isStale) {\n\t\t\t\tcomputeDerivation(prop);\n\t\t\t}\n\n\t\t\treturn state.cachedValue;\n\t\t},\n\t});\n\n\t// Note: Fact change invalidation is handled by the engine calling invalidate()\n\n\tconst manager: DerivationsManager<S, D> = {\n\t\tget<K extends keyof D>(id: K): ReturnType<D[K]> {\n\t\t\tconst state = getState(id as string);\n\n\t\t\tif (state.isStale) {\n\t\t\t\tcomputeDerivation(id as string);\n\t\t\t}\n\n\t\t\treturn state.cachedValue as ReturnType<D[K]>;\n\t\t},\n\n\t\tisStale(id: keyof D): boolean {\n\t\t\tconst state = states.get(id as string);\n\t\t\treturn state?.isStale ?? true;\n\t\t},\n\n\t\tinvalidate(factKey: string): void {\n\t\t\tconst dependents = factToDerivedDeps.get(factKey);\n\t\t\tif (!dependents) return;\n\n\t\t\tinvalidationDepth++;\n\t\t\ttry {\n\t\t\t\tfor (const id of dependents) {\n\t\t\t\t\tinvalidateDerivation(id);\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tinvalidationDepth--;\n\t\t\t\tflushNotifications();\n\t\t\t}\n\t\t},\n\n\t\tinvalidateMany(factKeys: Iterable<string>): void {\n\t\t\tinvalidationDepth++;\n\t\t\ttry {\n\t\t\t\tfor (const factKey of factKeys) {\n\t\t\t\t\tconst dependents = factToDerivedDeps.get(factKey);\n\t\t\t\t\tif (!dependents) continue;\n\t\t\t\t\tfor (const id of dependents) {\n\t\t\t\t\t\tinvalidateDerivation(id);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tinvalidationDepth--;\n\t\t\t\tflushNotifications();\n\t\t\t}\n\t\t},\n\n\t\tinvalidateAll(): void {\n\t\t\tinvalidationDepth++;\n\t\t\ttry {\n\t\t\t\tfor (const state of states.values()) {\n\t\t\t\t\tif (!state.isStale) {\n\t\t\t\t\t\tstate.isStale = true;\n\t\t\t\t\t\tpendingNotifications.add(state.id);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tinvalidationDepth--;\n\t\t\t\tflushNotifications();\n\t\t\t}\n\t\t},\n\n\t\tsubscribe(ids: Array<keyof D>, listener: () => void): () => void {\n\t\t\tfor (const id of ids) {\n\t\t\t\tconst idStr = id as string;\n\t\t\t\tif (!listeners.has(idStr)) {\n\t\t\t\t\tlisteners.set(idStr, new Set());\n\t\t\t\t}\n\t\t\t\tlisteners.get(idStr)!.add(listener);\n\t\t\t}\n\n\t\t\treturn () => {\n\t\t\t\tfor (const id of ids) {\n\t\t\t\t\tconst idStr = id as string;\n\t\t\t\t\tconst listenerSet = listeners.get(idStr);\n\t\t\t\t\tlistenerSet?.delete(listener);\n\t\t\t\t\t// Clean up empty Sets to prevent memory leaks\n\t\t\t\t\tif (listenerSet && listenerSet.size === 0) {\n\t\t\t\t\t\tlisteners.delete(idStr);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t},\n\n\t\tgetProxy(): DerivedValues<S, D> {\n\t\t\treturn derivedProxy;\n\t\t},\n\n\t\tgetDependencies(id: keyof D): Set<string> {\n\t\t\treturn getState(id as string).dependencies;\n\t\t},\n\n\t\tregisterDefinitions(newDefs: DerivationsDef<S>): void {\n\t\t\tfor (const [key, fn] of Object.entries(newDefs)) {\n\t\t\t\t(definitions as Record<string, unknown>)[key] = fn;\n\t\t\t\tinitState(key);\n\t\t\t}\n\t\t},\n\t};\n\n\treturn manager;\n}\n","/**\n * Effects - Fire-and-forget side effects\n *\n * Features:\n * - Separate from requirement resolution\n * - Error isolation (never breaks reconciliation)\n * - Optional explicit dependencies for optimization\n * - Runs after facts stabilize\n *\n * IMPORTANT: Auto-tracking limitations\n * ------------------------------------\n * When using auto-tracking (no explicit `deps`), only SYNCHRONOUS fact accesses\n * are tracked. If your effect reads facts after an `await`, those reads are NOT\n * tracked and won't trigger the effect on future changes.\n *\n * For async effects, always use explicit `deps`:\n * @example\n * ```typescript\n * effects: {\n * // BAD: fetchData is async, facts.userId read after await won't be tracked\n * badEffect: {\n * run: async (facts) => {\n * await someAsyncOp();\n * console.log(facts.userId); // NOT tracked!\n * },\n * },\n * // GOOD: explicit deps for async effects\n * goodEffect: {\n * deps: [\"userId\"],\n * run: async (facts) => {\n * await someAsyncOp();\n * console.log(facts.userId); // Works because we declared the dep\n * },\n * },\n * }\n * ```\n */\n\nimport { withTracking } from \"./tracking.js\";\nimport type {\n\tEffectsDef,\n\tFacts,\n\tFactsSnapshot,\n\tFactsStore,\n\tSchema,\n} from \"./types.js\";\n\n// ============================================================================\n// Effects Manager\n// ============================================================================\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport interface EffectsManager<_S extends Schema = Schema> {\n\t/** Run all effects that should trigger based on changes */\n\trunEffects(changedKeys: Set<string>): Promise<void>;\n\t/** Run all effects unconditionally */\n\trunAll(): Promise<void>;\n\t/** Disable an effect */\n\tdisable(id: string): void;\n\t/** Enable an effect */\n\tenable(id: string): void;\n\t/** Check if an effect is enabled */\n\tisEnabled(id: string): boolean;\n\t/** Run all stored cleanup functions (called on system stop/destroy) */\n\tcleanupAll(): void;\n\t/** Register new effect definitions (for dynamic module registration) */\n\tregisterDefinitions(newDefs: EffectsDef<Schema>): void;\n}\n\n/** Internal effect state */\ninterface EffectState {\n\tid: string;\n\tenabled: boolean;\n\thasExplicitDeps: boolean; // true = user-provided deps (fixed), false = auto-tracked (re-track every run)\n\tdependencies: Set<string> | null; // null = not yet tracked\n\tlastSnapshot: FactsSnapshot<Schema> | null;\n\tcleanup: (() => void) | null; // cleanup function returned by last run()\n}\n\n/** Options for creating an effects manager */\nexport interface CreateEffectsOptions<S extends Schema> {\n\tdefinitions: EffectsDef<S>;\n\tfacts: Facts<S>;\n\tstore: FactsStore<S>;\n\t/** Callback when an effect runs */\n\tonRun?: (id: string) => void;\n\t/** Callback when an effect errors */\n\tonError?: (id: string, error: unknown) => void;\n}\n\n/**\n * Create a manager for fire-and-forget side effects that run after facts\n * stabilize.\n *\n * Effects support auto-tracked dependencies (re-tracked on every run to\n * capture conditional reads) or explicit `deps` arrays. Each effect can\n * return a cleanup function that runs before the next execution or on\n * system stop. Errors in effects are isolated and never break the\n * reconciliation loop.\n *\n * @param options - Effect definitions, facts proxy, store, and optional lifecycle callbacks\n * @returns An `EffectsManager` with runEffects/runAll/enable/disable/cleanupAll methods\n */\nexport function createEffectsManager<S extends Schema>(\n\toptions: CreateEffectsOptions<S>,\n): EffectsManager<S> {\n\tconst { definitions, facts, store, onRun, onError } = options;\n\n\t// Internal state for each effect\n\tconst states = new Map<string, EffectState>();\n\n\t// Previous facts snapshot for comparison\n\tlet previousSnapshot: FactsSnapshot<Schema> | null = null;\n\n\t// Track whether cleanupAll has been called (system stopped/destroyed).\n\t// If an async effect resolves after stop, its cleanup is invoked immediately.\n\tlet stopped = false;\n\n\t/** Initialize state for an effect */\n\tfunction initState(id: string): EffectState {\n\t\tconst def = definitions[id];\n\t\tif (!def) {\n\t\t\tthrow new Error(`[Directive] Unknown effect: ${id}`);\n\t\t}\n\n\t\tconst state: EffectState = {\n\t\t\tid,\n\t\t\tenabled: true,\n\t\t\thasExplicitDeps: !!def.deps,\n\t\t\tdependencies: def.deps ? new Set(def.deps as string[]) : null,\n\t\t\tlastSnapshot: null,\n\t\t\tcleanup: null,\n\t\t};\n\n\t\tstates.set(id, state);\n\t\treturn state;\n\t}\n\n\t/** Get or create state for an effect */\n\tfunction getState(id: string): EffectState {\n\t\treturn states.get(id) ?? initState(id);\n\t}\n\n\t/** Create a snapshot of current facts */\n\tfunction createSnapshot(): FactsSnapshot<Schema> {\n\t\treturn facts.$snapshot() as FactsSnapshot<Schema>;\n\t}\n\n\t/** Check if an effect should run based on changed keys */\n\tfunction shouldRun(id: string, changedKeys: Set<string>): boolean {\n\t\tconst state = getState(id);\n\t\tif (!state.enabled) return false;\n\n\t\t// If effect has tracked deps (explicit or auto-tracked), check if any changed\n\t\tif (state.dependencies) {\n\t\t\tfor (const dep of state.dependencies) {\n\t\t\t\tif (changedKeys.has(dep)) return true;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\n\t\t// No deps yet (first run or auto-tracked with no reads) = run on any change\n\t\treturn true;\n\t}\n\n\t/** Run cleanup for a single effect (safe — catches errors) */\n\tfunction runCleanup(state: EffectState): void {\n\t\tif (state.cleanup) {\n\t\t\ttry {\n\t\t\t\tstate.cleanup();\n\t\t\t} catch (error) {\n\t\t\t\tonError?.(state.id, error);\n\t\t\t\tconsole.error(`[Directive] Effect \"${state.id}\" cleanup threw an error:`, error);\n\t\t\t}\n\t\t\tstate.cleanup = null;\n\t\t}\n\t}\n\n\t/** Store a cleanup function if the effect returned one */\n\tfunction storeCleanup(state: EffectState, result: unknown): void {\n\t\tif (typeof result === \"function\") {\n\t\t\tif (stopped) {\n\t\t\t\t// System already stopped — invoke cleanup immediately so it's not lost\n\t\t\t\ttry {\n\t\t\t\t\t(result as () => void)();\n\t\t\t\t} catch (error) {\n\t\t\t\t\tonError?.(state.id, error);\n\t\t\t\t\tconsole.error(`[Directive] Effect \"${state.id}\" cleanup threw an error:`, error);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tstate.cleanup = result as () => void;\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Run a single effect */\n\tasync function runEffect(id: string): Promise<void> {\n\t\tconst state = getState(id);\n\t\tconst def = definitions[id];\n\n\t\tif (!state.enabled || !def) return;\n\n\t\t// Run previous cleanup before re-running\n\t\trunCleanup(state);\n\n\t\tonRun?.(id);\n\n\t\ttry {\n\t\t\tif (!state.hasExplicitDeps) {\n\t\t\t\t// Auto-tracked: re-track dependencies on EVERY run so conditional\n\t\t\t\t// reads are picked up (fixes frozen deps after first run)\n\t\t\t\tlet trackedDeps: Set<string> | null = null;\n\t\t\t\tlet effectPromise: unknown;\n\t\t\t\tconst trackingResult = withTracking(() => {\n\t\t\t\t\tstore.batch(() => {\n\t\t\t\t\t\teffectPromise = def.run(facts, previousSnapshot as FactsSnapshot<S> | null);\n\t\t\t\t\t});\n\t\t\t\t\treturn effectPromise;\n\t\t\t\t});\n\t\t\t\ttrackedDeps = trackingResult.deps;\n\n\t\t\t\t// If the effect is async, wait for it and capture cleanup\n\t\t\t\tlet result = trackingResult.value;\n\t\t\t\tif (result instanceof Promise) {\n\t\t\t\t\tresult = await result;\n\t\t\t\t}\n\t\t\t\tstoreCleanup(state, result);\n\n\t\t\t\t// Update tracked dependencies (always replace to catch new conditional reads)\n\t\t\t\tstate.dependencies = trackedDeps.size > 0 ? trackedDeps : null;\n\t\t\t} else {\n\t\t\t\t// Has explicit deps, batch synchronous mutations and run\n\t\t\t\tlet effectPromise: unknown;\n\t\t\t\tstore.batch(() => {\n\t\t\t\t\teffectPromise = def.run(facts, previousSnapshot as FactsSnapshot<S> | null);\n\t\t\t\t});\n\t\t\t\tif (effectPromise instanceof Promise) {\n\t\t\t\t\tconst result = await effectPromise;\n\t\t\t\t\tstoreCleanup(state, result);\n\t\t\t\t} else {\n\t\t\t\t\tstoreCleanup(state, effectPromise);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\t// Effects are fire-and-forget - errors are reported but don't propagate\n\t\t\tonError?.(id, error);\n\t\t\tconsole.error(`[Directive] Effect \"${id}\" threw an error:`, error);\n\t\t}\n\t}\n\n\t// Initialize all effect states\n\tfor (const id of Object.keys(definitions)) {\n\t\tinitState(id);\n\t}\n\n\tconst manager: EffectsManager<S> = {\n\t\tasync runEffects(changedKeys: Set<string>): Promise<void> {\n\t\t\tconst effectsToRun: string[] = [];\n\n\t\t\tfor (const id of Object.keys(definitions)) {\n\t\t\t\tif (shouldRun(id, changedKeys)) {\n\t\t\t\t\teffectsToRun.push(id);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Run effects in parallel (they're independent)\n\t\t\tawait Promise.all(effectsToRun.map(runEffect));\n\n\t\t\t// Update previous snapshot\n\t\t\tpreviousSnapshot = createSnapshot();\n\t\t},\n\n\t\tasync runAll(): Promise<void> {\n\t\t\tconst effectIds = Object.keys(definitions);\n\t\t\tawait Promise.all(\n\t\t\t\teffectIds.map((id) => {\n\t\t\t\t\tconst state = getState(id);\n\t\t\t\t\tif (state.enabled) {\n\t\t\t\t\t\treturn runEffect(id);\n\t\t\t\t\t}\n\t\t\t\t\treturn Promise.resolve();\n\t\t\t\t}),\n\t\t\t);\n\n\t\t\t// Update previous snapshot\n\t\t\tpreviousSnapshot = createSnapshot();\n\t\t},\n\n\t\tdisable(id: string): void {\n\t\t\tconst state = getState(id);\n\t\t\tstate.enabled = false;\n\t\t},\n\n\t\tenable(id: string): void {\n\t\t\tconst state = getState(id);\n\t\t\tstate.enabled = true;\n\t\t},\n\n\t\tisEnabled(id: string): boolean {\n\t\t\treturn getState(id).enabled;\n\t\t},\n\n\t\tcleanupAll(): void {\n\t\t\tstopped = true;\n\t\t\tfor (const state of states.values()) {\n\t\t\t\trunCleanup(state);\n\t\t\t}\n\t\t},\n\n\t\tregisterDefinitions(newDefs: EffectsDef<S>): void {\n\t\t\tfor (const [key, def] of Object.entries(newDefs)) {\n\t\t\t\t(definitions as Record<string, unknown>)[key] = def;\n\t\t\t\tinitState(key);\n\t\t\t}\n\t\t},\n\t};\n\n\treturn manager;\n}\n","/**\n * Error Types - Type definitions for error handling\n */\n\n// ============================================================================\n// Error Types\n// ============================================================================\n\n/** Error source types */\nexport type ErrorSource = \"constraint\" | \"resolver\" | \"effect\" | \"derivation\" | \"system\";\n\n/**\n * Extended Error class with source tracking, recovery metadata, and\n * arbitrary context for structured error handling within Directive.\n *\n * Thrown or returned by the error boundary manager. The `source` and\n * `sourceId` fields identify where the error originated, and `recoverable`\n * indicates whether the engine can apply a recovery strategy.\n *\n * @param message - Human-readable error description\n * @param source - Which subsystem produced the error (`\"constraint\"`, `\"resolver\"`, `\"effect\"`, `\"derivation\"`, or `\"system\"`)\n * @param sourceId - The ID of the specific constraint, resolver, effect, or derivation that failed\n * @param context - Optional arbitrary data for debugging (e.g., the requirement that triggered a resolver error)\n * @param recoverable - Whether the error boundary can apply a recovery strategy (default `true`; `false` for system errors)\n *\n * @example\n * ```ts\n * try {\n * await system.settle();\n * } catch (err) {\n * if (err instanceof DirectiveError) {\n * console.log(err.source); // \"resolver\"\n * console.log(err.sourceId); // \"fetchUser\"\n * console.log(err.recoverable); // true\n * }\n * }\n * ```\n */\nexport class DirectiveError extends Error {\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic readonly source: ErrorSource,\n\t\tpublic readonly sourceId: string,\n\t\tpublic readonly context?: unknown,\n\t\tpublic readonly recoverable: boolean = true,\n\t) {\n\t\tsuper(message);\n\t\tthis.name = \"DirectiveError\";\n\t}\n}\n\n/** Recovery strategy for errors */\nexport type RecoveryStrategy = \"skip\" | \"retry\" | \"retry-later\" | \"disable\" | \"throw\";\n\n/**\n * Configuration for retry-later strategy.\n * When an error occurs, the system will wait for `delayMs` before retrying.\n */\nexport interface RetryLaterConfig {\n\t/** Delay in milliseconds before retrying (default: 1000) */\n\tdelayMs?: number;\n\t/** Maximum retries before giving up (default: 3) */\n\tmaxRetries?: number;\n\t/** Backoff multiplier for each retry (default: 2) */\n\tbackoffMultiplier?: number;\n\t/** Maximum delay in milliseconds (default: 30000) */\n\tmaxDelayMs?: number;\n}\n\n/**\n * Circuit breaker configuration for automatic failure protection.\n * After `failureThreshold` consecutive failures, the circuit opens\n * and all requests fail fast for `resetTimeoutMs`.\n */\nexport interface CircuitBreakerConfig {\n\t/** Number of consecutive failures before opening the circuit (default: 5) */\n\tfailureThreshold?: number;\n\t/** Time in milliseconds before attempting to close the circuit (default: 60000) */\n\tresetTimeoutMs?: number;\n\t/** Number of successful requests needed to close a half-open circuit (default: 1) */\n\tsuccessThreshold?: number;\n}\n\n/** Circuit breaker state */\nexport type CircuitBreakerState = \"closed\" | \"open\" | \"half-open\";\n\n/** Error boundary configuration */\nexport interface ErrorBoundaryConfig {\n\tonConstraintError?: RecoveryStrategy | ((error: Error, constraint: string) => void);\n\tonResolverError?: RecoveryStrategy | ((error: Error, resolver: string) => void);\n\tonEffectError?: RecoveryStrategy | ((error: Error, effect: string) => void);\n\tonDerivationError?: RecoveryStrategy | ((error: Error, derivation: string) => void);\n\tonError?: (error: DirectiveError) => void;\n\n\t/** Configuration for retry-later strategy */\n\tretryLater?: RetryLaterConfig;\n\n\t/** Circuit breaker configuration (applies to resolvers only) */\n\tcircuitBreaker?: CircuitBreakerConfig;\n}\n","/**\n * Error Boundaries - Configurable error handling and recovery\n *\n * Features:\n * - Catch errors in constraints/resolvers/effects/derivations\n * - Configurable recovery strategies (skip, retry, retry-later, disable, throw)\n * - Circuit breaker pattern for automatic failure protection\n * - Error reporting to plugins\n */\n\nimport {\n\tDirectiveError,\n\ttype ErrorBoundaryConfig,\n\ttype ErrorSource,\n\ttype RecoveryStrategy,\n\ttype RetryLaterConfig,\n} from \"./types.js\";\n\n// ============================================================================\n// Retry-Later Queue\n// ============================================================================\n\n/**\n * Pending retry entry.\n */\nexport interface PendingRetry {\n\tsource: ErrorSource;\n\tsourceId: string;\n\tcontext: unknown;\n\tattempt: number;\n\tnextRetryTime: number;\n\tcallback?: () => void;\n}\n\n/**\n * Create a manager for deferred retry scheduling with exponential backoff.\n *\n * Retries are stored in a Map keyed by source ID. Each retry tracks its\n * attempt number and next retry time. When `processDueRetries()` is called\n * (typically during reconciliation), entries whose time has elapsed are\n * returned and removed from the queue.\n *\n * @param config - Backoff configuration: `delayMs`, `maxRetries`, `backoffMultiplier`, `maxDelayMs`\n * @returns A manager with `scheduleRetry`, `getPendingRetries`, `processDueRetries`, `cancelRetry`, and `clearAll` methods\n */\nexport function createRetryLaterManager(config: RetryLaterConfig = {}): {\n\t/** Schedule a retry */\n\tscheduleRetry: (\n\t\tsource: ErrorSource,\n\t\tsourceId: string,\n\t\tcontext: unknown,\n\t\tattempt: number,\n\t\tcallback?: () => void,\n\t) => PendingRetry | null;\n\t/** Get pending retries */\n\tgetPendingRetries: () => PendingRetry[];\n\t/** Process due retries */\n\tprocessDueRetries: () => PendingRetry[];\n\t/** Cancel a retry */\n\tcancelRetry: (sourceId: string) => void;\n\t/** Clear all pending retries */\n\tclearAll: () => void;\n} {\n\tconst {\n\t\tdelayMs = 1000,\n\t\tmaxRetries = 3,\n\t\tbackoffMultiplier = 2,\n\t\tmaxDelayMs = 30000,\n\t} = config;\n\n\tconst pendingRetries: Map<string, PendingRetry> = new Map();\n\n\tfunction calculateDelay(attempt: number): number {\n\t\tconst delay = delayMs * Math.pow(backoffMultiplier, attempt - 1);\n\t\treturn Math.min(delay, maxDelayMs);\n\t}\n\n\treturn {\n\t\tscheduleRetry(\n\t\t\tsource: ErrorSource,\n\t\t\tsourceId: string,\n\t\t\tcontext: unknown,\n\t\t\tattempt: number,\n\t\t\tcallback?: () => void,\n\t\t): PendingRetry | null {\n\t\t\t// Check if max retries exceeded\n\t\t\tif (attempt > maxRetries) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst delay = calculateDelay(attempt);\n\t\t\tconst entry: PendingRetry = {\n\t\t\t\tsource,\n\t\t\t\tsourceId,\n\t\t\t\tcontext,\n\t\t\t\tattempt,\n\t\t\t\tnextRetryTime: Date.now() + delay,\n\t\t\t\tcallback,\n\t\t\t};\n\n\t\t\tpendingRetries.set(sourceId, entry);\n\t\t\treturn entry;\n\t\t},\n\n\t\tgetPendingRetries(): PendingRetry[] {\n\t\t\treturn Array.from(pendingRetries.values());\n\t\t},\n\n\t\tprocessDueRetries(): PendingRetry[] {\n\t\t\tconst now = Date.now();\n\t\t\tconst dueRetries: PendingRetry[] = [];\n\n\t\t\tfor (const [sourceId, entry] of pendingRetries) {\n\t\t\t\tif (entry.nextRetryTime <= now) {\n\t\t\t\t\tdueRetries.push(entry);\n\t\t\t\t\tpendingRetries.delete(sourceId);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn dueRetries;\n\t\t},\n\n\t\tcancelRetry(sourceId: string): void {\n\t\t\tpendingRetries.delete(sourceId);\n\t\t},\n\n\t\tclearAll(): void {\n\t\t\tpendingRetries.clear();\n\t\t},\n\t};\n}\n\n// ============================================================================\n// Error Boundary Manager\n// ============================================================================\n\nexport interface ErrorBoundaryManager {\n\t/** Handle an error from a specific source */\n\thandleError(source: ErrorSource, sourceId: string, error: unknown, context?: unknown): RecoveryStrategy;\n\t/** Get the last error */\n\tgetLastError(): DirectiveError | null;\n\t/** Get all errors */\n\tgetAllErrors(): DirectiveError[];\n\t/** Clear all errors */\n\tclearErrors(): void;\n\t/** Get retry-later manager */\n\tgetRetryLaterManager(): ReturnType<typeof createRetryLaterManager>;\n\t/** Process due retries (call periodically or on reconcile) */\n\tprocessDueRetries(): PendingRetry[];\n\t/** Clear retry attempts for a source ID (call on success) */\n\tclearRetryAttempts(sourceId: string): void;\n}\n\n/** Options for creating an error boundary manager */\nexport interface CreateErrorBoundaryOptions {\n\tconfig?: ErrorBoundaryConfig;\n\t/** Callback when an error occurs */\n\tonError?: (error: DirectiveError) => void;\n\t/** Callback when recovery is attempted */\n\tonRecovery?: (error: DirectiveError, strategy: RecoveryStrategy) => void;\n}\n\n/** Default recovery strategies by source */\nconst DEFAULT_STRATEGIES: Record<ErrorSource, RecoveryStrategy> = {\n\tconstraint: \"skip\",\n\tresolver: \"skip\",\n\teffect: \"skip\",\n\tderivation: \"skip\",\n\tsystem: \"throw\",\n};\n\n/**\n * Create a manager that handles errors from constraints, resolvers, effects,\n * and derivations with configurable per-source recovery strategies.\n *\n * Supported strategies: `\"skip\"` (ignore), `\"retry\"` (immediate),\n * `\"retry-later\"` (deferred with backoff), `\"disable\"` (turn off source),\n * and `\"throw\"` (re-throw). Recent errors are kept in a ring buffer\n * (last 100) for inspection. The retry-later strategy delegates to an\n * internal {@link createRetryLaterManager}.\n *\n * @param options - Error boundary configuration, plus `onError` and `onRecovery` callbacks for plugin integration\n * @returns An `ErrorBoundaryManager` with handleError/getLastError/getAllErrors/clearErrors/processDueRetries methods\n *\n * @example\n * ```ts\n * const boundary = createErrorBoundaryManager({\n * config: {\n * onResolverError: \"retry-later\",\n * onEffectError: \"skip\",\n * retryLater: { maxRetries: 5, delayMs: 500 },\n * },\n * onError: (err) => console.error(err.source, err.message),\n * });\n *\n * const strategy = boundary.handleError(\"resolver\", \"fetchUser\", new Error(\"timeout\"));\n * // strategy === \"retry-later\"\n * ```\n */\nexport function createErrorBoundaryManager(\n\toptions: CreateErrorBoundaryOptions = {},\n): ErrorBoundaryManager {\n\tconst { config = {}, onError, onRecovery } = options;\n\n\t// Store errors for inspection\n\tconst errors: DirectiveError[] = [];\n\tconst maxErrors = 100; // Keep last 100 errors\n\n\t// Retry-later manager\n\tconst retryLaterManager = createRetryLaterManager(config.retryLater);\n\n\t// Track retry attempts per source ID\n\tconst retryAttempts = new Map<string, number>();\n\n\t/** Convert unknown error to DirectiveError */\n\tfunction toDirectiveError(\n\t\tsource: ErrorSource,\n\t\tsourceId: string,\n\t\terror: unknown,\n\t\tcontext?: unknown,\n\t): DirectiveError {\n\t\tif (error instanceof DirectiveError) {\n\t\t\treturn error;\n\t\t}\n\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tconst recoverable = source !== \"system\";\n\n\t\treturn new DirectiveError(message, source, sourceId, context, recoverable);\n\t}\n\n\t/** Get recovery strategy for a source */\n\tfunction getStrategy(source: ErrorSource, sourceId: string, error: Error): RecoveryStrategy {\n\t\t// Get configured handler\n\t\tconst handler = (() => {\n\t\t\tswitch (source) {\n\t\t\t\tcase \"constraint\":\n\t\t\t\t\treturn config.onConstraintError;\n\t\t\t\tcase \"resolver\":\n\t\t\t\t\treturn config.onResolverError;\n\t\t\t\tcase \"effect\":\n\t\t\t\t\treturn config.onEffectError;\n\t\t\t\tcase \"derivation\":\n\t\t\t\t\treturn config.onDerivationError;\n\t\t\t\tdefault:\n\t\t\t\t\treturn undefined;\n\t\t\t}\n\t\t})();\n\n\t\t// If handler is a function, call it and return skip\n\t\tif (typeof handler === \"function\") {\n\t\t\ttry {\n\t\t\t\thandler(error, sourceId);\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(\"[Directive] Error in error handler callback:\", e);\n\t\t\t}\n\t\t\treturn \"skip\";\n\t\t}\n\n\t\t// If handler is a strategy string, return it\n\t\tif (typeof handler === \"string\") {\n\t\t\treturn handler;\n\t\t}\n\n\t\t// Return default strategy\n\t\treturn DEFAULT_STRATEGIES[source];\n\t}\n\n\tconst manager: ErrorBoundaryManager = {\n\t\thandleError(\n\t\t\tsource: ErrorSource,\n\t\t\tsourceId: string,\n\t\t\terror: unknown,\n\t\t\tcontext?: unknown,\n\t\t): RecoveryStrategy {\n\t\t\tconst directiveError = toDirectiveError(source, sourceId, error, context);\n\n\t\t\t// Store error\n\t\t\terrors.push(directiveError);\n\t\t\tif (errors.length > maxErrors) {\n\t\t\t\terrors.shift();\n\t\t\t}\n\n\t\t\t// Notify callbacks (wrapped to prevent bypassing recovery)\n\t\t\ttry { onError?.(directiveError); } catch (e) { console.error(\"[Directive] Error in onError callback:\", e); }\n\t\t\ttry { config.onError?.(directiveError); } catch (e) { console.error(\"[Directive] Error in config.onError callback:\", e); }\n\n\t\t\t// Get recovery strategy\n\t\t\tlet strategy = getStrategy(\n\t\t\t\tsource,\n\t\t\t\tsourceId,\n\t\t\t\terror instanceof Error ? error : new Error(String(error)),\n\t\t\t);\n\n\t\t\t// Handle retry-later strategy\n\t\t\tif (strategy === \"retry-later\") {\n\t\t\t\tconst attempt = (retryAttempts.get(sourceId) ?? 0) + 1;\n\t\t\t\tretryAttempts.set(sourceId, attempt);\n\n\t\t\t\tconst scheduled = retryLaterManager.scheduleRetry(\n\t\t\t\t\tsource,\n\t\t\t\t\tsourceId,\n\t\t\t\t\tcontext,\n\t\t\t\t\tattempt,\n\t\t\t\t);\n\n\t\t\t\tif (!scheduled) {\n\t\t\t\t\t// Max retries exceeded, fall back to skip\n\t\t\t\t\tstrategy = \"skip\";\n\t\t\t\t\tretryAttempts.delete(sourceId);\n\n\t\t\t\t\tif (typeof process !== \"undefined\" && process.env?.NODE_ENV !== \"production\") {\n\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t`[Directive] ${source} \"${sourceId}\" exceeded max retry-later attempts. Skipping.`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Notify recovery callback\n\t\t\ttry { onRecovery?.(directiveError, strategy); } catch (e) { console.error(\"[Directive] Error in onRecovery callback:\", e); }\n\n\t\t\t// If strategy is throw, re-throw the error\n\t\t\tif (strategy === \"throw\") {\n\t\t\t\tthrow directiveError;\n\t\t\t}\n\n\t\t\treturn strategy;\n\t\t},\n\n\t\tgetLastError(): DirectiveError | null {\n\t\t\treturn errors[errors.length - 1] ?? null;\n\t\t},\n\n\t\tgetAllErrors(): DirectiveError[] {\n\t\t\treturn [...errors];\n\t\t},\n\n\t\tclearErrors(): void {\n\t\t\terrors.length = 0;\n\t\t},\n\n\t\tgetRetryLaterManager() {\n\t\t\treturn retryLaterManager;\n\t\t},\n\n\t\tprocessDueRetries(): PendingRetry[] {\n\t\t\treturn retryLaterManager.processDueRetries();\n\t\t},\n\n\t\tclearRetryAttempts(sourceId: string): void {\n\t\t\tretryAttempts.delete(sourceId);\n\t\t\tretryLaterManager.cancelRetry(sourceId);\n\t\t},\n\t};\n\n\treturn manager;\n}\n","/**\n * Facts Store - Proxy-based reactive state with auto-tracking\n *\n * Features:\n * - Proxy-based access (facts.phase instead of facts.get(\"phase\"))\n * - Automatic dependency tracking via tracking context\n * - Batched updates with coalesced notifications\n * - Granular subscriptions by key\n * - Schema validation in development mode\n */\n\nimport { trackAccess, withoutTracking } from \"./tracking.js\";\nimport type {\n\tFacts,\n\tFactsSnapshot,\n\tFactsStore,\n\tInferSchema,\n\tSchema,\n\tSchemaType,\n} from \"./types.js\";\n\n// ============================================================================\n// Schema Type Builders\n// ============================================================================\n\n/** Brand symbol for branded types */\ndeclare const Brand: unique symbol;\n\n/** Branded type - adds a unique brand to a base type */\nexport type Branded<T, B extends string> = T & { readonly [Brand]: B };\n\n/** Extended SchemaType with type name for better error messages */\nexport interface ExtendedSchemaType<T> extends SchemaType<T> {\n\treadonly _typeName?: string;\n\treadonly _default?: T | (() => T);\n\treadonly _transform?: (value: unknown) => T;\n\treadonly _description?: string;\n\treadonly _refinements?: Array<{ predicate: (value: T) => boolean; message: string }>;\n\t/** Mutable - set by array validators to indicate which element failed */\n\t_lastFailedIndex?: number;\n}\n\n/** Safely stringify a value for error messages */\nfunction safeStringify(value: unknown, maxLength = 100): string {\n\ttry {\n\t\treturn JSON.stringify(value)?.slice(0, maxLength) ?? String(value);\n\t} catch {\n\t\treturn \"[circular or non-serializable]\";\n\t}\n}\n\n/** Create a schema type builder with optional type name */\nfunction createSchemaType<T>(\n\tvalidators: Array<(v: T) => boolean> = [],\n\ttypeName?: string,\n\tdefaultValue?: T | (() => T),\n\ttransform?: (value: unknown) => T,\n\tdescription?: string,\n\trefinements?: Array<{ predicate: (value: T) => boolean; message: string }>,\n): ExtendedSchemaType<T> {\n\treturn {\n\t\t_type: undefined as unknown as T,\n\t\t_validators: validators,\n\t\t_typeName: typeName,\n\t\t_default: defaultValue,\n\t\t_transform: transform,\n\t\t_description: description,\n\t\t_refinements: refinements,\n\t\tvalidate(fn: (value: T) => boolean) {\n\t\t\treturn createSchemaType([...validators, fn], typeName, defaultValue, transform, description, refinements);\n\t\t},\n\t};\n}\n\n/** Chainable schema type with all common methods */\nexport interface ChainableSchemaType<T> extends ExtendedSchemaType<T> {\n\tdefault(value: T | (() => T)): ChainableSchemaType<T>;\n\ttransform<U>(fn: (value: T) => U): ChainableSchemaType<U>;\n\tbrand<B extends string>(): ChainableSchemaType<Branded<T, B>>;\n\tdescribe(description: string): ChainableSchemaType<T>;\n\trefine(predicate: (value: T) => boolean, message: string): ChainableSchemaType<T>;\n\tnullable(): ChainableSchemaType<T | null>;\n\toptional(): ChainableSchemaType<T | undefined>;\n}\n\n/** Create a chainable schema type with common methods */\nfunction createChainableType<T>(\n\tvalidators: Array<(v: T) => boolean>,\n\ttypeName: string,\n\tdefaultValue?: T | (() => T),\n\ttransform?: (value: unknown) => T,\n\tdescription?: string,\n\trefinements?: Array<{ predicate: (value: T) => boolean; message: string }>,\n): ChainableSchemaType<T> {\n\tconst base = createSchemaType<T>(validators, typeName, defaultValue, transform, description, refinements);\n\treturn {\n\t\t...base,\n\t\tdefault(value: T | (() => T)) {\n\t\t\treturn createChainableType(validators, typeName, value, transform, description, refinements);\n\t\t},\n\t\ttransform<U>(fn: (value: T) => U) {\n\t\t\tconst newTransform = (v: unknown) => {\n\t\t\t\tconst intermediate = transform ? transform(v) : v as T;\n\t\t\t\treturn fn(intermediate);\n\t\t\t};\n\t\t\treturn createChainableType<U>([], typeName, undefined, newTransform as (v: unknown) => U, description);\n\t\t},\n\t\tbrand<B extends string>() {\n\t\t\treturn createChainableType<Branded<T, B>>(\n\t\t\t\tvalidators as Array<(v: Branded<T, B>) => boolean>,\n\t\t\t\t`Branded<${typeName}>`,\n\t\t\t\tdefaultValue as Branded<T, B> | (() => Branded<T, B>),\n\t\t\t\ttransform as (value: unknown) => Branded<T, B>,\n\t\t\t\tdescription,\n\t\t\t\trefinements as Array<{ predicate: (value: Branded<T, B>) => boolean; message: string }>,\n\t\t\t);\n\t\t},\n\t\tdescribe(desc: string) {\n\t\t\treturn createChainableType(validators, typeName, defaultValue, transform, desc, refinements);\n\t\t},\n\t\trefine(predicate: (value: T) => boolean, message: string) {\n\t\t\tconst newRefinements = [...(refinements ?? []), { predicate, message }];\n\t\t\treturn createChainableType(\n\t\t\t\t[...validators, predicate],\n\t\t\t\ttypeName,\n\t\t\t\tdefaultValue,\n\t\t\t\ttransform,\n\t\t\t\tdescription,\n\t\t\t\tnewRefinements,\n\t\t\t);\n\t\t},\n\t\tnullable() {\n\t\t\treturn createChainableType<T | null>(\n\t\t\t\t[(v): v is T | null => v === null || validators.every(fn => fn(v as T))],\n\t\t\t\t`${typeName} | null`,\n\t\t\t\tdefaultValue as (T | null) | (() => T | null),\n\t\t\t\ttransform as (value: unknown) => T | null,\n\t\t\t\tdescription,\n\t\t\t);\n\t\t},\n\t\toptional() {\n\t\t\treturn createChainableType<T | undefined>(\n\t\t\t\t[(v): v is T | undefined => v === undefined || validators.every(fn => fn(v as T))],\n\t\t\t\t`${typeName} | undefined`,\n\t\t\t\tdefaultValue as (T | undefined) | (() => T | undefined),\n\t\t\t\ttransform as (value: unknown) => T | undefined,\n\t\t\t\tdescription,\n\t\t\t);\n\t\t},\n\t};\n}\n\n/**\n * Schema type builders for defining fact types.\n *\n * @example\n * ```typescript\n * const module = createModule(\"example\", {\n * schema: {\n * name: t.string(),\n * age: t.number().min(0).max(150),\n * active: t.boolean(),\n * tags: t.array<string>().of(t.string()),\n * user: t.object<{ id: string; email: string }>(),\n * },\n * });\n * ```\n */\nexport const t = {\n\t/**\n\t * Create a string schema type.\n\t *\n\t * @example\n\t * ```typescript\n\t * // Basic string\n\t * schema: { name: t.string() }\n\t *\n\t * // String literal union (for type safety)\n\t * schema: { phase: t.string<\"red\" | \"green\" | \"yellow\">() }\n\t *\n\t * // With custom validation\n\t * schema: { email: t.string().validate(s => s.includes(\"@\")) }\n\t *\n\t * // With transform\n\t * schema: { trimmed: t.string().transform(s => s.trim()) }\n\t *\n\t * // With brand\n\t * schema: { userId: t.string().brand<\"UserId\">() }\n\t * ```\n\t */\n\tstring<T extends string = string>() {\n\t\treturn createChainableType<T>([\n\t\t\t(v): v is T => typeof v === \"string\",\n\t\t], \"string\") as ChainableSchemaType<T>;\n\t},\n\n\t/**\n\t * Create a number schema type with optional min/max constraints.\n\t *\n\t * @example\n\t * ```typescript\n\t * // Basic number\n\t * schema: { count: t.number() }\n\t *\n\t * // With range constraints\n\t * schema: { age: t.number().min(0).max(150) }\n\t *\n\t * // With custom validation\n\t * schema: { even: t.number().validate(n => n % 2 === 0) }\n\t *\n\t * // With default\n\t * schema: { count: t.number().default(0) }\n\t *\n\t * // With transform (from string)\n\t * schema: { age: t.number().transform(v => parseInt(String(v), 10)) }\n\t * ```\n\t */\n\tnumber() {\n\t\ttype ChainableNumber = ChainableSchemaType<number> & {\n\t\t\tmin(n: number): ChainableNumber;\n\t\t\tmax(n: number): ChainableNumber;\n\t\t};\n\n\t\tconst createChainableNumber = (\n\t\t\tvalidators: Array<(v: number) => boolean>,\n\t\t\tdefaultValue?: number | (() => number),\n\t\t\ttransform?: (value: unknown) => number,\n\t\t\tdescription?: string,\n\t\t\trefinements?: Array<{ predicate: (value: number) => boolean; message: string }>,\n\t\t): ChainableNumber => {\n\t\t\tconst chainable = createChainableType<number>(validators, \"number\", defaultValue, transform, description, refinements);\n\t\t\treturn {\n\t\t\t\t...chainable,\n\t\t\t\tmin(n: number) {\n\t\t\t\t\treturn createChainableNumber([...validators, (v) => v >= n], defaultValue, transform, description, refinements);\n\t\t\t\t},\n\t\t\t\tmax(n: number) {\n\t\t\t\t\treturn createChainableNumber([...validators, (v) => v <= n], defaultValue, transform, description, refinements);\n\t\t\t\t},\n\t\t\t\tdefault(value: number | (() => number)) {\n\t\t\t\t\treturn createChainableNumber(validators, value, transform, description, refinements);\n\t\t\t\t},\n\t\t\t\tdescribe(desc: string) {\n\t\t\t\t\treturn createChainableNumber(validators, defaultValue, transform, desc, refinements);\n\t\t\t\t},\n\t\t\t\trefine(predicate: (value: number) => boolean, message: string) {\n\t\t\t\t\tconst newRefinements = [...(refinements ?? []), { predicate, message }];\n\t\t\t\t\treturn createChainableNumber([...validators, predicate], defaultValue, transform, description, newRefinements);\n\t\t\t\t},\n\t\t\t};\n\t\t};\n\t\treturn createChainableNumber([(v) => typeof v === \"number\"]);\n\t},\n\n\t/**\n\t * Create a boolean schema type.\n\t *\n\t * @example\n\t * ```typescript\n\t * schema: {\n\t * active: t.boolean(),\n\t * verified: t.boolean().default(false),\n\t * }\n\t * ```\n\t */\n\tboolean() {\n\t\treturn createChainableType<boolean>([(v) => typeof v === \"boolean\"], \"boolean\");\n\t},\n\n\t/**\n\t * Create an array schema type.\n\t * Can be used with or without element validation:\n\t * - `t.array<string>()` - Type-only, no element validation\n\t * - `t.array<string>().of(t.string())` - With element validation\n\t */\n\tarray<T>() {\n\t\ttype ChainableArray = ChainableSchemaType<T[]> & {\n\t\t\tof(elementType: SchemaType<T>): ChainableArray;\n\t\t\tnonEmpty(): ChainableArray;\n\t\t\tmaxLength(n: number): ChainableArray;\n\t\t\tminLength(n: number): ChainableArray;\n\t\t\t_lastFailedIndex?: number;\n\t\t};\n\n\t\tconst createChainableArray = (\n\t\t\tvalidators: Array<(v: T[]) => boolean>,\n\t\t\telementType?: SchemaType<T>,\n\t\t\tdefaultValue?: T[] | (() => T[]),\n\t\t\tdescription?: string,\n\t\t\tindexRef?: { value: number },\n\t\t): ChainableArray => {\n\t\t\tconst chainable = createChainableType<T[]>(validators, \"array\", defaultValue, undefined, description);\n\t\t\t// Use ref for storing failed index (shared with validator closure)\n\t\t\tconst ref = indexRef ?? { value: -1 };\n\t\t\tconst result: ChainableArray = {\n\t\t\t\t...chainable,\n\t\t\t\tget _lastFailedIndex() { return ref.value; },\n\t\t\t\tset _lastFailedIndex(v: number) { ref.value = v; },\n\t\t\t\tof(et: SchemaType<T>) {\n\t\t\t\t\t// Create a new ref for this chain\n\t\t\t\t\tconst newRef = { value: -1 };\n\t\t\t\t\treturn createChainableArray([\n\t\t\t\t\t\t...validators,\n\t\t\t\t\t\t(v) => {\n\t\t\t\t\t\t\tfor (let i = 0; i < v.length; i++) {\n\t\t\t\t\t\t\t\tconst item = v[i];\n\t\t\t\t\t\t\t\tif (!et._validators.every((validator) => validator(item))) {\n\t\t\t\t\t\t\t\t\tnewRef.value = i;\n\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t},\n\t\t\t\t\t], et, defaultValue, description, newRef);\n\t\t\t\t},\n\t\t\t\tnonEmpty() {\n\t\t\t\t\treturn createChainableArray([...validators, (v) => v.length > 0], elementType, defaultValue, description, ref);\n\t\t\t\t},\n\t\t\t\tmaxLength(n: number) {\n\t\t\t\t\treturn createChainableArray([...validators, (v) => v.length <= n], elementType, defaultValue, description, ref);\n\t\t\t\t},\n\t\t\t\tminLength(n: number) {\n\t\t\t\t\treturn createChainableArray([...validators, (v) => v.length >= n], elementType, defaultValue, description, ref);\n\t\t\t\t},\n\t\t\t\tdefault(value: T[] | (() => T[])) {\n\t\t\t\t\treturn createChainableArray(validators, elementType, value, description, ref);\n\t\t\t\t},\n\t\t\t\tdescribe(desc: string) {\n\t\t\t\t\treturn createChainableArray(validators, elementType, defaultValue, desc, ref);\n\t\t\t\t},\n\t\t\t};\n\t\t\treturn result;\n\t\t};\n\t\treturn createChainableArray([(v) => Array.isArray(v)]);\n\t},\n\n\t/**\n\t * Create an object schema type.\n\t * Can be used with or without shape validation:\n\t * - `t.object<User>()` - Type-only, no property validation\n\t * - `t.object<User>().shape({ name: t.string(), age: t.number() })` - With property validation\n\t */\n\tobject<T extends Record<string, unknown>>() {\n\t\ttype ChainableObject = ChainableSchemaType<T> & {\n\t\t\tshape(schema: { [K in keyof T]?: SchemaType<T[K]> }): ChainableObject;\n\t\t\tnonNull(): ChainableObject;\n\t\t\thasKeys(...keys: string[]): ChainableObject;\n\t\t};\n\n\t\tconst createChainableObject = (\n\t\t\tvalidators: Array<(v: T) => boolean>,\n\t\t\tdefaultValue?: T | (() => T),\n\t\t\tdescription?: string,\n\t\t): ChainableObject => {\n\t\t\tconst chainable = createChainableType<T>(validators, \"object\", defaultValue, undefined, description);\n\t\t\treturn {\n\t\t\t\t...chainable,\n\t\t\t\tshape(shapeSchema: { [K in keyof T]?: SchemaType<T[K]> }) {\n\t\t\t\t\treturn createChainableObject([\n\t\t\t\t\t\t...validators,\n\t\t\t\t\t\t(v) => {\n\t\t\t\t\t\t\tfor (const [key, schemaType] of Object.entries(shapeSchema)) {\n\t\t\t\t\t\t\t\tconst value = (v as Record<string, unknown>)[key];\n\t\t\t\t\t\t\t\tconst schemaT = schemaType as SchemaType<unknown>;\n\t\t\t\t\t\t\t\tif (schemaT && !schemaT._validators.every((validator) => validator(value))) {\n\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t},\n\t\t\t\t\t], defaultValue, description);\n\t\t\t\t},\n\t\t\t\tnonNull() {\n\t\t\t\t\treturn createChainableObject([...validators, (v) => v !== null && v !== undefined], defaultValue, description);\n\t\t\t\t},\n\t\t\t\thasKeys(...keys: string[]) {\n\t\t\t\t\treturn createChainableObject([\n\t\t\t\t\t\t...validators,\n\t\t\t\t\t\t(v) => keys.every((k) => k in (v as Record<string, unknown>)),\n\t\t\t\t\t], defaultValue, description);\n\t\t\t\t},\n\t\t\t\tdefault(value: T | (() => T)) {\n\t\t\t\t\treturn createChainableObject(validators, value, description);\n\t\t\t\t},\n\t\t\t\tdescribe(desc: string) {\n\t\t\t\t\treturn createChainableObject(validators, defaultValue, desc);\n\t\t\t\t},\n\t\t\t};\n\t\t};\n\t\treturn createChainableObject([\n\t\t\t(v) => typeof v === \"object\" && v !== null && !Array.isArray(v),\n\t\t]);\n\t},\n\n\t/**\n\t * Create an enum schema type for string literal unions.\n\t *\n\t * @example\n\t * ```typescript\n\t * // Define allowed values\n\t * schema: { status: t.enum(\"idle\", \"loading\", \"success\", \"error\") }\n\t *\n\t * // Type is inferred as \"idle\" | \"loading\" | \"success\" | \"error\"\n\t * ```\n\t */\n\tenum<T extends string>(...values: T[]) {\n\t\tif (process.env.NODE_ENV !== \"production\" && values.length === 0) {\n\t\t\tconsole.warn(\"[Directive] t.enum() called with no values - this will reject all strings\");\n\t\t}\n\t\tconst valueSet = new Set(values);\n\t\treturn createChainableType<T>([\n\t\t\t(v): v is T => typeof v === \"string\" && valueSet.has(v as T),\n\t\t], `enum(${values.join(\"|\")})`);\n\t},\n\n\t/**\n\t * Create a literal schema type for exact value matching.\n\t *\n\t * @example\n\t * ```typescript\n\t * // Exact string match\n\t * schema: { type: t.literal(\"user\") }\n\t *\n\t * // Exact number match\n\t * schema: { version: t.literal(1) }\n\t *\n\t * // Exact boolean\n\t * schema: { enabled: t.literal(true) }\n\t * ```\n\t */\n\tliteral<T extends string | number | boolean>(value: T) {\n\t\treturn createChainableType<T>([\n\t\t\t(v): v is T => v === value,\n\t\t], `literal(${String(value)})`);\n\t},\n\n\t/**\n\t * Create a nullable schema type (T | null).\n\t *\n\t * @example\n\t * ```typescript\n\t * // Nullable string\n\t * schema: { name: t.nullable(t.string()) }\n\t *\n\t * // Nullable object\n\t * schema: { user: t.nullable(t.object<User>()) }\n\t * ```\n\t */\n\tnullable<T>(innerType: SchemaType<T>) {\n\t\tconst innerTypeName = (innerType as ExtendedSchemaType<T>)._typeName ?? \"unknown\";\n\t\treturn createSchemaType<T | null>([\n\t\t\t(v): v is T | null => {\n\t\t\t\tif (v === null) return true;\n\t\t\t\treturn innerType._validators.every((validator) => validator(v as T));\n\t\t\t},\n\t\t], `${innerTypeName} | null`) as SchemaType<T | null>;\n\t},\n\n\t/**\n\t * Create an optional schema type (T | undefined).\n\t *\n\t * @example\n\t * ```typescript\n\t * // Optional string\n\t * schema: { nickname: t.optional(t.string()) }\n\t *\n\t * // Optional number\n\t * schema: { age: t.optional(t.number()) }\n\t * ```\n\t */\n\toptional<T>(innerType: SchemaType<T>) {\n\t\tconst innerTypeName = (innerType as ExtendedSchemaType<T>)._typeName ?? \"unknown\";\n\t\treturn createSchemaType<T | undefined>([\n\t\t\t(v): v is T | undefined => {\n\t\t\t\tif (v === undefined) return true;\n\t\t\t\treturn innerType._validators.every((validator) => validator(v as T));\n\t\t\t},\n\t\t], `${innerTypeName} | undefined`) as SchemaType<T | undefined>;\n\t},\n\n\t/**\n\t * Create a union schema type.\n\t *\n\t * @example\n\t * ```typescript\n\t * // String or number\n\t * schema: { value: t.union(t.string(), t.number()) }\n\t *\n\t * // Multiple types\n\t * schema: { data: t.union(t.string(), t.number(), t.boolean()) }\n\t * ```\n\t */\n\tunion<T extends SchemaType<unknown>[]>(...types: T) {\n\t\tif (process.env.NODE_ENV !== \"production\" && types.length === 0) {\n\t\t\tconsole.warn(\"[Directive] t.union() called with no types - this will reject all values\");\n\t\t}\n\t\ttype UnionType = T[number] extends SchemaType<infer U> ? U : never;\n\t\tconst typeNames = types.map(schemaType => (schemaType as ExtendedSchemaType<unknown>)._typeName ?? \"unknown\");\n\t\treturn createChainableType<UnionType>([\n\t\t\t(v): v is UnionType => types.some(schemaType => schemaType._validators.every(fn => fn(v))),\n\t\t], typeNames.join(\" | \"));\n\t},\n\n\t/**\n\t * Create a record schema type for dynamic key-value maps.\n\t *\n\t * @example\n\t * ```typescript\n\t * // Record with string values\n\t * schema: { metadata: t.record(t.string()) }\n\t *\n\t * // Record with number values\n\t * schema: { scores: t.record(t.number()) }\n\t * ```\n\t */\n\trecord<V>(valueType: SchemaType<V>) {\n\t\tconst valueTypeName = (valueType as ExtendedSchemaType<V>)._typeName ?? \"unknown\";\n\t\treturn createChainableType<Record<string, V>>([\n\t\t\t(v): v is Record<string, V> => {\n\t\t\t\tif (typeof v !== \"object\" || v === null || Array.isArray(v)) return false;\n\t\t\t\treturn Object.values(v).every(val =>\n\t\t\t\t\tvalueType._validators.every(validator => validator(val))\n\t\t\t\t);\n\t\t\t},\n\t\t], `Record<string, ${valueTypeName}>`);\n\t},\n\n\t/**\n\t * Create a tuple schema type for fixed-length arrays with specific types.\n\t *\n\t * @example\n\t * ```typescript\n\t * // [string, number] tuple\n\t * schema: { coord: t.tuple(t.string(), t.number()) }\n\t *\n\t * // [x, y, z] coordinates\n\t * schema: { position: t.tuple(t.number(), t.number(), t.number()) }\n\t * ```\n\t */\n\ttuple<T extends SchemaType<unknown>[]>(...types: T) {\n\t\tif (process.env.NODE_ENV !== \"production\" && types.length === 0) {\n\t\t\tconsole.warn(\"[Directive] t.tuple() called with no types - this will only accept empty arrays\");\n\t\t}\n\t\ttype TupleType = { [K in keyof T]: T[K] extends SchemaType<infer U> ? U : never };\n\t\tconst typeNames = types.map(schemaType => (schemaType as ExtendedSchemaType<unknown>)._typeName ?? \"unknown\");\n\t\treturn createChainableType<TupleType>([\n\t\t\t(v): v is TupleType => {\n\t\t\t\tif (!Array.isArray(v) || v.length !== types.length) return false;\n\t\t\t\treturn types.every((schemaType, i) =>\n\t\t\t\t\tschemaType._validators.every(validator => validator(v[i]))\n\t\t\t\t);\n\t\t\t},\n\t\t], `[${typeNames.join(\", \")}]`);\n\t},\n\n\t/**\n\t * Create a date schema type.\n\t *\n\t * @example\n\t * ```typescript\n\t * schema: { createdAt: t.date() }\n\t * ```\n\t */\n\tdate() {\n\t\treturn createChainableType<Date>([\n\t\t\t(v): v is Date => v instanceof Date && !isNaN(v.getTime()),\n\t\t], \"Date\");\n\t},\n\n\t/**\n\t * Create a UUID schema type.\n\t *\n\t * @example\n\t * ```typescript\n\t * schema: { id: t.uuid() }\n\t * ```\n\t */\n\tuuid() {\n\t\tconst uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\t\treturn createChainableType<string>([\n\t\t\t(v): v is string => typeof v === \"string\" && uuidRegex.test(v),\n\t\t], \"uuid\");\n\t},\n\n\t/**\n\t * Create an email schema type.\n\t *\n\t * @example\n\t * ```typescript\n\t * schema: { email: t.email() }\n\t * ```\n\t */\n\temail() {\n\t\t// Simple email regex - for comprehensive validation use Zod\n\t\tconst emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\t\treturn createChainableType<string>([\n\t\t\t(v): v is string => typeof v === \"string\" && emailRegex.test(v),\n\t\t], \"email\");\n\t},\n\n\t/**\n\t * Create a URL schema type.\n\t *\n\t * @example\n\t * ```typescript\n\t * schema: { website: t.url() }\n\t * ```\n\t */\n\turl() {\n\t\treturn createChainableType<string>([\n\t\t\t(v): v is string => {\n\t\t\t\tif (typeof v !== \"string\") return false;\n\t\t\t\ttry {\n\t\t\t\t\tnew URL(v);\n\t\t\t\t\treturn true;\n\t\t\t\t} catch {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t], \"url\");\n\t},\n\n\t/**\n\t * Create a bigint schema type.\n\t *\n\t * @example\n\t * ```typescript\n\t * schema: { largeNumber: t.bigint() }\n\t * ```\n\t */\n\tbigint() {\n\t\treturn createChainableType<bigint>([\n\t\t\t(v): v is bigint => typeof v === \"bigint\",\n\t\t], \"bigint\");\n\t},\n};\n\n// ============================================================================\n// Facts Store Implementation\n// ============================================================================\n\n/** Options for creating a facts store */\nexport interface CreateFactsStoreOptions<S extends Schema> {\n\tschema: S;\n\t/** Validate values against schema (default: process.env.NODE_ENV !== 'production') */\n\tvalidate?: boolean;\n\t/** Throw on unknown schema keys (default: true in dev mode) */\n\tstrictKeys?: boolean;\n\t/** Redact sensitive values in error messages */\n\tredactErrors?: boolean;\n\t/** Callback when facts change (for plugin hooks) */\n\tonChange?: (key: string, value: unknown, prev: unknown) => void;\n\t/** Callback for batch changes */\n\tonBatch?: (changes: Array<{ key: string; value: unknown; prev: unknown; type: \"set\" | \"delete\" }>) => void;\n}\n\n/**\n * Create a reactive facts store backed by a Map with schema validation,\n * batched mutations, and granular key-level subscriptions.\n *\n * The store is the low-level primitive that powers the `facts` proxy.\n * Most users should use {@link createFacts} or `createModule` instead.\n *\n * @param options - Store configuration including schema, validation settings, and change callbacks\n * @returns A `FactsStore<S>` with get/set/batch/subscribe methods and automatic schema validation\n *\n * @example\n * ```ts\n * const store = createFactsStore({\n * schema: { count: t.number(), name: t.string() },\n * });\n *\n * store.set(\"count\", 1);\n * store.get(\"count\"); // 1\n *\n * store.batch(() => {\n * store.set(\"count\", 2);\n * store.set(\"name\", \"hello\");\n * }); // listeners fire once after batch completes\n * ```\n */\nexport function createFactsStore<S extends Schema>(\n\toptions: CreateFactsStoreOptions<S>,\n): FactsStore<S> {\n\tconst { schema, onChange, onBatch } = options;\n\n\t// Detect if this is a type assertion schema (empty object with no keys)\n\tconst schemaKeys = Object.keys(schema);\n\tconst isTypeAssertionSchema = schemaKeys.length === 0;\n\n\t// Default strictKeys to false for type assertion schemas (they have no runtime keys)\n\tconst validate = options.validate ?? process.env.NODE_ENV !== \"production\";\n\tconst strictKeys = options.strictKeys ?? (process.env.NODE_ENV !== \"production\" && !isTypeAssertionSchema);\n\tconst redactErrors = options.redactErrors ?? false;\n\n\tconst map = new Map<string, unknown>();\n\tconst knownKeys = new Set<string>(); // Track all keys that have been set\n\tconst keyListeners = new Map<string, Set<() => void>>();\n\tconst allListeners = new Set<() => void>();\n\n\tlet batching = 0;\n\tconst batchChanges: Array<{ key: string; value: unknown; prev: unknown; type: \"set\" | \"delete\" }> = [];\n\tconst dirtyKeys = new Set<string>();\n\n\t// Notification coalescing: when notifyKey/notifyAll fires a listener that\n\t// calls store.set(), defer the new notification until the current cycle completes.\n\tlet isNotifying = false;\n\tconst pendingNonBatchedChanges: Array<{ key: string; value: unknown; prev: unknown }> = [];\n\tconst MAX_NOTIFY_ITERATIONS = 100;\n\n\t/** Check if a value is a Zod schema (robust detection) */\n\tfunction isZodSchema(v: unknown): v is { safeParse: (v: unknown) => { success: boolean; error?: { message?: string; issues?: Array<{ message: string }> } }; _def: unknown; parse: unknown } {\n\t\treturn (\n\t\t\tv !== null &&\n\t\t\ttypeof v === \"object\" &&\n\t\t\t\"safeParse\" in v && typeof (v as Record<string, unknown>).safeParse === \"function\" &&\n\t\t\t\"_def\" in v &&\n\t\t\t\"parse\" in v && typeof (v as Record<string, unknown>).parse === \"function\"\n\t\t);\n\t}\n\n\t/** Get expected type name from schema */\n\tfunction getExpectedType(schemaType: unknown): string {\n\t\t// Check for our SchemaType with _typeName\n\t\tconst st = schemaType as { _typeName?: string };\n\t\tif (st._typeName) return st._typeName;\n\n\t\t// Check for Zod schema\n\t\tif (isZodSchema(schemaType)) {\n\t\t\tconst def = (schemaType as { _def?: { typeName?: string } })._def;\n\t\t\tif (def?.typeName) {\n\t\t\t\t// Convert ZodString -> string, ZodNumber -> number, etc.\n\t\t\t\treturn def.typeName.replace(/^Zod/, \"\").toLowerCase();\n\t\t\t}\n\t\t}\n\n\t\treturn \"unknown\";\n\t}\n\n\t/** Format value for error message, respecting redactErrors option */\n\tfunction formatValueForError(value: unknown): string {\n\t\tif (redactErrors) return \"[redacted]\";\n\t\treturn safeStringify(value);\n\t}\n\n\t/** Validate a value against the schema */\n\tfunction validateValue(key: string, value: unknown): void {\n\t\tif (!validate) return;\n\n\t\tconst schemaType = schema[key];\n\t\tif (!schemaType) {\n\t\t\tif (strictKeys) {\n\t\t\t\tthrow new Error(`[Directive] Unknown fact key: \"${key}\". Key not defined in schema.`);\n\t\t\t}\n\t\t\tconsole.warn(`[Directive] Unknown fact key: \"${key}\"`);\n\t\t\treturn;\n\t\t}\n\n\t\t// Check for Zod schema (robust detection: safeParse + _def + parse)\n\t\tif (isZodSchema(schemaType)) {\n\t\t\tconst result = schemaType.safeParse(value);\n\t\t\tif (!result.success) {\n\t\t\t\tconst valueType = value === null ? \"null\" : Array.isArray(value) ? \"array\" : typeof value;\n\t\t\t\tconst valuePreview = formatValueForError(value);\n\t\t\t\t// Extract error message safely from Zod error structure\n\t\t\t\tconst errorMessage = result.error?.message\n\t\t\t\t\t?? result.error?.issues?.[0]?.message\n\t\t\t\t\t?? \"Validation failed\";\n\t\t\t\tconst expectedType = getExpectedType(schemaType);\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`[Directive] Validation failed for \"${key}\": expected ${expectedType}, got ${valueType} ${valuePreview}. ${errorMessage}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Check for our SchemaType (has _validators array)\n\t\tconst st = schemaType as { _validators?: unknown; _typeName?: string; _lastFailedIndex?: number };\n\t\tconst validators = st._validators;\n\n\t\t// Ensure validators is an array before iterating\n\t\tif (!validators || !Array.isArray(validators) || validators.length === 0) {\n\t\t\treturn; // type assertion or empty validators - no validation\n\t\t}\n\n\t\tconst expectedType = st._typeName ?? \"unknown\";\n\n\t\tfor (let i = 0; i < validators.length; i++) {\n\t\t\tconst validator = validators[i];\n\t\t\tif (typeof validator !== \"function\") continue;\n\n\t\t\tif (!validator(value as never)) {\n\t\t\t\tconst valueType = value === null ? \"null\" : Array.isArray(value) ? \"array\" : typeof value;\n\t\t\t\tconst valuePreview = formatValueForError(value);\n\n\t\t\t\t// Check for array index failure from schema type\n\t\t\t\tlet indexHint = \"\";\n\t\t\t\tif (typeof st._lastFailedIndex === \"number\" && st._lastFailedIndex >= 0) {\n\t\t\t\t\tindexHint = ` (element at index ${st._lastFailedIndex} failed)`;\n\t\t\t\t\tst._lastFailedIndex = -1; // Reset for next validation\n\t\t\t\t}\n\n\t\t\t\t// Include expected type in error message\n\t\t\t\tconst validatorHint = i === 0 ? \"\" : ` (validator ${i + 1} failed)`;\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`[Directive] Validation failed for \"${key}\": expected ${expectedType}, got ${valueType} ${valuePreview}${validatorHint}${indexHint}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Notify listeners for a specific key */\n\tfunction notifyKey(key: string): void {\n\t\tkeyListeners.get(key)?.forEach((listener) => listener());\n\t}\n\n\t/** Notify all listeners */\n\tfunction notifyAll(): void {\n\t\tallListeners.forEach((listener) => listener());\n\t}\n\n\t/**\n\t * Run non-batched notifications with coalescing.\n\t * If a listener calls store.set(), the change is deferred and processed\n\t * after the current notification cycle completes.\n\t */\n\tfunction notifyNonBatched(key: string, value: unknown, prev: unknown): void {\n\t\tif (isNotifying) {\n\t\t\t// Re-entrant: defer to after current notification cycle\n\t\t\tpendingNonBatchedChanges.push({ key, value, prev });\n\t\t\treturn;\n\t\t}\n\n\t\tisNotifying = true;\n\t\ttry {\n\t\t\t// Fire onChange, notifyKey, notifyAll for the initial change\n\t\t\tonChange?.(key, value, prev);\n\t\t\tnotifyKey(key);\n\t\t\tnotifyAll();\n\n\t\t\t// Process any changes that were deferred during notification\n\t\t\tlet iterations = 0;\n\t\t\twhile (pendingNonBatchedChanges.length > 0) {\n\t\t\t\tif (++iterations > MAX_NOTIFY_ITERATIONS) {\n\t\t\t\t\tpendingNonBatchedChanges.length = 0;\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`[Directive] Infinite notification loop detected after ${MAX_NOTIFY_ITERATIONS} iterations. ` +\n\t\t\t\t\t\t\t`A listener is repeatedly mutating facts that re-trigger notifications.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst deferred = [...pendingNonBatchedChanges];\n\t\t\t\tpendingNonBatchedChanges.length = 0;\n\n\t\t\t\tfor (const change of deferred) {\n\t\t\t\t\tonChange?.(change.key, change.value, change.prev);\n\t\t\t\t\tnotifyKey(change.key);\n\t\t\t\t}\n\t\t\t\t// Single notifyAll for all deferred changes in this iteration\n\t\t\t\tnotifyAll();\n\t\t\t}\n\t\t} finally {\n\t\t\tisNotifying = false;\n\t\t}\n\t}\n\n\t/** Flush batched changes and notify */\n\tfunction flush(): void {\n\t\tif (batching > 0) return;\n\n\t\t// Notify batch callback\n\t\tif (onBatch && batchChanges.length > 0) {\n\t\t\tonBatch([...batchChanges]);\n\t\t}\n\n\t\t// Notify key-specific listeners (within coalescing guard)\n\t\tif (dirtyKeys.size > 0) {\n\t\t\tisNotifying = true;\n\t\t\ttry {\n\t\t\t\tfor (const key of dirtyKeys) {\n\t\t\t\t\tnotifyKey(key);\n\t\t\t\t}\n\t\t\t\tnotifyAll();\n\n\t\t\t\t// Process any changes deferred during flush notification\n\t\t\t\tlet iterations = 0;\n\t\t\t\twhile (pendingNonBatchedChanges.length > 0) {\n\t\t\t\t\tif (++iterations > MAX_NOTIFY_ITERATIONS) {\n\t\t\t\t\t\tpendingNonBatchedChanges.length = 0;\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`[Directive] Infinite notification loop detected during flush after ${MAX_NOTIFY_ITERATIONS} iterations.`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst deferred = [...pendingNonBatchedChanges];\n\t\t\t\t\tpendingNonBatchedChanges.length = 0;\n\n\t\t\t\t\tfor (const change of deferred) {\n\t\t\t\t\t\tonChange?.(change.key, change.value, change.prev);\n\t\t\t\t\t\tnotifyKey(change.key);\n\t\t\t\t\t}\n\t\t\t\t\tnotifyAll();\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tisNotifying = false;\n\t\t\t}\n\t\t}\n\n\t\t// Clear batch state\n\t\tbatchChanges.length = 0;\n\t\tdirtyKeys.clear();\n\t}\n\n\tconst store: FactsStore<S> = {\n\t\tget<K extends keyof InferSchema<S>>(key: K): InferSchema<S>[K] | undefined {\n\t\t\t// Track access for auto-tracking\n\t\t\ttrackAccess(key as string);\n\t\t\treturn map.get(key as string) as InferSchema<S>[K] | undefined;\n\t\t},\n\n\t\thas(key: keyof InferSchema<S>): boolean {\n\t\t\t// Track access for auto-tracking\n\t\t\ttrackAccess(key as string);\n\t\t\treturn map.has(key as string);\n\t\t},\n\n\t\tset<K extends keyof InferSchema<S>>(key: K, value: InferSchema<S>[K]): void {\n\t\t\tvalidateValue(key as string, value);\n\n\t\t\tconst prev = map.get(key as string);\n\n\t\t\t// Skip if value hasn't changed (prevents unnecessary cascade)\n\t\t\tif (Object.is(prev, value)) return;\n\n\t\t\tmap.set(key as string, value);\n\t\t\tknownKeys.add(key as string); // Track known keys for serialization\n\n\t\t\t// Record change\n\t\t\tif (batching > 0) {\n\t\t\t\tbatchChanges.push({ key: key as string, value, prev, type: \"set\" });\n\t\t\t\tdirtyKeys.add(key as string);\n\t\t\t} else {\n\t\t\t\tnotifyNonBatched(key as string, value, prev);\n\t\t\t}\n\t\t},\n\n\t\tdelete(key: keyof InferSchema<S>): void {\n\t\t\tconst prev = map.get(key as string);\n\t\t\tmap.delete(key as string);\n\t\t\tknownKeys.delete(key as string); // Remove from known keys\n\n\t\t\t// Record change\n\t\t\tif (batching > 0) {\n\t\t\t\tbatchChanges.push({ key: key as string, value: undefined, prev, type: \"delete\" });\n\t\t\t\tdirtyKeys.add(key as string);\n\t\t\t} else {\n\t\t\t\tnotifyNonBatched(key as string, undefined, prev);\n\t\t\t}\n\t\t},\n\n\t\tbatch(fn: () => void): void {\n\t\t\tbatching++;\n\t\t\ttry {\n\t\t\t\tfn();\n\t\t\t} finally {\n\t\t\t\tbatching--;\n\t\t\t\tflush();\n\t\t\t}\n\t\t},\n\n\t\tsubscribe(\n\t\t\tkeys: Array<keyof InferSchema<S>>,\n\t\t\tlistener: () => void,\n\t\t): () => void {\n\t\t\tfor (const key of keys) {\n\t\t\t\tconst keyStr = key as string;\n\t\t\t\tif (!keyListeners.has(keyStr)) {\n\t\t\t\t\tkeyListeners.set(keyStr, new Set());\n\t\t\t\t}\n\t\t\t\tkeyListeners.get(keyStr)!.add(listener);\n\t\t\t}\n\n\t\t\treturn () => {\n\t\t\t\tfor (const key of keys) {\n\t\t\t\t\tconst set = keyListeners.get(key as string);\n\t\t\t\t\tif (set) {\n\t\t\t\t\t\tset.delete(listener);\n\t\t\t\t\t\tif (set.size === 0) {\n\t\t\t\t\t\t\tkeyListeners.delete(key as string);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t},\n\n\t\tsubscribeAll(listener: () => void): () => void {\n\t\t\tallListeners.add(listener);\n\t\t\treturn () => allListeners.delete(listener);\n\t\t},\n\n\t\ttoObject(): Record<string, unknown> {\n\t\t\tconst result: Record<string, unknown> = {};\n\t\t\tfor (const key of knownKeys) {\n\t\t\t\tif (map.has(key)) {\n\t\t\t\t\tresult[key] = map.get(key);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn result;\n\t\t},\n\t};\n\n\t// Internal: register new schema keys for dynamic module registration.\n\t// Not part of the public FactsStore interface — used by engine.registerModule().\n\t(store as unknown as Record<string, unknown>).registerKeys = (newSchema: Record<string, unknown>) => {\n\t\tfor (const key of Object.keys(newSchema)) {\n\t\t\t// Defense-in-depth: skip prototype pollution keys\n\t\t\tif (BLOCKED_PROPS.has(key)) continue;\n\t\t\t// Add to schema for validation\n\t\t\t(schema as Record<string, unknown>)[key] = newSchema[key];\n\t\t\tknownKeys.add(key);\n\t\t}\n\t};\n\n\treturn store;\n}\n\n// ============================================================================\n// Proxy-based Facts Accessor\n// ============================================================================\n\n/** Prototype pollution guard - prevent access to dangerous properties */\nconst BLOCKED_PROPS = Object.freeze(new Set([\"__proto__\", \"constructor\", \"prototype\"]));\n\n/**\n * Create a Proxy wrapper around a {@link FactsStore} for clean property-style\n * access (`facts.phase`) with automatic dependency tracking.\n *\n * Reading a property calls `store.get()` (which tracks the access for\n * auto-tracked derivations). Writing a property calls `store.set()` (which\n * validates against the schema). The proxy also exposes `$store` for direct\n * store access and `$snapshot()` for untracked reads.\n *\n * @param store - The underlying facts store to wrap\n * @param schema - The schema definition (used for `ownKeys` enumeration)\n * @returns A `Facts<S>` proxy with property-style get/set and prototype pollution guards\n */\nexport function createFactsProxy<S extends Schema>(\n\tstore: FactsStore<S>,\n\tschema: S,\n): Facts<S> {\n\tconst snapshot = (): FactsSnapshot<S> => ({\n\t\tget: <K extends keyof InferSchema<S>>(key: K) =>\n\t\t\twithoutTracking(() => store.get(key)),\n\t\thas: (key: keyof InferSchema<S>) =>\n\t\t\twithoutTracking(() => store.has(key)),\n\t});\n\n\tconst proxy = new Proxy({} as Facts<S>, {\n\t\tget(_, prop: string | symbol) {\n\t\t\tif (prop === \"$store\") return store;\n\t\t\tif (prop === \"$snapshot\") return snapshot;\n\n\t\t\t// Special properties\n\t\t\tif (typeof prop === \"symbol\") return undefined;\n\n\t\t\t// Prototype pollution protection\n\t\t\tif (BLOCKED_PROPS.has(prop)) return undefined;\n\n\t\t\t// Track and return the value\n\t\t\treturn store.get(prop as keyof InferSchema<S>);\n\t\t},\n\n\t\tset(_, prop: string | symbol, value: unknown) {\n\t\t\tif (typeof prop === \"symbol\") return false;\n\t\t\tif (prop === \"$store\" || prop === \"$snapshot\") return false;\n\t\t\t// Prototype pollution protection\n\t\t\tif (BLOCKED_PROPS.has(prop)) return false;\n\n\t\t\t// Validation is handled by store.set() when validate option is enabled\n\t\t\tstore.set(prop as keyof InferSchema<S>, value as InferSchema<S>[keyof InferSchema<S>]);\n\t\t\treturn true;\n\t\t},\n\n\t\tdeleteProperty(_, prop: string | symbol) {\n\t\t\tif (typeof prop === \"symbol\") return false;\n\t\t\tif (prop === \"$store\" || prop === \"$snapshot\") return false;\n\t\t\t// Prototype pollution protection\n\t\t\tif (BLOCKED_PROPS.has(prop)) return false;\n\n\t\t\tstore.delete(prop as keyof InferSchema<S>);\n\t\t\treturn true;\n\t\t},\n\n\t\thas(_, prop: string | symbol) {\n\t\t\tif (prop === \"$store\" || prop === \"$snapshot\") return true;\n\t\t\tif (typeof prop === \"symbol\") return false;\n\t\t\t// Prototype pollution protection\n\t\t\tif (BLOCKED_PROPS.has(prop)) return false;\n\n\t\t\treturn store.has(prop as keyof InferSchema<S>);\n\t\t},\n\n\t\townKeys() {\n\t\t\t// Return schema keys dynamically so Object.keys(facts) reflects\n\t\t\t// keys added via registerKeys (dynamic module registration)\n\t\t\treturn Object.keys(schema);\n\t\t},\n\n\t\tgetOwnPropertyDescriptor(_, prop: string | symbol) {\n\t\t\tif (prop === \"$store\" || prop === \"$snapshot\") {\n\t\t\t\treturn { configurable: true, enumerable: false, writable: false };\n\t\t\t}\n\t\t\treturn { configurable: true, enumerable: true, writable: true };\n\t\t},\n\t});\n\n\treturn proxy;\n}\n\n// ============================================================================\n// Combined Factory\n// ============================================================================\n\n/**\n * Convenience factory that creates both a {@link FactsStore} and its\n * {@link createFactsProxy | proxy wrapper} in a single call.\n *\n * This is the recommended entry point when you need low-level store access\n * outside of `createModule` / `createSystem`.\n *\n * @param options - Same options as {@link createFactsStore}\n * @returns An object with `store` (the reactive Map-backed store) and `facts` (the Proxy accessor)\n *\n * @example\n * ```ts\n * const { store, facts } = createFacts({\n * schema: { phase: t.string<\"red\" | \"green\">() },\n * });\n *\n * facts.phase = \"red\";\n * console.log(facts.phase); // \"red\"\n * store.subscribe([\"phase\"], () => console.log(\"phase changed\"));\n * ```\n */\nexport function createFacts<S extends Schema>(\n\toptions: CreateFactsStoreOptions<S>,\n): { store: FactsStore<S>; facts: Facts<S> } {\n\tconst store = createFactsStore(options);\n\tconst facts = createFactsProxy(store, options.schema);\n\treturn { store, facts };\n}\n","/**\n * Plugin Architecture - Extensible middleware for Directive\n *\n * Features:\n * - Lifecycle hooks for all engine events\n * - Multiple plugins can be composed\n * - Plugins execute in registration order\n */\n\nimport type {\n\tFactChange,\n\tFactsSnapshot,\n\tPlugin,\n\tReconcileResult,\n\tRecoveryStrategy,\n\tRequirementWithId,\n\tSchema,\n\tSnapshot,\n\tSystem,\n} from \"./types.js\";\nimport { DirectiveError } from \"./types.js\";\n\n// ============================================================================\n// Plugin Manager\n// ============================================================================\n\n// Note: PluginManager uses Schema (flat) internally because the engine works with flat schemas.\n// The public API uses ModuleSchema (consolidated), and the conversion happens in createSystem.\n// biome-ignore lint/suspicious/noExplicitAny: Internal type - plugins are schema-agnostic at runtime\nexport interface PluginManager<_S extends Schema = any> {\n\t/** Register a plugin */\n\t// biome-ignore lint/suspicious/noExplicitAny: Plugins work with any schema\n\tregister(plugin: Plugin<any>): void;\n\t/** Unregister a plugin by name */\n\tunregister(name: string): void;\n\t/** Get all registered plugins */\n\t// biome-ignore lint/suspicious/noExplicitAny: Plugins work with any schema\n\tgetPlugins(): Plugin<any>[];\n\n\t// Lifecycle hooks\n\t// biome-ignore lint/suspicious/noExplicitAny: System type varies between internal/public API\n\temitInit(system: System<any>): Promise<void>;\n\t// biome-ignore lint/suspicious/noExplicitAny: System type varies between internal/public API\n\temitStart(system: System<any>): void;\n\t// biome-ignore lint/suspicious/noExplicitAny: System type varies between internal/public API\n\temitStop(system: System<any>): void;\n\t// biome-ignore lint/suspicious/noExplicitAny: System type varies between internal/public API\n\temitDestroy(system: System<any>): void;\n\n\t// Fact hooks\n\temitFactSet(key: string, value: unknown, prev: unknown): void;\n\temitFactDelete(key: string, prev: unknown): void;\n\temitFactsBatch(changes: FactChange[]): void;\n\n\t// Derivation hooks\n\temitDerivationCompute(id: string, value: unknown, deps: string[]): void;\n\temitDerivationInvalidate(id: string): void;\n\n\t// Reconciliation hooks\n\t// biome-ignore lint/suspicious/noExplicitAny: Schema type varies\n\temitReconcileStart(snapshot: FactsSnapshot<any>): void;\n\temitReconcileEnd(result: ReconcileResult): void;\n\n\t// Constraint hooks\n\temitConstraintEvaluate(id: string, active: boolean): void;\n\temitConstraintError(id: string, error: unknown): void;\n\n\t// Requirement hooks\n\temitRequirementCreated(req: RequirementWithId): void;\n\temitRequirementMet(req: RequirementWithId, byResolver: string): void;\n\temitRequirementCanceled(req: RequirementWithId): void;\n\n\t// Resolver hooks\n\temitResolverStart(resolver: string, req: RequirementWithId): void;\n\temitResolverComplete(resolver: string, req: RequirementWithId, duration: number): void;\n\temitResolverError(resolver: string, req: RequirementWithId, error: unknown): void;\n\temitResolverRetry(resolver: string, req: RequirementWithId, attempt: number): void;\n\temitResolverCancel(resolver: string, req: RequirementWithId): void;\n\n\t// Effect hooks\n\temitEffectRun(id: string): void;\n\temitEffectError(id: string, error: unknown): void;\n\n\t// Time-travel hooks\n\temitSnapshot(snapshot: Snapshot): void;\n\temitTimeTravel(from: number, to: number): void;\n\n\t// Error boundary hooks\n\temitError(error: DirectiveError): void;\n\temitErrorRecovery(error: DirectiveError, strategy: RecoveryStrategy): void;\n}\n\n/**\n * Create a manager that broadcasts lifecycle events to registered plugins.\n *\n * Plugins are called in registration order. All hook invocations are\n * wrapped in try-catch so a misbehaving plugin never breaks the engine.\n * Duplicate plugin names are detected and the older registration is\n * replaced with a warning.\n *\n * @returns A `PluginManager` with register/unregister/getPlugins and emit* methods for every lifecycle event\n */\n// biome-ignore lint/suspicious/noExplicitAny: Internal - schema type varies\nexport function createPluginManager<S extends Schema = any>(): PluginManager<S> {\n\t// biome-ignore lint/suspicious/noExplicitAny: Plugins work with any schema\n\tconst plugins: Plugin<any>[] = [];\n\n\t/** Safe call - wraps plugin hook calls to prevent errors from breaking the system */\n\tfunction safeCall<T>(fn: (() => T) | undefined): T | undefined {\n\t\tif (!fn) return undefined;\n\t\ttry {\n\t\t\treturn fn();\n\t\t} catch (error) {\n\t\t\tconsole.error(\"[Directive] Plugin error:\", error);\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\t/** Safe async call */\n\tasync function safeCallAsync<T>(fn: (() => Promise<T>) | undefined): Promise<T | undefined> {\n\t\tif (!fn) return undefined;\n\t\ttry {\n\t\t\treturn await fn();\n\t\t} catch (error) {\n\t\t\tconsole.error(\"[Directive] Plugin error:\", error);\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\tconst manager: PluginManager<S> = {\n\t\t// biome-ignore lint/suspicious/noExplicitAny: Plugins work with any schema\n\t\tregister(plugin: Plugin<any>): void {\n\t\t\t// Check for duplicate names\n\t\t\tif (plugins.some((p) => p.name === plugin.name)) {\n\t\t\t\tconsole.warn(`[Directive] Plugin \"${plugin.name}\" is already registered, replacing...`);\n\t\t\t\tthis.unregister(plugin.name);\n\t\t\t}\n\t\t\tplugins.push(plugin);\n\t\t},\n\n\t\tunregister(name: string): void {\n\t\t\tconst index = plugins.findIndex((p) => p.name === name);\n\t\t\tif (index !== -1) {\n\t\t\t\tplugins.splice(index, 1);\n\t\t\t}\n\t\t},\n\n\t\t// biome-ignore lint/suspicious/noExplicitAny: Plugins work with any schema\n\t\tgetPlugins(): Plugin<any>[] {\n\t\t\treturn [...plugins];\n\t\t},\n\n\t\t// Lifecycle hooks\n\t\t// biome-ignore lint/suspicious/noExplicitAny: System type varies\n\t\tasync emitInit(system: System<any>): Promise<void> {\n\t\t\tfor (const plugin of plugins) {\n\t\t\t\tawait safeCallAsync(() => plugin.onInit?.(system) as Promise<void>);\n\t\t\t}\n\t\t},\n\n\t\t// biome-ignore lint/suspicious/noExplicitAny: System type varies\n\t\temitStart(system: System<any>): void {\n\t\t\tfor (const plugin of plugins) {\n\t\t\t\tsafeCall(() => plugin.onStart?.(system));\n\t\t\t}\n\t\t},\n\n\t\t// biome-ignore lint/suspicious/noExplicitAny: System type varies\n\t\temitStop(system: System<any>): void {\n\t\t\tfor (const plugin of plugins) {\n\t\t\t\tsafeCall(() => plugin.onStop?.(system));\n\t\t\t}\n\t\t},\n\n\t\t// biome-ignore lint/suspicious/noExplicitAny: System type varies\n\t\temitDestroy(system: System<any>): void {\n\t\t\tfor (const plugin of plugins) {\n\t\t\t\tsafeCall(() => plugin.onDestroy?.(system));\n\t\t\t}\n\t\t},\n\n\t\t// Fact hooks\n\t\temitFactSet(key: string, value: unknown, prev: unknown): void {\n\t\t\tfor (const plugin of plugins) {\n\t\t\t\tsafeCall(() => plugin.onFactSet?.(key, value, prev));\n\t\t\t}\n\t\t},\n\n\t\temitFactDelete(key: string, prev: unknown): void {\n\t\t\tfor (const plugin of plugins) {\n\t\t\t\tsafeCall(() => plugin.onFactDelete?.(key, prev));\n\t\t\t}\n\t\t},\n\n\t\temitFactsBatch(changes: FactChange[]): void {\n\t\t\tfor (const plugin of plugins) {\n\t\t\t\tsafeCall(() => plugin.onFactsBatch?.(changes));\n\t\t\t}\n\t\t},\n\n\t\t// Derivation hooks\n\t\temitDerivationCompute(id: string, value: unknown, deps: string[]): void {\n\t\t\tfor (const plugin of plugins) {\n\t\t\t\tsafeCall(() => plugin.onDerivationCompute?.(id, value, deps));\n\t\t\t}\n\t\t},\n\n\t\temitDerivationInvalidate(id: string): void {\n\t\t\tfor (const plugin of plugins) {\n\t\t\t\tsafeCall(() => plugin.onDerivationInvalidate?.(id));\n\t\t\t}\n\t\t},\n\n\t\t// Reconciliation hooks\n\t\t// biome-ignore lint/suspicious/noExplicitAny: Schema type varies\n\t\temitReconcileStart(snapshot: FactsSnapshot<any>): void {\n\t\t\tfor (const plugin of plugins) {\n\t\t\t\tsafeCall(() => plugin.onReconcileStart?.(snapshot));\n\t\t\t}\n\t\t},\n\n\t\temitReconcileEnd(result: ReconcileResult): void {\n\t\t\tfor (const plugin of plugins) {\n\t\t\t\tsafeCall(() => plugin.onReconcileEnd?.(result));\n\t\t\t}\n\t\t},\n\n\t\t// Constraint hooks\n\t\temitConstraintEvaluate(id: string, active: boolean): void {\n\t\t\tfor (const plugin of plugins) {\n\t\t\t\tsafeCall(() => plugin.onConstraintEvaluate?.(id, active));\n\t\t\t}\n\t\t},\n\n\t\temitConstraintError(id: string, error: unknown): void {\n\t\t\tfor (const plugin of plugins) {\n\t\t\t\tsafeCall(() => plugin.onConstraintError?.(id, error));\n\t\t\t}\n\t\t},\n\n\t\t// Requirement hooks\n\t\temitRequirementCreated(req: RequirementWithId): void {\n\t\t\tfor (const plugin of plugins) {\n\t\t\t\tsafeCall(() => plugin.onRequirementCreated?.(req));\n\t\t\t}\n\t\t},\n\n\t\temitRequirementMet(req: RequirementWithId, byResolver: string): void {\n\t\t\tfor (const plugin of plugins) {\n\t\t\t\tsafeCall(() => plugin.onRequirementMet?.(req, byResolver));\n\t\t\t}\n\t\t},\n\n\t\temitRequirementCanceled(req: RequirementWithId): void {\n\t\t\tfor (const plugin of plugins) {\n\t\t\t\tsafeCall(() => plugin.onRequirementCanceled?.(req));\n\t\t\t}\n\t\t},\n\n\t\t// Resolver hooks\n\t\temitResolverStart(resolver: string, req: RequirementWithId): void {\n\t\t\tfor (const plugin of plugins) {\n\t\t\t\tsafeCall(() => plugin.onResolverStart?.(resolver, req));\n\t\t\t}\n\t\t},\n\n\t\temitResolverComplete(resolver: string, req: RequirementWithId, duration: number): void {\n\t\t\tfor (const plugin of plugins) {\n\t\t\t\tsafeCall(() => plugin.onResolverComplete?.(resolver, req, duration));\n\t\t\t}\n\t\t},\n\n\t\temitResolverError(resolver: string, req: RequirementWithId, error: unknown): void {\n\t\t\tfor (const plugin of plugins) {\n\t\t\t\tsafeCall(() => plugin.onResolverError?.(resolver, req, error));\n\t\t\t}\n\t\t},\n\n\t\temitResolverRetry(resolver: string, req: RequirementWithId, attempt: number): void {\n\t\t\tfor (const plugin of plugins) {\n\t\t\t\tsafeCall(() => plugin.onResolverRetry?.(resolver, req, attempt));\n\t\t\t}\n\t\t},\n\n\t\temitResolverCancel(resolver: string, req: RequirementWithId): void {\n\t\t\tfor (const plugin of plugins) {\n\t\t\t\tsafeCall(() => plugin.onResolverCancel?.(resolver, req));\n\t\t\t}\n\t\t},\n\n\t\t// Effect hooks\n\t\temitEffectRun(id: string): void {\n\t\t\tfor (const plugin of plugins) {\n\t\t\t\tsafeCall(() => plugin.onEffectRun?.(id));\n\t\t\t}\n\t\t},\n\n\t\temitEffectError(id: string, error: unknown): void {\n\t\t\tfor (const plugin of plugins) {\n\t\t\t\tsafeCall(() => plugin.onEffectError?.(id, error));\n\t\t\t}\n\t\t},\n\n\t\t// Time-travel hooks\n\t\temitSnapshot(snapshot: Snapshot): void {\n\t\t\tfor (const plugin of plugins) {\n\t\t\t\tsafeCall(() => plugin.onSnapshot?.(snapshot));\n\t\t\t}\n\t\t},\n\n\t\temitTimeTravel(from: number, to: number): void {\n\t\t\tfor (const plugin of plugins) {\n\t\t\t\tsafeCall(() => plugin.onTimeTravel?.(from, to));\n\t\t\t}\n\t\t},\n\n\t\t// Error boundary hooks\n\t\temitError(error: DirectiveError): void {\n\t\t\tfor (const plugin of plugins) {\n\t\t\t\tsafeCall(() => plugin.onError?.(error));\n\t\t\t}\n\t\t},\n\n\t\temitErrorRecovery(error: DirectiveError, strategy: RecoveryStrategy): void {\n\t\t\tfor (const plugin of plugins) {\n\t\t\t\tsafeCall(() => plugin.onErrorRecovery?.(error, strategy));\n\t\t\t}\n\t\t},\n\t};\n\n\treturn manager;\n}\n","/**\n * Resolvers - Capability-based handlers for requirements\n *\n * Features:\n * - Capability matching (handles predicate)\n * - Custom dedupe keys\n * - Retry policies with exponential backoff\n * - Batched resolution for similar requirements\n * - Cancellation via AbortController\n */\n\nimport type {\n\tBatchConfig,\n\tBatchResolveResults,\n\tFacts,\n\tFactsSnapshot,\n\tFactsStore,\n\tRequirement,\n\tRequirementWithId,\n\tResolverContext,\n\tResolversDef,\n\tResolverStatus,\n\tRetryPolicy,\n\tSchema,\n} from \"./types.js\";\nimport { withTimeout } from \"../utils/utils.js\";\n\n// ============================================================================\n// Resolvers Manager\n// ============================================================================\n\n/** Inflight resolver info */\nexport interface InflightInfo {\n\tid: string;\n\tresolverId: string;\n\tstartedAt: number;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport interface ResolversManager<_S extends Schema> {\n\t/** Start resolving a requirement */\n\tresolve(req: RequirementWithId): void;\n\t/** Cancel a resolver by requirement ID */\n\tcancel(requirementId: string): void;\n\t/** Cancel all inflight resolvers */\n\tcancelAll(): void;\n\t/** Get status of a resolver by requirement ID */\n\tgetStatus(requirementId: string): ResolverStatus;\n\t/** Get all inflight requirement IDs */\n\tgetInflight(): string[];\n\t/** Get full info for all inflight resolvers */\n\tgetInflightInfo(): InflightInfo[];\n\t/** Check if a requirement is being resolved */\n\tisResolving(requirementId: string): boolean;\n\t/** Process batched requirements (called periodically) */\n\tprocessBatches(): void;\n\t/** Register new resolver definitions (for dynamic module registration) */\n\tregisterDefinitions(newDefs: ResolversDef<Schema>): void;\n}\n\n/** Internal resolver state */\ninterface ResolverState {\n\trequirementId: string;\n\tresolverId: string;\n\tcontroller: AbortController;\n\tstartedAt: number;\n\tattempt: number;\n\tstatus: ResolverStatus;\n\t/** Original requirement for proper cancel callback */\n\toriginalRequirement: RequirementWithId;\n}\n\n/** Batch state for batched resolvers */\ninterface BatchState {\n\tresolverId: string;\n\trequirements: RequirementWithId[];\n\ttimer: ReturnType<typeof setTimeout> | null;\n}\n\n/** Options for creating a resolvers manager */\nexport interface CreateResolversOptions<S extends Schema> {\n\tdefinitions: ResolversDef<S>;\n\tfacts: Facts<S>;\n\tstore: FactsStore<S>;\n\t/** Callback when a resolver starts */\n\tonStart?: (resolver: string, req: RequirementWithId) => void;\n\t/** Callback when a resolver completes */\n\tonComplete?: (resolver: string, req: RequirementWithId, duration: number) => void;\n\t/** Callback when a resolver errors */\n\tonError?: (resolver: string, req: RequirementWithId, error: unknown) => void;\n\t/** Callback when a resolver retries */\n\tonRetry?: (resolver: string, req: RequirementWithId, attempt: number) => void;\n\t/** Callback when a resolver is canceled */\n\tonCancel?: (resolver: string, req: RequirementWithId) => void;\n\t/** Callback when resolution cycle completes (for reconciliation) */\n\tonResolutionComplete?: () => void;\n}\n\n/** Default retry policy */\nconst DEFAULT_RETRY: RetryPolicy = {\n\tattempts: 1,\n\tbackoff: \"none\",\n\tinitialDelay: 100,\n\tmaxDelay: 30000,\n};\n\n/** Default batch config */\nconst DEFAULT_BATCH: BatchConfig = {\n\tenabled: false,\n\twindowMs: 50,\n};\n\n/**\n * Calculate delay for a retry attempt.\n */\nfunction calculateDelay(policy: RetryPolicy, attempt: number): number {\n\tconst { backoff, initialDelay = 100, maxDelay = 30000 } = policy;\n\n\tlet delay: number;\n\n\tswitch (backoff) {\n\t\tcase \"none\":\n\t\t\tdelay = initialDelay;\n\t\t\tbreak;\n\t\tcase \"linear\":\n\t\t\tdelay = initialDelay * attempt;\n\t\t\tbreak;\n\t\tcase \"exponential\":\n\t\t\tdelay = initialDelay * Math.pow(2, attempt - 1);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tdelay = initialDelay;\n\t}\n\n\t// Ensure delay is at least 1ms to prevent busy loops\n\treturn Math.max(1, Math.min(delay, maxDelay));\n}\n\n/**\n * Create a manager that fulfills requirements by matching them to resolver\n * handlers.\n *\n * Resolvers are matched by requirement type (string or predicate). Each\n * resolution runs with an `AbortController` for cancellation, configurable\n * retry policies (none/linear/exponential backoff), and optional batching\n * for grouping similar requirements. Duplicate in-flight requirements are\n * automatically deduplicated.\n *\n * @param options - Resolver definitions, facts proxy, store, and lifecycle callbacks (onStart/onComplete/onError/onRetry/onCancel/onResolutionComplete)\n * @returns A `ResolversManager` with resolve/cancel/cancelAll/getStatus/processBatches methods\n */\nexport function createResolversManager<S extends Schema>(\n\toptions: CreateResolversOptions<S>,\n): ResolversManager<S> {\n\tconst {\n\t\tdefinitions,\n\t\tfacts,\n\t\tstore,\n\t\tonStart,\n\t\tonComplete,\n\t\tonError,\n\t\tonRetry,\n\t\tonCancel,\n\t\tonResolutionComplete,\n\t} = options;\n\n\t// Validate resolver definitions\n\tif (process.env.NODE_ENV !== \"production\") {\n\t\tfor (const [id, def] of Object.entries(definitions)) {\n\t\t\tif (!def.resolve && !def.resolveBatch) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`[Directive] Resolver \"${id}\" must define either resolve() or resolveBatch(). ` +\n\t\t\t\t\t\t`Add one of these methods to handle requirements.`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (def.batch?.enabled && !def.resolveBatch) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`[Directive] Resolver \"${id}\" has batch.enabled=true but no resolveBatch() method. ` +\n\t\t\t\t\t\t`Add resolveBatch() to handle batched requirements.`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Active resolver states by requirement ID\n\tconst inflight = new Map<string, ResolverState>();\n\n\t// Completed/failed statuses (kept for inspection) - LRU cleanup\n\tconst statuses = new Map<string, ResolverStatus>();\n\tconst MAX_STATUSES = 1000; // Limit to prevent memory leak\n\n\t// Batch states by resolver ID\n\tconst batches = new Map<string, BatchState>();\n\n\t// Resolver index by requirement type for O(1) lookup (populated lazily)\n\t// Capped to prevent unbounded growth with dynamic requirement types (e.g., FETCH_USER_${id})\n\tconst resolversByType = new Map<string, string[]>();\n\tconst MAX_RESOLVER_CACHE = 1000;\n\n\t/** Cleanup old statuses to prevent memory leak */\n\tfunction cleanupStatuses(): void {\n\t\tif (statuses.size > MAX_STATUSES) {\n\t\t\t// Remove oldest entries (first inserted = first in iteration)\n\t\t\tconst entriesToRemove = statuses.size - MAX_STATUSES;\n\t\t\tconst iterator = statuses.keys();\n\t\t\tfor (let i = 0; i < entriesToRemove; i++) {\n\t\t\t\tconst key = iterator.next().value;\n\t\t\t\tif (key) statuses.delete(key);\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Type guard for resolver with string `requirement` property */\n\tfunction hasStringRequirement(\n\t\tdef: unknown,\n\t): def is { requirement: string } {\n\t\treturn (\n\t\t\ttypeof def === \"object\" &&\n\t\t\tdef !== null &&\n\t\t\t\"requirement\" in def &&\n\t\t\ttypeof (def as { requirement: unknown }).requirement === \"string\"\n\t\t);\n\t}\n\n\t/** Type guard for resolver with function `requirement` property */\n\tfunction hasFunctionRequirement(\n\t\tdef: unknown,\n\t): def is { requirement: (req: Requirement) => boolean } {\n\t\treturn (\n\t\t\ttypeof def === \"object\" &&\n\t\t\tdef !== null &&\n\t\t\t\"requirement\" in def &&\n\t\t\ttypeof (def as { requirement: unknown }).requirement === \"function\"\n\t\t);\n\t}\n\n\t/**\n\t * Check if a resolver handles a requirement.\n\t * Supports:\n\t * - `requirement: \"TYPE\"` - string matching\n\t * - `requirement: (req) => req is T` - function type guard\n\t */\n\tfunction resolverHandles(def: ResolversDef<S>[string], req: Requirement): boolean {\n\t\t// Check string-based `requirement`\n\t\tif (hasStringRequirement(def)) {\n\t\t\treturn req.type === def.requirement;\n\t\t}\n\n\t\t// Check function-based `requirement` (type guard)\n\t\tif (hasFunctionRequirement(def)) {\n\t\t\treturn def.requirement(req);\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/** Find a resolver that handles a requirement */\n\tfunction findResolver(req: Requirement): string | null {\n\t\t// Check cache first for this requirement type\n\t\tconst reqType = req.type;\n\t\tconst cached = resolversByType.get(reqType);\n\t\tif (cached) {\n\t\t\t// Try cached resolvers first\n\t\t\tfor (const id of cached) {\n\t\t\t\tconst def = definitions[id];\n\t\t\t\tif (def && resolverHandles(def, req)) {\n\t\t\t\t\treturn id;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Fallback to full search and cache the result\n\t\tfor (const [id, def] of Object.entries(definitions)) {\n\t\t\tif (resolverHandles(def, req)) {\n\t\t\t\t// Cache this resolver for this type (with size cap)\n\t\t\t\tif (!resolversByType.has(reqType)) {\n\t\t\t\t\t// Evict oldest entry if cache is full\n\t\t\t\t\tif (resolversByType.size >= MAX_RESOLVER_CACHE) {\n\t\t\t\t\t\tconst oldest = resolversByType.keys().next().value;\n\t\t\t\t\t\tif (oldest !== undefined) resolversByType.delete(oldest);\n\t\t\t\t\t}\n\t\t\t\t\tresolversByType.set(reqType, []);\n\t\t\t\t}\n\t\t\t\tconst typeResolvers = resolversByType.get(reqType)!;\n\t\t\t\tif (!typeResolvers.includes(id)) {\n\t\t\t\t\ttypeResolvers.push(id);\n\t\t\t\t}\n\t\t\t\treturn id;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\t/** Create resolver context */\n\tfunction createContext(signal: AbortSignal): ResolverContext<S> {\n\t\treturn {\n\t\t\tfacts,\n\t\t\tsignal,\n\t\t\tsnapshot: () => facts.$snapshot() as FactsSnapshot<S>,\n\t\t};\n\t}\n\n\t/** Execute a single requirement resolution with retry */\n\tasync function executeResolve(\n\t\tresolverId: string,\n\t\treq: RequirementWithId,\n\t\tcontroller: AbortController,\n\t): Promise<void> {\n\t\tconst def = definitions[resolverId];\n\t\tif (!def) return;\n\t\tconst retryPolicy = { ...DEFAULT_RETRY, ...def.retry };\n\t\tlet lastError: Error | null = null;\n\n\t\tfor (let attempt = 1; attempt <= retryPolicy.attempts; attempt++) {\n\t\t\t// Check if canceled\n\t\t\tif (controller.signal.aborted) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Update state\n\t\t\tconst state = inflight.get(req.id);\n\t\t\tif (state) {\n\t\t\t\tstate.attempt = attempt;\n\t\t\t\tstate.status = {\n\t\t\t\t\tstate: \"running\",\n\t\t\t\t\trequirementId: req.id,\n\t\t\t\t\tstartedAt: state.startedAt,\n\t\t\t\t\tattempt,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst ctx = createContext(controller.signal);\n\n\t\t\t\tif (def.resolve) {\n\t\t\t\t\t// Batch the synchronous portion of resolve to coalesce fact mutations.\n\t\t\t\t\t// For sync-body async resolvers, all mutations are batched and flushed once.\n\t\t\t\t\t// For truly async resolvers, mutations before the first await are batched.\n\t\t\t\t\tlet resolvePromise!: Promise<void>;\n\t\t\t\t\tstore.batch(() => {\n\t\t\t\t\t\tresolvePromise = def.resolve!(req.requirement as Parameters<NonNullable<typeof def.resolve>>[0], ctx) as Promise<void>;\n\t\t\t\t\t});\n\n\t\t\t\t\tconst timeout = def.timeout;\n\t\t\t\t\tif (timeout && timeout > 0) {\n\t\t\t\t\t\tawait withTimeout(\n\t\t\t\t\t\t\tresolvePromise,\n\t\t\t\t\t\t\ttimeout,\n\t\t\t\t\t\t\t`Resolver \"${resolverId}\" timed out after ${timeout}ms`,\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tawait resolvePromise;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Success\n\t\t\t\tconst duration = Date.now() - (state?.startedAt ?? Date.now());\n\t\t\t\tstatuses.set(req.id, {\n\t\t\t\t\tstate: \"success\",\n\t\t\t\t\trequirementId: req.id,\n\t\t\t\t\tcompletedAt: Date.now(),\n\t\t\t\t\tduration,\n\t\t\t\t});\n\t\t\t\tcleanupStatuses(); // Prevent memory leak\n\t\t\t\tonComplete?.(resolverId, req, duration);\n\t\t\t\treturn;\n\t\t\t} catch (error) {\n\t\t\t\tlastError = error instanceof Error ? error : new Error(String(error));\n\n\t\t\t\t// Check if it was an abort\n\t\t\t\tif (controller.signal.aborted) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Check shouldRetry predicate — if it returns false, stop immediately\n\t\t\t\tif (retryPolicy.shouldRetry && !retryPolicy.shouldRetry(lastError, attempt)) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t// If we have more attempts, wait and retry\n\t\t\t\tif (attempt < retryPolicy.attempts) {\n\t\t\t\t\t// Check abort before starting delay (avoids unnecessary waiting)\n\t\t\t\t\tif (controller.signal.aborted) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst delay = calculateDelay(retryPolicy, attempt);\n\t\t\t\t\tonRetry?.(resolverId, req, attempt + 1);\n\n\t\t\t\t\t// Use AbortSignal-aware sleep to respond to cancellation immediately\n\t\t\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\t\t\tconst timeoutId = setTimeout(resolve, delay);\n\t\t\t\t\t\t// Listen for abort during sleep\n\t\t\t\t\t\tconst abortHandler = () => {\n\t\t\t\t\t\t\tclearTimeout(timeoutId);\n\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t};\n\t\t\t\t\t\tcontroller.signal.addEventListener(\"abort\", abortHandler, { once: true });\n\t\t\t\t\t});\n\n\t\t\t\t\t// Check abort after sleep\n\t\t\t\t\tif (controller.signal.aborted) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// All attempts failed (or shouldRetry returned false)\n\t\tstatuses.set(req.id, {\n\t\t\tstate: \"error\",\n\t\t\trequirementId: req.id,\n\t\t\terror: lastError!,\n\t\t\tfailedAt: Date.now(),\n\t\t\tattempts: retryPolicy.attempts,\n\t\t});\n\t\tcleanupStatuses();\n\t\tonError?.(resolverId, req, lastError);\n\t}\n\n\t/** Execute a batch of requirements with retry, timeout, and partial failure support */\n\tasync function executeBatch(\n\t\tresolverId: string,\n\t\trequirements: RequirementWithId[],\n\t): Promise<void> {\n\t\tconst def = definitions[resolverId];\n\t\tif (!def) return;\n\n\t\t// If no batch handler, fall back to individual resolution\n\t\tif (!def.resolveBatch && !def.resolveBatchWithResults) {\n\t\t\tawait Promise.all(\n\t\t\t\trequirements.map((req) => {\n\t\t\t\t\tconst controller = new AbortController();\n\t\t\t\t\treturn executeResolve(resolverId, req, controller);\n\t\t\t\t}),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tconst retryPolicy = { ...DEFAULT_RETRY, ...def.retry };\n\t\tconst batchConfig = { ...DEFAULT_BATCH, ...def.batch };\n\t\tconst controller = new AbortController();\n\t\tconst startedAt = Date.now();\n\t\tlet lastError: Error | null = null;\n\n\t\t// Use batch timeout if configured, otherwise fall back to resolver timeout\n\t\tconst timeout = batchConfig.timeoutMs ?? def.timeout;\n\n\t\tfor (let attempt = 1; attempt <= retryPolicy.attempts; attempt++) {\n\t\t\t// Check if canceled\n\t\t\tif (controller.signal.aborted) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst ctx = createContext(controller.signal);\n\t\t\t\tconst reqPayloads = requirements.map((r) => r.requirement);\n\n\t\t\t\t// Check for resolveBatchWithResults (per-item results)\n\t\t\t\tif (def.resolveBatchWithResults) {\n\t\t\t\t\tlet results: BatchResolveResults;\n\n\t\t\t\t\t// Batch fact mutations for the synchronous portion of the resolver\n\t\t\t\t\tlet resolvePromise!: Promise<BatchResolveResults>;\n\t\t\t\t\tstore.batch(() => {\n\t\t\t\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Requirement type varies\n\t\t\t\t\t\tresolvePromise = def.resolveBatchWithResults!(reqPayloads as any, ctx);\n\t\t\t\t\t});\n\n\t\t\t\t\tif (timeout && timeout > 0) {\n\t\t\t\t\t\tresults = await withTimeout(\n\t\t\t\t\t\t\tresolvePromise,\n\t\t\t\t\t\t\ttimeout,\n\t\t\t\t\t\t\t`Batch resolver \"${resolverId}\" timed out after ${timeout}ms`,\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresults = await resolvePromise;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Validate results length\n\t\t\t\t\tif (results.length !== requirements.length) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`[Directive] Batch resolver \"${resolverId}\" returned ${results.length} results ` +\n\t\t\t\t\t\t\t\t`but expected ${requirements.length}. Results array must match input order.`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Process per-item results\n\t\t\t\t\tconst duration = Date.now() - startedAt;\n\t\t\t\t\tlet hasFailures = false;\n\n\t\t\t\t\tfor (let i = 0; i < requirements.length; i++) {\n\t\t\t\t\t\tconst req = requirements[i]!;\n\t\t\t\t\t\tconst result = results[i]!;\n\n\t\t\t\t\t\tif (result.success) {\n\t\t\t\t\t\t\tstatuses.set(req.id, {\n\t\t\t\t\t\t\t\tstate: \"success\",\n\t\t\t\t\t\t\t\trequirementId: req.id,\n\t\t\t\t\t\t\t\tcompletedAt: Date.now(),\n\t\t\t\t\t\t\t\tduration,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tonComplete?.(resolverId, req, duration);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\thasFailures = true;\n\t\t\t\t\t\t\tconst error = result.error ?? new Error(\"Batch item failed\");\n\t\t\t\t\t\t\tstatuses.set(req.id, {\n\t\t\t\t\t\t\t\tstate: \"error\",\n\t\t\t\t\t\t\t\trequirementId: req.id,\n\t\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t\t\tfailedAt: Date.now(),\n\t\t\t\t\t\t\t\tattempts: attempt,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tonError?.(resolverId, req, error);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// No failures: all succeeded, done\n\t\t\t\t\tif (!hasFailures) return;\n\n\t\t\t\t\t// Partial success (some succeeded, some failed): don't retry the batch\n\t\t\t\t\tif (requirements.some((_, i) => results[i]?.success)) return;\n\n\t\t\t\t\t// ALL failed: fall through to retry logic below\n\t\t\t\t} else {\n\t\t\t\t\t// Use all-or-nothing resolveBatch\n\t\t\t\t\t// Batch fact mutations for the synchronous portion of the resolver\n\t\t\t\t\tlet resolvePromise!: Promise<void>;\n\t\t\t\t\tstore.batch(() => {\n\t\t\t\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Requirement type varies\n\t\t\t\t\t\tresolvePromise = def.resolveBatch!(reqPayloads as any, ctx) as Promise<void>;\n\t\t\t\t\t});\n\n\t\t\t\t\tif (timeout && timeout > 0) {\n\t\t\t\t\t\tawait withTimeout(\n\t\t\t\t\t\t\tresolvePromise,\n\t\t\t\t\t\t\ttimeout,\n\t\t\t\t\t\t\t`Batch resolver \"${resolverId}\" timed out after ${timeout}ms`,\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tawait resolvePromise;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Mark all as success\n\t\t\t\t\tconst duration = Date.now() - startedAt;\n\t\t\t\t\tfor (const req of requirements) {\n\t\t\t\t\t\tstatuses.set(req.id, {\n\t\t\t\t\t\t\tstate: \"success\",\n\t\t\t\t\t\t\trequirementId: req.id,\n\t\t\t\t\t\t\tcompletedAt: Date.now(),\n\t\t\t\t\t\t\tduration,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tonComplete?.(resolverId, req, duration);\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tlastError = error instanceof Error ? error : new Error(String(error));\n\n\t\t\t\t// Check if it was an abort\n\t\t\t\tif (controller.signal.aborted) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Check shouldRetry predicate — if it returns false, stop immediately\n\t\t\t\tif (retryPolicy.shouldRetry && !retryPolicy.shouldRetry(lastError, attempt)) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t// If we have more attempts, wait and retry\n\t\t\t\tif (attempt < retryPolicy.attempts) {\n\t\t\t\t\tconst delay = calculateDelay(retryPolicy, attempt);\n\t\t\t\t\t// Notify retry for all requirements\n\t\t\t\t\tfor (const req of requirements) {\n\t\t\t\t\t\tonRetry?.(resolverId, req, attempt + 1);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Use AbortSignal-aware sleep\n\t\t\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\t\t\tconst timeoutId = setTimeout(resolve, delay);\n\t\t\t\t\t\tconst abortHandler = () => {\n\t\t\t\t\t\t\tclearTimeout(timeoutId);\n\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t};\n\t\t\t\t\t\tcontroller.signal.addEventListener(\"abort\", abortHandler, { once: true });\n\t\t\t\t\t});\n\n\t\t\t\t\t// Check abort after sleep\n\t\t\t\t\tif (controller.signal.aborted) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// All attempts failed (or shouldRetry returned false) - mark all as error\n\t\tfor (const req of requirements) {\n\t\t\tstatuses.set(req.id, {\n\t\t\t\tstate: \"error\",\n\t\t\t\trequirementId: req.id,\n\t\t\t\terror: lastError!,\n\t\t\t\tfailedAt: Date.now(),\n\t\t\t\tattempts: retryPolicy.attempts,\n\t\t\t});\n\t\t\tonError?.(resolverId, req, lastError);\n\t\t}\n\t\tcleanupStatuses();\n\t}\n\n\t/** Add a requirement to a batch */\n\tfunction addToBatch(resolverId: string, req: RequirementWithId): void {\n\t\tconst def = definitions[resolverId];\n\t\tif (!def) return;\n\t\tconst batchConfig = { ...DEFAULT_BATCH, ...def.batch };\n\n\t\tif (!batches.has(resolverId)) {\n\t\t\tbatches.set(resolverId, {\n\t\t\t\tresolverId,\n\t\t\t\trequirements: [],\n\t\t\t\ttimer: null,\n\t\t\t});\n\t\t}\n\n\t\tconst batch = batches.get(resolverId)!;\n\t\tbatch.requirements.push(req);\n\n\t\t// Start or reset timer\n\t\tif (batch.timer) {\n\t\t\tclearTimeout(batch.timer);\n\t\t}\n\n\t\tbatch.timer = setTimeout(() => {\n\t\t\tprocessBatch(resolverId);\n\t\t}, batchConfig.windowMs);\n\t}\n\n\t/** Process a single batch */\n\tfunction processBatch(resolverId: string): void {\n\t\tconst batch = batches.get(resolverId);\n\t\tif (!batch || batch.requirements.length === 0) return;\n\n\t\tconst requirements = [...batch.requirements];\n\t\tbatch.requirements = [];\n\t\tbatch.timer = null;\n\n\t\t// Execute batch\n\t\texecuteBatch(resolverId, requirements).then(() => {\n\t\t\tonResolutionComplete?.();\n\t\t});\n\t}\n\n\tconst manager: ResolversManager<S> = {\n\t\tresolve(req: RequirementWithId): void {\n\t\t\t// Already resolving?\n\t\t\tif (inflight.has(req.id)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Find resolver\n\t\t\tconst resolverId = findResolver(req.requirement);\n\t\t\tif (!resolverId) {\n\t\t\t\tconsole.warn(`[Directive] No resolver found for requirement: ${req.id}`);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst def = definitions[resolverId];\n\t\t\tif (!def) return;\n\n\t\t\t// Check if this is a batched resolver\n\t\t\tif (def.batch?.enabled) {\n\t\t\t\taddToBatch(resolverId, req);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Start resolution\n\t\t\tconst controller = new AbortController();\n\t\t\tconst startedAt = Date.now();\n\n\t\t\tconst state: ResolverState = {\n\t\t\t\trequirementId: req.id,\n\t\t\t\tresolverId,\n\t\t\t\tcontroller,\n\t\t\t\tstartedAt,\n\t\t\t\tattempt: 1,\n\t\t\t\tstatus: {\n\t\t\t\t\tstate: \"pending\",\n\t\t\t\t\trequirementId: req.id,\n\t\t\t\t\tstartedAt,\n\t\t\t\t},\n\t\t\t\toriginalRequirement: req,\n\t\t\t};\n\n\t\t\tinflight.set(req.id, state);\n\t\t\tonStart?.(resolverId, req);\n\n\t\t\t// Execute asynchronously\n\t\t\texecuteResolve(resolverId, req, controller)\n\t\t\t\t.finally(() => {\n\t\t\t\t\t// Only fire onResolutionComplete if we're the first to clean up.\n\t\t\t\t\t// If cancel() already removed us from inflight, skip to avoid\n\t\t\t\t\t// spurious double-notifications.\n\t\t\t\t\tconst wasInflight = inflight.delete(req.id);\n\t\t\t\t\tif (wasInflight) {\n\t\t\t\t\t\tonResolutionComplete?.();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t},\n\n\t\tcancel(requirementId: string): void {\n\t\t\tconst state = inflight.get(requirementId);\n\t\t\tif (!state) return;\n\n\t\t\tstate.controller.abort();\n\t\t\tinflight.delete(requirementId);\n\n\t\t\tstatuses.set(requirementId, {\n\t\t\t\tstate: \"canceled\",\n\t\t\t\trequirementId,\n\t\t\t\tcanceledAt: Date.now(),\n\t\t\t});\n\t\t\tcleanupStatuses();\n\n\t\t\tonCancel?.(state.resolverId, state.originalRequirement);\n\t\t},\n\n\t\tcancelAll(): void {\n\t\t\tfor (const [id] of inflight) {\n\t\t\t\tthis.cancel(id);\n\t\t\t}\n\n\t\t\t// Clear batches\n\t\t\tfor (const batch of batches.values()) {\n\t\t\t\tif (batch.timer) {\n\t\t\t\t\tclearTimeout(batch.timer);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbatches.clear();\n\t\t},\n\n\t\tgetStatus(requirementId: string): ResolverStatus {\n\t\t\t// Check inflight first\n\t\t\tconst state = inflight.get(requirementId);\n\t\t\tif (state) {\n\t\t\t\treturn state.status;\n\t\t\t}\n\n\t\t\t// Check completed statuses\n\t\t\tconst status = statuses.get(requirementId);\n\t\t\tif (status) {\n\t\t\t\treturn status;\n\t\t\t}\n\n\t\t\treturn { state: \"idle\" };\n\t\t},\n\n\t\tgetInflight(): string[] {\n\t\t\treturn [...inflight.keys()];\n\t\t},\n\n\t\tgetInflightInfo(): InflightInfo[] {\n\t\t\treturn [...inflight.values()].map((state) => ({\n\t\t\t\tid: state.requirementId,\n\t\t\t\tresolverId: state.resolverId,\n\t\t\t\tstartedAt: state.startedAt,\n\t\t\t}));\n\t\t},\n\n\t\tisResolving(requirementId: string): boolean {\n\t\t\treturn inflight.has(requirementId);\n\t\t},\n\n\t\tprocessBatches(): void {\n\t\t\tfor (const resolverId of batches.keys()) {\n\t\t\t\tprocessBatch(resolverId);\n\t\t\t}\n\t\t},\n\n\t\tregisterDefinitions(newDefs: ResolversDef<Schema>): void {\n\t\t\tfor (const [key, def] of Object.entries(newDefs)) {\n\t\t\t\t(definitions as Record<string, unknown>)[key] = def;\n\t\t\t}\n\t\t\t// Clear the resolver-by-type cache so new resolvers are discovered\n\t\t\tresolversByType.clear();\n\t\t},\n\t};\n\n\treturn manager;\n}\n","/**\n * Time-Travel Debugging - Snapshot-based state history\n *\n * Features:\n * - Ring buffer of state snapshots\n * - Go back/forward through history\n * - Replay from any snapshot\n * - Export/import state history\n */\n\nimport type { DebugConfig, Facts, FactsStore, Schema, Snapshot, TimeTravelAPI } from \"../core/types.js\";\nimport { isPrototypeSafe } from \"./utils.js\";\n\n// ============================================================================\n// Time-Travel Manager\n// ============================================================================\n\n/** A changeset groups multiple snapshots into a single undo/redo unit. */\nexport interface Changeset {\n\tlabel: string;\n\tstartIndex: number;\n\tendIndex: number;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport interface TimeTravelManager<_S extends Schema> extends TimeTravelAPI {\n\t/** Take a snapshot of current state */\n\ttakeSnapshot(trigger: string): Snapshot;\n\t/** Restore facts from a snapshot */\n\trestore(snapshot: Snapshot): void;\n\t/** Check if time-travel is enabled */\n\treadonly isEnabled: boolean;\n\t/** True while restoring a snapshot (engine should skip reconciliation) */\n\treadonly isRestoring: boolean;\n\t/** Pause snapshot taking */\n\tpause(): void;\n\t/** Resume snapshot taking */\n\tresume(): void;\n}\n\n/** Options for creating a time-travel manager */\nexport interface CreateTimeTravelOptions<S extends Schema> {\n\tconfig: DebugConfig;\n\tfacts: Facts<S>;\n\tstore: FactsStore<S>;\n\t/** Callback when a snapshot is taken */\n\tonSnapshot?: (snapshot: Snapshot) => void;\n\t/** Callback when time-travel occurs */\n\tonTimeTravel?: (from: number, to: number) => void;\n}\n\n/**\n * Create a snapshot-based time-travel debugger with a ring buffer of state\n * history.\n *\n * Snapshots are taken automatically after fact changes (during\n * reconciliation) and can be navigated with `goBack`/`goForward`/`goTo`.\n * Changesets group multiple snapshots into a single undo/redo unit.\n * The entire history can be exported to JSON and re-imported for\n * cross-session debugging.\n *\n * @param options - Debug config (maxSnapshots, timeTravel flag), facts proxy, store, and snapshot/time-travel callbacks\n * @returns A `TimeTravelManager` with takeSnapshot/restore/goBack/goForward/goTo/replay/export/import and changeset methods\n */\nexport function createTimeTravelManager<S extends Schema>(\n\toptions: CreateTimeTravelOptions<S>,\n): TimeTravelManager<S> {\n\tconst { config, facts, store, onSnapshot, onTimeTravel } = options;\n\n\tconst isEnabled = config.timeTravel ?? false;\n\tconst maxSnapshots = config.maxSnapshots ?? 100;\n\n\t// Ring buffer of snapshots\n\tconst snapshots: Snapshot[] = [];\n\tlet currentIndex = -1;\n\tlet nextId = 1;\n\tlet paused = false;\n\tlet restoring = false;\n\n\t// Changeset tracking\n\tconst changesets: Changeset[] = [];\n\tlet pendingChangesetLabel: string | null = null;\n\tlet pendingChangesetStart = -1;\n\n\t/** Get current facts as a plain object */\n\tfunction getCurrentFacts(): Record<string, unknown> {\n\t\treturn store.toObject();\n\t}\n\n\t/** Serialize facts to a snapshot-friendly format */\n\tfunction serializeFacts(): Record<string, unknown> {\n\t\tconst factsObj = getCurrentFacts();\n\n\t\t// Deep clone to prevent mutation\n\t\treturn structuredClone(factsObj);\n\t}\n\n\t/** Deserialize and restore facts from a snapshot */\n\tfunction deserializeFacts(serialized: Record<string, unknown>): void {\n\t\t// Validate entire object tree for prototype pollution\n\t\tif (!isPrototypeSafe(serialized)) {\n\t\t\tconsole.error(\"[Directive] Potential prototype pollution detected in snapshot data, skipping restore\");\n\t\t\treturn;\n\t\t}\n\n\t\tstore.batch(() => {\n\t\t\tfor (const [key, value] of Object.entries(serialized)) {\n\t\t\t\t// Prototype pollution protection (redundant but defensive)\n\t\t\t\tif (key === \"__proto__\" || key === \"constructor\" || key === \"prototype\") {\n\t\t\t\t\tconsole.warn(`[Directive] Skipping dangerous key \"${key}\" during fact restoration`);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t// @ts-expect-error - dynamic key access\n\t\t\t\tfacts[key] = value;\n\t\t\t}\n\t\t});\n\t}\n\n\tconst manager: TimeTravelManager<S> = {\n\t\tget isEnabled() {\n\t\t\treturn isEnabled;\n\t\t},\n\n\t\tget isRestoring() {\n\t\t\treturn restoring;\n\t\t},\n\n\t\tget isPaused() {\n\t\t\treturn paused;\n\t\t},\n\n\t\tget snapshots() {\n\t\t\treturn [...snapshots];\n\t\t},\n\n\t\tget currentIndex() {\n\t\t\treturn currentIndex;\n\t\t},\n\n\t\ttakeSnapshot(trigger: string): Snapshot {\n\t\t\tif (!isEnabled || paused) {\n\t\t\t\treturn { id: -1, timestamp: Date.now(), facts: {}, trigger };\n\t\t\t}\n\n\t\t\tconst snapshot: Snapshot = {\n\t\t\t\tid: nextId++,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\tfacts: serializeFacts(),\n\t\t\t\ttrigger,\n\t\t\t};\n\n\t\t\t// If we're not at the end, truncate future snapshots\n\t\t\tif (currentIndex < snapshots.length - 1) {\n\t\t\t\tsnapshots.splice(currentIndex + 1);\n\t\t\t}\n\n\t\t\t// Add new snapshot\n\t\t\tsnapshots.push(snapshot);\n\t\t\tcurrentIndex = snapshots.length - 1;\n\n\t\t\t// Enforce max size (ring buffer)\n\t\t\twhile (snapshots.length > maxSnapshots) {\n\t\t\t\tsnapshots.shift();\n\t\t\t\tcurrentIndex--;\n\t\t\t}\n\n\t\t\tonSnapshot?.(snapshot);\n\t\t\treturn snapshot;\n\t\t},\n\n\t\trestore(snapshot: Snapshot): void {\n\t\t\tif (!isEnabled) return;\n\n\t\t\t// Set restoring flag so the engine skips reconciliation scheduling.\n\t\t\t// The restored state is already \"reconciled\" — it was captured after\n\t\t\t// a complete reconcile cycle. Re-reconciling would create spurious\n\t\t\t// snapshots that break undo/redo navigation.\n\t\t\tpaused = true;\n\t\t\trestoring = true;\n\n\t\t\ttry {\n\t\t\t\tdeserializeFacts(snapshot.facts);\n\t\t\t} finally {\n\t\t\t\tpaused = false;\n\t\t\t\trestoring = false;\n\t\t\t}\n\t\t},\n\n\t\tgoBack(steps = 1): void {\n\t\t\tif (!isEnabled || snapshots.length === 0) return;\n\n\t\t\tconst fromIndex = currentIndex;\n\n\t\t\t// Check if we're inside a changeset — jump to its start\n\t\t\tlet toIndex = currentIndex;\n\t\t\tconst cs = changesets.find((c) => currentIndex > c.startIndex && currentIndex <= c.endIndex);\n\t\t\tif (cs) {\n\t\t\t\ttoIndex = cs.startIndex;\n\t\t\t} else {\n\t\t\t\t// Check if we're at the end of a changeset — jump past its start\n\t\t\t\tconst prevCs = changesets.find((c) => currentIndex === c.startIndex);\n\t\t\t\tif (prevCs) {\n\t\t\t\t\t// We're at the boundary. Look for the changeset before this one.\n\t\t\t\t\tconst earlierCs = changesets.find((c) => c.endIndex < currentIndex && currentIndex - c.endIndex <= steps);\n\t\t\t\t\ttoIndex = earlierCs ? earlierCs.startIndex : Math.max(0, currentIndex - steps);\n\t\t\t\t} else {\n\t\t\t\t\ttoIndex = Math.max(0, currentIndex - steps);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (fromIndex === toIndex) return;\n\n\t\t\tcurrentIndex = toIndex;\n\t\t\tconst snapshot = snapshots[currentIndex];\n\t\t\tif (snapshot) {\n\t\t\t\tthis.restore(snapshot);\n\t\t\t\tonTimeTravel?.(fromIndex, toIndex);\n\t\t\t}\n\t\t},\n\n\t\tgoForward(steps = 1): void {\n\t\t\tif (!isEnabled || snapshots.length === 0) return;\n\n\t\t\tconst fromIndex = currentIndex;\n\n\t\t\t// Check if we're inside or at the start of a changeset — jump to its end\n\t\t\tlet toIndex = currentIndex;\n\t\t\tconst cs = changesets.find((c) => currentIndex >= c.startIndex && currentIndex < c.endIndex);\n\t\t\tif (cs) {\n\t\t\t\ttoIndex = cs.endIndex;\n\t\t\t} else {\n\t\t\t\ttoIndex = Math.min(snapshots.length - 1, currentIndex + steps);\n\t\t\t}\n\n\t\t\tif (fromIndex === toIndex) return;\n\n\t\t\tcurrentIndex = toIndex;\n\t\t\tconst snapshot = snapshots[currentIndex];\n\t\t\tif (snapshot) {\n\t\t\t\tthis.restore(snapshot);\n\t\t\t\tonTimeTravel?.(fromIndex, toIndex);\n\t\t\t}\n\t\t},\n\n\t\tgoTo(snapshotId: number): void {\n\t\t\tif (!isEnabled) return;\n\n\t\t\tconst index = snapshots.findIndex((s) => s.id === snapshotId);\n\t\t\tif (index === -1) {\n\t\t\t\tconsole.warn(`[Directive] Snapshot ${snapshotId} not found`);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst fromIndex = currentIndex;\n\t\t\tcurrentIndex = index;\n\t\t\tconst snapshot = snapshots[currentIndex];\n\t\t\tif (snapshot) {\n\t\t\t\tthis.restore(snapshot);\n\t\t\t\tonTimeTravel?.(fromIndex, index);\n\t\t\t}\n\t\t},\n\n\t\treplay(): void {\n\t\t\tif (!isEnabled || snapshots.length === 0) return;\n\n\t\t\t// Start from the beginning\n\t\t\tcurrentIndex = 0;\n\t\t\tconst snapshot = snapshots[0];\n\t\t\tif (snapshot) {\n\t\t\t\tthis.restore(snapshot);\n\t\t\t}\n\t\t},\n\n\t\texport(): string {\n\t\t\treturn JSON.stringify({\n\t\t\t\tversion: 1,\n\t\t\t\tsnapshots,\n\t\t\t\tcurrentIndex,\n\t\t\t});\n\t\t},\n\n\t\timport(json: string): void {\n\t\t\tif (!isEnabled) return;\n\n\t\t\ttry {\n\t\t\t\tconst data = JSON.parse(json);\n\n\t\t\t\t// Validate import data structure to prevent prototype pollution\n\t\t\t\tif (typeof data !== \"object\" || data === null) {\n\t\t\t\t\tthrow new Error(\"Invalid time-travel data: expected object\");\n\t\t\t\t}\n\t\t\t\tif (data.version !== 1) {\n\t\t\t\t\tthrow new Error(`Unsupported time-travel export version: ${data.version}`);\n\t\t\t\t}\n\t\t\t\tif (!Array.isArray(data.snapshots)) {\n\t\t\t\t\tthrow new Error(\"Invalid time-travel data: snapshots must be an array\");\n\t\t\t\t}\n\t\t\t\tif (typeof data.currentIndex !== \"number\") {\n\t\t\t\t\tthrow new Error(\"Invalid time-travel data: currentIndex must be a number\");\n\t\t\t\t}\n\n\t\t\t\t// Validate each snapshot has required properties\n\t\t\t\tfor (const snap of data.snapshots) {\n\t\t\t\t\tif (typeof snap !== \"object\" || snap === null) {\n\t\t\t\t\t\tthrow new Error(\"Invalid snapshot: expected object\");\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof snap.id !== \"number\" || typeof snap.timestamp !== \"number\" ||\n\t\t\t\t\t\ttypeof snap.trigger !== \"string\" || typeof snap.facts !== \"object\") {\n\t\t\t\t\t\tthrow new Error(\"Invalid snapshot structure\");\n\t\t\t\t\t}\n\t\t\t\t\t// Deep check for prototype pollution attacks (including nested objects)\n\t\t\t\t\tif (!isPrototypeSafe(snap.facts)) {\n\t\t\t\t\t\tthrow new Error(\"Invalid fact data: potential prototype pollution detected in nested objects\");\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tsnapshots.length = 0;\n\t\t\t\tsnapshots.push(...data.snapshots);\n\t\t\t\tcurrentIndex = data.currentIndex;\n\n\t\t\t\t// Restore current state\n\t\t\t\tconst snapshot = snapshots[currentIndex];\n\t\t\t\tif (snapshot) {\n\t\t\t\t\tthis.restore(snapshot);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(\"[Directive] Failed to import time-travel data:\", error);\n\t\t\t}\n\t\t},\n\n\t\tbeginChangeset(label: string): void {\n\t\t\tif (!isEnabled) return;\n\t\t\tpendingChangesetLabel = label;\n\t\t\tpendingChangesetStart = currentIndex;\n\t\t},\n\n\t\tendChangeset(): void {\n\t\t\tif (!isEnabled || pendingChangesetLabel === null) return;\n\t\t\tif (currentIndex > pendingChangesetStart) {\n\t\t\t\tchangesets.push({\n\t\t\t\t\tlabel: pendingChangesetLabel,\n\t\t\t\t\tstartIndex: pendingChangesetStart,\n\t\t\t\t\tendIndex: currentIndex,\n\t\t\t\t});\n\t\t\t}\n\t\t\tpendingChangesetLabel = null;\n\t\t\tpendingChangesetStart = -1;\n\t\t},\n\n\t\tpause(): void {\n\t\t\tpaused = true;\n\t\t},\n\n\t\tresume(): void {\n\t\t\tpaused = false;\n\t\t},\n\t};\n\n\treturn manager;\n}\n\n/**\n * Create a no-op time-travel manager used when `debug.timeTravel` is\n * disabled. All methods are safe to call but perform no work.\n *\n * @returns A `TimeTravelManager` where every method is a no-op and `isEnabled` is `false`\n */\nexport function createDisabledTimeTravel<S extends Schema>(): TimeTravelManager<S> {\n\tconst noopSnapshot: Snapshot = { id: -1, timestamp: 0, facts: {}, trigger: \"\" };\n\n\treturn {\n\t\tisEnabled: false,\n\t\tisRestoring: false,\n\t\tisPaused: false,\n\t\tsnapshots: [],\n\t\tcurrentIndex: -1,\n\t\ttakeSnapshot: () => noopSnapshot,\n\t\trestore: () => {},\n\t\tgoBack: () => {},\n\t\tgoForward: () => {},\n\t\tgoTo: () => {},\n\t\treplay: () => {},\n\t\texport: () => \"{}\",\n\t\timport: () => {},\n\t\tbeginChangeset: () => {},\n\t\tendChangeset: () => {},\n\t\tpause: () => {},\n\t\tresume: () => {},\n\t};\n}\n","/**\n * Engine - The core reconciliation loop\n *\n * The engine orchestrates:\n * 1. Fact changes trigger reconciliation\n * 2. Constraints produce requirements\n * 3. Resolvers fulfill requirements\n * 4. Effects run after stabilization\n * 5. Derivations are invalidated and recomputed\n */\n\nimport { createConstraintsManager, type ConstraintsManager } from \"./constraints.js\";\nimport { createDerivationsManager, type DerivationsManager } from \"./derivations.js\";\nimport { createEffectsManager, type EffectsManager } from \"./effects.js\";\nimport { createErrorBoundaryManager, type ErrorBoundaryManager } from \"./errors.js\";\nimport { createFacts } from \"./facts.js\";\nimport { createPluginManager, type PluginManager } from \"./plugins.js\";\nimport { RequirementSet } from \"./requirements.js\";\nimport { createResolversManager, type ResolversManager } from \"./resolvers.js\";\nimport { createDisabledTimeTravel, createTimeTravelManager, type TimeTravelManager } from \"../utils/time-travel.js\";\nimport { isPrototypeSafe, hashObject } from \"../utils/utils.js\";\n\n// Blocked properties for prototype pollution protection\nconst BLOCKED_PROPS = new Set([\"__proto__\", \"constructor\", \"prototype\"]);\nimport type {\n\tConstraintsDef,\n\tDerivationsDef,\n\tEffectsDef,\n\tEventsDef,\n\tFactsSnapshot,\n\tInferSchema,\n\tReconcileResult,\n\tResolversDef,\n\tSchema,\n\tSystem,\n\tSystemConfig,\n\tSystemEvent,\n\tSystemInspection,\n} from \"./types.js\";\n\n// ============================================================================\n// Engine Implementation\n// ============================================================================\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\ninterface EngineState<_S extends Schema> {\n\tisRunning: boolean;\n\tisReconciling: boolean;\n\treconcileScheduled: boolean;\n\tisInitializing: boolean;\n\tisInitialized: boolean;\n\tisReady: boolean;\n\tisDestroyed: boolean;\n\tchangedKeys: Set<string>;\n\tpreviousRequirements: RequirementSet;\n\treadyPromise: Promise<void> | null;\n\treadyResolve: (() => void) | null;\n}\n\n/**\n * Create the core Directive reconciliation engine that wires facts, derivations,\n * effects, constraints, resolvers, plugins, error boundaries, and time-travel\n * into a single reactive system.\n *\n * This is the internal factory used by `createSystem`. Most users should call\n * `createSystem` instead, which provides a friendlier API and handles module\n * composition.\n *\n * @param config - Full system configuration: modules, plugins, error boundary settings, and debug options\n * @returns A `System` instance with facts, derive, events, dispatch, subscribe, watch, settle, and lifecycle methods\n *\n * @example\n * ```ts\n * // Prefer createSystem for most use cases:\n * import { createSystem, createModule, t } from \"@directive-run/core\";\n *\n * const counter = createModule(\"counter\", {\n * schema: { count: t.number() },\n * init: (facts) => { facts.count = 0; },\n * });\n *\n * const system = createSystem({ module: counter });\n * system.start();\n * system.facts.count = 42;\n * ```\n */\n// biome-ignore lint/suspicious/noExplicitAny: Engine uses flat schema internally, public API uses ModuleSchema\nexport function createEngine<S extends Schema>(\n\tconfig: SystemConfig<any>,\n): System<any> {\n\t// Merge all module definitions with collision detection\n\t// Use Object.create(null) to prevent prototype chain traversal (e.g., \"toString\" in mergedEvents)\n\tconst mergedSchema = Object.create(null) as S;\n\tconst mergedEvents: EventsDef<S> = Object.create(null);\n\tconst mergedDerive: DerivationsDef<S> = Object.create(null);\n\tconst mergedEffects: EffectsDef<S> = Object.create(null);\n\tconst mergedConstraints: ConstraintsDef<S> = Object.create(null);\n\tconst mergedResolvers: ResolversDef<S> = Object.create(null);\n\n\t// Track which module defined each key for collision detection\n\tconst schemaOwners = new Map<string, string>();\n\n\tfor (const module of config.modules) {\n\t\t// Security: Validate module definitions for dangerous keys\n\t\t// Always run in all environments — this is a security boundary, not a dev convenience\n\t\tconst validateKeys = (obj: object | undefined, section: string) => {\n\t\t\tif (!obj) return;\n\t\t\tfor (const key of Object.keys(obj)) {\n\t\t\t\tif (BLOCKED_PROPS.has(key)) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`[Directive] Security: Module \"${module.id}\" has dangerous key \"${key}\" in ${section}. ` +\n\t\t\t\t\t\t\t`This could indicate a prototype pollution attempt.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tvalidateKeys(module.schema, \"schema\");\n\t\tvalidateKeys(module.events, \"events\");\n\t\tvalidateKeys(module.derive, \"derive\");\n\t\tvalidateKeys(module.effects, \"effects\");\n\t\tvalidateKeys(module.constraints, \"constraints\");\n\t\tvalidateKeys(module.resolvers, \"resolvers\");\n\n\t\t// Check for schema collisions\n\t\tif (process.env.NODE_ENV !== \"production\") {\n\t\t\tfor (const key of Object.keys(module.schema)) {\n\t\t\t\tconst existingOwner = schemaOwners.get(key);\n\t\t\t\tif (existingOwner) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`[Directive] Schema collision: Fact \"${key}\" is defined in both module \"${existingOwner}\" and \"${module.id}\". ` +\n\t\t\t\t\t\t\t`Use namespacing (e.g., \"${module.id}::${key}\") or merge into one module.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tschemaOwners.set(key, module.id);\n\t\t\t}\n\t\t}\n\n\t\tObject.assign(mergedSchema, module.schema);\n\t\tif (module.events) Object.assign(mergedEvents, module.events);\n\t\tif (module.derive) Object.assign(mergedDerive, module.derive);\n\t\tif (module.effects) Object.assign(mergedEffects, module.effects);\n\t\tif (module.constraints) Object.assign(mergedConstraints, module.constraints);\n\t\tif (module.resolvers) Object.assign(mergedResolvers, module.resolvers);\n\t}\n\n\t// Build snapshotEventNames: Set<string> | null\n\t// If any module declares snapshotEvents, build the filter set.\n\t// Modules WITHOUT snapshotEvents have all their events added (they still snapshot).\n\tlet snapshotEventNames: Set<string> | null = null;\n\t// biome-ignore lint/suspicious/noExplicitAny: Module may have snapshotEvents at runtime\n\tconst hasAnySnapshotEvents = config.modules.some((m: any) => m.snapshotEvents);\n\tif (hasAnySnapshotEvents) {\n\t\tsnapshotEventNames = new Set<string>();\n\t\tfor (const module of config.modules) {\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Module may have snapshotEvents at runtime\n\t\t\tconst mod = module as any;\n\t\t\tif (mod.snapshotEvents) {\n\t\t\t\tfor (const eventName of mod.snapshotEvents) {\n\t\t\t\t\tsnapshotEventNames.add(eventName);\n\t\t\t\t}\n\t\t\t} else if (mod.events) {\n\t\t\t\t// No filter — all events from this module create snapshots\n\t\t\t\tfor (const eventName of Object.keys(mod.events)) {\n\t\t\t\t\tsnapshotEventNames.add(eventName);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Snapshot intent flags — track whether the current change batch should create a snapshot\n\tlet dispatchDepth = 0;\n\tlet shouldTakeSnapshot = false;\n\n\t// Dev-mode: Warn if a fact and derivation share the same name\n\tif (process.env.NODE_ENV !== \"production\") {\n\t\tconst derivationNames = new Set(Object.keys(mergedDerive));\n\t\tfor (const key of Object.keys(mergedSchema)) {\n\t\t\tif (derivationNames.has(key)) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`[Directive] \"${key}\" exists as both a fact and a derivation. ` +\n\t\t\t\t\t`This may cause unexpected dependency tracking behavior.`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Create plugin manager\n\tconst pluginManager: PluginManager<S> = createPluginManager();\n\tfor (const plugin of config.plugins ?? []) {\n\t\tpluginManager.register(plugin);\n\t}\n\n\t// Create error boundary\n\tconst errorBoundary: ErrorBoundaryManager = createErrorBoundaryManager({\n\t\tconfig: config.errorBoundary,\n\t\tonError: (error) => pluginManager.emitError(error),\n\t\tonRecovery: (error, strategy) => pluginManager.emitErrorRecovery(error, strategy),\n\t});\n\n\t// Create facts store and proxy\n\t// Note: We need to create a local invalidate function that will be set after derivationsManager is created\n\tlet invalidateDerivation: (key: string) => void = () => {};\n\tlet invalidateManyDerivations: (keys: string[]) => void = () => {};\n\n\t// Forward-declared so onChange/onBatch closures can check isRestoring.\n\t// Assigned after createTimeTravelManager() below.\n\tlet timeTravelRef: TimeTravelManager<S> | null = null;\n\n\tconst { store, facts } = createFacts<S>({\n\t\tschema: mergedSchema,\n\t\tonChange: (key, value, prev) => {\n\t\t\tpluginManager.emitFactSet(key, value, prev);\n\t\t\t// Invalidate derivations so they recompute on read\n\t\t\tinvalidateDerivation(key);\n\t\t\t// During time-travel restore, skip change tracking and reconciliation.\n\t\t\t// The restored state is already reconciled; re-reconciling would create\n\t\t\t// spurious snapshots that break undo/redo.\n\t\t\tif (timeTravelRef?.isRestoring) return;\n\t\t\t// Direct fact mutations (outside event dispatch) always create snapshots\n\t\t\tif (dispatchDepth === 0) {\n\t\t\t\tshouldTakeSnapshot = true;\n\t\t\t}\n\t\t\tstate.changedKeys.add(key);\n\t\t\tscheduleReconcile();\n\t\t},\n\t\tonBatch: (changes) => {\n\t\t\tpluginManager.emitFactsBatch(changes);\n\t\t\tconst keys: string[] = [];\n\t\t\tfor (const change of changes) {\n\t\t\t\tkeys.push(change.key);\n\t\t\t}\n\t\t\t// Invalidate all affected derivations at once — listeners fire only\n\t\t\t// after ALL keys are invalidated, so they see consistent state.\n\t\t\tinvalidateManyDerivations(keys);\n\t\t\t// During time-travel restore, skip change tracking and reconciliation.\n\t\t\tif (timeTravelRef?.isRestoring) return;\n\t\t\t// Resolver/effect batches (outside event dispatch) always create snapshots\n\t\t\tif (dispatchDepth === 0) {\n\t\t\t\tshouldTakeSnapshot = true;\n\t\t\t}\n\t\t\tfor (const change of changes) {\n\t\t\t\tstate.changedKeys.add(change.key);\n\t\t\t}\n\t\t\tscheduleReconcile();\n\t\t},\n\t});\n\n\t// Create derivations manager\n\tconst derivationsManager: DerivationsManager<S, DerivationsDef<S>> = createDerivationsManager({\n\t\tdefinitions: mergedDerive,\n\t\tfacts,\n\t\tstore,\n\t\tonCompute: (id, value, deps) => pluginManager.emitDerivationCompute(id, value, deps),\n\t\tonInvalidate: (id) => pluginManager.emitDerivationInvalidate(id),\n\t\tonError: (id, error) => {\n\t\t\terrorBoundary.handleError(\"derivation\", id, error);\n\t\t},\n\t});\n\n\t// Now wire up derivation invalidation\n\tinvalidateDerivation = (key: string) => derivationsManager.invalidate(key);\n\tinvalidateManyDerivations = (keys: string[]) => derivationsManager.invalidateMany(keys);\n\n\t// Create effects manager\n\tconst effectsManager: EffectsManager<S> = createEffectsManager({\n\t\tdefinitions: mergedEffects,\n\t\tfacts,\n\t\tstore,\n\t\tonRun: (id) => pluginManager.emitEffectRun(id),\n\t\tonError: (id, error) => {\n\t\t\terrorBoundary.handleError(\"effect\", id, error);\n\t\t\tpluginManager.emitEffectError(id, error);\n\t\t},\n\t});\n\n\t// Create constraints manager\n\tconst constraintsManager: ConstraintsManager<S> = createConstraintsManager({\n\t\tdefinitions: mergedConstraints,\n\t\tfacts,\n\t\tonEvaluate: (id, active) => pluginManager.emitConstraintEvaluate(id, active),\n\t\tonError: (id, error) => {\n\t\t\terrorBoundary.handleError(\"constraint\", id, error);\n\t\t\tpluginManager.emitConstraintError(id, error);\n\t\t},\n\t});\n\n\t// Create resolvers manager\n\tconst resolversManager: ResolversManager<S> = createResolversManager({\n\t\tdefinitions: mergedResolvers,\n\t\tfacts,\n\t\tstore,\n\t\tonStart: (resolver, req) => pluginManager.emitResolverStart(resolver, req),\n\t\tonComplete: (resolver, req, duration) => {\n\t\t\tpluginManager.emitResolverComplete(resolver, req, duration);\n\t\t\tpluginManager.emitRequirementMet(req, resolver);\n\t\t\t// Mark the constraint as resolved for `after` ordering\n\t\t\tconstraintsManager.markResolved(req.fromConstraint);\n\t\t},\n\t\tonError: (resolver, req, error) => {\n\t\t\terrorBoundary.handleError(\"resolver\", resolver, error, req);\n\t\t\tpluginManager.emitResolverError(resolver, req, error);\n\t\t},\n\t\tonRetry: (resolver, req, attempt) => pluginManager.emitResolverRetry(resolver, req, attempt),\n\t\tonCancel: (resolver, req) => {\n\t\t\tpluginManager.emitResolverCancel(resolver, req);\n\t\t\tpluginManager.emitRequirementCanceled(req);\n\t\t},\n\t\tonResolutionComplete: () => {\n\t\t\t// After a resolver completes, schedule another reconcile\n\t\t\tnotifySettlementChange();\n\t\t\tscheduleReconcile();\n\t\t},\n\t});\n\n\t// Time-travel listeners — notified when snapshot state changes\n\tconst timeTravelListeners = new Set<() => void>();\n\n\tfunction notifyTimeTravelChange(): void {\n\t\tfor (const listener of timeTravelListeners) {\n\t\t\tlistener();\n\t\t}\n\t}\n\n\t// Create time-travel manager\n\tconst timeTravelManager: TimeTravelManager<S> = config.debug?.timeTravel\n\t\t? createTimeTravelManager({\n\t\t\t\tconfig: config.debug,\n\t\t\t\tfacts,\n\t\t\t\tstore,\n\t\t\t\tonSnapshot: (snapshot) => {\n\t\t\t\t\tpluginManager.emitSnapshot(snapshot);\n\t\t\t\t\tnotifyTimeTravelChange();\n\t\t\t\t},\n\t\t\t\tonTimeTravel: (from, to) => {\n\t\t\t\t\tpluginManager.emitTimeTravel(from, to);\n\t\t\t\t\tnotifyTimeTravelChange();\n\t\t\t\t},\n\t\t\t})\n\t\t: createDisabledTimeTravel();\n\ttimeTravelRef = timeTravelManager;\n\n\t// Settlement listeners — notified when isSettled may have changed\n\tconst settlementListeners = new Set<() => void>();\n\n\tfunction notifySettlementChange(): void {\n\t\tfor (const listener of settlementListeners) {\n\t\t\tlistener();\n\t\t}\n\t}\n\n\t// Reconcile depth guard — prevents runaway reconcile → scheduleReconcile chains\n\tconst MAX_RECONCILE_DEPTH = 50;\n\tlet reconcileDepth = 0;\n\n\t// Engine state\n\tconst state: EngineState<S> = {\n\t\tisRunning: false,\n\t\tisReconciling: false,\n\t\treconcileScheduled: false,\n\t\tisInitializing: false,\n\t\tisInitialized: false,\n\t\tisReady: false,\n\t\tisDestroyed: false,\n\t\tchangedKeys: new Set(),\n\t\tpreviousRequirements: new RequirementSet(),\n\t\treadyPromise: null,\n\t\treadyResolve: null,\n\t};\n\n\t/** Schedule a reconciliation on the next microtask */\n\tfunction scheduleReconcile(): void {\n\t\t// Suppress reconciliation during initialization phase\n\t\tif (!state.isRunning || state.reconcileScheduled || state.isInitializing) return;\n\n\t\tstate.reconcileScheduled = true;\n\t\tnotifySettlementChange();\n\t\tqueueMicrotask(() => {\n\t\t\tstate.reconcileScheduled = false;\n\t\t\tif (state.isRunning && !state.isInitializing) {\n\t\t\t\t// Await reconcile to prevent race conditions\n\t\t\t\t// Error is caught inside reconcile, so no need to handle here\n\t\t\t\treconcile().catch((error) => {\n\t\t\t\t\t// Only log unexpected errors (reconcile handles its own errors)\n\t\t\t\t\tif (process.env.NODE_ENV !== \"production\") {\n\t\t\t\t\t\tconsole.error(\"[Directive] Unexpected error in reconcile:\", error);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\t/** The main reconciliation loop */\n\tasync function reconcile(): Promise<void> {\n\t\tif (state.isReconciling) return;\n\n\t\treconcileDepth++;\n\t\tif (reconcileDepth > MAX_RECONCILE_DEPTH) {\n\t\t\tif (process.env.NODE_ENV !== \"production\") {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`[Directive] Reconcile loop exceeded ${MAX_RECONCILE_DEPTH} iterations. ` +\n\t\t\t\t\t`This usually means resolvers are creating circular requirement chains. ` +\n\t\t\t\t\t`Check that resolvers aren't mutating facts that re-trigger their own constraints.`,\n\t\t\t\t);\n\t\t\t}\n\t\t\treconcileDepth = 0;\n\t\t\treturn;\n\t\t}\n\n\t\tstate.isReconciling = true;\n\t\tnotifySettlementChange();\n\n\t\ttry {\n\t\t\t// Take snapshot before reconciliation (respects snapshotEvents filtering)\n\t\t\tif (state.changedKeys.size > 0) {\n\t\t\t\tif (snapshotEventNames === null || shouldTakeSnapshot) {\n\t\t\t\t\ttimeTravelManager.takeSnapshot(`facts-changed:${[...state.changedKeys].join(\",\")}`);\n\t\t\t\t}\n\t\t\t\tshouldTakeSnapshot = false;\n\t\t\t}\n\n\t\t\t// Get snapshot for plugins\n\t\t\tconst snapshot = facts.$snapshot() as FactsSnapshot<S>;\n\t\t\tpluginManager.emitReconcileStart(snapshot);\n\n\t\t\t// Note: Derivations are already invalidated immediately when facts change\n\t\t\t// (in the onChange/onBatch callbacks), so we don't need to do it here\n\n\t\t\t// Run effects for changed keys\n\t\t\tawait effectsManager.runEffects(state.changedKeys);\n\n\t\t\t// Copy changed keys for constraint evaluation before clearing\n\t\t\tconst keysForConstraints = new Set(state.changedKeys);\n\n\t\t\t// Clear changed keys\n\t\t\tstate.changedKeys.clear();\n\n\t\t\t// Evaluate constraints (pass changed keys for incremental evaluation)\n\t\t\tconst currentRequirements = await constraintsManager.evaluate(keysForConstraints);\n\t\t\tconst currentSet = new RequirementSet();\n\t\t\tfor (const req of currentRequirements) {\n\t\t\t\tcurrentSet.add(req);\n\t\t\t\tpluginManager.emitRequirementCreated(req);\n\t\t\t}\n\n\t\t\t// Diff with previous requirements\n\t\t\tconst { added, removed } = currentSet.diff(state.previousRequirements);\n\n\t\t\t// Cancel resolvers for removed requirements\n\t\t\tfor (const req of removed) {\n\t\t\t\tresolversManager.cancel(req.id);\n\t\t\t}\n\n\t\t\t// Start resolvers for new requirements\n\t\t\tfor (const req of added) {\n\t\t\t\tresolversManager.resolve(req);\n\t\t\t}\n\n\t\t\t// Update previous requirements\n\t\t\tstate.previousRequirements = currentSet;\n\n\t\t\t// Build reconcile result\n\t\t\tconst inflightInfo = resolversManager.getInflightInfo();\n\t\t\tconst result: ReconcileResult = {\n\t\t\t\tunmet: currentRequirements.filter((r) => !resolversManager.isResolving(r.id)),\n\t\t\t\tinflight: inflightInfo,\n\t\t\t\tcompleted: [], // Completed resolvers are tracked separately via onComplete callback\n\t\t\t\tcanceled: removed.map((r) => ({\n\t\t\t\t\tid: r.id,\n\t\t\t\t\tresolverId: inflightInfo.find((i) => i.id === r.id)?.resolverId ?? \"unknown\",\n\t\t\t\t})),\n\t\t\t};\n\n\t\t\tpluginManager.emitReconcileEnd(result);\n\n\t\t\t// Mark system as ready after first successful reconcile\n\t\t\tif (!state.isReady) {\n\t\t\t\tstate.isReady = true;\n\t\t\t\tif (state.readyResolve) {\n\t\t\t\t\tstate.readyResolve();\n\t\t\t\t\tstate.readyResolve = null;\n\t\t\t\t}\n\t\t\t}\n\t\t} finally {\n\t\t\tstate.isReconciling = false;\n\n\t\t\t// Schedule next reconcile BEFORE notifying settlement change,\n\t\t\t// so listeners never see a brief isSettled=true flash when\n\t\t\t// more changes are pending.\n\t\t\tif (state.changedKeys.size > 0) {\n\t\t\t\tscheduleReconcile();\n\t\t\t} else if (!state.reconcileScheduled) {\n\t\t\t\t// System has settled — reset depth counter\n\t\t\t\treconcileDepth = 0;\n\t\t\t}\n\n\t\t\tnotifySettlementChange();\n\t\t}\n\t}\n\n\t// Create typed derive accessor using a Proxy\n\tconst deriveAccessor = new Proxy({} as Record<string, unknown>, {\n\t\tget(_, prop: string | symbol) {\n\t\t\tif (typeof prop === \"symbol\") return undefined;\n\t\t\t// Prototype pollution protection\n\t\t\tif (BLOCKED_PROPS.has(prop)) return undefined;\n\t\t\treturn derivationsManager.get(prop as keyof DerivationsDef<S>);\n\t\t},\n\t\thas(_, prop: string | symbol) {\n\t\t\tif (typeof prop === \"symbol\") return false;\n\t\t\t// Prototype pollution protection\n\t\t\tif (BLOCKED_PROPS.has(prop)) return false;\n\t\t\treturn prop in mergedDerive;\n\t\t},\n\t\townKeys() {\n\t\t\treturn Object.keys(mergedDerive);\n\t\t},\n\t\tgetOwnPropertyDescriptor(_, prop: string | symbol) {\n\t\t\tif (typeof prop === \"symbol\") return undefined;\n\t\t\t// Prototype pollution protection\n\t\t\tif (BLOCKED_PROPS.has(prop)) return undefined;\n\t\t\tif (prop in mergedDerive) {\n\t\t\t\treturn { configurable: true, enumerable: true };\n\t\t\t}\n\t\t\treturn undefined;\n\t\t},\n\t});\n\n\t// Create typed events accessor using a Proxy\n\t// This provides system.events.eventName(payload) syntax\n\tconst eventsAccessor = new Proxy({} as Record<string, (payload?: Record<string, unknown>) => void>, {\n\t\tget(_, prop: string | symbol) {\n\t\t\tif (typeof prop === \"symbol\") return undefined;\n\t\t\t// Prototype pollution protection\n\t\t\tif (BLOCKED_PROPS.has(prop)) return undefined;\n\t\t\t// Return a function that dispatches the event\n\t\t\treturn (payload?: Record<string, unknown>) => {\n\t\t\t\tconst handler = mergedEvents[prop];\n\t\t\t\tif (handler) {\n\t\t\t\t\tdispatchDepth++;\n\t\t\t\t\tif (snapshotEventNames === null || snapshotEventNames.has(prop)) {\n\t\t\t\t\t\tshouldTakeSnapshot = true;\n\t\t\t\t\t}\n\t\t\t\t\ttry {\n\t\t\t\t\t\tstore.batch(() => {\n\t\t\t\t\t\t\thandler(facts, { type: prop, ...payload });\n\t\t\t\t\t\t});\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tdispatchDepth--;\n\t\t\t\t\t}\n\t\t\t\t} else if (process.env.NODE_ENV !== \"production\") {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t`[Directive] Unknown event type \"${prop}\". ` +\n\t\t\t\t\t\t\t`No handler is registered for this event. ` +\n\t\t\t\t\t\t\t`Available events: ${Object.keys(mergedEvents).join(\", \") || \"(none)\"}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t};\n\t\t},\n\t\thas(_, prop: string | symbol) {\n\t\t\tif (typeof prop === \"symbol\") return false;\n\t\t\t// Prototype pollution protection\n\t\t\tif (BLOCKED_PROPS.has(prop)) return false;\n\t\t\treturn prop in mergedEvents;\n\t\t},\n\t\townKeys() {\n\t\t\treturn Object.keys(mergedEvents);\n\t\t},\n\t\tgetOwnPropertyDescriptor(_, prop: string | symbol) {\n\t\t\tif (typeof prop === \"symbol\") return undefined;\n\t\t\t// Prototype pollution protection\n\t\t\tif (BLOCKED_PROPS.has(prop)) return undefined;\n\t\t\tif (prop in mergedEvents) {\n\t\t\t\treturn { configurable: true, enumerable: true };\n\t\t\t}\n\t\t\treturn undefined;\n\t\t},\n\t});\n\n\t// Create the system interface\n\t// biome-ignore lint/suspicious/noExplicitAny: Engine uses flat schema internally, public API uses ModuleSchema\n\tconst system: System<any> = {\n\t\tfacts,\n\t\tdebug: timeTravelManager.isEnabled ? timeTravelManager : null,\n\t\tderive: deriveAccessor,\n\t\tevents: eventsAccessor,\n\t\tconstraints: {\n\t\t\tdisable: (id: string) => constraintsManager.disable(id),\n\t\t\tenable: (id: string) => constraintsManager.enable(id),\n\t\t},\n\t\teffects: {\n\t\t\tdisable: (id: string) => effectsManager.disable(id),\n\t\t\tenable: (id: string) => effectsManager.enable(id),\n\t\t\tisEnabled: (id: string) => effectsManager.isEnabled(id),\n\t\t},\n\n\t\tstart(): void {\n\t\t\tif (state.isRunning) return;\n\t\t\tstate.isRunning = true;\n\n\t\t\t// Mark as initializing to suppress reconciliation during module init\n\t\t\tstate.isInitializing = true;\n\n\t\t\t// Initialize modules (reconciliation is suppressed during this phase)\n\t\t\tfor (const module of config.modules) {\n\t\t\t\tif (module.init) {\n\t\t\t\t\tstore.batch(() => {\n\t\t\t\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Engine internal type coercion\n\t\t\t\t\t\tmodule.init!(facts as any);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Call module hooks\n\t\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Engine internal type coercion\n\t\t\t\tmodule.hooks?.onStart?.(system as any);\n\t\t\t}\n\n\t\t\t// Apply initialFacts/hydrate via callback (still in init phase)\n\t\t\t// This ensures initialFacts are applied AFTER module init but BEFORE reconcile\n\t\t\tif (config.onAfterModuleInit) {\n\t\t\t\tstore.batch(() => {\n\t\t\t\t\tconfig.onAfterModuleInit!();\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Mark initialization complete\n\t\t\tstate.isInitializing = false;\n\t\t\tstate.isInitialized = true;\n\n\t\t\t// Emit start event\n\t\t\tpluginManager.emitStart(system);\n\n\t\t\t// Initial reconcile (now that all modules are initialized)\n\t\t\tscheduleReconcile();\n\t\t},\n\n\t\tstop(): void {\n\t\t\tif (!state.isRunning) return;\n\t\t\tstate.isRunning = false;\n\n\t\t\t// Cancel all resolvers\n\t\t\tresolversManager.cancelAll();\n\n\t\t\t// Run all effect cleanups\n\t\t\teffectsManager.cleanupAll();\n\n\t\t\t// Call module hooks\n\t\t\tfor (const module of config.modules) {\n\t\t\t\tmodule.hooks?.onStop?.(system);\n\t\t\t}\n\n\t\t\t// Emit stop event\n\t\t\tpluginManager.emitStop(system);\n\t\t},\n\n\t\tdestroy(): void {\n\t\t\tthis.stop();\n\t\t\tstate.isDestroyed = true;\n\t\t\tsettlementListeners.clear();\n\t\t\ttimeTravelListeners.clear();\n\t\t\tpluginManager.emitDestroy(system);\n\t\t},\n\n\t\tdispatch(event: SystemEvent): void {\n\t\t\tif (BLOCKED_PROPS.has(event.type)) return;\n\t\t\tconst handler = mergedEvents[event.type];\n\t\t\tif (handler) {\n\t\t\t\tdispatchDepth++;\n\t\t\t\tif (snapshotEventNames === null || snapshotEventNames.has(event.type)) {\n\t\t\t\t\tshouldTakeSnapshot = true;\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tstore.batch(() => {\n\t\t\t\t\t\thandler(facts, event);\n\t\t\t\t\t});\n\t\t\t\t} finally {\n\t\t\t\t\tdispatchDepth--;\n\t\t\t\t}\n\t\t\t} else if (process.env.NODE_ENV !== \"production\") {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`[Directive] Unknown event type \"${event.type}\". ` +\n\t\t\t\t\t\t`No handler is registered for this event. ` +\n\t\t\t\t\t\t`Available events: ${Object.keys(mergedEvents).join(\", \") || \"(none)\"}`,\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\n\t\tread<T = unknown>(derivationId: string): T {\n\t\t\treturn derivationsManager.get(derivationId as keyof DerivationsDef<S>) as T;\n\t\t},\n\n\t\tsubscribe(ids: string[], listener: () => void): () => void {\n\t\t\tconst derivationIds: string[] = [];\n\t\t\tconst factKeys: string[] = [];\n\n\t\t\tfor (const id of ids) {\n\t\t\t\tif (id in mergedDerive) {\n\t\t\t\t\tderivationIds.push(id);\n\t\t\t\t} else if (id in mergedSchema) {\n\t\t\t\t\tfactKeys.push(id);\n\t\t\t\t} else if (process.env.NODE_ENV !== \"production\") {\n\t\t\t\t\tconsole.warn(`[Directive] subscribe: unknown key \"${id}\"`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst unsubs: Array<() => void> = [];\n\t\t\tif (derivationIds.length > 0) {\n\t\t\t\tunsubs.push(\n\t\t\t\t\tderivationsManager.subscribe(\n\t\t\t\t\t\tderivationIds as Array<keyof DerivationsDef<S>>,\n\t\t\t\t\t\tlistener,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (factKeys.length > 0) {\n\t\t\t\tunsubs.push(store.subscribe(factKeys as Array<keyof InferSchema<S>>, listener));\n\t\t\t}\n\n\t\t\treturn () => {\n\t\t\t\tfor (const u of unsubs) u();\n\t\t\t};\n\t\t},\n\n\t\twatch<T = unknown>(\n\t\t\tid: string,\n\t\t\tcallback: (newValue: T, previousValue: T | undefined) => void,\n\t\t\toptions?: { equalityFn?: (a: T, b: T | undefined) => boolean },\n\t\t): () => void {\n\t\t\tconst isEqual = options?.equalityFn\n\t\t\t\t? (a: T, b: T | undefined) => options.equalityFn!(a, b)\n\t\t\t\t: (a: T, b: T | undefined) => Object.is(a, b);\n\n\t\t\tif (id in mergedDerive) {\n\t\t\t\t// Derivation path\n\t\t\t\tlet previousValue: T | undefined = derivationsManager.get(\n\t\t\t\t\tid as keyof DerivationsDef<S>,\n\t\t\t\t) as T | undefined;\n\n\t\t\t\treturn derivationsManager.subscribe(\n\t\t\t\t\t[id as keyof DerivationsDef<S>],\n\t\t\t\t\t() => {\n\t\t\t\t\t\tconst newValue = derivationsManager.get(id as keyof DerivationsDef<S>) as T;\n\t\t\t\t\t\tif (!isEqual(newValue, previousValue)) {\n\t\t\t\t\t\t\tconst oldValue = previousValue;\n\t\t\t\t\t\t\tpreviousValue = newValue;\n\t\t\t\t\t\t\tcallback(newValue, oldValue);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Fact path\n\t\t\tif (process.env.NODE_ENV !== \"production\") {\n\t\t\t\tif (!(id in mergedSchema)) {\n\t\t\t\t\tconsole.warn(`[Directive] watch: unknown key \"${id}\"`);\n\t\t\t\t}\n\t\t\t}\n\t\t\tlet prev = store.get(id as keyof InferSchema<S>) as T | undefined;\n\t\t\treturn store.subscribe([id as keyof InferSchema<S>], () => {\n\t\t\t\tconst next = store.get(id as keyof InferSchema<S>) as T;\n\t\t\t\tif (!isEqual(next, prev)) {\n\t\t\t\t\tconst old = prev;\n\t\t\t\t\tprev = next;\n\t\t\t\t\tcallback(next, old);\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\twhen(\n\t\t\tpredicate: (facts: Record<string, unknown>) => boolean,\n\t\t\toptions?: { timeout?: number },\n\t\t): Promise<void> {\n\t\t\treturn new Promise<void>((resolve, reject) => {\n\t\t\t\t// Check immediately\n\t\t\t\tconst factsObj = store.toObject();\n\t\t\t\tif (predicate(factsObj)) {\n\t\t\t\t\tresolve();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tlet unsub: (() => void) | undefined;\n\t\t\t\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\n\t\t\t\tconst cleanup = () => {\n\t\t\t\t\tunsub?.();\n\t\t\t\t\tif (timer !== undefined) clearTimeout(timer);\n\t\t\t\t};\n\n\t\t\t\t// Subscribe to all fact changes\n\t\t\t\tunsub = store.subscribeAll(() => {\n\t\t\t\t\tconst current = store.toObject();\n\t\t\t\t\tif (predicate(current)) {\n\t\t\t\t\t\tcleanup();\n\t\t\t\t\t\tresolve();\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// Timeout\n\t\t\t\tif (options?.timeout !== undefined && options.timeout > 0) {\n\t\t\t\t\ttimer = setTimeout(() => {\n\t\t\t\t\t\tcleanup();\n\t\t\t\t\t\treject(new Error(`[Directive] when: timed out after ${options.timeout}ms`));\n\t\t\t\t\t}, options.timeout);\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\tinspect(): SystemInspection {\n\t\t\treturn {\n\t\t\t\tunmet: state.previousRequirements.all(),\n\t\t\t\tinflight: resolversManager.getInflightInfo(),\n\t\t\t\tconstraints: constraintsManager.getAllStates().map((s) => ({\n\t\t\t\t\tid: s.id,\n\t\t\t\t\tactive: s.lastResult ?? false,\n\t\t\t\t\tpriority: s.priority,\n\t\t\t\t})),\n\t\t\t\tresolvers: Object.fromEntries(\n\t\t\t\t\tresolversManager.getInflight().map((id) => [id, resolversManager.getStatus(id)]),\n\t\t\t\t),\n\t\t\t};\n\t\t},\n\n\t\texplain(requirementId: string): string | null {\n\t\t\t// Find the requirement in current unmet requirements\n\t\t\tconst requirements = state.previousRequirements.all();\n\t\t\tconst req = requirements.find((r) => r.id === requirementId);\n\n\t\t\tif (!req) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst constraintState = constraintsManager.getState(req.fromConstraint);\n\t\t\tconst resolverStatus = resolversManager.getStatus(requirementId);\n\n\t\t\t// Get relevant facts by looking at the constraint's last known state\n\t\t\tconst relevantFacts: Record<string, unknown> = {};\n\t\t\tconst factsSnapshot = store.toObject();\n\n\t\t\t// Include all facts for now (could be optimized with dependency tracking)\n\t\t\tfor (const [key, value] of Object.entries(factsSnapshot)) {\n\t\t\t\trelevantFacts[key] = value;\n\t\t\t}\n\n\t\t\tconst lines: string[] = [\n\t\t\t\t`Requirement \"${req.requirement.type}\" (id: ${req.id})`,\n\t\t\t\t`├─ Produced by constraint: ${req.fromConstraint}`,\n\t\t\t\t`├─ Constraint priority: ${constraintState?.priority ?? 0}`,\n\t\t\t\t`├─ Constraint active: ${constraintState?.lastResult ?? \"unknown\"}`,\n\t\t\t\t`├─ Resolver status: ${resolverStatus.state}`,\n\t\t\t];\n\n\t\t\t// Add requirement details\n\t\t\tconst reqDetails = Object.entries(req.requirement)\n\t\t\t\t.filter(([k]) => k !== \"type\")\n\t\t\t\t.map(([k, v]) => `${k}=${JSON.stringify(v)}`)\n\t\t\t\t.join(\", \");\n\t\t\tif (reqDetails) {\n\t\t\t\tlines.push(`├─ Requirement payload: { ${reqDetails} }`);\n\t\t\t}\n\n\t\t\t// Add relevant facts (limit to prevent huge output)\n\t\t\tconst factEntries = Object.entries(relevantFacts).slice(0, 10);\n\t\t\tif (factEntries.length > 0) {\n\t\t\t\tlines.push(`└─ Relevant facts:`);\n\t\t\t\tfactEntries.forEach(([k, v], i) => {\n\t\t\t\t\tconst prefix = i === factEntries.length - 1 ? \" └─\" : \" ├─\";\n\t\t\t\t\tconst valueStr = typeof v === \"object\" ? JSON.stringify(v) : String(v);\n\t\t\t\t\tlines.push(`${prefix} ${k} = ${valueStr.slice(0, 50)}${valueStr.length > 50 ? \"...\" : \"\"}`);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn lines.join(\"\\n\");\n\t\t},\n\n\t\tasync settle(maxWait = 5000): Promise<void> {\n\t\t\tconst startTime = Date.now();\n\n\t\t\t// Use while loop instead of recursion to prevent stack overflow\n\t\t\twhile (true) {\n\t\t\t\t// Wait for any pending microtasks\n\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, 0));\n\n\t\t\t\t// Check if we have inflight resolvers or unmet requirements with resolvers\n\t\t\t\tconst inspection = this.inspect();\n\t\t\t\tconst settled =\n\t\t\t\t\tinspection.inflight.length === 0 &&\n\t\t\t\t\t!state.isReconciling &&\n\t\t\t\t\t!state.reconcileScheduled;\n\n\t\t\t\tif (settled) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Check timeout\n\t\t\t\tif (Date.now() - startTime > maxWait) {\n\t\t\t\t\tconst details: string[] = [];\n\t\t\t\t\tif (inspection.inflight.length > 0) {\n\t\t\t\t\t\tdetails.push(\n\t\t\t\t\t\t\t`${inspection.inflight.length} resolvers inflight: ${inspection.inflight.map((r) => r.resolverId).join(\", \")}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tif (state.isReconciling) {\n\t\t\t\t\t\tdetails.push(\"reconciliation in progress\");\n\t\t\t\t\t}\n\t\t\t\t\tif (state.reconcileScheduled) {\n\t\t\t\t\t\tdetails.push(\"reconcile scheduled\");\n\t\t\t\t\t}\n\t\t\t\t\t// Include pending requirements for better debugging\n\t\t\t\t\tconst unmet = state.previousRequirements.all();\n\t\t\t\t\tif (unmet.length > 0) {\n\t\t\t\t\t\tdetails.push(\n\t\t\t\t\t\t\t`${unmet.length} unmet requirements: ${unmet.map((r) => r.requirement.type).join(\", \")}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`[Directive] settle() timed out after ${maxWait}ms. ${details.join(\"; \")}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Wait a bit and check again\n\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, 10));\n\t\t\t}\n\t\t},\n\n\t\tgetSnapshot() {\n\t\t\treturn {\n\t\t\t\tfacts: store.toObject(),\n\t\t\t\tversion: 1,\n\t\t\t};\n\t\t},\n\n\t\tgetDistributableSnapshot<T = Record<string, unknown>>(\n\t\t\toptions: {\n\t\t\t\tincludeDerivations?: string[];\n\t\t\t\texcludeDerivations?: string[];\n\t\t\t\tincludeFacts?: string[];\n\t\t\t\tttlSeconds?: number;\n\t\t\t\tmetadata?: Record<string, unknown>;\n\t\t\t\tincludeVersion?: boolean;\n\t\t\t} = {},\n\t\t): {\n\t\t\tdata: T;\n\t\t\tcreatedAt: number;\n\t\t\texpiresAt?: number;\n\t\t\tversion?: string;\n\t\t\tmetadata?: Record<string, unknown>;\n\t\t} {\n\t\t\tconst {\n\t\t\t\tincludeDerivations,\n\t\t\t\texcludeDerivations,\n\t\t\t\tincludeFacts,\n\t\t\t\tttlSeconds,\n\t\t\t\tmetadata,\n\t\t\t\tincludeVersion,\n\t\t\t} = options;\n\n\t\t\tconst data: Record<string, unknown> = {};\n\n\t\t\t// Collect derivation keys to include\n\t\t\tconst allDerivationKeys = Object.keys(mergedDerive);\n\t\t\tlet derivationKeys: string[];\n\n\t\t\tif (includeDerivations) {\n\t\t\t\t// Only include specified derivations\n\t\t\t\tderivationKeys = includeDerivations.filter((k) => allDerivationKeys.includes(k));\n\n\t\t\t\t// Warn about unknown derivation keys in dev mode\n\t\t\t\tif (process.env.NODE_ENV !== \"production\") {\n\t\t\t\t\tconst unknown = includeDerivations.filter((k) => !allDerivationKeys.includes(k));\n\t\t\t\t\tif (unknown.length > 0) {\n\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t`[Directive] getDistributableSnapshot: Unknown derivation keys ignored: ${unknown.join(\", \")}. ` +\n\t\t\t\t\t\t\t\t`Available: ${allDerivationKeys.join(\", \") || \"(none)\"}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Include all derivations by default\n\t\t\t\tderivationKeys = allDerivationKeys;\n\t\t\t}\n\n\t\t\t// Apply exclusions\n\t\t\tif (excludeDerivations) {\n\t\t\t\tconst excludeSet = new Set(excludeDerivations);\n\t\t\t\tderivationKeys = derivationKeys.filter((k) => !excludeSet.has(k));\n\t\t\t}\n\n\t\t\t// Read derivation values\n\t\t\tfor (const key of derivationKeys) {\n\t\t\t\ttry {\n\t\t\t\t\tdata[key] = derivationsManager.get(key as keyof DerivationsDef<S>);\n\t\t\t\t} catch (error) {\n\t\t\t\t\t// Skip derivations that error during computation\n\t\t\t\t\tif (process.env.NODE_ENV !== \"production\") {\n\t\t\t\t\t\tconsole.warn(`[Directive] getDistributableSnapshot: Skipping derivation \"${key}\" due to error:`, error);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Include specified facts\n\t\t\tif (includeFacts && includeFacts.length > 0) {\n\t\t\t\tconst factsSnapshot = store.toObject();\n\t\t\t\tconst allFactKeys = Object.keys(factsSnapshot);\n\n\t\t\t\t// Warn about unknown fact keys in dev mode\n\t\t\t\tif (process.env.NODE_ENV !== \"production\") {\n\t\t\t\t\tconst unknown = includeFacts.filter((k) => !(k in factsSnapshot));\n\t\t\t\t\tif (unknown.length > 0) {\n\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t`[Directive] getDistributableSnapshot: Unknown fact keys ignored: ${unknown.join(\", \")}. ` +\n\t\t\t\t\t\t\t\t`Available: ${allFactKeys.join(\", \") || \"(none)\"}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tfor (const key of includeFacts) {\n\t\t\t\t\tif (key in factsSnapshot) {\n\t\t\t\t\t\tdata[key] = factsSnapshot[key];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Build the snapshot\n\t\t\tconst createdAt = Date.now();\n\t\t\tconst snapshot: {\n\t\t\t\tdata: T;\n\t\t\t\tcreatedAt: number;\n\t\t\t\texpiresAt?: number;\n\t\t\t\tversion?: string;\n\t\t\t\tmetadata?: Record<string, unknown>;\n\t\t\t} = {\n\t\t\t\tdata: data as T,\n\t\t\t\tcreatedAt,\n\t\t\t};\n\n\t\t\t// Add TTL\n\t\t\tif (ttlSeconds !== undefined && ttlSeconds > 0) {\n\t\t\t\tsnapshot.expiresAt = createdAt + ttlSeconds * 1000;\n\t\t\t}\n\n\t\t\t// Add version hash\n\t\t\tif (includeVersion) {\n\t\t\t\t// Simple version hash based on data content\n\t\t\t\tsnapshot.version = hashObject(data);\n\t\t\t}\n\n\t\t\t// Add metadata\n\t\t\tif (metadata) {\n\t\t\t\tsnapshot.metadata = metadata;\n\t\t\t}\n\n\t\t\treturn snapshot;\n\t\t},\n\n\t\twatchDistributableSnapshot<T = Record<string, unknown>>(\n\t\t\toptions: {\n\t\t\t\tincludeDerivations?: string[];\n\t\t\t\texcludeDerivations?: string[];\n\t\t\t\tincludeFacts?: string[];\n\t\t\t\tttlSeconds?: number;\n\t\t\t\tmetadata?: Record<string, unknown>;\n\t\t\t\tincludeVersion?: boolean;\n\t\t\t},\n\t\t\tcallback: (snapshot: {\n\t\t\t\tdata: T;\n\t\t\t\tcreatedAt: number;\n\t\t\t\texpiresAt?: number;\n\t\t\t\tversion?: string;\n\t\t\t\tmetadata?: Record<string, unknown>;\n\t\t\t}) => void,\n\t\t): () => void {\n\t\t\tconst { includeDerivations, excludeDerivations } = options;\n\n\t\t\t// Determine which derivations to watch\n\t\t\tconst allDerivationKeys = Object.keys(mergedDerive);\n\t\t\tlet derivationKeys: string[];\n\n\t\t\tif (includeDerivations) {\n\t\t\t\tderivationKeys = includeDerivations.filter((k) => allDerivationKeys.includes(k));\n\t\t\t} else {\n\t\t\t\tderivationKeys = allDerivationKeys;\n\t\t\t}\n\n\t\t\tif (excludeDerivations) {\n\t\t\t\tconst excludeSet = new Set(excludeDerivations);\n\t\t\t\tderivationKeys = derivationKeys.filter((k) => !excludeSet.has(k));\n\t\t\t}\n\n\t\t\tif (derivationKeys.length === 0) {\n\t\t\t\t// Nothing to watch, return no-op unsubscribe\n\t\t\t\tif (process.env.NODE_ENV !== \"production\") {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\"[Directive] watchDistributableSnapshot: No derivations to watch. \" +\n\t\t\t\t\t\t\t\"Callback will never be called.\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn () => {};\n\t\t\t}\n\n\t\t\t// Get initial snapshot to seed version and ensure derivations are computed\n\t\t\t// (derivations must be computed before subscribing so listeners are called on invalidation)\n\t\t\tconst initialSnapshot = this.getDistributableSnapshot<T>({\n\t\t\t\t...options,\n\t\t\t\tincludeVersion: true,\n\t\t\t});\n\t\t\tlet previousVersion = initialSnapshot.version;\n\n\t\t\t// Subscribe to all watched derivations\n\t\t\treturn derivationsManager.subscribe(\n\t\t\t\tderivationKeys as Array<keyof DerivationsDef<S>>,\n\t\t\t\t() => {\n\t\t\t\t\t// Generate a new snapshot\n\t\t\t\t\tconst snapshot = this.getDistributableSnapshot<T>({\n\t\t\t\t\t\t...options,\n\t\t\t\t\t\t// Always include version for change detection\n\t\t\t\t\t\tincludeVersion: true,\n\t\t\t\t\t});\n\n\t\t\t\t\t// Only call callback if snapshot actually changed\n\t\t\t\t\tif (snapshot.version !== previousVersion) {\n\t\t\t\t\t\tpreviousVersion = snapshot.version;\n\t\t\t\t\t\tcallback(snapshot);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t);\n\t\t},\n\n\t\trestore(snapshot) {\n\t\t\tif (!snapshot || typeof snapshot !== \"object\") {\n\t\t\t\tthrow new Error(\"[Directive] restore() requires a valid snapshot object\");\n\t\t\t}\n\t\t\tif (!snapshot.facts || typeof snapshot.facts !== \"object\") {\n\t\t\t\tthrow new Error(\"[Directive] restore() snapshot must have a facts object\");\n\t\t\t}\n\n\t\t\t// Security: Validate snapshot for prototype pollution\n\t\t\tif (!isPrototypeSafe(snapshot)) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"[Directive] restore() rejected: snapshot contains potentially dangerous keys \" +\n\t\t\t\t\t\t\"(__proto__, constructor, or prototype). This may indicate a prototype pollution attack.\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tstore.batch(() => {\n\t\t\t\tfor (const [key, value] of Object.entries(snapshot.facts)) {\n\t\t\t\t\t// Skip dangerous keys (defense in depth)\n\t\t\t\t\tif (BLOCKED_PROPS.has(key)) continue;\n\t\t\t\t\tstore.set(key as keyof InferSchema<S>, value as InferSchema<S>[keyof InferSchema<S>]);\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\tonSettledChange(listener: () => void): () => void {\n\t\t\tsettlementListeners.add(listener);\n\t\t\treturn () => {\n\t\t\t\tsettlementListeners.delete(listener);\n\t\t\t};\n\t\t},\n\n\t\tonTimeTravelChange(listener: () => void): () => void {\n\t\t\ttimeTravelListeners.add(listener);\n\t\t\treturn () => {\n\t\t\t\ttimeTravelListeners.delete(listener);\n\t\t\t};\n\t\t},\n\n\t\tbatch(fn: () => void): void {\n\t\t\tstore.batch(fn);\n\t\t},\n\n\t\tget isSettled(): boolean {\n\t\t\tconst inspection = this.inspect();\n\t\t\treturn (\n\t\t\t\tinspection.inflight.length === 0 &&\n\t\t\t\t!state.isReconciling &&\n\t\t\t\t!state.reconcileScheduled\n\t\t\t);\n\t\t},\n\n\t\tget isRunning(): boolean {\n\t\t\treturn state.isRunning;\n\t\t},\n\n\t\tget isInitialized(): boolean {\n\t\t\treturn state.isInitialized;\n\t\t},\n\n\t\tget isReady(): boolean {\n\t\t\treturn state.isReady;\n\t\t},\n\n\t\twhenReady(): Promise<void> {\n\t\t\t// If already ready, resolve immediately\n\t\t\tif (state.isReady) {\n\t\t\t\treturn Promise.resolve();\n\t\t\t}\n\n\t\t\t// If not running, the promise would never resolve\n\t\t\tif (!state.isRunning) {\n\t\t\t\treturn Promise.reject(\n\t\t\t\t\tnew Error(\n\t\t\t\t\t\t\"[Directive] whenReady() called before start(). \" +\n\t\t\t\t\t\t\"Call system.start() first, then await system.whenReady().\",\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Create promise if not exists\n\t\t\tif (!state.readyPromise) {\n\t\t\t\tstate.readyPromise = new Promise<void>((resolve) => {\n\t\t\t\t\tstate.readyResolve = resolve;\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn state.readyPromise;\n\t\t},\n\t};\n\n\t/**\n\t * Register a new module into a running (or stopped) engine.\n\t * Merges the module's schema, events, derive, effects, constraints, and resolvers\n\t * into the existing engine state, runs init, and triggers reconciliation.\n\t */\n\tfunction registerModule(module: {\n\t\tid: string;\n\t\tschema: Record<string, unknown>;\n\t\trequirements?: Record<string, unknown>;\n\t\tinit?: (facts: unknown) => void;\n\t\tderive?: Record<string, (facts: unknown, derive: unknown) => unknown>;\n\t\tevents?: Record<string, (facts: unknown, event: unknown) => void>;\n\t\teffects?: Record<string, unknown>;\n\t\tconstraints?: Record<string, unknown>;\n\t\tresolvers?: Record<string, unknown>;\n\t\thooks?: { onInit?: (s: unknown) => void; onStart?: (s: unknown) => void; onStop?: (s: unknown) => void; onError?: (e: unknown, ctx: unknown) => void };\n\t\tsnapshotEvents?: string[];\n\t}): void {\n\t\t// Guard: cannot register during reconciliation (would corrupt iteration state)\n\t\tif (state.isReconciling) {\n\t\t\tthrow new Error(\n\t\t\t\t`[Directive] Cannot register module \"${module.id}\" during reconciliation. ` +\n\t\t\t\t`Wait for the current reconciliation cycle to complete.`,\n\t\t\t);\n\t\t}\n\n\t\t// Guard: cannot register on a destroyed system\n\t\tif (state.isDestroyed) {\n\t\t\tthrow new Error(\n\t\t\t\t`[Directive] Cannot register module \"${module.id}\" on a destroyed system.`,\n\t\t\t);\n\t\t}\n\n\t\t// Security: validate keys\n\t\tconst validateKeys = (obj: object | undefined, section: string) => {\n\t\t\tif (!obj) return;\n\t\t\tfor (const key of Object.keys(obj)) {\n\t\t\t\tif (BLOCKED_PROPS.has(key)) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`[Directive] Security: Module \"${module.id}\" has dangerous key \"${key}\" in ${section}.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tvalidateKeys(module.schema, \"schema\");\n\t\tvalidateKeys(module.events, \"events\");\n\t\tvalidateKeys(module.derive, \"derive\");\n\t\tvalidateKeys(module.effects, \"effects\");\n\t\tvalidateKeys(module.constraints, \"constraints\");\n\t\tvalidateKeys(module.resolvers, \"resolvers\");\n\n\t\t// Schema collision detection (unconditional — production collision would cause data corruption)\n\t\tfor (const key of Object.keys(module.schema)) {\n\t\t\tif (key in mergedSchema) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`[Directive] Schema collision: Fact \"${key}\" already exists. Cannot register module \"${module.id}\".`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\t// Fact/derivation name collision check (dev-only warning)\n\t\tif (process.env.NODE_ENV !== \"production\" && module.derive) {\n\t\t\tconst existingFactKeys = new Set(Object.keys(mergedSchema));\n\t\t\tfor (const key of Object.keys(module.derive)) {\n\t\t\t\tif (existingFactKeys.has(key)) {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t`[Directive] \"${key}\" exists as both a fact and a derivation after registering module \"${module.id}\".`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Update snapshotEventNames BEFORE merging events so we capture pre-merge state\n\t\tif (module.snapshotEvents) {\n\t\t\tif (snapshotEventNames === null) {\n\t\t\t\t// First module with snapshotEvents — initialize the set with all existing event names\n\t\t\t\tsnapshotEventNames = new Set<string>(Object.keys(mergedEvents));\n\t\t\t}\n\t\t\tfor (const eventName of module.snapshotEvents) {\n\t\t\t\tsnapshotEventNames.add(eventName);\n\t\t\t}\n\t\t} else if (snapshotEventNames !== null && module.events) {\n\t\t\t// Filtering is active and this module has no filter — add all its events\n\t\t\tfor (const eventName of Object.keys(module.events)) {\n\t\t\t\tsnapshotEventNames.add(eventName);\n\t\t\t}\n\t\t}\n\n\t\t// Merge into existing engine state\n\t\tObject.assign(mergedSchema, module.schema);\n\t\tif (module.events) Object.assign(mergedEvents, module.events);\n\t\tif (module.derive) {\n\t\t\tObject.assign(mergedDerive, module.derive);\n\t\t\t// Register new derivations with the derivations manager\n\t\t\tderivationsManager.registerDefinitions(module.derive as DerivationsDef<S>);\n\t\t}\n\t\tif (module.effects) {\n\t\t\tObject.assign(mergedEffects, module.effects);\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Dynamic module registration\n\t\t\teffectsManager.registerDefinitions(module.effects as any);\n\t\t}\n\t\tif (module.constraints) {\n\t\t\tObject.assign(mergedConstraints, module.constraints);\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Dynamic module registration\n\t\t\tconstraintsManager.registerDefinitions(module.constraints as any);\n\t\t}\n\t\tif (module.resolvers) {\n\t\t\tObject.assign(mergedResolvers, module.resolvers);\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Dynamic module registration\n\t\t\tresolversManager.registerDefinitions(module.resolvers as any);\n\t\t}\n\n\t\t// Register new schema keys with the facts store\n\t\t// biome-ignore lint/suspicious/noExplicitAny: Internal dynamic method\n\t\t(store as any).registerKeys(module.schema as Record<string, unknown>);\n\n\t\t// Track the new module in config.modules for hooks\n\t\tconfig.modules.push(module as typeof config.modules[number]);\n\n\t\t// Run init within a batch\n\t\tif (module.init) {\n\t\t\tstore.batch(() => {\n\t\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Dynamic module init\n\t\t\t\tmodule.init!(facts as any);\n\t\t\t});\n\t\t}\n\n\t\t// Call lifecycle hooks\n\t\tmodule.hooks?.onInit?.(system);\n\t\tif (state.isRunning) {\n\t\t\tmodule.hooks?.onStart?.(system);\n\t\t\t// Trigger reconciliation to evaluate new constraints\n\t\t\tscheduleReconcile();\n\t\t}\n\t}\n\n\t// Attach registerModule to system\n\t(system as unknown as Record<string, unknown>).registerModule = registerModule;\n\n\t// Initialize plugins\n\tpluginManager.emitInit(system);\n\n\t// Call module init hooks\n\tfor (const module of config.modules) {\n\t\tmodule.hooks?.onInit?.(system);\n\t}\n\n\treturn system;\n}\n","/**\n * System - The top-level API for creating a Directive runtime\n *\n * A system combines modules with plugins and configuration.\n * Modules are passed as an object with namespaced access:\n *\n * @example\n * ```typescript\n * const system = createSystem({\n * modules: { auth: authModule, data: dataModule },\n * });\n *\n * system.facts.auth.token // Namespaced facts\n * system.derive.data.userCount // Namespaced derivations\n * system.events.auth.login() // Namespaced events\n * ```\n */\n\nimport { createEngine } from \"./engine.js\";\nimport { isPrototypeSafe } from \"../utils/utils.js\";\nimport type {\n\tModuleDef,\n\tModuleSchema,\n\tModulesMap,\n\tNamespacedSystem,\n\tCreateSystemOptionsNamed,\n\tCreateSystemOptionsSingle,\n\tSingleModuleSystem,\n} from \"./types.js\";\n\n// ============================================================================\n// Blocked Properties (Security)\n// ============================================================================\n\nconst BLOCKED_PROPS = Object.freeze(\n\tnew Set([\"__proto__\", \"constructor\", \"prototype\"]),\n);\n\n/** Namespace separator for internal key prefixing (e.g., \"auth::token\") */\nconst SEPARATOR = \"::\";\n\n// ============================================================================\n// Topological Sort for Module Dependencies\n// ============================================================================\n\n/**\n * Perform topological sort on modules based on crossModuleDeps.\n * Returns module namespaces in dependency order (dependencies first).\n *\n * @throws Error if circular dependency detected\n */\nfunction topologicalSort<Modules extends ModulesMap>(\n\tmodulesMap: Modules,\n): Array<keyof Modules & string> {\n\tconst namespaces = Object.keys(modulesMap) as Array<keyof Modules & string>;\n\tconst visited = new Set<string>();\n\tconst visiting = new Set<string>(); // For cycle detection\n\tconst result: Array<keyof Modules & string> = [];\n\tconst path: string[] = []; // Reuse array to avoid O(n²) memory\n\n\tfunction visit(namespace: string): void {\n\t\tif (visited.has(namespace)) return;\n\n\t\t// Cycle detection\n\t\tif (visiting.has(namespace)) {\n\t\t\tconst cycleStart = path.indexOf(namespace);\n\t\t\tconst cycle = [...path.slice(cycleStart), namespace].join(\" → \");\n\t\t\tthrow new Error(\n\t\t\t\t`[Directive] Circular dependency detected: ${cycle}. ` +\n\t\t\t\t`Modules cannot have circular crossModuleDeps. ` +\n\t\t\t\t`Break the cycle by removing one of the cross-module references.`,\n\t\t\t);\n\t\t}\n\n\t\tvisiting.add(namespace);\n\t\tpath.push(namespace);\n\n\t\t// Visit dependencies first\n\t\tconst mod = modulesMap[namespace];\n\t\tif (mod?.crossModuleDeps) {\n\t\t\tfor (const depNamespace of Object.keys(mod.crossModuleDeps)) {\n\t\t\t\tif (namespaces.includes(depNamespace as keyof Modules & string)) {\n\t\t\t\t\tvisit(depNamespace);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tpath.pop();\n\t\tvisiting.delete(namespace);\n\t\tvisited.add(namespace);\n\t\tresult.push(namespace as keyof Modules & string);\n\t}\n\n\tfor (const namespace of namespaces) {\n\t\tvisit(namespace);\n\t}\n\n\treturn result;\n}\n\n// ============================================================================\n// Proxy Cache (Performance)\n// ============================================================================\n\n/**\n * WeakMap to cache module facts proxies. Keyed by the facts store object.\n * Inner map is keyed by namespace string.\n */\nconst moduleFactsProxyCache = new WeakMap<\n\tRecord<string, unknown>,\n\tMap<string, Record<string, unknown>>\n>();\n\n/**\n * WeakMap to cache namespaced facts proxies.\n */\nconst namespacedFactsProxyCache = new WeakMap<\n\tRecord<string, unknown>,\n\tRecord<string, Record<string, unknown>>\n>();\n\n/**\n * WeakMap to cache namespaced derive proxies.\n */\nconst namespacedDeriveProxyCache = new WeakMap<\n\tRecord<string, unknown>,\n\tRecord<string, Record<string, unknown>>\n>();\n\n/**\n * WeakMap to cache module derive proxies.\n */\nconst moduleDeriveProxyCache = new WeakMap<\n\tRecord<string, unknown>,\n\tMap<string, Record<string, unknown>>\n>();\n\n// ============================================================================\n// createSystem\n// ============================================================================\n\n/**\n * Create a Directive system.\n *\n * Supports two modes:\n * - **Single module**: Use `module` prop for direct access without namespace\n * - **Multiple modules**: Use `modules` prop for namespaced access\n *\n * @example Single module (direct access)\n * ```ts\n * const system = createSystem({ module: counterModule });\n * system.facts.count // Direct access\n * system.events.increment() // Direct events\n * ```\n *\n * @example Multiple modules (namespaced access)\n * ```ts\n * const system = createSystem({\n * modules: { auth: authModule, data: dataModule },\n * });\n * system.facts.auth.token // Namespaced access\n * system.events.auth.login() // Namespaced events\n * ```\n */\nexport function createSystem<S extends ModuleSchema>(\n\toptions: CreateSystemOptionsSingle<S>,\n): SingleModuleSystem<S>;\nexport function createSystem<const Modules extends ModulesMap>(\n\toptions: CreateSystemOptionsNamed<Modules>,\n): NamespacedSystem<Modules>;\nexport function createSystem<S extends ModuleSchema, Modules extends ModulesMap>(\n\toptions: CreateSystemOptionsSingle<S> | CreateSystemOptionsNamed<Modules>,\n): SingleModuleSystem<S> | NamespacedSystem<Modules> {\n\t// Single module mode (module prop)\n\tif (\"module\" in options) {\n\t\tif (!options.module) {\n\t\t\tthrow new Error(\n\t\t\t\t\"[Directive] createSystem requires a module. Got: \" + typeof options.module,\n\t\t\t);\n\t\t}\n\t\treturn createSingleModuleSystem(options as CreateSystemOptionsSingle<S>) as SingleModuleSystem<S>;\n\t}\n\n\t// Namespaced mode (modules prop)\n\tconst namedOptions = options as CreateSystemOptionsNamed<Modules>;\n\n\t// Validate not an array\n\tif (Array.isArray(namedOptions.modules)) {\n\t\tthrow new Error(\n\t\t\t`[Directive] createSystem expects modules as an object, not an array.\\n\\n` +\n\t\t\t`Instead of:\\n` +\n\t\t\t` createSystem({ modules: [authModule, dataModule] })\\n\\n` +\n\t\t\t`Use:\\n` +\n\t\t\t` createSystem({ modules: { auth: authModule, data: dataModule } })\\n\\n` +\n\t\t\t`Or for a single module:\\n` +\n\t\t\t` createSystem({ module: counterModule })`,\n\t\t);\n\t}\n\n\treturn createNamespacedSystem(namedOptions) as NamespacedSystem<Modules>;\n}\n\n// ============================================================================\n// Internal Implementation\n// ============================================================================\n\nfunction createNamespacedSystem<Modules extends ModulesMap>(\n\toptions: CreateSystemOptionsNamed<Modules>,\n): NamespacedSystem<Modules> {\n\tconst modulesMap = options.modules;\n\tconst moduleNamespaces = new Set(Object.keys(modulesMap));\n\n\t// Build snapshot module filter set (null = all modules snapshot)\n\tconst snapshotModulesSet = options.debug?.snapshotModules\n\t\t? new Set(options.debug.snapshotModules)\n\t\t: null;\n\n\t// Validate tickMs if provided\n\tif (options.tickMs !== undefined && options.tickMs <= 0) {\n\t\tthrow new Error(\"[Directive] tickMs must be a positive number\");\n\t}\n\n\t// Dev-mode: Validate crossModuleDeps reference existing modules\n\tif (process.env.NODE_ENV !== \"production\") {\n\t\tfor (const [namespace, mod] of Object.entries(modulesMap)) {\n\t\t\tif (mod.crossModuleDeps) {\n\t\t\t\tfor (const depNamespace of Object.keys(mod.crossModuleDeps)) {\n\t\t\t\t\tif (depNamespace === namespace) {\n\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t`[Directive] Module \"${namespace}\" references itself in crossModuleDeps. ` +\n\t\t\t\t\t\t\t`Use \"facts.self\" to access own module's facts instead.`,\n\t\t\t\t\t\t);\n\t\t\t\t\t} else if (!moduleNamespaces.has(depNamespace)) {\n\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t`[Directive] Module \"${namespace}\" declares crossModuleDeps.${depNamespace}, ` +\n\t\t\t\t\t\t\t`but no module with namespace \"${depNamespace}\" exists in the system. ` +\n\t\t\t\t\t\t\t`Available modules: ${[...moduleNamespaces].join(\", \")}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Dev-mode: Validate snapshotModules references existing modules\n\tif (process.env.NODE_ENV !== \"production\" && options.debug?.snapshotModules) {\n\t\tfor (const name of options.debug.snapshotModules) {\n\t\t\tif (!moduleNamespaces.has(name)) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`[Directive] debug.snapshotModules entry \"${name}\" doesn't match any module. ` +\n\t\t\t\t\t`Available modules: ${[...moduleNamespaces].join(\", \")}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Determine module initialization order\n\tlet orderedNamespaces: Array<keyof Modules & string>;\n\tconst initOrder = options.initOrder ?? \"auto\";\n\n\tif (Array.isArray(initOrder)) {\n\t\t// Explicit order provided - validate it includes all modules\n\t\tconst explicitOrder = initOrder as Array<keyof Modules & string>;\n\t\tconst missingModules = Object.keys(modulesMap).filter(\n\t\t\t(ns) => !explicitOrder.includes(ns as keyof Modules & string),\n\t\t);\n\t\tif (missingModules.length > 0) {\n\t\t\tthrow new Error(\n\t\t\t\t`[Directive] initOrder is missing modules: ${missingModules.join(\", \")}. ` +\n\t\t\t\t`All modules must be included in the explicit order.`,\n\t\t\t);\n\t\t}\n\t\torderedNamespaces = explicitOrder;\n\t} else if (initOrder === \"declaration\") {\n\t\t// Use object key order (current behavior)\n\t\torderedNamespaces = Object.keys(modulesMap) as Array<keyof Modules & string>;\n\t} else {\n\t\t// \"auto\" - use topological sort based on crossModuleDeps\n\t\torderedNamespaces = topologicalSort(modulesMap);\n\t}\n\n\t// Apply zero-config defaults if enabled\n\tlet debug = options.debug;\n\tlet errorBoundary = options.errorBoundary;\n\n\tif (options.zeroConfig) {\n\t\tconst isDev = process.env.NODE_ENV !== \"production\";\n\n\t\tdebug = {\n\t\t\ttimeTravel: isDev,\n\t\t\tmaxSnapshots: 100,\n\t\t\t...options.debug,\n\t\t};\n\n\t\terrorBoundary = {\n\t\t\tonConstraintError: \"skip\",\n\t\t\tonResolverError: \"skip\",\n\t\t\tonEffectError: \"skip\",\n\t\t\tonDerivationError: \"skip\",\n\t\t\t...options.errorBoundary,\n\t\t};\n\t}\n\n\t// Validate module names and schema keys don't contain the separator\n\tfor (const namespace of Object.keys(modulesMap)) {\n\t\tif (namespace.includes(SEPARATOR)) {\n\t\t\tthrow new Error(\n\t\t\t\t`[Directive] Module name \"${namespace}\" contains the reserved separator \"${SEPARATOR}\". ` +\n\t\t\t\t`Module names cannot contain \"${SEPARATOR}\".`,\n\t\t\t);\n\t\t}\n\t\tconst mod = modulesMap[namespace];\n\t\tif (mod) {\n\t\t\tfor (const key of Object.keys(mod.schema.facts)) {\n\t\t\t\tif (key.includes(SEPARATOR)) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`[Directive] Schema key \"${key}\" in module \"${namespace}\" contains the reserved separator \"${SEPARATOR}\". ` +\n\t\t\t\t\t\t`Schema keys cannot contain \"${SEPARATOR}\".`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Transform modules to flat format with prefixed keys\n\t// auth.token → auth::token internally\n\t// Process in dependency order (determined above)\n\tconst flatModules: Array<ModuleDef<ModuleSchema>> = [];\n\n\tfor (const namespace of orderedNamespaces) {\n\t\tconst mod = modulesMap[namespace];\n\t\tif (!mod) continue; // TypeScript guard - should never happen\n\t\t// Compute cross-module deps info once per module (used by derive, constraints, effects)\n\t\tconst hasCrossModuleDeps = mod.crossModuleDeps && Object.keys(mod.crossModuleDeps).length > 0;\n\t\tconst depNamespaces = hasCrossModuleDeps ? Object.keys(mod.crossModuleDeps!) : [];\n\n\t\t// Prefix all fact keys with namespace\n\t\tconst prefixedFacts: Record<string, unknown> = {};\n\t\tfor (const [key, value] of Object.entries(mod.schema.facts)) {\n\t\t\tprefixedFacts[`${namespace}${SEPARATOR}${key}`] = value;\n\t\t}\n\n\t\t// Prefix all derivation keys with namespace\n\t\tconst prefixedDerivations: Record<string, unknown> = {};\n\t\tif (mod.schema.derivations) {\n\t\t\tfor (const [key, value] of Object.entries(mod.schema.derivations)) {\n\t\t\t\tprefixedDerivations[`${namespace}${SEPARATOR}${key}`] = value;\n\t\t\t}\n\t\t}\n\n\t\t// Prefix all event keys with namespace\n\t\tconst prefixedEvents: Record<string, unknown> = {};\n\t\tif (mod.schema.events) {\n\t\t\tfor (const [key, value] of Object.entries(mod.schema.events)) {\n\t\t\t\tprefixedEvents[`${namespace}${SEPARATOR}${key}`] = value;\n\t\t\t}\n\t\t}\n\n\t\t// Transform init to use prefixed keys\n\t\t// biome-ignore lint/suspicious/noExplicitAny: Facts proxy type coercion\n\t\tconst prefixedInit = mod.init\n\t\t\t? (facts: any) => {\n\t\t\t\t\t// Create a proxy that translates unprefixed keys to prefixed\n\t\t\t\t\tconst moduleFactsProxy = createModuleFactsProxy(facts, namespace);\n\t\t\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Module init type coercion\n\t\t\t\t\t(mod.init as any)(moduleFactsProxy);\n\t\t\t\t}\n\t\t\t: undefined;\n\n\t\t// Transform derive functions to use prefixed keys\n\t\tconst prefixedDerive: Record<string, (facts: unknown, derive: unknown) => unknown> = {};\n\t\tif (mod.derive) {\n\t\t\tfor (const [key, fn] of Object.entries(mod.derive)) {\n\t\t\t\tprefixedDerive[`${namespace}${SEPARATOR}${key}`] = (facts: unknown, derive: unknown) => {\n\t\t\t\t\t// Use cross-module proxy (facts.self + facts.{dep}) if crossModuleDeps is defined\n\t\t\t\t\t// Otherwise use flat access to own module only\n\t\t\t\t\tconst factsProxy = hasCrossModuleDeps\n\t\t\t\t\t\t? createCrossModuleFactsProxy(facts as Record<string, unknown>, namespace, depNamespaces)\n\t\t\t\t\t\t: createModuleFactsProxy(facts as Record<string, unknown>, namespace);\n\t\t\t\t\t// Derive proxy stays scoped to own module\n\t\t\t\t\tconst deriveProxy = createModuleDeriveProxy(derive as Record<string, unknown>, namespace);\n\t\t\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Derive function type coercion\n\t\t\t\t\treturn (fn as any)(factsProxy, deriveProxy);\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\t// Transform event handlers to use prefixed keys\n\t\tconst prefixedEventHandlers: Record<string, (facts: unknown, event: unknown) => void> = {};\n\t\tif (mod.events) {\n\t\t\tfor (const [key, handler] of Object.entries(mod.events)) {\n\t\t\t\tprefixedEventHandlers[`${namespace}${SEPARATOR}${key}`] = (facts: unknown, event: unknown) => {\n\t\t\t\t\tconst moduleFactsProxy = createModuleFactsProxy(facts as Record<string, unknown>, namespace);\n\t\t\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Event handler type coercion\n\t\t\t\t\t(handler as any)(moduleFactsProxy, event);\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\t// Transform constraints to use namespaced facts proxy\n\t\tconst prefixedConstraints: Record<string, unknown> = {};\n\t\tif (mod.constraints) {\n\t\t\tfor (const [key, constraint] of Object.entries(mod.constraints)) {\n\t\t\t\tconst constraintDef = constraint as {\n\t\t\t\t\twhen: (facts: unknown) => boolean | Promise<boolean>;\n\t\t\t\t\trequire: unknown | ((facts: unknown) => unknown);\n\t\t\t\t\tpriority?: number;\n\t\t\t\t\tasync?: boolean;\n\t\t\t\t\ttimeout?: number;\n\t\t\t\t\tdeps?: string[];\n\t\t\t\t};\n\n\t\t\t\tprefixedConstraints[`${namespace}${SEPARATOR}${key}`] = {\n\t\t\t\t\t...constraintDef,\n\t\t\t\t\t// Transform deps to use prefixed keys\n\t\t\t\t\tdeps: constraintDef.deps?.map((dep) => `${namespace}${SEPARATOR}${dep}`),\n\t\t\t\t\twhen: (facts: unknown) => {\n\t\t\t\t\t\t// Use cross-module proxy (facts.self + facts.{dep}) if crossModuleDeps is defined\n\t\t\t\t\t\t// Otherwise use module-scoped proxy for direct access (facts.key → namespace::key)\n\t\t\t\t\t\tconst factsProxy = hasCrossModuleDeps\n\t\t\t\t\t\t\t? createCrossModuleFactsProxy(facts as Record<string, unknown>, namespace, depNamespaces)\n\t\t\t\t\t\t\t: createModuleFactsProxy(facts as Record<string, unknown>, namespace);\n\t\t\t\t\t\treturn constraintDef.when(factsProxy);\n\t\t\t\t\t},\n\t\t\t\t\trequire: typeof constraintDef.require === \"function\"\n\t\t\t\t\t\t? (facts: unknown) => {\n\t\t\t\t\t\t\t\tconst factsProxy = hasCrossModuleDeps\n\t\t\t\t\t\t\t\t\t? createCrossModuleFactsProxy(facts as Record<string, unknown>, namespace, depNamespaces)\n\t\t\t\t\t\t\t\t\t: createModuleFactsProxy(facts as Record<string, unknown>, namespace);\n\t\t\t\t\t\t\t\treturn (constraintDef.require as (facts: unknown) => unknown)(factsProxy);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: constraintDef.require,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\t// Transform resolvers to use namespaced facts proxy\n\t\tconst prefixedResolvers: Record<string, unknown> = {};\n\t\tif (mod.resolvers) {\n\t\t\tfor (const [key, resolver] of Object.entries(mod.resolvers)) {\n\t\t\t\tconst resolverDef = resolver as {\n\t\t\t\t\trequirement: string;\n\t\t\t\t\tresolve: (req: unknown, ctx: { facts: unknown; signal: AbortSignal }) => Promise<void>;\n\t\t\t\t\tkey?: (req: unknown) => string;\n\t\t\t\t\tretry?: unknown;\n\t\t\t\t\ttimeout?: number;\n\t\t\t\t};\n\n\t\t\t\tprefixedResolvers[`${namespace}${SEPARATOR}${key}`] = {\n\t\t\t\t\t...resolverDef,\n\t\t\t\t\tresolve: async (req: unknown, ctx: { facts: unknown; signal: AbortSignal }) => {\n\t\t\t\t\t\tconst namespacedFacts = createNamespacedFactsProxy(ctx.facts as Record<string, unknown>, modulesMap, () => Object.keys(modulesMap));\n\t\t\t\t\t\tawait resolverDef.resolve(req, {\n\t\t\t\t\t\t\tfacts: namespacedFacts[namespace],\n\t\t\t\t\t\t\tsignal: ctx.signal,\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\t// Transform effects to use namespaced facts proxy\n\t\tconst prefixedEffects: Record<string, unknown> = {};\n\t\tif (mod.effects) {\n\t\t\tfor (const [key, effect] of Object.entries(mod.effects)) {\n\t\t\t\tconst effectDef = effect as {\n\t\t\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Effect run function type\n\t\t\t\t\trun: (facts: any, prev: any) => void | Promise<void>;\n\t\t\t\t\tdeps?: string[];\n\t\t\t\t};\n\n\t\t\t\tprefixedEffects[`${namespace}${SEPARATOR}${key}`] = {\n\t\t\t\t\t...effectDef,\n\t\t\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Effect run function wrapper\n\t\t\t\t\trun: (facts: any, prev: any) => {\n\t\t\t\t\t\t// Use cross-module proxy (facts.self + facts.{dep}) if crossModuleDeps is defined\n\t\t\t\t\t\t// Otherwise use module-scoped proxy for direct access (facts.key → namespace::key)\n\t\t\t\t\t\tconst factsProxy = hasCrossModuleDeps\n\t\t\t\t\t\t\t? createCrossModuleFactsProxy(facts as Record<string, unknown>, namespace, depNamespaces)\n\t\t\t\t\t\t\t: createModuleFactsProxy(facts as Record<string, unknown>, namespace);\n\t\t\t\t\t\tconst prevProxy = prev\n\t\t\t\t\t\t\t? (hasCrossModuleDeps\n\t\t\t\t\t\t\t\t\t? createCrossModuleFactsProxy(prev as Record<string, unknown>, namespace, depNamespaces)\n\t\t\t\t\t\t\t\t\t: createModuleFactsProxy(prev as Record<string, unknown>, namespace))\n\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\t\treturn effectDef.run(factsProxy, prevProxy);\n\t\t\t\t\t},\n\t\t\t\t\t// Transform deps to use prefixed keys\n\t\t\t\t\tdeps: effectDef.deps?.map((dep) => `${namespace}${SEPARATOR}${dep}`),\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tflatModules.push({\n\t\t\tid: mod.id,\n\t\t\tschema: {\n\t\t\t\tfacts: prefixedFacts,\n\t\t\t\tderivations: prefixedDerivations,\n\t\t\t\tevents: prefixedEvents,\n\t\t\t\trequirements: mod.schema.requirements ?? {},\n\t\t\t},\n\t\t\tinit: prefixedInit,\n\t\t\tderive: prefixedDerive,\n\t\t\tevents: prefixedEventHandlers,\n\t\t\teffects: prefixedEffects,\n\t\t\tconstraints: prefixedConstraints,\n\t\t\tresolvers: prefixedResolvers,\n\t\t\thooks: mod.hooks,\n\t\t\tsnapshotEvents: (snapshotModulesSet && !snapshotModulesSet.has(namespace))\n\t\t\t\t? [] // Module excluded from snapshots\n\t\t\t\t: mod.snapshotEvents?.map((e: string) => `${namespace}${SEPARATOR}${e}`),\n\t\t// biome-ignore lint/suspicious/noExplicitAny: Module transformation\n\t\t} as any);\n\t}\n\n\t// Dev-mode warning: tickMs set without tick event handler\n\tif (process.env.NODE_ENV !== \"production\" && options.tickMs && options.tickMs > 0) {\n\t\tconst hasTickHandler = flatModules.some(\n\t\t\t(m) => m.events && Object.keys(m.events).some((k) => k.endsWith(`${SEPARATOR}tick`)),\n\t\t);\n\t\tif (!hasTickHandler) {\n\t\t\tconsole.warn(\n\t\t\t\t`[Directive] tickMs is set to ${options.tickMs}ms but no module defines a \"tick\" event handler.`,\n\t\t\t);\n\t\t}\n\t}\n\n\t// Store for hydrated facts (set by hydrate(), applied during init)\n\tlet hydratedFacts: Record<string, Record<string, unknown>> | null = null;\n\n\t// Engine reference (set after creation, used by applyNamespacedFacts)\n\t// biome-ignore lint/suspicious/noExplicitAny: Engine type\n\tlet engine: any = null;\n\n\t/**\n\t * Apply namespaced facts to the engine's flat store.\n\t * Converts { auth: { token: \"x\" } } to { \"auth::token\": \"x\" }\n\t * Includes prototype pollution protection.\n\t */\n\tfunction applyNamespacedFacts(\n\t\tnamespacedFacts: Record<string, Record<string, unknown>>,\n\t): void {\n\t\tfor (const [namespace, facts] of Object.entries(namespacedFacts)) {\n\t\t\t// Skip blocked property names\n\t\t\tif (BLOCKED_PROPS.has(namespace)) {\n\t\t\t\tif (process.env.NODE_ENV !== \"production\") {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t`[Directive] initialFacts/hydrate contains blocked namespace \"${namespace}\". Skipping.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!moduleNamespaces.has(namespace)) {\n\t\t\t\tif (process.env.NODE_ENV !== \"production\") {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t`[Directive] initialFacts/hydrate contains unknown namespace \"${namespace}\". ` +\n\t\t\t\t\t\t`Available modules: ${[...moduleNamespaces].join(\", \")}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Validate facts object for prototype pollution\n\t\t\tif (facts && typeof facts === \"object\" && !isPrototypeSafe(facts)) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`[Directive] initialFacts/hydrate for namespace \"${namespace}\" contains potentially ` +\n\t\t\t\t\t`dangerous keys (__proto__, constructor, or prototype). This may indicate a ` +\n\t\t\t\t\t`prototype pollution attack.`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tfor (const [key, value] of Object.entries(facts)) {\n\t\t\t\t// Skip blocked keys\n\t\t\t\tif (BLOCKED_PROPS.has(key)) continue;\n\t\t\t\t(engine.facts as Record<string, unknown>)[`${namespace}${SEPARATOR}${key}`] = value;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Create engine with flat modules\n\tengine = createEngine({\n\t\t// biome-ignore lint/suspicious/noExplicitAny: Module format conversion\n\t\tmodules: flatModules.map((mod) => ({\n\t\t\tid: mod.id,\n\t\t\tschema: mod.schema.facts,\n\t\t\trequirements: mod.schema.requirements,\n\t\t\tinit: mod.init,\n\t\t\tderive: mod.derive,\n\t\t\tevents: mod.events,\n\t\t\teffects: mod.effects,\n\t\t\tconstraints: mod.constraints,\n\t\t\tresolvers: mod.resolvers,\n\t\t\thooks: mod.hooks,\n\t\t\tsnapshotEvents: mod.snapshotEvents,\n\t\t})) as any,\n\t\tplugins: options.plugins,\n\t\tdebug,\n\t\terrorBoundary,\n\t\ttickMs: options.tickMs,\n\t\t// Callback to apply initialFacts/hydrate during init phase (after module inits, before reconcile)\n\t\tonAfterModuleInit: () => {\n\t\t\t// Apply initialFacts first\n\t\t\tif (options.initialFacts) {\n\t\t\t\tapplyNamespacedFacts(options.initialFacts as Record<string, Record<string, unknown>>);\n\t\t\t}\n\t\t\t// Apply hydrated facts second (takes precedence)\n\t\t\tif (hydratedFacts) {\n\t\t\t\tapplyNamespacedFacts(hydratedFacts);\n\t\t\t\thydratedFacts = null;\n\t\t\t}\n\t\t},\n\t});\n\n\t// Build namespace → internal keys map (for subscribeModule / wildcard support)\n\tconst namespaceKeysMap = new Map<string, string[]>();\n\tfor (const namespace of Object.keys(modulesMap)) {\n\t\tconst mod = modulesMap[namespace];\n\t\tif (!mod) continue;\n\t\tconst keys: string[] = [];\n\t\tfor (const key of Object.keys(mod.schema.facts)) {\n\t\t\tkeys.push(`${namespace}${SEPARATOR}${key}`);\n\t\t}\n\t\tif (mod.schema.derivations) {\n\t\t\tfor (const key of Object.keys(mod.schema.derivations)) {\n\t\t\t\tkeys.push(`${namespace}${SEPARATOR}${key}`);\n\t\t\t}\n\t\t}\n\t\tnamespaceKeysMap.set(namespace, keys);\n\t}\n\n\t// Cached module names array, shared by all namespaced proxies.\n\t// Set to null on registerModule to lazily recompute.\n\tconst moduleNamesCache: { names: string[] | null } = { names: null };\n\tfunction getModuleNames(): string[] {\n\t\tif (moduleNamesCache.names === null) {\n\t\t\tmoduleNamesCache.names = Object.keys(modulesMap);\n\t\t}\n\t\treturn moduleNamesCache.names;\n\t}\n\n\t// Create namespaced proxies for external access\n\tconst namespacedFactsProxy = createNamespacedFactsProxy(engine.facts as unknown as Record<string, unknown>, modulesMap, getModuleNames);\n\tconst namespacedDeriveProxy = createNamespacedDeriveProxy(engine.derive as unknown as Record<string, unknown>, modulesMap, getModuleNames);\n\tconst namespacedEventsProxy = createNamespacedEventsProxy(engine, modulesMap, getModuleNames);\n\n\t// Build the namespaced system\n\tlet tickInterval: ReturnType<typeof setInterval> | null = null;\n\tconst tickMs = options.tickMs;\n\n\tconst system: NamespacedSystem<Modules> = {\n\t\t_mode: \"namespaced\",\n\t\tfacts: namespacedFactsProxy,\n\t\tdebug: engine.debug,\n\t\tderive: namespacedDeriveProxy,\n\t\tevents: namespacedEventsProxy,\n\t\tconstraints: engine.constraints,\n\t\teffects: engine.effects,\n\n\t\tget isRunning() {\n\t\t\treturn engine.isRunning;\n\t\t},\n\n\t\tget isSettled() {\n\t\t\treturn engine.isSettled;\n\t\t},\n\n\t\tget isInitialized() {\n\t\t\treturn engine.isInitialized;\n\t\t},\n\n\t\tget isReady() {\n\t\t\treturn engine.isReady;\n\t\t},\n\n\t\twhenReady: engine.whenReady.bind(engine),\n\n\t\tasync hydrate(\n\t\t\tloader: () =>\n\t\t\t\t| Promise<Record<string, Record<string, unknown>>>\n\t\t\t\t| Record<string, Record<string, unknown>>,\n\t\t) {\n\t\t\tif (engine.isRunning) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"[Directive] hydrate() must be called before start(). \" +\n\t\t\t\t\t\"The system is already running.\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst result = await loader();\n\t\t\tif (result && typeof result === \"object\") {\n\t\t\t\thydratedFacts = result;\n\t\t\t}\n\t\t},\n\n\t\tstart(): void {\n\t\t\t// Engine.start() runs module inits, then applies initialFacts/hydrate via callback\n\t\t\tengine.start();\n\n\t\t\tif (tickMs && tickMs > 0) {\n\t\t\t\t// Find the first module with a tick event and dispatch to it\n\t\t\t\tconst tickEventKey = Object.keys(flatModules[0]?.events ?? {}).find((k) => k.endsWith(`${SEPARATOR}tick`));\n\t\t\t\tif (tickEventKey) {\n\t\t\t\t\ttickInterval = setInterval(() => {\n\t\t\t\t\t\tengine.dispatch({ type: tickEventKey });\n\t\t\t\t\t}, tickMs);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tstop(): void {\n\t\t\tif (tickInterval) {\n\t\t\t\tclearInterval(tickInterval);\n\t\t\t\ttickInterval = null;\n\t\t\t}\n\t\t\tengine.stop();\n\t\t},\n\n\t\tdestroy(): void {\n\t\t\tthis.stop();\n\t\t\tengine.destroy();\n\t\t},\n\n\t\tdispatch(event: { type: string; [key: string]: unknown }) {\n\t\t\t// Events are dispatched with namespace prefix\n\t\t\t// e.g., { type: \"login\", token: \"abc\" } from auth module\n\t\t\t// becomes { type: \"auth::login\", token: \"abc\" }\n\t\t\t// But we keep them simple - the event type should match the schema\n\t\t\tengine.dispatch(event);\n\t\t},\n\n\t\tbatch: engine.batch.bind(engine),\n\n\t\t/**\n\t\t * Read a derivation value using namespaced syntax.\n\t\t * Accepts \"namespace.key\" format.\n\t\t *\n\t\t * @example\n\t\t * system.read(\"auth.status\") // → \"authenticated\"\n\t\t * system.read(\"data.count\") // → 5\n\t\t */\n\t\tread<T = unknown>(derivationId: string): T {\n\t\t\treturn engine.read(toInternalKey(derivationId));\n\t\t},\n\n\t\t/**\n\t\t * Subscribe to derivation changes using namespaced syntax.\n\t\t * Accepts \"namespace.key\" format.\n\t\t * Supports wildcard \"namespace.*\" to subscribe to all keys in a module.\n\t\t *\n\t\t * @example\n\t\t * system.subscribe([\"auth.status\", \"data.count\"], () => {\n\t\t * console.log(\"Auth or data changed\");\n\t\t * });\n\t\t *\n\t\t * @example Wildcard\n\t\t * system.subscribe([\"game.*\", \"chat.*\"], () => render());\n\t\t */\n\t\tsubscribe(ids: string[], listener: () => void): () => void {\n\t\t\tconst internalIds: string[] = [];\n\t\t\tfor (const id of ids) {\n\t\t\t\tif (id.endsWith(\".*\")) {\n\t\t\t\t\tconst ns = id.slice(0, -2);\n\t\t\t\t\tconst keys = namespaceKeysMap.get(ns);\n\t\t\t\t\tif (keys) {\n\t\t\t\t\t\tinternalIds.push(...keys);\n\t\t\t\t\t} else if (process.env.NODE_ENV !== \"production\") {\n\t\t\t\t\t\tconsole.warn(`[Directive] subscribe wildcard \"${id}\" — namespace \"${ns}\" not found.`);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tinternalIds.push(toInternalKey(id));\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn engine.subscribe(internalIds, listener);\n\t\t},\n\n\t\t/**\n\t\t * Subscribe to ALL fact and derivation changes in a module namespace.\n\t\t * Shorthand for subscribing to every key in a module.\n\t\t *\n\t\t * @example\n\t\t * const unsub = system.subscribeModule(\"game\", () => render());\n\t\t */\n\t\tsubscribeModule(namespace: string, listener: () => void): () => void {\n\t\t\tconst keys = namespaceKeysMap.get(namespace);\n\t\t\tif (!keys || keys.length === 0) {\n\t\t\t\tif (process.env.NODE_ENV !== \"production\") {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t`[Directive] subscribeModule(\"${namespace}\") — namespace not found. ` +\n\t\t\t\t\t\t`Available: ${[...namespaceKeysMap.keys()].join(\", \")}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn () => {};\n\t\t\t}\n\t\t\treturn engine.subscribe(keys, listener);\n\t\t},\n\n\t\t/**\n\t\t * Watch a fact or derivation for changes using namespaced syntax.\n\t\t * The key is auto-detected -- works with both fact keys and derivation keys.\n\t\t * Accepts \"namespace.key\" format.\n\t\t *\n\t\t * @example\n\t\t * system.watch(\"auth.token\", (newVal, oldVal) => { ... }) // fact\n\t\t * system.watch(\"auth.status\", (newVal, oldVal) => { ... }) // derivation\n\t\t */\n\t\twatch<T = unknown>(\n\t\t\tid: string,\n\t\t\tcallback: (newValue: T, previousValue: T | undefined) => void,\n\t\t\toptions?: { equalityFn?: (a: T, b: T | undefined) => boolean },\n\t\t): () => void {\n\t\t\treturn engine.watch(toInternalKey(id), callback, options);\n\t\t},\n\n\t\t/**\n\t\t * Returns a promise that resolves when the predicate becomes true.\n\t\t * The predicate receives namespaced facts (e.g., facts.auth.token).\n\t\t */\n\t\twhen(\n\t\t\tpredicate: (facts: Record<string, unknown>) => boolean,\n\t\t\toptions?: { timeout?: number },\n\t\t): Promise<void> {\n\t\t\t// Wrap predicate to provide namespaced facts view\n\t\t\treturn engine.when(\n\t\t\t\t() => predicate(namespacedFactsProxy as unknown as Record<string, unknown>),\n\t\t\t\toptions,\n\t\t\t);\n\t\t},\n\n\t\tonSettledChange: engine.onSettledChange.bind(engine),\n\t\tonTimeTravelChange: engine.onTimeTravelChange.bind(engine),\n\t\tinspect: engine.inspect.bind(engine),\n\t\tsettle: engine.settle.bind(engine),\n\t\texplain: engine.explain.bind(engine),\n\t\tgetSnapshot: engine.getSnapshot.bind(engine),\n\t\trestore: engine.restore.bind(engine),\n\n\t\t/**\n\t\t * Get a distributable snapshot with namespaced key translation.\n\t\t * Accepts \"namespace.key\" format in options (e.g., \"auth.effectivePlan\").\n\t\t * Returns data with namespaced keys (e.g., { auth: { effectivePlan: ... } }).\n\t\t */\n\t\tgetDistributableSnapshot<T = Record<string, unknown>>(\n\t\t\toptions?: {\n\t\t\t\tincludeDerivations?: string[];\n\t\t\t\texcludeDerivations?: string[];\n\t\t\t\tincludeFacts?: string[];\n\t\t\t\tttlSeconds?: number;\n\t\t\t\tmetadata?: Record<string, unknown>;\n\t\t\t\tincludeVersion?: boolean;\n\t\t\t},\n\t\t): {\n\t\t\tdata: T;\n\t\t\tcreatedAt: number;\n\t\t\texpiresAt?: number;\n\t\t\tversion?: string;\n\t\t\tmetadata?: Record<string, unknown>;\n\t\t} {\n\t\t\t// Translate namespaced keys to internal format\n\t\t\tconst internalOptions = {\n\t\t\t\t...options,\n\t\t\t\tincludeDerivations: options?.includeDerivations?.map(toInternalKey),\n\t\t\t\texcludeDerivations: options?.excludeDerivations?.map(toInternalKey),\n\t\t\t\tincludeFacts: options?.includeFacts?.map(toInternalKey),\n\t\t\t};\n\n\t\t\tconst snapshot = engine.getDistributableSnapshot(internalOptions);\n\n\t\t\t// Transform data keys from internal format (auth::status) to namespaced format (auth: { status })\n\t\t\tconst namespacedData: Record<string, Record<string, unknown>> = {};\n\n\t\t\tfor (const [key, value] of Object.entries(snapshot.data as Record<string, unknown>)) {\n\t\t\t\t// Find the namespace prefix (first separator)\n\t\t\t\tconst sepIndex = key.indexOf(SEPARATOR);\n\t\t\t\tif (sepIndex > 0) {\n\t\t\t\t\tconst namespace = key.slice(0, sepIndex);\n\t\t\t\t\tconst localKey = key.slice(sepIndex + SEPARATOR.length);\n\t\t\t\t\tif (!namespacedData[namespace]) {\n\t\t\t\t\t\tnamespacedData[namespace] = {};\n\t\t\t\t\t}\n\t\t\t\t\tnamespacedData[namespace][localKey] = value;\n\t\t\t\t} else {\n\t\t\t\t\t// No namespace found, keep as-is\n\t\t\t\t\tif (!namespacedData[\"_root\"]) {\n\t\t\t\t\t\tnamespacedData[\"_root\"] = {};\n\t\t\t\t\t}\n\t\t\t\t\tnamespacedData[\"_root\"][key] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\t...snapshot,\n\t\t\t\tdata: namespacedData as T,\n\t\t\t};\n\t\t},\n\n\t\t/**\n\t\t * Watch for changes to distributable snapshot derivations.\n\t\t * Accepts \"namespace.key\" format in options.\n\t\t * Callback receives data with namespaced keys.\n\t\t */\n\t\twatchDistributableSnapshot<T = Record<string, unknown>>(\n\t\t\toptions: {\n\t\t\t\tincludeDerivations?: string[];\n\t\t\t\texcludeDerivations?: string[];\n\t\t\t\tincludeFacts?: string[];\n\t\t\t\tttlSeconds?: number;\n\t\t\t\tmetadata?: Record<string, unknown>;\n\t\t\t\tincludeVersion?: boolean;\n\t\t\t},\n\t\t\tcallback: (snapshot: {\n\t\t\t\tdata: T;\n\t\t\t\tcreatedAt: number;\n\t\t\t\texpiresAt?: number;\n\t\t\t\tversion?: string;\n\t\t\t\tmetadata?: Record<string, unknown>;\n\t\t\t}) => void,\n\t\t): () => void {\n\t\t\t// Translate namespaced keys to internal format\n\t\t\tconst internalOptions = {\n\t\t\t\t...options,\n\t\t\t\tincludeDerivations: options?.includeDerivations?.map(toInternalKey),\n\t\t\t\texcludeDerivations: options?.excludeDerivations?.map(toInternalKey),\n\t\t\t\tincludeFacts: options?.includeFacts?.map(toInternalKey),\n\t\t\t};\n\n\t\t\treturn engine.watchDistributableSnapshot(\n\t\t\t\tinternalOptions,\n\t\t\t\t(snapshot: { data: Record<string, unknown>; createdAt: number; expiresAt?: number; version?: string; metadata?: Record<string, unknown> }) => {\n\t\t\t\t\t// Transform data keys from internal format to namespaced format\n\t\t\t\t\tconst namespacedData: Record<string, Record<string, unknown>> = {};\n\n\t\t\t\t\tfor (const [key, value] of Object.entries(snapshot.data)) {\n\t\t\t\t\t\tconst sepIndex = key.indexOf(SEPARATOR);\n\t\t\t\t\t\tif (sepIndex > 0) {\n\t\t\t\t\t\t\tconst namespace = key.slice(0, sepIndex);\n\t\t\t\t\t\t\tconst localKey = key.slice(sepIndex + SEPARATOR.length);\n\t\t\t\t\t\t\tif (!namespacedData[namespace]) {\n\t\t\t\t\t\t\t\tnamespacedData[namespace] = {};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tnamespacedData[namespace][localKey] = value;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (!namespacedData[\"_root\"]) {\n\t\t\t\t\t\t\t\tnamespacedData[\"_root\"] = {};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tnamespacedData[\"_root\"][key] = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tcallback({\n\t\t\t\t\t\t...snapshot,\n\t\t\t\t\t\tdata: namespacedData as T,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t);\n\t\t},\n\t\tregisterModule(namespace: string, moduleDef: ModuleDef<ModuleSchema>): void {\n\t\t\t// Validate namespace\n\t\t\tif (moduleNamespaces.has(namespace)) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`[Directive] Module namespace \"${namespace}\" already exists. ` +\n\t\t\t\t\t`Cannot register a duplicate namespace.`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (namespace.includes(SEPARATOR)) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`[Directive] Module name \"${namespace}\" contains the reserved separator \"${SEPARATOR}\".`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (BLOCKED_PROPS.has(namespace)) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`[Directive] Module name \"${namespace}\" is a blocked property.`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Validate schema keys\n\t\t\tfor (const key of Object.keys(moduleDef.schema.facts)) {\n\t\t\t\tif (key.includes(SEPARATOR)) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`[Directive] Schema key \"${key}\" in module \"${namespace}\" contains the reserved separator \"${SEPARATOR}\".`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst mod = moduleDef;\n\t\t\tconst hasCrossModuleDeps = mod.crossModuleDeps && Object.keys(mod.crossModuleDeps).length > 0;\n\t\t\tconst depNamespaces = hasCrossModuleDeps ? Object.keys(mod.crossModuleDeps!) : [];\n\n\t\t\t// Build prefixed schema, derive, events, effects, constraints, resolvers\n\t\t\t// (same logic as initial createNamespacedSystem)\n\t\t\tconst prefixedFacts: Record<string, unknown> = {};\n\t\t\tfor (const [key, value] of Object.entries(mod.schema.facts)) {\n\t\t\t\tprefixedFacts[`${namespace}${SEPARATOR}${key}`] = value;\n\t\t\t}\n\n\t\t\tconst prefixedInit = mod.init\n\t\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Module init type coercion\n\t\t\t\t? (facts: any) => {\n\t\t\t\t\t\tconst moduleFactsProxy = createModuleFactsProxy(facts, namespace);\n\t\t\t\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Module init type coercion\n\t\t\t\t\t\t(mod.init as any)(moduleFactsProxy);\n\t\t\t\t\t}\n\t\t\t\t: undefined;\n\n\t\t\tconst prefixedDerive: Record<string, (facts: unknown, derive: unknown) => unknown> = {};\n\t\t\tif (mod.derive) {\n\t\t\t\tfor (const [key, fn] of Object.entries(mod.derive)) {\n\t\t\t\t\tprefixedDerive[`${namespace}${SEPARATOR}${key}`] = (facts: unknown, derive: unknown) => {\n\t\t\t\t\t\tconst factsProxy = hasCrossModuleDeps\n\t\t\t\t\t\t\t? createCrossModuleFactsProxy(facts as Record<string, unknown>, namespace, depNamespaces)\n\t\t\t\t\t\t\t: createModuleFactsProxy(facts as Record<string, unknown>, namespace);\n\t\t\t\t\t\tconst deriveProxy = createModuleDeriveProxy(derive as Record<string, unknown>, namespace);\n\t\t\t\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Derive function type coercion\n\t\t\t\t\t\treturn (fn as any)(factsProxy, deriveProxy);\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst prefixedEventHandlers: Record<string, (facts: unknown, event: unknown) => void> = {};\n\t\t\tif (mod.events) {\n\t\t\t\tfor (const [key, handler] of Object.entries(mod.events)) {\n\t\t\t\t\tprefixedEventHandlers[`${namespace}${SEPARATOR}${key}`] = (facts: unknown, event: unknown) => {\n\t\t\t\t\t\tconst moduleFactsProxy = createModuleFactsProxy(facts as Record<string, unknown>, namespace);\n\t\t\t\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Event handler type coercion\n\t\t\t\t\t\t(handler as any)(moduleFactsProxy, event);\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst prefixedConstraints: Record<string, unknown> = {};\n\t\t\tif (mod.constraints) {\n\t\t\t\tfor (const [key, constraint] of Object.entries(mod.constraints)) {\n\t\t\t\t\tconst constraintDef = constraint as {\n\t\t\t\t\t\twhen: (facts: unknown) => boolean | Promise<boolean>;\n\t\t\t\t\t\trequire: unknown | ((facts: unknown) => unknown);\n\t\t\t\t\t\tpriority?: number;\n\t\t\t\t\t\tasync?: boolean;\n\t\t\t\t\t\ttimeout?: number;\n\t\t\t\t\t\tdeps?: string[];\n\t\t\t\t\t};\n\t\t\t\t\tprefixedConstraints[`${namespace}${SEPARATOR}${key}`] = {\n\t\t\t\t\t\t...constraintDef,\n\t\t\t\t\t\tdeps: constraintDef.deps?.map((dep) => `${namespace}${SEPARATOR}${dep}`),\n\t\t\t\t\t\twhen: (facts: unknown) => {\n\t\t\t\t\t\t\tconst factsProxy = hasCrossModuleDeps\n\t\t\t\t\t\t\t\t? createCrossModuleFactsProxy(facts as Record<string, unknown>, namespace, depNamespaces)\n\t\t\t\t\t\t\t\t: createModuleFactsProxy(facts as Record<string, unknown>, namespace);\n\t\t\t\t\t\t\treturn constraintDef.when(factsProxy);\n\t\t\t\t\t\t},\n\t\t\t\t\t\trequire: typeof constraintDef.require === \"function\"\n\t\t\t\t\t\t\t? (facts: unknown) => {\n\t\t\t\t\t\t\t\t\tconst factsProxy = hasCrossModuleDeps\n\t\t\t\t\t\t\t\t\t\t? createCrossModuleFactsProxy(facts as Record<string, unknown>, namespace, depNamespaces)\n\t\t\t\t\t\t\t\t\t\t: createModuleFactsProxy(facts as Record<string, unknown>, namespace);\n\t\t\t\t\t\t\t\t\treturn (constraintDef.require as (facts: unknown) => unknown)(factsProxy);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: constraintDef.require,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst prefixedResolvers: Record<string, unknown> = {};\n\t\t\tif (mod.resolvers) {\n\t\t\t\tfor (const [key, resolver] of Object.entries(mod.resolvers)) {\n\t\t\t\t\tconst resolverDef = resolver as {\n\t\t\t\t\t\trequirement: string;\n\t\t\t\t\t\tresolve: (req: unknown, ctx: { facts: unknown; signal: AbortSignal }) => Promise<void>;\n\t\t\t\t\t\tkey?: (req: unknown) => string;\n\t\t\t\t\t\tretry?: unknown;\n\t\t\t\t\t\ttimeout?: number;\n\t\t\t\t\t};\n\t\t\t\t\tprefixedResolvers[`${namespace}${SEPARATOR}${key}`] = {\n\t\t\t\t\t\t...resolverDef,\n\t\t\t\t\t\tresolve: async (req: unknown, ctx: { facts: unknown; signal: AbortSignal }) => {\n\t\t\t\t\t\t\t// Use live modulesMap reference (already mutated by registerModule before this runs)\n\t\t\t\t\t\t\tconst namespacedFacts = createNamespacedFactsProxy(ctx.facts as Record<string, unknown>, modulesMap, getModuleNames);\n\t\t\t\t\t\t\tawait resolverDef.resolve(req, {\n\t\t\t\t\t\t\t\tfacts: namespacedFacts[namespace],\n\t\t\t\t\t\t\t\tsignal: ctx.signal,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst prefixedEffects: Record<string, unknown> = {};\n\t\t\tif (mod.effects) {\n\t\t\t\tfor (const [key, effect] of Object.entries(mod.effects)) {\n\t\t\t\t\tconst effectDef = effect as {\n\t\t\t\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Effect run function type\n\t\t\t\t\t\trun: (facts: any, prev: any) => void | Promise<void>;\n\t\t\t\t\t\tdeps?: string[];\n\t\t\t\t\t};\n\t\t\t\t\tprefixedEffects[`${namespace}${SEPARATOR}${key}`] = {\n\t\t\t\t\t\t...effectDef,\n\t\t\t\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Effect run function wrapper\n\t\t\t\t\t\trun: (facts: any, prev: any) => {\n\t\t\t\t\t\t\tconst factsProxy = hasCrossModuleDeps\n\t\t\t\t\t\t\t\t? createCrossModuleFactsProxy(facts as Record<string, unknown>, namespace, depNamespaces)\n\t\t\t\t\t\t\t\t: createModuleFactsProxy(facts as Record<string, unknown>, namespace);\n\t\t\t\t\t\t\tconst prevProxy = prev\n\t\t\t\t\t\t\t\t? (hasCrossModuleDeps\n\t\t\t\t\t\t\t\t\t\t? createCrossModuleFactsProxy(prev as Record<string, unknown>, namespace, depNamespaces)\n\t\t\t\t\t\t\t\t\t\t: createModuleFactsProxy(prev as Record<string, unknown>, namespace))\n\t\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\t\t\treturn effectDef.run(factsProxy, prevProxy);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tdeps: effectDef.deps?.map((dep) => `${namespace}${SEPARATOR}${dep}`),\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Register namespace\n\t\t\tmoduleNamespaces.add(namespace);\n\t\t\t(modulesMap as Record<string, ModuleDef<ModuleSchema>>)[namespace] = mod;\n\t\t\t// Invalidate cached module names so proxies see the new namespace\n\t\t\tmoduleNamesCache.names = null;\n\n\t\t\t// Update namespace keys map\n\t\t\tconst keys: string[] = [];\n\t\t\tfor (const key of Object.keys(mod.schema.facts)) {\n\t\t\t\tkeys.push(`${namespace}${SEPARATOR}${key}`);\n\t\t\t}\n\t\t\tif (mod.schema.derivations) {\n\t\t\t\tfor (const key of Object.keys(mod.schema.derivations)) {\n\t\t\t\t\tkeys.push(`${namespace}${SEPARATOR}${key}`);\n\t\t\t\t}\n\t\t\t}\n\t\t\tnamespaceKeysMap.set(namespace, keys);\n\n\t\t\t// Delegate to engine's registerModule\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Engine registerModule type\n\t\t\t(engine as any).registerModule({\n\t\t\t\tid: mod.id,\n\t\t\t\tschema: prefixedFacts,\n\t\t\t\trequirements: mod.schema.requirements ?? {},\n\t\t\t\tinit: prefixedInit,\n\t\t\t\tderive: Object.keys(prefixedDerive).length > 0 ? prefixedDerive : undefined,\n\t\t\t\tevents: Object.keys(prefixedEventHandlers).length > 0 ? prefixedEventHandlers : undefined,\n\t\t\t\teffects: Object.keys(prefixedEffects).length > 0 ? prefixedEffects : undefined,\n\t\t\t\tconstraints: Object.keys(prefixedConstraints).length > 0 ? prefixedConstraints : undefined,\n\t\t\t\tresolvers: Object.keys(prefixedResolvers).length > 0 ? prefixedResolvers : undefined,\n\t\t\t\thooks: mod.hooks,\n\t\t\t\tsnapshotEvents: (snapshotModulesSet && !snapshotModulesSet.has(namespace))\n\t\t\t\t\t? [] // Module excluded from snapshots\n\t\t\t\t\t: mod.snapshotEvents?.map((e: string) => `${namespace}${SEPARATOR}${e}`),\n\t\t\t});\n\t\t},\n\n\t// biome-ignore lint/suspicious/noExplicitAny: Type narrowing for NamespacedSystem\n\t} as any;\n\n\treturn system;\n}\n\n// ============================================================================\n// Key Conversion Helpers\n// ============================================================================\n\n/**\n * Convert a namespaced key (e.g., \"auth.status\") to internal prefixed format (\"auth::status\").\n * If the key is already in prefixed format, returns it unchanged.\n *\n * @example\n * toInternalKey(\"auth.status\") // → \"auth::status\"\n * toInternalKey(\"auth::status\") // → \"auth::status\" (unchanged)\n * toInternalKey(\"status\") // → \"status\" (unchanged)\n */\nfunction toInternalKey(key: string): string {\n\t// If key contains a dot, convert to separator format\n\tif (key.includes(\".\")) {\n\t\tconst [namespace, ...rest] = key.split(\".\");\n\t\treturn `${namespace}${SEPARATOR}${rest.join(SEPARATOR)}`;\n\t}\n\t// Already in internal format or simple key\n\treturn key;\n}\n\n// ============================================================================\n// Proxy Helpers\n// ============================================================================\n\n/**\n * Create a proxy for a single module's facts (used in init, event handlers).\n * Translates unprefixed keys to prefixed: `token` → `auth::token`\n *\n * Proxies are cached per facts store and namespace for performance.\n */\nfunction createModuleFactsProxy(\n\tfacts: Record<string, unknown>,\n\tnamespace: string,\n): Record<string, unknown> {\n\t// Check cache first\n\tlet namespaceCache = moduleFactsProxyCache.get(facts);\n\tif (namespaceCache) {\n\t\tconst cached = namespaceCache.get(namespace);\n\t\tif (cached) return cached;\n\t} else {\n\t\tnamespaceCache = new Map();\n\t\tmoduleFactsProxyCache.set(facts, namespaceCache);\n\t}\n\n\tconst proxy = new Proxy({} as Record<string, unknown>, {\n\t\tget(_, prop: string | symbol) {\n\t\t\tif (typeof prop === \"symbol\") return undefined;\n\t\t\tif (BLOCKED_PROPS.has(prop)) return undefined;\n\t\t\t// Special properties pass through\n\t\t\tif (prop === \"$store\" || prop === \"$snapshot\") {\n\t\t\t\treturn (facts as Record<string, unknown>)[prop];\n\t\t\t}\n\t\t\treturn (facts as Record<string, unknown>)[`${namespace}${SEPARATOR}${prop}`];\n\t\t},\n\t\tset(_, prop: string | symbol, value: unknown) {\n\t\t\tif (typeof prop === \"symbol\") return false;\n\t\t\tif (BLOCKED_PROPS.has(prop)) return false;\n\t\t\t(facts as Record<string, unknown>)[`${namespace}${SEPARATOR}${prop}`] = value;\n\t\t\treturn true;\n\t\t},\n\t\thas(_, prop: string | symbol) {\n\t\t\tif (typeof prop === \"symbol\") return false;\n\t\t\tif (BLOCKED_PROPS.has(prop)) return false;\n\t\t\treturn `${namespace}${SEPARATOR}${prop}` in facts;\n\t\t},\n\t\tdeleteProperty(_, prop: string | symbol) {\n\t\t\tif (typeof prop === \"symbol\") return false;\n\t\t\tif (BLOCKED_PROPS.has(prop)) return false;\n\t\t\tdelete (facts as Record<string, unknown>)[`${namespace}${SEPARATOR}${prop}`];\n\t\t\treturn true;\n\t\t},\n\t});\n\n\tnamespaceCache.set(namespace, proxy);\n\treturn proxy;\n}\n\n/**\n * Create a nested proxy for namespaced facts access.\n * `facts.auth.token` → reads `auth::token` from flat store\n *\n * Uses Set for O(1) namespace lookups and caches the outer proxy.\n */\nfunction createNamespacedFactsProxy(\n\tfacts: Record<string, unknown>,\n\tmodulesMap: ModulesMap,\n\tgetModuleNames: () => string[],\n): Record<string, Record<string, unknown>> {\n\t// Check cache first\n\tconst cached = namespacedFactsProxyCache.get(facts);\n\tif (cached) return cached;\n\n\tconst proxy = new Proxy({} as Record<string, Record<string, unknown>>, {\n\t\tget(_, namespace: string | symbol) {\n\t\t\tif (typeof namespace === \"symbol\") return undefined;\n\t\t\tif (BLOCKED_PROPS.has(namespace)) return undefined;\n\t\t\tif (!Object.hasOwn(modulesMap, namespace)) return undefined;\n\n\t\t\t// Return a cached proxy for this module's facts\n\t\t\treturn createModuleFactsProxy(facts, namespace);\n\t\t},\n\t\thas(_, namespace: string | symbol) {\n\t\t\tif (typeof namespace === \"symbol\") return false;\n\t\t\tif (BLOCKED_PROPS.has(namespace)) return false;\n\t\t\treturn Object.hasOwn(modulesMap, namespace);\n\t\t},\n\t\townKeys() {\n\t\t\treturn getModuleNames();\n\t\t},\n\t\tgetOwnPropertyDescriptor(_, namespace: string | symbol) {\n\t\t\tif (typeof namespace === \"symbol\") return undefined;\n\t\t\tif (Object.hasOwn(modulesMap, namespace)) {\n\t\t\t\treturn { configurable: true, enumerable: true };\n\t\t\t}\n\t\t\treturn undefined;\n\t\t},\n\t});\n\n\tnamespacedFactsProxyCache.set(facts, proxy);\n\treturn proxy;\n}\n\n/**\n * WeakMap to cache cross-module facts proxies.\n * Keyed by facts store, then by \"selfNamespace:depKeys\" string.\n */\nconst crossModuleFactsProxyCache = new WeakMap<\n\tRecord<string, unknown>,\n\tMap<string, Record<string, Record<string, unknown>>>\n>();\n\n/**\n * Create a proxy for cross-module facts access with \"self\" for own module.\n * `facts.self.users` → reads own module's facts\n * `facts.auth.token` → reads dependency module's facts\n *\n * Used when a module has crossModuleDeps defined.\n */\nfunction createCrossModuleFactsProxy(\n\tfacts: Record<string, unknown>,\n\tselfNamespace: string,\n\tdepNamespaces: string[],\n): Record<string, Record<string, unknown>> {\n\t// Create cache key using JSON.stringify for robustness with special characters\n\tconst cacheKey = `${selfNamespace}:${JSON.stringify([...depNamespaces].sort())}`;\n\n\t// Check cache first\n\tlet namespaceCache = crossModuleFactsProxyCache.get(facts);\n\tif (namespaceCache) {\n\t\tconst cached = namespaceCache.get(cacheKey);\n\t\tif (cached) return cached;\n\t} else {\n\t\tnamespaceCache = new Map();\n\t\tcrossModuleFactsProxyCache.set(facts, namespaceCache);\n\t}\n\n\tconst depNamesSet = new Set(depNamespaces);\n\tconst allKeys = [\"self\", ...depNamespaces];\n\n\tconst proxy = new Proxy({} as Record<string, Record<string, unknown>>, {\n\t\tget(_, key: string | symbol) {\n\t\t\tif (typeof key === \"symbol\") return undefined;\n\t\t\tif (BLOCKED_PROPS.has(key)) return undefined;\n\n\t\t\t// \"self\" maps to own module's namespace\n\t\t\tif (key === \"self\") {\n\t\t\t\treturn createModuleFactsProxy(facts, selfNamespace);\n\t\t\t}\n\n\t\t\t// Check if it's a declared dependency\n\t\t\tif (depNamesSet.has(key)) {\n\t\t\t\treturn createModuleFactsProxy(facts, key);\n\t\t\t}\n\n\t\t\t// Dev-mode warning for undeclared cross-module access\n\t\t\tif (process.env.NODE_ENV !== \"production\" && typeof key === \"string\") {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`[Directive] Module \"${selfNamespace}\" accessed undeclared cross-module property \"${key}\". ` +\n\t\t\t\t\t`Add it to crossModuleDeps or use \"facts.self.${key}\" for own module facts.`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t},\n\t\thas(_, key: string | symbol) {\n\t\t\tif (typeof key === \"symbol\") return false;\n\t\t\tif (BLOCKED_PROPS.has(key)) return false;\n\t\t\treturn key === \"self\" || depNamesSet.has(key);\n\t\t},\n\t\townKeys() {\n\t\t\treturn allKeys;\n\t\t},\n\t\tgetOwnPropertyDescriptor(_, key: string | symbol) {\n\t\t\tif (typeof key === \"symbol\") return undefined;\n\t\t\tif (key === \"self\" || depNamesSet.has(key)) {\n\t\t\t\treturn { configurable: true, enumerable: true };\n\t\t\t}\n\t\t\treturn undefined;\n\t\t},\n\t});\n\n\tnamespaceCache.set(cacheKey, proxy);\n\treturn proxy;\n}\n\n/**\n * Create a proxy for a single module's derivations.\n * Translates unprefixed keys to prefixed: `status` → `auth::status`\n *\n * Proxies are cached per derive store and namespace for performance.\n */\nfunction createModuleDeriveProxy(\n\tderive: Record<string, unknown>,\n\tnamespace: string,\n): Record<string, unknown> {\n\t// Check cache first\n\tlet namespaceCache = moduleDeriveProxyCache.get(derive);\n\tif (namespaceCache) {\n\t\tconst cached = namespaceCache.get(namespace);\n\t\tif (cached) return cached;\n\t} else {\n\t\tnamespaceCache = new Map();\n\t\tmoduleDeriveProxyCache.set(derive, namespaceCache);\n\t}\n\n\tconst proxy = new Proxy({} as Record<string, unknown>, {\n\t\tget(_, prop: string | symbol) {\n\t\t\tif (typeof prop === \"symbol\") return undefined;\n\t\t\tif (BLOCKED_PROPS.has(prop)) return undefined;\n\t\t\treturn derive[`${namespace}${SEPARATOR}${prop}`];\n\t\t},\n\t\thas(_, prop: string | symbol) {\n\t\t\tif (typeof prop === \"symbol\") return false;\n\t\t\tif (BLOCKED_PROPS.has(prop)) return false;\n\t\t\treturn `${namespace}${SEPARATOR}${prop}` in derive;\n\t\t},\n\t});\n\n\tnamespaceCache.set(namespace, proxy);\n\treturn proxy;\n}\n\n/**\n * Create a nested proxy for namespaced derivations access.\n * `derive.auth.status` → reads `auth::status` from flat derive\n *\n * Uses Set for O(1) namespace lookups and caches the outer proxy.\n */\nfunction createNamespacedDeriveProxy(\n\tderive: Record<string, unknown>,\n\tmodulesMap: ModulesMap,\n\tgetModuleNames: () => string[],\n): Record<string, Record<string, unknown>> {\n\t// Check cache first\n\tconst cached = namespacedDeriveProxyCache.get(derive);\n\tif (cached) return cached;\n\n\tconst proxy = new Proxy({} as Record<string, Record<string, unknown>>, {\n\t\tget(_, namespace: string | symbol) {\n\t\t\tif (typeof namespace === \"symbol\") return undefined;\n\t\t\tif (BLOCKED_PROPS.has(namespace)) return undefined;\n\t\t\tif (!Object.hasOwn(modulesMap, namespace)) return undefined;\n\n\t\t\t// Return a cached proxy for this module's derivations\n\t\t\treturn createModuleDeriveProxy(derive, namespace);\n\t\t},\n\t\thas(_, namespace: string | symbol) {\n\t\t\tif (typeof namespace === \"symbol\") return false;\n\t\t\tif (BLOCKED_PROPS.has(namespace)) return false;\n\t\t\treturn Object.hasOwn(modulesMap, namespace);\n\t\t},\n\t\townKeys() {\n\t\t\treturn getModuleNames();\n\t\t},\n\t\tgetOwnPropertyDescriptor(_, namespace: string | symbol) {\n\t\t\tif (typeof namespace === \"symbol\") return undefined;\n\t\t\tif (Object.hasOwn(modulesMap, namespace)) {\n\t\t\t\treturn { configurable: true, enumerable: true };\n\t\t\t}\n\t\t\treturn undefined;\n\t\t},\n\t});\n\n\tnamespacedDeriveProxyCache.set(derive, proxy);\n\treturn proxy;\n}\n\n/**\n * WeakMap to cache module events proxies.\n */\nconst moduleEventsProxyCache = new WeakMap<\n\t// biome-ignore lint/suspicious/noExplicitAny: Engine type for cache key\n\tany,\n\tMap<string, Record<string, (payload?: Record<string, unknown>) => void>>\n>();\n\n/**\n * Create a nested proxy for namespaced events access.\n * `events.auth.login({ token })` → dispatches `{ type: \"auth::login\", token }`\n *\n * Uses Set for O(1) namespace lookups and caches proxies for performance.\n */\nfunction createNamespacedEventsProxy(\n\t// biome-ignore lint/suspicious/noExplicitAny: Engine type\n\tengine: any,\n\tmodulesMap: ModulesMap,\n\tgetModuleNames: () => string[],\n): Record<string, Record<string, (payload?: Record<string, unknown>) => void>> {\n\t// Get or create the namespace cache for this engine\n\tlet namespaceCache = moduleEventsProxyCache.get(engine);\n\tif (!namespaceCache) {\n\t\tnamespaceCache = new Map();\n\t\tmoduleEventsProxyCache.set(engine, namespaceCache);\n\t}\n\n\treturn new Proxy({} as Record<string, Record<string, (payload?: Record<string, unknown>) => void>>, {\n\t\tget(_, namespace: string | symbol) {\n\t\t\tif (typeof namespace === \"symbol\") return undefined;\n\t\t\tif (BLOCKED_PROPS.has(namespace)) return undefined;\n\t\t\tif (!Object.hasOwn(modulesMap, namespace)) return undefined;\n\n\t\t\t// Check cache for this namespace's event proxy\n\t\t\tconst cached = namespaceCache!.get(namespace);\n\t\t\tif (cached) return cached;\n\n\t\t\t// Create and cache the module events proxy\n\t\t\tconst moduleEventsProxy = new Proxy({} as Record<string, (payload?: Record<string, unknown>) => void>, {\n\t\t\t\tget(_, eventName: string | symbol) {\n\t\t\t\t\tif (typeof eventName === \"symbol\") return undefined;\n\t\t\t\t\tif (BLOCKED_PROPS.has(eventName)) return undefined;\n\n\t\t\t\t\t// Return a function that dispatches the prefixed event\n\t\t\t\t\treturn (payload?: Record<string, unknown>) => {\n\t\t\t\t\t\tengine.dispatch({ type: `${namespace}${SEPARATOR}${eventName}`, ...payload });\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tnamespaceCache!.set(namespace, moduleEventsProxy);\n\t\t\treturn moduleEventsProxy;\n\t\t},\n\t\thas(_, namespace: string | symbol) {\n\t\t\tif (typeof namespace === \"symbol\") return false;\n\t\t\tif (BLOCKED_PROPS.has(namespace)) return false;\n\t\t\treturn Object.hasOwn(modulesMap, namespace);\n\t\t},\n\t\townKeys() {\n\t\t\treturn getModuleNames();\n\t\t},\n\t\tgetOwnPropertyDescriptor(_, namespace: string | symbol) {\n\t\t\tif (typeof namespace === \"symbol\") return undefined;\n\t\t\tif (Object.hasOwn(modulesMap, namespace)) {\n\t\t\t\treturn { configurable: true, enumerable: true };\n\t\t\t}\n\t\t\treturn undefined;\n\t\t},\n\t});\n}\n\n// ============================================================================\n// Single Module System\n// ============================================================================\n\n/**\n * Create a system with a single module (no namespacing).\n * Facts, derivations, and events are accessed directly.\n */\nfunction createSingleModuleSystem<S extends ModuleSchema>(\n\toptions: CreateSystemOptionsSingle<S>,\n): SingleModuleSystem<S> {\n\tconst mod = options.module;\n\n\t// Validate module is provided\n\tif (!mod) {\n\t\tthrow new Error(\n\t\t\t\"[Directive] createSystem requires a module. Got: \" + typeof mod,\n\t\t);\n\t}\n\n\t// Validate tickMs if provided\n\tif (options.tickMs !== undefined && options.tickMs <= 0) {\n\t\tthrow new Error(\"[Directive] tickMs must be a positive number\");\n\t}\n\n\t// Validate initialFacts for prototype pollution\n\tif (options.initialFacts && !isPrototypeSafe(options.initialFacts)) {\n\t\tthrow new Error(\n\t\t\t\"[Directive] initialFacts contains potentially dangerous keys \" +\n\t\t\t\"(__proto__, constructor, or prototype). This may indicate a \" +\n\t\t\t\"prototype pollution attack.\",\n\t\t);\n\t}\n\n\t// Dev-mode warnings\n\tif (process.env.NODE_ENV !== \"production\") {\n\t\t// Warn if crossModuleDeps is defined (ignored in single module mode)\n\t\tif (mod.crossModuleDeps && Object.keys(mod.crossModuleDeps).length > 0) {\n\t\t\tconsole.warn(\n\t\t\t\t\"[Directive] Single module mode ignores crossModuleDeps. \" +\n\t\t\t\t\"Use multiple modules if cross-module access is needed: \" +\n\t\t\t\t\"createSystem({ modules: { ... } })\",\n\t\t\t);\n\t\t}\n\n\t\t// Warn if tickMs set without tick event handler\n\t\tif (options.tickMs && options.tickMs > 0) {\n\t\t\tconst hasTickHandler = mod.events && \"tick\" in mod.events;\n\t\t\tif (!hasTickHandler) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`[Directive] tickMs is set to ${options.tickMs}ms but module has no \"tick\" event handler.`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t// Warn if snapshotModules is set (has no effect in single-module mode)\n\t\tif (options.debug?.snapshotModules) {\n\t\t\tconsole.warn(\n\t\t\t\t\"[Directive] debug.snapshotModules has no effect in single-module mode. \" +\n\t\t\t\t\"Use snapshotEvents on the module definition instead, or switch to \" +\n\t\t\t\t\"createSystem({ modules: { ... } }) for multi-module filtering.\",\n\t\t\t);\n\t\t}\n\t}\n\n\t// Apply zero-config defaults if enabled\n\tlet debug = options.debug;\n\tlet errorBoundary = options.errorBoundary;\n\n\tif (options.zeroConfig) {\n\t\tconst isDev = process.env.NODE_ENV !== \"production\";\n\n\t\tdebug = {\n\t\t\ttimeTravel: isDev,\n\t\t\tmaxSnapshots: 100,\n\t\t\t...options.debug,\n\t\t};\n\n\t\terrorBoundary = {\n\t\t\tonConstraintError: \"skip\",\n\t\t\tonResolverError: \"skip\",\n\t\t\tonEffectError: \"skip\",\n\t\t\tonDerivationError: \"skip\",\n\t\t\t...options.errorBoundary,\n\t\t};\n\t}\n\n\t// Store for hydrated facts\n\tlet hydratedFacts: Record<string, unknown> | null = null;\n\n\t// Engine reference\n\t// biome-ignore lint/suspicious/noExplicitAny: Engine type\n\tlet engine: any = null;\n\n\t// Create engine with the module directly (no prefixing needed)\n\tengine = createEngine({\n\t\tmodules: [\n\t\t\t{\n\t\t\t\tid: mod.id,\n\t\t\t\tschema: mod.schema.facts,\n\t\t\t\trequirements: mod.schema.requirements,\n\t\t\t\tinit: mod.init,\n\t\t\t\tderive: mod.derive,\n\t\t\t\tevents: mod.events,\n\t\t\t\teffects: mod.effects,\n\t\t\t\tconstraints: mod.constraints,\n\t\t\t\tresolvers: mod.resolvers,\n\t\t\t\thooks: mod.hooks,\n\t\t\t\tsnapshotEvents: mod.snapshotEvents,\n\t\t\t},\n\t\t// biome-ignore lint/suspicious/noExplicitAny: Module format\n\t\t] as any,\n\t\tplugins: options.plugins,\n\t\tdebug,\n\t\terrorBoundary,\n\t\ttickMs: options.tickMs,\n\t\tonAfterModuleInit: () => {\n\t\t\t// Apply initialFacts\n\t\t\tif (options.initialFacts) {\n\t\t\t\tfor (const [key, value] of Object.entries(options.initialFacts)) {\n\t\t\t\t\tif (BLOCKED_PROPS.has(key)) continue;\n\t\t\t\t\t(engine.facts as Record<string, unknown>)[key] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Apply hydrated facts (takes precedence)\n\t\t\tif (hydratedFacts) {\n\t\t\t\tfor (const [key, value] of Object.entries(hydratedFacts)) {\n\t\t\t\t\tif (BLOCKED_PROPS.has(key)) continue;\n\t\t\t\t\t(engine.facts as Record<string, unknown>)[key] = value;\n\t\t\t\t}\n\t\t\t\thydratedFacts = null;\n\t\t\t}\n\t\t},\n\t});\n\n\t// Create events proxy for direct access\n\tconst eventsProxy = new Proxy({} as Record<string, (payload?: Record<string, unknown>) => void>, {\n\t\tget(_, eventName: string | symbol) {\n\t\t\tif (typeof eventName === \"symbol\") return undefined;\n\t\t\tif (BLOCKED_PROPS.has(eventName)) return undefined;\n\n\t\t\treturn (payload?: Record<string, unknown>) => {\n\t\t\t\tengine.dispatch({ type: eventName, ...payload });\n\t\t\t};\n\t\t},\n\t});\n\n\t// Build the single module system\n\tlet tickInterval: ReturnType<typeof setInterval> | null = null;\n\tconst tickMs = options.tickMs;\n\n\tconst system: SingleModuleSystem<S> = {\n\t\t_mode: \"single\",\n\t\tfacts: engine.facts,\n\t\tdebug: engine.debug,\n\t\tderive: engine.derive,\n\t\tevents: eventsProxy as SingleModuleSystem<S>[\"events\"],\n\t\tconstraints: engine.constraints,\n\t\teffects: engine.effects,\n\n\t\tget isRunning() {\n\t\t\treturn engine.isRunning;\n\t\t},\n\n\t\tget isSettled() {\n\t\t\treturn engine.isSettled;\n\t\t},\n\n\t\tget isInitialized() {\n\t\t\treturn engine.isInitialized;\n\t\t},\n\n\t\tget isReady() {\n\t\t\treturn engine.isReady;\n\t\t},\n\n\t\twhenReady: engine.whenReady.bind(engine),\n\n\t\tasync hydrate(\n\t\t\tloader: () => Promise<Record<string, unknown>> | Record<string, unknown>,\n\t\t) {\n\t\t\tif (engine.isRunning) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"[Directive] hydrate() must be called before start(). \" +\n\t\t\t\t\t\"The system is already running.\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst result = await loader();\n\t\t\tif (result && typeof result === \"object\") {\n\t\t\t\thydratedFacts = result as Record<string, unknown>;\n\t\t\t}\n\t\t},\n\n\t\tstart(): void {\n\t\t\tengine.start();\n\n\t\t\tif (tickMs && tickMs > 0) {\n\t\t\t\tconst hasTickHandler = mod.events && \"tick\" in mod.events;\n\t\t\t\tif (hasTickHandler) {\n\t\t\t\t\ttickInterval = setInterval(() => {\n\t\t\t\t\t\tengine.dispatch({ type: \"tick\" });\n\t\t\t\t\t}, tickMs);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tstop(): void {\n\t\t\tif (tickInterval) {\n\t\t\t\tclearInterval(tickInterval);\n\t\t\t\ttickInterval = null;\n\t\t\t}\n\t\t\tengine.stop();\n\t\t},\n\n\t\tdestroy(): void {\n\t\t\tthis.stop();\n\t\t\tengine.destroy();\n\t\t},\n\n\t\tdispatch(event: { type: string; [key: string]: unknown }) {\n\t\t\tengine.dispatch(event);\n\t\t},\n\n\t\tbatch: engine.batch.bind(engine),\n\n\t\tread<T = unknown>(derivationId: string): T {\n\t\t\treturn engine.read(derivationId);\n\t\t},\n\n\t\tsubscribe(ids: string[], listener: () => void): () => void {\n\t\t\treturn engine.subscribe(ids, listener);\n\t\t},\n\n\t\twatch<T = unknown>(\n\t\t\tid: string,\n\t\t\tcallback: (newValue: T, previousValue: T | undefined) => void,\n\t\t\toptions?: { equalityFn?: (a: T, b: T | undefined) => boolean },\n\t\t): () => void {\n\t\t\treturn engine.watch(id, callback, options);\n\t\t},\n\n\t\twhen(\n\t\t\tpredicate: (facts: Record<string, unknown>) => boolean,\n\t\t\toptions?: { timeout?: number },\n\t\t): Promise<void> {\n\t\t\treturn engine.when(predicate, options);\n\t\t},\n\n\t\tonSettledChange: engine.onSettledChange.bind(engine),\n\t\tonTimeTravelChange: engine.onTimeTravelChange.bind(engine),\n\t\tinspect: engine.inspect.bind(engine),\n\t\tsettle: engine.settle.bind(engine),\n\t\texplain: engine.explain.bind(engine),\n\t\tgetSnapshot: engine.getSnapshot.bind(engine),\n\t\trestore: engine.restore.bind(engine),\n\t\tgetDistributableSnapshot: engine.getDistributableSnapshot.bind(engine),\n\t\twatchDistributableSnapshot: engine.watchDistributableSnapshot.bind(engine),\n\n\t\tregisterModule(moduleDef: ModuleDef<ModuleSchema>): void {\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Engine registerModule type\n\t\t\t(engine as any).registerModule({\n\t\t\t\tid: moduleDef.id,\n\t\t\t\tschema: moduleDef.schema.facts,\n\t\t\t\trequirements: moduleDef.schema.requirements,\n\t\t\t\tinit: moduleDef.init,\n\t\t\t\tderive: moduleDef.derive,\n\t\t\t\tevents: moduleDef.events,\n\t\t\t\teffects: moduleDef.effects,\n\t\t\t\tconstraints: moduleDef.constraints,\n\t\t\t\tresolvers: moduleDef.resolvers,\n\t\t\t\thooks: moduleDef.hooks,\n\t\t\t\tsnapshotEvents: moduleDef.snapshotEvents,\n\t\t\t});\n\t\t},\n\t// biome-ignore lint/suspicious/noExplicitAny: Type narrowing\n\t} as any;\n\n\treturn system;\n}\n\n","/**\n * Testing Utilities - Helpers for testing Directive systems\n *\n * Features:\n * - Mock resolvers with manual resolve/reject\n * - Fake timers integration (works with Vitest/Jest fake timers)\n * - Assertion helpers\n * - Facts history tracking\n * - Pending requirements tracking\n */\n\nimport { createSystem } from \"../core/system.js\";\nimport type {\n\tCreateSystemOptionsNamed,\n\tModulesMap,\n\tNamespacedSystem,\n\tRequirement,\n\tRequirementWithId,\n\tSystemInspection,\n} from \"../core/types.js\";\n\n// ============================================================================\n// Fake Timers Integration\n// ============================================================================\n\n/**\n * Flush all pending microtasks.\n * Call this after advancing fake timers to ensure all Promise callbacks run.\n *\n * @example\n * ```typescript\n * vi.useFakeTimers();\n * system.start();\n * system.facts.userId = 1; // Triggers constraint\n * await flushMicrotasks(); // Let reconciliation start\n * vi.advanceTimersByTime(100); // Advance resolver delay\n * await flushMicrotasks(); // Let resolver complete\n * ```\n */\nexport async function flushMicrotasks(): Promise<void> {\n\t// Multiple rounds to catch nested microtasks\n\tfor (let i = 0; i < 10; i++) {\n\t\tawait Promise.resolve();\n\t}\n}\n\n/**\n * Wait for the system to settle with fake timers enabled.\n * Combines timer advancement with microtask flushing.\n *\n * @param system - The Directive system\n * @param advanceTime - Function to advance fake timers (e.g., vi.advanceTimersByTime)\n * @param options - Configuration options\n *\n * @example\n * ```typescript\n * vi.useFakeTimers();\n * const system = createSystem({ modules: [myModule] });\n * system.start();\n * system.dispatch({ type: \"triggerAsync\" });\n *\n * await settleWithFakeTimers(system, vi.advanceTimersByTime, {\n * totalTime: 1000,\n * stepSize: 10,\n * });\n *\n * expect(system.facts.result).toBe(\"done\");\n * ```\n */\nexport async function settleWithFakeTimers(\n\tsystem: { inspect(): SystemInspection },\n\tadvanceTime: (ms: number) => void,\n\toptions: {\n\t\t/** Total time to advance (default: 5000ms) */\n\t\ttotalTime?: number;\n\t\t/** Time to advance each step (default: 10ms) */\n\t\tstepSize?: number;\n\t\t/** Maximum iterations before giving up (default: 1000) */\n\t\tmaxIterations?: number;\n\t} = {},\n): Promise<void> {\n\tconst { totalTime = 5000, stepSize = 10, maxIterations = 1000 } = options;\n\n\tlet elapsed = 0;\n\tlet iterations = 0;\n\n\twhile (elapsed < totalTime && iterations < maxIterations) {\n\t\t// Flush microtasks first (handles queueMicrotask, Promise.resolve)\n\t\tawait flushMicrotasks();\n\n\t\t// Check if settled\n\t\tconst inspection = system.inspect();\n\t\tif (inspection.inflight.length === 0) {\n\t\t\t// One more flush to be safe\n\t\t\tawait flushMicrotasks();\n\t\t\treturn;\n\t\t}\n\n\t\t// Advance fake timers\n\t\tadvanceTime(stepSize);\n\t\telapsed += stepSize;\n\t\titerations++;\n\t}\n\n\t// Final check\n\tconst finalInspection = system.inspect();\n\tif (finalInspection.inflight.length > 0) {\n\t\tconst resolverIds = finalInspection.inflight\n\t\t\t.map((r) => r.resolverId)\n\t\t\t.join(\", \");\n\t\tthrow new Error(\n\t\t\t`[Directive] settleWithFakeTimers did not settle after ${totalTime}ms. ${finalInspection.inflight.length} resolvers still inflight: ${resolverIds}`,\n\t\t);\n\t}\n}\n\n// ============================================================================\n// Fake Timers (for standalone use without vi.useFakeTimers)\n// ============================================================================\n\nexport interface FakeTimers {\n\t/** Advance time by a number of milliseconds */\n\tadvance(ms: number): Promise<void>;\n\t/** Advance to the next scheduled timer */\n\tnext(): Promise<void>;\n\t/** Run all pending timers */\n\trunAll(): Promise<void>;\n\t/** Get current fake time */\n\tnow(): number;\n\t/** Reset to time 0 */\n\treset(): void;\n}\n\n/**\n * Create standalone fake timers for testing.\n * Note: For most tests, prefer using Vitest's vi.useFakeTimers() with\n * settleWithFakeTimers() for better integration.\n */\nexport function createFakeTimers(): FakeTimers {\n\tlet currentTime = 0;\n\tconst timers: Array<{ time: number; callback: () => void }> = [];\n\n\treturn {\n\t\tasync advance(ms: number): Promise<void> {\n\t\t\tconst targetTime = currentTime + ms;\n\n\t\t\t// Run all timers that would fire during this advance\n\t\t\twhile (timers.length > 0 && timers[0]!.time <= targetTime) {\n\t\t\t\tconst timer = timers.shift()!;\n\t\t\t\tcurrentTime = timer.time;\n\t\t\t\ttimer.callback();\n\t\t\t\tawait Promise.resolve(); // Allow microtasks\n\t\t\t}\n\n\t\t\tcurrentTime = targetTime;\n\t\t},\n\n\t\tasync next(): Promise<void> {\n\t\t\tif (timers.length === 0) return;\n\n\t\t\tconst timer = timers.shift()!;\n\t\t\tcurrentTime = timer.time;\n\t\t\ttimer.callback();\n\t\t\tawait Promise.resolve();\n\t\t},\n\n\t\tasync runAll(): Promise<void> {\n\t\t\twhile (timers.length > 0) {\n\t\t\t\tawait this.next();\n\t\t\t}\n\t\t},\n\n\t\tnow(): number {\n\t\t\treturn currentTime;\n\t\t},\n\n\t\treset(): void {\n\t\t\tcurrentTime = 0;\n\t\t\ttimers.length = 0;\n\t\t},\n\t};\n}\n\n// ============================================================================\n// Mock Resolvers\n// ============================================================================\n\n/** Context passed to mock resolver resolve functions */\nexport interface MockResolverContext {\n\t/** Facts object (use type assertion for specific facts) */\n\t// biome-ignore lint/suspicious/noExplicitAny: Facts type varies by system\n\tfacts: any;\n\t/** Abort signal for cancellation */\n\tsignal: AbortSignal;\n}\n\nexport interface MockResolverOptions<R extends Requirement = Requirement> {\n\t/** Predicate to check if this resolver handles a requirement */\n\trequirement?: (req: Requirement) => req is R;\n\t/** Mock implementation */\n\tresolve?: (req: R, ctx: MockResolverContext) => void | Promise<void>;\n\t/** Delay before resolving (ms) */\n\tdelay?: number;\n\t/** Simulate an error */\n\terror?: Error | string;\n\t/** Track calls */\n\tcalls?: R[];\n}\n\n/** Internal resolver definition type for mock resolvers */\ninterface MockResolverDef {\n\trequirement: (req: Requirement) => boolean;\n\tresolve: (req: Requirement, ctx: MockResolverContext) => Promise<void>;\n}\n\n/**\n * Create a mock resolver for testing.\n */\nexport function createMockResolver<R extends Requirement = Requirement>(\n\ttypeOrOptions: string | MockResolverOptions<R>,\n): MockResolverDef {\n\tconst options: MockResolverOptions<R> =\n\t\ttypeof typeOrOptions === \"string\"\n\t\t\t? {\n\t\t\t\t\trequirement: ((req: Requirement) => req.type === typeOrOptions) as (\n\t\t\t\t\t\treq: Requirement,\n\t\t\t\t\t) => req is R,\n\t\t\t\t}\n\t\t\t: typeOrOptions;\n\n\tconst calls: R[] = options.calls ?? [];\n\n\treturn {\n\t\trequirement:\n\t\t\toptions.requirement ?? ((_req: Requirement): _req is R => true),\n\t\tasync resolve(req: Requirement, ctx: MockResolverContext): Promise<void> {\n\t\t\tcalls.push(req as R);\n\n\t\t\tif (options.delay) {\n\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, options.delay));\n\t\t\t}\n\n\t\t\tif (options.error) {\n\t\t\t\tthrow typeof options.error === \"string\"\n\t\t\t\t\t? new Error(options.error)\n\t\t\t\t\t: options.error;\n\t\t\t}\n\n\t\t\tif (options.resolve) {\n\t\t\t\tawait options.resolve(req as R, ctx);\n\t\t\t}\n\t\t},\n\t};\n}\n\n// ============================================================================\n// Mock Resolver (Advanced)\n// ============================================================================\n\n/**\n * A mock resolver that captures requirements for manual resolution.\n * Use this when you need fine-grained control over when and how requirements resolve.\n */\nexport interface MockResolver<R extends Requirement = Requirement> {\n\t/** All requirements received by this resolver */\n\treadonly calls: R[];\n\t/** Pending requirements waiting to be resolved/rejected */\n\treadonly pending: Array<{\n\t\trequirement: R;\n\t\tresolve: (result?: unknown) => void;\n\t\treject: (error: Error) => void;\n\t}>;\n\t/** Resolve the next pending requirement */\n\tresolve(result?: unknown): void;\n\t/** Reject the next pending requirement */\n\treject(error: Error): void;\n\t/** Resolve all pending requirements */\n\tresolveAll(result?: unknown): void;\n\t/** Reject all pending requirements */\n\trejectAll(error: Error): void;\n\t/** Clear call history and pending queue */\n\treset(): void;\n}\n\n/**\n * Create a mock resolver that captures requirements instead of resolving them.\n * This gives you manual control over requirement resolution in tests.\n *\n * @example\n * ```typescript\n * const fetchMock = mockResolver<{ type: \"FETCH_USER\"; id: string }>(\"FETCH_USER\");\n *\n * const system = createTestSystem({\n * modules: [userModule],\n * mocks: {\n * resolvers: {\n * FETCH_USER: { resolve: fetchMock.handler },\n * },\n * },\n * });\n *\n * system.facts.userId = \"123\";\n * await flushMicrotasks();\n *\n * // Requirement is pending\n * expect(fetchMock.calls).toHaveLength(1);\n * expect(fetchMock.calls[0].id).toBe(\"123\");\n *\n * // Manually resolve it\n * fetchMock.resolve({ name: \"John\" });\n * await flushMicrotasks();\n *\n * expect(system.facts.user).toEqual({ name: \"John\" });\n * ```\n */\nexport function mockResolver<R extends Requirement = Requirement>(\n\t_requirementType: string,\n): MockResolver<R> & {\n\t/** Handler that can be passed to createTestSystem mocks */\n\thandler: (req: Requirement, ctx: MockResolverContext) => Promise<void>;\n} {\n\tconst calls: R[] = [];\n\tconst pending: Array<{\n\t\trequirement: R;\n\t\tresolve: (result?: unknown) => void;\n\t\treject: (error: Error) => void;\n\t}> = [];\n\n\tconst mock: MockResolver<R> = {\n\t\tget calls() {\n\t\t\treturn calls;\n\t\t},\n\t\tget pending() {\n\t\t\treturn pending;\n\t\t},\n\t\tresolve(result?: unknown) {\n\t\t\tconst item = pending.shift();\n\t\t\tif (item) {\n\t\t\t\titem.resolve(result);\n\t\t\t}\n\t\t},\n\t\treject(error: Error) {\n\t\t\tconst item = pending.shift();\n\t\t\tif (item) {\n\t\t\t\titem.reject(error);\n\t\t\t}\n\t\t},\n\t\tresolveAll(result?: unknown) {\n\t\t\twhile (pending.length > 0) {\n\t\t\t\tthis.resolve(result);\n\t\t\t}\n\t\t},\n\t\trejectAll(error: Error) {\n\t\t\twhile (pending.length > 0) {\n\t\t\t\tthis.reject(error);\n\t\t\t}\n\t\t},\n\t\treset() {\n\t\t\tcalls.length = 0;\n\t\t\tpending.length = 0;\n\t\t},\n\t};\n\n\tconst handler = (req: Requirement, _ctx: MockResolverContext): Promise<void> => {\n\t\tcalls.push(req as R);\n\t\treturn new Promise<void>((resolve, reject) => {\n\t\t\tpending.push({\n\t\t\t\trequirement: req as R,\n\t\t\t\tresolve: () => resolve(),\n\t\t\t\treject,\n\t\t\t});\n\t\t});\n\t};\n\n\treturn {\n\t\t...mock,\n\t\thandler,\n\t};\n}\n\n// ============================================================================\n// Fact Change Tracking\n// ============================================================================\n\n/** Record of a single fact change */\nexport interface FactChangeRecord {\n\t/** The fact key that changed (without namespace prefix for namespaced systems) */\n\tkey: string;\n\t/** The full key including namespace prefix (e.g., \"test::value\") */\n\tfullKey: string;\n\t/** The namespace (e.g., \"test\") - undefined for single-module systems */\n\tnamespace?: string;\n\t/** The previous value */\n\tpreviousValue: unknown;\n\t/** The new value */\n\tnewValue: unknown;\n\t/** Timestamp of the change */\n\ttimestamp: number;\n}\n\n// ============================================================================\n// Test System\n// ============================================================================\n\nexport interface TestSystem<Modules extends ModulesMap> extends NamespacedSystem<Modules> {\n\t/**\n\t * Wait for all pending operations to complete.\n\t * @param maxWait - Maximum time to wait in ms (default: 5000)\n\t * @throws Error if timeout is exceeded with resolvers still inflight\n\t */\n\twaitForIdle(maxWait?: number): Promise<void>;\n\t/** Get the history of dispatched events */\n\teventHistory: Array<{ type: string; [key: string]: unknown }>;\n\t/** Get resolver call history */\n\tresolverCalls: Map<string, Requirement[]>;\n\t/**\n\t * Get all requirements that have been generated (both resolved and pending).\n\t * Unlike `inspect().unmet`, this includes requirements that have already been handled.\n\t */\n\treadonly allRequirements: RequirementWithId[];\n\t/**\n\t * Get all fact changes since system start or last reset.\n\t */\n\tgetFactsHistory(): FactChangeRecord[];\n\t/**\n\t * Reset the facts history tracking.\n\t */\n\tresetFactsHistory(): void;\n\t/** Assert that a requirement was created */\n\tassertRequirement(type: string): void;\n\t/** Assert that a resolver was called */\n\tassertResolverCalled(type: string, times?: number): void;\n\t/**\n\t * Assert that a fact was set to a specific value.\n\t */\n\tassertFactSet(key: string, value?: unknown): void;\n\t/**\n\t * Assert the number of times a fact was changed.\n\t */\n\tassertFactChanges(key: string, times: number): void;\n}\n\nexport interface CreateTestSystemOptions<Modules extends ModulesMap>\n\textends Omit<CreateSystemOptionsNamed<Modules>, \"plugins\"> {\n\t/** Mock resolvers by type */\n\tmocks?: {\n\t\tresolvers?: Record<string, MockResolverOptions>;\n\t};\n\t/** Additional plugins (tracking plugin is added automatically) */\n\t// biome-ignore lint/suspicious/noExplicitAny: Plugins are schema-agnostic\n\tplugins?: Array<any>;\n}\n\n/**\n * Create a test system with additional testing utilities.\n */\nexport function createTestSystem<Modules extends ModulesMap>(\n\toptions: CreateTestSystemOptions<Modules>,\n): TestSystem<Modules> {\n\tconst eventHistory: Array<{ type: string; [key: string]: unknown }> = [];\n\tconst resolverCalls = new Map<string, Requirement[]>();\n\tconst allRequirements: RequirementWithId[] = [];\n\tconst factsHistory: FactChangeRecord[] = [];\n\n\t// Create mock resolvers\n\tconst mockResolvers: Record<string, MockResolverDef> = {};\n\tif (options.mocks?.resolvers) {\n\t\tfor (const [type, mockOptions] of Object.entries(options.mocks.resolvers)) {\n\t\t\tconst calls: Requirement[] = [];\n\t\t\tresolverCalls.set(type, calls);\n\t\t\tmockResolvers[type] = createMockResolver({ ...mockOptions, calls });\n\t\t}\n\t}\n\n\t// Create modules with mock resolvers\n\tconst modulesWithMocks: Modules = {} as Modules;\n\tfor (const [name, module] of Object.entries(options.modules)) {\n\t\t// biome-ignore lint/suspicious/noExplicitAny: Module types are complex\n\t\t(modulesWithMocks as any)[name] = {\n\t\t\t...module,\n\t\t\tresolvers: {\n\t\t\t\t...module.resolvers,\n\t\t\t\t...mockResolvers,\n\t\t\t},\n\t\t};\n\t}\n\n\t// Get module namespaces for key parsing\n\tconst moduleNamespaces = new Set(Object.keys(options.modules));\n\n\t// Create tracking plugin\n\tconst trackingPlugin = {\n\t\tname: \"__test-tracking__\",\n\t\tonFactSet: (fullKey: string, value: unknown, previousValue: unknown) => {\n\t\t\t// Parse namespaced key (e.g., \"test::value\" -> namespace: \"test\", key: \"value\")\n\t\t\tconst SEPARATOR = \"::\";\n\t\t\tconst sepIndex = fullKey.indexOf(SEPARATOR);\n\t\t\tlet namespace: string | undefined;\n\t\t\tlet key: string;\n\n\t\t\tif (sepIndex > 0) {\n\t\t\t\tconst possibleNamespace = fullKey.substring(0, sepIndex);\n\t\t\t\tif (moduleNamespaces.has(possibleNamespace)) {\n\t\t\t\t\tnamespace = possibleNamespace;\n\t\t\t\t\tkey = fullKey.substring(sepIndex + SEPARATOR.length);\n\t\t\t\t} else {\n\t\t\t\t\tkey = fullKey;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tkey = fullKey;\n\t\t\t}\n\n\t\t\tfactsHistory.push({\n\t\t\t\tkey,\n\t\t\t\tfullKey,\n\t\t\t\tnamespace,\n\t\t\t\tpreviousValue,\n\t\t\t\tnewValue: value,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t});\n\t\t},\n\t\tonRequirementCreated: (requirement: RequirementWithId) => {\n\t\t\tallRequirements.push(requirement);\n\t\t},\n\t};\n\n\t// Create the underlying system\n\tconst system = createSystem({\n\t\t...options,\n\t\tmodules: modulesWithMocks,\n\t\tplugins: [trackingPlugin, ...(options.plugins ?? [])],\n\t}) as NamespacedSystem<Modules>;\n\n\t// Wrap dispatch to track events\n\tconst originalDispatch = system.dispatch.bind(system);\n\t// biome-ignore lint/suspicious/noExplicitAny: Event type varies\n\t(system as any).dispatch = (event: any) => {\n\t\teventHistory.push(event);\n\t\toriginalDispatch(event);\n\t};\n\n\tconst testSystem: TestSystem<Modules> = {\n\t\t...system,\n\t\teventHistory,\n\t\tresolverCalls,\n\n\t\tget allRequirements() {\n\t\t\treturn allRequirements;\n\t\t},\n\n\t\tgetFactsHistory(): FactChangeRecord[] {\n\t\t\treturn [...factsHistory];\n\t\t},\n\n\t\tresetFactsHistory(): void {\n\t\t\tfactsHistory.length = 0;\n\t\t},\n\n\t\tasync waitForIdle(maxWait = 5000): Promise<void> {\n\t\t\tconst startTime = Date.now();\n\n\t\t\tconst checkIdle = async (): Promise<void> => {\n\t\t\t\t// Wait for microtasks\n\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, 0));\n\n\t\t\t\t// Check if there are inflight resolvers\n\t\t\t\tconst inspection = system.inspect();\n\t\t\t\tif (inspection.inflight.length > 0) {\n\t\t\t\t\t// Check timeout\n\t\t\t\t\tif (Date.now() - startTime > maxWait) {\n\t\t\t\t\t\tconst resolverIds = inspection.inflight.map((r) => r.id).join(\", \");\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`[Directive] waitForIdle timed out after ${maxWait}ms. ${inspection.inflight.length} resolvers still inflight: ${resolverIds}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\t// Wait a bit more and check again\n\t\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, 10));\n\t\t\t\t\treturn checkIdle();\n\t\t\t\t}\n\t\t\t};\n\n\t\t\treturn checkIdle();\n\t\t},\n\n\t\tassertRequirement(type: string): void {\n\t\t\tconst hasRequirement = allRequirements.some(\n\t\t\t\t(r) => r.requirement.type === type,\n\t\t\t);\n\t\t\tif (!hasRequirement) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Expected requirement of type \"${type}\" but none found`,\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\n\t\tassertResolverCalled(type: string, times?: number): void {\n\t\t\tconst calls = resolverCalls.get(type) ?? [];\n\t\t\tif (times !== undefined) {\n\t\t\t\tif (calls.length !== times) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Expected resolver \"${type}\" to be called ${times} times but was called ${calls.length} times`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else if (calls.length === 0) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Expected resolver \"${type}\" to be called but it was not`,\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\n\t\tassertFactSet(key: string, value?: unknown): void {\n\t\t\tconst changes = factsHistory.filter((c) => c.key === key);\n\t\t\tif (changes.length === 0) {\n\t\t\t\tthrow new Error(`Expected fact \"${key}\" to be set but it was not`);\n\t\t\t}\n\t\t\tif (value !== undefined) {\n\t\t\t\tconst hasValue = changes.some((c) => c.newValue === value);\n\t\t\t\tif (!hasValue) {\n\t\t\t\t\tconst actualValues = changes\n\t\t\t\t\t\t.map((c) => JSON.stringify(c.newValue))\n\t\t\t\t\t\t.join(\", \");\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Expected fact \"${key}\" to be set to ${JSON.stringify(value)} but got: ${actualValues}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tassertFactChanges(key: string, times: number): void {\n\t\t\tconst changes = factsHistory.filter((c) => c.key === key);\n\t\t\tif (changes.length !== times) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Expected fact \"${key}\" to change ${times} times but it changed ${changes.length} times`,\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\t};\n\n\treturn testSystem;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/utils.ts","../src/utils/time-travel.ts","../src/core/requirements.ts","../src/core/tracking.ts","../src/core/constraints.ts","../src/core/derivations.ts","../src/core/effects.ts","../src/core/types/errors.ts","../src/core/errors.ts","../src/core/facts.ts","../src/core/plugins.ts","../src/core/resolvers.ts","../src/core/engine.ts","../src/core/system.ts","../src/utils/testing.ts"],"names":["withTimeout","promise","ms","errorMessage","timeoutId","timeoutPromise","_","reject","stableStringify","value","maxDepth","seen","stringify","val","depth","type","result","v","obj","k","isPrototypeSafe","dangerousKeys","check","objVal","item","key","hashObject","str","hash","i","createTimeTravelManager","options","config","facts","store","onSnapshot","onTimeTravel","isEnabled","maxSnapshots","snapshots","currentIndex","nextId","paused","restoring","changesets","pendingChangesetLabel","pendingChangesetStart","getCurrentFacts","serializeFacts","factsObj","deserializeFacts","serialized","trigger","snapshot","steps","fromIndex","toIndex","cs","c","earlierCs","snapshotId","index","s","json","data","snap","error","label","createDisabledTimeTravel","noopSnapshot","generateRequirementId","req","keyFn","rest","sortedRest","createRequirementWithId","requirement","fromConstraint","RequirementSet","_RequirementSet","id","copy","other","added","removed","unchanged","trackingStack","createTrackingContext","dependencies","nullContext","getCurrentTracker","withTracking","fn","context","withoutTracking","saved","trackAccess","DEFAULT_TIMEOUT","createConstraintsManager","definitions","requirementKeys","defaultTimeout","onEvaluate","onError","states","disabled","asyncConstraintIds","constraintDeps","factToConstraints","dirtyConstraints","latestWhenDeps","lastRequirements","hasEvaluated","resolvedConstraints","noFireConstraints","dependsOnMe","topologicalOrder","topologicalIndex","buildReverseDependencyMap","def","depId","detectCyclesAndComputeTopoOrder","visited","visiting","postOrder","visit","path","cycleStart","cycle","isAsyncConstraint","initState","isAsync","state","getState","updateDependencies","newDeps","oldDeps","dep","constraints","evaluateSync","tracked","asyncResult","evaluateAsync","timeout","depsSet","resultPromise","MAX_REQUIREMENTS_WARNING_THRESHOLD","normalizeRequirements","output","constraintId","filtered","r","getRequirements","requireDef","deps","mergeDependencies","additionalDeps","existingDeps","sortedConstraintIds","getSortedConstraintIds","a","b","stateA","priorityDiff","topoA","topoB","areAfterDependenciesSatisfied","changedKeys","requirements","allConstraintIds","constraintsToEvaluate","affected","dependentConstraints","lastReqs","processConstraintResult","active","whenDeps","reqs","requireDeps","combinedDeps","reqsWithId","reqWithId","evaluateConstraintBatch","constraintIds","blockedConstraints","readyToEvaluate","syncConstraints","asyncConstraints","unexpectedAsync","asyncResults","remainingToEvaluate","maxPasses","previousRemaining","factKey","dependents","newDefs","createDerivationsManager","onCompute","onInvalidate","listeners","factToDerivedDeps","derivedToDerivedDeps","BLOCKED_PROPS","invalidationDepth","pendingNotifications","isFlushing","MAX_FLUSH_ITERATIONS","derivedProxy","computeDerivation","oldValue","depSet","flushNotifications","iterations","remaining","ids","listener","invalidateDerivation","dependent","prop","factKeys","idStr","listenerSet","createEffectsManager","onRun","previousSnapshot","stopped","createSnapshot","shouldRun","runCleanup","storeCleanup","runEffect","effectPromise","trackedDeps","trackingResult","effectsToRun","effectIds","DirectiveError","message","source","sourceId","recoverable","createRetryLaterManager","delayMs","maxRetries","backoffMultiplier","maxDelayMs","pendingRetries","calculateDelay","attempt","delay","callback","entry","now","dueRetries","DEFAULT_STRATEGIES","createErrorBoundaryManager","onRecovery","errors","maxErrors","retryLaterManager","retryAttempts","toDirectiveError","getStrategy","handler","e","directiveError","strategy","safeStringify","maxLength","createFactsStore","schema","onChange","onBatch","isTypeAssertionSchema","validate","strictKeys","redactErrors","map","knownKeys","keyListeners","allListeners","batching","batchChanges","dirtyKeys","isNotifying","pendingNonBatchedChanges","MAX_NOTIFY_ITERATIONS","isZodSchema","getExpectedType","schemaType","st","formatValueForError","validateValue","valueType","valuePreview","expectedType","validators","validator","indexHint","validatorHint","notifyKey","notifyAll","notifyNonBatched","prev","deferred","change","flush","keys","keyStr","set","newSchema","createFactsProxy","createFacts","createPluginManager","plugins","safeCall","safeCallAsync","plugin","p","name","system","changes","byResolver","resolver","duration","from","to","run","DEFAULT_RETRY","DEFAULT_BATCH","policy","backoff","initialDelay","maxDelay","createResolversManager","onStart","onComplete","onRetry","onCancel","onResolutionComplete","inflight","statuses","MAX_STATUSES","batches","resolversByType","MAX_RESOLVER_CACHE","cleanupStatuses","entriesToRemove","iterator","hasStringRequirement","hasFunctionRequirement","resolverHandles","findResolver","reqType","cached","oldest","typeResolvers","createContext","signal","executeResolve","resolverId","controller","retryPolicy","lastError","ctx","resolvePromise","resolve","abortHandler","executeBatch","batchConfig","startedAt","reqPayloads","results","hasFailures","addToBatch","batch","processBatch","requirementId","idx","status","createEngine","mergedSchema","mergedEvents","mergedDerive","mergedEffects","mergedConstraints","mergedResolvers","schemaOwners","module","validateKeys","section","existingOwner","snapshotEventNames","m","mod","eventName","dispatchDepth","shouldTakeSnapshot","derivationNames","pluginManager","errorBoundary","retryLaterTimer","invalidateManyDerivations","timeTravelRef","runHistoryEnabled","maxRuns","runHistory","runHistoryById","runIdCounter","currentRun","pendingFactChanges","resolverRunMap","runInflightCount","runStartMs","runHistoryCache","runHistoryCacheVersion","currentCacheVersion","runStats","scheduleReconcile","derivationsManager","effectsManager","constraintsManager","finalizeRun","runId","startMs","buildCausalChain","updateRunStats","decrementRunInflight","evictOldestRun","evicted","reqId","rId","parts","fc","d","rs","resolverCount","factChangeCount","anomalies","resolversManager","notifySettlementChange","timeTravelListeners","notifyTimeTravelChange","timeTravelManager","settlementListeners","MAX_RECONCILE_DEPTH","reconcileDepth","reconcile","reconcileStartMs","keysForConstraints","currentRequirements","currentSet","hitConstraintIds","cId","cState","cDeps","inflightNow","info","inflightInfo","inflightCount","deriveAccessor","eventsAccessor","payload","intervalMs","event","derivationId","derivationIds","unsubs","u","isEqual","previousValue","newValue","next","old","predicate","unsub","timer","cleanup","current","ra","rr","rc","re","ee","constraintState","resolverStatus","relevantFacts","factsSnapshot","lines","reqDetails","factEntries","prefix","valueStr","maxWait","startTime","inspection","details","unmet","includeDerivations","excludeDerivations","includeFacts","ttlSeconds","metadata","includeVersion","allDerivationKeys","derivationKeys","unknown","excludeSet","allFactKeys","createdAt","previousVersion","registerModule","existingFactKeys","SEPARATOR","topologicalSort","modulesMap","namespaces","namespace","depNamespace","moduleFactsProxyCache","namespacedFactsProxyCache","namespacedDeriveProxyCache","moduleDeriveProxyCache","createSystem","createSingleModuleSystem","namedOptions","createNamespacedSystem","moduleNamespaces","snapshotModulesSet","orderedNamespaces","initOrder","explicitOrder","missingModules","ns","debug","flatModules","hasCrossModuleDeps","depNamespaces","prefixedFacts","prefixedDerivations","prefixedEvents","prefixedInit","moduleFactsProxy","createModuleFactsProxy","prefixedDerive","derive","factsProxy","createCrossModuleFactsProxy","deriveProxy","createModuleDeriveProxy","prefixedEventHandlers","prefixedConstraints","constraint","constraintDef","prefixedResolvers","resolverDef","namespacedFacts","createNamespacedFactsProxy","prefixedEffects","effect","effectDef","prevProxy","hydratedFacts","engine","applyNamespacedFacts","namespaceKeysMap","moduleNamesCache","getModuleNames","namespacedFactsProxy","namespacedDeriveProxy","createNamespacedDeriveProxy","namespacedEventsProxy","createNamespacedEventsProxy","tickInterval","tickMs","loader","tickEventKey","toInternalKey","internalIds","internalOptions","namespacedData","sepIndex","localKey","moduleDef","namespaceCache","proxy","crossModuleFactsProxyCache","selfNamespace","cacheKey","depNamesSet","allKeys","moduleEventsProxyCache","moduleEventsProxy","eventsProxy","flushMicrotasks","settleWithFakeTimers","advanceTime","totalTime","stepSize","maxIterations","elapsed","finalInspection","resolverIds","createFakeTimers","currentTime","timers","targetTime","createMockResolver","typeOrOptions","calls","_req","mockResolver","_requirementType","pending","_ctx","createTestSystem","eventHistory","resolverCalls","allRequirements","factsHistory","mockResolvers","mockOptions","modulesWithMocks","fullKey","possibleNamespace","originalDispatch","checkIdle","times","actualValues"],"mappings":"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","file":"testing.cjs","sourcesContent":["/**\n * Shared utilities for Directive\n */\n\n/**\n * Execute a promise with a timeout, properly cleaning up the timer.\n * Used by both constraints and resolvers for timeout handling.\n *\n * @param promise - The promise to wrap with a timeout\n * @param ms - Timeout duration in milliseconds\n * @param errorMessage - Error message if timeout occurs\n * @returns The promise result\n * @throws Error if timeout is exceeded\n */\nexport async function withTimeout<T>(\n promise: Promise<T>,\n ms: number,\n errorMessage: string,\n): Promise<T> {\n let timeoutId: ReturnType<typeof setTimeout>;\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n timeoutId = setTimeout(() => reject(new Error(errorMessage)), ms);\n });\n\n try {\n return await Promise.race([promise, timeoutPromise]);\n } finally {\n clearTimeout(timeoutId!);\n }\n}\n\n/**\n * Normalize an error to an Error instance.\n * Ensures consistent error handling throughout the library.\n *\n * @param error - The error to normalize (can be anything)\n * @returns An Error instance\n */\nexport function normalizeError(error: unknown): Error {\n if (error instanceof Error) {\n return error;\n }\n return new Error(String(error));\n}\n\n/**\n * Create a stable JSON string with sorted keys.\n * Handles circular references and deeply nested objects safely.\n *\n * @param value - The value to stringify\n * @param maxDepth - Maximum nesting depth (default: 50)\n * @returns A stable JSON string\n */\nexport function stableStringify(value: unknown, maxDepth = 50): string {\n const seen = new WeakSet();\n\n function stringify(val: unknown, depth: number): string {\n if (depth > maxDepth) {\n return '\"[max depth exceeded]\"';\n }\n\n if (val === null) return \"null\";\n if (val === undefined) return \"undefined\";\n\n const type = typeof val;\n\n if (type === \"string\") return JSON.stringify(val);\n if (type === \"number\" || type === \"boolean\") return String(val);\n if (type === \"function\") return '\"[function]\"';\n if (type === \"symbol\") return '\"[symbol]\"';\n\n if (Array.isArray(val)) {\n // Check for circular reference\n if (seen.has(val)) {\n return '\"[circular]\"';\n }\n seen.add(val);\n const result = `[${val.map((v) => stringify(v, depth + 1)).join(\",\")}]`;\n seen.delete(val);\n return result;\n }\n\n if (type === \"object\") {\n const obj = val as Record<string, unknown>;\n // Check for circular reference\n if (seen.has(obj)) {\n return '\"[circular]\"';\n }\n seen.add(obj);\n const keys = Object.keys(obj).sort();\n const pairs = keys.map(\n (k) => `${JSON.stringify(k)}:${stringify(obj[k], depth + 1)}`,\n );\n const result = `{${pairs.join(\",\")}}`;\n seen.delete(obj);\n return result;\n }\n\n return '\"[unknown]\"';\n }\n\n return stringify(value, 0);\n}\n\n/**\n * Check for prototype pollution in an object, including nested objects.\n * Returns true if the object is safe, false if dangerous keys are found.\n *\n * @param obj - The object to check\n * @param maxDepth - Maximum nesting depth to check (default: 50)\n * @returns True if safe, false if dangerous keys found\n */\nexport function isPrototypeSafe(obj: unknown, maxDepth = 50): boolean {\n const dangerousKeys = new Set([\"__proto__\", \"constructor\", \"prototype\"]);\n const seen = new WeakSet();\n\n function check(val: unknown, depth: number): boolean {\n if (depth > maxDepth) return false; // Fail safe at max depth - don't assume safety\n if (val === null || val === undefined) return true;\n if (typeof val !== \"object\") return true;\n\n const objVal = val as Record<string, unknown>;\n\n // Check for circular reference\n if (seen.has(objVal)) return true;\n seen.add(objVal);\n\n // Check array elements\n if (Array.isArray(objVal)) {\n for (const item of objVal) {\n if (!check(item, depth + 1)) {\n seen.delete(objVal);\n return false;\n }\n }\n seen.delete(objVal);\n return true;\n }\n\n // Check object keys and values\n for (const key of Object.keys(objVal)) {\n if (dangerousKeys.has(key)) {\n seen.delete(objVal);\n return false;\n }\n if (!check(objVal[key], depth + 1)) {\n seen.delete(objVal);\n return false;\n }\n }\n\n seen.delete(objVal);\n return true;\n }\n\n return check(obj, 0);\n}\n\n/**\n * Shallow equality comparison for objects.\n * Used by React hooks to avoid unnecessary re-renders.\n *\n * @param a - First object\n * @param b - Second object\n * @returns True if objects are shallowly equal\n */\nexport function shallowEqual<T extends Record<string, unknown>>(\n a: T,\n b: T,\n): boolean {\n if (a === b) return true;\n if (!a || !b) return false;\n\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n\n if (keysA.length !== keysB.length) return false;\n\n for (const key of keysA) {\n if (a[key] !== b[key]) return false;\n }\n\n return true;\n}\n\n/**\n * Generate a simple hash string from an object.\n * Uses djb2 algorithm on the stable stringified value.\n *\n * **Limitations:**\n * - 32-bit hash output means collision probability increases with data set size\n * (birthday paradox: ~50% collision chance at ~77,000 distinct values)\n * - Suitable for: cache invalidation, change detection, deduplication of small sets\n * - NOT suitable for: cryptographic use, security-sensitive operations, large-scale deduplication\n *\n * For security-sensitive use cases requiring stronger collision resistance,\n * consider using a cryptographic hash like SHA-256.\n *\n * @param value - The value to hash\n * @returns A hex hash string (8 characters, 32 bits)\n */\nexport function hashObject(value: unknown): string {\n const str = stableStringify(value);\n let hash = 5381;\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) + hash) ^ str.charCodeAt(i);\n }\n // Convert to unsigned 32-bit and then to hex\n return (hash >>> 0).toString(16);\n}\n\n// ============================================================================\n// Distributable Snapshot Utilities\n// ============================================================================\n\n/**\n * Distributable snapshot type for type-safe helper functions.\n */\nexport interface DistributableSnapshotLike<T = Record<string, unknown>> {\n data: T;\n createdAt: number;\n expiresAt?: number;\n version?: string;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Check if a distributable snapshot has expired.\n * Returns false if the snapshot has no expiresAt field.\n *\n * @example\n * ```typescript\n * const snapshot = system.getDistributableSnapshot({ ttlSeconds: 3600 });\n * // ... later ...\n * if (isSnapshotExpired(snapshot)) {\n * // Refresh the snapshot\n * }\n * ```\n *\n * @param snapshot - The snapshot to check\n * @param now - Optional current timestamp (defaults to Date.now())\n * @returns True if the snapshot has expired, false otherwise\n */\nexport function isSnapshotExpired<T>(\n snapshot: DistributableSnapshotLike<T>,\n now: number = Date.now(),\n): boolean {\n return snapshot.expiresAt !== undefined && now > snapshot.expiresAt;\n}\n\n/**\n * Validate a distributable snapshot and return its data.\n * Throws if the snapshot is malformed or has expired.\n *\n * @example\n * ```typescript\n * const cached = JSON.parse(await redis.get(`entitlements:${userId}`));\n * try {\n * const data = validateSnapshot(cached);\n * // Use data.canUseFeature, etc.\n * } catch (e) {\n * // Snapshot invalid or expired, refresh it\n * }\n * ```\n *\n * @example Using custom timestamp for testing\n * ```typescript\n * const snapshot = { data: { test: true }, createdAt: 1000, expiresAt: 2000 };\n * validateSnapshot(snapshot, 1500); // Returns { test: true }\n * validateSnapshot(snapshot, 2500); // Throws: Snapshot expired\n * ```\n *\n * @param snapshot - The snapshot to validate\n * @param now - Optional current timestamp (defaults to Date.now())\n * @returns The snapshot data if valid\n * @throws Error if the snapshot is malformed or has expired\n */\nexport function validateSnapshot<T>(\n snapshot: DistributableSnapshotLike<T>,\n now: number = Date.now(),\n): T {\n // Structural validation\n if (!snapshot || typeof snapshot !== \"object\") {\n throw new Error(\n \"[Directive] Invalid snapshot: expected an object with 'data' and 'createdAt' properties.\",\n );\n }\n if (!(\"data\" in snapshot)) {\n throw new Error(\n \"[Directive] Invalid snapshot: missing required 'data' property.\",\n );\n }\n if (!(\"createdAt\" in snapshot) || typeof snapshot.createdAt !== \"number\") {\n throw new Error(\n \"[Directive] Invalid snapshot: missing or invalid 'createdAt' property (expected number).\",\n );\n }\n\n // Expiration validation\n if (isSnapshotExpired(snapshot, now)) {\n const expiredAt = new Date(snapshot.expiresAt!).toISOString();\n throw new Error(\n `[Directive] Snapshot expired at ${expiredAt}. Obtain a fresh snapshot from the source.`,\n );\n }\n return snapshot.data;\n}\n\n/**\n * Diff result for a single changed value.\n */\nexport interface SnapshotDiffEntry {\n /** The key path that changed (e.g., \"canUseApi\" or \"limits.apiCalls\") */\n path: string;\n /** The value in the old snapshot */\n oldValue: unknown;\n /** The value in the new snapshot */\n newValue: unknown;\n /** Type of change: \"added\", \"removed\", or \"changed\" */\n type: \"added\" | \"removed\" | \"changed\";\n}\n\n/**\n * Result of diffing two snapshots.\n */\nexport interface SnapshotDiff {\n /** Whether the snapshots are identical */\n identical: boolean;\n /** List of changes between snapshots */\n changes: SnapshotDiffEntry[];\n /** Whether the version changed (if both have versions) */\n versionChanged: boolean;\n /** Old version (if available) */\n oldVersion?: string;\n /** New version (if available) */\n newVersion?: string;\n}\n\n/**\n * Compare two distributable snapshots and return the differences.\n * Useful for debugging, audit logs, and webhook payloads.\n *\n * @example\n * ```typescript\n * const oldSnapshot = system.getDistributableSnapshot({ includeVersion: true });\n * system.dispatch({ type: \"upgradePlan\", plan: \"pro\" });\n * const newSnapshot = system.getDistributableSnapshot({ includeVersion: true });\n *\n * const diff = diffSnapshots(oldSnapshot, newSnapshot);\n * if (!diff.identical) {\n * console.log(\"Changes:\", diff.changes);\n * // [{ path: \"canUseApi\", oldValue: false, newValue: true, type: \"changed\" }]\n * }\n * ```\n *\n * @param oldSnapshot - The previous snapshot\n * @param newSnapshot - The new snapshot\n * @returns A diff result with all changes\n */\nexport function diffSnapshots<T = Record<string, unknown>>(\n oldSnapshot: DistributableSnapshotLike<T>,\n newSnapshot: DistributableSnapshotLike<T>,\n): SnapshotDiff {\n const changes: SnapshotDiffEntry[] = [];\n\n // Deep compare function\n function compare(oldObj: unknown, newObj: unknown, path: string): void {\n // Handle null/undefined\n if (oldObj === null || oldObj === undefined) {\n if (newObj !== null && newObj !== undefined) {\n changes.push({\n path,\n oldValue: oldObj,\n newValue: newObj,\n type: \"added\",\n });\n }\n return;\n }\n if (newObj === null || newObj === undefined) {\n changes.push({\n path,\n oldValue: oldObj,\n newValue: newObj,\n type: \"removed\",\n });\n return;\n }\n\n // Handle primitives\n if (typeof oldObj !== \"object\" || typeof newObj !== \"object\") {\n if (!Object.is(oldObj, newObj)) {\n changes.push({\n path,\n oldValue: oldObj,\n newValue: newObj,\n type: \"changed\",\n });\n }\n return;\n }\n\n // Handle arrays\n if (Array.isArray(oldObj) && Array.isArray(newObj)) {\n if (oldObj.length !== newObj.length) {\n changes.push({\n path,\n oldValue: oldObj,\n newValue: newObj,\n type: \"changed\",\n });\n return;\n }\n for (let i = 0; i < oldObj.length; i++) {\n compare(oldObj[i], newObj[i], `${path}[${i}]`);\n }\n return;\n }\n\n // Handle objects\n const oldRecord = oldObj as Record<string, unknown>;\n const newRecord = newObj as Record<string, unknown>;\n const allKeys = new Set([\n ...Object.keys(oldRecord),\n ...Object.keys(newRecord),\n ]);\n\n for (const key of allKeys) {\n const childPath = path ? `${path}.${key}` : key;\n if (!(key in oldRecord)) {\n changes.push({\n path: childPath,\n oldValue: undefined,\n newValue: newRecord[key],\n type: \"added\",\n });\n } else if (!(key in newRecord)) {\n changes.push({\n path: childPath,\n oldValue: oldRecord[key],\n newValue: undefined,\n type: \"removed\",\n });\n } else {\n compare(oldRecord[key], newRecord[key], childPath);\n }\n }\n }\n\n // Compare data\n compare(oldSnapshot.data, newSnapshot.data, \"\");\n\n // Check version change\n const versionChanged =\n oldSnapshot.version !== newSnapshot.version &&\n (oldSnapshot.version !== undefined || newSnapshot.version !== undefined);\n\n return {\n identical: changes.length === 0,\n changes,\n versionChanged,\n oldVersion: oldSnapshot.version,\n newVersion: newSnapshot.version,\n };\n}\n\n// ============================================================================\n// Snapshot Signing (HMAC)\n// ============================================================================\n\n/**\n * A signed distributable snapshot.\n * Contains the original snapshot plus a cryptographic signature.\n */\nexport interface SignedSnapshot<T = Record<string, unknown>>\n extends DistributableSnapshotLike<T> {\n /** HMAC-SHA256 signature in hex format */\n signature: string;\n /** Signing algorithm used */\n algorithm: \"hmac-sha256\";\n}\n\n/**\n * Check if a snapshot is signed.\n *\n * @param snapshot - The snapshot to check\n * @returns True if the snapshot has a signature\n */\nexport function isSignedSnapshot<T>(\n snapshot: DistributableSnapshotLike<T> | SignedSnapshot<T>,\n): snapshot is SignedSnapshot<T> {\n return \"signature\" in snapshot && typeof snapshot.signature === \"string\";\n}\n\n/**\n * Sign a distributable snapshot using HMAC-SHA256.\n * Creates a tamper-proof signature that can be verified later.\n *\n * **Security Notes:**\n * - Use a cryptographically random secret of at least 32 bytes\n * - Store the secret securely (environment variable, secrets manager)\n * - Never expose the secret to clients\n * - The signature covers all snapshot fields for integrity\n *\n * @example\n * ```typescript\n * const snapshot = system.getDistributableSnapshot({\n * includeDerivations: ['canUseFeature', 'limits'],\n * ttlSeconds: 3600,\n * });\n *\n * // Sign the snapshot (server-side only)\n * const signed = await signSnapshot(snapshot, process.env.SNAPSHOT_SECRET);\n *\n * // Store in JWT, Redis, or send to client\n * const jwt = createJWT({ snapshot: signed });\n *\n * // Later, verify the signature\n * const isValid = await verifySnapshotSignature(signed, process.env.SNAPSHOT_SECRET);\n * if (!isValid) {\n * throw new Error('Snapshot has been tampered with');\n * }\n * ```\n *\n * @param snapshot - The snapshot to sign\n * @param secret - The HMAC secret (string or Uint8Array)\n * @returns A signed snapshot with the signature attached\n */\nexport async function signSnapshot<T>(\n snapshot: DistributableSnapshotLike<T>,\n secret: string | Uint8Array,\n): Promise<SignedSnapshot<T>> {\n // Create a canonical representation for signing\n const payload = stableStringify({\n data: snapshot.data,\n createdAt: snapshot.createdAt,\n expiresAt: snapshot.expiresAt,\n version: snapshot.version,\n metadata: snapshot.metadata,\n });\n\n const signature = await hmacSha256(payload, secret);\n\n return {\n ...snapshot,\n signature,\n algorithm: \"hmac-sha256\",\n };\n}\n\n/**\n * Verify the signature of a signed snapshot.\n * Returns true if the signature is valid, false otherwise.\n *\n * **Important:** Always verify signatures before trusting snapshot data,\n * especially if the snapshot was received from an untrusted source (client, cache).\n *\n * @example\n * ```typescript\n * // Receive signed snapshot from client or cache\n * const snapshot = JSON.parse(cachedData);\n *\n * // Verify before using\n * const isValid = await verifySnapshotSignature(snapshot, process.env.SNAPSHOT_SECRET);\n * if (!isValid) {\n * throw new Error('Invalid snapshot signature - possible tampering');\n * }\n *\n * // Now safe to use snapshot.data\n * if (snapshot.data.canUseFeature.api) {\n * // Grant access\n * }\n * ```\n *\n * @param signedSnapshot - The signed snapshot to verify\n * @param secret - The HMAC secret (must match the signing secret)\n * @returns True if signature is valid, false otherwise\n */\nexport async function verifySnapshotSignature<T>(\n signedSnapshot: SignedSnapshot<T>,\n secret: string | Uint8Array,\n): Promise<boolean> {\n if (!signedSnapshot.signature || signedSnapshot.algorithm !== \"hmac-sha256\") {\n return false;\n }\n\n // Recreate the canonical payload (same as signing)\n const payload = stableStringify({\n data: signedSnapshot.data,\n createdAt: signedSnapshot.createdAt,\n expiresAt: signedSnapshot.expiresAt,\n version: signedSnapshot.version,\n metadata: signedSnapshot.metadata,\n });\n\n const expectedSignature = await hmacSha256(payload, secret);\n\n // Use timing-safe comparison\n return timingSafeEqual(signedSnapshot.signature, expectedSignature);\n}\n\n/**\n * Create HMAC-SHA256 signature of a message.\n * Uses Web Crypto API for cross-platform support (Node.js, browsers, Deno, Bun).\n */\nasync function hmacSha256(\n message: string,\n secret: string | Uint8Array,\n): Promise<string> {\n // Convert secret to Uint8Array if string\n const secretBytes: Uint8Array =\n typeof secret === \"string\" ? new TextEncoder().encode(secret) : secret;\n\n // Import key for HMAC\n const algorithm: HmacImportParams = {\n name: \"HMAC\",\n hash: { name: \"SHA-256\" },\n };\n const key = await crypto.subtle.importKey(\n \"raw\",\n secretBytes as unknown as ArrayBuffer,\n algorithm,\n false,\n [\"sign\"],\n );\n\n // Sign the message\n const messageBytes = new TextEncoder().encode(message);\n const signature = await crypto.subtle.sign(\"HMAC\", key, messageBytes);\n\n // Convert to hex string\n return Array.from(new Uint8Array(signature))\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\n/**\n * Timing-safe string comparison to prevent timing attacks.\n * Both strings should be the same length (hex signatures from same algorithm).\n */\nfunction timingSafeEqual(a: string, b: string): boolean {\n if (a.length !== b.length) {\n return false;\n }\n\n let result = 0;\n for (let i = 0; i < a.length; i++) {\n result |= a.charCodeAt(i) ^ b.charCodeAt(i);\n }\n return result === 0;\n}\n","/**\n * Time-Travel Debugging - Snapshot-based state history\n *\n * Features:\n * - Ring buffer of state snapshots\n * - Go back/forward through history\n * - Replay from any snapshot\n * - Export/import state history\n */\n\nimport type {\n DebugConfig,\n Facts,\n FactsStore,\n Schema,\n Snapshot,\n TimeTravelAPI,\n} from \"../core/types.js\";\nimport { isPrototypeSafe } from \"./utils.js\";\n\n// ============================================================================\n// Time-Travel Manager\n// ============================================================================\n\n/** A changeset groups multiple snapshots into a single undo/redo unit. */\nexport interface Changeset {\n label: string;\n startIndex: number;\n endIndex: number;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport interface TimeTravelManager<_S extends Schema> extends TimeTravelAPI {\n /** Take a snapshot of current state */\n takeSnapshot(trigger: string): Snapshot;\n /** Restore facts from a snapshot */\n restore(snapshot: Snapshot): void;\n /** Check if time-travel is enabled */\n readonly isEnabled: boolean;\n /** True while restoring a snapshot (engine should skip reconciliation) */\n readonly isRestoring: boolean;\n /** Pause snapshot taking */\n pause(): void;\n /** Resume snapshot taking */\n resume(): void;\n}\n\n/** Options for creating a time-travel manager */\nexport interface CreateTimeTravelOptions<S extends Schema> {\n config: DebugConfig;\n facts: Facts<S>;\n store: FactsStore<S>;\n /** Callback when a snapshot is taken */\n onSnapshot?: (snapshot: Snapshot) => void;\n /** Callback when time-travel occurs */\n onTimeTravel?: (from: number, to: number) => void;\n}\n\n/**\n * Create a snapshot-based time-travel debugger with a ring buffer of state\n * history.\n *\n * Snapshots are taken automatically after fact changes (during\n * reconciliation) and can be navigated with `goBack`/`goForward`/`goTo`.\n * Changesets group multiple snapshots into a single undo/redo unit.\n * The entire history can be exported to JSON and re-imported for\n * cross-session debugging.\n *\n * @param options - Debug config (maxSnapshots, timeTravel flag), facts proxy, store, and snapshot/time-travel callbacks\n * @returns A `TimeTravelManager` with takeSnapshot/restore/goBack/goForward/goTo/replay/export/import and changeset methods\n */\nexport function createTimeTravelManager<S extends Schema>(\n options: CreateTimeTravelOptions<S>,\n): TimeTravelManager<S> {\n const { config, facts, store, onSnapshot, onTimeTravel } = options;\n\n const isEnabled = config.timeTravel ?? false;\n const maxSnapshots = config.maxSnapshots ?? 100;\n\n // Ring buffer of snapshots\n const snapshots: Snapshot[] = [];\n let currentIndex = -1;\n let nextId = 1;\n let paused = false;\n let restoring = false;\n\n // Changeset tracking\n const changesets: Changeset[] = [];\n let pendingChangesetLabel: string | null = null;\n let pendingChangesetStart = -1;\n\n /** Get current facts as a plain object */\n function getCurrentFacts(): Record<string, unknown> {\n return store.toObject();\n }\n\n /** Serialize facts to a snapshot-friendly format */\n function serializeFacts(): Record<string, unknown> {\n const factsObj = getCurrentFacts();\n\n // Deep clone to prevent mutation\n return structuredClone(factsObj);\n }\n\n /** Deserialize and restore facts from a snapshot */\n function deserializeFacts(serialized: Record<string, unknown>): void {\n // Validate entire object tree for prototype pollution\n if (!isPrototypeSafe(serialized)) {\n console.error(\n \"[Directive] Potential prototype pollution detected in snapshot data, skipping restore\",\n );\n return;\n }\n\n store.batch(() => {\n for (const [key, value] of Object.entries(serialized)) {\n // Prototype pollution protection (redundant but defensive)\n if (\n key === \"__proto__\" ||\n key === \"constructor\" ||\n key === \"prototype\"\n ) {\n console.warn(\n `[Directive] Skipping dangerous key \"${key}\" during fact restoration`,\n );\n continue;\n }\n // @ts-expect-error - dynamic key access\n facts[key] = value;\n }\n });\n }\n\n const manager: TimeTravelManager<S> = {\n get isEnabled() {\n return isEnabled;\n },\n\n get isRestoring() {\n return restoring;\n },\n\n get isPaused() {\n return paused;\n },\n\n get snapshots() {\n return [...snapshots];\n },\n\n get currentIndex() {\n return currentIndex;\n },\n\n takeSnapshot(trigger: string): Snapshot {\n if (!isEnabled || paused) {\n return { id: -1, timestamp: Date.now(), facts: {}, trigger };\n }\n\n const snapshot: Snapshot = {\n id: nextId++,\n timestamp: Date.now(),\n facts: serializeFacts(),\n trigger,\n };\n\n // If we're not at the end, truncate future snapshots\n if (currentIndex < snapshots.length - 1) {\n snapshots.splice(currentIndex + 1);\n }\n\n // Add new snapshot\n snapshots.push(snapshot);\n currentIndex = snapshots.length - 1;\n\n // Enforce max size (ring buffer)\n while (snapshots.length > maxSnapshots) {\n snapshots.shift();\n currentIndex--;\n }\n\n onSnapshot?.(snapshot);\n return snapshot;\n },\n\n restore(snapshot: Snapshot): void {\n if (!isEnabled) return;\n\n // Set restoring flag so the engine skips reconciliation scheduling.\n // The restored state is already \"reconciled\" — it was captured after\n // a complete reconcile cycle. Re-reconciling would create spurious\n // snapshots that break undo/redo navigation.\n paused = true;\n restoring = true;\n\n try {\n deserializeFacts(snapshot.facts);\n } finally {\n paused = false;\n restoring = false;\n }\n },\n\n goBack(steps = 1): void {\n if (!isEnabled || snapshots.length === 0) return;\n\n const fromIndex = currentIndex;\n\n // Check if we're inside a changeset — jump to its start\n let toIndex = currentIndex;\n const cs = changesets.find(\n (c) => currentIndex > c.startIndex && currentIndex <= c.endIndex,\n );\n if (cs) {\n toIndex = cs.startIndex;\n } else {\n // Check if we're at the end of a changeset — jump past its start\n const prevCs = changesets.find((c) => currentIndex === c.startIndex);\n if (prevCs) {\n // We're at the boundary. Look for the changeset before this one.\n const earlierCs = changesets.find(\n (c) =>\n c.endIndex < currentIndex && currentIndex - c.endIndex <= steps,\n );\n toIndex = earlierCs\n ? earlierCs.startIndex\n : Math.max(0, currentIndex - steps);\n } else {\n toIndex = Math.max(0, currentIndex - steps);\n }\n }\n\n if (fromIndex === toIndex) return;\n\n currentIndex = toIndex;\n const snapshot = snapshots[currentIndex];\n if (snapshot) {\n this.restore(snapshot);\n onTimeTravel?.(fromIndex, toIndex);\n }\n },\n\n goForward(steps = 1): void {\n if (!isEnabled || snapshots.length === 0) return;\n\n const fromIndex = currentIndex;\n\n // Check if we're inside or at the start of a changeset — jump to its end\n let toIndex = currentIndex;\n const cs = changesets.find(\n (c) => currentIndex >= c.startIndex && currentIndex < c.endIndex,\n );\n if (cs) {\n toIndex = cs.endIndex;\n } else {\n toIndex = Math.min(snapshots.length - 1, currentIndex + steps);\n }\n\n if (fromIndex === toIndex) return;\n\n currentIndex = toIndex;\n const snapshot = snapshots[currentIndex];\n if (snapshot) {\n this.restore(snapshot);\n onTimeTravel?.(fromIndex, toIndex);\n }\n },\n\n goTo(snapshotId: number): void {\n if (!isEnabled) return;\n\n const index = snapshots.findIndex((s) => s.id === snapshotId);\n if (index === -1) {\n console.warn(`[Directive] Snapshot ${snapshotId} not found`);\n return;\n }\n\n const fromIndex = currentIndex;\n currentIndex = index;\n const snapshot = snapshots[currentIndex];\n if (snapshot) {\n this.restore(snapshot);\n onTimeTravel?.(fromIndex, index);\n }\n },\n\n replay(): void {\n if (!isEnabled || snapshots.length === 0) return;\n\n // Start from the beginning\n currentIndex = 0;\n const snapshot = snapshots[0];\n if (snapshot) {\n this.restore(snapshot);\n }\n },\n\n export(): string {\n return JSON.stringify({\n version: 1,\n snapshots,\n currentIndex,\n });\n },\n\n import(json: string): void {\n if (!isEnabled) return;\n\n try {\n const data = JSON.parse(json);\n\n // Validate import data structure to prevent prototype pollution\n if (typeof data !== \"object\" || data === null) {\n throw new Error(\"Invalid time-travel data: expected object\");\n }\n if (data.version !== 1) {\n throw new Error(\n `Unsupported time-travel export version: ${data.version}`,\n );\n }\n if (!Array.isArray(data.snapshots)) {\n throw new Error(\n \"Invalid time-travel data: snapshots must be an array\",\n );\n }\n if (typeof data.currentIndex !== \"number\") {\n throw new Error(\n \"Invalid time-travel data: currentIndex must be a number\",\n );\n }\n\n // Validate each snapshot has required properties\n for (const snap of data.snapshots) {\n if (typeof snap !== \"object\" || snap === null) {\n throw new Error(\"Invalid snapshot: expected object\");\n }\n if (\n typeof snap.id !== \"number\" ||\n typeof snap.timestamp !== \"number\" ||\n typeof snap.trigger !== \"string\" ||\n typeof snap.facts !== \"object\"\n ) {\n throw new Error(\"Invalid snapshot structure\");\n }\n // Deep check for prototype pollution attacks (including nested objects)\n if (!isPrototypeSafe(snap.facts)) {\n throw new Error(\n \"Invalid fact data: potential prototype pollution detected in nested objects\",\n );\n }\n }\n\n snapshots.length = 0;\n snapshots.push(...data.snapshots);\n currentIndex = data.currentIndex;\n\n // Restore current state\n const snapshot = snapshots[currentIndex];\n if (snapshot) {\n this.restore(snapshot);\n }\n } catch (error) {\n console.error(\"[Directive] Failed to import time-travel data:\", error);\n }\n },\n\n beginChangeset(label: string): void {\n if (!isEnabled) return;\n pendingChangesetLabel = label;\n pendingChangesetStart = currentIndex;\n },\n\n endChangeset(): void {\n if (!isEnabled || pendingChangesetLabel === null) return;\n if (currentIndex > pendingChangesetStart) {\n changesets.push({\n label: pendingChangesetLabel,\n startIndex: pendingChangesetStart,\n endIndex: currentIndex,\n });\n }\n pendingChangesetLabel = null;\n pendingChangesetStart = -1;\n },\n\n pause(): void {\n paused = true;\n },\n\n resume(): void {\n paused = false;\n },\n };\n\n return manager;\n}\n\n/**\n * Create a no-op time-travel manager used when `debug.timeTravel` is\n * disabled. All methods are safe to call but perform no work.\n *\n * @returns A `TimeTravelManager` where every method is a no-op and `isEnabled` is `false`\n */\nexport function createDisabledTimeTravel<\n S extends Schema,\n>(): TimeTravelManager<S> {\n const noopSnapshot: Snapshot = {\n id: -1,\n timestamp: 0,\n facts: {},\n trigger: \"\",\n };\n\n return {\n isEnabled: false,\n isRestoring: false,\n isPaused: false,\n snapshots: [],\n currentIndex: -1,\n takeSnapshot: () => noopSnapshot,\n restore: () => {},\n goBack: () => {},\n goForward: () => {},\n goTo: () => {},\n replay: () => {},\n export: () => \"{}\",\n import: () => {},\n beginChangeset: () => {},\n endChangeset: () => {},\n pause: () => {},\n resume: () => {},\n };\n}\n","/**\n * Requirements - Typed requirement identity with custom dedupe keys\n *\n * Features:\n * - Type-safe requirement definitions\n * - Stable identity generation\n * - Custom key functions for deduplication control\n * - Requirement comparison and hashing\n */\n\nimport { stableStringify } from \"../utils/utils.js\";\nimport type {\n Requirement,\n RequirementKeyFn,\n RequirementWithId,\n} from \"./types.js\";\n\n// ============================================================================\n// Requirement Identity\n// ============================================================================\n\n/**\n * Generate a stable ID for a requirement.\n * Uses type + sorted properties by default.\n */\nexport function generateRequirementId(\n req: Requirement,\n keyFn?: RequirementKeyFn,\n): string {\n // Use custom key function if provided\n if (keyFn) {\n return keyFn(req);\n }\n\n // Default: type + stable JSON of other properties\n const { type, ...rest } = req;\n const sortedRest = stableStringify(rest);\n return `${type}:${sortedRest}`;\n}\n\n/**\n * Check if two requirements are equal by their IDs.\n */\nexport function requirementsEqual(\n a: RequirementWithId,\n b: RequirementWithId,\n): boolean {\n return a.id === b.id;\n}\n\n/**\n * Create a requirement with its computed ID.\n */\nexport function createRequirementWithId(\n requirement: Requirement,\n fromConstraint: string,\n keyFn?: RequirementKeyFn,\n): RequirementWithId {\n return {\n requirement,\n id: generateRequirementId(requirement, keyFn),\n fromConstraint,\n };\n}\n\n// ============================================================================\n// Requirement Helpers\n// ============================================================================\n\n/**\n * Helper to create typed requirements with a fluent API.\n *\n * Creates a factory function that produces requirements with a specific type.\n * Useful for creating requirements in constraint definitions.\n *\n * @param type - The requirement type string\n * @returns A factory function that creates requirements with the given type\n *\n * @example\n * ```typescript\n * // Create a requirement factory\n * const fetchUser = req(\"FETCH_USER\");\n *\n * // Use in constraint definition\n * constraints: {\n * needsUser: {\n * when: (facts) => facts.userId && !facts.user,\n * require: fetchUser({ userId: 123, priority: \"high\" }),\n * },\n * }\n *\n * // Results in: { type: \"FETCH_USER\", userId: 123, priority: \"high\" }\n * ```\n */\nexport function req<T extends string>(type: T) {\n return <P extends Record<string, unknown>>(props: P) =>\n ({\n type,\n ...props,\n }) as Requirement & { type: T } & P;\n}\n\n/**\n * Check if a requirement matches a type.\n */\nexport function isRequirementType<T extends string>(\n req: Requirement,\n type: T,\n): req is Requirement & { type: T } {\n return req.type === type;\n}\n\n/**\n * Create a type guard for resolver `requirement` predicate.\n * Cleaner alternative to writing verbose type guards.\n *\n * @example\n * ```typescript\n * // With explicit requirement type (recommended for complex types)\n * interface FetchUserRequirement { type: \"FETCH_USER\"; userId: string }\n * requirement: forType<FetchUserRequirement>(\"FETCH_USER\"),\n * key: (req) => req.userId, // req is FetchUserRequirement\n *\n * // Or simple string literal (for basic types)\n * requirement: forType(\"FETCH_USER\"),\n * key: (req) => req.type, // req is Requirement & { type: \"FETCH_USER\" }\n * ```\n */\nexport function forType<R extends Requirement>(\n type: R[\"type\"],\n): (req: Requirement) => req is R;\nexport function forType<T extends string>(\n type: T,\n): (req: Requirement) => req is Requirement & { type: T };\nexport function forType<T extends string>(\n type: T,\n): (req: Requirement) => req is Requirement & { type: T } {\n return (req): req is Requirement & { type: T } => req.type === type;\n}\n\n// ============================================================================\n// Requirement Set Management\n// ============================================================================\n\n/**\n * A set of requirements with automatic deduplication by ID.\n *\n * Requirements are uniquely identified by their ID (generated from type + properties).\n * When adding a requirement with a duplicate ID, the first one wins.\n *\n * @example\n * ```typescript\n * const set = new RequirementSet();\n *\n * // Add requirements\n * set.add(createRequirementWithId({ type: \"FETCH_USER\", userId: 1 }, \"constraint1\"));\n * set.add(createRequirementWithId({ type: \"FETCH_USER\", userId: 1 }, \"constraint2\")); // Ignored (duplicate)\n *\n * // Check and retrieve\n * console.log(set.size); // 1\n * console.log(set.has(\"FETCH_USER:{\\\"userId\\\":1}\")); // true\n *\n * // Diff with another set\n * const newSet = new RequirementSet();\n * newSet.add(createRequirementWithId({ type: \"FETCH_USER\", userId: 2 }, \"constraint1\"));\n * const { added, removed } = newSet.diff(set);\n * // added: [{ type: \"FETCH_USER\", userId: 2 }]\n * // removed: [{ type: \"FETCH_USER\", userId: 1 }]\n * ```\n */\nexport class RequirementSet {\n private map = new Map<string, RequirementWithId>();\n\n /**\n * Add a requirement to the set.\n * If a requirement with the same ID already exists, it is ignored (first wins).\n * @param req - The requirement with its computed ID\n */\n add(req: RequirementWithId): void {\n // If already exists, keep the existing one (first wins)\n if (!this.map.has(req.id)) {\n this.map.set(req.id, req);\n }\n }\n\n /** Remove a requirement by ID */\n remove(id: string): boolean {\n return this.map.delete(id);\n }\n\n /** Check if a requirement exists */\n has(id: string): boolean {\n return this.map.has(id);\n }\n\n /** Get a requirement by ID */\n get(id: string): RequirementWithId | undefined {\n return this.map.get(id);\n }\n\n /** Get all requirements */\n all(): RequirementWithId[] {\n return [...this.map.values()];\n }\n\n /** Get all requirement IDs */\n ids(): string[] {\n return [...this.map.keys()];\n }\n\n /** Get the count of requirements */\n get size(): number {\n return this.map.size;\n }\n\n /** Clear all requirements */\n clear(): void {\n this.map.clear();\n }\n\n /** Create a copy */\n clone(): RequirementSet {\n const copy = new RequirementSet();\n for (const req of this.map.values()) {\n copy.add(req);\n }\n return copy;\n }\n\n /** Diff with another set - returns added and removed */\n diff(other: RequirementSet): {\n added: RequirementWithId[];\n removed: RequirementWithId[];\n unchanged: RequirementWithId[];\n } {\n const added: RequirementWithId[] = [];\n const removed: RequirementWithId[] = [];\n const unchanged: RequirementWithId[] = [];\n\n // Find added (in this but not in other)\n for (const req of this.map.values()) {\n if (!other.has(req.id)) {\n added.push(req);\n } else {\n unchanged.push(req);\n }\n }\n\n // Find removed (in other but not in this)\n for (const req of other.map.values()) {\n if (!this.map.has(req.id)) {\n removed.push(req);\n }\n }\n\n return { added, removed, unchanged };\n }\n}\n","/**\n * Dependency tracking context for auto-tracking derivations\n *\n * Uses a stack-based approach to handle nested derivation computations.\n * When a derivation accesses a fact, the tracking context records it.\n */\n\nimport type { TrackingContext } from \"./types.js\";\n\n/** Stack of active tracking contexts */\nconst trackingStack: TrackingContext[] = [];\n\n/** Create a new tracking context */\nfunction createTrackingContext(): TrackingContext {\n const dependencies = new Set<string>();\n\n return {\n get isTracking() {\n return true;\n },\n track(key: string) {\n dependencies.add(key);\n },\n getDependencies() {\n return dependencies;\n },\n };\n}\n\n/** Null tracking context when not tracking */\nconst nullContext: TrackingContext = {\n isTracking: false,\n track() {},\n getDependencies() {\n return new Set();\n },\n};\n\n/**\n * Get the current tracking context.\n * Returns null context if no tracking is active.\n */\nexport function getCurrentTracker(): TrackingContext {\n return trackingStack[trackingStack.length - 1] ?? nullContext;\n}\n\n/**\n * Check if we're currently tracking dependencies.\n */\nexport function isTracking(): boolean {\n return trackingStack.length > 0;\n}\n\n/**\n * Run a function with dependency tracking.\n * Returns the computed value and the set of dependencies accessed.\n */\nexport function withTracking<T>(fn: () => T): { value: T; deps: Set<string> } {\n const context = createTrackingContext();\n trackingStack.push(context);\n\n try {\n const value = fn();\n return { value, deps: context.getDependencies() };\n } finally {\n trackingStack.pop();\n }\n}\n\n/**\n * Run a function without tracking.\n * Useful for reading facts without creating dependencies.\n */\nexport function withoutTracking<T>(fn: () => T): T {\n // Temporarily clear the stack\n const saved = trackingStack.splice(0, trackingStack.length);\n\n try {\n return fn();\n } finally {\n // Restore the stack\n trackingStack.push(...saved);\n }\n}\n\n/**\n * Track a specific key in the current context.\n * No-op if not currently tracking.\n */\nexport function trackAccess(key: string): void {\n getCurrentTracker().track(key);\n}\n","/**\n * Constraints - Rules that produce requirements when conditions aren't met\n *\n * Features:\n * - Sync and async constraint evaluation\n * - Priority ordering (higher runs first)\n * - Timeout handling for async constraints\n * - Error isolation\n */\n\nimport { withTimeout } from \"../utils/utils.js\";\nimport { RequirementSet, createRequirementWithId } from \"./requirements.js\";\nimport { withTracking } from \"./tracking.js\";\nimport type {\n ConstraintState,\n ConstraintsDef,\n Facts,\n Requirement,\n RequirementKeyFn,\n RequirementWithId,\n Schema,\n} from \"./types.js\";\n\n// Local type alias for requirement output (avoid type arg issues)\ntype RequirementOutput = Requirement | Requirement[] | null;\n\n// ============================================================================\n// Constraints Manager\n// ============================================================================\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport interface ConstraintsManager<_S extends Schema> {\n /** Evaluate all constraints and return unmet requirements */\n evaluate(changedKeys?: Set<string>): Promise<RequirementWithId[]>;\n /** Get the current state of a constraint */\n getState(id: string): ConstraintState | undefined;\n /** Get all constraint states */\n getAllStates(): ConstraintState[];\n /** Disable a constraint */\n disable(id: string): void;\n /** Enable a constraint */\n enable(id: string): void;\n /** Invalidate constraints that depend on the given fact key */\n invalidate(factKey: string): void;\n /** Get the tracked dependencies for a constraint */\n getDependencies(id: string): Set<string> | undefined;\n /** Mark a constraint's resolver as completed (for `after` ordering) */\n markResolved(constraintId: string): void;\n /** Check if a constraint is currently disabled */\n isDisabled(id: string): boolean;\n /** Check if a constraint has been resolved (for `after` ordering) */\n isResolved(constraintId: string): boolean;\n /** Register new constraint definitions (for dynamic module registration) */\n registerDefinitions(newDefs: ConstraintsDef<Schema>): void;\n}\n\n/** Options for creating a constraints manager */\nexport interface CreateConstraintsOptions<S extends Schema> {\n definitions: ConstraintsDef<S>;\n facts: Facts<S>;\n /** Custom key functions for requirements (by constraint ID) */\n requirementKeys?: Record<string, RequirementKeyFn>;\n /** Default timeout for async constraints (ms) */\n defaultTimeout?: number;\n /** Callback when a constraint is evaluated */\n onEvaluate?: (id: string, active: boolean) => void;\n /** Callback when a constraint errors */\n onError?: (id: string, error: unknown) => void;\n}\n\n/** Default async constraint timeout (5 seconds) */\nconst DEFAULT_TIMEOUT = 5000;\n\n/**\n * Create a manager that evaluates constraint rules and produces unmet\n * requirements.\n *\n * Constraints are evaluated in priority order (higher first), with\n * topological ordering for same-priority constraints connected by `after`\n * dependencies. Supports sync and async `when()` predicates, incremental\n * evaluation based on changed fact keys, and per-constraint enable/disable.\n *\n * @param options - Constraint definitions, facts proxy, custom requirement key functions, and lifecycle callbacks\n * @returns A `ConstraintsManager` with evaluate/invalidate/enable/disable/markResolved methods\n */\nexport function createConstraintsManager<S extends Schema>(\n options: CreateConstraintsOptions<S>,\n): ConstraintsManager<S> {\n const {\n definitions,\n facts,\n requirementKeys = {},\n defaultTimeout = DEFAULT_TIMEOUT,\n onEvaluate,\n onError,\n } = options;\n\n // Internal state for each constraint\n const states = new Map<string, ConstraintState>();\n const disabled = new Set<string>();\n\n // Track which constraints are async\n const asyncConstraintIds = new Set<string>();\n\n // Dependency tracking: which facts each constraint depends on\n const constraintDeps = new Map<string, Set<string>>();\n // Reverse mapping: which constraints depend on each fact\n const factToConstraints = new Map<string, Set<string>>();\n // Track which constraints need re-evaluation\n const dirtyConstraints = new Set<string>();\n // Cache latest when() deps so they can be combined with require() deps atomically\n const latestWhenDeps = new Map<string, Set<string>>();\n // Track last requirements for each constraint (for incremental updates)\n const lastRequirements = new Map<string, RequirementWithId[]>();\n // First evaluation flag\n let hasEvaluated = false;\n // Track resolved constraints (for `after` ordering)\n const resolvedConstraints = new Set<string>();\n // Track constraints that didn't fire (when() returned false) - they don't block\n const noFireConstraints = new Set<string>();\n // Reverse dependency map: which constraints depend on this one (for O(1) markResolved)\n const dependsOnMe = new Map<string, Set<string>>();\n // Topological order of constraints (dependencies before dependents)\n let topologicalOrder: string[] = [];\n // Cached topological index map for O(1) lookups during sorting\n let topologicalIndex: Map<string, number> = new Map();\n\n /**\n * Build reverse dependency map for O(1) lookups in markResolved.\n * Maps each constraint ID to the set of constraints that depend on it via `after`.\n */\n function buildReverseDependencyMap(): void {\n for (const [id, def] of Object.entries(definitions)) {\n if (def.after) {\n for (const depId of def.after) {\n if (definitions[depId]) {\n if (!dependsOnMe.has(depId)) {\n dependsOnMe.set(depId, new Set());\n }\n dependsOnMe.get(depId)!.add(id);\n }\n }\n }\n }\n }\n\n /**\n * Detect cycles in the constraint dependency graph and compute topological order.\n * Uses DFS to find back edges and post-order for topological sort.\n *\n * The DFS visits dependencies first (via `after`), so post-order naturally gives us\n * topological order where dependencies appear before their dependents.\n */\n function detectCyclesAndComputeTopoOrder(): void {\n const visited = new Set<string>();\n const visiting = new Set<string>();\n const postOrder: string[] = [];\n\n function visit(id: string, path: string[]): void {\n if (visited.has(id)) return;\n\n if (visiting.has(id)) {\n const cycleStart = path.indexOf(id);\n const cycle = [...path.slice(cycleStart), id].join(\" → \");\n throw new Error(\n `[Directive] Constraint cycle detected: ${cycle}. ` +\n `Remove one of the \\`after\\` dependencies to break the cycle.`,\n );\n }\n\n visiting.add(id);\n path.push(id);\n\n const def = definitions[id];\n if (def?.after) {\n for (const depId of def.after) {\n // Only check deps that exist in this manager\n if (definitions[depId]) {\n visit(depId, path);\n }\n }\n }\n\n path.pop();\n visiting.delete(id);\n visited.add(id);\n postOrder.push(id);\n }\n\n for (const id of Object.keys(definitions)) {\n visit(id, []);\n }\n\n // Post-order with dependency-first traversal gives us topological order\n // (dependencies are added before dependents)\n topologicalOrder = postOrder;\n\n // Build index map for O(1) lookups during sorting\n topologicalIndex = new Map(\n topologicalOrder.map((id, index) => [id, index]),\n );\n }\n\n // Validate constraint graph (always run - cycle in production would cause deadlock)\n // Also computes topological order for O(n) evaluation\n detectCyclesAndComputeTopoOrder();\n\n // Build reverse dependency map for O(1) markResolved lookups\n buildReverseDependencyMap();\n\n // Validate `after` references in dev mode (catch typos early)\n if (process.env.NODE_ENV !== \"production\") {\n for (const [id, def] of Object.entries(definitions)) {\n if (def.after) {\n for (const depId of def.after) {\n if (!definitions[depId]) {\n console.warn(\n `[Directive] Constraint \"${id}\" references unknown constraint \"${depId}\" in \\`after\\`. ` +\n `This dependency will be ignored. Check for typos or ensure the constraint exists.`,\n );\n }\n }\n }\n }\n }\n\n /**\n * Determine if a constraint is async.\n * Uses the explicit `async` flag if provided, otherwise falls back to runtime detection.\n * Runtime detection is only used on first evaluation and logs a dev warning.\n */\n function isAsyncConstraint(\n id: string,\n def: ConstraintsDef<S>[string],\n ): boolean {\n // Prefer explicit flag to avoid runtime detection side effects\n if (def.async !== undefined) {\n return def.async;\n }\n\n // Check if we've already detected this constraint as async\n if (asyncConstraintIds.has(id)) {\n return true;\n }\n\n // Runtime detection is deferred to first evaluation\n // We'll detect it in evaluateSync if it returns a Promise\n return false;\n }\n\n /** Initialize state for a constraint */\n function initState(id: string): ConstraintState {\n const def = definitions[id];\n if (!def) {\n throw new Error(`[Directive] Unknown constraint: ${id}`);\n }\n\n const isAsync = isAsyncConstraint(id, def);\n if (isAsync) {\n asyncConstraintIds.add(id);\n }\n\n const state: ConstraintState = {\n id,\n priority: def.priority ?? 0,\n isAsync,\n lastResult: null,\n isEvaluating: false,\n error: null,\n lastResolvedAt: null,\n after: def.after ?? [],\n hitCount: 0,\n lastActiveAt: null,\n };\n\n states.set(id, state);\n return state;\n }\n\n /** Get or create state for a constraint */\n function getState(id: string): ConstraintState {\n return states.get(id) ?? initState(id);\n }\n\n /** Update dependency tracking for a constraint */\n function updateDependencies(id: string, newDeps: Set<string>): void {\n const oldDeps = constraintDeps.get(id) ?? new Set();\n\n // Remove old dependencies\n for (const dep of oldDeps) {\n const constraints = factToConstraints.get(dep);\n constraints?.delete(id);\n if (constraints && constraints.size === 0) {\n factToConstraints.delete(dep);\n }\n }\n\n // Add new dependencies\n for (const dep of newDeps) {\n if (!factToConstraints.has(dep)) {\n factToConstraints.set(dep, new Set());\n }\n factToConstraints.get(dep)!.add(id);\n }\n\n constraintDeps.set(id, newDeps);\n }\n\n /** Evaluate a single sync constraint */\n function evaluateSync(id: string): boolean | Promise<boolean> {\n const def = definitions[id];\n if (!def) return false;\n\n const state = getState(id);\n\n state.isEvaluating = true;\n state.error = null;\n\n try {\n // If explicit deps are provided, skip auto-tracking overhead\n let result: boolean | Promise<boolean>;\n if (def.deps) {\n result = def.when(facts);\n latestWhenDeps.set(id, new Set(def.deps));\n } else {\n // Track dependencies during evaluation\n const tracked = withTracking(() => def.when(facts));\n result = tracked.value;\n // Save when deps — combined with require deps in processConstraintResult\n latestWhenDeps.set(id, tracked.deps);\n }\n\n // Runtime async detection: if this was thought to be sync but returns a Promise\n if (result instanceof Promise) {\n // Mark as async for future evaluations\n asyncConstraintIds.add(id);\n state.isAsync = true;\n\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\n `[Directive] Constraint \"${id}\" returned a Promise but was not marked as async. ` +\n `Add \\`async: true\\` to the constraint definition to avoid this warning and improve performance.`,\n );\n }\n\n // Return the promise to be handled as async\n return result\n .then((asyncResult) => {\n state.lastResult = asyncResult;\n if (asyncResult) {\n state.hitCount++;\n state.lastActiveAt = Date.now();\n }\n state.isEvaluating = false;\n onEvaluate?.(id, asyncResult);\n return asyncResult;\n })\n .catch((error) => {\n state.error =\n error instanceof Error ? error : new Error(String(error));\n state.lastResult = false;\n state.isEvaluating = false;\n onError?.(id, error);\n return false;\n });\n }\n\n state.lastResult = result;\n if (result) {\n state.hitCount++;\n state.lastActiveAt = Date.now();\n }\n state.isEvaluating = false;\n onEvaluate?.(id, result);\n return result;\n } catch (error) {\n state.error = error instanceof Error ? error : new Error(String(error));\n state.lastResult = false;\n state.isEvaluating = false;\n onError?.(id, error);\n return false;\n }\n }\n\n /** Evaluate a single async constraint with timeout */\n async function evaluateAsync(id: string): Promise<boolean> {\n const def = definitions[id];\n if (!def) return false;\n\n const state = getState(id);\n const timeout = def.timeout ?? defaultTimeout;\n\n state.isEvaluating = true;\n state.error = null;\n\n // Register explicit deps before await (auto-tracking can't work across async boundaries)\n if (def.deps?.length) {\n const depsSet = new Set(def.deps);\n updateDependencies(id, depsSet);\n latestWhenDeps.set(id, depsSet);\n }\n\n try {\n const resultPromise = def.when(facts) as Promise<boolean>;\n\n // Race against timeout (with proper cleanup)\n const result = await withTimeout(\n resultPromise,\n timeout,\n `Constraint \"${id}\" timed out after ${timeout}ms`,\n );\n\n state.lastResult = result;\n if (result) {\n state.hitCount++;\n state.lastActiveAt = Date.now();\n }\n state.isEvaluating = false;\n onEvaluate?.(id, result);\n return result;\n } catch (error) {\n state.error = error instanceof Error ? error : new Error(String(error));\n state.lastResult = false;\n state.isEvaluating = false;\n onError?.(id, error);\n return false;\n }\n }\n\n /** Max requirements per constraint before warning in dev mode */\n const MAX_REQUIREMENTS_WARNING_THRESHOLD = 10;\n\n /**\n * Normalize a requirement output to an array of requirements.\n * - null/undefined → []\n * - single requirement → [requirement]\n * - array → filtered to remove null/undefined\n */\n function normalizeRequirements(\n output: RequirementOutput,\n constraintId?: string,\n ): Requirement[] {\n if (output === null || output === undefined) {\n return [];\n }\n if (Array.isArray(output)) {\n // Filter out null/undefined from arrays\n const filtered = output.filter(\n (r): r is Requirement => r !== null && r !== undefined,\n );\n\n // Warn in dev mode if constraint produces many requirements\n if (\n process.env.NODE_ENV !== \"production\" &&\n filtered.length > MAX_REQUIREMENTS_WARNING_THRESHOLD &&\n constraintId\n ) {\n console.warn(\n `[Directive] Constraint \"${constraintId}\" produced ${filtered.length} requirements. ` +\n `Consider splitting into multiple constraints for better performance.`,\n );\n }\n\n return filtered;\n }\n return [output];\n }\n\n /** Get the requirements for a constraint, tracking dependencies if require is a function */\n function getRequirements(id: string): {\n requirements: Requirement[];\n deps: Set<string>;\n } {\n const def = definitions[id];\n if (!def) return { requirements: [], deps: new Set() };\n\n const requireDef = def.require;\n if (typeof requireDef === \"function\") {\n // Track dependencies when require is a function\n const { value: output, deps } = withTracking(() => requireDef(facts));\n const requirements = normalizeRequirements(\n output as RequirementOutput,\n id,\n );\n return { requirements, deps };\n }\n\n const requirements = normalizeRequirements(\n requireDef as RequirementOutput,\n id,\n );\n return { requirements, deps: new Set() };\n }\n\n /** Merge additional dependencies into existing constraint deps */\n function mergeDependencies(id: string, additionalDeps: Set<string>): void {\n if (additionalDeps.size === 0) return;\n\n const existingDeps = constraintDeps.get(id) ?? new Set();\n for (const dep of additionalDeps) {\n existingDeps.add(dep);\n // Update reverse mapping\n if (!factToConstraints.has(dep)) {\n factToConstraints.set(dep, new Set());\n }\n factToConstraints.get(dep)!.add(id);\n }\n constraintDeps.set(id, existingDeps);\n }\n\n // Initialize all constraint states and cache sorted order\n let sortedConstraintIds: string[] | null = null;\n\n /**\n * Get constraint IDs sorted by:\n * 1. Priority (higher first)\n * 2. Topological order (dependencies before dependents) for same priority\n * This enables O(n) evaluation in the best case when priorities align with dependencies.\n *\n * Uses cached topologicalIndex for O(1) lookups during comparison.\n */\n function getSortedConstraintIds(): string[] {\n if (!sortedConstraintIds) {\n sortedConstraintIds = Object.keys(definitions).sort((a, b) => {\n const stateA = getState(a);\n const stateB = getState(b);\n\n // Primary sort: priority (higher first)\n const priorityDiff = stateB.priority - stateA.priority;\n if (priorityDiff !== 0) return priorityDiff;\n\n // Secondary sort: topological order (dependencies first)\n // Uses cached topologicalIndex for O(1) lookups\n const topoA = topologicalIndex.get(a) ?? 0;\n const topoB = topologicalIndex.get(b) ?? 0;\n return topoA - topoB;\n });\n }\n return sortedConstraintIds;\n }\n\n for (const id of Object.keys(definitions)) {\n initState(id);\n }\n\n // Dev-mode: warn about async constraints without explicit deps\n if (process.env.NODE_ENV !== \"production\") {\n for (const [id, def] of Object.entries(definitions)) {\n if (def.async && !def.deps) {\n console.warn(\n `[Directive] Async constraint \"${id}\" has no \\`deps\\` declared. ` +\n `Auto-tracking cannot work across async boundaries. ` +\n `Add \\`deps: [\"key1\", \"key2\"]\\` to enable dependency tracking.`,\n );\n }\n }\n }\n\n /**\n * Check if a constraint's `after` dependencies are satisfied.\n * A dependency is satisfied if:\n * - It has been resolved (resolver completed successfully)\n * - It didn't fire (when() returned false) - nothing to wait for\n * - It is disabled - can't fire\n * - It doesn't exist in this manager (cross-module, handled externally)\n */\n function areAfterDependenciesSatisfied(id: string): boolean {\n const state = states.get(id);\n if (!state || state.after.length === 0) return true;\n\n for (const depId of state.after) {\n // Skip deps that don't exist (cross-module, handled externally)\n if (!definitions[depId]) continue;\n\n // Skip disabled deps - they can't fire\n if (disabled.has(depId)) continue;\n\n // If dep didn't fire (when returned false), no need to wait\n if (noFireConstraints.has(depId)) continue;\n\n // If dep hasn't been resolved yet, we're blocked\n if (!resolvedConstraints.has(depId)) {\n return false;\n }\n }\n\n return true;\n }\n\n const manager: ConstraintsManager<S> = {\n async evaluate(changedKeys?: Set<string>): Promise<RequirementWithId[]> {\n const requirements = new RequirementSet();\n\n // Note: resolvedConstraints persists across reconcile cycles intentionally.\n // `after` ordering means \"wait until dependency's resolver has completed\",\n // and that completion happens in a different cycle than the evaluation.\n // noFireConstraints is re-populated during each evaluation pass.\n noFireConstraints.clear();\n\n // Get all enabled constraints (use cached sort order)\n const allConstraintIds = getSortedConstraintIds().filter(\n (id) => !disabled.has(id),\n );\n\n // Determine which constraints to evaluate\n let constraintsToEvaluate: string[];\n\n if (!hasEvaluated || !changedKeys || changedKeys.size === 0) {\n // First evaluation or no specific changes: evaluate all\n constraintsToEvaluate = allConstraintIds;\n hasEvaluated = true;\n } else {\n // Incremental: only evaluate constraints affected by changed keys\n const affected = new Set<string>();\n for (const key of changedKeys) {\n const dependentConstraints = factToConstraints.get(key);\n if (dependentConstraints) {\n for (const id of dependentConstraints) {\n if (!disabled.has(id)) {\n affected.add(id);\n }\n }\n }\n }\n // Also include any dirty constraints\n for (const id of dirtyConstraints) {\n if (!disabled.has(id)) {\n affected.add(id);\n }\n }\n dirtyConstraints.clear();\n constraintsToEvaluate = [...affected];\n\n // For constraints NOT being re-evaluated, add their last requirements\n for (const id of allConstraintIds) {\n if (!affected.has(id)) {\n const lastReqs = lastRequirements.get(id);\n if (lastReqs) {\n for (const req of lastReqs) {\n requirements.add(req);\n }\n }\n }\n }\n }\n\n /**\n * Process a constraint result: handle requirements and track no-fire state\n */\n function processConstraintResult(id: string, active: boolean): void {\n if (disabled.has(id)) return;\n\n const whenDeps = latestWhenDeps.get(id);\n\n if (!active) {\n // when() returned false — update with just when deps (no require deps needed)\n if (whenDeps !== undefined) {\n updateDependencies(id, whenDeps);\n }\n noFireConstraints.add(id);\n lastRequirements.set(id, []);\n return;\n }\n\n // Remove from no-fire tracking since it fired\n noFireConstraints.delete(id);\n\n let reqs: Requirement[];\n let requireDeps: Set<string>;\n try {\n const result = getRequirements(id);\n reqs = result.requirements;\n requireDeps = result.deps;\n } catch (error) {\n onError?.(id, error);\n if (whenDeps !== undefined) {\n updateDependencies(id, whenDeps);\n }\n lastRequirements.set(id, []);\n return;\n }\n // Combine when() + require() deps atomically to prevent\n // require deps from being temporarily lost between updates\n if (whenDeps !== undefined) {\n const combinedDeps = new Set(whenDeps);\n for (const dep of requireDeps) {\n combinedDeps.add(dep);\n }\n updateDependencies(id, combinedDeps);\n } else {\n // Async constraint (no when deps tracked) — merge additively\n mergeDependencies(id, requireDeps);\n }\n if (reqs.length > 0) {\n const keyFn = requirementKeys[id];\n const reqsWithId = reqs.map((req) =>\n createRequirementWithId(req, id, keyFn),\n );\n for (const reqWithId of reqsWithId) {\n requirements.add(reqWithId);\n }\n lastRequirements.set(id, reqsWithId);\n } else {\n lastRequirements.set(id, []);\n }\n }\n\n /**\n * Evaluate constraints, respecting `after` dependencies.\n * Returns list of constraints that are still blocked after this pass.\n */\n async function evaluateConstraintBatch(\n constraintIds: string[],\n ): Promise<string[]> {\n // Filter out constraints blocked by `after` dependencies\n const blockedConstraints: string[] = [];\n const readyToEvaluate: string[] = [];\n\n for (const id of constraintIds) {\n if (areAfterDependenciesSatisfied(id)) {\n readyToEvaluate.push(id);\n } else {\n blockedConstraints.push(id);\n // Keep last requirements for blocked constraints\n const lastReqs = lastRequirements.get(id);\n if (lastReqs) {\n for (const req of lastReqs) {\n requirements.add(req);\n }\n }\n }\n }\n\n if (readyToEvaluate.length === 0) {\n return blockedConstraints;\n }\n\n // Separate sync and async constraints from ready-to-evaluate\n const syncConstraints: string[] = [];\n const asyncConstraints: string[] = [];\n\n for (const id of readyToEvaluate) {\n const state = getState(id);\n if (state.isAsync) {\n asyncConstraints.push(id);\n } else {\n syncConstraints.push(id);\n }\n }\n\n // Evaluate sync constraints first (they're fast)\n // Some may turn out to be async at runtime - collect those for async evaluation\n const unexpectedAsync: Array<{\n id: string;\n promise: Promise<boolean>;\n }> = [];\n\n for (const id of syncConstraints) {\n const result = evaluateSync(id);\n\n // Handle runtime-detected async constraints\n if (result instanceof Promise) {\n unexpectedAsync.push({ id, promise: result });\n continue;\n }\n\n processConstraintResult(id, result);\n }\n\n // Handle any sync constraints that turned out to be async\n if (unexpectedAsync.length > 0) {\n const asyncResults = await Promise.all(\n unexpectedAsync.map(async ({ id, promise }) => ({\n id,\n active: await promise,\n })),\n );\n\n for (const { id, active } of asyncResults) {\n processConstraintResult(id, active);\n }\n }\n\n // Evaluate async constraints in parallel\n if (asyncConstraints.length > 0) {\n const asyncResults = await Promise.all(\n asyncConstraints.map(async (id) => ({\n id,\n active: await evaluateAsync(id),\n })),\n );\n\n for (const { id, active } of asyncResults) {\n processConstraintResult(id, active);\n }\n }\n\n return blockedConstraints;\n }\n\n // Evaluate constraints in passes until no blocked constraints become unblocked\n let remainingToEvaluate = constraintsToEvaluate;\n let maxPasses = constraintsToEvaluate.length + 1; // Prevent infinite loops\n\n while (remainingToEvaluate.length > 0 && maxPasses > 0) {\n const previousRemaining = remainingToEvaluate.length;\n remainingToEvaluate =\n await evaluateConstraintBatch(remainingToEvaluate);\n\n // If no progress was made (all still blocked), break\n if (remainingToEvaluate.length === previousRemaining) {\n break;\n }\n maxPasses--;\n }\n\n return requirements.all();\n },\n\n getState(id: string): ConstraintState | undefined {\n return states.get(id);\n },\n\n getDependencies(id: string): Set<string> | undefined {\n return constraintDeps.get(id);\n },\n\n getAllStates(): ConstraintState[] {\n return [...states.values()];\n },\n\n disable(id: string): void {\n if (!states.has(id)) {\n console.warn(\n `[Directive] constraints.disable(\"${id}\") — no such constraint`,\n );\n\n return;\n }\n disabled.add(id);\n // Invalidate cache when constraints change\n sortedConstraintIds = null;\n // Mark as dirty so it gets removed from requirements on next evaluate\n lastRequirements.delete(id);\n\n // Clean up dependency maps for disabled constraint\n const deps = constraintDeps.get(id);\n if (deps) {\n for (const dep of deps) {\n const constraints = factToConstraints.get(dep);\n if (constraints) {\n constraints.delete(id);\n if (constraints.size === 0) {\n factToConstraints.delete(dep);\n }\n }\n }\n constraintDeps.delete(id);\n }\n latestWhenDeps.delete(id);\n },\n\n enable(id: string): void {\n if (!states.has(id)) {\n console.warn(\n `[Directive] constraints.enable(\"${id}\") — no such constraint`,\n );\n\n return;\n }\n disabled.delete(id);\n // Invalidate cache when constraints change\n sortedConstraintIds = null;\n // Mark as dirty so it gets evaluated on next cycle\n dirtyConstraints.add(id);\n },\n\n isDisabled(id: string): boolean {\n return disabled.has(id);\n },\n\n invalidate(factKey: string): void {\n // Mark all constraints that depend on this fact as dirty\n const dependentConstraints = factToConstraints.get(factKey);\n if (dependentConstraints) {\n for (const id of dependentConstraints) {\n dirtyConstraints.add(id);\n }\n }\n },\n\n markResolved(constraintId: string): void {\n resolvedConstraints.add(constraintId);\n const state = states.get(constraintId);\n if (state) {\n state.lastResolvedAt = Date.now();\n }\n\n // Mark all constraints that depend on this one (via `after`) as dirty\n // so they get re-evaluated on the next reconcile\n // Uses reverse dependency map for O(1) lookup instead of O(n*m) iteration\n const dependents = dependsOnMe.get(constraintId);\n if (dependents) {\n for (const id of dependents) {\n dirtyConstraints.add(id);\n }\n }\n },\n\n isResolved(constraintId: string): boolean {\n return resolvedConstraints.has(constraintId);\n },\n\n registerDefinitions(newDefs: ConstraintsDef<Schema>): void {\n for (const [key, def] of Object.entries(newDefs)) {\n (definitions as Record<string, unknown>)[key] = def;\n initState(key);\n dirtyConstraints.add(key);\n }\n // Invalidate cached sort order\n sortedConstraintIds = null;\n // Rebuild topological order and reverse dependency map\n // so new `after` deps are validated for cycles and indexed\n detectCyclesAndComputeTopoOrder();\n buildReverseDependencyMap();\n },\n };\n\n return manager;\n}\n","/**\n * Derivations - Auto-tracked computed values with composition\n *\n * Features:\n * - Automatic dependency tracking (no manual deps arrays)\n * - Memoization with smart invalidation\n * - Derivation composition (derivations can depend on other derivations)\n * - Circular dependency detection\n * - Lazy evaluation\n */\n\nimport { trackAccess, withTracking } from \"./tracking.js\";\nimport type {\n DerivationState,\n DerivationsDef,\n DerivedValues,\n Facts,\n FactsStore,\n Schema,\n} from \"./types.js\";\n\n// ============================================================================\n// Derivations Manager\n// ============================================================================\n\nexport interface DerivationsManager<\n S extends Schema,\n D extends DerivationsDef<S>,\n> {\n /** Get a derived value (computes if stale) */\n get<K extends keyof D>(id: K): ReturnType<D[K]>;\n /** Check if a derivation is stale */\n isStale(id: keyof D): boolean;\n /** Invalidate derivations that depend on a fact key */\n invalidate(factKey: string): void;\n /** Invalidate derivations for multiple fact keys, notifying listeners once at the end */\n invalidateMany(factKeys: Iterable<string>): void;\n /** Invalidate all derivations */\n invalidateAll(): void;\n /** Subscribe to derivation changes */\n subscribe(ids: Array<keyof D>, listener: () => void): () => void;\n /** Get the proxy for composition */\n getProxy(): DerivedValues<S, D>;\n /** Get dependencies for a derivation */\n getDependencies(id: keyof D): Set<string>;\n /** Register new derivation definitions (for dynamic module registration) */\n registerDefinitions(newDefs: DerivationsDef<S>): void;\n}\n\n/** Options for creating a derivations manager */\nexport interface CreateDerivationsOptions<\n S extends Schema,\n D extends DerivationsDef<S>,\n> {\n definitions: D;\n facts: Facts<S>;\n store: FactsStore<S>;\n /** Callback when a derivation is computed */\n onCompute?: (\n id: string,\n value: unknown,\n oldValue: unknown,\n deps: string[],\n ) => void;\n /** Callback when a derivation is invalidated */\n onInvalidate?: (id: string) => void;\n /** Callback when a derivation errors */\n onError?: (id: string, error: unknown) => void;\n}\n\n/**\n * Create a manager for lazily-evaluated, auto-tracked derived values.\n *\n * Derivations are memoized computations that automatically track which facts\n * they read. When a tracked fact changes, the derivation is invalidated and\n * recomputed on next access. Derivations can depend on other derivations\n * (composition), and circular dependencies are detected at compute time.\n *\n * Notifications are deferred during invalidation so listeners always see\n * consistent state across multiple simultaneous fact changes.\n *\n * @param options - Derivation definitions, facts proxy, store, and optional lifecycle callbacks\n * @returns A `DerivationsManager` with get/invalidate/subscribe/getProxy methods\n */\nexport function createDerivationsManager<\n S extends Schema,\n D extends DerivationsDef<S>,\n>(options: CreateDerivationsOptions<S, D>): DerivationsManager<S, D> {\n const {\n definitions,\n facts,\n store: _store,\n onCompute,\n onInvalidate,\n onError,\n } = options;\n // Note: _store is kept for API compatibility but invalidation is handled by the engine calling invalidate()\n\n // Internal state for each derivation\n const states = new Map<string, DerivationState<unknown>>();\n const listeners = new Map<string, Set<() => void>>();\n\n // Track which derivations depend on which fact keys\n const factToDerivedDeps = new Map<string, Set<string>>();\n // Track which derivations depend on which other derivations\n const derivedToDerivedDeps = new Map<string, Set<string>>();\n\n // Prototype pollution guard (same pattern as engine.ts, facts.ts, system.ts)\n const BLOCKED_PROPS = new Set([\"__proto__\", \"constructor\", \"prototype\"]);\n\n // Deferred notification: during invalidation, collect IDs to notify.\n // Listeners fire AFTER all invalidations complete so they see consistent state.\n let invalidationDepth = 0;\n const pendingNotifications = new Set<string>();\n let isFlushing = false;\n const MAX_FLUSH_ITERATIONS = 100;\n\n // The proxy for composition (derivations accessing other derivations)\n let derivedProxy: DerivedValues<S, D>;\n\n /** Initialize state for a derivation */\n function initState(id: string): DerivationState<unknown> {\n const def = definitions[id as keyof D];\n if (!def) {\n throw new Error(`[Directive] Unknown derivation: ${id}`);\n }\n\n const state: DerivationState<unknown> = {\n id,\n compute: () => computeDerivation(id),\n cachedValue: undefined,\n dependencies: new Set(),\n isStale: true,\n isComputing: false,\n };\n\n states.set(id, state);\n return state;\n }\n\n /** Get or create state for a derivation */\n function getState(id: string): DerivationState<unknown> {\n return states.get(id) ?? initState(id);\n }\n\n /** Compute a derivation and track its dependencies */\n function computeDerivation(id: string): unknown {\n const state = getState(id);\n const def = definitions[id as keyof D];\n\n if (!def) {\n throw new Error(`[Directive] Unknown derivation: ${id}`);\n }\n\n // Circular dependency detection\n if (state.isComputing) {\n throw new Error(\n `[Directive] Circular dependency detected in derivation: ${id}`,\n );\n }\n\n state.isComputing = true;\n\n try {\n // Capture old value before recomputation\n const oldValue = state.cachedValue;\n\n // Compute with tracking\n const { value, deps } = withTracking(() => def(facts, derivedProxy));\n\n // Update state\n state.cachedValue = value;\n state.isStale = false;\n\n // Update dependency tracking\n updateDependencies(id, deps);\n\n // Notify callback\n onCompute?.(id, value, oldValue, [...deps]);\n\n return value;\n } catch (error) {\n onError?.(id, error);\n throw error;\n } finally {\n state.isComputing = false;\n }\n }\n\n /** Update dependency tracking for a derivation */\n function updateDependencies(id: string, newDeps: Set<string>): void {\n const state = getState(id);\n const oldDeps = state.dependencies;\n\n // Remove old fact dependencies\n for (const dep of oldDeps) {\n // Check if it's a fact key or a derived key\n if (states.has(dep)) {\n const depSet = derivedToDerivedDeps.get(dep);\n depSet?.delete(id);\n // Clean up empty Sets to prevent memory leaks\n if (depSet && depSet.size === 0) {\n derivedToDerivedDeps.delete(dep);\n }\n } else {\n const depSet = factToDerivedDeps.get(dep);\n depSet?.delete(id);\n // Clean up empty Sets to prevent memory leaks\n if (depSet && depSet.size === 0) {\n factToDerivedDeps.delete(dep);\n }\n }\n }\n\n // Add new dependencies\n for (const dep of newDeps) {\n // Check if it's a derivation or a fact\n if (definitions[dep as keyof D]) {\n // It's a derivation-to-derivation dependency\n if (!derivedToDerivedDeps.has(dep)) {\n derivedToDerivedDeps.set(dep, new Set());\n }\n derivedToDerivedDeps.get(dep)!.add(id);\n } else {\n // It's a fact dependency\n if (!factToDerivedDeps.has(dep)) {\n factToDerivedDeps.set(dep, new Set());\n }\n factToDerivedDeps.get(dep)!.add(id);\n }\n }\n\n state.dependencies = newDeps;\n }\n\n /** Flush deferred notifications after all invalidations complete */\n function flushNotifications(): void {\n if (invalidationDepth > 0 || isFlushing) return;\n\n isFlushing = true;\n try {\n // Loop until no more pending — listeners may trigger new invalidations\n // that add to pendingNotifications via re-entrant invalidate() calls.\n let iterations = 0;\n while (pendingNotifications.size > 0) {\n if (++iterations > MAX_FLUSH_ITERATIONS) {\n const remaining = [...pendingNotifications];\n pendingNotifications.clear();\n throw new Error(\n `[Directive] Infinite derivation notification loop detected after ${MAX_FLUSH_ITERATIONS} iterations. ` +\n `Remaining: ${remaining.join(\", \")}. ` +\n `This usually means a derivation listener is mutating facts that re-trigger the same derivation.`,\n );\n }\n\n const ids = [...pendingNotifications];\n pendingNotifications.clear();\n\n for (const id of ids) {\n listeners.get(id)?.forEach((listener) => listener());\n }\n }\n } finally {\n isFlushing = false;\n }\n }\n\n /** Invalidate a derivation and its dependents */\n function invalidateDerivation(id: string, visited = new Set<string>()): void {\n if (visited.has(id)) return;\n visited.add(id);\n\n const state = states.get(id);\n if (!state || state.isStale) return;\n\n state.isStale = true;\n onInvalidate?.(id);\n\n // Defer listener notification until all invalidations complete.\n // This prevents listeners from observing partially-stale state and\n // avoids infinite loops from Set mutation during iteration (listeners\n // recompute derivations → updateDependencies → modify dep Sets).\n pendingNotifications.add(id);\n\n // Invalidate derivations that depend on this one\n const dependents = derivedToDerivedDeps.get(id);\n if (dependents) {\n for (const dependent of dependents) {\n invalidateDerivation(dependent, visited);\n }\n }\n }\n\n // Create the proxy for composition\n derivedProxy = new Proxy({} as DerivedValues<S, D>, {\n get(_, prop: string | symbol) {\n if (typeof prop === \"symbol\") return undefined;\n if (BLOCKED_PROPS.has(prop)) return undefined;\n\n // Track this derivation access so the consuming derivation\n // records a dependency on it (enables composition invalidation)\n trackAccess(prop);\n\n const state = getState(prop);\n\n // Recompute if stale\n if (state.isStale) {\n computeDerivation(prop);\n }\n\n return state.cachedValue;\n },\n });\n\n // Note: Fact change invalidation is handled by the engine calling invalidate()\n\n const manager: DerivationsManager<S, D> = {\n get<K extends keyof D>(id: K): ReturnType<D[K]> {\n const state = getState(id as string);\n\n if (state.isStale) {\n computeDerivation(id as string);\n }\n\n return state.cachedValue as ReturnType<D[K]>;\n },\n\n isStale(id: keyof D): boolean {\n const state = states.get(id as string);\n return state?.isStale ?? true;\n },\n\n invalidate(factKey: string): void {\n const dependents = factToDerivedDeps.get(factKey);\n if (!dependents) return;\n\n invalidationDepth++;\n try {\n for (const id of dependents) {\n invalidateDerivation(id);\n }\n } finally {\n invalidationDepth--;\n flushNotifications();\n }\n },\n\n invalidateMany(factKeys: Iterable<string>): void {\n invalidationDepth++;\n try {\n for (const factKey of factKeys) {\n const dependents = factToDerivedDeps.get(factKey);\n if (!dependents) continue;\n for (const id of dependents) {\n invalidateDerivation(id);\n }\n }\n } finally {\n invalidationDepth--;\n flushNotifications();\n }\n },\n\n invalidateAll(): void {\n invalidationDepth++;\n try {\n for (const state of states.values()) {\n if (!state.isStale) {\n state.isStale = true;\n pendingNotifications.add(state.id);\n }\n }\n } finally {\n invalidationDepth--;\n flushNotifications();\n }\n },\n\n subscribe(ids: Array<keyof D>, listener: () => void): () => void {\n for (const id of ids) {\n const idStr = id as string;\n if (!listeners.has(idStr)) {\n listeners.set(idStr, new Set());\n }\n listeners.get(idStr)!.add(listener);\n }\n\n return () => {\n for (const id of ids) {\n const idStr = id as string;\n const listenerSet = listeners.get(idStr);\n listenerSet?.delete(listener);\n // Clean up empty Sets to prevent memory leaks\n if (listenerSet && listenerSet.size === 0) {\n listeners.delete(idStr);\n }\n }\n };\n },\n\n getProxy(): DerivedValues<S, D> {\n return derivedProxy;\n },\n\n getDependencies(id: keyof D): Set<string> {\n return getState(id as string).dependencies;\n },\n\n registerDefinitions(newDefs: DerivationsDef<S>): void {\n for (const [key, fn] of Object.entries(newDefs)) {\n (definitions as Record<string, unknown>)[key] = fn;\n initState(key);\n }\n },\n };\n\n return manager;\n}\n","/**\n * Effects - Fire-and-forget side effects\n *\n * Features:\n * - Separate from requirement resolution\n * - Error isolation (never breaks reconciliation)\n * - Optional explicit dependencies for optimization\n * - Runs after facts stabilize\n *\n * IMPORTANT: Auto-tracking limitations\n * ------------------------------------\n * When using auto-tracking (no explicit `deps`), only SYNCHRONOUS fact accesses\n * are tracked. If your effect reads facts after an `await`, those reads are NOT\n * tracked and won't trigger the effect on future changes.\n *\n * For async effects, always use explicit `deps`:\n * @example\n * ```typescript\n * effects: {\n * // BAD: fetchData is async, facts.userId read after await won't be tracked\n * badEffect: {\n * run: async (facts) => {\n * await someAsyncOp();\n * console.log(facts.userId); // NOT tracked!\n * },\n * },\n * // GOOD: explicit deps for async effects\n * goodEffect: {\n * deps: [\"userId\"],\n * run: async (facts) => {\n * await someAsyncOp();\n * console.log(facts.userId); // Works because we declared the dep\n * },\n * },\n * }\n * ```\n */\n\nimport { withTracking } from \"./tracking.js\";\nimport type {\n EffectsDef,\n Facts,\n FactsStore,\n InferSchema,\n Schema,\n} from \"./types.js\";\n\n// ============================================================================\n// Effects Manager\n// ============================================================================\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport interface EffectsManager<_S extends Schema = Schema> {\n /** Run all effects that should trigger based on changes */\n runEffects(changedKeys: Set<string>): Promise<void>;\n /** Run all effects unconditionally */\n runAll(): Promise<void>;\n /** Disable an effect */\n disable(id: string): void;\n /** Enable an effect */\n enable(id: string): void;\n /** Check if an effect is enabled */\n isEnabled(id: string): boolean;\n /** Run all stored cleanup functions (called on system stop/destroy) */\n cleanupAll(): void;\n /** Register new effect definitions (for dynamic module registration) */\n registerDefinitions(newDefs: EffectsDef<Schema>): void;\n}\n\n/** Internal effect state */\ninterface EffectState {\n id: string;\n enabled: boolean;\n hasExplicitDeps: boolean; // true = user-provided deps (fixed), false = auto-tracked (re-track every run)\n dependencies: Set<string> | null; // null = not yet tracked\n cleanup: (() => void) | null; // cleanup function returned by last run()\n}\n\n/** Options for creating an effects manager */\nexport interface CreateEffectsOptions<S extends Schema> {\n definitions: EffectsDef<S>;\n facts: Facts<S>;\n store: FactsStore<S>;\n /** Callback when an effect runs (deps = the fact keys that triggered it) */\n onRun?: (id: string, deps: string[]) => void;\n /** Callback when an effect errors */\n onError?: (id: string, error: unknown) => void;\n}\n\n/**\n * Create a manager for fire-and-forget side effects that run after facts\n * stabilize.\n *\n * Effects support auto-tracked dependencies (re-tracked on every run to\n * capture conditional reads) or explicit `deps` arrays. Each effect can\n * return a cleanup function that runs before the next execution or on\n * system stop. Errors in effects are isolated and never break the\n * reconciliation loop.\n *\n * @param options - Effect definitions, facts proxy, store, and optional lifecycle callbacks\n * @returns An `EffectsManager` with runEffects/runAll/enable/disable/cleanupAll methods\n */\nexport function createEffectsManager<S extends Schema>(\n options: CreateEffectsOptions<S>,\n): EffectsManager<S> {\n const { definitions, facts, store, onRun, onError } = options;\n\n // Internal state for each effect\n const states = new Map<string, EffectState>();\n\n // Previous facts snapshot for comparison (plain object for bracket-style proxy access)\n let previousSnapshot: Record<string, unknown> | null = null;\n\n // Track whether cleanupAll has been called (system stopped/destroyed).\n // If an async effect resolves after stop, its cleanup is invoked immediately.\n let stopped = false;\n\n /** Initialize state for an effect */\n function initState(id: string): EffectState {\n const def = definitions[id];\n if (!def) {\n throw new Error(`[Directive] Unknown effect: ${id}`);\n }\n\n const state: EffectState = {\n id,\n enabled: true,\n hasExplicitDeps: !!def.deps,\n dependencies: def.deps ? new Set(def.deps as string[]) : null,\n cleanup: null,\n };\n\n states.set(id, state);\n return state;\n }\n\n /** Get or create state for an effect */\n function getState(id: string): EffectState {\n return states.get(id) ?? initState(id);\n }\n\n /** Create a plain-object snapshot of current facts.\n * Effects receive `prev` through module-scoped proxies (system.ts) that use\n * bracket-style property access, so the snapshot must be a plain object —\n * NOT a FactsSnapshot (which only exposes .get()/.has()). */\n function createSnapshot(): Record<string, unknown> {\n return store.toObject();\n }\n\n /** Check if an effect should run based on changed keys */\n function shouldRun(id: string, changedKeys: Set<string>): boolean {\n const state = getState(id);\n if (!state.enabled) return false;\n\n // If effect has tracked deps (explicit or auto-tracked), check if any changed\n if (state.dependencies) {\n for (const dep of state.dependencies) {\n if (changedKeys.has(dep)) return true;\n }\n return false;\n }\n\n // No deps yet (first run or auto-tracked with no reads) = run on any change\n return true;\n }\n\n /** Run cleanup for a single effect (safe — catches errors) */\n function runCleanup(state: EffectState): void {\n if (state.cleanup) {\n try {\n state.cleanup();\n } catch (error) {\n onError?.(state.id, error);\n console.error(\n `[Directive] Effect \"${state.id}\" cleanup threw an error:`,\n error,\n );\n }\n state.cleanup = null;\n }\n }\n\n /** Store a cleanup function if the effect returned one */\n function storeCleanup(state: EffectState, result: unknown): void {\n if (typeof result === \"function\") {\n if (stopped) {\n // System already stopped — invoke cleanup immediately so it's not lost\n try {\n (result as () => void)();\n } catch (error) {\n onError?.(state.id, error);\n console.error(\n `[Directive] Effect \"${state.id}\" cleanup threw an error:`,\n error,\n );\n }\n } else {\n state.cleanup = result as () => void;\n }\n }\n }\n\n /** Run a single effect */\n async function runEffect(id: string): Promise<void> {\n const state = getState(id);\n const def = definitions[id];\n\n if (!state.enabled || !def) return;\n\n // Run previous cleanup before re-running\n runCleanup(state);\n\n onRun?.(id, state.dependencies ? [...state.dependencies] : []);\n\n try {\n if (!state.hasExplicitDeps) {\n // Auto-tracked: re-track dependencies on EVERY run so conditional\n // reads are picked up (fixes frozen deps after first run)\n let trackedDeps: Set<string> | null = null;\n let effectPromise: unknown;\n const trackingResult = withTracking(() => {\n store.batch(() => {\n effectPromise = def.run(\n facts,\n previousSnapshot as InferSchema<S> | null,\n );\n });\n return effectPromise;\n });\n trackedDeps = trackingResult.deps;\n\n // If the effect is async, wait for it and capture cleanup\n let result = trackingResult.value;\n if (result instanceof Promise) {\n result = await result;\n }\n storeCleanup(state, result);\n\n // Update tracked dependencies (always replace to catch new conditional reads)\n state.dependencies = trackedDeps.size > 0 ? trackedDeps : null;\n } else {\n // Has explicit deps, batch synchronous mutations and run\n let effectPromise: unknown;\n store.batch(() => {\n effectPromise = def.run(\n facts,\n previousSnapshot as InferSchema<S> | null,\n );\n });\n if (effectPromise instanceof Promise) {\n const result = await effectPromise;\n storeCleanup(state, result);\n } else {\n storeCleanup(state, effectPromise);\n }\n }\n } catch (error) {\n // Effects are fire-and-forget - errors are reported but don't propagate\n onError?.(id, error);\n console.error(`[Directive] Effect \"${id}\" threw an error:`, error);\n }\n }\n\n // Initialize all effect states\n for (const id of Object.keys(definitions)) {\n initState(id);\n }\n\n const manager: EffectsManager<S> = {\n async runEffects(changedKeys: Set<string>): Promise<void> {\n const effectsToRun: string[] = [];\n\n for (const id of Object.keys(definitions)) {\n if (shouldRun(id, changedKeys)) {\n effectsToRun.push(id);\n }\n }\n\n // Run effects in parallel (they're independent)\n await Promise.all(effectsToRun.map(runEffect));\n\n // Update previous snapshot\n previousSnapshot = createSnapshot();\n },\n\n async runAll(): Promise<void> {\n const effectIds = Object.keys(definitions);\n await Promise.all(\n effectIds.map((id) => {\n const state = getState(id);\n if (state.enabled) {\n return runEffect(id);\n }\n return Promise.resolve();\n }),\n );\n\n // Update previous snapshot\n previousSnapshot = createSnapshot();\n },\n\n disable(id: string): void {\n const state = getState(id);\n state.enabled = false;\n },\n\n enable(id: string): void {\n const state = getState(id);\n state.enabled = true;\n },\n\n isEnabled(id: string): boolean {\n return getState(id).enabled;\n },\n\n cleanupAll(): void {\n stopped = true;\n for (const state of states.values()) {\n runCleanup(state);\n }\n },\n\n registerDefinitions(newDefs: EffectsDef<S>): void {\n for (const [key, def] of Object.entries(newDefs)) {\n (definitions as Record<string, unknown>)[key] = def;\n initState(key);\n }\n },\n };\n\n return manager;\n}\n","/**\n * Error Types - Type definitions for error handling\n */\n\n// ============================================================================\n// Error Types\n// ============================================================================\n\n/** Error source types */\nexport type ErrorSource =\n | \"constraint\"\n | \"resolver\"\n | \"effect\"\n | \"derivation\"\n | \"system\";\n\n/**\n * Extended Error class with source tracking, recovery metadata, and\n * arbitrary context for structured error handling within Directive.\n *\n * Thrown or returned by the error boundary manager. The `source` and\n * `sourceId` fields identify where the error originated, and `recoverable`\n * indicates whether the engine can apply a recovery strategy.\n *\n * @param message - Human-readable error description\n * @param source - Which subsystem produced the error (`\"constraint\"`, `\"resolver\"`, `\"effect\"`, `\"derivation\"`, or `\"system\"`)\n * @param sourceId - The ID of the specific constraint, resolver, effect, or derivation that failed\n * @param context - Optional arbitrary data for debugging (e.g., the requirement that triggered a resolver error)\n * @param recoverable - Whether the error boundary can apply a recovery strategy (default `true`; `false` for system errors)\n *\n * @example\n * ```ts\n * try {\n * await system.settle();\n * } catch (err) {\n * if (err instanceof DirectiveError) {\n * console.log(err.source); // \"resolver\"\n * console.log(err.sourceId); // \"fetchUser\"\n * console.log(err.recoverable); // true\n * }\n * }\n * ```\n */\nexport class DirectiveError extends Error {\n constructor(\n message: string,\n public readonly source: ErrorSource,\n public readonly sourceId: string,\n public readonly context?: unknown,\n public readonly recoverable: boolean = true,\n ) {\n super(message);\n this.name = \"DirectiveError\";\n }\n}\n\n/** Recovery strategy for errors */\nexport type RecoveryStrategy =\n | \"skip\"\n | \"retry\"\n | \"retry-later\"\n | \"disable\"\n | \"throw\";\n\n/**\n * Configuration for retry-later strategy.\n * When an error occurs, the system will wait for `delayMs` before retrying.\n */\nexport interface RetryLaterConfig {\n /** Delay in milliseconds before retrying (default: 1000) */\n delayMs?: number;\n /** Maximum retries before giving up (default: 3) */\n maxRetries?: number;\n /** Backoff multiplier for each retry (default: 2) */\n backoffMultiplier?: number;\n /** Maximum delay in milliseconds (default: 30000) */\n maxDelayMs?: number;\n}\n\n/** Error boundary configuration */\nexport interface ErrorBoundaryConfig {\n onConstraintError?:\n | RecoveryStrategy\n | ((error: Error, constraint: string) => RecoveryStrategy | void);\n onResolverError?:\n | RecoveryStrategy\n | ((error: Error, resolver: string) => RecoveryStrategy | void);\n onEffectError?:\n | RecoveryStrategy\n | ((error: Error, effect: string) => RecoveryStrategy | void);\n onDerivationError?:\n | RecoveryStrategy\n | ((error: Error, derivation: string) => RecoveryStrategy | void);\n onError?: (error: DirectiveError) => void;\n\n /** Configuration for retry-later strategy */\n retryLater?: RetryLaterConfig;\n}\n","/**\n * Error Boundaries - Configurable error handling and recovery\n *\n * Features:\n * - Catch errors in constraints/resolvers/effects/derivations\n * - Configurable recovery strategies (skip, retry, retry-later, disable, throw)\n * - Circuit breaker pattern for automatic failure protection\n * - Error reporting to plugins\n */\n\nimport {\n DirectiveError,\n type ErrorBoundaryConfig,\n type ErrorSource,\n type RecoveryStrategy,\n type RetryLaterConfig,\n} from \"./types.js\";\n\n// ============================================================================\n// Retry-Later Queue\n// ============================================================================\n\n/**\n * Pending retry entry.\n */\nexport interface PendingRetry {\n source: ErrorSource;\n sourceId: string;\n context: unknown;\n attempt: number;\n nextRetryTime: number;\n callback?: () => void;\n}\n\n/**\n * Create a manager for deferred retry scheduling with exponential backoff.\n *\n * Retries are stored in a Map keyed by source ID. Each retry tracks its\n * attempt number and next retry time. When `processDueRetries()` is called\n * (typically during reconciliation), entries whose time has elapsed are\n * returned and removed from the queue.\n *\n * @param config - Backoff configuration: `delayMs`, `maxRetries`, `backoffMultiplier`, `maxDelayMs`\n * @returns A manager with `scheduleRetry`, `getPendingRetries`, `processDueRetries`, `cancelRetry`, and `clearAll` methods\n */\nexport function createRetryLaterManager(config: RetryLaterConfig = {}): {\n /** Schedule a retry */\n scheduleRetry: (\n source: ErrorSource,\n sourceId: string,\n context: unknown,\n attempt: number,\n callback?: () => void,\n ) => PendingRetry | null;\n /** Get pending retries */\n getPendingRetries: () => PendingRetry[];\n /** Process due retries */\n processDueRetries: () => PendingRetry[];\n /** Cancel a retry */\n cancelRetry: (sourceId: string) => void;\n /** Clear all pending retries */\n clearAll: () => void;\n} {\n const {\n delayMs = 1000,\n maxRetries = 3,\n backoffMultiplier = 2,\n maxDelayMs = 30000,\n } = config;\n\n const pendingRetries: Map<string, PendingRetry> = new Map();\n\n function calculateDelay(attempt: number): number {\n const delay = delayMs * Math.pow(backoffMultiplier, attempt - 1);\n return Math.min(delay, maxDelayMs);\n }\n\n return {\n scheduleRetry(\n source: ErrorSource,\n sourceId: string,\n context: unknown,\n attempt: number,\n callback?: () => void,\n ): PendingRetry | null {\n // Check if max retries exceeded\n if (attempt > maxRetries) {\n return null;\n }\n\n const delay = calculateDelay(attempt);\n const entry: PendingRetry = {\n source,\n sourceId,\n context,\n attempt,\n nextRetryTime: Date.now() + delay,\n callback,\n };\n\n pendingRetries.set(sourceId, entry);\n return entry;\n },\n\n getPendingRetries(): PendingRetry[] {\n return Array.from(pendingRetries.values());\n },\n\n processDueRetries(): PendingRetry[] {\n const now = Date.now();\n const dueRetries: PendingRetry[] = [];\n\n for (const [sourceId, entry] of pendingRetries) {\n if (entry.nextRetryTime <= now) {\n dueRetries.push(entry);\n pendingRetries.delete(sourceId);\n }\n }\n\n return dueRetries;\n },\n\n cancelRetry(sourceId: string): void {\n pendingRetries.delete(sourceId);\n },\n\n clearAll(): void {\n pendingRetries.clear();\n },\n };\n}\n\n// ============================================================================\n// Error Boundary Manager\n// ============================================================================\n\nexport interface ErrorBoundaryManager {\n /** Handle an error from a specific source */\n handleError(\n source: ErrorSource,\n sourceId: string,\n error: unknown,\n context?: unknown,\n ): RecoveryStrategy;\n /** Get the last error */\n getLastError(): DirectiveError | null;\n /** Get all errors */\n getAllErrors(): DirectiveError[];\n /** Clear all errors */\n clearErrors(): void;\n /** Get retry-later manager */\n getRetryLaterManager(): ReturnType<typeof createRetryLaterManager>;\n /** Process due retries (call periodically or on reconcile) */\n processDueRetries(): PendingRetry[];\n /** Clear retry attempts for a source ID (call on success) */\n clearRetryAttempts(sourceId: string): void;\n}\n\n/** Options for creating an error boundary manager */\nexport interface CreateErrorBoundaryOptions {\n config?: ErrorBoundaryConfig;\n /** Callback when an error occurs */\n onError?: (error: DirectiveError) => void;\n /** Callback when recovery is attempted */\n onRecovery?: (error: DirectiveError, strategy: RecoveryStrategy) => void;\n}\n\n/** Default recovery strategies by source */\nconst DEFAULT_STRATEGIES: Record<ErrorSource, RecoveryStrategy> = {\n constraint: \"skip\",\n resolver: \"skip\",\n effect: \"skip\",\n derivation: \"skip\",\n system: \"throw\",\n};\n\n/**\n * Create a manager that handles errors from constraints, resolvers, effects,\n * and derivations with configurable per-source recovery strategies.\n *\n * Supported strategies: `\"skip\"` (ignore), `\"retry\"` (immediate),\n * `\"retry-later\"` (deferred with backoff), `\"disable\"` (turn off source),\n * and `\"throw\"` (re-throw). Recent errors are kept in a ring buffer\n * (last 100) for inspection. The retry-later strategy delegates to an\n * internal {@link createRetryLaterManager}.\n *\n * @param options - Error boundary configuration, plus `onError` and `onRecovery` callbacks for plugin integration\n * @returns An `ErrorBoundaryManager` with handleError/getLastError/getAllErrors/clearErrors/processDueRetries methods\n *\n * @example\n * ```ts\n * const boundary = createErrorBoundaryManager({\n * config: {\n * onResolverError: \"retry-later\",\n * onEffectError: \"skip\",\n * retryLater: { maxRetries: 5, delayMs: 500 },\n * },\n * onError: (err) => console.error(err.source, err.message),\n * });\n *\n * const strategy = boundary.handleError(\"resolver\", \"fetchUser\", new Error(\"timeout\"));\n * // strategy === \"retry-later\"\n * ```\n */\nexport function createErrorBoundaryManager(\n options: CreateErrorBoundaryOptions = {},\n): ErrorBoundaryManager {\n const { config = {}, onError, onRecovery } = options;\n\n // Store errors for inspection\n const errors: DirectiveError[] = [];\n const maxErrors = 100; // Keep last 100 errors\n\n // Retry-later manager\n const retryLaterManager = createRetryLaterManager(config.retryLater);\n\n // Track retry attempts per source ID\n const retryAttempts = new Map<string, number>();\n\n /** Convert unknown error to DirectiveError */\n function toDirectiveError(\n source: ErrorSource,\n sourceId: string,\n error: unknown,\n context?: unknown,\n ): DirectiveError {\n if (error instanceof DirectiveError) {\n return error;\n }\n\n const message = error instanceof Error ? error.message : String(error);\n const recoverable = source !== \"system\";\n\n return new DirectiveError(message, source, sourceId, context, recoverable);\n }\n\n /** Get recovery strategy for a source */\n function getStrategy(\n source: ErrorSource,\n sourceId: string,\n error: Error,\n ): RecoveryStrategy {\n // Get configured handler\n const handler = (() => {\n switch (source) {\n case \"constraint\":\n return config.onConstraintError;\n case \"resolver\":\n return config.onResolverError;\n case \"effect\":\n return config.onEffectError;\n case \"derivation\":\n return config.onDerivationError;\n default:\n return undefined;\n }\n })();\n\n // If handler is a function, call it — use returned strategy if provided, else \"skip\"\n if (typeof handler === \"function\") {\n try {\n const result = handler(error, sourceId);\n\n if (typeof result === \"string\") {\n return result as RecoveryStrategy;\n }\n } catch (e) {\n console.error(\"[Directive] Error in error handler callback:\", e);\n }\n\n return \"skip\";\n }\n\n // If handler is a strategy string, return it\n if (typeof handler === \"string\") {\n return handler;\n }\n\n // Return default strategy\n return DEFAULT_STRATEGIES[source];\n }\n\n const manager: ErrorBoundaryManager = {\n handleError(\n source: ErrorSource,\n sourceId: string,\n error: unknown,\n context?: unknown,\n ): RecoveryStrategy {\n const directiveError = toDirectiveError(source, sourceId, error, context);\n\n // Store error\n errors.push(directiveError);\n if (errors.length > maxErrors) {\n errors.shift();\n }\n\n // Notify callbacks (wrapped to prevent bypassing recovery)\n try {\n onError?.(directiveError);\n } catch (e) {\n console.error(\"[Directive] Error in onError callback:\", e);\n }\n try {\n config.onError?.(directiveError);\n } catch (e) {\n console.error(\"[Directive] Error in config.onError callback:\", e);\n }\n\n // Get recovery strategy\n let strategy = getStrategy(\n source,\n sourceId,\n error instanceof Error ? error : new Error(String(error)),\n );\n\n // Handle retry-later strategy\n if (strategy === \"retry-later\") {\n const attempt = (retryAttempts.get(sourceId) ?? 0) + 1;\n retryAttempts.set(sourceId, attempt);\n\n const scheduled = retryLaterManager.scheduleRetry(\n source,\n sourceId,\n context,\n attempt,\n );\n\n if (!scheduled) {\n // Max retries exceeded, fall back to skip\n strategy = \"skip\";\n retryAttempts.delete(sourceId);\n\n if (\n typeof process !== \"undefined\" &&\n process.env?.NODE_ENV !== \"production\"\n ) {\n console.warn(\n `[Directive] ${source} \"${sourceId}\" exceeded max retry-later attempts. Skipping.`,\n );\n }\n }\n }\n\n // Notify recovery callback\n try {\n onRecovery?.(directiveError, strategy);\n } catch (e) {\n console.error(\"[Directive] Error in onRecovery callback:\", e);\n }\n\n // If strategy is throw, re-throw the error\n if (strategy === \"throw\") {\n throw directiveError;\n }\n\n return strategy;\n },\n\n getLastError(): DirectiveError | null {\n return errors[errors.length - 1] ?? null;\n },\n\n getAllErrors(): DirectiveError[] {\n return [...errors];\n },\n\n clearErrors(): void {\n errors.length = 0;\n },\n\n getRetryLaterManager() {\n return retryLaterManager;\n },\n\n processDueRetries(): PendingRetry[] {\n return retryLaterManager.processDueRetries();\n },\n\n clearRetryAttempts(sourceId: string): void {\n retryAttempts.delete(sourceId);\n retryLaterManager.cancelRetry(sourceId);\n },\n };\n\n return manager;\n}\n","/**\n * Facts Store - Proxy-based reactive state with auto-tracking\n *\n * Features:\n * - Proxy-based access (facts.phase instead of facts.get(\"phase\"))\n * - Automatic dependency tracking via tracking context\n * - Batched updates with coalesced notifications\n * - Granular subscriptions by key\n * - Schema validation in development mode\n */\n\nimport { trackAccess, withoutTracking } from \"./tracking.js\";\nimport type {\n Facts,\n FactsSnapshot,\n FactsStore,\n InferSchema,\n Schema,\n SchemaType,\n} from \"./types.js\";\n\n// ============================================================================\n// Schema Type Builders\n// ============================================================================\n\n/** Brand symbol for branded types */\ndeclare const Brand: unique symbol;\n\n/** Branded type - adds a unique brand to a base type */\nexport type Branded<T, B extends string> = T & { readonly [Brand]: B };\n\n/** Extended SchemaType with type name for better error messages */\nexport interface ExtendedSchemaType<T> extends SchemaType<T> {\n readonly _typeName?: string;\n readonly _default?: T | (() => T);\n readonly _transform?: (value: unknown) => T;\n readonly _description?: string;\n readonly _refinements?: Array<{\n predicate: (value: T) => boolean;\n message: string;\n }>;\n /** Mutable - set by array validators to indicate which element failed */\n _lastFailedIndex?: number;\n}\n\n/** Safely stringify a value for error messages */\nfunction safeStringify(value: unknown, maxLength = 100): string {\n try {\n return JSON.stringify(value)?.slice(0, maxLength) ?? String(value);\n } catch {\n return \"[circular or non-serializable]\";\n }\n}\n\n/** Create a schema type builder with optional type name */\nfunction createSchemaType<T>(\n validators: Array<(v: T) => boolean> = [],\n typeName?: string,\n defaultValue?: T | (() => T),\n transform?: (value: unknown) => T,\n description?: string,\n refinements?: Array<{ predicate: (value: T) => boolean; message: string }>,\n): ExtendedSchemaType<T> {\n return {\n _type: undefined as unknown as T,\n _validators: validators,\n _typeName: typeName,\n _default: defaultValue,\n _transform: transform,\n _description: description,\n _refinements: refinements,\n validate(fn: (value: T) => boolean) {\n return createSchemaType(\n [...validators, fn],\n typeName,\n defaultValue,\n transform,\n description,\n refinements,\n );\n },\n };\n}\n\n/** Chainable schema type with all common methods */\nexport interface ChainableSchemaType<T> extends ExtendedSchemaType<T> {\n default(value: T | (() => T)): ChainableSchemaType<T>;\n transform<U>(fn: (value: T) => U): ChainableSchemaType<U>;\n brand<B extends string>(): ChainableSchemaType<Branded<T, B>>;\n describe(description: string): ChainableSchemaType<T>;\n refine(\n predicate: (value: T) => boolean,\n message: string,\n ): ChainableSchemaType<T>;\n nullable(): ChainableSchemaType<T | null>;\n optional(): ChainableSchemaType<T | undefined>;\n}\n\n/** Create a chainable schema type with common methods */\nfunction createChainableType<T>(\n validators: Array<(v: T) => boolean>,\n typeName: string,\n defaultValue?: T | (() => T),\n transform?: (value: unknown) => T,\n description?: string,\n refinements?: Array<{ predicate: (value: T) => boolean; message: string }>,\n): ChainableSchemaType<T> {\n const base = createSchemaType<T>(\n validators,\n typeName,\n defaultValue,\n transform,\n description,\n refinements,\n );\n return {\n ...base,\n default(value: T | (() => T)) {\n return createChainableType(\n validators,\n typeName,\n value,\n transform,\n description,\n refinements,\n );\n },\n transform<U>(fn: (value: T) => U) {\n const newTransform = (v: unknown) => {\n const intermediate = transform ? transform(v) : (v as T);\n return fn(intermediate);\n };\n return createChainableType<U>(\n [],\n typeName,\n undefined,\n newTransform as (v: unknown) => U,\n description,\n );\n },\n brand<B extends string>() {\n return createChainableType<Branded<T, B>>(\n validators as Array<(v: Branded<T, B>) => boolean>,\n `Branded<${typeName}>`,\n defaultValue as Branded<T, B> | (() => Branded<T, B>),\n transform as (value: unknown) => Branded<T, B>,\n description,\n refinements as Array<{\n predicate: (value: Branded<T, B>) => boolean;\n message: string;\n }>,\n );\n },\n describe(desc: string) {\n return createChainableType(\n validators,\n typeName,\n defaultValue,\n transform,\n desc,\n refinements,\n );\n },\n refine(predicate: (value: T) => boolean, message: string) {\n const newRefinements = [...(refinements ?? []), { predicate, message }];\n return createChainableType(\n [...validators, predicate],\n typeName,\n defaultValue,\n transform,\n description,\n newRefinements,\n );\n },\n nullable() {\n return createChainableType<T | null>(\n [\n (v): v is T | null =>\n v === null || validators.every((fn) => fn(v as T)),\n ],\n `${typeName} | null`,\n defaultValue as (T | null) | (() => T | null),\n transform as (value: unknown) => T | null,\n description,\n );\n },\n optional() {\n return createChainableType<T | undefined>(\n [\n (v): v is T | undefined =>\n v === undefined || validators.every((fn) => fn(v as T)),\n ],\n `${typeName} | undefined`,\n defaultValue as (T | undefined) | (() => T | undefined),\n transform as (value: unknown) => T | undefined,\n description,\n );\n },\n };\n}\n\n/**\n * Schema type builders for defining fact types.\n *\n * @example\n * ```typescript\n * const module = createModule(\"example\", {\n * schema: {\n * name: t.string(),\n * age: t.number().min(0).max(150),\n * active: t.boolean(),\n * tags: t.array<string>().of(t.string()),\n * user: t.object<{ id: string; email: string }>(),\n * },\n * });\n * ```\n */\nexport const t = {\n /**\n * Create a string schema type.\n *\n * @example\n * ```typescript\n * // Basic string\n * schema: { name: t.string() }\n *\n * // String literal union (for type safety)\n * schema: { phase: t.string<\"red\" | \"green\" | \"yellow\">() }\n *\n * // With custom validation\n * schema: { email: t.string().validate(s => s.includes(\"@\")) }\n *\n * // With transform\n * schema: { trimmed: t.string().transform(s => s.trim()) }\n *\n * // With brand\n * schema: { userId: t.string().brand<\"UserId\">() }\n * ```\n */\n string<T extends string = string>() {\n return createChainableType<T>(\n [(v): v is T => typeof v === \"string\"],\n \"string\",\n ) as ChainableSchemaType<T>;\n },\n\n /**\n * Create a number schema type with optional min/max constraints.\n *\n * @example\n * ```typescript\n * // Basic number\n * schema: { count: t.number() }\n *\n * // With range constraints\n * schema: { age: t.number().min(0).max(150) }\n *\n * // With custom validation\n * schema: { even: t.number().validate(n => n % 2 === 0) }\n *\n * // With default\n * schema: { count: t.number().default(0) }\n *\n * // With transform (from string)\n * schema: { age: t.number().transform(v => parseInt(String(v), 10)) }\n * ```\n */\n number() {\n type ChainableNumber = ChainableSchemaType<number> & {\n min(n: number): ChainableNumber;\n max(n: number): ChainableNumber;\n };\n\n const createChainableNumber = (\n validators: Array<(v: number) => boolean>,\n defaultValue?: number | (() => number),\n transform?: (value: unknown) => number,\n description?: string,\n refinements?: Array<{\n predicate: (value: number) => boolean;\n message: string;\n }>,\n ): ChainableNumber => {\n const chainable = createChainableType<number>(\n validators,\n \"number\",\n defaultValue,\n transform,\n description,\n refinements,\n );\n return {\n ...chainable,\n min(n: number) {\n return createChainableNumber(\n [...validators, (v) => v >= n],\n defaultValue,\n transform,\n description,\n refinements,\n );\n },\n max(n: number) {\n return createChainableNumber(\n [...validators, (v) => v <= n],\n defaultValue,\n transform,\n description,\n refinements,\n );\n },\n default(value: number | (() => number)) {\n return createChainableNumber(\n validators,\n value,\n transform,\n description,\n refinements,\n );\n },\n describe(desc: string) {\n return createChainableNumber(\n validators,\n defaultValue,\n transform,\n desc,\n refinements,\n );\n },\n refine(predicate: (value: number) => boolean, message: string) {\n const newRefinements = [\n ...(refinements ?? []),\n { predicate, message },\n ];\n return createChainableNumber(\n [...validators, predicate],\n defaultValue,\n transform,\n description,\n newRefinements,\n );\n },\n };\n };\n return createChainableNumber([(v) => typeof v === \"number\"]);\n },\n\n /**\n * Create a boolean schema type.\n *\n * @example\n * ```typescript\n * schema: {\n * active: t.boolean(),\n * verified: t.boolean().default(false),\n * }\n * ```\n */\n boolean() {\n return createChainableType<boolean>(\n [(v) => typeof v === \"boolean\"],\n \"boolean\",\n );\n },\n\n /**\n * Create an array schema type.\n * Can be used with or without element validation:\n * - `t.array<string>()` - Type-only, no element validation\n * - `t.array<string>().of(t.string())` - With element validation\n */\n array<T>() {\n type ChainableArray = ChainableSchemaType<T[]> & {\n of(elementType: SchemaType<T>): ChainableArray;\n nonEmpty(): ChainableArray;\n maxLength(n: number): ChainableArray;\n minLength(n: number): ChainableArray;\n _lastFailedIndex?: number;\n };\n\n const createChainableArray = (\n validators: Array<(v: T[]) => boolean>,\n elementType?: SchemaType<T>,\n defaultValue?: T[] | (() => T[]),\n description?: string,\n indexRef?: { value: number },\n ): ChainableArray => {\n const chainable = createChainableType<T[]>(\n validators,\n \"array\",\n defaultValue,\n undefined,\n description,\n );\n // Use ref for storing failed index (shared with validator closure)\n const ref = indexRef ?? { value: -1 };\n const result: ChainableArray = {\n ...chainable,\n get _lastFailedIndex() {\n return ref.value;\n },\n set _lastFailedIndex(v: number) {\n ref.value = v;\n },\n of(et: SchemaType<T>) {\n // Create a new ref for this chain\n const newRef = { value: -1 };\n return createChainableArray(\n [\n ...validators,\n (v) => {\n for (let i = 0; i < v.length; i++) {\n const item = v[i];\n if (!et._validators.every((validator) => validator(item))) {\n newRef.value = i;\n return false;\n }\n }\n return true;\n },\n ],\n et,\n defaultValue,\n description,\n newRef,\n );\n },\n nonEmpty() {\n return createChainableArray(\n [...validators, (v) => v.length > 0],\n elementType,\n defaultValue,\n description,\n ref,\n );\n },\n maxLength(n: number) {\n return createChainableArray(\n [...validators, (v) => v.length <= n],\n elementType,\n defaultValue,\n description,\n ref,\n );\n },\n minLength(n: number) {\n return createChainableArray(\n [...validators, (v) => v.length >= n],\n elementType,\n defaultValue,\n description,\n ref,\n );\n },\n default(value: T[] | (() => T[])) {\n return createChainableArray(\n validators,\n elementType,\n value,\n description,\n ref,\n );\n },\n describe(desc: string) {\n return createChainableArray(\n validators,\n elementType,\n defaultValue,\n desc,\n ref,\n );\n },\n };\n return result;\n };\n return createChainableArray([(v) => Array.isArray(v)]);\n },\n\n /**\n * Create an object schema type.\n * Can be used with or without shape validation:\n * - `t.object<User>()` - Type-only, no property validation\n * - `t.object<User>().shape({ name: t.string(), age: t.number() })` - With property validation\n */\n object<T extends Record<string, unknown>>() {\n type ChainableObject = ChainableSchemaType<T> & {\n shape(schema: { [K in keyof T]?: SchemaType<T[K]> }): ChainableObject;\n nonNull(): ChainableObject;\n hasKeys(...keys: string[]): ChainableObject;\n };\n\n const createChainableObject = (\n validators: Array<(v: T) => boolean>,\n defaultValue?: T | (() => T),\n description?: string,\n ): ChainableObject => {\n const chainable = createChainableType<T>(\n validators,\n \"object\",\n defaultValue,\n undefined,\n description,\n );\n return {\n ...chainable,\n shape(shapeSchema: { [K in keyof T]?: SchemaType<T[K]> }) {\n return createChainableObject(\n [\n ...validators,\n (v) => {\n for (const [key, schemaType] of Object.entries(shapeSchema)) {\n const value = (v as Record<string, unknown>)[key];\n const schemaT = schemaType as SchemaType<unknown>;\n if (\n schemaT &&\n !schemaT._validators.every((validator) => validator(value))\n ) {\n return false;\n }\n }\n return true;\n },\n ],\n defaultValue,\n description,\n );\n },\n nonNull() {\n return createChainableObject(\n [...validators, (v) => v !== null && v !== undefined],\n defaultValue,\n description,\n );\n },\n hasKeys(...keys: string[]) {\n return createChainableObject(\n [\n ...validators,\n (v) => keys.every((k) => k in (v as Record<string, unknown>)),\n ],\n defaultValue,\n description,\n );\n },\n default(value: T | (() => T)) {\n return createChainableObject(validators, value, description);\n },\n describe(desc: string) {\n return createChainableObject(validators, defaultValue, desc);\n },\n };\n };\n return createChainableObject([\n (v) => typeof v === \"object\" && v !== null && !Array.isArray(v),\n ]);\n },\n\n /**\n * Create an enum schema type for string literal unions.\n *\n * @example\n * ```typescript\n * // Define allowed values\n * schema: { status: t.enum(\"idle\", \"loading\", \"success\", \"error\") }\n *\n * // Type is inferred as \"idle\" | \"loading\" | \"success\" | \"error\"\n * ```\n */\n enum<T extends string>(...values: T[]) {\n if (process.env.NODE_ENV !== \"production\" && values.length === 0) {\n console.warn(\n \"[Directive] t.enum() called with no values - this will reject all strings\",\n );\n }\n const valueSet = new Set(values);\n return createChainableType<T>(\n [(v): v is T => typeof v === \"string\" && valueSet.has(v as T)],\n `enum(${values.join(\"|\")})`,\n );\n },\n\n /**\n * Create a literal schema type for exact value matching.\n *\n * @example\n * ```typescript\n * // Exact string match\n * schema: { type: t.literal(\"user\") }\n *\n * // Exact number match\n * schema: { version: t.literal(1) }\n *\n * // Exact boolean\n * schema: { enabled: t.literal(true) }\n * ```\n */\n literal<T extends string | number | boolean>(value: T) {\n return createChainableType<T>(\n [(v): v is T => v === value],\n `literal(${String(value)})`,\n );\n },\n\n /**\n * Create a nullable schema type (T | null).\n *\n * @example\n * ```typescript\n * // Nullable string\n * schema: { name: t.nullable(t.string()) }\n *\n * // Nullable object\n * schema: { user: t.nullable(t.object<User>()) }\n * ```\n */\n nullable<T>(innerType: SchemaType<T>) {\n const innerTypeName =\n (innerType as ExtendedSchemaType<T>)._typeName ?? \"unknown\";\n return createSchemaType<T | null>(\n [\n (v): v is T | null => {\n if (v === null) return true;\n return innerType._validators.every((validator) => validator(v as T));\n },\n ],\n `${innerTypeName} | null`,\n ) as SchemaType<T | null>;\n },\n\n /**\n * Create an optional schema type (T | undefined).\n *\n * @example\n * ```typescript\n * // Optional string\n * schema: { nickname: t.optional(t.string()) }\n *\n * // Optional number\n * schema: { age: t.optional(t.number()) }\n * ```\n */\n optional<T>(innerType: SchemaType<T>) {\n const innerTypeName =\n (innerType as ExtendedSchemaType<T>)._typeName ?? \"unknown\";\n return createSchemaType<T | undefined>(\n [\n (v): v is T | undefined => {\n if (v === undefined) return true;\n return innerType._validators.every((validator) => validator(v as T));\n },\n ],\n `${innerTypeName} | undefined`,\n ) as SchemaType<T | undefined>;\n },\n\n /**\n * Create a union schema type.\n *\n * @example\n * ```typescript\n * // String or number\n * schema: { value: t.union(t.string(), t.number()) }\n *\n * // Multiple types\n * schema: { data: t.union(t.string(), t.number(), t.boolean()) }\n * ```\n */\n union<T extends SchemaType<unknown>[]>(...types: T) {\n if (process.env.NODE_ENV !== \"production\" && types.length === 0) {\n console.warn(\n \"[Directive] t.union() called with no types - this will reject all values\",\n );\n }\n type UnionType = T[number] extends SchemaType<infer U> ? U : never;\n const typeNames = types.map(\n (schemaType) =>\n (schemaType as ExtendedSchemaType<unknown>)._typeName ?? \"unknown\",\n );\n return createChainableType<UnionType>(\n [\n (v): v is UnionType =>\n types.some((schemaType) =>\n schemaType._validators.every((fn) => fn(v)),\n ),\n ],\n typeNames.join(\" | \"),\n );\n },\n\n /**\n * Create a record schema type for dynamic key-value maps.\n *\n * @example\n * ```typescript\n * // Record with string values\n * schema: { metadata: t.record(t.string()) }\n *\n * // Record with number values\n * schema: { scores: t.record(t.number()) }\n * ```\n */\n record<V>(valueType: SchemaType<V>) {\n const valueTypeName =\n (valueType as ExtendedSchemaType<V>)._typeName ?? \"unknown\";\n return createChainableType<Record<string, V>>(\n [\n (v): v is Record<string, V> => {\n if (typeof v !== \"object\" || v === null || Array.isArray(v))\n return false;\n return Object.values(v).every((val) =>\n valueType._validators.every((validator) => validator(val)),\n );\n },\n ],\n `Record<string, ${valueTypeName}>`,\n );\n },\n\n /**\n * Create a tuple schema type for fixed-length arrays with specific types.\n *\n * @example\n * ```typescript\n * // [string, number] tuple\n * schema: { coord: t.tuple(t.string(), t.number()) }\n *\n * // [x, y, z] coordinates\n * schema: { position: t.tuple(t.number(), t.number(), t.number()) }\n * ```\n */\n tuple<T extends SchemaType<unknown>[]>(...types: T) {\n if (process.env.NODE_ENV !== \"production\" && types.length === 0) {\n console.warn(\n \"[Directive] t.tuple() called with no types - this will only accept empty arrays\",\n );\n }\n type TupleType = {\n [K in keyof T]: T[K] extends SchemaType<infer U> ? U : never;\n };\n const typeNames = types.map(\n (schemaType) =>\n (schemaType as ExtendedSchemaType<unknown>)._typeName ?? \"unknown\",\n );\n return createChainableType<TupleType>(\n [\n (v): v is TupleType => {\n if (!Array.isArray(v) || v.length !== types.length) return false;\n return types.every((schemaType, i) =>\n schemaType._validators.every((validator) => validator(v[i])),\n );\n },\n ],\n `[${typeNames.join(\", \")}]`,\n );\n },\n\n /**\n * Create a date schema type.\n *\n * @example\n * ```typescript\n * schema: { createdAt: t.date() }\n * ```\n */\n date() {\n return createChainableType<Date>(\n [(v): v is Date => v instanceof Date && !Number.isNaN(v.getTime())],\n \"Date\",\n );\n },\n\n /**\n * Create a UUID schema type.\n *\n * @example\n * ```typescript\n * schema: { id: t.uuid() }\n * ```\n */\n uuid() {\n const uuidRegex =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n return createChainableType<string>(\n [(v): v is string => typeof v === \"string\" && uuidRegex.test(v)],\n \"uuid\",\n );\n },\n\n /**\n * Create an email schema type.\n *\n * @example\n * ```typescript\n * schema: { email: t.email() }\n * ```\n */\n email() {\n // Simple email regex - for comprehensive validation use Zod\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return createChainableType<string>(\n [(v): v is string => typeof v === \"string\" && emailRegex.test(v)],\n \"email\",\n );\n },\n\n /**\n * Create a URL schema type.\n *\n * @example\n * ```typescript\n * schema: { website: t.url() }\n * ```\n */\n url() {\n return createChainableType<string>(\n [\n (v): v is string => {\n if (typeof v !== \"string\") return false;\n try {\n new URL(v);\n return true;\n } catch {\n return false;\n }\n },\n ],\n \"url\",\n );\n },\n\n /**\n * Create a bigint schema type.\n *\n * @example\n * ```typescript\n * schema: { largeNumber: t.bigint() }\n * ```\n */\n bigint() {\n return createChainableType<bigint>(\n [(v): v is bigint => typeof v === \"bigint\"],\n \"bigint\",\n );\n },\n};\n\n// ============================================================================\n// Facts Store Implementation\n// ============================================================================\n\n/** Options for creating a facts store */\nexport interface CreateFactsStoreOptions<S extends Schema> {\n schema: S;\n /** Validate values against schema (default: process.env.NODE_ENV !== 'production') */\n validate?: boolean;\n /** Throw on unknown schema keys (default: true in dev mode) */\n strictKeys?: boolean;\n /** Redact sensitive values in error messages */\n redactErrors?: boolean;\n /** Callback when facts change (for plugin hooks) */\n onChange?: (key: string, value: unknown, prev: unknown) => void;\n /** Callback for batch changes */\n onBatch?: (\n changes: Array<{\n key: string;\n value: unknown;\n prev: unknown;\n type: \"set\" | \"delete\";\n }>,\n ) => void;\n}\n\n/**\n * Create a reactive facts store backed by a Map with schema validation,\n * batched mutations, and granular key-level subscriptions.\n *\n * The store is the low-level primitive that powers the `facts` proxy.\n * Most users should use {@link createFacts} or `createModule` instead.\n *\n * @param options - Store configuration including schema, validation settings, and change callbacks\n * @returns A `FactsStore<S>` with get/set/batch/subscribe methods and automatic schema validation\n *\n * @example\n * ```ts\n * const store = createFactsStore({\n * schema: { count: t.number(), name: t.string() },\n * });\n *\n * store.set(\"count\", 1);\n * store.get(\"count\"); // 1\n *\n * store.batch(() => {\n * store.set(\"count\", 2);\n * store.set(\"name\", \"hello\");\n * }); // listeners fire once after batch completes\n * ```\n */\nexport function createFactsStore<S extends Schema>(\n options: CreateFactsStoreOptions<S>,\n): FactsStore<S> {\n const { schema, onChange, onBatch } = options;\n\n // Detect if this is a type assertion schema (empty object with no keys)\n const schemaKeys = Object.keys(schema);\n const isTypeAssertionSchema = schemaKeys.length === 0;\n\n // Default strictKeys to false for type assertion schemas (they have no runtime keys)\n const validate = options.validate ?? process.env.NODE_ENV !== \"production\";\n const strictKeys =\n options.strictKeys ??\n (process.env.NODE_ENV !== \"production\" && !isTypeAssertionSchema);\n const redactErrors = options.redactErrors ?? false;\n\n const map = new Map<string, unknown>();\n const knownKeys = new Set<string>(); // Track all keys that have been set\n const keyListeners = new Map<string, Set<() => void>>();\n const allListeners = new Set<() => void>();\n\n let batching = 0;\n const batchChanges: Array<{\n key: string;\n value: unknown;\n prev: unknown;\n type: \"set\" | \"delete\";\n }> = [];\n const dirtyKeys = new Set<string>();\n\n // Notification coalescing: when notifyKey/notifyAll fires a listener that\n // calls store.set(), defer the new notification until the current cycle completes.\n let isNotifying = false;\n const pendingNonBatchedChanges: Array<{\n key: string;\n value: unknown;\n prev: unknown;\n }> = [];\n const MAX_NOTIFY_ITERATIONS = 100;\n\n /** Check if a value is a Zod schema (robust detection) */\n function isZodSchema(v: unknown): v is {\n safeParse: (v: unknown) => {\n success: boolean;\n error?: { message?: string; issues?: Array<{ message: string }> };\n };\n _def: unknown;\n parse: unknown;\n } {\n return (\n v !== null &&\n typeof v === \"object\" &&\n \"safeParse\" in v &&\n typeof (v as Record<string, unknown>).safeParse === \"function\" &&\n \"_def\" in v &&\n \"parse\" in v &&\n typeof (v as Record<string, unknown>).parse === \"function\"\n );\n }\n\n /** Get expected type name from schema */\n function getExpectedType(schemaType: unknown): string {\n // Check for our SchemaType with _typeName\n const st = schemaType as { _typeName?: string };\n if (st._typeName) return st._typeName;\n\n // Check for Zod schema\n if (isZodSchema(schemaType)) {\n const def = (schemaType as { _def?: { typeName?: string } })._def;\n if (def?.typeName) {\n // Convert ZodString -> string, ZodNumber -> number, etc.\n return def.typeName.replace(/^Zod/, \"\").toLowerCase();\n }\n }\n\n return \"unknown\";\n }\n\n /** Format value for error message, respecting redactErrors option */\n function formatValueForError(value: unknown): string {\n if (redactErrors) return \"[redacted]\";\n return safeStringify(value);\n }\n\n /** Validate a value against the schema */\n function validateValue(key: string, value: unknown): void {\n if (!validate) return;\n\n const schemaType = schema[key];\n if (!schemaType) {\n if (strictKeys) {\n throw new Error(\n `[Directive] Unknown fact key: \"${key}\". Key not defined in schema.`,\n );\n }\n console.warn(`[Directive] Unknown fact key: \"${key}\"`);\n return;\n }\n\n // Check for Zod schema (robust detection: safeParse + _def + parse)\n if (isZodSchema(schemaType)) {\n const result = schemaType.safeParse(value);\n if (!result.success) {\n const valueType =\n value === null\n ? \"null\"\n : Array.isArray(value)\n ? \"array\"\n : typeof value;\n const valuePreview = formatValueForError(value);\n // Extract error message safely from Zod error structure\n const errorMessage =\n result.error?.message ??\n result.error?.issues?.[0]?.message ??\n \"Validation failed\";\n const expectedType = getExpectedType(schemaType);\n throw new Error(\n `[Directive] Validation failed for \"${key}\": expected ${expectedType}, got ${valueType} ${valuePreview}. ${errorMessage}`,\n );\n }\n return;\n }\n\n // Check for our SchemaType (has _validators array)\n const st = schemaType as {\n _validators?: unknown;\n _typeName?: string;\n _lastFailedIndex?: number;\n };\n const validators = st._validators;\n\n // Ensure validators is an array before iterating\n if (!validators || !Array.isArray(validators) || validators.length === 0) {\n return; // type assertion or empty validators - no validation\n }\n\n const expectedType = st._typeName ?? \"unknown\";\n\n for (let i = 0; i < validators.length; i++) {\n const validator = validators[i];\n if (typeof validator !== \"function\") continue;\n\n if (!validator(value as never)) {\n const valueType =\n value === null\n ? \"null\"\n : Array.isArray(value)\n ? \"array\"\n : typeof value;\n const valuePreview = formatValueForError(value);\n\n // Check for array index failure from schema type\n let indexHint = \"\";\n if (\n typeof st._lastFailedIndex === \"number\" &&\n st._lastFailedIndex >= 0\n ) {\n indexHint = ` (element at index ${st._lastFailedIndex} failed)`;\n st._lastFailedIndex = -1; // Reset for next validation\n }\n\n // Include expected type in error message\n const validatorHint = i === 0 ? \"\" : ` (validator ${i + 1} failed)`;\n throw new Error(\n `[Directive] Validation failed for \"${key}\": expected ${expectedType}, got ${valueType} ${valuePreview}${validatorHint}${indexHint}`,\n );\n }\n }\n }\n\n /** Notify listeners for a specific key */\n function notifyKey(key: string): void {\n keyListeners.get(key)?.forEach((listener) => listener());\n }\n\n /** Notify all listeners */\n function notifyAll(): void {\n allListeners.forEach((listener) => listener());\n }\n\n /**\n * Run non-batched notifications with coalescing.\n * If a listener calls store.set(), the change is deferred and processed\n * after the current notification cycle completes.\n */\n function notifyNonBatched(key: string, value: unknown, prev: unknown): void {\n if (isNotifying) {\n // Re-entrant: defer to after current notification cycle\n pendingNonBatchedChanges.push({ key, value, prev });\n return;\n }\n\n isNotifying = true;\n try {\n // Fire onChange, notifyKey, notifyAll for the initial change\n onChange?.(key, value, prev);\n notifyKey(key);\n notifyAll();\n\n // Process any changes that were deferred during notification\n let iterations = 0;\n while (pendingNonBatchedChanges.length > 0) {\n if (++iterations > MAX_NOTIFY_ITERATIONS) {\n pendingNonBatchedChanges.length = 0;\n throw new Error(\n `[Directive] Infinite notification loop detected after ${MAX_NOTIFY_ITERATIONS} iterations. ` +\n `A listener is repeatedly mutating facts that re-trigger notifications.`,\n );\n }\n\n const deferred = [...pendingNonBatchedChanges];\n pendingNonBatchedChanges.length = 0;\n\n for (const change of deferred) {\n onChange?.(change.key, change.value, change.prev);\n notifyKey(change.key);\n }\n // Single notifyAll for all deferred changes in this iteration\n notifyAll();\n }\n } finally {\n isNotifying = false;\n }\n }\n\n /** Flush batched changes and notify */\n function flush(): void {\n if (batching > 0) return;\n\n // Notify batch callback\n if (onBatch && batchChanges.length > 0) {\n onBatch([...batchChanges]);\n }\n\n // Notify key-specific listeners (within coalescing guard)\n if (dirtyKeys.size > 0) {\n isNotifying = true;\n try {\n for (const key of dirtyKeys) {\n notifyKey(key);\n }\n notifyAll();\n\n // Process any changes deferred during flush notification\n let iterations = 0;\n while (pendingNonBatchedChanges.length > 0) {\n if (++iterations > MAX_NOTIFY_ITERATIONS) {\n pendingNonBatchedChanges.length = 0;\n throw new Error(\n `[Directive] Infinite notification loop detected during flush after ${MAX_NOTIFY_ITERATIONS} iterations.`,\n );\n }\n\n const deferred = [...pendingNonBatchedChanges];\n pendingNonBatchedChanges.length = 0;\n\n for (const change of deferred) {\n onChange?.(change.key, change.value, change.prev);\n notifyKey(change.key);\n }\n notifyAll();\n }\n } finally {\n isNotifying = false;\n }\n }\n\n // Clear batch state\n batchChanges.length = 0;\n dirtyKeys.clear();\n }\n\n const store: FactsStore<S> = {\n get<K extends keyof InferSchema<S>>(key: K): InferSchema<S>[K] | undefined {\n // Track access for auto-tracking\n trackAccess(key as string);\n return map.get(key as string) as InferSchema<S>[K] | undefined;\n },\n\n has(key: keyof InferSchema<S>): boolean {\n // Track access for auto-tracking\n trackAccess(key as string);\n return map.has(key as string);\n },\n\n set<K extends keyof InferSchema<S>>(\n key: K,\n value: InferSchema<S>[K],\n ): void {\n validateValue(key as string, value);\n\n const prev = map.get(key as string);\n\n // Skip if value hasn't changed (prevents unnecessary cascade)\n if (Object.is(prev, value)) return;\n\n map.set(key as string, value);\n knownKeys.add(key as string); // Track known keys for serialization\n\n // Record change\n if (batching > 0) {\n batchChanges.push({ key: key as string, value, prev, type: \"set\" });\n dirtyKeys.add(key as string);\n } else {\n notifyNonBatched(key as string, value, prev);\n }\n },\n\n delete(key: keyof InferSchema<S>): void {\n const prev = map.get(key as string);\n map.delete(key as string);\n knownKeys.delete(key as string); // Remove from known keys\n\n // Record change\n if (batching > 0) {\n batchChanges.push({\n key: key as string,\n value: undefined,\n prev,\n type: \"delete\",\n });\n dirtyKeys.add(key as string);\n } else {\n notifyNonBatched(key as string, undefined, prev);\n }\n },\n\n batch(fn: () => void): void {\n batching++;\n try {\n fn();\n } finally {\n batching--;\n flush();\n }\n },\n\n subscribe(\n keys: Array<keyof InferSchema<S>>,\n listener: () => void,\n ): () => void {\n for (const key of keys) {\n const keyStr = key as string;\n if (!keyListeners.has(keyStr)) {\n keyListeners.set(keyStr, new Set());\n }\n keyListeners.get(keyStr)!.add(listener);\n }\n\n return () => {\n for (const key of keys) {\n const set = keyListeners.get(key as string);\n if (set) {\n set.delete(listener);\n if (set.size === 0) {\n keyListeners.delete(key as string);\n }\n }\n }\n };\n },\n\n subscribeAll(listener: () => void): () => void {\n allListeners.add(listener);\n return () => allListeners.delete(listener);\n },\n\n toObject(): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const key of knownKeys) {\n if (map.has(key)) {\n result[key] = map.get(key);\n }\n }\n return result;\n },\n };\n\n // Internal: register new schema keys for dynamic module registration.\n // Not part of the public FactsStore interface — used by engine.registerModule().\n (store as unknown as Record<string, unknown>).registerKeys = (\n newSchema: Record<string, unknown>,\n ) => {\n for (const key of Object.keys(newSchema)) {\n // Defense-in-depth: skip prototype pollution keys\n if (BLOCKED_PROPS.has(key)) continue;\n // Add to schema for validation\n (schema as Record<string, unknown>)[key] = newSchema[key];\n knownKeys.add(key);\n }\n };\n\n return store;\n}\n\n// ============================================================================\n// Proxy-based Facts Accessor\n// ============================================================================\n\n/** Prototype pollution guard - prevent access to dangerous properties */\nconst BLOCKED_PROPS = Object.freeze(\n new Set([\"__proto__\", \"constructor\", \"prototype\"]),\n);\n\n/**\n * Create a Proxy wrapper around a {@link FactsStore} for clean property-style\n * access (`facts.phase`) with automatic dependency tracking.\n *\n * Reading a property calls `store.get()` (which tracks the access for\n * auto-tracked derivations). Writing a property calls `store.set()` (which\n * validates against the schema). The proxy also exposes `$store` for direct\n * store access and `$snapshot()` for untracked reads.\n *\n * @param store - The underlying facts store to wrap\n * @param schema - The schema definition (used for `ownKeys` enumeration)\n * @returns A `Facts<S>` proxy with property-style get/set and prototype pollution guards\n */\nexport function createFactsProxy<S extends Schema>(\n store: FactsStore<S>,\n schema: S,\n): Facts<S> {\n const snapshot = (): FactsSnapshot<S> => ({\n get: <K extends keyof InferSchema<S>>(key: K) =>\n withoutTracking(() => store.get(key)),\n has: (key: keyof InferSchema<S>) => withoutTracking(() => store.has(key)),\n });\n\n const proxy = new Proxy({} as Facts<S>, {\n get(_, prop: string | symbol) {\n if (prop === \"$store\") return store;\n if (prop === \"$snapshot\") return snapshot;\n\n // Special properties\n if (typeof prop === \"symbol\") return undefined;\n\n // Prototype pollution protection\n if (BLOCKED_PROPS.has(prop)) return undefined;\n\n // Track and return the value\n return store.get(prop as keyof InferSchema<S>);\n },\n\n set(_, prop: string | symbol, value: unknown) {\n if (typeof prop === \"symbol\") return false;\n if (prop === \"$store\" || prop === \"$snapshot\") return false;\n // Prototype pollution protection\n if (BLOCKED_PROPS.has(prop)) return false;\n\n // Validation is handled by store.set() when validate option is enabled\n store.set(\n prop as keyof InferSchema<S>,\n value as InferSchema<S>[keyof InferSchema<S>],\n );\n return true;\n },\n\n deleteProperty(_, prop: string | symbol) {\n if (typeof prop === \"symbol\") return false;\n if (prop === \"$store\" || prop === \"$snapshot\") return false;\n // Prototype pollution protection\n if (BLOCKED_PROPS.has(prop)) return false;\n\n store.delete(prop as keyof InferSchema<S>);\n return true;\n },\n\n has(_, prop: string | symbol) {\n if (prop === \"$store\" || prop === \"$snapshot\") return true;\n if (typeof prop === \"symbol\") return false;\n // Prototype pollution protection\n if (BLOCKED_PROPS.has(prop)) return false;\n\n return store.has(prop as keyof InferSchema<S>);\n },\n\n ownKeys() {\n // Return schema keys dynamically so Object.keys(facts) reflects\n // keys added via registerKeys (dynamic module registration)\n return Object.keys(schema);\n },\n\n getOwnPropertyDescriptor(_, prop: string | symbol) {\n if (prop === \"$store\" || prop === \"$snapshot\") {\n return { configurable: true, enumerable: false, writable: false };\n }\n return { configurable: true, enumerable: true, writable: true };\n },\n });\n\n return proxy;\n}\n\n// ============================================================================\n// Combined Factory\n// ============================================================================\n\n/**\n * Convenience factory that creates both a {@link FactsStore} and its\n * {@link createFactsProxy | proxy wrapper} in a single call.\n *\n * This is the recommended entry point when you need low-level store access\n * outside of `createModule` / `createSystem`.\n *\n * @param options - Same options as {@link createFactsStore}\n * @returns An object with `store` (the reactive Map-backed store) and `facts` (the Proxy accessor)\n *\n * @example\n * ```ts\n * const { store, facts } = createFacts({\n * schema: { phase: t.string<\"red\" | \"green\">() },\n * });\n *\n * facts.phase = \"red\";\n * console.log(facts.phase); // \"red\"\n * store.subscribe([\"phase\"], () => console.log(\"phase changed\"));\n * ```\n */\nexport function createFacts<S extends Schema>(\n options: CreateFactsStoreOptions<S>,\n): { store: FactsStore<S>; facts: Facts<S> } {\n const store = createFactsStore(options);\n const facts = createFactsProxy(store, options.schema);\n return { store, facts };\n}\n","/**\n * Plugin Architecture - Extensible middleware for Directive\n *\n * Features:\n * - Lifecycle hooks for all engine events\n * - Multiple plugins can be composed\n * - Plugins execute in registration order\n */\n\nimport type {\n FactChange,\n FactsSnapshot,\n Plugin,\n ReconcileResult,\n RecoveryStrategy,\n RequirementWithId,\n RunChangelogEntry,\n Schema,\n Snapshot,\n System,\n} from \"./types.js\";\nimport type { DirectiveError } from \"./types.js\";\n\n// ============================================================================\n// Plugin Manager\n// ============================================================================\n\n// Note: PluginManager uses Schema (flat) internally because the engine works with flat schemas.\n// The public API uses ModuleSchema (consolidated), and the conversion happens in createSystem.\n// biome-ignore lint/suspicious/noExplicitAny: Internal type - plugins are schema-agnostic at runtime\nexport interface PluginManager<_S extends Schema = any> {\n /** Register a plugin */\n // biome-ignore lint/suspicious/noExplicitAny: Plugins work with any schema\n register(plugin: Plugin<any>): void;\n /** Unregister a plugin by name */\n unregister(name: string): void;\n /** Get all registered plugins */\n // biome-ignore lint/suspicious/noExplicitAny: Plugins work with any schema\n getPlugins(): Plugin<any>[];\n\n // Lifecycle hooks\n // biome-ignore lint/suspicious/noExplicitAny: System type varies between internal/public API\n emitInit(system: System<any>): Promise<void>;\n // biome-ignore lint/suspicious/noExplicitAny: System type varies between internal/public API\n emitStart(system: System<any>): void;\n // biome-ignore lint/suspicious/noExplicitAny: System type varies between internal/public API\n emitStop(system: System<any>): void;\n // biome-ignore lint/suspicious/noExplicitAny: System type varies between internal/public API\n emitDestroy(system: System<any>): void;\n\n // Fact hooks\n emitFactSet(key: string, value: unknown, prev: unknown): void;\n emitFactDelete(key: string, prev: unknown): void;\n emitFactsBatch(changes: FactChange[]): void;\n\n // Derivation hooks\n emitDerivationCompute(id: string, value: unknown, deps: string[]): void;\n emitDerivationInvalidate(id: string): void;\n\n // Reconciliation hooks\n // biome-ignore lint/suspicious/noExplicitAny: Schema type varies\n emitReconcileStart(snapshot: FactsSnapshot<any>): void;\n emitReconcileEnd(result: ReconcileResult): void;\n\n // Constraint hooks\n emitConstraintEvaluate(id: string, active: boolean): void;\n emitConstraintError(id: string, error: unknown): void;\n\n // Requirement hooks\n emitRequirementCreated(req: RequirementWithId): void;\n emitRequirementMet(req: RequirementWithId, byResolver: string): void;\n emitRequirementCanceled(req: RequirementWithId): void;\n\n // Resolver hooks\n emitResolverStart(resolver: string, req: RequirementWithId): void;\n emitResolverComplete(\n resolver: string,\n req: RequirementWithId,\n duration: number,\n ): void;\n emitResolverError(\n resolver: string,\n req: RequirementWithId,\n error: unknown,\n ): void;\n emitResolverRetry(\n resolver: string,\n req: RequirementWithId,\n attempt: number,\n ): void;\n emitResolverCancel(resolver: string, req: RequirementWithId): void;\n\n // Effect hooks\n emitEffectRun(id: string): void;\n emitEffectError(id: string, error: unknown): void;\n\n // Time-travel hooks\n emitSnapshot(snapshot: Snapshot): void;\n emitTimeTravel(from: number, to: number): void;\n\n // Error boundary hooks\n emitError(error: DirectiveError): void;\n emitErrorRecovery(error: DirectiveError, strategy: RecoveryStrategy): void;\n\n // Run history hooks\n emitRunComplete(run: RunChangelogEntry): void;\n}\n\n/**\n * Create a manager that broadcasts lifecycle events to registered plugins.\n *\n * Plugins are called in registration order. All hook invocations are\n * wrapped in try-catch so a misbehaving plugin never breaks the engine.\n * Duplicate plugin names are detected and the older registration is\n * replaced with a warning.\n *\n * @returns A `PluginManager` with register/unregister/getPlugins and emit* methods for every lifecycle event\n */\n// biome-ignore lint/suspicious/noExplicitAny: Internal - schema type varies\nexport function createPluginManager<\n S extends Schema = any,\n>(): PluginManager<S> {\n // biome-ignore lint/suspicious/noExplicitAny: Plugins work with any schema\n const plugins: Plugin<any>[] = [];\n\n /** Safe call - wraps plugin hook calls to prevent errors from breaking the system */\n function safeCall<T>(fn: (() => T) | undefined): T | undefined {\n if (!fn) return undefined;\n try {\n return fn();\n } catch (error) {\n console.error(\"[Directive] Plugin error:\", error);\n return undefined;\n }\n }\n\n /** Safe async call */\n async function safeCallAsync<T>(\n fn: (() => Promise<T>) | undefined,\n ): Promise<T | undefined> {\n if (!fn) return undefined;\n try {\n return await fn();\n } catch (error) {\n console.error(\"[Directive] Plugin error:\", error);\n return undefined;\n }\n }\n\n const manager: PluginManager<S> = {\n // biome-ignore lint/suspicious/noExplicitAny: Plugins work with any schema\n register(plugin: Plugin<any>): void {\n // Check for duplicate names\n if (plugins.some((p) => p.name === plugin.name)) {\n console.warn(\n `[Directive] Plugin \"${plugin.name}\" is already registered, replacing...`,\n );\n this.unregister(plugin.name);\n }\n plugins.push(plugin);\n },\n\n unregister(name: string): void {\n const index = plugins.findIndex((p) => p.name === name);\n if (index !== -1) {\n plugins.splice(index, 1);\n }\n },\n\n // biome-ignore lint/suspicious/noExplicitAny: Plugins work with any schema\n getPlugins(): Plugin<any>[] {\n return [...plugins];\n },\n\n // Lifecycle hooks\n // biome-ignore lint/suspicious/noExplicitAny: System type varies\n async emitInit(system: System<any>): Promise<void> {\n for (const plugin of plugins) {\n await safeCallAsync(() => plugin.onInit?.(system) as Promise<void>);\n }\n },\n\n // biome-ignore lint/suspicious/noExplicitAny: System type varies\n emitStart(system: System<any>): void {\n for (const plugin of plugins) {\n safeCall(() => plugin.onStart?.(system));\n }\n },\n\n // biome-ignore lint/suspicious/noExplicitAny: System type varies\n emitStop(system: System<any>): void {\n for (const plugin of plugins) {\n safeCall(() => plugin.onStop?.(system));\n }\n },\n\n // biome-ignore lint/suspicious/noExplicitAny: System type varies\n emitDestroy(system: System<any>): void {\n for (const plugin of plugins) {\n safeCall(() => plugin.onDestroy?.(system));\n }\n },\n\n // Fact hooks\n emitFactSet(key: string, value: unknown, prev: unknown): void {\n for (const plugin of plugins) {\n safeCall(() => plugin.onFactSet?.(key, value, prev));\n }\n },\n\n emitFactDelete(key: string, prev: unknown): void {\n for (const plugin of plugins) {\n safeCall(() => plugin.onFactDelete?.(key, prev));\n }\n },\n\n emitFactsBatch(changes: FactChange[]): void {\n for (const plugin of plugins) {\n safeCall(() => plugin.onFactsBatch?.(changes));\n }\n },\n\n // Derivation hooks\n emitDerivationCompute(id: string, value: unknown, deps: string[]): void {\n for (const plugin of plugins) {\n safeCall(() => plugin.onDerivationCompute?.(id, value, deps));\n }\n },\n\n emitDerivationInvalidate(id: string): void {\n for (const plugin of plugins) {\n safeCall(() => plugin.onDerivationInvalidate?.(id));\n }\n },\n\n // Reconciliation hooks\n // biome-ignore lint/suspicious/noExplicitAny: Schema type varies\n emitReconcileStart(snapshot: FactsSnapshot<any>): void {\n for (const plugin of plugins) {\n safeCall(() => plugin.onReconcileStart?.(snapshot));\n }\n },\n\n emitReconcileEnd(result: ReconcileResult): void {\n for (const plugin of plugins) {\n safeCall(() => plugin.onReconcileEnd?.(result));\n }\n },\n\n // Constraint hooks\n emitConstraintEvaluate(id: string, active: boolean): void {\n for (const plugin of plugins) {\n safeCall(() => plugin.onConstraintEvaluate?.(id, active));\n }\n },\n\n emitConstraintError(id: string, error: unknown): void {\n for (const plugin of plugins) {\n safeCall(() => plugin.onConstraintError?.(id, error));\n }\n },\n\n // Requirement hooks\n emitRequirementCreated(req: RequirementWithId): void {\n for (const plugin of plugins) {\n safeCall(() => plugin.onRequirementCreated?.(req));\n }\n },\n\n emitRequirementMet(req: RequirementWithId, byResolver: string): void {\n for (const plugin of plugins) {\n safeCall(() => plugin.onRequirementMet?.(req, byResolver));\n }\n },\n\n emitRequirementCanceled(req: RequirementWithId): void {\n for (const plugin of plugins) {\n safeCall(() => plugin.onRequirementCanceled?.(req));\n }\n },\n\n // Resolver hooks\n emitResolverStart(resolver: string, req: RequirementWithId): void {\n for (const plugin of plugins) {\n safeCall(() => plugin.onResolverStart?.(resolver, req));\n }\n },\n\n emitResolverComplete(\n resolver: string,\n req: RequirementWithId,\n duration: number,\n ): void {\n for (const plugin of plugins) {\n safeCall(() => plugin.onResolverComplete?.(resolver, req, duration));\n }\n },\n\n emitResolverError(\n resolver: string,\n req: RequirementWithId,\n error: unknown,\n ): void {\n for (const plugin of plugins) {\n safeCall(() => plugin.onResolverError?.(resolver, req, error));\n }\n },\n\n emitResolverRetry(\n resolver: string,\n req: RequirementWithId,\n attempt: number,\n ): void {\n for (const plugin of plugins) {\n safeCall(() => plugin.onResolverRetry?.(resolver, req, attempt));\n }\n },\n\n emitResolverCancel(resolver: string, req: RequirementWithId): void {\n for (const plugin of plugins) {\n safeCall(() => plugin.onResolverCancel?.(resolver, req));\n }\n },\n\n // Effect hooks\n emitEffectRun(id: string): void {\n for (const plugin of plugins) {\n safeCall(() => plugin.onEffectRun?.(id));\n }\n },\n\n emitEffectError(id: string, error: unknown): void {\n for (const plugin of plugins) {\n safeCall(() => plugin.onEffectError?.(id, error));\n }\n },\n\n // Time-travel hooks\n emitSnapshot(snapshot: Snapshot): void {\n for (const plugin of plugins) {\n safeCall(() => plugin.onSnapshot?.(snapshot));\n }\n },\n\n emitTimeTravel(from: number, to: number): void {\n for (const plugin of plugins) {\n safeCall(() => plugin.onTimeTravel?.(from, to));\n }\n },\n\n // Error boundary hooks\n emitError(error: DirectiveError): void {\n for (const plugin of plugins) {\n safeCall(() => plugin.onError?.(error));\n }\n },\n\n emitErrorRecovery(error: DirectiveError, strategy: RecoveryStrategy): void {\n for (const plugin of plugins) {\n safeCall(() => plugin.onErrorRecovery?.(error, strategy));\n }\n },\n\n // Run history hooks\n emitRunComplete(run: RunChangelogEntry): void {\n for (const plugin of plugins) {\n safeCall(() => plugin.onRunComplete?.(run));\n }\n },\n };\n\n return manager;\n}\n","/**\n * Resolvers - Capability-based handlers for requirements\n *\n * Features:\n * - Capability matching (handles predicate)\n * - Custom dedupe keys\n * - Retry policies with exponential backoff\n * - Batched resolution for similar requirements\n * - Cancellation via AbortController\n */\n\nimport { withTimeout } from \"../utils/utils.js\";\nimport type {\n BatchConfig,\n BatchResolveResults,\n Facts,\n FactsSnapshot,\n FactsStore,\n Requirement,\n RequirementWithId,\n ResolverContext,\n ResolverStatus,\n ResolversDef,\n RetryPolicy,\n Schema,\n} from \"./types.js\";\n\n// ============================================================================\n// Resolvers Manager\n// ============================================================================\n\n/** Inflight resolver info */\nexport interface InflightInfo {\n id: string;\n resolverId: string;\n startedAt: number;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport interface ResolversManager<_S extends Schema> {\n /** Start resolving a requirement */\n resolve(req: RequirementWithId): void;\n /** Cancel a resolver by requirement ID */\n cancel(requirementId: string): void;\n /** Cancel all inflight resolvers */\n cancelAll(): void;\n /** Get status of a resolver by requirement ID */\n getStatus(requirementId: string): ResolverStatus;\n /** Get all inflight requirement IDs */\n getInflight(): string[];\n /** Get full info for all inflight resolvers */\n getInflightInfo(): InflightInfo[];\n /** Check if a requirement is being resolved */\n isResolving(requirementId: string): boolean;\n /** Process batched requirements (called periodically) */\n processBatches(): void;\n /** Check if there are pending batched requirements waiting to be processed */\n hasPendingBatches(): boolean;\n /** Register new resolver definitions (for dynamic module registration) */\n registerDefinitions(newDefs: ResolversDef<Schema>): void;\n}\n\n/** Internal resolver state */\ninterface ResolverState {\n requirementId: string;\n resolverId: string;\n controller: AbortController;\n startedAt: number;\n attempt: number;\n status: ResolverStatus;\n /** Original requirement for proper cancel callback */\n originalRequirement: RequirementWithId;\n}\n\n/** Batch state for batched resolvers */\ninterface BatchState {\n resolverId: string;\n requirements: RequirementWithId[];\n timer: ReturnType<typeof setTimeout> | null;\n}\n\n/** Options for creating a resolvers manager */\nexport interface CreateResolversOptions<S extends Schema> {\n definitions: ResolversDef<S>;\n facts: Facts<S>;\n store: FactsStore<S>;\n /** Callback when a resolver starts */\n onStart?: (resolver: string, req: RequirementWithId) => void;\n /** Callback when a resolver completes */\n onComplete?: (\n resolver: string,\n req: RequirementWithId,\n duration: number,\n ) => void;\n /** Callback when a resolver errors */\n onError?: (resolver: string, req: RequirementWithId, error: unknown) => void;\n /** Callback when a resolver retries */\n onRetry?: (resolver: string, req: RequirementWithId, attempt: number) => void;\n /** Callback when a resolver is canceled */\n onCancel?: (resolver: string, req: RequirementWithId) => void;\n /** Callback when resolution cycle completes (for reconciliation) */\n onResolutionComplete?: () => void;\n}\n\n/** Default retry policy */\nconst DEFAULT_RETRY: RetryPolicy = {\n attempts: 1,\n backoff: \"none\",\n initialDelay: 100,\n maxDelay: 30000,\n};\n\n/** Default batch config */\nconst DEFAULT_BATCH: BatchConfig = {\n enabled: false,\n windowMs: 50,\n};\n\n/**\n * Calculate delay for a retry attempt.\n */\nfunction calculateDelay(policy: RetryPolicy, attempt: number): number {\n const { backoff, initialDelay = 100, maxDelay = 30000 } = policy;\n\n let delay: number;\n\n switch (backoff) {\n case \"none\":\n delay = initialDelay;\n break;\n case \"linear\":\n delay = initialDelay * attempt;\n break;\n case \"exponential\":\n delay = initialDelay * Math.pow(2, attempt - 1);\n break;\n default:\n delay = initialDelay;\n }\n\n // Ensure delay is at least 1ms to prevent busy loops\n return Math.max(1, Math.min(delay, maxDelay));\n}\n\n/**\n * Create a manager that fulfills requirements by matching them to resolver\n * handlers.\n *\n * Resolvers are matched by requirement type (string or predicate). Each\n * resolution runs with an `AbortController` for cancellation, configurable\n * retry policies (none/linear/exponential backoff), and optional batching\n * for grouping similar requirements. Duplicate in-flight requirements are\n * automatically deduplicated.\n *\n * @param options - Resolver definitions, facts proxy, store, and lifecycle callbacks (onStart/onComplete/onError/onRetry/onCancel/onResolutionComplete)\n * @returns A `ResolversManager` with resolve/cancel/cancelAll/getStatus/processBatches methods\n */\nexport function createResolversManager<S extends Schema>(\n options: CreateResolversOptions<S>,\n): ResolversManager<S> {\n const {\n definitions,\n facts,\n store,\n onStart,\n onComplete,\n onError,\n onRetry,\n onCancel,\n onResolutionComplete,\n } = options;\n\n // Validate resolver definitions\n if (process.env.NODE_ENV !== \"production\") {\n for (const [id, def] of Object.entries(definitions)) {\n if (!def.resolve && !def.resolveBatch && !def.resolveBatchWithResults) {\n throw new Error(\n `[Directive] Resolver \"${id}\" must define either resolve() or resolveBatch(). ` +\n `Add one of these methods to handle requirements.`,\n );\n }\n if (\n def.batch?.enabled &&\n !def.resolveBatch &&\n !def.resolveBatchWithResults\n ) {\n if (def.resolve) {\n console.warn(\n `[Directive] Resolver \"${id}\" has batch.enabled but no resolveBatch(). ` +\n `Falling back to individual resolve() calls. Add resolveBatch() for true bulk operations.`,\n );\n } else {\n throw new Error(\n `[Directive] Resolver \"${id}\" has batch.enabled=true but no resolve(), resolveBatch(), or resolveBatchWithResults() method.`,\n );\n }\n }\n }\n }\n\n // Active resolver states by requirement ID\n const inflight = new Map<string, ResolverState>();\n\n // Completed/failed statuses (kept for inspection) - LRU cleanup\n const statuses = new Map<string, ResolverStatus>();\n const MAX_STATUSES = 1000; // Limit to prevent memory leak\n\n // Batch states by resolver ID\n const batches = new Map<string, BatchState>();\n\n // Resolver index by requirement type for O(1) lookup (populated lazily)\n // Capped to prevent unbounded growth with dynamic requirement types (e.g., FETCH_USER_${id})\n const resolversByType = new Map<string, string[]>();\n const MAX_RESOLVER_CACHE = 1000;\n\n /** Cleanup old statuses to prevent memory leak */\n function cleanupStatuses(): void {\n if (statuses.size > MAX_STATUSES) {\n // Remove oldest entries (first inserted = first in iteration)\n const entriesToRemove = statuses.size - MAX_STATUSES;\n const iterator = statuses.keys();\n for (let i = 0; i < entriesToRemove; i++) {\n const key = iterator.next().value;\n if (key) statuses.delete(key);\n }\n }\n }\n\n /** Type guard for resolver with string `requirement` property */\n function hasStringRequirement(def: unknown): def is { requirement: string } {\n return (\n typeof def === \"object\" &&\n def !== null &&\n \"requirement\" in def &&\n typeof (def as { requirement: unknown }).requirement === \"string\"\n );\n }\n\n /** Type guard for resolver with function `requirement` property */\n function hasFunctionRequirement(\n def: unknown,\n ): def is { requirement: (req: Requirement) => boolean } {\n return (\n typeof def === \"object\" &&\n def !== null &&\n \"requirement\" in def &&\n typeof (def as { requirement: unknown }).requirement === \"function\"\n );\n }\n\n /**\n * Check if a resolver handles a requirement.\n * Supports:\n * - `requirement: \"TYPE\"` - string matching\n * - `requirement: (req) => req is T` - function type guard\n */\n function resolverHandles(\n def: ResolversDef<S>[string],\n req: Requirement,\n ): boolean {\n // Check string-based `requirement`\n if (hasStringRequirement(def)) {\n return req.type === def.requirement;\n }\n\n // Check function-based `requirement` (type guard)\n if (hasFunctionRequirement(def)) {\n return def.requirement(req);\n }\n\n return false;\n }\n\n /** Find a resolver that handles a requirement */\n function findResolver(req: Requirement): string | null {\n // Check cache first for this requirement type\n const reqType = req.type;\n const cached = resolversByType.get(reqType);\n if (cached) {\n // Try cached resolvers first\n for (const id of cached) {\n const def = definitions[id];\n if (def && resolverHandles(def, req)) {\n return id;\n }\n }\n }\n\n // Fallback to full search and cache the result\n for (const [id, def] of Object.entries(definitions)) {\n if (resolverHandles(def, req)) {\n // Cache this resolver for this type (with size cap)\n if (!resolversByType.has(reqType)) {\n // Evict oldest entry if cache is full\n if (resolversByType.size >= MAX_RESOLVER_CACHE) {\n const oldest = resolversByType.keys().next().value;\n if (oldest !== undefined) resolversByType.delete(oldest);\n }\n resolversByType.set(reqType, []);\n }\n const typeResolvers = resolversByType.get(reqType)!;\n if (!typeResolvers.includes(id)) {\n typeResolvers.push(id);\n }\n return id;\n }\n }\n return null;\n }\n\n /** Create resolver context */\n function createContext(signal: AbortSignal): ResolverContext<S> {\n return {\n facts,\n signal,\n snapshot: () => facts.$snapshot() as FactsSnapshot<S>,\n };\n }\n\n /** Execute a single requirement resolution with retry */\n async function executeResolve(\n resolverId: string,\n req: RequirementWithId,\n controller: AbortController,\n ): Promise<void> {\n const def = definitions[resolverId];\n if (!def) return;\n const retryPolicy = { ...DEFAULT_RETRY, ...def.retry };\n let lastError: Error | null = null;\n\n for (let attempt = 1; attempt <= retryPolicy.attempts; attempt++) {\n // Check if canceled\n if (controller.signal.aborted) {\n return;\n }\n\n // Update state\n const state = inflight.get(req.id);\n if (state) {\n state.attempt = attempt;\n state.status = {\n state: \"running\",\n requirementId: req.id,\n startedAt: state.startedAt,\n attempt,\n };\n }\n\n try {\n const ctx = createContext(controller.signal);\n\n if (def.resolve) {\n // Batch the synchronous portion of resolve to coalesce fact mutations.\n // For sync-body async resolvers, all mutations are batched and flushed once.\n // For truly async resolvers, mutations before the first await are batched.\n let resolvePromise!: Promise<void>;\n store.batch(() => {\n resolvePromise = def.resolve!(\n req.requirement as Parameters<NonNullable<typeof def.resolve>>[0],\n ctx,\n ) as Promise<void>;\n });\n\n const timeout = def.timeout;\n if (timeout && timeout > 0) {\n await withTimeout(\n resolvePromise,\n timeout,\n `Resolver \"${resolverId}\" timed out after ${timeout}ms`,\n );\n } else {\n await resolvePromise;\n }\n }\n\n // Success\n const duration = Date.now() - (state?.startedAt ?? Date.now());\n statuses.set(req.id, {\n state: \"success\",\n requirementId: req.id,\n completedAt: Date.now(),\n duration,\n });\n cleanupStatuses(); // Prevent memory leak\n onComplete?.(resolverId, req, duration);\n return;\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n // Check if it was an abort\n if (controller.signal.aborted) {\n return;\n }\n\n // Check shouldRetry predicate — if it returns false, stop immediately\n if (\n retryPolicy.shouldRetry &&\n !retryPolicy.shouldRetry(lastError, attempt)\n ) {\n break;\n }\n\n // If we have more attempts, wait and retry\n if (attempt < retryPolicy.attempts) {\n // Check abort before starting delay (avoids unnecessary waiting)\n if (controller.signal.aborted) {\n return;\n }\n\n const delay = calculateDelay(retryPolicy, attempt);\n onRetry?.(resolverId, req, attempt + 1);\n\n // Use AbortSignal-aware sleep to respond to cancellation immediately\n await new Promise<void>((resolve) => {\n const timeoutId = setTimeout(resolve, delay);\n // Listen for abort during sleep\n const abortHandler = () => {\n clearTimeout(timeoutId);\n resolve();\n };\n controller.signal.addEventListener(\"abort\", abortHandler, {\n once: true,\n });\n });\n\n // Check abort after sleep\n if (controller.signal.aborted) {\n return;\n }\n }\n }\n }\n\n // All attempts failed (or shouldRetry returned false)\n statuses.set(req.id, {\n state: \"error\",\n requirementId: req.id,\n error: lastError!,\n failedAt: Date.now(),\n attempts: retryPolicy.attempts,\n });\n cleanupStatuses();\n onError?.(resolverId, req, lastError);\n }\n\n /** Execute a batch of requirements with retry, timeout, and partial failure support */\n async function executeBatch(\n resolverId: string,\n requirements: RequirementWithId[],\n ): Promise<void> {\n const def = definitions[resolverId];\n if (!def) return;\n\n // If no batch handler, fall back to individual resolution\n if (!def.resolveBatch && !def.resolveBatchWithResults) {\n await Promise.all(\n requirements.map((req) => {\n const controller = new AbortController();\n return executeResolve(resolverId, req, controller);\n }),\n );\n return;\n }\n\n const retryPolicy = { ...DEFAULT_RETRY, ...def.retry };\n const batchConfig = { ...DEFAULT_BATCH, ...def.batch };\n const controller = new AbortController();\n const startedAt = Date.now();\n let lastError: Error | null = null;\n\n // Use batch timeout if configured, otherwise fall back to resolver timeout\n const timeout = batchConfig.timeoutMs ?? def.timeout;\n\n for (let attempt = 1; attempt <= retryPolicy.attempts; attempt++) {\n // Check if canceled\n if (controller.signal.aborted) {\n return;\n }\n\n try {\n const ctx = createContext(controller.signal);\n const reqPayloads = requirements.map((r) => r.requirement);\n\n // Check for resolveBatchWithResults (per-item results)\n if (def.resolveBatchWithResults) {\n let results: BatchResolveResults;\n\n // Batch fact mutations for the synchronous portion of the resolver\n let resolvePromise!: Promise<BatchResolveResults>;\n store.batch(() => {\n // biome-ignore lint/suspicious/noExplicitAny: Requirement type varies\n resolvePromise = def.resolveBatchWithResults!(\n reqPayloads as any,\n ctx,\n );\n });\n\n if (timeout && timeout > 0) {\n results = await withTimeout(\n resolvePromise,\n timeout,\n `Batch resolver \"${resolverId}\" timed out after ${timeout}ms`,\n );\n } else {\n results = await resolvePromise;\n }\n\n // Validate results length\n if (results.length !== requirements.length) {\n throw new Error(\n `[Directive] Batch resolver \"${resolverId}\" returned ${results.length} results ` +\n `but expected ${requirements.length}. Results array must match input order.`,\n );\n }\n\n // Process per-item results\n const duration = Date.now() - startedAt;\n let hasFailures = false;\n\n for (let i = 0; i < requirements.length; i++) {\n const req = requirements[i]!;\n const result = results[i]!;\n\n if (result.success) {\n statuses.set(req.id, {\n state: \"success\",\n requirementId: req.id,\n completedAt: Date.now(),\n duration,\n });\n onComplete?.(resolverId, req, duration);\n } else {\n hasFailures = true;\n const error = result.error ?? new Error(\"Batch item failed\");\n statuses.set(req.id, {\n state: \"error\",\n requirementId: req.id,\n error,\n failedAt: Date.now(),\n attempts: attempt,\n });\n onError?.(resolverId, req, error);\n }\n }\n\n // No failures: all succeeded, done\n if (!hasFailures) return;\n\n // Partial success (some succeeded, some failed): don't retry the batch\n if (requirements.some((_, i) => results[i]?.success)) return;\n\n // ALL failed: fall through to retry logic below\n } else {\n // Use all-or-nothing resolveBatch\n // Batch fact mutations for the synchronous portion of the resolver\n let resolvePromise!: Promise<void>;\n store.batch(() => {\n // biome-ignore lint/suspicious/noExplicitAny: Requirement type varies\n resolvePromise = def.resolveBatch!(\n reqPayloads as any,\n ctx,\n ) as Promise<void>;\n });\n\n if (timeout && timeout > 0) {\n await withTimeout(\n resolvePromise,\n timeout,\n `Batch resolver \"${resolverId}\" timed out after ${timeout}ms`,\n );\n } else {\n await resolvePromise;\n }\n\n // Mark all as success\n const duration = Date.now() - startedAt;\n for (const req of requirements) {\n statuses.set(req.id, {\n state: \"success\",\n requirementId: req.id,\n completedAt: Date.now(),\n duration,\n });\n onComplete?.(resolverId, req, duration);\n }\n return;\n }\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n // Check if it was an abort\n if (controller.signal.aborted) {\n return;\n }\n\n // Check shouldRetry predicate — if it returns false, stop immediately\n if (\n retryPolicy.shouldRetry &&\n !retryPolicy.shouldRetry(lastError, attempt)\n ) {\n break;\n }\n\n // If we have more attempts, wait and retry\n if (attempt < retryPolicy.attempts) {\n const delay = calculateDelay(retryPolicy, attempt);\n // Notify retry for all requirements\n for (const req of requirements) {\n onRetry?.(resolverId, req, attempt + 1);\n }\n\n // Use AbortSignal-aware sleep\n await new Promise<void>((resolve) => {\n const timeoutId = setTimeout(resolve, delay);\n const abortHandler = () => {\n clearTimeout(timeoutId);\n resolve();\n };\n controller.signal.addEventListener(\"abort\", abortHandler, {\n once: true,\n });\n });\n\n // Check abort after sleep\n if (controller.signal.aborted) {\n return;\n }\n }\n }\n }\n\n // All attempts failed (or shouldRetry returned false) - mark all as error\n for (const req of requirements) {\n statuses.set(req.id, {\n state: \"error\",\n requirementId: req.id,\n error: lastError!,\n failedAt: Date.now(),\n attempts: retryPolicy.attempts,\n });\n onError?.(resolverId, req, lastError);\n }\n cleanupStatuses();\n }\n\n /** Add a requirement to a batch */\n function addToBatch(resolverId: string, req: RequirementWithId): void {\n const def = definitions[resolverId];\n if (!def) return;\n const batchConfig = { ...DEFAULT_BATCH, ...def.batch };\n\n if (!batches.has(resolverId)) {\n batches.set(resolverId, {\n resolverId,\n requirements: [],\n timer: null,\n });\n }\n\n const batch = batches.get(resolverId)!;\n batch.requirements.push(req);\n\n // Flush immediately if maxSize reached\n if (\n batchConfig.maxSize &&\n batch.requirements.length >= batchConfig.maxSize\n ) {\n if (batch.timer) {\n clearTimeout(batch.timer);\n batch.timer = null;\n }\n processBatch(resolverId);\n\n return;\n }\n\n // Start or reset timer\n if (batch.timer) {\n clearTimeout(batch.timer);\n }\n\n batch.timer = setTimeout(() => {\n processBatch(resolverId);\n }, batchConfig.windowMs);\n }\n\n /** Process a single batch */\n function processBatch(resolverId: string): void {\n const batch = batches.get(resolverId);\n if (!batch || batch.requirements.length === 0) return;\n\n const requirements = [...batch.requirements];\n batch.requirements = [];\n batch.timer = null;\n\n // Execute batch\n executeBatch(resolverId, requirements).then(() => {\n onResolutionComplete?.();\n });\n }\n\n const manager: ResolversManager<S> = {\n resolve(req: RequirementWithId): void {\n // Already resolving?\n if (inflight.has(req.id)) {\n return;\n }\n\n // Find resolver\n const resolverId = findResolver(req.requirement);\n if (!resolverId) {\n console.warn(\n `[Directive] No resolver found for requirement type \"${req.requirement.type}\" (id: ${req.id})`,\n );\n return;\n }\n\n const def = definitions[resolverId];\n if (!def) return;\n\n // Check if this is a batched resolver\n if (def.batch?.enabled) {\n addToBatch(resolverId, req);\n return;\n }\n\n // Start resolution\n const controller = new AbortController();\n const startedAt = Date.now();\n\n const state: ResolverState = {\n requirementId: req.id,\n resolverId,\n controller,\n startedAt,\n attempt: 1,\n status: {\n state: \"pending\",\n requirementId: req.id,\n startedAt,\n },\n originalRequirement: req,\n };\n\n inflight.set(req.id, state);\n onStart?.(resolverId, req);\n\n // Execute asynchronously\n executeResolve(resolverId, req, controller).finally(() => {\n // Only fire onResolutionComplete if we're the first to clean up.\n // If cancel() already removed us from inflight, skip to avoid\n // spurious double-notifications.\n const wasInflight = inflight.delete(req.id);\n if (wasInflight) {\n onResolutionComplete?.();\n }\n });\n },\n\n cancel(requirementId: string): void {\n // Check inflight resolvers first\n const state = inflight.get(requirementId);\n if (state) {\n state.controller.abort();\n inflight.delete(requirementId);\n\n statuses.set(requirementId, {\n state: \"canceled\",\n requirementId,\n canceledAt: Date.now(),\n });\n cleanupStatuses();\n\n onCancel?.(state.resolverId, state.originalRequirement);\n\n return;\n }\n\n // Check pending batch queues\n for (const batch of batches.values()) {\n const idx = batch.requirements.findIndex((r) => r.id === requirementId);\n if (idx !== -1) {\n const [removed] = batch.requirements.splice(idx, 1);\n\n statuses.set(requirementId, {\n state: \"canceled\",\n requirementId,\n canceledAt: Date.now(),\n });\n cleanupStatuses();\n\n if (removed) {\n onCancel?.(batch.resolverId, removed);\n }\n\n return;\n }\n }\n },\n\n cancelAll(): void {\n const ids = [...inflight.keys()];\n for (const id of ids) {\n this.cancel(id);\n }\n\n // Cancel queued batch requirements\n for (const batch of batches.values()) {\n if (batch.timer) {\n clearTimeout(batch.timer);\n }\n for (const req of batch.requirements) {\n statuses.set(req.id, {\n state: \"canceled\",\n requirementId: req.id,\n canceledAt: Date.now(),\n });\n onCancel?.(batch.resolverId, req);\n }\n }\n batches.clear();\n cleanupStatuses();\n },\n\n getStatus(requirementId: string): ResolverStatus {\n // Check inflight first\n const state = inflight.get(requirementId);\n if (state) {\n return state.status;\n }\n\n // Check completed statuses\n const status = statuses.get(requirementId);\n if (status) {\n return status;\n }\n\n return { state: \"idle\" };\n },\n\n getInflight(): string[] {\n return [...inflight.keys()];\n },\n\n getInflightInfo(): InflightInfo[] {\n return [...inflight.values()].map((state) => ({\n id: state.requirementId,\n resolverId: state.resolverId,\n startedAt: state.startedAt,\n }));\n },\n\n isResolving(requirementId: string): boolean {\n return inflight.has(requirementId);\n },\n\n processBatches(): void {\n for (const resolverId of batches.keys()) {\n processBatch(resolverId);\n }\n },\n\n hasPendingBatches(): boolean {\n for (const batch of batches.values()) {\n if (batch.requirements.length > 0) {\n return true;\n }\n }\n\n return false;\n },\n\n registerDefinitions(newDefs: ResolversDef<Schema>): void {\n for (const [key, def] of Object.entries(newDefs)) {\n (definitions as Record<string, unknown>)[key] = def;\n }\n // Clear the resolver-by-type cache so new resolvers are discovered\n resolversByType.clear();\n },\n };\n\n return manager;\n}\n","/**\n * Engine - The core reconciliation loop\n *\n * The engine orchestrates:\n * 1. Fact changes trigger reconciliation\n * 2. Constraints produce requirements\n * 3. Resolvers fulfill requirements\n * 4. Effects run after stabilization\n * 5. Derivations are invalidated and recomputed\n */\n\nimport {\n type TimeTravelManager,\n createDisabledTimeTravel,\n createTimeTravelManager,\n} from \"../utils/time-travel.js\";\nimport { hashObject, isPrototypeSafe } from \"../utils/utils.js\";\nimport {\n type ConstraintsManager,\n createConstraintsManager,\n} from \"./constraints.js\";\nimport {\n type DerivationsManager,\n createDerivationsManager,\n} from \"./derivations.js\";\nimport { type EffectsManager, createEffectsManager } from \"./effects.js\";\nimport {\n type ErrorBoundaryManager,\n createErrorBoundaryManager,\n} from \"./errors.js\";\nimport { createFacts } from \"./facts.js\";\nimport { type PluginManager, createPluginManager } from \"./plugins.js\";\nimport { RequirementSet } from \"./requirements.js\";\nimport { type ResolversManager, createResolversManager } from \"./resolvers.js\";\n\n// Blocked properties for prototype pollution protection\nconst BLOCKED_PROPS = new Set([\"__proto__\", \"constructor\", \"prototype\"]);\nimport type {\n ConstraintsDef,\n DerivationsDef,\n EffectsDef,\n EventsDef,\n FactsSnapshot,\n InferSchema,\n ReconcileResult,\n ResolversDef,\n RunChangelogEntry,\n Schema,\n System,\n SystemConfig,\n SystemEvent,\n SystemInspection,\n} from \"./types.js\";\n\n// ============================================================================\n// Engine Implementation\n// ============================================================================\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\ninterface EngineState<_S extends Schema> {\n isRunning: boolean;\n isReconciling: boolean;\n reconcileScheduled: boolean;\n isInitializing: boolean;\n isInitialized: boolean;\n isReady: boolean;\n isDestroyed: boolean;\n changedKeys: Set<string>;\n previousRequirements: RequirementSet;\n readyPromise: Promise<void> | null;\n readyResolve: (() => void) | null;\n}\n\n/**\n * Create the core Directive reconciliation engine that wires facts, derivations,\n * effects, constraints, resolvers, plugins, error boundaries, and time-travel\n * into a single reactive system.\n *\n * This is the internal factory used by `createSystem`. Most users should call\n * `createSystem` instead, which provides a friendlier API and handles module\n * composition.\n *\n * @param config - Full system configuration: modules, plugins, error boundary settings, and debug options\n * @returns A `System` instance with facts, derive, events, dispatch, subscribe, watch, settle, and lifecycle methods\n *\n * @example\n * ```ts\n * // Prefer createSystem for most use cases:\n * import { createSystem, createModule, t } from \"@directive-run/core\";\n *\n * const counter = createModule(\"counter\", {\n * schema: { count: t.number() },\n * init: (facts) => { facts.count = 0; },\n * });\n *\n * const system = createSystem({ module: counter });\n * system.start();\n * system.facts.count = 42;\n * ```\n */\n// biome-ignore lint/suspicious/noExplicitAny: Engine uses flat schema internally, public API uses ModuleSchema\nexport function createEngine<S extends Schema>(\n config: SystemConfig<any>,\n): System<any> {\n // Merge all module definitions with collision detection\n // Use Object.create(null) to prevent prototype chain traversal (e.g., \"toString\" in mergedEvents)\n const mergedSchema = Object.create(null) as S;\n const mergedEvents: EventsDef<S> = Object.create(null);\n const mergedDerive: DerivationsDef<S> = Object.create(null);\n const mergedEffects: EffectsDef<S> = Object.create(null);\n const mergedConstraints: ConstraintsDef<S> = Object.create(null);\n const mergedResolvers: ResolversDef<S> = Object.create(null);\n\n // Track which module defined each key for collision detection\n const schemaOwners = new Map<string, string>();\n\n for (const module of config.modules) {\n // Security: Validate module definitions for dangerous keys\n // Always run in all environments — this is a security boundary, not a dev convenience\n const validateKeys = (obj: object | undefined, section: string) => {\n if (!obj) return;\n for (const key of Object.keys(obj)) {\n if (BLOCKED_PROPS.has(key)) {\n throw new Error(\n `[Directive] Security: Module \"${module.id}\" has dangerous key \"${key}\" in ${section}. ` +\n `This could indicate a prototype pollution attempt.`,\n );\n }\n }\n };\n validateKeys(module.schema, \"schema\");\n validateKeys(module.events, \"events\");\n validateKeys(module.derive, \"derive\");\n validateKeys(module.effects, \"effects\");\n validateKeys(module.constraints, \"constraints\");\n validateKeys(module.resolvers, \"resolvers\");\n\n // Check for schema collisions\n if (process.env.NODE_ENV !== \"production\") {\n for (const key of Object.keys(module.schema)) {\n const existingOwner = schemaOwners.get(key);\n if (existingOwner) {\n throw new Error(\n `[Directive] Schema collision: Fact \"${key}\" is defined in both module \"${existingOwner}\" and \"${module.id}\". ` +\n `Use namespacing (e.g., \"${module.id}::${key}\") or merge into one module.`,\n );\n }\n schemaOwners.set(key, module.id);\n }\n }\n\n Object.assign(mergedSchema, module.schema);\n if (module.events) Object.assign(mergedEvents, module.events);\n if (module.derive) Object.assign(mergedDerive, module.derive);\n if (module.effects) Object.assign(mergedEffects, module.effects);\n if (module.constraints)\n Object.assign(mergedConstraints, module.constraints);\n if (module.resolvers) Object.assign(mergedResolvers, module.resolvers);\n }\n\n // Build snapshotEventNames: Set<string> | null\n // If any module declares snapshotEvents, build the filter set.\n // Modules WITHOUT snapshotEvents have all their events added (they still snapshot).\n let snapshotEventNames: Set<string> | null = null;\n // biome-ignore lint/suspicious/noExplicitAny: Module may have snapshotEvents at runtime\n const hasAnySnapshotEvents = config.modules.some(\n (m: any) => m.snapshotEvents,\n );\n if (hasAnySnapshotEvents) {\n snapshotEventNames = new Set<string>();\n for (const module of config.modules) {\n // biome-ignore lint/suspicious/noExplicitAny: Module may have snapshotEvents at runtime\n const mod = module as any;\n if (mod.snapshotEvents) {\n for (const eventName of mod.snapshotEvents) {\n snapshotEventNames.add(eventName);\n }\n } else if (mod.events) {\n // No filter — all events from this module create snapshots\n for (const eventName of Object.keys(mod.events)) {\n snapshotEventNames.add(eventName);\n }\n }\n }\n }\n\n // Snapshot intent flags — track whether the current change batch should create a snapshot\n let dispatchDepth = 0;\n let shouldTakeSnapshot = false;\n\n // Dev-mode: Warn if a fact and derivation share the same name\n if (process.env.NODE_ENV !== \"production\") {\n const derivationNames = new Set(Object.keys(mergedDerive));\n for (const key of Object.keys(mergedSchema)) {\n if (derivationNames.has(key)) {\n console.warn(\n `[Directive] \"${key}\" exists as both a fact and a derivation. ` +\n `This may cause unexpected dependency tracking behavior.`,\n );\n }\n }\n }\n\n // Create plugin manager\n const pluginManager: PluginManager<S> = createPluginManager();\n for (const plugin of config.plugins ?? []) {\n pluginManager.register(plugin);\n }\n\n // Create error boundary\n const errorBoundary: ErrorBoundaryManager = createErrorBoundaryManager({\n config: config.errorBoundary,\n onError: (error) => pluginManager.emitError(error),\n onRecovery: (error, strategy) =>\n pluginManager.emitErrorRecovery(error, strategy),\n });\n\n // Retry-later polling timer\n let retryLaterTimer: ReturnType<typeof setInterval> | null = null;\n\n // Create facts store and proxy\n // Note: We need to create a local invalidate function that will be set after derivationsManager is created\n let invalidateDerivation: (key: string) => void = () => {};\n let invalidateManyDerivations: (keys: string[]) => void = () => {};\n\n // Forward-declared so onChange/onBatch closures can check isRestoring.\n // Assigned after createTimeTravelManager() below.\n let timeTravelRef: TimeTravelManager<S> | null = null;\n\n // Run history (gated by debug.runHistory)\n const runHistoryEnabled = config.debug?.runHistory ?? false;\n const maxRuns = config.debug?.maxRuns ?? 100;\n const runHistory: RunChangelogEntry[] = [];\n const runHistoryById = new Map<number, RunChangelogEntry>();\n let runIdCounter = 0;\n let currentRun: RunChangelogEntry | null = null;\n const pendingFactChanges: Array<{\n key: string;\n oldValue: unknown;\n newValue: unknown;\n }> = [];\n // Async resolver attribution: requirementId → runId\n const resolverRunMap = new Map<string, number>();\n // Track inflight resolvers per run: runId → count of pending resolvers\n const runInflightCount = new Map<number, number>();\n // Consistent duration: track start time per run (performance.now() based)\n const runStartMs = new Map<number, number>();\n // Cached runHistory getter (E1): avoid spread on every access\n let runHistoryCache: RunChangelogEntry[] | null = null;\n let runHistoryCacheVersion = 0;\n let currentCacheVersion = 0;\n // Anomaly detection statistics\n const runStats = {\n count: 0,\n totalDuration: 0,\n avgDuration: 0,\n maxDuration: 0,\n avgResolverCount: 0,\n totalResolverCount: 0,\n avgFactChangeCount: 0,\n totalFactChangeCount: 0,\n };\n\n const { store, facts } = createFacts<S>({\n schema: mergedSchema,\n onChange: (key, value, prev) => {\n pluginManager.emitFactSet(key, value, prev);\n // Invalidate derivations so they recompute on read\n invalidateDerivation(key);\n // Track fact changes for run history\n if (runHistoryEnabled) {\n pendingFactChanges.push({\n key: String(key),\n oldValue: prev,\n newValue: value,\n });\n }\n // During time-travel restore, skip change tracking and reconciliation.\n // The restored state is already reconciled; re-reconciling would create\n // spurious snapshots that break undo/redo.\n if (timeTravelRef?.isRestoring) return;\n // Direct fact mutations (outside event dispatch) always create snapshots\n if (dispatchDepth === 0) {\n shouldTakeSnapshot = true;\n }\n state.changedKeys.add(key);\n scheduleReconcile();\n },\n onBatch: (changes) => {\n pluginManager.emitFactsBatch(changes);\n const keys: string[] = [];\n for (const change of changes) {\n keys.push(change.key);\n }\n // Track fact changes for run history\n if (runHistoryEnabled) {\n for (const change of changes) {\n if (change.type === \"delete\") {\n pendingFactChanges.push({\n key: change.key,\n oldValue: change.prev,\n newValue: undefined,\n });\n } else {\n pendingFactChanges.push({\n key: change.key,\n oldValue: change.prev,\n newValue: change.value,\n });\n }\n }\n }\n // Invalidate all affected derivations at once — listeners fire only\n // after ALL keys are invalidated, so they see consistent state.\n invalidateManyDerivations(keys);\n // During time-travel restore, skip change tracking and reconciliation.\n if (timeTravelRef?.isRestoring) return;\n // Resolver/effect batches (outside event dispatch) always create snapshots\n if (dispatchDepth === 0) {\n shouldTakeSnapshot = true;\n }\n for (const change of changes) {\n state.changedKeys.add(change.key);\n }\n scheduleReconcile();\n },\n });\n\n // Create derivations manager\n const derivationsManager: DerivationsManager<\n S,\n DerivationsDef<S>\n > = createDerivationsManager({\n definitions: mergedDerive,\n facts,\n store,\n onCompute: (id, value, oldValue, deps) => {\n pluginManager.emitDerivationCompute(id, value, deps);\n if (currentRun) {\n currentRun.derivationsRecomputed.push({\n id,\n deps: deps ? [...deps] : [],\n oldValue,\n newValue: value,\n });\n }\n },\n onInvalidate: (id) => pluginManager.emitDerivationInvalidate(id),\n onError: (id, error) => {\n const strategy = errorBoundary.handleError(\"derivation\", id, error);\n\n if (strategy === \"retry\") {\n derivationsManager.invalidate(id);\n }\n },\n });\n\n // Now wire up derivation invalidation\n invalidateDerivation = (key: string) => derivationsManager.invalidate(key);\n invalidateManyDerivations = (keys: string[]) =>\n derivationsManager.invalidateMany(keys);\n\n // Create effects manager\n const effectsManager: EffectsManager<S> = createEffectsManager({\n definitions: mergedEffects,\n facts,\n store,\n onRun: (id, deps) => {\n pluginManager.emitEffectRun(id);\n if (currentRun) {\n currentRun.effectsRun.push({\n id,\n triggeredBy: deps,\n });\n }\n },\n onError: (id, error) => {\n const strategy = errorBoundary.handleError(\"effect\", id, error);\n pluginManager.emitEffectError(id, error);\n\n if (currentRun) {\n currentRun.effectErrors.push({ id, error: String(error) });\n }\n\n if (strategy === \"disable\") {\n effectsManager.disable(id);\n }\n\n if (strategy === \"retry\") {\n state.changedKeys.add(\"*\");\n scheduleReconcile();\n }\n },\n });\n\n // Create constraints manager\n const constraintsManager: ConstraintsManager<S> = createConstraintsManager({\n definitions: mergedConstraints,\n facts,\n onEvaluate: (id, active) =>\n pluginManager.emitConstraintEvaluate(id, active),\n onError: (id, error) => {\n const strategy = errorBoundary.handleError(\"constraint\", id, error);\n pluginManager.emitConstraintError(id, error);\n\n if (strategy === \"disable\") {\n constraintsManager.disable(id);\n }\n },\n });\n\n /** Finalize a run when all its resolvers have settled */\n function finalizeRun(runId: number): void {\n const run = runHistoryById.get(runId);\n if (run && run.status === \"pending\") {\n run.status = \"settled\";\n // Consistent duration: use performance.now() when available\n const startMs = runStartMs.get(runId);\n run.duration =\n startMs !== undefined\n ? performance.now() - startMs\n : Date.now() - run.timestamp;\n runStartMs.delete(runId);\n runInflightCount.delete(runId);\n // Build causal chain on settlement\n run.causalChain = buildCausalChain(run);\n // Anomaly detection\n updateRunStats(run);\n currentCacheVersion++;\n pluginManager.emitRunComplete(run);\n }\n }\n\n /** Decrement inflight count for a run and finalize if settled */\n function decrementRunInflight(requirementId: string): void {\n const runId = resolverRunMap.get(requirementId);\n resolverRunMap.delete(requirementId);\n if (runId !== undefined) {\n const remaining = (runInflightCount.get(runId) ?? 1) - 1;\n if (remaining <= 0) {\n finalizeRun(runId);\n } else {\n runInflightCount.set(runId, remaining);\n }\n }\n }\n\n /** Evict the oldest run from the ring buffer, cleaning up associated state (C1) */\n function evictOldestRun(): void {\n const evicted = runHistory.shift();\n if (evicted) {\n runHistoryById.delete(evicted.id);\n runStartMs.delete(evicted.id);\n if (evicted.status === \"pending\") {\n runInflightCount.delete(evicted.id);\n for (const [reqId, rId] of resolverRunMap) {\n if (rId === evicted.id) {\n resolverRunMap.delete(reqId);\n }\n }\n }\n }\n }\n\n /** Build a human-readable causal chain summary from a run entry (Part 6) */\n function buildCausalChain(run: RunChangelogEntry): string {\n const parts: string[] = [];\n\n for (const fc of run.factChanges) {\n parts.push(`${fc.key} changed`);\n }\n\n for (const d of run.derivationsRecomputed) {\n parts.push(`${d.id} recomputed`);\n }\n\n for (const c of run.constraintsHit) {\n parts.push(`${c.id} constraint hit`);\n }\n\n for (const r of run.requirementsAdded) {\n parts.push(`${r.type} requirement added`);\n }\n\n for (const rs of run.resolversCompleted) {\n parts.push(`${rs.resolver} resolved (${rs.duration.toFixed(0)}ms)`);\n }\n\n for (const rs of run.resolversErrored) {\n parts.push(`${rs.resolver} errored`);\n }\n\n for (const e of run.effectsRun) {\n parts.push(`${e.id} effect ran`);\n }\n\n return parts.join(\" → \");\n }\n\n /** Update running statistics and flag anomalies on a finalized run (Part 8) */\n function updateRunStats(run: RunChangelogEntry): void {\n runStats.count++;\n runStats.totalDuration += run.duration;\n runStats.avgDuration = runStats.totalDuration / runStats.count;\n if (run.duration > runStats.maxDuration) {\n runStats.maxDuration = run.duration;\n }\n\n const resolverCount = run.resolversStarted.length;\n runStats.totalResolverCount += resolverCount;\n runStats.avgResolverCount = runStats.totalResolverCount / runStats.count;\n\n const factChangeCount = run.factChanges.length;\n runStats.totalFactChangeCount += factChangeCount;\n runStats.avgFactChangeCount =\n runStats.totalFactChangeCount / runStats.count;\n\n // Flag anomalies (only after enough data)\n const anomalies: string[] = [];\n if (runStats.count > 3 && run.duration > runStats.avgDuration * 5) {\n anomalies.push(\n `Duration ${run.duration.toFixed(0)}ms is 5x+ above average (${runStats.avgDuration.toFixed(0)}ms)`,\n );\n }\n\n if (run.resolversErrored.length > 0) {\n anomalies.push(`${run.resolversErrored.length} resolver(s) errored`);\n }\n\n if (anomalies.length > 0) {\n run.anomalies = anomalies;\n }\n }\n\n // Create resolvers manager\n const resolversManager: ResolversManager<S> = createResolversManager({\n definitions: mergedResolvers,\n facts,\n store,\n onStart: (resolver, req) => pluginManager.emitResolverStart(resolver, req),\n onComplete: (resolver, req, duration) => {\n errorBoundary.clearRetryAttempts(resolver);\n pluginManager.emitResolverComplete(resolver, req, duration);\n pluginManager.emitRequirementMet(req, resolver);\n // Mark the constraint as resolved for `after` ordering\n constraintsManager.markResolved(req.fromConstraint);\n // Attribute to the run that started this resolver\n if (runHistoryEnabled) {\n const runId = resolverRunMap.get(req.id);\n if (runId !== undefined) {\n const run = runHistoryById.get(runId);\n if (run) {\n run.resolversCompleted.push({\n resolver,\n requirementId: req.id,\n duration,\n });\n }\n }\n decrementRunInflight(req.id);\n }\n },\n onError: (resolver, req, error) => {\n const strategy = errorBoundary.handleError(\n \"resolver\",\n resolver,\n error,\n req,\n );\n pluginManager.emitResolverError(resolver, req, error);\n\n if (strategy === \"disable\") {\n constraintsManager.disable(req.fromConstraint);\n }\n\n if (strategy === \"retry\") {\n // Remove from previousRequirements so the diff sees it as \"added\" again\n state.previousRequirements.remove(req.id);\n scheduleReconcile();\n }\n\n if (strategy === \"retry-later\") {\n const pending = errorBoundary\n .getRetryLaterManager()\n .getPendingRetries();\n const entry = pending.find((p) => p.sourceId === resolver);\n\n if (entry && !entry.callback) {\n entry.callback = () => {\n scheduleReconcile();\n };\n }\n }\n\n // Attribute error to the run that started this resolver\n if (runHistoryEnabled) {\n const runId = resolverRunMap.get(req.id);\n if (runId !== undefined) {\n const run = runHistoryById.get(runId);\n if (run) {\n run.resolversErrored.push({\n resolver,\n requirementId: req.id,\n error: String(error),\n });\n }\n }\n decrementRunInflight(req.id);\n }\n },\n onRetry: (resolver, req, attempt) =>\n pluginManager.emitResolverRetry(resolver, req, attempt),\n onCancel: (resolver, req) => {\n pluginManager.emitResolverCancel(resolver, req);\n pluginManager.emitRequirementCanceled(req);\n // Decrement inflight for the run\n if (runHistoryEnabled) {\n decrementRunInflight(req.id);\n }\n },\n onResolutionComplete: () => {\n // After a resolver completes, schedule another reconcile\n notifySettlementChange();\n scheduleReconcile();\n },\n });\n\n // Time-travel listeners — notified when snapshot state changes\n const timeTravelListeners = new Set<() => void>();\n\n function notifyTimeTravelChange(): void {\n for (const listener of timeTravelListeners) {\n listener();\n }\n }\n\n // Create time-travel manager\n const timeTravelManager: TimeTravelManager<S> = config.debug?.timeTravel\n ? createTimeTravelManager({\n config: config.debug,\n facts,\n store,\n onSnapshot: (snapshot) => {\n pluginManager.emitSnapshot(snapshot);\n notifyTimeTravelChange();\n },\n onTimeTravel: (from, to) => {\n pluginManager.emitTimeTravel(from, to);\n notifyTimeTravelChange();\n },\n })\n : createDisabledTimeTravel();\n timeTravelRef = timeTravelManager;\n\n // Settlement listeners — notified when isSettled may have changed\n const settlementListeners = new Set<() => void>();\n\n function notifySettlementChange(): void {\n for (const listener of settlementListeners) {\n listener();\n }\n }\n\n // Reconcile depth guard — prevents runaway reconcile → scheduleReconcile chains\n const MAX_RECONCILE_DEPTH = 50;\n let reconcileDepth = 0;\n\n // Engine state\n const state: EngineState<S> = {\n isRunning: false,\n isReconciling: false,\n reconcileScheduled: false,\n isInitializing: false,\n isInitialized: false,\n isReady: false,\n isDestroyed: false,\n changedKeys: new Set(),\n previousRequirements: new RequirementSet(),\n readyPromise: null,\n readyResolve: null,\n };\n\n /** Schedule a reconciliation on the next microtask */\n function scheduleReconcile(): void {\n // Suppress reconciliation during initialization phase\n if (!state.isRunning || state.reconcileScheduled || state.isInitializing)\n return;\n\n state.reconcileScheduled = true;\n notifySettlementChange();\n queueMicrotask(() => {\n state.reconcileScheduled = false;\n if (state.isRunning && !state.isInitializing) {\n // Await reconcile to prevent race conditions\n // Error is caught inside reconcile, so no need to handle here\n reconcile().catch((error) => {\n // Only log unexpected errors (reconcile handles its own errors)\n if (process.env.NODE_ENV !== \"production\") {\n console.error(\"[Directive] Unexpected error in reconcile:\", error);\n }\n });\n }\n });\n }\n\n /** The main reconciliation loop */\n async function reconcile(): Promise<void> {\n if (state.isReconciling) return;\n\n reconcileDepth++;\n if (reconcileDepth > MAX_RECONCILE_DEPTH) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\n `[Directive] Reconcile loop exceeded ${MAX_RECONCILE_DEPTH} iterations. ` +\n `This usually means resolvers are creating circular requirement chains. ` +\n `Check that resolvers aren't mutating facts that re-trigger their own constraints.`,\n );\n }\n // Drain pending fact changes so they don't leak into the next run (M4)\n if (runHistoryEnabled) {\n pendingFactChanges.length = 0;\n }\n reconcileDepth = 0;\n return;\n }\n\n state.isReconciling = true;\n notifySettlementChange();\n\n const reconcileStartMs = runHistoryEnabled ? performance.now() : 0;\n\n // Start a new run entry\n if (runHistoryEnabled) {\n const runId = ++runIdCounter;\n runStartMs.set(runId, reconcileStartMs);\n currentRun = {\n id: runId,\n timestamp: Date.now(),\n duration: 0,\n status: \"pending\",\n factChanges: pendingFactChanges.splice(0), // move + clear\n derivationsRecomputed: [],\n constraintsHit: [],\n requirementsAdded: [],\n requirementsRemoved: [],\n resolversStarted: [],\n resolversCompleted: [],\n resolversErrored: [],\n effectsRun: [],\n effectErrors: [],\n };\n }\n\n try {\n // Take snapshot before reconciliation (respects snapshotEvents filtering)\n if (state.changedKeys.size > 0) {\n if (snapshotEventNames === null || shouldTakeSnapshot) {\n timeTravelManager.takeSnapshot(\n `facts-changed:${[...state.changedKeys].join(\",\")}`,\n );\n }\n shouldTakeSnapshot = false;\n }\n\n // Get snapshot for plugins\n const snapshot = facts.$snapshot() as FactsSnapshot<S>;\n pluginManager.emitReconcileStart(snapshot);\n\n // Note: Derivations are already invalidated immediately when facts change\n // (in the onChange/onBatch callbacks), so we don't need to do it here\n\n // Run effects for changed keys\n await effectsManager.runEffects(state.changedKeys);\n\n // Copy changed keys for constraint evaluation before clearing\n const keysForConstraints = new Set(state.changedKeys);\n\n // Clear changed keys\n state.changedKeys.clear();\n\n // Evaluate constraints (pass changed keys for incremental evaluation)\n const currentRequirements =\n await constraintsManager.evaluate(keysForConstraints);\n const currentSet = new RequirementSet();\n for (const req of currentRequirements) {\n currentSet.add(req);\n pluginManager.emitRequirementCreated(req);\n }\n\n // Capture which constraints produced requirements for run history\n if (currentRun) {\n const hitConstraintIds = new Set(\n currentRequirements.map((r) => r.fromConstraint),\n );\n for (const cId of hitConstraintIds) {\n const cState = constraintsManager.getState(cId);\n if (cState) {\n const cDeps = constraintsManager.getDependencies(cId);\n currentRun.constraintsHit.push({\n id: cId,\n priority: cState.priority,\n deps: cDeps ? [...cDeps] : [],\n });\n }\n }\n }\n\n // Diff with previous requirements\n const { added, removed } = currentSet.diff(state.previousRequirements);\n\n // Capture requirement diff for run history\n if (currentRun) {\n for (const req of added) {\n currentRun.requirementsAdded.push({\n id: req.id,\n type: req.requirement.type,\n fromConstraint: req.fromConstraint,\n });\n }\n for (const req of removed) {\n currentRun.requirementsRemoved.push({\n id: req.id,\n type: req.requirement.type,\n fromConstraint: req.fromConstraint,\n });\n }\n }\n\n // Cancel resolvers for removed requirements\n for (const req of removed) {\n resolversManager.cancel(req.id);\n }\n\n // Start resolvers for new requirements\n for (const req of added) {\n resolversManager.resolve(req);\n }\n\n // Capture resolver starts for run history\n if (currentRun) {\n const inflightNow = resolversManager.getInflightInfo();\n for (const req of added) {\n const info = inflightNow.find((i) => i.id === req.id);\n currentRun.resolversStarted.push({\n resolver: info?.resolverId ?? \"unknown\",\n requirementId: req.id,\n });\n // Track attribution for async completion\n resolverRunMap.set(req.id, currentRun.id);\n }\n }\n\n // Update previous requirements\n state.previousRequirements = currentSet;\n\n // Build reconcile result\n const inflightInfo = resolversManager.getInflightInfo();\n const result: ReconcileResult = {\n unmet: currentRequirements.filter(\n (r) => !resolversManager.isResolving(r.id),\n ),\n inflight: inflightInfo,\n completed: [], // Completed resolvers are tracked separately via onComplete callback\n canceled: removed.map((r) => ({\n id: r.id,\n resolverId:\n inflightInfo.find((i) => i.id === r.id)?.resolverId ?? \"unknown\",\n })),\n };\n\n pluginManager.emitReconcileEnd(result);\n\n // Mark system as ready after first successful reconcile\n if (!state.isReady) {\n state.isReady = true;\n if (state.readyResolve) {\n state.readyResolve();\n state.readyResolve = null;\n }\n }\n } finally {\n // Finalize the current run entry\n if (currentRun) {\n currentRun.duration = performance.now() - reconcileStartMs;\n\n // Skip empty runs\n const hasActivity =\n currentRun.factChanges.length > 0 ||\n currentRun.constraintsHit.length > 0 ||\n currentRun.requirementsAdded.length > 0 ||\n currentRun.effectsRun.length > 0;\n\n if (hasActivity) {\n const inflightCount = currentRun.resolversStarted.length;\n if (inflightCount === 0) {\n // No resolvers — finalize immediately\n currentRun.status = \"settled\";\n // Build causal chain for settled runs\n currentRun.causalChain = buildCausalChain(currentRun);\n // Anomaly detection\n updateRunStats(currentRun);\n runHistory.push(currentRun);\n runHistoryById.set(currentRun.id, currentRun);\n if (runHistory.length > maxRuns) {\n evictOldestRun();\n }\n currentCacheVersion++;\n pluginManager.emitRunComplete(currentRun);\n } else {\n // Has resolvers — stays pending until they settle\n currentRun.status = \"pending\";\n runHistory.push(currentRun);\n runHistoryById.set(currentRun.id, currentRun);\n if (runHistory.length > maxRuns) {\n evictOldestRun();\n }\n currentCacheVersion++;\n runInflightCount.set(currentRun.id, inflightCount);\n }\n } else {\n // Empty run — clean up start time\n runStartMs.delete(currentRun.id);\n }\n currentRun = null;\n }\n\n state.isReconciling = false;\n\n // Schedule next reconcile BEFORE notifying settlement change,\n // so listeners never see a brief isSettled=true flash when\n // more changes are pending.\n if (state.changedKeys.size > 0) {\n scheduleReconcile();\n } else if (!state.reconcileScheduled) {\n // System has settled — reset depth counter\n reconcileDepth = 0;\n }\n\n notifySettlementChange();\n }\n }\n\n // Create typed derive accessor using a Proxy\n const deriveAccessor = new Proxy({} as Record<string, unknown>, {\n get(_, prop: string | symbol) {\n if (typeof prop === \"symbol\") return undefined;\n // Prototype pollution protection\n if (BLOCKED_PROPS.has(prop)) return undefined;\n return derivationsManager.get(prop as keyof DerivationsDef<S>);\n },\n has(_, prop: string | symbol) {\n if (typeof prop === \"symbol\") return false;\n // Prototype pollution protection\n if (BLOCKED_PROPS.has(prop)) return false;\n return prop in mergedDerive;\n },\n ownKeys() {\n return Object.keys(mergedDerive);\n },\n getOwnPropertyDescriptor(_, prop: string | symbol) {\n if (typeof prop === \"symbol\") return undefined;\n // Prototype pollution protection\n if (BLOCKED_PROPS.has(prop)) return undefined;\n if (prop in mergedDerive) {\n return { configurable: true, enumerable: true };\n }\n return undefined;\n },\n });\n\n // Create typed events accessor using a Proxy\n // This provides system.events.eventName(payload) syntax\n const eventsAccessor = new Proxy(\n {} as Record<string, (payload?: Record<string, unknown>) => void>,\n {\n get(_, prop: string | symbol) {\n if (typeof prop === \"symbol\") return undefined;\n // Prototype pollution protection\n if (BLOCKED_PROPS.has(prop)) return undefined;\n // Return a function that dispatches the event\n return (payload?: Record<string, unknown>) => {\n const handler = mergedEvents[prop];\n if (handler) {\n dispatchDepth++;\n if (snapshotEventNames === null || snapshotEventNames.has(prop)) {\n shouldTakeSnapshot = true;\n }\n try {\n store.batch(() => {\n handler(facts, { type: prop, ...payload });\n });\n } finally {\n dispatchDepth--;\n }\n } else if (process.env.NODE_ENV !== \"production\") {\n console.warn(\n `[Directive] Unknown event type \"${prop}\". ` +\n `No handler is registered for this event. ` +\n `Available events: ${Object.keys(mergedEvents).join(\", \") || \"(none)\"}`,\n );\n }\n };\n },\n has(_, prop: string | symbol) {\n if (typeof prop === \"symbol\") return false;\n // Prototype pollution protection\n if (BLOCKED_PROPS.has(prop)) return false;\n return prop in mergedEvents;\n },\n ownKeys() {\n return Object.keys(mergedEvents);\n },\n getOwnPropertyDescriptor(_, prop: string | symbol) {\n if (typeof prop === \"symbol\") return undefined;\n // Prototype pollution protection\n if (BLOCKED_PROPS.has(prop)) return undefined;\n if (prop in mergedEvents) {\n return { configurable: true, enumerable: true };\n }\n return undefined;\n },\n },\n );\n\n // Create the system interface\n // biome-ignore lint/suspicious/noExplicitAny: Engine uses flat schema internally, public API uses ModuleSchema\n const system: System<any> = {\n facts,\n debug: timeTravelManager.isEnabled ? timeTravelManager : null,\n derive: deriveAccessor,\n events: eventsAccessor,\n constraints: {\n disable: (id: string) => constraintsManager.disable(id),\n enable: (id: string) => constraintsManager.enable(id),\n isDisabled: (id: string) => constraintsManager.isDisabled(id),\n },\n effects: {\n disable: (id: string) => effectsManager.disable(id),\n enable: (id: string) => effectsManager.enable(id),\n isEnabled: (id: string) => effectsManager.isEnabled(id),\n },\n\n get runHistory(): RunChangelogEntry[] | null {\n if (!runHistoryEnabled) {\n return null;\n }\n\n if (!runHistoryCache || runHistoryCacheVersion !== currentCacheVersion) {\n runHistoryCache = [...runHistory];\n runHistoryCacheVersion = currentCacheVersion;\n }\n\n return runHistoryCache;\n },\n\n initialize(): void {\n if (state.isInitialized) return;\n state.isInitializing = true;\n\n // Run module init functions (sets initial fact values)\n for (const module of config.modules) {\n if (module.init) {\n store.batch(() => {\n // biome-ignore lint/suspicious/noExplicitAny: Engine internal type coercion\n module.init!(facts as any);\n });\n }\n }\n\n // Apply initialFacts/hydrate via callback\n // This ensures initialFacts are applied AFTER module init but BEFORE reconcile\n if (config.onAfterModuleInit) {\n store.batch(() => {\n config.onAfterModuleInit!();\n });\n }\n\n state.isInitializing = false;\n state.isInitialized = true;\n\n // Eagerly compute all derivations so they're cached before any\n // external read (e.g. React's useSyncExternalStore). Without this,\n // derivations can evaluate against uninitialized facts.\n for (const id of Object.keys(mergedDerive)) {\n derivationsManager.get(id as keyof DerivationsDef<S>);\n }\n },\n\n start(): void {\n if (state.isRunning) return;\n\n // Ensure facts are initialized (no-op if already called)\n if (!state.isInitialized) {\n this.initialize();\n }\n\n state.isRunning = true;\n\n // Module onStart hooks (may access browser APIs — only in start())\n for (const module of config.modules) {\n // biome-ignore lint/suspicious/noExplicitAny: Engine internal type coercion\n module.hooks?.onStart?.(system as any);\n }\n\n // Emit start event\n pluginManager.emitStart(system);\n\n // Start retry-later polling timer if configured\n if (config.errorBoundary?.retryLater && !retryLaterTimer) {\n const intervalMs = Math.max(\n config.errorBoundary.retryLater.delayMs ?? 1000,\n 250,\n );\n\n retryLaterTimer = setInterval(\n () => {\n const dueRetries = errorBoundary.processDueRetries();\n\n for (const entry of dueRetries) {\n if (entry.callback) {\n entry.callback();\n } else {\n scheduleReconcile();\n }\n }\n },\n Math.min(intervalMs, 500),\n );\n }\n\n // Initial reconcile (now that all modules are initialized)\n scheduleReconcile();\n },\n\n stop(): void {\n if (!state.isRunning) return;\n state.isRunning = false;\n\n // Stop retry-later timer\n if (retryLaterTimer !== null) {\n clearInterval(retryLaterTimer);\n retryLaterTimer = null;\n }\n errorBoundary.getRetryLaterManager().clearAll();\n\n // Cancel all resolvers\n resolversManager.cancelAll();\n\n // Run all effect cleanups\n effectsManager.cleanupAll();\n\n // Call module hooks\n for (const module of config.modules) {\n module.hooks?.onStop?.(system);\n }\n\n // Emit stop event\n pluginManager.emitStop(system);\n },\n\n destroy(): void {\n this.stop();\n state.isDestroyed = true;\n settlementListeners.clear();\n timeTravelListeners.clear();\n // Clean up run history state (C1)\n runHistory.length = 0;\n runHistoryById.clear();\n resolverRunMap.clear();\n runInflightCount.clear();\n runStartMs.clear();\n pendingFactChanges.length = 0;\n currentRun = null;\n runHistoryCache = null;\n pluginManager.emitDestroy(system);\n },\n\n dispatch(event: SystemEvent): void {\n if (BLOCKED_PROPS.has(event.type)) return;\n const handler = mergedEvents[event.type];\n if (handler) {\n dispatchDepth++;\n if (snapshotEventNames === null || snapshotEventNames.has(event.type)) {\n shouldTakeSnapshot = true;\n }\n try {\n store.batch(() => {\n handler(facts, event);\n });\n } finally {\n dispatchDepth--;\n }\n } else if (process.env.NODE_ENV !== \"production\") {\n console.warn(\n `[Directive] Unknown event type \"${event.type}\". ` +\n `No handler is registered for this event. ` +\n `Available events: ${Object.keys(mergedEvents).join(\", \") || \"(none)\"}`,\n );\n }\n },\n\n read<T = unknown>(derivationId: string): T {\n return derivationsManager.get(\n derivationId as keyof DerivationsDef<S>,\n ) as T;\n },\n\n subscribe(ids: string[], listener: () => void): () => void {\n const derivationIds: string[] = [];\n const factKeys: string[] = [];\n\n for (const id of ids) {\n if (id in mergedDerive) {\n derivationIds.push(id);\n } else if (id in mergedSchema) {\n factKeys.push(id);\n } else if (process.env.NODE_ENV !== \"production\") {\n console.warn(`[Directive] subscribe: unknown key \"${id}\"`);\n }\n }\n\n const unsubs: Array<() => void> = [];\n if (derivationIds.length > 0) {\n unsubs.push(\n derivationsManager.subscribe(\n derivationIds as Array<keyof DerivationsDef<S>>,\n listener,\n ),\n );\n }\n if (factKeys.length > 0) {\n unsubs.push(\n store.subscribe(factKeys as Array<keyof InferSchema<S>>, listener),\n );\n }\n\n return () => {\n for (const u of unsubs) u();\n };\n },\n\n watch<T = unknown>(\n id: string,\n callback: (newValue: T, previousValue: T | undefined) => void,\n options?: { equalityFn?: (a: T, b: T | undefined) => boolean },\n ): () => void {\n const isEqual = options?.equalityFn\n ? (a: T, b: T | undefined) => options.equalityFn!(a, b)\n : (a: T, b: T | undefined) => Object.is(a, b);\n\n if (id in mergedDerive) {\n // Derivation path\n let previousValue: T | undefined = derivationsManager.get(\n id as keyof DerivationsDef<S>,\n ) as T | undefined;\n\n return derivationsManager.subscribe(\n [id as keyof DerivationsDef<S>],\n () => {\n const newValue = derivationsManager.get(\n id as keyof DerivationsDef<S>,\n ) as T;\n if (!isEqual(newValue, previousValue)) {\n const oldValue = previousValue;\n previousValue = newValue;\n callback(newValue, oldValue);\n }\n },\n );\n }\n\n // Fact path\n if (process.env.NODE_ENV !== \"production\") {\n if (!(id in mergedSchema)) {\n console.warn(`[Directive] watch: unknown key \"${id}\"`);\n }\n }\n let prev = store.get(id as keyof InferSchema<S>) as T | undefined;\n return store.subscribe([id as keyof InferSchema<S>], () => {\n const next = store.get(id as keyof InferSchema<S>) as T;\n if (!isEqual(next, prev)) {\n const old = prev;\n prev = next;\n callback(next, old);\n }\n });\n },\n\n when(\n predicate: (facts: Record<string, unknown>) => boolean,\n options?: { timeout?: number },\n ): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n // Check immediately\n const factsObj = store.toObject();\n if (predicate(factsObj)) {\n resolve();\n return;\n }\n\n let unsub: (() => void) | undefined;\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n const cleanup = () => {\n unsub?.();\n if (timer !== undefined) clearTimeout(timer);\n };\n\n // Subscribe to all fact changes\n unsub = store.subscribeAll(() => {\n const current = store.toObject();\n if (predicate(current)) {\n cleanup();\n resolve();\n }\n });\n\n // Timeout\n if (options?.timeout !== undefined && options.timeout > 0) {\n timer = setTimeout(() => {\n cleanup();\n reject(\n new Error(\n `[Directive] when: timed out after ${options.timeout}ms`,\n ),\n );\n }, options.timeout);\n }\n });\n },\n\n inspect(): SystemInspection {\n return {\n unmet: state.previousRequirements.all(),\n inflight: resolversManager.getInflightInfo(),\n constraints: constraintsManager.getAllStates().map((s) => ({\n id: s.id,\n active: s.lastResult ?? false,\n disabled: constraintsManager.isDisabled(s.id),\n priority: s.priority,\n hitCount: s.hitCount,\n lastActiveAt: s.lastActiveAt,\n })),\n resolvers: Object.fromEntries(\n resolversManager\n .getInflight()\n .map((id) => [id, resolversManager.getStatus(id)]),\n ),\n resolverDefs: Object.entries(mergedResolvers).map(([id, def]) => ({\n id,\n requirement:\n typeof def.requirement === \"string\"\n ? def.requirement\n : \"(predicate)\",\n })),\n runHistoryEnabled,\n ...(runHistoryEnabled\n ? {\n runHistory: runHistory.map((r) => ({\n ...r,\n factChanges: r.factChanges.map((fc) => ({ ...fc })),\n derivationsRecomputed: r.derivationsRecomputed.map((d) => ({\n ...d,\n deps: [...d.deps],\n })),\n constraintsHit: r.constraintsHit.map((c) => ({\n ...c,\n deps: [...c.deps],\n })),\n requirementsAdded: r.requirementsAdded.map((ra) => ({ ...ra })),\n requirementsRemoved: r.requirementsRemoved.map((rr) => ({\n ...rr,\n })),\n resolversStarted: r.resolversStarted.map((rs) => ({ ...rs })),\n resolversCompleted: r.resolversCompleted.map((rc) => ({\n ...rc,\n })),\n resolversErrored: r.resolversErrored.map((re) => ({ ...re })),\n effectsRun: r.effectsRun.map((e) => ({\n ...e,\n triggeredBy: [...e.triggeredBy],\n })),\n effectErrors: r.effectErrors.map((ee) => ({ ...ee })),\n })),\n }\n : {}),\n };\n },\n\n explain(requirementId: string): string | null {\n // Find the requirement in current unmet requirements\n const requirements = state.previousRequirements.all();\n const req = requirements.find((r) => r.id === requirementId);\n\n if (!req) {\n return null;\n }\n\n const constraintState = constraintsManager.getState(req.fromConstraint);\n const resolverStatus = resolversManager.getStatus(requirementId);\n\n // Get relevant facts by looking at the constraint's last known state\n const relevantFacts: Record<string, unknown> = {};\n const factsSnapshot = store.toObject();\n\n // Include all facts for now (could be optimized with dependency tracking)\n for (const [key, value] of Object.entries(factsSnapshot)) {\n relevantFacts[key] = value;\n }\n\n const lines: string[] = [\n `Requirement \"${req.requirement.type}\" (id: ${req.id})`,\n `├─ Produced by constraint: ${req.fromConstraint}`,\n `├─ Constraint priority: ${constraintState?.priority ?? 0}`,\n `├─ Constraint active: ${constraintState?.lastResult ?? \"unknown\"}`,\n `├─ Resolver status: ${resolverStatus.state}`,\n ];\n\n // Add requirement details\n const reqDetails = Object.entries(req.requirement)\n .filter(([k]) => k !== \"type\")\n .map(([k, v]) => `${k}=${JSON.stringify(v)}`)\n .join(\", \");\n if (reqDetails) {\n lines.push(`├─ Requirement payload: { ${reqDetails} }`);\n }\n\n // Add relevant facts (limit to prevent huge output)\n const factEntries = Object.entries(relevantFacts).slice(0, 10);\n if (factEntries.length > 0) {\n lines.push(`└─ Relevant facts:`);\n factEntries.forEach(([k, v], i) => {\n const prefix = i === factEntries.length - 1 ? \" └─\" : \" ├─\";\n const valueStr =\n typeof v === \"object\" ? JSON.stringify(v) : String(v);\n lines.push(\n `${prefix} ${k} = ${valueStr.slice(0, 50)}${valueStr.length > 50 ? \"...\" : \"\"}`,\n );\n });\n }\n\n return lines.join(\"\\n\");\n },\n\n async settle(maxWait = 5000): Promise<void> {\n const startTime = Date.now();\n\n // Use while loop instead of recursion to prevent stack overflow\n while (true) {\n // Flush any pending batches so they start executing\n if (resolversManager.hasPendingBatches()) {\n resolversManager.processBatches();\n }\n\n // Wait for any pending microtasks\n await new Promise((resolve) => setTimeout(resolve, 0));\n\n // Check if we have inflight resolvers or unmet requirements with resolvers\n const inspection = this.inspect();\n const settled =\n inspection.inflight.length === 0 &&\n !state.isReconciling &&\n !state.reconcileScheduled &&\n !resolversManager.hasPendingBatches();\n\n if (settled) {\n return;\n }\n\n // Check timeout\n if (Date.now() - startTime > maxWait) {\n const details: string[] = [];\n if (inspection.inflight.length > 0) {\n details.push(\n `${inspection.inflight.length} resolvers inflight: ${inspection.inflight.map((r) => r.resolverId).join(\", \")}`,\n );\n }\n if (state.isReconciling) {\n details.push(\"reconciliation in progress\");\n }\n if (state.reconcileScheduled) {\n details.push(\"reconcile scheduled\");\n }\n // Include pending requirements for better debugging\n const unmet = state.previousRequirements.all();\n if (unmet.length > 0) {\n details.push(\n `${unmet.length} unmet requirements: ${unmet.map((r) => r.requirement.type).join(\", \")}`,\n );\n }\n throw new Error(\n `[Directive] settle() timed out after ${maxWait}ms. ${details.join(\"; \")}`,\n );\n }\n\n // Wait a bit and check again\n await new Promise((resolve) => setTimeout(resolve, 10));\n }\n },\n\n getSnapshot() {\n return {\n facts: store.toObject(),\n version: 1,\n };\n },\n\n getDistributableSnapshot<T = Record<string, unknown>>(\n options: {\n includeDerivations?: string[];\n excludeDerivations?: string[];\n includeFacts?: string[];\n ttlSeconds?: number;\n metadata?: Record<string, unknown>;\n includeVersion?: boolean;\n } = {},\n ): {\n data: T;\n createdAt: number;\n expiresAt?: number;\n version?: string;\n metadata?: Record<string, unknown>;\n } {\n const {\n includeDerivations,\n excludeDerivations,\n includeFacts,\n ttlSeconds,\n metadata,\n includeVersion,\n } = options;\n\n const data: Record<string, unknown> = {};\n\n // Collect derivation keys to include\n const allDerivationKeys = Object.keys(mergedDerive);\n let derivationKeys: string[];\n\n if (includeDerivations) {\n // Only include specified derivations\n derivationKeys = includeDerivations.filter((k) =>\n allDerivationKeys.includes(k),\n );\n\n // Warn about unknown derivation keys in dev mode\n if (process.env.NODE_ENV !== \"production\") {\n const unknown = includeDerivations.filter(\n (k) => !allDerivationKeys.includes(k),\n );\n if (unknown.length > 0) {\n console.warn(\n `[Directive] getDistributableSnapshot: Unknown derivation keys ignored: ${unknown.join(\", \")}. ` +\n `Available: ${allDerivationKeys.join(\", \") || \"(none)\"}`,\n );\n }\n }\n } else {\n // Include all derivations by default\n derivationKeys = allDerivationKeys;\n }\n\n // Apply exclusions\n if (excludeDerivations) {\n const excludeSet = new Set(excludeDerivations);\n derivationKeys = derivationKeys.filter((k) => !excludeSet.has(k));\n }\n\n // Read derivation values\n for (const key of derivationKeys) {\n try {\n data[key] = derivationsManager.get(key as keyof DerivationsDef<S>);\n } catch (error) {\n // Skip derivations that error during computation\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\n `[Directive] getDistributableSnapshot: Skipping derivation \"${key}\" due to error:`,\n error,\n );\n }\n }\n }\n\n // Include specified facts\n if (includeFacts && includeFacts.length > 0) {\n const factsSnapshot = store.toObject();\n const allFactKeys = Object.keys(factsSnapshot);\n\n // Warn about unknown fact keys in dev mode\n if (process.env.NODE_ENV !== \"production\") {\n const unknown = includeFacts.filter((k) => !(k in factsSnapshot));\n if (unknown.length > 0) {\n console.warn(\n `[Directive] getDistributableSnapshot: Unknown fact keys ignored: ${unknown.join(\", \")}. ` +\n `Available: ${allFactKeys.join(\", \") || \"(none)\"}`,\n );\n }\n }\n\n for (const key of includeFacts) {\n if (key in factsSnapshot) {\n data[key] = factsSnapshot[key];\n }\n }\n }\n\n // Build the snapshot\n const createdAt = Date.now();\n const snapshot: {\n data: T;\n createdAt: number;\n expiresAt?: number;\n version?: string;\n metadata?: Record<string, unknown>;\n } = {\n data: data as T,\n createdAt,\n };\n\n // Add TTL\n if (ttlSeconds !== undefined && ttlSeconds > 0) {\n snapshot.expiresAt = createdAt + ttlSeconds * 1000;\n }\n\n // Add version hash\n if (includeVersion) {\n // Simple version hash based on data content\n snapshot.version = hashObject(data);\n }\n\n // Add metadata\n if (metadata) {\n snapshot.metadata = metadata;\n }\n\n return snapshot;\n },\n\n watchDistributableSnapshot<T = Record<string, unknown>>(\n options: {\n includeDerivations?: string[];\n excludeDerivations?: string[];\n includeFacts?: string[];\n ttlSeconds?: number;\n metadata?: Record<string, unknown>;\n includeVersion?: boolean;\n },\n callback: (snapshot: {\n data: T;\n createdAt: number;\n expiresAt?: number;\n version?: string;\n metadata?: Record<string, unknown>;\n }) => void,\n ): () => void {\n const { includeDerivations, excludeDerivations } = options;\n\n // Determine which derivations to watch\n const allDerivationKeys = Object.keys(mergedDerive);\n let derivationKeys: string[];\n\n if (includeDerivations) {\n derivationKeys = includeDerivations.filter((k) =>\n allDerivationKeys.includes(k),\n );\n } else {\n derivationKeys = allDerivationKeys;\n }\n\n if (excludeDerivations) {\n const excludeSet = new Set(excludeDerivations);\n derivationKeys = derivationKeys.filter((k) => !excludeSet.has(k));\n }\n\n if (derivationKeys.length === 0) {\n // Nothing to watch, return no-op unsubscribe\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\n \"[Directive] watchDistributableSnapshot: No derivations to watch. \" +\n \"Callback will never be called.\",\n );\n }\n return () => {};\n }\n\n // Get initial snapshot to seed version and ensure derivations are computed\n // (derivations must be computed before subscribing so listeners are called on invalidation)\n const initialSnapshot = this.getDistributableSnapshot<T>({\n ...options,\n includeVersion: true,\n });\n let previousVersion = initialSnapshot.version;\n\n // Subscribe to all watched derivations\n return derivationsManager.subscribe(\n derivationKeys as Array<keyof DerivationsDef<S>>,\n () => {\n // Generate a new snapshot\n const snapshot = this.getDistributableSnapshot<T>({\n ...options,\n // Always include version for change detection\n includeVersion: true,\n });\n\n // Only call callback if snapshot actually changed\n if (snapshot.version !== previousVersion) {\n previousVersion = snapshot.version;\n callback(snapshot);\n }\n },\n );\n },\n\n restore(snapshot) {\n if (!snapshot || typeof snapshot !== \"object\") {\n throw new Error(\n \"[Directive] restore() requires a valid snapshot object\",\n );\n }\n if (!snapshot.facts || typeof snapshot.facts !== \"object\") {\n throw new Error(\n \"[Directive] restore() snapshot must have a facts object\",\n );\n }\n\n // Security: Validate snapshot for prototype pollution\n if (!isPrototypeSafe(snapshot)) {\n throw new Error(\n \"[Directive] restore() rejected: snapshot contains potentially dangerous keys \" +\n \"(__proto__, constructor, or prototype). This may indicate a prototype pollution attack.\",\n );\n }\n\n store.batch(() => {\n for (const [key, value] of Object.entries(snapshot.facts)) {\n // Skip dangerous keys (defense in depth)\n if (BLOCKED_PROPS.has(key)) continue;\n store.set(\n key as keyof InferSchema<S>,\n value as InferSchema<S>[keyof InferSchema<S>],\n );\n }\n });\n },\n\n onSettledChange(listener: () => void): () => void {\n settlementListeners.add(listener);\n return () => {\n settlementListeners.delete(listener);\n };\n },\n\n onTimeTravelChange(listener: () => void): () => void {\n timeTravelListeners.add(listener);\n return () => {\n timeTravelListeners.delete(listener);\n };\n },\n\n batch(fn: () => void): void {\n store.batch(fn);\n },\n\n get isSettled(): boolean {\n return (\n resolversManager.getInflight().length === 0 &&\n !resolversManager.hasPendingBatches() &&\n !state.isReconciling &&\n !state.reconcileScheduled\n );\n },\n\n get isRunning(): boolean {\n return state.isRunning;\n },\n\n get isInitialized(): boolean {\n return state.isInitialized;\n },\n\n get isReady(): boolean {\n return state.isReady;\n },\n\n whenReady(): Promise<void> {\n // If already ready, resolve immediately\n if (state.isReady) {\n return Promise.resolve();\n }\n\n // If not running, the promise would never resolve\n if (!state.isRunning) {\n return Promise.reject(\n new Error(\n \"[Directive] whenReady() called before start(). \" +\n \"Call system.start() first, then await system.whenReady().\",\n ),\n );\n }\n\n // Create promise if not exists\n if (!state.readyPromise) {\n state.readyPromise = new Promise<void>((resolve) => {\n state.readyResolve = resolve;\n });\n }\n\n return state.readyPromise;\n },\n };\n\n /**\n * Register a new module into a running (or stopped) engine.\n * Merges the module's schema, events, derive, effects, constraints, and resolvers\n * into the existing engine state, runs init, and triggers reconciliation.\n */\n function registerModule(module: {\n id: string;\n schema: Record<string, unknown>;\n requirements?: Record<string, unknown>;\n init?: (facts: unknown) => void;\n derive?: Record<string, (facts: unknown, derive: unknown) => unknown>;\n events?: Record<string, (facts: unknown, event: unknown) => void>;\n effects?: Record<string, unknown>;\n constraints?: Record<string, unknown>;\n resolvers?: Record<string, unknown>;\n hooks?: {\n onInit?: (s: unknown) => void;\n onStart?: (s: unknown) => void;\n onStop?: (s: unknown) => void;\n onError?: (e: unknown, ctx: unknown) => void;\n };\n snapshotEvents?: string[];\n }): void {\n // Guard: cannot register during reconciliation (would corrupt iteration state)\n if (state.isReconciling) {\n throw new Error(\n `[Directive] Cannot register module \"${module.id}\" during reconciliation. ` +\n `Wait for the current reconciliation cycle to complete.`,\n );\n }\n\n // Guard: cannot register on a destroyed system\n if (state.isDestroyed) {\n throw new Error(\n `[Directive] Cannot register module \"${module.id}\" on a destroyed system.`,\n );\n }\n\n // Security: validate keys\n const validateKeys = (obj: object | undefined, section: string) => {\n if (!obj) return;\n for (const key of Object.keys(obj)) {\n if (BLOCKED_PROPS.has(key)) {\n throw new Error(\n `[Directive] Security: Module \"${module.id}\" has dangerous key \"${key}\" in ${section}.`,\n );\n }\n }\n };\n validateKeys(module.schema, \"schema\");\n validateKeys(module.events, \"events\");\n validateKeys(module.derive, \"derive\");\n validateKeys(module.effects, \"effects\");\n validateKeys(module.constraints, \"constraints\");\n validateKeys(module.resolvers, \"resolvers\");\n\n // Schema collision detection (unconditional — production collision would cause data corruption)\n for (const key of Object.keys(module.schema)) {\n if (key in mergedSchema) {\n throw new Error(\n `[Directive] Schema collision: Fact \"${key}\" already exists. Cannot register module \"${module.id}\".`,\n );\n }\n }\n // Fact/derivation name collision check (dev-only warning)\n if (process.env.NODE_ENV !== \"production\" && module.derive) {\n const existingFactKeys = new Set(Object.keys(mergedSchema));\n for (const key of Object.keys(module.derive)) {\n if (existingFactKeys.has(key)) {\n console.warn(\n `[Directive] \"${key}\" exists as both a fact and a derivation after registering module \"${module.id}\".`,\n );\n }\n }\n }\n\n // Update snapshotEventNames BEFORE merging events so we capture pre-merge state\n if (module.snapshotEvents) {\n if (snapshotEventNames === null) {\n // First module with snapshotEvents — initialize the set with all existing event names\n snapshotEventNames = new Set<string>(Object.keys(mergedEvents));\n }\n for (const eventName of module.snapshotEvents) {\n snapshotEventNames.add(eventName);\n }\n } else if (snapshotEventNames !== null && module.events) {\n // Filtering is active and this module has no filter — add all its events\n for (const eventName of Object.keys(module.events)) {\n snapshotEventNames.add(eventName);\n }\n }\n\n // Merge into existing engine state\n Object.assign(mergedSchema, module.schema);\n if (module.events) Object.assign(mergedEvents, module.events);\n if (module.derive) {\n Object.assign(mergedDerive, module.derive);\n // Register new derivations with the derivations manager\n derivationsManager.registerDefinitions(\n module.derive as DerivationsDef<S>,\n );\n }\n if (module.effects) {\n Object.assign(mergedEffects, module.effects);\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic module registration\n effectsManager.registerDefinitions(module.effects as any);\n }\n if (module.constraints) {\n Object.assign(mergedConstraints, module.constraints);\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic module registration\n constraintsManager.registerDefinitions(module.constraints as any);\n }\n if (module.resolvers) {\n Object.assign(mergedResolvers, module.resolvers);\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic module registration\n resolversManager.registerDefinitions(module.resolvers as any);\n }\n\n // Register new schema keys with the facts store\n // biome-ignore lint/suspicious/noExplicitAny: Internal dynamic method\n (store as any).registerKeys(module.schema as Record<string, unknown>);\n\n // Track the new module in config.modules for hooks\n config.modules.push(module as (typeof config.modules)[number]);\n\n // Run init within a batch\n if (module.init) {\n store.batch(() => {\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic module init\n module.init!(facts as any);\n });\n }\n\n // Call lifecycle hooks\n module.hooks?.onInit?.(system);\n if (state.isRunning) {\n module.hooks?.onStart?.(system);\n // Trigger reconciliation to evaluate new constraints\n scheduleReconcile();\n }\n }\n\n // Attach registerModule to system\n (system as unknown as Record<string, unknown>).registerModule =\n registerModule;\n\n // Initialize plugins\n pluginManager.emitInit(system);\n\n // Call module init hooks\n for (const module of config.modules) {\n module.hooks?.onInit?.(system);\n }\n\n return system;\n}\n","/**\n * System - The top-level API for creating a Directive runtime\n *\n * A system combines modules with plugins and configuration.\n * Modules are passed as an object with namespaced access:\n *\n * @example\n * ```typescript\n * const system = createSystem({\n * modules: { auth: authModule, data: dataModule },\n * });\n *\n * system.facts.auth.token // Namespaced facts\n * system.derive.data.userCount // Namespaced derivations\n * system.events.auth.login() // Namespaced events\n * ```\n */\n\nimport { isPrototypeSafe } from \"../utils/utils.js\";\nimport { createEngine } from \"./engine.js\";\nimport type {\n CreateSystemOptionsNamed,\n CreateSystemOptionsSingle,\n ModuleDef,\n ModuleSchema,\n ModulesMap,\n NamespacedSystem,\n SingleModuleSystem,\n} from \"./types.js\";\n\n// ============================================================================\n// Blocked Properties (Security)\n// ============================================================================\n\nconst BLOCKED_PROPS = Object.freeze(\n new Set([\"__proto__\", \"constructor\", \"prototype\"]),\n);\n\n/** Namespace separator for internal key prefixing (e.g., \"auth::token\") */\nconst SEPARATOR = \"::\";\n\n// ============================================================================\n// Topological Sort for Module Dependencies\n// ============================================================================\n\n/**\n * Perform topological sort on modules based on crossModuleDeps.\n * Returns module namespaces in dependency order (dependencies first).\n *\n * @throws Error if circular dependency detected\n */\nfunction topologicalSort<Modules extends ModulesMap>(\n modulesMap: Modules,\n): Array<keyof Modules & string> {\n const namespaces = Object.keys(modulesMap) as Array<keyof Modules & string>;\n const visited = new Set<string>();\n const visiting = new Set<string>(); // For cycle detection\n const result: Array<keyof Modules & string> = [];\n const path: string[] = []; // Reuse array to avoid O(n²) memory\n\n function visit(namespace: string): void {\n if (visited.has(namespace)) return;\n\n // Cycle detection\n if (visiting.has(namespace)) {\n const cycleStart = path.indexOf(namespace);\n const cycle = [...path.slice(cycleStart), namespace].join(\" → \");\n throw new Error(\n `[Directive] Circular dependency detected: ${cycle}. ` +\n `Modules cannot have circular crossModuleDeps. ` +\n `Break the cycle by removing one of the cross-module references.`,\n );\n }\n\n visiting.add(namespace);\n path.push(namespace);\n\n // Visit dependencies first\n const mod = modulesMap[namespace];\n if (mod?.crossModuleDeps) {\n for (const depNamespace of Object.keys(mod.crossModuleDeps)) {\n if (namespaces.includes(depNamespace as keyof Modules & string)) {\n visit(depNamespace);\n }\n }\n }\n\n path.pop();\n visiting.delete(namespace);\n visited.add(namespace);\n result.push(namespace as keyof Modules & string);\n }\n\n for (const namespace of namespaces) {\n visit(namespace);\n }\n\n return result;\n}\n\n// ============================================================================\n// Proxy Cache (Performance)\n// ============================================================================\n\n/**\n * WeakMap to cache module facts proxies. Keyed by the facts store object.\n * Inner map is keyed by namespace string.\n */\nconst moduleFactsProxyCache = new WeakMap<\n Record<string, unknown>,\n Map<string, Record<string, unknown>>\n>();\n\n/**\n * WeakMap to cache namespaced facts proxies.\n */\nconst namespacedFactsProxyCache = new WeakMap<\n Record<string, unknown>,\n Record<string, Record<string, unknown>>\n>();\n\n/**\n * WeakMap to cache namespaced derive proxies.\n */\nconst namespacedDeriveProxyCache = new WeakMap<\n Record<string, unknown>,\n Record<string, Record<string, unknown>>\n>();\n\n/**\n * WeakMap to cache module derive proxies.\n */\nconst moduleDeriveProxyCache = new WeakMap<\n Record<string, unknown>,\n Map<string, Record<string, unknown>>\n>();\n\n// ============================================================================\n// createSystem\n// ============================================================================\n\n/**\n * Create a Directive system.\n *\n * Supports two modes:\n * - **Single module**: Use `module` prop for direct access without namespace\n * - **Multiple modules**: Use `modules` prop for namespaced access\n *\n * @example Single module (direct access)\n * ```ts\n * const system = createSystem({ module: counterModule });\n * system.facts.count // Direct access\n * system.events.increment() // Direct events\n * ```\n *\n * @example Multiple modules (namespaced access)\n * ```ts\n * const system = createSystem({\n * modules: { auth: authModule, data: dataModule },\n * });\n * system.facts.auth.token // Namespaced access\n * system.events.auth.login() // Namespaced events\n * ```\n */\nexport function createSystem<S extends ModuleSchema>(\n options: CreateSystemOptionsSingle<S>,\n): SingleModuleSystem<S>;\nexport function createSystem<const Modules extends ModulesMap>(\n options: CreateSystemOptionsNamed<Modules>,\n): NamespacedSystem<Modules>;\nexport function createSystem<\n S extends ModuleSchema,\n Modules extends ModulesMap,\n>(\n options: CreateSystemOptionsSingle<S> | CreateSystemOptionsNamed<Modules>,\n): SingleModuleSystem<S> | NamespacedSystem<Modules> {\n // Single module mode (module prop)\n if (\"module\" in options) {\n if (!options.module) {\n throw new Error(\n \"[Directive] createSystem requires a module. Got: \" +\n typeof options.module,\n );\n }\n return createSingleModuleSystem(\n options as CreateSystemOptionsSingle<S>,\n ) as SingleModuleSystem<S>;\n }\n\n // Namespaced mode (modules prop)\n const namedOptions = options as CreateSystemOptionsNamed<Modules>;\n\n // Validate not an array\n if (Array.isArray(namedOptions.modules)) {\n throw new Error(\n `[Directive] createSystem expects modules as an object, not an array.\\n\\n` +\n `Instead of:\\n` +\n ` createSystem({ modules: [authModule, dataModule] })\\n\\n` +\n `Use:\\n` +\n ` createSystem({ modules: { auth: authModule, data: dataModule } })\\n\\n` +\n `Or for a single module:\\n` +\n ` createSystem({ module: counterModule })`,\n );\n }\n\n return createNamespacedSystem(namedOptions) as NamespacedSystem<Modules>;\n}\n\n// ============================================================================\n// Internal Implementation\n// ============================================================================\n\nfunction createNamespacedSystem<Modules extends ModulesMap>(\n options: CreateSystemOptionsNamed<Modules>,\n): NamespacedSystem<Modules> {\n const modulesMap = options.modules;\n const moduleNamespaces = new Set(Object.keys(modulesMap));\n\n // Build snapshot module filter set (null = all modules snapshot)\n const snapshotModulesSet = options.debug?.snapshotModules\n ? new Set(options.debug.snapshotModules)\n : null;\n\n // Validate tickMs if provided\n if (options.tickMs !== undefined && options.tickMs <= 0) {\n throw new Error(\"[Directive] tickMs must be a positive number\");\n }\n\n // Dev-mode: Validate crossModuleDeps reference existing modules\n if (process.env.NODE_ENV !== \"production\") {\n for (const [namespace, mod] of Object.entries(modulesMap)) {\n if (mod.crossModuleDeps) {\n for (const depNamespace of Object.keys(mod.crossModuleDeps)) {\n if (depNamespace === namespace) {\n console.warn(\n `[Directive] Module \"${namespace}\" references itself in crossModuleDeps. ` +\n `Use \"facts.self\" to access own module's facts instead.`,\n );\n } else if (!moduleNamespaces.has(depNamespace)) {\n console.warn(\n `[Directive] Module \"${namespace}\" declares crossModuleDeps.${depNamespace}, ` +\n `but no module with namespace \"${depNamespace}\" exists in the system. ` +\n `Available modules: ${[...moduleNamespaces].join(\", \")}`,\n );\n }\n }\n }\n }\n }\n\n // Dev-mode: Validate snapshotModules references existing modules\n if (process.env.NODE_ENV !== \"production\" && options.debug?.snapshotModules) {\n for (const name of options.debug.snapshotModules) {\n if (!moduleNamespaces.has(name)) {\n console.warn(\n `[Directive] debug.snapshotModules entry \"${name}\" doesn't match any module. ` +\n `Available modules: ${[...moduleNamespaces].join(\", \")}`,\n );\n }\n }\n }\n\n // Determine module initialization order\n let orderedNamespaces: Array<keyof Modules & string>;\n const initOrder = options.initOrder ?? \"auto\";\n\n if (Array.isArray(initOrder)) {\n // Explicit order provided - validate it includes all modules\n const explicitOrder = initOrder as Array<keyof Modules & string>;\n const missingModules = Object.keys(modulesMap).filter(\n (ns) => !explicitOrder.includes(ns as keyof Modules & string),\n );\n if (missingModules.length > 0) {\n throw new Error(\n `[Directive] initOrder is missing modules: ${missingModules.join(\", \")}. ` +\n `All modules must be included in the explicit order.`,\n );\n }\n orderedNamespaces = explicitOrder;\n } else if (initOrder === \"declaration\") {\n // Use object key order (current behavior)\n orderedNamespaces = Object.keys(modulesMap) as Array<\n keyof Modules & string\n >;\n } else {\n // \"auto\" - use topological sort based on crossModuleDeps\n orderedNamespaces = topologicalSort(modulesMap);\n }\n\n // Apply zero-config defaults if enabled\n let debug = options.debug;\n let errorBoundary = options.errorBoundary;\n\n if (options.zeroConfig) {\n const isDev = process.env.NODE_ENV !== \"production\";\n\n debug = {\n timeTravel: isDev,\n maxSnapshots: 100,\n ...options.debug,\n };\n\n errorBoundary = {\n onConstraintError: \"skip\",\n onResolverError: \"skip\",\n onEffectError: \"skip\",\n onDerivationError: \"skip\",\n ...options.errorBoundary,\n };\n }\n\n // Validate module names and schema keys don't contain the separator\n for (const namespace of Object.keys(modulesMap)) {\n if (namespace.includes(SEPARATOR)) {\n throw new Error(\n `[Directive] Module name \"${namespace}\" contains the reserved separator \"${SEPARATOR}\". ` +\n `Module names cannot contain \"${SEPARATOR}\".`,\n );\n }\n const mod = modulesMap[namespace];\n if (mod) {\n for (const key of Object.keys(mod.schema.facts)) {\n if (key.includes(SEPARATOR)) {\n throw new Error(\n `[Directive] Schema key \"${key}\" in module \"${namespace}\" contains the reserved separator \"${SEPARATOR}\". ` +\n `Schema keys cannot contain \"${SEPARATOR}\".`,\n );\n }\n }\n }\n }\n\n // Transform modules to flat format with prefixed keys\n // auth.token → auth::token internally\n // Process in dependency order (determined above)\n const flatModules: Array<ModuleDef<ModuleSchema>> = [];\n\n for (const namespace of orderedNamespaces) {\n const mod = modulesMap[namespace];\n if (!mod) continue; // TypeScript guard - should never happen\n // Compute cross-module deps info once per module (used by derive, constraints, effects)\n const hasCrossModuleDeps =\n mod.crossModuleDeps && Object.keys(mod.crossModuleDeps).length > 0;\n const depNamespaces = hasCrossModuleDeps\n ? Object.keys(mod.crossModuleDeps!)\n : [];\n\n // Prefix all fact keys with namespace\n const prefixedFacts: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(mod.schema.facts)) {\n prefixedFacts[`${namespace}${SEPARATOR}${key}`] = value;\n }\n\n // Prefix all derivation keys with namespace\n const prefixedDerivations: Record<string, unknown> = {};\n if (mod.schema.derivations) {\n for (const [key, value] of Object.entries(mod.schema.derivations)) {\n prefixedDerivations[`${namespace}${SEPARATOR}${key}`] = value;\n }\n }\n\n // Prefix all event keys with namespace\n const prefixedEvents: Record<string, unknown> = {};\n if (mod.schema.events) {\n for (const [key, value] of Object.entries(mod.schema.events)) {\n prefixedEvents[`${namespace}${SEPARATOR}${key}`] = value;\n }\n }\n\n // Transform init to use prefixed keys\n // biome-ignore lint/suspicious/noExplicitAny: Facts proxy type coercion\n const prefixedInit = mod.init\n ? (facts: any) => {\n // Create a proxy that translates unprefixed keys to prefixed\n const moduleFactsProxy = createModuleFactsProxy(facts, namespace);\n // biome-ignore lint/suspicious/noExplicitAny: Module init type coercion\n (mod.init as any)(moduleFactsProxy);\n }\n : undefined;\n\n // Transform derive functions to use prefixed keys\n const prefixedDerive: Record<\n string,\n (facts: unknown, derive: unknown) => unknown\n > = {};\n if (mod.derive) {\n for (const [key, fn] of Object.entries(mod.derive)) {\n prefixedDerive[`${namespace}${SEPARATOR}${key}`] = (\n facts: unknown,\n derive: unknown,\n ) => {\n // Use cross-module proxy (facts.self + facts.{dep}) if crossModuleDeps is defined\n // Otherwise use flat access to own module only\n const factsProxy = hasCrossModuleDeps\n ? createCrossModuleFactsProxy(\n facts as Record<string, unknown>,\n namespace,\n depNamespaces,\n )\n : createModuleFactsProxy(\n facts as Record<string, unknown>,\n namespace,\n );\n // Derive proxy stays scoped to own module\n const deriveProxy = createModuleDeriveProxy(\n derive as Record<string, unknown>,\n namespace,\n );\n // biome-ignore lint/suspicious/noExplicitAny: Derive function type coercion\n return (fn as any)(factsProxy, deriveProxy);\n };\n }\n }\n\n // Transform event handlers to use prefixed keys\n const prefixedEventHandlers: Record<\n string,\n (facts: unknown, event: unknown) => void\n > = {};\n if (mod.events) {\n for (const [key, handler] of Object.entries(mod.events)) {\n prefixedEventHandlers[`${namespace}${SEPARATOR}${key}`] = (\n facts: unknown,\n event: unknown,\n ) => {\n const moduleFactsProxy = createModuleFactsProxy(\n facts as Record<string, unknown>,\n namespace,\n );\n // biome-ignore lint/suspicious/noExplicitAny: Event handler type coercion\n (handler as any)(moduleFactsProxy, event);\n };\n }\n }\n\n // Transform constraints to use namespaced facts proxy\n const prefixedConstraints: Record<string, unknown> = {};\n if (mod.constraints) {\n for (const [key, constraint] of Object.entries(mod.constraints)) {\n const constraintDef = constraint as {\n when: (facts: unknown) => boolean | Promise<boolean>;\n require: unknown | ((facts: unknown) => unknown);\n priority?: number;\n async?: boolean;\n timeout?: number;\n deps?: string[];\n };\n\n prefixedConstraints[`${namespace}${SEPARATOR}${key}`] = {\n ...constraintDef,\n // Transform deps to use prefixed keys\n deps: constraintDef.deps?.map(\n (dep) => `${namespace}${SEPARATOR}${dep}`,\n ),\n when: (facts: unknown) => {\n // Use cross-module proxy (facts.self + facts.{dep}) if crossModuleDeps is defined\n // Otherwise use module-scoped proxy for direct access (facts.key → namespace::key)\n const factsProxy = hasCrossModuleDeps\n ? createCrossModuleFactsProxy(\n facts as Record<string, unknown>,\n namespace,\n depNamespaces,\n )\n : createModuleFactsProxy(\n facts as Record<string, unknown>,\n namespace,\n );\n return constraintDef.when(factsProxy);\n },\n require:\n typeof constraintDef.require === \"function\"\n ? (facts: unknown) => {\n const factsProxy = hasCrossModuleDeps\n ? createCrossModuleFactsProxy(\n facts as Record<string, unknown>,\n namespace,\n depNamespaces,\n )\n : createModuleFactsProxy(\n facts as Record<string, unknown>,\n namespace,\n );\n return (constraintDef.require as (facts: unknown) => unknown)(\n factsProxy,\n );\n }\n : constraintDef.require,\n };\n }\n }\n\n // Transform resolvers to use namespaced facts proxy\n const prefixedResolvers: Record<string, unknown> = {};\n if (mod.resolvers) {\n for (const [key, resolver] of Object.entries(mod.resolvers)) {\n const resolverDef = resolver as {\n requirement: string;\n resolve: (\n req: unknown,\n ctx: { facts: unknown; signal: AbortSignal },\n ) => Promise<void>;\n key?: (req: unknown) => string;\n retry?: unknown;\n timeout?: number;\n };\n\n prefixedResolvers[`${namespace}${SEPARATOR}${key}`] = {\n ...resolverDef,\n resolve: async (\n req: unknown,\n ctx: { facts: unknown; signal: AbortSignal },\n ) => {\n const namespacedFacts = createNamespacedFactsProxy(\n ctx.facts as Record<string, unknown>,\n modulesMap,\n () => Object.keys(modulesMap),\n );\n await resolverDef.resolve(req, {\n facts: namespacedFacts[namespace],\n signal: ctx.signal,\n });\n },\n };\n }\n }\n\n // Transform effects to use namespaced facts proxy\n const prefixedEffects: Record<string, unknown> = {};\n if (mod.effects) {\n for (const [key, effect] of Object.entries(mod.effects)) {\n const effectDef = effect as {\n // biome-ignore lint/suspicious/noExplicitAny: Effect run function type\n run: (facts: any, prev: any) => void | Promise<void>;\n deps?: string[];\n };\n\n prefixedEffects[`${namespace}${SEPARATOR}${key}`] = {\n ...effectDef,\n // biome-ignore lint/suspicious/noExplicitAny: Effect run function wrapper\n run: (facts: any, prev: any) => {\n // Use cross-module proxy (facts.self + facts.{dep}) if crossModuleDeps is defined\n // Otherwise use module-scoped proxy for direct access (facts.key → namespace::key)\n const factsProxy = hasCrossModuleDeps\n ? createCrossModuleFactsProxy(\n facts as Record<string, unknown>,\n namespace,\n depNamespaces,\n )\n : createModuleFactsProxy(\n facts as Record<string, unknown>,\n namespace,\n );\n const prevProxy = prev\n ? hasCrossModuleDeps\n ? createCrossModuleFactsProxy(\n prev as Record<string, unknown>,\n namespace,\n depNamespaces,\n )\n : createModuleFactsProxy(\n prev as Record<string, unknown>,\n namespace,\n )\n : undefined;\n return effectDef.run(factsProxy, prevProxy);\n },\n // Transform deps to use prefixed keys\n deps: effectDef.deps?.map((dep) => `${namespace}${SEPARATOR}${dep}`),\n };\n }\n }\n\n flatModules.push({\n id: mod.id,\n schema: {\n facts: prefixedFacts,\n derivations: prefixedDerivations,\n events: prefixedEvents,\n requirements: mod.schema.requirements ?? {},\n },\n init: prefixedInit,\n derive: prefixedDerive,\n events: prefixedEventHandlers,\n effects: prefixedEffects,\n constraints: prefixedConstraints,\n resolvers: prefixedResolvers,\n hooks: mod.hooks,\n snapshotEvents:\n snapshotModulesSet && !snapshotModulesSet.has(namespace)\n ? [] // Module excluded from snapshots\n : mod.snapshotEvents?.map(\n (e: string) => `${namespace}${SEPARATOR}${e}`,\n ),\n // biome-ignore lint/suspicious/noExplicitAny: Module transformation\n } as any);\n }\n\n // Dev-mode warning: tickMs set without tick event handler\n if (\n process.env.NODE_ENV !== \"production\" &&\n options.tickMs &&\n options.tickMs > 0\n ) {\n const hasTickHandler = flatModules.some(\n (m) =>\n m.events &&\n Object.keys(m.events).some((k) => k.endsWith(`${SEPARATOR}tick`)),\n );\n if (!hasTickHandler) {\n console.warn(\n `[Directive] tickMs is set to ${options.tickMs}ms but no module defines a \"tick\" event handler.`,\n );\n }\n }\n\n // Store for hydrated facts (set by hydrate(), applied during init)\n let hydratedFacts: Record<string, Record<string, unknown>> | null = null;\n\n // Engine reference (set after creation, used by applyNamespacedFacts)\n // biome-ignore lint/suspicious/noExplicitAny: Engine type\n let engine: any = null;\n\n /**\n * Apply namespaced facts to the engine's flat store.\n * Converts { auth: { token: \"x\" } } to { \"auth::token\": \"x\" }\n * Includes prototype pollution protection.\n */\n function applyNamespacedFacts(\n namespacedFacts: Record<string, Record<string, unknown>>,\n ): void {\n for (const [namespace, facts] of Object.entries(namespacedFacts)) {\n // Skip blocked property names\n if (BLOCKED_PROPS.has(namespace)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\n `[Directive] initialFacts/hydrate contains blocked namespace \"${namespace}\". Skipping.`,\n );\n }\n continue;\n }\n\n if (!moduleNamespaces.has(namespace)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\n `[Directive] initialFacts/hydrate contains unknown namespace \"${namespace}\". ` +\n `Available modules: ${[...moduleNamespaces].join(\", \")}`,\n );\n }\n continue;\n }\n\n // Validate facts object for prototype pollution\n if (facts && typeof facts === \"object\" && !isPrototypeSafe(facts)) {\n throw new Error(\n `[Directive] initialFacts/hydrate for namespace \"${namespace}\" contains potentially ` +\n `dangerous keys (__proto__, constructor, or prototype). This may indicate a ` +\n `prototype pollution attack.`,\n );\n }\n\n for (const [key, value] of Object.entries(facts)) {\n // Skip blocked keys\n if (BLOCKED_PROPS.has(key)) continue;\n (engine.facts as Record<string, unknown>)[\n `${namespace}${SEPARATOR}${key}`\n ] = value;\n }\n }\n }\n\n // Create engine with flat modules\n engine = createEngine({\n // biome-ignore lint/suspicious/noExplicitAny: Module format conversion\n modules: flatModules.map((mod) => ({\n id: mod.id,\n schema: mod.schema.facts,\n requirements: mod.schema.requirements,\n init: mod.init,\n derive: mod.derive,\n events: mod.events,\n effects: mod.effects,\n constraints: mod.constraints,\n resolvers: mod.resolvers,\n hooks: mod.hooks,\n snapshotEvents: mod.snapshotEvents,\n })) as any,\n plugins: options.plugins,\n debug,\n errorBoundary,\n tickMs: options.tickMs,\n // Callback to apply initialFacts/hydrate during init phase (after module inits, before reconcile)\n onAfterModuleInit: () => {\n // Apply initialFacts first\n if (options.initialFacts) {\n applyNamespacedFacts(\n options.initialFacts as Record<string, Record<string, unknown>>,\n );\n }\n // Apply hydrated facts second (takes precedence)\n if (hydratedFacts) {\n applyNamespacedFacts(hydratedFacts);\n hydratedFacts = null;\n }\n },\n });\n\n // Build namespace → internal keys map (for subscribeModule / wildcard support)\n const namespaceKeysMap = new Map<string, string[]>();\n for (const namespace of Object.keys(modulesMap)) {\n const mod = modulesMap[namespace];\n if (!mod) continue;\n const keys: string[] = [];\n for (const key of Object.keys(mod.schema.facts)) {\n keys.push(`${namespace}${SEPARATOR}${key}`);\n }\n if (mod.schema.derivations) {\n for (const key of Object.keys(mod.schema.derivations)) {\n keys.push(`${namespace}${SEPARATOR}${key}`);\n }\n }\n namespaceKeysMap.set(namespace, keys);\n }\n\n // Cached module names array, shared by all namespaced proxies.\n // Set to null on registerModule to lazily recompute.\n const moduleNamesCache: { names: string[] | null } = { names: null };\n function getModuleNames(): string[] {\n if (moduleNamesCache.names === null) {\n moduleNamesCache.names = Object.keys(modulesMap);\n }\n return moduleNamesCache.names;\n }\n\n // Create namespaced proxies for external access\n const namespacedFactsProxy = createNamespacedFactsProxy(\n engine.facts as unknown as Record<string, unknown>,\n modulesMap,\n getModuleNames,\n );\n const namespacedDeriveProxy = createNamespacedDeriveProxy(\n engine.derive as unknown as Record<string, unknown>,\n modulesMap,\n getModuleNames,\n );\n const namespacedEventsProxy = createNamespacedEventsProxy(\n engine,\n modulesMap,\n getModuleNames,\n );\n\n // Build the namespaced system\n let tickInterval: ReturnType<typeof setInterval> | null = null;\n const tickMs = options.tickMs;\n\n const system: NamespacedSystem<Modules> = {\n _mode: \"namespaced\",\n facts: namespacedFactsProxy,\n debug: engine.debug,\n derive: namespacedDeriveProxy,\n events: namespacedEventsProxy,\n constraints: engine.constraints,\n effects: engine.effects,\n\n get runHistory() {\n return engine.runHistory;\n },\n\n get isRunning() {\n return engine.isRunning;\n },\n\n get isSettled() {\n return engine.isSettled;\n },\n\n get isInitialized() {\n return engine.isInitialized;\n },\n\n get isReady() {\n return engine.isReady;\n },\n\n whenReady: engine.whenReady.bind(engine),\n\n async hydrate(\n loader: () =>\n | Promise<Record<string, Record<string, unknown>>>\n | Record<string, Record<string, unknown>>,\n ) {\n if (engine.isRunning) {\n throw new Error(\n \"[Directive] hydrate() must be called before start(). \" +\n \"The system is already running.\",\n );\n }\n\n const result = await loader();\n if (result && typeof result === \"object\") {\n hydratedFacts = result;\n }\n },\n\n initialize(): void {\n engine.initialize();\n },\n\n start(): void {\n // Engine.start() runs module inits, then applies initialFacts/hydrate via callback\n engine.start();\n\n if (tickMs && tickMs > 0) {\n // Find the first module with a tick event and dispatch to it\n const tickEventKey = Object.keys(flatModules[0]?.events ?? {}).find(\n (k) => k.endsWith(`${SEPARATOR}tick`),\n );\n if (tickEventKey) {\n tickInterval = setInterval(() => {\n engine.dispatch({ type: tickEventKey });\n }, tickMs);\n }\n }\n },\n\n stop(): void {\n if (tickInterval) {\n clearInterval(tickInterval);\n tickInterval = null;\n }\n engine.stop();\n },\n\n destroy(): void {\n this.stop();\n engine.destroy();\n },\n\n dispatch(event: { type: string; [key: string]: unknown }) {\n // Events are dispatched with namespace prefix\n // e.g., { type: \"login\", token: \"abc\" } from auth module\n // becomes { type: \"auth::login\", token: \"abc\" }\n // But we keep them simple - the event type should match the schema\n engine.dispatch(event);\n },\n\n batch: engine.batch.bind(engine),\n\n /**\n * Read a derivation value using namespaced syntax.\n * Accepts \"namespace.key\" format.\n *\n * @example\n * system.read(\"auth.status\") // → \"authenticated\"\n * system.read(\"data.count\") // → 5\n */\n read<T = unknown>(derivationId: string): T {\n return engine.read(toInternalKey(derivationId));\n },\n\n /**\n * Subscribe to derivation changes using namespaced syntax.\n * Accepts \"namespace.key\" format.\n * Supports wildcard \"namespace.*\" to subscribe to all keys in a module.\n *\n * @example\n * system.subscribe([\"auth.status\", \"data.count\"], () => {\n * console.log(\"Auth or data changed\");\n * });\n *\n * @example Wildcard\n * system.subscribe([\"game.*\", \"chat.*\"], () => render());\n */\n subscribe(ids: string[], listener: () => void): () => void {\n const internalIds: string[] = [];\n for (const id of ids) {\n if (id.endsWith(\".*\")) {\n const ns = id.slice(0, -2);\n const keys = namespaceKeysMap.get(ns);\n if (keys) {\n internalIds.push(...keys);\n } else if (process.env.NODE_ENV !== \"production\") {\n console.warn(\n `[Directive] subscribe wildcard \"${id}\" — namespace \"${ns}\" not found.`,\n );\n }\n } else {\n internalIds.push(toInternalKey(id));\n }\n }\n return engine.subscribe(internalIds, listener);\n },\n\n /**\n * Subscribe to ALL fact and derivation changes in a module namespace.\n * Shorthand for subscribing to every key in a module.\n *\n * @example\n * const unsub = system.subscribeModule(\"game\", () => render());\n */\n subscribeModule(namespace: string, listener: () => void): () => void {\n const keys = namespaceKeysMap.get(namespace);\n if (!keys || keys.length === 0) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\n `[Directive] subscribeModule(\"${namespace}\") — namespace not found. ` +\n `Available: ${[...namespaceKeysMap.keys()].join(\", \")}`,\n );\n }\n return () => {};\n }\n return engine.subscribe(keys, listener);\n },\n\n /**\n * Watch a fact or derivation for changes using namespaced syntax.\n * The key is auto-detected -- works with both fact keys and derivation keys.\n * Accepts \"namespace.key\" format.\n *\n * @example\n * system.watch(\"auth.token\", (newVal, oldVal) => { ... }) // fact\n * system.watch(\"auth.status\", (newVal, oldVal) => { ... }) // derivation\n */\n watch<T = unknown>(\n id: string,\n callback: (newValue: T, previousValue: T | undefined) => void,\n options?: { equalityFn?: (a: T, b: T | undefined) => boolean },\n ): () => void {\n return engine.watch(toInternalKey(id), callback, options);\n },\n\n /**\n * Returns a promise that resolves when the predicate becomes true.\n * The predicate receives namespaced facts (e.g., facts.auth.token).\n */\n when(\n predicate: (facts: Record<string, unknown>) => boolean,\n options?: { timeout?: number },\n ): Promise<void> {\n // Wrap predicate to provide namespaced facts view\n return engine.when(\n () =>\n predicate(namespacedFactsProxy as unknown as Record<string, unknown>),\n options,\n );\n },\n\n onSettledChange: engine.onSettledChange.bind(engine),\n onTimeTravelChange: engine.onTimeTravelChange.bind(engine),\n inspect: engine.inspect.bind(engine),\n settle: engine.settle.bind(engine),\n explain: engine.explain.bind(engine),\n getSnapshot: engine.getSnapshot.bind(engine),\n restore: engine.restore.bind(engine),\n\n /**\n * Get a distributable snapshot with namespaced key translation.\n * Accepts \"namespace.key\" format in options (e.g., \"auth.effectivePlan\").\n * Returns data with namespaced keys (e.g., { auth: { effectivePlan: ... } }).\n */\n getDistributableSnapshot<T = Record<string, unknown>>(options?: {\n includeDerivations?: string[];\n excludeDerivations?: string[];\n includeFacts?: string[];\n ttlSeconds?: number;\n metadata?: Record<string, unknown>;\n includeVersion?: boolean;\n }): {\n data: T;\n createdAt: number;\n expiresAt?: number;\n version?: string;\n metadata?: Record<string, unknown>;\n } {\n // Translate namespaced keys to internal format\n const internalOptions = {\n ...options,\n includeDerivations: options?.includeDerivations?.map(toInternalKey),\n excludeDerivations: options?.excludeDerivations?.map(toInternalKey),\n includeFacts: options?.includeFacts?.map(toInternalKey),\n };\n\n const snapshot = engine.getDistributableSnapshot(internalOptions);\n\n // Transform data keys from internal format (auth::status) to namespaced format (auth: { status })\n const namespacedData: Record<string, Record<string, unknown>> = {};\n\n for (const [key, value] of Object.entries(\n snapshot.data as Record<string, unknown>,\n )) {\n // Find the namespace prefix (first separator)\n const sepIndex = key.indexOf(SEPARATOR);\n if (sepIndex > 0) {\n const namespace = key.slice(0, sepIndex);\n const localKey = key.slice(sepIndex + SEPARATOR.length);\n if (!namespacedData[namespace]) {\n namespacedData[namespace] = {};\n }\n namespacedData[namespace][localKey] = value;\n } else {\n // No namespace found, keep as-is\n if (!namespacedData[\"_root\"]) {\n namespacedData[\"_root\"] = {};\n }\n namespacedData[\"_root\"][key] = value;\n }\n }\n\n return {\n ...snapshot,\n data: namespacedData as T,\n };\n },\n\n /**\n * Watch for changes to distributable snapshot derivations.\n * Accepts \"namespace.key\" format in options.\n * Callback receives data with namespaced keys.\n */\n watchDistributableSnapshot<T = Record<string, unknown>>(\n options: {\n includeDerivations?: string[];\n excludeDerivations?: string[];\n includeFacts?: string[];\n ttlSeconds?: number;\n metadata?: Record<string, unknown>;\n includeVersion?: boolean;\n },\n callback: (snapshot: {\n data: T;\n createdAt: number;\n expiresAt?: number;\n version?: string;\n metadata?: Record<string, unknown>;\n }) => void,\n ): () => void {\n // Translate namespaced keys to internal format\n const internalOptions = {\n ...options,\n includeDerivations: options?.includeDerivations?.map(toInternalKey),\n excludeDerivations: options?.excludeDerivations?.map(toInternalKey),\n includeFacts: options?.includeFacts?.map(toInternalKey),\n };\n\n return engine.watchDistributableSnapshot(\n internalOptions,\n (snapshot: {\n data: Record<string, unknown>;\n createdAt: number;\n expiresAt?: number;\n version?: string;\n metadata?: Record<string, unknown>;\n }) => {\n // Transform data keys from internal format to namespaced format\n const namespacedData: Record<string, Record<string, unknown>> = {};\n\n for (const [key, value] of Object.entries(snapshot.data)) {\n const sepIndex = key.indexOf(SEPARATOR);\n if (sepIndex > 0) {\n const namespace = key.slice(0, sepIndex);\n const localKey = key.slice(sepIndex + SEPARATOR.length);\n if (!namespacedData[namespace]) {\n namespacedData[namespace] = {};\n }\n namespacedData[namespace][localKey] = value;\n } else {\n if (!namespacedData[\"_root\"]) {\n namespacedData[\"_root\"] = {};\n }\n namespacedData[\"_root\"][key] = value;\n }\n }\n\n callback({\n ...snapshot,\n data: namespacedData as T,\n });\n },\n );\n },\n registerModule(\n namespace: string,\n moduleDef: ModuleDef<ModuleSchema>,\n ): void {\n // Validate namespace\n if (moduleNamespaces.has(namespace)) {\n throw new Error(\n `[Directive] Module namespace \"${namespace}\" already exists. ` +\n `Cannot register a duplicate namespace.`,\n );\n }\n if (namespace.includes(SEPARATOR)) {\n throw new Error(\n `[Directive] Module name \"${namespace}\" contains the reserved separator \"${SEPARATOR}\".`,\n );\n }\n if (BLOCKED_PROPS.has(namespace)) {\n throw new Error(\n `[Directive] Module name \"${namespace}\" is a blocked property.`,\n );\n }\n\n // Validate schema keys\n for (const key of Object.keys(moduleDef.schema.facts)) {\n if (key.includes(SEPARATOR)) {\n throw new Error(\n `[Directive] Schema key \"${key}\" in module \"${namespace}\" contains the reserved separator \"${SEPARATOR}\".`,\n );\n }\n }\n\n const mod = moduleDef;\n const hasCrossModuleDeps =\n mod.crossModuleDeps && Object.keys(mod.crossModuleDeps).length > 0;\n const depNamespaces = hasCrossModuleDeps\n ? Object.keys(mod.crossModuleDeps!)\n : [];\n\n // Build prefixed schema, derive, events, effects, constraints, resolvers\n // (same logic as initial createNamespacedSystem)\n const prefixedFacts: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(mod.schema.facts)) {\n prefixedFacts[`${namespace}${SEPARATOR}${key}`] = value;\n }\n\n const prefixedInit = mod.init\n ? // biome-ignore lint/suspicious/noExplicitAny: Module init type coercion\n (facts: any) => {\n const moduleFactsProxy = createModuleFactsProxy(facts, namespace);\n // biome-ignore lint/suspicious/noExplicitAny: Module init type coercion\n (mod.init as any)(moduleFactsProxy);\n }\n : undefined;\n\n const prefixedDerive: Record<\n string,\n (facts: unknown, derive: unknown) => unknown\n > = {};\n if (mod.derive) {\n for (const [key, fn] of Object.entries(mod.derive)) {\n prefixedDerive[`${namespace}${SEPARATOR}${key}`] = (\n facts: unknown,\n derive: unknown,\n ) => {\n const factsProxy = hasCrossModuleDeps\n ? createCrossModuleFactsProxy(\n facts as Record<string, unknown>,\n namespace,\n depNamespaces,\n )\n : createModuleFactsProxy(\n facts as Record<string, unknown>,\n namespace,\n );\n const deriveProxy = createModuleDeriveProxy(\n derive as Record<string, unknown>,\n namespace,\n );\n // biome-ignore lint/suspicious/noExplicitAny: Derive function type coercion\n return (fn as any)(factsProxy, deriveProxy);\n };\n }\n }\n\n const prefixedEventHandlers: Record<\n string,\n (facts: unknown, event: unknown) => void\n > = {};\n if (mod.events) {\n for (const [key, handler] of Object.entries(mod.events)) {\n prefixedEventHandlers[`${namespace}${SEPARATOR}${key}`] = (\n facts: unknown,\n event: unknown,\n ) => {\n const moduleFactsProxy = createModuleFactsProxy(\n facts as Record<string, unknown>,\n namespace,\n );\n // biome-ignore lint/suspicious/noExplicitAny: Event handler type coercion\n (handler as any)(moduleFactsProxy, event);\n };\n }\n }\n\n const prefixedConstraints: Record<string, unknown> = {};\n if (mod.constraints) {\n for (const [key, constraint] of Object.entries(mod.constraints)) {\n const constraintDef = constraint as {\n when: (facts: unknown) => boolean | Promise<boolean>;\n require: unknown | ((facts: unknown) => unknown);\n priority?: number;\n async?: boolean;\n timeout?: number;\n deps?: string[];\n };\n prefixedConstraints[`${namespace}${SEPARATOR}${key}`] = {\n ...constraintDef,\n deps: constraintDef.deps?.map(\n (dep) => `${namespace}${SEPARATOR}${dep}`,\n ),\n when: (facts: unknown) => {\n const factsProxy = hasCrossModuleDeps\n ? createCrossModuleFactsProxy(\n facts as Record<string, unknown>,\n namespace,\n depNamespaces,\n )\n : createModuleFactsProxy(\n facts as Record<string, unknown>,\n namespace,\n );\n return constraintDef.when(factsProxy);\n },\n require:\n typeof constraintDef.require === \"function\"\n ? (facts: unknown) => {\n const factsProxy = hasCrossModuleDeps\n ? createCrossModuleFactsProxy(\n facts as Record<string, unknown>,\n namespace,\n depNamespaces,\n )\n : createModuleFactsProxy(\n facts as Record<string, unknown>,\n namespace,\n );\n return (\n constraintDef.require as (facts: unknown) => unknown\n )(factsProxy);\n }\n : constraintDef.require,\n };\n }\n }\n\n const prefixedResolvers: Record<string, unknown> = {};\n if (mod.resolvers) {\n for (const [key, resolver] of Object.entries(mod.resolvers)) {\n const resolverDef = resolver as {\n requirement: string;\n resolve: (\n req: unknown,\n ctx: { facts: unknown; signal: AbortSignal },\n ) => Promise<void>;\n key?: (req: unknown) => string;\n retry?: unknown;\n timeout?: number;\n };\n prefixedResolvers[`${namespace}${SEPARATOR}${key}`] = {\n ...resolverDef,\n resolve: async (\n req: unknown,\n ctx: { facts: unknown; signal: AbortSignal },\n ) => {\n // Use live modulesMap reference (already mutated by registerModule before this runs)\n const namespacedFacts = createNamespacedFactsProxy(\n ctx.facts as Record<string, unknown>,\n modulesMap,\n getModuleNames,\n );\n await resolverDef.resolve(req, {\n facts: namespacedFacts[namespace],\n signal: ctx.signal,\n });\n },\n };\n }\n }\n\n const prefixedEffects: Record<string, unknown> = {};\n if (mod.effects) {\n for (const [key, effect] of Object.entries(mod.effects)) {\n const effectDef = effect as {\n // biome-ignore lint/suspicious/noExplicitAny: Effect run function type\n run: (facts: any, prev: any) => void | Promise<void>;\n deps?: string[];\n };\n prefixedEffects[`${namespace}${SEPARATOR}${key}`] = {\n ...effectDef,\n // biome-ignore lint/suspicious/noExplicitAny: Effect run function wrapper\n run: (facts: any, prev: any) => {\n const factsProxy = hasCrossModuleDeps\n ? createCrossModuleFactsProxy(\n facts as Record<string, unknown>,\n namespace,\n depNamespaces,\n )\n : createModuleFactsProxy(\n facts as Record<string, unknown>,\n namespace,\n );\n const prevProxy = prev\n ? hasCrossModuleDeps\n ? createCrossModuleFactsProxy(\n prev as Record<string, unknown>,\n namespace,\n depNamespaces,\n )\n : createModuleFactsProxy(\n prev as Record<string, unknown>,\n namespace,\n )\n : undefined;\n return effectDef.run(factsProxy, prevProxy);\n },\n deps: effectDef.deps?.map(\n (dep) => `${namespace}${SEPARATOR}${dep}`,\n ),\n };\n }\n }\n\n // Register namespace\n moduleNamespaces.add(namespace);\n (modulesMap as Record<string, ModuleDef<ModuleSchema>>)[namespace] = mod;\n // Invalidate cached module names so proxies see the new namespace\n moduleNamesCache.names = null;\n\n // Update namespace keys map\n const keys: string[] = [];\n for (const key of Object.keys(mod.schema.facts)) {\n keys.push(`${namespace}${SEPARATOR}${key}`);\n }\n if (mod.schema.derivations) {\n for (const key of Object.keys(mod.schema.derivations)) {\n keys.push(`${namespace}${SEPARATOR}${key}`);\n }\n }\n namespaceKeysMap.set(namespace, keys);\n\n // Delegate to engine's registerModule\n // biome-ignore lint/suspicious/noExplicitAny: Engine registerModule type\n (engine as any).registerModule({\n id: mod.id,\n schema: prefixedFacts,\n requirements: mod.schema.requirements ?? {},\n init: prefixedInit,\n derive:\n Object.keys(prefixedDerive).length > 0 ? prefixedDerive : undefined,\n events:\n Object.keys(prefixedEventHandlers).length > 0\n ? prefixedEventHandlers\n : undefined,\n effects:\n Object.keys(prefixedEffects).length > 0 ? prefixedEffects : undefined,\n constraints:\n Object.keys(prefixedConstraints).length > 0\n ? prefixedConstraints\n : undefined,\n resolvers:\n Object.keys(prefixedResolvers).length > 0\n ? prefixedResolvers\n : undefined,\n hooks: mod.hooks,\n snapshotEvents:\n snapshotModulesSet && !snapshotModulesSet.has(namespace)\n ? [] // Module excluded from snapshots\n : mod.snapshotEvents?.map(\n (e: string) => `${namespace}${SEPARATOR}${e}`,\n ),\n });\n },\n\n // biome-ignore lint/suspicious/noExplicitAny: Type narrowing for NamespacedSystem\n } as any;\n\n return system;\n}\n\n// ============================================================================\n// Key Conversion Helpers\n// ============================================================================\n\n/**\n * Convert a namespaced key (e.g., \"auth.status\") to internal prefixed format (\"auth::status\").\n * If the key is already in prefixed format, returns it unchanged.\n *\n * @example\n * toInternalKey(\"auth.status\") // → \"auth::status\"\n * toInternalKey(\"auth::status\") // → \"auth::status\" (unchanged)\n * toInternalKey(\"status\") // → \"status\" (unchanged)\n */\nfunction toInternalKey(key: string): string {\n // If key contains a dot, convert to separator format\n if (key.includes(\".\")) {\n const [namespace, ...rest] = key.split(\".\");\n return `${namespace}${SEPARATOR}${rest.join(SEPARATOR)}`;\n }\n // Already in internal format or simple key\n return key;\n}\n\n// ============================================================================\n// Proxy Helpers\n// ============================================================================\n\n/**\n * Create a proxy for a single module's facts (used in init, event handlers).\n * Translates unprefixed keys to prefixed: `token` → `auth::token`\n *\n * Proxies are cached per facts store and namespace for performance.\n */\nfunction createModuleFactsProxy(\n facts: Record<string, unknown>,\n namespace: string,\n): Record<string, unknown> {\n // Check cache first\n let namespaceCache = moduleFactsProxyCache.get(facts);\n if (namespaceCache) {\n const cached = namespaceCache.get(namespace);\n if (cached) return cached;\n } else {\n namespaceCache = new Map();\n moduleFactsProxyCache.set(facts, namespaceCache);\n }\n\n const proxy = new Proxy({} as Record<string, unknown>, {\n get(_, prop: string | symbol) {\n if (typeof prop === \"symbol\") return undefined;\n if (BLOCKED_PROPS.has(prop)) return undefined;\n // Special properties pass through\n if (prop === \"$store\" || prop === \"$snapshot\") {\n return (facts as Record<string, unknown>)[prop];\n }\n return (facts as Record<string, unknown>)[\n `${namespace}${SEPARATOR}${prop}`\n ];\n },\n set(_, prop: string | symbol, value: unknown) {\n if (typeof prop === \"symbol\") return false;\n if (BLOCKED_PROPS.has(prop)) return false;\n (facts as Record<string, unknown>)[`${namespace}${SEPARATOR}${prop}`] =\n value;\n return true;\n },\n has(_, prop: string | symbol) {\n if (typeof prop === \"symbol\") return false;\n if (BLOCKED_PROPS.has(prop)) return false;\n return `${namespace}${SEPARATOR}${prop}` in facts;\n },\n deleteProperty(_, prop: string | symbol) {\n if (typeof prop === \"symbol\") return false;\n if (BLOCKED_PROPS.has(prop)) return false;\n delete (facts as Record<string, unknown>)[\n `${namespace}${SEPARATOR}${prop}`\n ];\n return true;\n },\n });\n\n namespaceCache.set(namespace, proxy);\n return proxy;\n}\n\n/**\n * Create a nested proxy for namespaced facts access.\n * `facts.auth.token` → reads `auth::token` from flat store\n *\n * Uses Set for O(1) namespace lookups and caches the outer proxy.\n */\nfunction createNamespacedFactsProxy(\n facts: Record<string, unknown>,\n modulesMap: ModulesMap,\n getModuleNames: () => string[],\n): Record<string, Record<string, unknown>> {\n // Check cache first\n const cached = namespacedFactsProxyCache.get(facts);\n if (cached) return cached;\n\n const proxy = new Proxy({} as Record<string, Record<string, unknown>>, {\n get(_, namespace: string | symbol) {\n if (typeof namespace === \"symbol\") return undefined;\n if (BLOCKED_PROPS.has(namespace)) return undefined;\n if (!Object.hasOwn(modulesMap, namespace)) return undefined;\n\n // Return a cached proxy for this module's facts\n return createModuleFactsProxy(facts, namespace);\n },\n has(_, namespace: string | symbol) {\n if (typeof namespace === \"symbol\") return false;\n if (BLOCKED_PROPS.has(namespace)) return false;\n return Object.hasOwn(modulesMap, namespace);\n },\n ownKeys() {\n return getModuleNames();\n },\n getOwnPropertyDescriptor(_, namespace: string | symbol) {\n if (typeof namespace === \"symbol\") return undefined;\n if (Object.hasOwn(modulesMap, namespace)) {\n return { configurable: true, enumerable: true };\n }\n return undefined;\n },\n });\n\n namespacedFactsProxyCache.set(facts, proxy);\n return proxy;\n}\n\n/**\n * WeakMap to cache cross-module facts proxies.\n * Keyed by facts store, then by \"selfNamespace:depKeys\" string.\n */\nconst crossModuleFactsProxyCache = new WeakMap<\n Record<string, unknown>,\n Map<string, Record<string, Record<string, unknown>>>\n>();\n\n/**\n * Create a proxy for cross-module facts access with \"self\" for own module.\n * `facts.self.users` → reads own module's facts\n * `facts.auth.token` → reads dependency module's facts\n *\n * Used when a module has crossModuleDeps defined.\n */\nfunction createCrossModuleFactsProxy(\n facts: Record<string, unknown>,\n selfNamespace: string,\n depNamespaces: string[],\n): Record<string, Record<string, unknown>> {\n // Create cache key using JSON.stringify for robustness with special characters\n const cacheKey = `${selfNamespace}:${JSON.stringify([...depNamespaces].sort())}`;\n\n // Check cache first\n let namespaceCache = crossModuleFactsProxyCache.get(facts);\n if (namespaceCache) {\n const cached = namespaceCache.get(cacheKey);\n if (cached) return cached;\n } else {\n namespaceCache = new Map();\n crossModuleFactsProxyCache.set(facts, namespaceCache);\n }\n\n const depNamesSet = new Set(depNamespaces);\n const allKeys = [\"self\", ...depNamespaces];\n\n const proxy = new Proxy({} as Record<string, Record<string, unknown>>, {\n get(_, key: string | symbol) {\n if (typeof key === \"symbol\") return undefined;\n if (BLOCKED_PROPS.has(key)) return undefined;\n\n // \"self\" maps to own module's namespace\n if (key === \"self\") {\n return createModuleFactsProxy(facts, selfNamespace);\n }\n\n // Check if it's a declared dependency\n if (depNamesSet.has(key)) {\n return createModuleFactsProxy(facts, key);\n }\n\n // Dev-mode warning for undeclared cross-module access\n if (process.env.NODE_ENV !== \"production\" && typeof key === \"string\") {\n console.warn(\n `[Directive] Module \"${selfNamespace}\" accessed undeclared cross-module property \"${key}\". ` +\n `Add it to crossModuleDeps or use \"facts.self.${key}\" for own module facts.`,\n );\n }\n\n return undefined;\n },\n has(_, key: string | symbol) {\n if (typeof key === \"symbol\") return false;\n if (BLOCKED_PROPS.has(key)) return false;\n return key === \"self\" || depNamesSet.has(key);\n },\n ownKeys() {\n return allKeys;\n },\n getOwnPropertyDescriptor(_, key: string | symbol) {\n if (typeof key === \"symbol\") return undefined;\n if (key === \"self\" || depNamesSet.has(key)) {\n return { configurable: true, enumerable: true };\n }\n return undefined;\n },\n });\n\n namespaceCache.set(cacheKey, proxy);\n return proxy;\n}\n\n/**\n * Create a proxy for a single module's derivations.\n * Translates unprefixed keys to prefixed: `status` → `auth::status`\n *\n * Proxies are cached per derive store and namespace for performance.\n */\nfunction createModuleDeriveProxy(\n derive: Record<string, unknown>,\n namespace: string,\n): Record<string, unknown> {\n // Check cache first\n let namespaceCache = moduleDeriveProxyCache.get(derive);\n if (namespaceCache) {\n const cached = namespaceCache.get(namespace);\n if (cached) return cached;\n } else {\n namespaceCache = new Map();\n moduleDeriveProxyCache.set(derive, namespaceCache);\n }\n\n const proxy = new Proxy({} as Record<string, unknown>, {\n get(_, prop: string | symbol) {\n if (typeof prop === \"symbol\") return undefined;\n if (BLOCKED_PROPS.has(prop)) return undefined;\n return derive[`${namespace}${SEPARATOR}${prop}`];\n },\n has(_, prop: string | symbol) {\n if (typeof prop === \"symbol\") return false;\n if (BLOCKED_PROPS.has(prop)) return false;\n return `${namespace}${SEPARATOR}${prop}` in derive;\n },\n });\n\n namespaceCache.set(namespace, proxy);\n return proxy;\n}\n\n/**\n * Create a nested proxy for namespaced derivations access.\n * `derive.auth.status` → reads `auth::status` from flat derive\n *\n * Uses Set for O(1) namespace lookups and caches the outer proxy.\n */\nfunction createNamespacedDeriveProxy(\n derive: Record<string, unknown>,\n modulesMap: ModulesMap,\n getModuleNames: () => string[],\n): Record<string, Record<string, unknown>> {\n // Check cache first\n const cached = namespacedDeriveProxyCache.get(derive);\n if (cached) return cached;\n\n const proxy = new Proxy({} as Record<string, Record<string, unknown>>, {\n get(_, namespace: string | symbol) {\n if (typeof namespace === \"symbol\") return undefined;\n if (BLOCKED_PROPS.has(namespace)) return undefined;\n if (!Object.hasOwn(modulesMap, namespace)) return undefined;\n\n // Return a cached proxy for this module's derivations\n return createModuleDeriveProxy(derive, namespace);\n },\n has(_, namespace: string | symbol) {\n if (typeof namespace === \"symbol\") return false;\n if (BLOCKED_PROPS.has(namespace)) return false;\n return Object.hasOwn(modulesMap, namespace);\n },\n ownKeys() {\n return getModuleNames();\n },\n getOwnPropertyDescriptor(_, namespace: string | symbol) {\n if (typeof namespace === \"symbol\") return undefined;\n if (Object.hasOwn(modulesMap, namespace)) {\n return { configurable: true, enumerable: true };\n }\n return undefined;\n },\n });\n\n namespacedDeriveProxyCache.set(derive, proxy);\n return proxy;\n}\n\n/**\n * WeakMap to cache module events proxies.\n */\nconst moduleEventsProxyCache = new WeakMap<\n // biome-ignore lint/suspicious/noExplicitAny: Engine type for cache key\n any,\n Map<string, Record<string, (payload?: Record<string, unknown>) => void>>\n>();\n\n/**\n * Create a nested proxy for namespaced events access.\n * `events.auth.login({ token })` → dispatches `{ type: \"auth::login\", token }`\n *\n * Uses Set for O(1) namespace lookups and caches proxies for performance.\n */\nfunction createNamespacedEventsProxy(\n // biome-ignore lint/suspicious/noExplicitAny: Engine type\n engine: any,\n modulesMap: ModulesMap,\n getModuleNames: () => string[],\n): Record<string, Record<string, (payload?: Record<string, unknown>) => void>> {\n // Get or create the namespace cache for this engine\n let namespaceCache = moduleEventsProxyCache.get(engine);\n if (!namespaceCache) {\n namespaceCache = new Map();\n moduleEventsProxyCache.set(engine, namespaceCache);\n }\n\n return new Proxy(\n {} as Record<\n string,\n Record<string, (payload?: Record<string, unknown>) => void>\n >,\n {\n get(_, namespace: string | symbol) {\n if (typeof namespace === \"symbol\") return undefined;\n if (BLOCKED_PROPS.has(namespace)) return undefined;\n if (!Object.hasOwn(modulesMap, namespace)) return undefined;\n\n // Check cache for this namespace's event proxy\n const cached = namespaceCache!.get(namespace);\n if (cached) return cached;\n\n // Create and cache the module events proxy\n const moduleEventsProxy = new Proxy(\n {} as Record<string, (payload?: Record<string, unknown>) => void>,\n {\n get(_, eventName: string | symbol) {\n if (typeof eventName === \"symbol\") return undefined;\n if (BLOCKED_PROPS.has(eventName)) return undefined;\n\n // Return a function that dispatches the prefixed event\n return (payload?: Record<string, unknown>) => {\n engine.dispatch({\n type: `${namespace}${SEPARATOR}${eventName}`,\n ...payload,\n });\n };\n },\n },\n );\n\n namespaceCache!.set(namespace, moduleEventsProxy);\n return moduleEventsProxy;\n },\n has(_, namespace: string | symbol) {\n if (typeof namespace === \"symbol\") return false;\n if (BLOCKED_PROPS.has(namespace)) return false;\n return Object.hasOwn(modulesMap, namespace);\n },\n ownKeys() {\n return getModuleNames();\n },\n getOwnPropertyDescriptor(_, namespace: string | symbol) {\n if (typeof namespace === \"symbol\") return undefined;\n if (Object.hasOwn(modulesMap, namespace)) {\n return { configurable: true, enumerable: true };\n }\n return undefined;\n },\n },\n );\n}\n\n// ============================================================================\n// Single Module System\n// ============================================================================\n\n/**\n * Create a system with a single module (no namespacing).\n * Facts, derivations, and events are accessed directly.\n */\nfunction createSingleModuleSystem<S extends ModuleSchema>(\n options: CreateSystemOptionsSingle<S>,\n): SingleModuleSystem<S> {\n const mod = options.module;\n\n // Validate module is provided\n if (!mod) {\n throw new Error(\n \"[Directive] createSystem requires a module. Got: \" + typeof mod,\n );\n }\n\n // Validate tickMs if provided\n if (options.tickMs !== undefined && options.tickMs <= 0) {\n throw new Error(\"[Directive] tickMs must be a positive number\");\n }\n\n // Validate initialFacts for prototype pollution\n if (options.initialFacts && !isPrototypeSafe(options.initialFacts)) {\n throw new Error(\n \"[Directive] initialFacts contains potentially dangerous keys \" +\n \"(__proto__, constructor, or prototype). This may indicate a \" +\n \"prototype pollution attack.\",\n );\n }\n\n // Dev-mode warnings\n if (process.env.NODE_ENV !== \"production\") {\n // Warn if crossModuleDeps is defined (ignored in single module mode)\n if (mod.crossModuleDeps && Object.keys(mod.crossModuleDeps).length > 0) {\n console.warn(\n \"[Directive] Single module mode ignores crossModuleDeps. \" +\n \"Use multiple modules if cross-module access is needed: \" +\n \"createSystem({ modules: { ... } })\",\n );\n }\n\n // Warn if tickMs set without tick event handler\n if (options.tickMs && options.tickMs > 0) {\n const hasTickHandler = mod.events && \"tick\" in mod.events;\n if (!hasTickHandler) {\n console.warn(\n `[Directive] tickMs is set to ${options.tickMs}ms but module has no \"tick\" event handler.`,\n );\n }\n }\n\n // Warn if snapshotModules is set (has no effect in single-module mode)\n if (options.debug?.snapshotModules) {\n console.warn(\n \"[Directive] debug.snapshotModules has no effect in single-module mode. \" +\n \"Use snapshotEvents on the module definition instead, or switch to \" +\n \"createSystem({ modules: { ... } }) for multi-module filtering.\",\n );\n }\n }\n\n // Apply zero-config defaults if enabled\n let debug = options.debug;\n let errorBoundary = options.errorBoundary;\n\n if (options.zeroConfig) {\n const isDev = process.env.NODE_ENV !== \"production\";\n\n debug = {\n timeTravel: isDev,\n maxSnapshots: 100,\n ...options.debug,\n };\n\n errorBoundary = {\n onConstraintError: \"skip\",\n onResolverError: \"skip\",\n onEffectError: \"skip\",\n onDerivationError: \"skip\",\n ...options.errorBoundary,\n };\n }\n\n // Store for hydrated facts\n let hydratedFacts: Record<string, unknown> | null = null;\n\n // Engine reference\n // biome-ignore lint/suspicious/noExplicitAny: Engine type\n let engine: any = null;\n\n // Create engine with the module directly (no prefixing needed)\n engine = createEngine({\n modules: [\n {\n id: mod.id,\n schema: mod.schema.facts,\n requirements: mod.schema.requirements,\n init: mod.init,\n derive: mod.derive,\n events: mod.events,\n effects: mod.effects,\n constraints: mod.constraints,\n resolvers: mod.resolvers,\n hooks: mod.hooks,\n snapshotEvents: mod.snapshotEvents,\n },\n // biome-ignore lint/suspicious/noExplicitAny: Module format\n ] as any,\n plugins: options.plugins,\n debug,\n errorBoundary,\n tickMs: options.tickMs,\n onAfterModuleInit: () => {\n // Apply initialFacts\n if (options.initialFacts) {\n for (const [key, value] of Object.entries(options.initialFacts)) {\n if (BLOCKED_PROPS.has(key)) continue;\n (engine.facts as Record<string, unknown>)[key] = value;\n }\n }\n // Apply hydrated facts (takes precedence)\n if (hydratedFacts) {\n for (const [key, value] of Object.entries(hydratedFacts)) {\n if (BLOCKED_PROPS.has(key)) continue;\n (engine.facts as Record<string, unknown>)[key] = value;\n }\n hydratedFacts = null;\n }\n },\n });\n\n // Create events proxy for direct access\n const eventsProxy = new Proxy(\n {} as Record<string, (payload?: Record<string, unknown>) => void>,\n {\n get(_, eventName: string | symbol) {\n if (typeof eventName === \"symbol\") return undefined;\n if (BLOCKED_PROPS.has(eventName)) return undefined;\n\n return (payload?: Record<string, unknown>) => {\n engine.dispatch({ type: eventName, ...payload });\n };\n },\n },\n );\n\n // Build the single module system\n let tickInterval: ReturnType<typeof setInterval> | null = null;\n const tickMs = options.tickMs;\n\n const system: SingleModuleSystem<S> = {\n _mode: \"single\",\n facts: engine.facts,\n debug: engine.debug,\n derive: engine.derive,\n events: eventsProxy as SingleModuleSystem<S>[\"events\"],\n constraints: engine.constraints,\n effects: engine.effects,\n\n get runHistory() {\n return engine.runHistory;\n },\n\n get isRunning() {\n return engine.isRunning;\n },\n\n get isSettled() {\n return engine.isSettled;\n },\n\n get isInitialized() {\n return engine.isInitialized;\n },\n\n get isReady() {\n return engine.isReady;\n },\n\n whenReady: engine.whenReady.bind(engine),\n\n async hydrate(\n loader: () => Promise<Record<string, unknown>> | Record<string, unknown>,\n ) {\n if (engine.isRunning) {\n throw new Error(\n \"[Directive] hydrate() must be called before start(). \" +\n \"The system is already running.\",\n );\n }\n\n const result = await loader();\n if (result && typeof result === \"object\") {\n hydratedFacts = result as Record<string, unknown>;\n }\n },\n\n initialize(): void {\n engine.initialize();\n },\n\n start(): void {\n engine.start();\n\n if (tickMs && tickMs > 0) {\n const hasTickHandler = mod.events && \"tick\" in mod.events;\n if (hasTickHandler) {\n tickInterval = setInterval(() => {\n engine.dispatch({ type: \"tick\" });\n }, tickMs);\n }\n }\n },\n\n stop(): void {\n if (tickInterval) {\n clearInterval(tickInterval);\n tickInterval = null;\n }\n engine.stop();\n },\n\n destroy(): void {\n this.stop();\n engine.destroy();\n },\n\n dispatch(event: { type: string; [key: string]: unknown }) {\n engine.dispatch(event);\n },\n\n batch: engine.batch.bind(engine),\n\n read<T = unknown>(derivationId: string): T {\n return engine.read(derivationId);\n },\n\n subscribe(ids: string[], listener: () => void): () => void {\n return engine.subscribe(ids, listener);\n },\n\n watch<T = unknown>(\n id: string,\n callback: (newValue: T, previousValue: T | undefined) => void,\n options?: { equalityFn?: (a: T, b: T | undefined) => boolean },\n ): () => void {\n return engine.watch(id, callback, options);\n },\n\n when(\n predicate: (facts: Record<string, unknown>) => boolean,\n options?: { timeout?: number },\n ): Promise<void> {\n return engine.when(predicate, options);\n },\n\n onSettledChange: engine.onSettledChange.bind(engine),\n onTimeTravelChange: engine.onTimeTravelChange.bind(engine),\n inspect: engine.inspect.bind(engine),\n settle: engine.settle.bind(engine),\n explain: engine.explain.bind(engine),\n getSnapshot: engine.getSnapshot.bind(engine),\n restore: engine.restore.bind(engine),\n getDistributableSnapshot: engine.getDistributableSnapshot.bind(engine),\n watchDistributableSnapshot: engine.watchDistributableSnapshot.bind(engine),\n\n registerModule(moduleDef: ModuleDef<ModuleSchema>): void {\n // biome-ignore lint/suspicious/noExplicitAny: Engine registerModule type\n (engine as any).registerModule({\n id: moduleDef.id,\n schema: moduleDef.schema.facts,\n requirements: moduleDef.schema.requirements,\n init: moduleDef.init,\n derive: moduleDef.derive,\n events: moduleDef.events,\n effects: moduleDef.effects,\n constraints: moduleDef.constraints,\n resolvers: moduleDef.resolvers,\n hooks: moduleDef.hooks,\n snapshotEvents: moduleDef.snapshotEvents,\n });\n },\n // biome-ignore lint/suspicious/noExplicitAny: Type narrowing\n } as any;\n\n return system;\n}\n","/**\n * Testing Utilities - Helpers for testing Directive systems\n *\n * Features:\n * - Mock resolvers with manual resolve/reject\n * - Fake timers integration (works with Vitest/Jest fake timers)\n * - Assertion helpers\n * - Facts history tracking\n * - Pending requirements tracking\n */\n\nimport { createSystem } from \"../core/system.js\";\nimport type {\n CreateSystemOptionsNamed,\n ModulesMap,\n NamespacedSystem,\n Requirement,\n RequirementWithId,\n SystemInspection,\n} from \"../core/types.js\";\n\n// ============================================================================\n// Fake Timers Integration\n// ============================================================================\n\n/**\n * Flush all pending microtasks.\n * Call this after advancing fake timers to ensure all Promise callbacks run.\n *\n * @example\n * ```typescript\n * vi.useFakeTimers();\n * system.start();\n * system.facts.userId = 1; // Triggers constraint\n * await flushMicrotasks(); // Let reconciliation start\n * vi.advanceTimersByTime(100); // Advance resolver delay\n * await flushMicrotasks(); // Let resolver complete\n * ```\n */\nexport async function flushMicrotasks(): Promise<void> {\n // Multiple rounds to catch nested microtasks\n for (let i = 0; i < 10; i++) {\n await Promise.resolve();\n }\n}\n\n/**\n * Wait for the system to settle with fake timers enabled.\n * Combines timer advancement with microtask flushing.\n *\n * @param system - The Directive system\n * @param advanceTime - Function to advance fake timers (e.g., vi.advanceTimersByTime)\n * @param options - Configuration options\n *\n * @example\n * ```typescript\n * vi.useFakeTimers();\n * const system = createSystem({ modules: [myModule] });\n * system.start();\n * system.dispatch({ type: \"triggerAsync\" });\n *\n * await settleWithFakeTimers(system, vi.advanceTimersByTime, {\n * totalTime: 1000,\n * stepSize: 10,\n * });\n *\n * expect(system.facts.result).toBe(\"done\");\n * ```\n */\nexport async function settleWithFakeTimers(\n system: { inspect(): SystemInspection },\n advanceTime: (ms: number) => void,\n options: {\n /** Total time to advance (default: 5000ms) */\n totalTime?: number;\n /** Time to advance each step (default: 10ms) */\n stepSize?: number;\n /** Maximum iterations before giving up (default: 1000) */\n maxIterations?: number;\n } = {},\n): Promise<void> {\n const { totalTime = 5000, stepSize = 10, maxIterations = 1000 } = options;\n\n let elapsed = 0;\n let iterations = 0;\n\n while (elapsed < totalTime && iterations < maxIterations) {\n // Flush microtasks first (handles queueMicrotask, Promise.resolve)\n await flushMicrotasks();\n\n // Check if settled\n const inspection = system.inspect();\n if (inspection.inflight.length === 0) {\n // One more flush to be safe\n await flushMicrotasks();\n return;\n }\n\n // Advance fake timers\n advanceTime(stepSize);\n elapsed += stepSize;\n iterations++;\n }\n\n // Final check\n const finalInspection = system.inspect();\n if (finalInspection.inflight.length > 0) {\n const resolverIds = finalInspection.inflight\n .map((r) => r.resolverId)\n .join(\", \");\n throw new Error(\n `[Directive] settleWithFakeTimers did not settle after ${totalTime}ms. ${finalInspection.inflight.length} resolvers still inflight: ${resolverIds}`,\n );\n }\n}\n\n// ============================================================================\n// Fake Timers (for standalone use without vi.useFakeTimers)\n// ============================================================================\n\nexport interface FakeTimers {\n /** Advance time by a number of milliseconds */\n advance(ms: number): Promise<void>;\n /** Advance to the next scheduled timer */\n next(): Promise<void>;\n /** Run all pending timers */\n runAll(): Promise<void>;\n /** Get current fake time */\n now(): number;\n /** Reset to time 0 */\n reset(): void;\n}\n\n/**\n * Create standalone fake timers for testing.\n * Note: For most tests, prefer using Vitest's vi.useFakeTimers() with\n * settleWithFakeTimers() for better integration.\n */\nexport function createFakeTimers(): FakeTimers {\n let currentTime = 0;\n const timers: Array<{ time: number; callback: () => void }> = [];\n\n return {\n async advance(ms: number): Promise<void> {\n const targetTime = currentTime + ms;\n\n // Run all timers that would fire during this advance\n while (timers.length > 0 && timers[0]!.time <= targetTime) {\n const timer = timers.shift()!;\n currentTime = timer.time;\n timer.callback();\n await Promise.resolve(); // Allow microtasks\n }\n\n currentTime = targetTime;\n },\n\n async next(): Promise<void> {\n if (timers.length === 0) return;\n\n const timer = timers.shift()!;\n currentTime = timer.time;\n timer.callback();\n await Promise.resolve();\n },\n\n async runAll(): Promise<void> {\n while (timers.length > 0) {\n await this.next();\n }\n },\n\n now(): number {\n return currentTime;\n },\n\n reset(): void {\n currentTime = 0;\n timers.length = 0;\n },\n };\n}\n\n// ============================================================================\n// Mock Resolvers\n// ============================================================================\n\n/** Context passed to mock resolver resolve functions */\nexport interface MockResolverContext {\n /** Facts object (use type assertion for specific facts) */\n // biome-ignore lint/suspicious/noExplicitAny: Facts type varies by system\n facts: any;\n /** Abort signal for cancellation */\n signal: AbortSignal;\n}\n\nexport interface MockResolverOptions<R extends Requirement = Requirement> {\n /** Predicate to check if this resolver handles a requirement */\n requirement?: (req: Requirement) => req is R;\n /** Mock implementation */\n resolve?: (req: R, ctx: MockResolverContext) => void | Promise<void>;\n /** Delay before resolving (ms) */\n delay?: number;\n /** Simulate an error */\n error?: Error | string;\n /** Track calls */\n calls?: R[];\n}\n\n/** Internal resolver definition type for mock resolvers */\ninterface MockResolverDef {\n requirement: (req: Requirement) => boolean;\n resolve: (req: Requirement, ctx: MockResolverContext) => Promise<void>;\n}\n\n/**\n * Create a mock resolver for testing.\n */\nexport function createMockResolver<R extends Requirement = Requirement>(\n typeOrOptions: string | MockResolverOptions<R>,\n): MockResolverDef {\n const options: MockResolverOptions<R> =\n typeof typeOrOptions === \"string\"\n ? {\n requirement: ((req: Requirement) => req.type === typeOrOptions) as (\n req: Requirement,\n ) => req is R,\n }\n : typeOrOptions;\n\n const calls: R[] = options.calls ?? [];\n\n return {\n requirement:\n options.requirement ?? ((_req: Requirement): _req is R => true),\n async resolve(req: Requirement, ctx: MockResolverContext): Promise<void> {\n calls.push(req as R);\n\n if (options.delay) {\n await new Promise((resolve) => setTimeout(resolve, options.delay));\n }\n\n if (options.error) {\n throw typeof options.error === \"string\"\n ? new Error(options.error)\n : options.error;\n }\n\n if (options.resolve) {\n await options.resolve(req as R, ctx);\n }\n },\n };\n}\n\n// ============================================================================\n// Mock Resolver (Advanced)\n// ============================================================================\n\n/**\n * A mock resolver that captures requirements for manual resolution.\n * Use this when you need fine-grained control over when and how requirements resolve.\n */\nexport interface MockResolver<R extends Requirement = Requirement> {\n /** All requirements received by this resolver */\n readonly calls: R[];\n /** Pending requirements waiting to be resolved/rejected */\n readonly pending: Array<{\n requirement: R;\n resolve: (result?: unknown) => void;\n reject: (error: Error) => void;\n }>;\n /** Resolve the next pending requirement */\n resolve(result?: unknown): void;\n /** Reject the next pending requirement */\n reject(error: Error): void;\n /** Resolve all pending requirements */\n resolveAll(result?: unknown): void;\n /** Reject all pending requirements */\n rejectAll(error: Error): void;\n /** Clear call history and pending queue */\n reset(): void;\n}\n\n/**\n * Create a mock resolver that captures requirements instead of resolving them.\n * This gives you manual control over requirement resolution in tests.\n *\n * @example\n * ```typescript\n * const fetchMock = mockResolver<{ type: \"FETCH_USER\"; id: string }>(\"FETCH_USER\");\n *\n * const system = createTestSystem({\n * modules: [userModule],\n * mocks: {\n * resolvers: {\n * FETCH_USER: { resolve: fetchMock.handler },\n * },\n * },\n * });\n *\n * system.facts.userId = \"123\";\n * await flushMicrotasks();\n *\n * // Requirement is pending\n * expect(fetchMock.calls).toHaveLength(1);\n * expect(fetchMock.calls[0].id).toBe(\"123\");\n *\n * // Manually resolve it\n * fetchMock.resolve({ name: \"John\" });\n * await flushMicrotasks();\n *\n * expect(system.facts.user).toEqual({ name: \"John\" });\n * ```\n */\nexport function mockResolver<R extends Requirement = Requirement>(\n _requirementType: string,\n): MockResolver<R> & {\n /** Handler that can be passed to createTestSystem mocks */\n handler: (req: Requirement, ctx: MockResolverContext) => Promise<void>;\n} {\n const calls: R[] = [];\n const pending: Array<{\n requirement: R;\n resolve: (result?: unknown) => void;\n reject: (error: Error) => void;\n }> = [];\n\n const mock: MockResolver<R> = {\n get calls() {\n return calls;\n },\n get pending() {\n return pending;\n },\n resolve(result?: unknown) {\n const item = pending.shift();\n if (item) {\n item.resolve(result);\n }\n },\n reject(error: Error) {\n const item = pending.shift();\n if (item) {\n item.reject(error);\n }\n },\n resolveAll(result?: unknown) {\n while (pending.length > 0) {\n this.resolve(result);\n }\n },\n rejectAll(error: Error) {\n while (pending.length > 0) {\n this.reject(error);\n }\n },\n reset() {\n calls.length = 0;\n pending.length = 0;\n },\n };\n\n const handler = (\n req: Requirement,\n _ctx: MockResolverContext,\n ): Promise<void> => {\n calls.push(req as R);\n return new Promise<void>((resolve, reject) => {\n pending.push({\n requirement: req as R,\n resolve: () => resolve(),\n reject,\n });\n });\n };\n\n return {\n ...mock,\n handler,\n };\n}\n\n// ============================================================================\n// Fact Change Tracking\n// ============================================================================\n\n/** Record of a single fact change */\nexport interface FactChangeRecord {\n /** The fact key that changed (without namespace prefix for namespaced systems) */\n key: string;\n /** The full key including namespace prefix (e.g., \"test::value\") */\n fullKey: string;\n /** The namespace (e.g., \"test\") - undefined for single-module systems */\n namespace?: string;\n /** The previous value */\n previousValue: unknown;\n /** The new value */\n newValue: unknown;\n /** Timestamp of the change */\n timestamp: number;\n}\n\n// ============================================================================\n// Test System\n// ============================================================================\n\nexport interface TestSystem<Modules extends ModulesMap>\n extends NamespacedSystem<Modules> {\n /**\n * Wait for all pending operations to complete.\n * @param maxWait - Maximum time to wait in ms (default: 5000)\n * @throws Error if timeout is exceeded with resolvers still inflight\n */\n waitForIdle(maxWait?: number): Promise<void>;\n /** Get the history of dispatched events */\n eventHistory: Array<{ type: string; [key: string]: unknown }>;\n /** Get resolver call history */\n resolverCalls: Map<string, Requirement[]>;\n /**\n * Get all requirements that have been generated (both resolved and pending).\n * Unlike `inspect().unmet`, this includes requirements that have already been handled.\n */\n readonly allRequirements: RequirementWithId[];\n /**\n * Get all fact changes since system start or last reset.\n */\n getFactsHistory(): FactChangeRecord[];\n /**\n * Reset the facts history tracking.\n */\n resetFactsHistory(): void;\n /** Assert that a requirement was created */\n assertRequirement(type: string): void;\n /** Assert that a resolver was called */\n assertResolverCalled(type: string, times?: number): void;\n /**\n * Assert that a fact was set to a specific value.\n */\n assertFactSet(key: string, value?: unknown): void;\n /**\n * Assert the number of times a fact was changed.\n */\n assertFactChanges(key: string, times: number): void;\n}\n\nexport interface CreateTestSystemOptions<Modules extends ModulesMap>\n extends Omit<CreateSystemOptionsNamed<Modules>, \"plugins\"> {\n /** Mock resolvers by type */\n mocks?: {\n resolvers?: Record<string, MockResolverOptions>;\n };\n /** Additional plugins (tracking plugin is added automatically) */\n // biome-ignore lint/suspicious/noExplicitAny: Plugins are schema-agnostic\n plugins?: Array<any>;\n}\n\n/**\n * Create a test system with additional testing utilities.\n */\nexport function createTestSystem<Modules extends ModulesMap>(\n options: CreateTestSystemOptions<Modules>,\n): TestSystem<Modules> {\n const eventHistory: Array<{ type: string; [key: string]: unknown }> = [];\n const resolverCalls = new Map<string, Requirement[]>();\n const allRequirements: RequirementWithId[] = [];\n const factsHistory: FactChangeRecord[] = [];\n\n // Create mock resolvers\n const mockResolvers: Record<string, MockResolverDef> = {};\n if (options.mocks?.resolvers) {\n for (const [type, mockOptions] of Object.entries(options.mocks.resolvers)) {\n const calls: Requirement[] = [];\n resolverCalls.set(type, calls);\n mockResolvers[type] = createMockResolver({ ...mockOptions, calls });\n }\n }\n\n // Create modules with mock resolvers\n const modulesWithMocks: Modules = {} as Modules;\n for (const [name, module] of Object.entries(options.modules)) {\n // biome-ignore lint/suspicious/noExplicitAny: Module types are complex\n (modulesWithMocks as any)[name] = {\n ...module,\n resolvers: {\n ...module.resolvers,\n ...mockResolvers,\n },\n };\n }\n\n // Get module namespaces for key parsing\n const moduleNamespaces = new Set(Object.keys(options.modules));\n\n // Create tracking plugin\n const trackingPlugin = {\n name: \"__test-tracking__\",\n onFactSet: (fullKey: string, value: unknown, previousValue: unknown) => {\n // Parse namespaced key (e.g., \"test::value\" -> namespace: \"test\", key: \"value\")\n const SEPARATOR = \"::\";\n const sepIndex = fullKey.indexOf(SEPARATOR);\n let namespace: string | undefined;\n let key: string;\n\n if (sepIndex > 0) {\n const possibleNamespace = fullKey.substring(0, sepIndex);\n if (moduleNamespaces.has(possibleNamespace)) {\n namespace = possibleNamespace;\n key = fullKey.substring(sepIndex + SEPARATOR.length);\n } else {\n key = fullKey;\n }\n } else {\n key = fullKey;\n }\n\n factsHistory.push({\n key,\n fullKey,\n namespace,\n previousValue,\n newValue: value,\n timestamp: Date.now(),\n });\n },\n onRequirementCreated: (requirement: RequirementWithId) => {\n allRequirements.push(requirement);\n },\n };\n\n // Create the underlying system\n const system = createSystem({\n ...options,\n modules: modulesWithMocks,\n plugins: [trackingPlugin, ...(options.plugins ?? [])],\n }) as NamespacedSystem<Modules>;\n\n // Wrap dispatch to track events\n const originalDispatch = system.dispatch.bind(system);\n // biome-ignore lint/suspicious/noExplicitAny: Event type varies\n (system as any).dispatch = (event: any) => {\n eventHistory.push(event);\n originalDispatch(event);\n };\n\n const testSystem: TestSystem<Modules> = {\n ...system,\n eventHistory,\n resolverCalls,\n\n get allRequirements() {\n return allRequirements;\n },\n\n getFactsHistory(): FactChangeRecord[] {\n return [...factsHistory];\n },\n\n resetFactsHistory(): void {\n factsHistory.length = 0;\n },\n\n async waitForIdle(maxWait = 5000): Promise<void> {\n const startTime = Date.now();\n\n const checkIdle = async (): Promise<void> => {\n // Wait for microtasks\n await new Promise((resolve) => setTimeout(resolve, 0));\n\n // Check if there are inflight resolvers\n const inspection = system.inspect();\n if (inspection.inflight.length > 0) {\n // Check timeout\n if (Date.now() - startTime > maxWait) {\n const resolverIds = inspection.inflight.map((r) => r.id).join(\", \");\n throw new Error(\n `[Directive] waitForIdle timed out after ${maxWait}ms. ${inspection.inflight.length} resolvers still inflight: ${resolverIds}`,\n );\n }\n // Wait a bit more and check again\n await new Promise((resolve) => setTimeout(resolve, 10));\n return checkIdle();\n }\n };\n\n return checkIdle();\n },\n\n assertRequirement(type: string): void {\n const hasRequirement = allRequirements.some(\n (r) => r.requirement.type === type,\n );\n if (!hasRequirement) {\n throw new Error(\n `Expected requirement of type \"${type}\" but none found`,\n );\n }\n },\n\n assertResolverCalled(type: string, times?: number): void {\n const calls = resolverCalls.get(type) ?? [];\n if (times !== undefined) {\n if (calls.length !== times) {\n throw new Error(\n `Expected resolver \"${type}\" to be called ${times} times but was called ${calls.length} times`,\n );\n }\n } else if (calls.length === 0) {\n throw new Error(\n `Expected resolver \"${type}\" to be called but it was not`,\n );\n }\n },\n\n assertFactSet(key: string, value?: unknown): void {\n const changes = factsHistory.filter((c) => c.key === key);\n if (changes.length === 0) {\n throw new Error(`Expected fact \"${key}\" to be set but it was not`);\n }\n if (value !== undefined) {\n const hasValue = changes.some((c) => c.newValue === value);\n if (!hasValue) {\n const actualValues = changes\n .map((c) => JSON.stringify(c.newValue))\n .join(\", \");\n throw new Error(\n `Expected fact \"${key}\" to be set to ${JSON.stringify(value)} but got: ${actualValues}`,\n );\n }\n }\n },\n\n assertFactChanges(key: string, times: number): void {\n const changes = factsHistory.filter((c) => c.key === key);\n if (changes.length !== times) {\n throw new Error(\n `Expected fact \"${key}\" to change ${times} times but it changed ${changes.length} times`,\n );\n }\n },\n };\n\n return testSystem;\n}\n"]}
|