@directive-run/core 0.7.0 → 0.8.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/types/errors.ts","../src/core/types/helpers.ts","../src/core/types/composition.ts","../src/core/schema-builders.ts","../src/core/module.ts","../src/utils/utils.ts","../src/utils/history.ts","../src/core/requirements.ts","../src/core/tracking.ts","../src/core/constraints.ts","../src/core/derivations.ts","../src/core/effects.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/requirement-status.ts","../src/utils/system-with-status.ts","../src/index.ts"],"names":["DirectiveError","message","source","sourceId","context","recoverable","createConstraintFactory","constraint","createResolverFactory","resolver","typedConstraint","typedResolver","isSingleModuleSystem","system","isNamespacedSystem","createSchemaType","validators","typeName","defaultValue","transform","description","refinements","fn","createChainableType","value","v","intermediate","desc","predicate","newRefinements","t","createChainableNumber","n","createChainableArray","elementType","indexRef","chainable","ref","et","newRef","i","item","validator","createChainableObject","shapeSchema","key","schemaType","schemaT","keys","k","values","valueSet","innerType","innerTypeName","types","typeNames","valueType","valueTypeName","val","uuidRegex","emailRegex","createModule","id","config","schemaDerivations","deriveImpl","schemaDerivationKeys","deriveKeys","schemaEvents","eventImpl","schemaEventKeys","eventKeys","schemaEventKeysForValidation","eventName","requirementTypes","resolverName","resolverDef","crossModuleDeps","createModuleFactory","name","withTimeout","promise","ms","errorMessage","timeoutId","timeoutPromise","_","reject","stableStringify","maxDepth","seen","stringify","depth","type","result","obj","isPrototypeSafe","dangerousKeys","check","objVal","shallowEqual","a","b","keysA","keysB","hashObject","str","hash","isSnapshotExpired","snapshot","now","validateSnapshot","expiredAt","diffSnapshots","oldSnapshot","newSnapshot","changes","compare","oldObj","newObj","path","oldRecord","newRecord","allKeys","childPath","versionChanged","isSignedSnapshot","signSnapshot","secret","payload","signature","hmacSha256","verifySnapshotSignature","signedSnapshot","expectedSignature","timingSafeEqual","secretBytes","algorithm","messageBytes","resolveHistoryOption","option","createHistoryManager","options","historyOption","facts","store","onSnapshot","onHistoryChange","isEnabled","maxSnapshots","snapshots","currentIndex","nextId","paused","restoring","changesets","pendingChangesetLabel","pendingChangesetStart","getCurrentFacts","serializeFacts","factsObj","deserializeFacts","serialized","trigger","steps","fromIndex","toIndex","cs","c","earlierCs","snapshotId","index","s","json","data","snap","error","label","createDisabledHistory","noopSnapshot","reqIdCache","generateRequirementId","req","keyFn","cached","rest","sortedRest","createRequirementWithId","requirement","fromConstraint","props","isRequirementType","forType","RequirementSet","_RequirementSet","copy","other","added","removed","unchanged","trackingStack","createTrackingContext","dependencies","nullContext","getCurrentTracker","isTracking","withTracking","withoutTracking","saved","ctx","trackAccess","BLOCKED_PROPS","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","cycleStart","cycle","isAsyncConstraint","initState","isAsync","state","getState","updateDependencies","newDeps","oldDeps","same","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","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","hasAfterDeps","depSet","merged","createDerivationsManager","_store","onCompute","onInvalidate","listeners","factToDerivedDeps","derivedToDerivedDeps","invalidationDepth","pendingNotifications","isFlushing","MAX_FLUSH_ITERATIONS","derivedProxy","computeDerivation","oldValue","flushNotifications","iterations","remaining","ids","listener","invalidateDerivation","startId","queue","dependent","prop","factKeys","idStr","listenerSet","STABLE_THRESHOLD","createEffectsManager","onRun","previousSnapshot","stopped","createSnapshot","shouldRun","runCleanup","storeCleanup","runEffect","effectPromise","trackingResult","trackedDeps","effectsToRun","effectIds","createRetryLaterManager","delayMs","maxRetries","backoffMultiplier","maxDelayMs","pendingRetries","calculateDelay","attempt","delay","callback","entry","dueRetries","DEFAULT_STRATEGIES","createErrorBoundaryManager","onRecovery","errors","maxErrors","retryLaterManager","retryAttempts","MAX_RETRY_SOURCES","toDirectiveError","getStrategy","handler","e","directiveError","strategy","oldest","safeStringify","maxLength","createFactsStore","schema","onChange","onBatch","isTypeAssertionSchema","validate","strictKeys","redactErrors","map","knownKeys","keyListeners","allListeners","batching","batchChanges","dirtyKeys","isNotifying","pendingNonBatchedChanges","MAX_NOTIFY_ITERATIONS","isZodSchema","getExpectedType","st","formatValueForError","validateValue","valuePreview","expectedType","indexHint","validatorHint","notifyKey","notifyAll","notifyNonBatched","prev","deferred","change","flush","keyStr","set","newSchema","createFactsProxy","createFacts","createPluginManager","plugins","safeCall","safeCallAsync","broadcast","hook","args","plugin","p","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","createContext","signal","handleRetryError","retryPolicy","controller","normalizedError","resolve","abortHandler","executeResolve","resolverId","lastError","resolvePromise","duration","executeBatch","batchConfig","startedAt","reqPayloads","results","hasFailures","addToBatch","batch","processBatch","requirementId","idx","status","reqId","createEngine","mergedSchema","mergedEvents","mergedDerive","mergedEffects","mergedConstraints","mergedResolvers","schemaOwners","module","validateKeys","section","existingOwner","snapshotEventNames","m","mod","dispatchDepth","shouldTakeSnapshot","derivationNames","pluginManager","errorBoundary","retryLaterTimer","invalidateManyDerivations","historyRef","traceEnabled","maxRuns","traceEntries","traceById","traceIdCounter","currentTrace","pendingFactChanges","resolverTraceMap","traceInflightCount","traceStartMs","traceCache","traceCacheVersion","currentCacheVersion","traceStats","scheduleReconcile","derivationsManager","effectsManager","constraintsManager","finalizeTrace","traceId","startMs","buildCausalChain","updateTraceStats","decrementTraceInflight","evictOldestTrace","evicted","rId","parts","fc","d","rs","resolverCount","factChangeCount","anomalies","resolversManager","notifySettlementChange","historyListeners","notifyHistoryChange","historyManager","from","to","settlementListeners","MAX_RECONCILE_DEPTH","MAX_DEFERRED_REGISTRATIONS","reconcileDepth","dynamicIds","originals","RESERVED_DERIVE_NAMES","deferredRegistrations","validateDefId","registerDefinition","applyRegister","assignDefinition","applyAssign","unregisterDefinition","applyUnregister","callDefinition","constraintDef","effectDef","original","flushDeferredRegistrations","ops","op","reconcile","reconcileStartMs","keysForConstraints","currentRequirements","currentSet","hitConstraintIds","cId","cState","cDeps","inflightNow","inflightById","info","inflightInfo","inflightCount","deriveMethods","deriveAccessor","eventsAccessor","intervalMs","event","derivationId","derivationIds","unsubs","u","isEqual","previousValue","newValue","next","old","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","mods","createNamespacedSystem","moduleNamespaces","historyConfig","snapshotModulesSet","orderedNamespaces","initOrder","explicitOrder","missingModules","ns","history","trace","isDev","flatModules","hasCrossModuleDeps","depNamespaces","prefixedFacts","prefixedDerivations","prefixedEvents","prefixedInit","moduleFactsProxy","createModuleFactsProxy","prefixedDerive","derive","factsProxy","createCrossModuleFactsProxy","deriveProxy","createModuleDeriveProxy","prefixedEventHandlers","prefixedConstraints","prefixedResolvers","namespacedFacts","createNamespacedFactsProxy","prefixedEffects","effect","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","moduleEventsProxyCache","moduleEventsProxy","eventsProxy","createRequirementStatusPlugin","notify","getOrCreateSet","getStatus","pendingSet","inflightSet","failedSet","getAllStatus","allTypes","subscribe","reset","_resolver","createStatusHook","statusPlugin","createSystemWithStatus","allPlugins","Backoff"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\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 // biome-ignore lint/suspicious/noConfusingVoidType: void semantics needed for implicit no-return\n | ((error: Error, constraint: string) => RecoveryStrategy | void);\n onResolverError?:\n | RecoveryStrategy\n // biome-ignore lint/suspicious/noConfusingVoidType: void semantics needed for implicit no-return\n | ((error: Error, resolver: string) => RecoveryStrategy | void);\n onEffectError?:\n | RecoveryStrategy\n // biome-ignore lint/suspicious/noConfusingVoidType: void semantics needed for implicit no-return\n | ((error: Error, effect: string) => RecoveryStrategy | void);\n onDerivationError?:\n | RecoveryStrategy\n // biome-ignore lint/suspicious/noConfusingVoidType: void semantics needed for implicit no-return\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 * Type Helpers - External typed constraint and resolver definitions\n *\n * These types enable defining constraints and resolvers with full type safety\n * outside of module definitions, while maintaining proper type inference.\n */\n\nimport type { Facts } from \"./facts.js\";\nimport type { Requirement, RequirementOutput } from \"./requirements.js\";\nimport type { BatchConfig, ResolverContext, RetryPolicy } from \"./resolvers.js\";\nimport type { Schema } from \"./schema.js\";\n\n// ============================================================================\n// Typed Constraint Definition\n// ============================================================================\n\n/**\n * External constraint definition with full typing.\n * Use this when defining constraints outside of createModule().\n *\n * @typeParam S - The schema type\n * @typeParam R - The requirement type (defaults to Requirement)\n *\n * @example\n * ```typescript\n * // Define a typed constraint factory\n * const createMaxCountConstraint = <S extends Schema>(\n * maxCount: number\n * ): TypedConstraint<S, { type: \"RESET_COUNT\" }> => ({\n * priority: 10,\n * when: (facts) => (facts as { count: number }).count > maxCount,\n * require: { type: \"RESET_COUNT\" },\n * });\n *\n * // Use in module\n * const module = createModule(\"counter\", {\n * schema: { count: t.number() },\n * constraints: {\n * maxCount: createMaxCountConstraint(100),\n * },\n * });\n * ```\n */\nexport interface TypedConstraint<\n S extends Schema,\n R extends Requirement = Requirement,\n> {\n /** Priority for ordering (higher runs first) */\n priority?: number;\n /** Mark this constraint as async (avoids runtime detection) */\n async?: boolean;\n /** Condition function (sync or async) */\n when: (facts: Facts<S>) => boolean | Promise<boolean>;\n /**\n * Requirement(s) to produce when condition is met.\n */\n require: RequirementOutput<R> | ((facts: Facts<S>) => RequirementOutput<R>);\n /** Timeout for async constraints (ms) */\n timeout?: number;\n /**\n * Constraint IDs whose resolvers must complete before this constraint is evaluated.\n * - If dependency's `when()` returns false, this constraint proceeds (nothing to wait for)\n * - If dependency's resolver fails, this constraint remains blocked until it succeeds\n * - Cross-module: use the constraint ID as it appears in the merged system\n */\n after?: string[];\n}\n\n// ============================================================================\n// Typed Resolver Definition\n// ============================================================================\n\n/**\n * External resolver definition with full typing.\n * Use this when defining resolvers outside of createModule().\n *\n * @typeParam S - The schema type\n * @typeParam R - The requirement type (defaults to Requirement)\n *\n * @example\n * ```typescript\n * // Define a typed resolver factory\n * interface FetchUserReq extends Requirement {\n * type: \"FETCH_USER\";\n * userId: string;\n * }\n *\n * const createFetchUserResolver = <S extends Schema>(\n * fetchFn: (userId: string) => Promise<User>\n * ): TypedResolver<S, FetchUserReq> => ({\n * requirement: (req): req is FetchUserReq => req.type === \"FETCH_USER\",\n * key: (req) => `fetch-user-${req.userId}`,\n * retry: { attempts: 3, backoff: \"exponential\" },\n * resolve: async (req, ctx) => {\n * const user = await fetchFn(req.userId);\n * (ctx.facts as { user: User }).user = user;\n * },\n * });\n * ```\n */\nexport interface TypedResolver<\n S extends Schema,\n R extends Requirement = Requirement,\n> {\n /**\n * Requirement type to handle.\n * - String: matches `req.type` directly (e.g., `requirement: \"FETCH_USER\"`)\n * - Function: type guard predicate (e.g., `requirement: (req) => req.type === \"FETCH_USER\"`)\n */\n requirement: R[\"type\"] | ((req: Requirement) => req is R);\n /** Custom key function for deduplication */\n key?: (req: R) => string;\n /** Retry policy */\n retry?: RetryPolicy;\n /** Timeout for resolver execution (ms) */\n timeout?: number;\n /** Batch configuration */\n batch?: BatchConfig;\n /** Resolve function for single requirement */\n resolve?: (req: R, ctx: ResolverContext<S>) => Promise<void>;\n /** Resolve function for batched requirements */\n resolveBatch?: (reqs: R[], ctx: ResolverContext<S>) => Promise<void>;\n}\n\n// ============================================================================\n// Factory Functions\n// ============================================================================\n\n/**\n * Create a typed constraint factory for a specific schema.\n * This enables creating reusable constraint definitions with proper typing.\n *\n * @example\n * ```typescript\n * const schema = { count: t.number(), threshold: t.number() };\n * const factory = createConstraintFactory<typeof schema>();\n *\n * const maxCountConstraint = factory.create({\n * when: (facts) => facts.count > facts.threshold,\n * require: { type: \"RESET\" },\n * });\n * ```\n */\nexport function createConstraintFactory<S extends Schema>() {\n return {\n /**\n * Create a typed constraint\n */\n create<R extends Requirement = Requirement>(\n constraint: TypedConstraint<S, R>,\n ): TypedConstraint<S, R> {\n return constraint;\n },\n };\n}\n\n/**\n * Create a typed resolver factory for a specific schema.\n * This enables creating reusable resolver definitions with proper typing.\n *\n * @example\n * ```typescript\n * const schema = { user: t.object<User>() };\n * const factory = createResolverFactory<typeof schema>();\n *\n * const fetchUserResolver = factory.create<FetchUserReq>({\n * requirement: (req): req is FetchUserReq => req.type === \"FETCH_USER\",\n * resolve: async (req, ctx) => {\n * ctx.facts.user = await fetchUser(req.userId);\n * },\n * });\n * ```\n */\nexport function createResolverFactory<S extends Schema>() {\n return {\n /**\n * Create a typed resolver\n */\n create<R extends Requirement = Requirement>(\n resolver: TypedResolver<S, R>,\n ): TypedResolver<S, R> {\n return resolver;\n },\n };\n}\n\n// ============================================================================\n// Simple Helper Functions\n// ============================================================================\n\n/**\n * Type-safe constraint creator.\n * Simpler alternative to createConstraintFactory when you don't need a factory pattern.\n *\n * @example\n * ```typescript\n * const constraint = typedConstraint<typeof schema, { type: \"RESET\" }>({\n * when: (facts) => facts.count > 100,\n * require: { type: \"RESET\" },\n * });\n * ```\n */\nexport function typedConstraint<\n S extends Schema,\n R extends Requirement = Requirement,\n>(constraint: TypedConstraint<S, R>): TypedConstraint<S, R> {\n return constraint;\n}\n\n/**\n * Type-safe resolver creator.\n * Simpler alternative to createResolverFactory when you don't need a factory pattern.\n *\n * @example\n * ```typescript\n * const resolver = typedResolver<typeof schema, FetchUserReq>({\n * requirement: (req): req is FetchUserReq => req.type === \"FETCH_USER\",\n * resolve: async (req, ctx) => {\n * ctx.facts.user = await fetchUser(req.userId);\n * },\n * });\n * ```\n */\nexport function typedResolver<\n S extends Schema,\n R extends Requirement = Requirement,\n>(resolver: TypedResolver<S, R>): TypedResolver<S, R> {\n return resolver;\n}\n","/**\n * Composition Types - Type definitions for single and multi-module systems\n *\n * Single module = direct access (no namespace):\n * @example\n * ```typescript\n * const system = createSystem({ modules: counterModule });\n * system.facts.count // Direct access\n * system.events.increment() // Direct events\n * ```\n *\n * Multiple modules = namespaced access:\n * @example\n * ```typescript\n * const system = createSystem({\n * modules: { auth: authModule, data: dataModule },\n * });\n * system.facts.auth.token // Namespaced access\n * system.derive.data.userCount // Namespaced derivations\n * system.events.auth.login() // Namespaced events\n * ```\n */\n\nimport type { ErrorBoundaryConfig } from \"./errors.js\";\nimport type { Facts } from \"./facts.js\";\nimport type { ModuleDef } from \"./module.js\";\nimport type { Plugin } from \"./plugins.js\";\nimport type {\n InferDerivations,\n InferEvents,\n InferFacts,\n ModuleSchema,\n} from \"./schema.js\";\nimport type {\n ConstraintsControl,\n DerivationsControl,\n DistributableSnapshot,\n DistributableSnapshotOptions,\n EffectsControl,\n ResolversControl,\n TraceEntry,\n TraceOption,\n SystemInspection,\n SystemSnapshot,\n HistoryAPI,\n HistoryOption,\n} from \"./system.js\";\n\n// ============================================================================\n// Module Map Types\n// ============================================================================\n\n/**\n * Extract the schema type from a module definition.\n */\nexport type ExtractSchema<M> = M extends ModuleDef<infer S> ? S : never;\n\n/**\n * Map of module name to module definition (object form).\n *\n * Uses `ModuleDef<any>` instead of `ModuleDef<ModuleSchema>` to preserve\n * specific schema types during inference. The actual schema types are\n * extracted via `ExtractSchema<M>` where needed.\n */\n// biome-ignore lint/suspicious/noExplicitAny: Required for TypeScript to preserve specific module schema types during inference\nexport type ModulesMap = Record<string, ModuleDef<any>>;\n\n// ============================================================================\n// Cross-Module Facts Types (for module-level type hints)\n// ============================================================================\n\n/**\n * Map of module name to schema (for cross-module typing).\n */\nexport type SchemasMap = Record<string, ModuleSchema>;\n\n/**\n * Create namespaced facts type from a map of schemas.\n * Use this to type cross-module effects and constraints within modules.\n *\n * @example\n * ```typescript\n * // types.ts - Create the combined type from schemas\n * import { authSchema } from './modules/auth';\n * import { dataSchema } from './modules/data';\n * import { uiSchema } from './modules/ui';\n * import type { CrossModuleFacts } from '@directive-run/core';\n *\n * export type AllFacts = CrossModuleFacts<{\n * auth: typeof authSchema;\n * data: typeof dataSchema;\n * ui: typeof uiSchema;\n * }>;\n *\n * // modules/ui.ts - Use the combined type in effects\n * import type { AllFacts } from '../types';\n *\n * effects: {\n * onAuthChange: {\n * run: (facts: AllFacts, prev: AllFacts | undefined) => {\n * facts.auth.isAuthenticated // ✅ typed!\n * facts.data.users // ✅ typed!\n * }\n * }\n * }\n * ```\n */\nexport type CrossModuleFacts<Schemas extends SchemasMap> = {\n [K in keyof Schemas]: InferFacts<Schemas[K]>;\n};\n\n/**\n * Create namespaced derivations type from a map of schemas.\n * Use this to type cross-module effects that read derivations.\n *\n * @example\n * ```typescript\n * import type { CrossModuleDerivations } from '@directive-run/core';\n *\n * export type AllDerivations = CrossModuleDerivations<{\n * auth: typeof authSchema;\n * data: typeof dataSchema;\n * }>;\n * ```\n */\nexport type CrossModuleDerivations<Schemas extends SchemasMap> = {\n readonly [K in keyof Schemas]: InferDerivations<Schemas[K]>;\n};\n\n// ============================================================================\n// Cross-Module Dependencies Types (for module-level crossModuleDeps)\n// ============================================================================\n\n/**\n * Map of namespace to schema for cross-module dependencies.\n * Used in module config to declare type-safe access to other modules' facts.\n */\nexport type CrossModuleDeps = Record<string, ModuleSchema>;\n\n/**\n * Cross-module facts type using \"self\" for own module.\n * Own module accessed via `facts.self.*`, dependencies via `facts.{dep}.*`.\n *\n * @example\n * ```typescript\n * // For a \"data\" module with crossModuleDeps: { auth: authSchema }\n * facts.self.users // ✅ own module via \"self\"\n * facts.auth.isAuthenticated // ✅ cross-module via namespace\n * ```\n */\nexport type CrossModuleFactsWithSelf<\n OwnSchema extends ModuleSchema,\n Deps extends CrossModuleDeps,\n> = { self: InferFacts<OwnSchema> } & {\n [K in keyof Deps]: InferFacts<Deps[K]>;\n};\n\n// ============================================================================\n// Namespaced Facts Types\n// ============================================================================\n\n/**\n * Namespace facts under module keys.\n * `facts.auth.token` instead of `facts.auth_token`\n */\nexport type NamespacedFacts<Modules extends ModulesMap> = {\n readonly [K in keyof Modules]: InferFacts<ExtractSchema<Modules[K]>>;\n};\n\n/**\n * Mutable version for constraint/resolver callbacks.\n */\nexport type MutableNamespacedFacts<Modules extends ModulesMap> = {\n [K in keyof Modules]: InferFacts<ExtractSchema<Modules[K]>>;\n};\n\n// ============================================================================\n// Namespaced Derivations Types\n// ============================================================================\n\n/**\n * Namespace derivations under module keys.\n * `derive.auth.status` instead of `derive.auth_status`\n */\nexport type NamespacedDerivations<Modules extends ModulesMap> = {\n readonly [K in keyof Modules]: InferDerivations<ExtractSchema<Modules[K]>>;\n};\n\n// ============================================================================\n// Union Event Types\n// ============================================================================\n\n/**\n * Union of all module events (not namespaced).\n * Events stay as discriminated union for dispatch.\n */\nexport type UnionEvents<Modules extends ModulesMap> = {\n [K in keyof Modules]: InferEvents<ExtractSchema<Modules[K]>>;\n}[keyof Modules];\n\n// ============================================================================\n// Namespaced System Options\n// ============================================================================\n\n/**\n * Options for createSystem with object modules (namespaced mode).\n */\nexport interface CreateSystemOptionsNamed<Modules extends ModulesMap> {\n /** Modules as object = namespaced access */\n modules: Modules;\n /** Plugins to register */\n plugins?: Array<Plugin<ModuleSchema>>;\n /** History configuration for snapshot-based state history */\n history?: HistoryOption;\n /** Trace: per-run reconciliation changelog */\n trace?: TraceOption;\n /** Error boundary configuration */\n errorBoundary?: ErrorBoundaryConfig;\n /**\n * Tick interval for time-based systems (ms).\n */\n tickMs?: number;\n /**\n * Enable zero-config mode with sensible defaults.\n */\n zeroConfig?: boolean;\n /**\n * Initial facts to set after module init (namespaced format).\n * Applied after all module `init()` functions but before reconciliation.\n *\n * @example\n * ```typescript\n * createSystem({\n * modules: { auth, data },\n * initialFacts: {\n * auth: { token: \"restored-token\", user: cachedUser },\n * data: { users: preloadedUsers },\n * },\n * });\n * ```\n */\n initialFacts?: Partial<{\n [K in keyof Modules]: Partial<InferFacts<ExtractSchema<Modules[K]>>>;\n }>;\n /**\n * Init order strategy:\n * - \"auto\" (default): Sort by crossModuleDeps topology\n * - \"declaration\": Use object key order (current behavior)\n * - string[]: Explicit order by namespace\n */\n initOrder?: \"auto\" | \"declaration\" | Array<keyof Modules & string>;\n}\n\n// ============================================================================\n// Namespaced System Interface\n// ============================================================================\n\n/**\n * System interface for namespaced modules.\n * Facts and derivations are accessed via module namespaces.\n */\nexport interface NamespacedSystem<Modules extends ModulesMap> {\n /** System mode discriminator for type guards */\n readonly _mode: \"namespaced\";\n /** Namespaced facts accessor: system.facts.auth.token */\n readonly facts: MutableNamespacedFacts<Modules>;\n /** History API for undo/redo, rollback, audit trails (if enabled) */\n readonly history: HistoryAPI | null;\n /** Namespaced derivations accessor: system.derive.auth.status */\n readonly derive: NamespacedDerivations<Modules> & DerivationsControl;\n /** Events accessor (union of all module events) */\n readonly events: NamespacedEventsAccessor<Modules>;\n /** Runtime control for constraints (disable/enable/isDisabled + dynamic CRUD) */\n readonly constraints: ConstraintsControl;\n /** Runtime control for effects (disable/enable/isEnabled + dynamic CRUD) */\n readonly effects: EffectsControl;\n /** Runtime control for resolvers (dynamic CRUD) */\n readonly resolvers: ResolversControl;\n /** Per-run trace entries (null if trace is not enabled) */\n readonly trace: TraceEntry[] | null;\n\n /** Initialize facts and derivations without starting reconciliation. Safe for SSR. */\n initialize(): void;\n /** Start the system (initialize modules, begin reconciliation) */\n start(): void;\n /** Stop the system (cancel resolvers, stop reconciliation) */\n stop(): void;\n /** Destroy the system (stop and cleanup) */\n destroy(): void;\n\n /** Whether the system is currently running */\n readonly isRunning: boolean;\n /** Whether all resolvers have completed */\n readonly isSettled: boolean;\n /** Whether all modules have completed initialization */\n readonly isInitialized: boolean;\n /** Whether system has completed first reconciliation */\n readonly isReady: boolean;\n\n /** Wait for system to be fully ready (after first reconciliation) */\n whenReady(): Promise<void>;\n\n /**\n * Hydrate facts from async source (call before start).\n * Useful for restoring state from localStorage, API, etc.\n *\n * @example\n * ```typescript\n * const system = createSystem({ modules: { auth, data } });\n * await system.hydrate(async () => {\n * const stored = localStorage.getItem(\"app-state\");\n * return stored ? JSON.parse(stored) : {};\n * });\n * system.start();\n * ```\n */\n hydrate(\n loader: () =>\n | Promise<\n Partial<{\n [K in keyof Modules]: Partial<\n InferFacts<ExtractSchema<Modules[K]>>\n >;\n }>\n >\n | Partial<{\n [K in keyof Modules]: Partial<InferFacts<ExtractSchema<Modules[K]>>>;\n }>,\n ): Promise<void>;\n\n /** Dispatch an event (union of all module events) */\n dispatch(event: UnionEvents<Modules>): void;\n\n /** Batch multiple fact changes */\n batch(fn: () => void): void;\n\n /**\n * Subscribe to settlement state changes.\n * Called whenever the system's settled state may have changed\n * (resolver starts/completes, reconcile starts/ends).\n */\n onSettledChange(listener: () => void): () => void;\n\n /** Subscribe to history state changes (snapshot taken, navigation). */\n onHistoryChange(listener: () => void): () => void;\n\n /**\n * Read a derivation value by namespaced key.\n * Accepts \"namespace.key\" format (e.g., \"auth.status\").\n *\n * @example\n * system.read(\"auth.status\") // → \"authenticated\"\n * system.read(\"data.count\") // → 5\n */\n read<T = unknown>(derivationId: string): T;\n\n /**\n * Subscribe to fact or derivation changes using namespaced keys.\n * Keys are auto-detected — pass any mix of fact keys and derivation keys.\n * Accepts \"namespace.key\" format (e.g., \"auth.status\", \"auth.token\").\n * Supports wildcard \"namespace.*\" to subscribe to all keys in a module.\n *\n * @example\n * system.subscribe([\"auth.token\", \"data.count\"], () => {\n * console.log(\"Auth or data changed\");\n * });\n *\n * @example Wildcard\n * system.subscribe([\"game.*\"], () => render());\n */\n subscribe(ids: string[], listener: () => void): () => void;\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 * system.subscribeModule(\"game\", () => render());\n * system.subscribeModule(\"chat\", () => render());\n */\n subscribeModule(\n namespace: keyof Modules & string,\n listener: () => void,\n ): () => void;\n\n /**\n * Watch a fact or derivation for changes using namespaced key.\n * The key is auto-detected -- works with both fact keys and derivation keys.\n * Accepts \"namespace.key\" format (e.g., \"auth.status\", \"auth.token\").\n * Pass `options.equalityFn` for custom comparison (e.g., shallow equality for objects).\n *\n * @example\n * system.watch(\"auth.token\", (newVal, oldVal) => {\n * console.log(`Token changed from ${oldVal} to ${newVal}`);\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\n /**\n * Returns a promise that resolves when the predicate becomes true.\n * The predicate is evaluated against current facts and re-evaluated on every change.\n * Uses namespaced facts: `facts.auth.token`, `facts.data.count`, etc.\n * Optionally pass a timeout in ms -- rejects with an error if exceeded.\n *\n * @example\n * await system.when((facts) => facts.auth.token !== null);\n * await system.when((facts) => facts.auth.token !== null, { timeout: 5000 });\n */\n when(\n predicate: (facts: Readonly<MutableNamespacedFacts<Modules>>) => boolean,\n options?: { timeout?: number },\n ): Promise<void>;\n\n /** Inspect system state */\n inspect(): SystemInspection;\n /** Wait for system to settle (all resolvers complete) */\n settle(maxWait?: number): Promise<void>;\n /** Explain why a requirement exists */\n explain(requirementId: string): string | null;\n /** Get serializable snapshot of system state */\n getSnapshot(): SystemSnapshot;\n /** Restore system state from snapshot */\n restore(snapshot: SystemSnapshot): void;\n\n /**\n * Register a new module into a running system.\n * The module is initialized, wired into constraint/resolver/derivation graphs,\n * and reconciliation is triggered.\n *\n * @example\n * ```typescript\n * // Lazy-load a module\n * const chatModule = await import('./modules/chat');\n * system.registerModule(\"chat\", chatModule.default);\n * ```\n */\n registerModule<S extends ModuleSchema>(\n namespace: string,\n moduleDef: ModuleDef<S>,\n ): void;\n\n /**\n * Get a distributable snapshot of computed derivations.\n * Use \"namespace.key\" format for derivation keys.\n *\n * @example\n * ```typescript\n * const snapshot = system.getDistributableSnapshot({\n * includeDerivations: ['auth.effectivePlan', 'auth.canUseFeature'],\n * ttlSeconds: 3600,\n * });\n * await redis.setex(`entitlements:${userId}`, 3600, JSON.stringify(snapshot));\n * ```\n */\n getDistributableSnapshot<T = Record<string, unknown>>(\n options?: DistributableSnapshotOptions,\n ): DistributableSnapshot<T>;\n\n /**\n * Watch for changes to distributable snapshot derivations.\n * Calls the callback whenever any of the included derivations change.\n * Use \"namespace.key\" format for derivation keys.\n * Returns an unsubscribe function.\n *\n * @example\n * ```typescript\n * const unsubscribe = system.watchDistributableSnapshot(\n * { includeDerivations: ['auth.effectivePlan', 'auth.canUseFeature'] },\n * (snapshot) => {\n * await redis.setex(`entitlements:${userId}`, 3600, JSON.stringify(snapshot));\n * }\n * );\n * ```\n */\n watchDistributableSnapshot<T = Record<string, unknown>>(\n options: DistributableSnapshotOptions,\n callback: (snapshot: DistributableSnapshot<T>) => void,\n ): () => void;\n}\n\n/**\n * Events accessor that groups event dispatchers by module namespace.\n */\nexport type NamespacedEventsAccessor<Modules extends ModulesMap> = {\n readonly [K in keyof Modules]: EventsDispatcherForModule<Modules[K]>;\n};\n\n/**\n * Event dispatcher functions for a single module.\n */\ntype EventsDispatcherForModule<M> = M extends ModuleDef<infer S>\n ? S extends ModuleSchema\n ? S[\"events\"] extends Record<string, unknown>\n ? {\n [E in keyof S[\"events\"]]: S[\"events\"][E] extends Record<\n string,\n unknown\n >\n ? keyof S[\"events\"][E] extends never\n ? () => void\n : (payload: InferEventPayload<S[\"events\"][E]>) => void\n : () => void;\n }\n : Record<string, never>\n : Record<string, never>\n : Record<string, never>;\n\n/**\n * Infer event payload from event schema.\n */\ntype InferEventPayload<E> = E extends Record<string, unknown>\n ? { [K in keyof E]: E[K] extends { _type: infer T } ? T : E[K] }\n : never;\n\n// ============================================================================\n// Merged Schema Type (for internal use)\n// ============================================================================\n\n/**\n * Merge multiple module schemas into a single flat schema.\n * Used internally by the engine for storage.\n *\n * @example\n * ```typescript\n * // auth: { facts: { token: string } }\n * // data: { facts: { users: User[] } }\n * // Merged: { auth_token: string, data_users: User[] }\n * ```\n */\nexport type MergedModuleSchema<Modules extends ModulesMap> = {\n facts: MergeFactsWithPrefix<Modules>;\n derivations: MergeDerivationsWithPrefix<Modules>;\n events: MergeEventsWithPrefix<Modules>;\n requirements: MergeRequirementsWithPrefix<Modules>;\n};\n\ntype MergeFactsWithPrefix<Modules extends ModulesMap> = {\n [K in keyof Modules as `${K & string}::${keyof ExtractSchema<Modules[K]>[\"facts\"] & string}`]: ExtractSchema<\n Modules[K]\n >[\"facts\"][keyof ExtractSchema<Modules[K]>[\"facts\"]];\n};\n\ntype MergeDerivationsWithPrefix<Modules extends ModulesMap> = {\n [K in keyof Modules as ExtractSchema<\n Modules[K]\n >[\"derivations\"] extends Record<string, unknown>\n ? `${K & string}::${keyof ExtractSchema<Modules[K]>[\"derivations\"] & string}`\n : never]: ExtractSchema<Modules[K]>[\"derivations\"] extends Record<\n string,\n unknown\n >\n ? ExtractSchema<Modules[K]>[\"derivations\"][keyof ExtractSchema<\n Modules[K]\n >[\"derivations\"]]\n : never;\n};\n\ntype MergeEventsWithPrefix<Modules extends ModulesMap> = {\n [K in keyof Modules as ExtractSchema<Modules[K]>[\"events\"] extends Record<\n string,\n unknown\n >\n ? `${K & string}::${keyof ExtractSchema<Modules[K]>[\"events\"] & string}`\n : never]: ExtractSchema<Modules[K]>[\"events\"] extends Record<\n string,\n unknown\n >\n ? ExtractSchema<Modules[K]>[\"events\"][keyof ExtractSchema<\n Modules[K]\n >[\"events\"]]\n : never;\n};\n\ntype MergeRequirementsWithPrefix<Modules extends ModulesMap> = {\n [K in keyof Modules as ExtractSchema<\n Modules[K]\n >[\"requirements\"] extends Record<string, unknown>\n ? keyof ExtractSchema<Modules[K]>[\"requirements\"] & string\n : never]: ExtractSchema<Modules[K]>[\"requirements\"] extends Record<\n string,\n unknown\n >\n ? ExtractSchema<Modules[K]>[\"requirements\"][keyof ExtractSchema<\n Modules[K]\n >[\"requirements\"]]\n : never;\n};\n\n// ============================================================================\n// Single Module Types (no namespace)\n// ============================================================================\n\n/**\n * Options for createSystem with a single module (no namespacing).\n */\nexport interface CreateSystemOptionsSingle<S extends ModuleSchema> {\n /** Single module = direct access (use `modules` for multiple) */\n module: ModuleDef<S>;\n /** Plugins to register */\n plugins?: Array<Plugin<ModuleSchema>>;\n /** History configuration for snapshot-based state history */\n history?: HistoryOption;\n /** Trace: per-run reconciliation changelog */\n trace?: TraceOption;\n /** Error boundary configuration */\n errorBoundary?: ErrorBoundaryConfig;\n /** Tick interval for time-based systems (ms) */\n tickMs?: number;\n /** Enable zero-config mode with sensible defaults */\n zeroConfig?: boolean;\n /**\n * Initial facts to set after module init.\n * Applied after module `init()` but before reconciliation.\n */\n initialFacts?: Partial<InferFacts<S>>;\n}\n\n/**\n * System interface for a single module (no namespace).\n * Facts, derivations, and events are accessed directly.\n */\nexport interface SingleModuleSystem<S extends ModuleSchema> {\n /** System mode discriminator for type guards */\n readonly _mode: \"single\";\n /** Direct facts accessor: system.facts.count */\n readonly facts: Facts<S[\"facts\"]>;\n /** History API for undo/redo, rollback, audit trails (if enabled) */\n readonly history: HistoryAPI | null;\n /** Direct derivations accessor: system.derive.doubled */\n readonly derive: InferDerivations<S> & DerivationsControl<S>;\n /** Direct events accessor: system.events.increment() */\n readonly events: SingleModuleEvents<S>;\n /** Runtime control for constraints (disable/enable/isDisabled) */\n readonly constraints: ConstraintsControl<S>;\n /** Runtime control for effects (disable/enable/isEnabled) */\n readonly effects: EffectsControl<S>;\n /** Runtime control for resolvers (register/assign/unregister/call) */\n readonly resolvers: ResolversControl<S>;\n /** Per-run trace entries (null if trace is not enabled) */\n readonly trace: TraceEntry[] | null;\n\n /** Initialize facts and derivations without starting reconciliation. Safe for SSR. */\n initialize(): void;\n /** Start the system (initialize modules, begin reconciliation) */\n start(): void;\n /** Stop the system (cancel resolvers, stop reconciliation) */\n stop(): void;\n /** Destroy the system (stop and cleanup) */\n destroy(): void;\n\n /** Whether the system is currently running */\n readonly isRunning: boolean;\n /** Whether all resolvers have completed */\n readonly isSettled: boolean;\n /** Whether module has completed initialization */\n readonly isInitialized: boolean;\n /** Whether system has completed first reconciliation */\n readonly isReady: boolean;\n\n /** Wait for system to be fully ready (after first reconciliation) */\n whenReady(): Promise<void>;\n\n /**\n * Hydrate facts from async source (call before start).\n */\n hydrate(\n loader: () => Promise<Partial<InferFacts<S>>> | Partial<InferFacts<S>>,\n ): Promise<void>;\n\n /** Dispatch an event */\n dispatch(event: InferEvents<S>): void;\n\n /** Batch multiple fact changes */\n batch(fn: () => void): void;\n\n /**\n * Subscribe to settlement state changes.\n * Called whenever the system's settled state may have changed\n * (resolver starts/completes, reconcile starts/ends).\n */\n onSettledChange(listener: () => void): () => void;\n\n /** Subscribe to history state changes (snapshot taken, navigation). */\n onHistoryChange(listener: () => void): () => void;\n\n /**\n * Read a derivation value by key.\n * @example system.read(\"doubled\")\n */\n read<T = unknown>(derivationId: string): T;\n\n /**\n * Subscribe to fact or derivation changes.\n * Keys are auto-detected -- pass any mix of fact keys and derivation keys.\n * @example system.subscribe([\"count\", \"doubled\"], () => { ... })\n */\n subscribe(ids: string[], listener: () => void): () => void;\n\n /**\n * Watch a fact or derivation for value changes.\n * The key is auto-detected -- works with both fact keys and derivation keys.\n * Pass `options.equalityFn` for custom comparison (e.g., shallow equality for objects).\n * @example system.watch(\"count\", (newVal, oldVal) => { ... })\n * @example system.watch(\"derived\", cb, { equalityFn: shallowEqual })\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\n /**\n * Returns a promise that resolves when the predicate becomes true.\n * The predicate is evaluated against current facts and re-evaluated on every change.\n * Optionally pass a timeout in ms -- rejects with an error if exceeded.\n *\n * @example\n * await system.when((facts) => facts.count > 10);\n * await system.when((facts) => facts.count > 10, { timeout: 5000 });\n */\n when(\n predicate: (facts: Readonly<InferFacts<S>>) => boolean,\n options?: { timeout?: number },\n ): Promise<void>;\n\n /** Inspect system state */\n inspect(): SystemInspection;\n /** Wait for system to settle (all resolvers complete) */\n settle(maxWait?: number): Promise<void>;\n /** Explain why a requirement exists */\n explain(requirementId: string): string | null;\n /** Get serializable snapshot of system state */\n getSnapshot(): SystemSnapshot;\n /** Restore system state from snapshot */\n restore(snapshot: SystemSnapshot): void;\n\n /**\n * Register a new module into a running system.\n * Module facts, derivations, effects, constraints, and resolvers are merged\n * into the existing engine and reconciliation is triggered.\n *\n * @example\n * ```typescript\n * const analyticsModule = await import('./modules/analytics');\n * system.registerModule(analyticsModule.default);\n * ```\n */\n registerModule<S2 extends ModuleSchema>(moduleDef: ModuleDef<S2>): void;\n\n /**\n * Get a distributable snapshot of computed derivations.\n *\n * @example\n * ```typescript\n * const snapshot = system.getDistributableSnapshot({\n * includeDerivations: ['effectivePlan', 'canUseFeature'],\n * ttlSeconds: 3600,\n * });\n * await redis.setex(`entitlements:${userId}`, 3600, JSON.stringify(snapshot));\n * ```\n */\n getDistributableSnapshot<T = Record<string, unknown>>(\n options?: DistributableSnapshotOptions,\n ): DistributableSnapshot<T>;\n\n /**\n * Watch for changes to distributable snapshot derivations.\n * Calls the callback whenever any of the included derivations change.\n * Returns an unsubscribe function.\n *\n * @example\n * ```typescript\n * const unsubscribe = system.watchDistributableSnapshot(\n * { includeDerivations: ['effectivePlan', 'canUseFeature'] },\n * (snapshot) => {\n * await redis.setex(`entitlements:${userId}`, 3600, JSON.stringify(snapshot));\n * }\n * );\n * ```\n */\n watchDistributableSnapshot<T = Record<string, unknown>>(\n options: DistributableSnapshotOptions,\n callback: (snapshot: DistributableSnapshot<T>) => void,\n ): () => void;\n}\n\n/**\n * Events dispatcher for a single module (direct access).\n */\ntype SingleModuleEvents<S extends ModuleSchema> = S[\"events\"] extends Record<\n string,\n unknown\n>\n ? {\n [E in keyof S[\"events\"]]: S[\"events\"][E] extends Record<string, unknown>\n ? keyof S[\"events\"][E] extends never\n ? () => void\n : (payload: InferEventPayload<S[\"events\"][E]>) => void\n : () => void;\n }\n : Record<string, never>;\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\n/**\n * System mode discriminator.\n * - \"single\": Single module with direct access (`system.facts.count`)\n * - \"namespaced\": Multiple modules with namespaced access (`system.facts.auth.token`)\n */\nexport type SystemMode = \"single\" | \"namespaced\";\n\n/**\n * Base system type for type guards.\n * Use this for functions that accept either system type.\n */\nexport interface AnySystem {\n readonly _mode: SystemMode;\n readonly isRunning: boolean;\n readonly isSettled: boolean;\n readonly isInitialized: boolean;\n readonly isReady: boolean;\n initialize(): void;\n start(): void;\n stop(): void;\n destroy(): void;\n}\n\n/**\n * Check if a system is a single module system.\n * Returns true if the system was created with `module:` (singular).\n *\n * @example\n * ```typescript\n * const system = createSystem({ module: counterModule });\n *\n * if (isSingleModuleSystem(system)) {\n * // system._mode === \"single\"\n * console.log(system.facts.count);\n * }\n * ```\n */\nexport function isSingleModuleSystem(system: AnySystem): boolean {\n return system._mode === \"single\";\n}\n\n/**\n * Check if a system is a namespaced (multi-module) system.\n * Returns true if the system was created with `modules:` (plural, object).\n *\n * @example\n * ```typescript\n * const system = createSystem({ modules: { auth, data } });\n *\n * if (isNamespacedSystem(system)) {\n * // system._mode === \"namespaced\"\n * console.log(system.facts.auth.token);\n * }\n * ```\n */\nexport function isNamespacedSystem(system: AnySystem): boolean {\n return system._mode === \"namespaced\";\n}\n","/**\n * Schema Type Builders\n *\n * Provides type-safe schema definitions with optional runtime validation.\n * Used to define fact types, derivation types, event payload types, etc.\n *\n * This module has no dependency on the facts store or tracking system.\n */\n\nimport type { SchemaType } 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/** 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 * @remarks\n * Each builder returns a chainable {@link ExtendedSchemaType} with validation\n * methods (`.min()`, `.max()`, `.pattern()`, etc.) and dev-mode runtime\n * type checking. Validators are tree-shaken in production builds.\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 *\n * @public\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 for any complex value.\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 * For arrays, prefer `t.array<T>()` which adds `Array.isArray` validation.\n */\n object<T>() {\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) {\n return true;\n }\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) {\n return true;\n }\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) {\n return false;\n }\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\") {\n return false;\n }\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 * Module - The declarative API for defining Directive modules\n *\n * Modules group related facts, constraints, resolvers, effects, and derivations.\n */\n\nimport type {\n CrossModuleConstraintsDef,\n CrossModuleDeps,\n CrossModuleDerivationsDef,\n CrossModuleEffectsDef,\n EffectsDef,\n Facts,\n ModuleDef,\n ModuleHooks,\n ModuleSchema,\n TypedConstraintsDef,\n TypedDerivationsDef,\n TypedEventsDef,\n TypedResolversDef,\n} from \"./types.js\";\n\n// ============================================================================\n// Module Configuration\n// ============================================================================\n\n/**\n * Module configuration with consolidated schema.\n *\n * derive and events are optional - omit them if your schema has empty derivations/events.\n */\nexport interface ModuleConfig<M extends ModuleSchema> {\n schema: M;\n init?: (facts: Facts<M[\"facts\"]>) => void;\n derive?: TypedDerivationsDef<M>;\n events?: TypedEventsDef<M>;\n effects?: EffectsDef<M[\"facts\"]>;\n constraints?: TypedConstraintsDef<M>;\n resolvers?: TypedResolversDef<M>;\n hooks?: ModuleHooks<M>;\n /** History configuration — controls which events create snapshots for undo/redo. */\n history?: {\n /** Events that create history snapshots. Omit to snapshot all events. */\n snapshotEvents?: Array<\n keyof (M[\"events\"] extends Record<string, unknown>\n ? M[\"events\"]\n : Record<string, never>) &\n string\n >;\n };\n}\n\n/**\n * Module configuration with cross-module dependencies for type-safe access\n * to other modules' facts in effects and constraints.\n *\n * When crossModuleDeps is provided:\n * - Own module facts: `facts.self.*`\n * - Cross-module facts: `facts.{dep}.*`\n *\n * @example\n * ```typescript\n * import { authSchema } from './auth';\n * import { dataSchema } from './data';\n *\n * const uiModule = createModule(\"ui\", {\n * schema: uiSchema,\n * crossModuleDeps: { auth: authSchema, data: dataSchema },\n * effects: {\n * onAuthChange: {\n * run: (facts) => {\n * facts.self.notifications // ✅ own module via \"self\"\n * facts.auth.isAuthenticated // ✅ cross-module (namespaced)\n * facts.data.users // ✅ cross-module (namespaced)\n * }\n * }\n * },\n * constraints: {\n * fetchWhenAuth: {\n * when: (facts) => facts.auth.isAuthenticated && facts.self.users.length === 0,\n * require: { type: \"FETCH_USERS\" },\n * }\n * }\n * });\n * ```\n */\nexport interface ModuleConfigWithDeps<\n M extends ModuleSchema,\n Deps extends CrossModuleDeps,\n> {\n schema: M;\n /**\n * Cross-module dependencies for type-safe access in derive/effects/constraints.\n *\n * **Access patterns by context:**\n * - `derive`, `effects`, `constraints`: Use `facts.self.*` for own module, `facts.{dep}.*` for cross-module\n * - `init`, `events`, `resolvers`: Use flat access (`facts.myFact`) - no cross-module access\n *\n * This separation ensures initialization and event handling stay scoped to own module,\n * while observers (derive/effects/constraints) can see across modules.\n *\n * @example\n * ```typescript\n * crossModuleDeps: { auth: authSchema },\n * init: (facts) => { facts.users = []; }, // flat access\n * derive: { count: (facts) => facts.self.users.length }, // facts.self.*\n * effects: { log: { run: (facts) => console.log(facts.auth.token) } }, // facts.{dep}.*\n * ```\n */\n crossModuleDeps: Deps;\n /** Initialize module facts. Uses flat access (`facts.myFact`) to ensure modules initialize independently. */\n init?: (facts: Facts<M[\"facts\"]>) => void;\n /** Derivations with cross-module facts access (`facts.self.*` + `facts.{dep}.*`) */\n derive?: CrossModuleDerivationsDef<M, Deps>;\n /** Event handlers. Uses flat access (`facts.myFact`) to keep mutations scoped to own module. */\n events?: TypedEventsDef<M>;\n /** Effects with cross-module facts access (`facts.self.*` + `facts.{dep}.*`) */\n effects?: CrossModuleEffectsDef<M, Deps>;\n /** Constraints with cross-module facts access (`facts.self.*` + `facts.{dep}.*`) */\n constraints?: CrossModuleConstraintsDef<M, Deps>;\n /** Resolvers. Uses flat access (`ctx.facts.myFact`) to keep async mutations scoped to own module. */\n resolvers?: TypedResolversDef<M>;\n hooks?: ModuleHooks<M>;\n /** History configuration — controls which events create snapshots for undo/redo. */\n history?: {\n /** Events that create history snapshots. Omit to snapshot all events. */\n snapshotEvents?: Array<\n keyof (M[\"events\"] extends Record<string, unknown>\n ? M[\"events\"]\n : Record<string, never>) &\n string\n >;\n };\n}\n\n/**\n * Create a module definition with full type inference.\n *\n * The consolidated schema provides:\n * - Derivation composition (`derived.otherDerivation` is typed)\n * - Event dispatch (`system.dispatch({ type: \"...\" })` has autocomplete)\n * - Resolver requirements (`req.payload` is typed based on requirement type)\n *\n * @param id - Unique module identifier (kebab-case recommended)\n * @param config - Module configuration including schema, init, derive, constraints, resolvers, etc.\n * @returns A frozen module definition ready for use with `createSystem`\n *\n * @example\n * ```ts\n * const trafficLight = createModule(\"traffic-light\", {\n * schema: {\n * facts: {\n * phase: t.string<\"red\" | \"green\" | \"yellow\">(),\n * elapsed: t.number(),\n * },\n * derivations: {\n * isRed: t.boolean(),\n * timeRemaining: t.number(),\n * },\n * events: {\n * tick: {},\n * setPhase: { phase: t.string<\"red\" | \"green\" | \"yellow\">() },\n * },\n * requirements: {\n * TRANSITION: { to: t.string<\"red\" | \"green\" | \"yellow\">() },\n * },\n * },\n * init: (facts) => {\n * facts.phase = \"red\";\n * facts.elapsed = 0;\n * },\n * derive: {\n * isRed: (facts) => facts.phase === \"red\",\n * timeRemaining: (facts, derived) => {\n * // derived.isRed is typed as boolean!\n * return derived.isRed ? 30 - facts.elapsed : 0;\n * },\n * },\n * events: {\n * tick: (facts) => { facts.elapsed += 1; },\n * setPhase: (facts, { phase }) => { facts.phase = phase; }, // phase is typed!\n * },\n * constraints: {\n * shouldTransition: {\n * when: (facts) => facts.phase === \"red\" && facts.elapsed > 30,\n * require: { type: \"TRANSITION\", to: \"green\" },\n * },\n * },\n * resolvers: {\n * transition: {\n * requirement: \"TRANSITION\",\n * resolve: async (req, ctx) => {\n * ctx.facts.phase = req.to; // req.to is typed!\n * ctx.facts.elapsed = 0;\n * },\n * },\n * },\n * });\n * ```\n *\n * @example With cross-module dependencies\n * ```ts\n * import { authSchema } from './auth';\n *\n * const dataModule = createModule(\"data\", {\n * schema: dataSchema,\n * crossModuleDeps: { auth: authSchema },\n * constraints: {\n * fetchWhenAuth: {\n * when: (facts) => {\n * // facts.self.* for own module, facts.auth.* for cross-module\n * return facts.auth.isAuthenticated && facts.self.users.length === 0;\n * },\n * require: { type: \"FETCH_USERS\" },\n * },\n * },\n * derive: {\n * canFetch: (facts) => facts.auth.isAuthenticated && facts.self.users.length === 0,\n * },\n * });\n * ```\n *\n * @public\n */\n// Overload 1: With crossModuleDeps\nexport function createModule<\n const M extends ModuleSchema,\n const Deps extends CrossModuleDeps,\n>(id: string, config: ModuleConfigWithDeps<M, Deps>): ModuleDef<M>;\n\n// Overload 2: Without crossModuleDeps (original signature)\nexport function createModule<const M extends ModuleSchema>(\n id: string,\n config: ModuleConfig<M>,\n): ModuleDef<M>;\n\n// Overload 3: Union (used by createModuleFactory)\nexport function createModule<const M extends ModuleSchema>(\n id: string,\n config: ModuleConfigWithDeps<M, CrossModuleDeps> | ModuleConfig<M>,\n): ModuleDef<M>;\n\n/** @internal Implementation overload — see public overloads above. */\nexport function createModule<const M extends ModuleSchema>(\n id: string,\n config: ModuleConfig<M> | ModuleConfigWithDeps<M, CrossModuleDeps>,\n): ModuleDef<M> {\n // Dev-mode validations\n if (process.env.NODE_ENV !== \"production\") {\n if (!id || typeof id !== \"string\") {\n console.warn(\"[Directive] Module ID must be a non-empty string\");\n } else if (!/^(__[a-z][a-z0-9_-]*|[a-z][a-z0-9-]*)$/i.test(id)) {\n console.warn(\n `[Directive] Module ID \"${id}\" should follow kebab-case convention (e.g., \"my-module\")`,\n );\n }\n\n if (!config.schema) {\n console.warn(\"[Directive] Module schema is required\");\n } else {\n if (!config.schema.facts) {\n console.warn(\"[Directive] Module schema.facts is required\");\n }\n // derivations, events, and requirements default to {} if not provided\n }\n\n // Validate derive keys match schema.derivations (if either is provided)\n const schemaDerivations = config.schema?.derivations ?? {};\n const deriveImpl = config.derive ?? {};\n const schemaDerivationKeys = new Set(Object.keys(schemaDerivations));\n const deriveKeys = new Set(Object.keys(deriveImpl));\n\n for (const key of deriveKeys) {\n if (!schemaDerivationKeys.has(key)) {\n console.warn(\n `[Directive] Derivation \"${key}\" not declared in schema.derivations`,\n );\n }\n }\n for (const key of schemaDerivationKeys) {\n if (!deriveKeys.has(key)) {\n console.warn(\n `[Directive] schema.derivations[\"${key}\"] has no matching implementation in derive`,\n );\n }\n }\n\n // Validate events keys match schema.events (if either is provided)\n const schemaEvents = config.schema?.events ?? {};\n const eventImpl = config.events ?? {};\n const schemaEventKeys = new Set(Object.keys(schemaEvents));\n const eventKeys = new Set(Object.keys(eventImpl));\n\n for (const key of eventKeys) {\n if (!schemaEventKeys.has(key)) {\n console.warn(\n `[Directive] Event \"${key}\" not declared in schema.events`,\n );\n }\n }\n for (const key of schemaEventKeys) {\n if (!eventKeys.has(key)) {\n console.warn(\n `[Directive] schema.events[\"${key}\"] has no matching handler in events`,\n );\n }\n }\n\n // Validate history.snapshotEvents reference valid event names\n if (config.history?.snapshotEvents) {\n if (config.history.snapshotEvents.length === 0) {\n console.warn(\n \"[Directive] history.snapshotEvents is an empty array — no events will create history snapshots. \" +\n \"Omit history.snapshotEvents entirely to snapshot all events, or list specific events.\",\n );\n }\n const schemaEventKeysForValidation = new Set(\n Object.keys(config.schema?.events ?? {}),\n );\n for (const eventName of config.history.snapshotEvents) {\n if (!schemaEventKeysForValidation.has(eventName)) {\n console.warn(\n `[Directive] history.snapshotEvents entry \"${eventName}\" not declared in schema.events. ` +\n `Available events: ${[...schemaEventKeysForValidation].join(\", \") || \"(none)\"}`,\n );\n }\n }\n }\n\n // Validate resolvers reference valid requirement types\n if (config.resolvers && config.schema?.requirements) {\n const requirementTypes = new Set(Object.keys(config.schema.requirements));\n for (const [resolverName, resolver] of Object.entries(config.resolvers)) {\n const resolverDef = resolver as { requirement?: string };\n if (\n typeof resolverDef.requirement === \"string\" &&\n !requirementTypes.has(resolverDef.requirement)\n ) {\n console.warn(\n `[Directive] Resolver \"${resolverName}\" references unknown requirement type \"${resolverDef.requirement}\". ` +\n `Available types: ${[...requirementTypes].join(\", \") || \"(none)\"}`,\n );\n }\n }\n }\n }\n\n // Extract crossModuleDeps if present (for runtime proxy creation)\n const crossModuleDeps =\n \"crossModuleDeps\" in config ? config.crossModuleDeps : undefined;\n\n return {\n id,\n schema: config.schema,\n init: config.init,\n // Cast to TypedDerivationsDef for ModuleDef compatibility (runtime handles both types)\n derive: (config.derive ?? {}) as TypedDerivationsDef<M>,\n events: config.events ?? ({} as TypedEventsDef<M>),\n effects: config.effects as EffectsDef<M[\"facts\"]> | undefined,\n constraints: config.constraints as TypedConstraintsDef<M> | undefined,\n resolvers: config.resolvers,\n hooks: config.hooks,\n history: config.history,\n // Store crossModuleDeps for runtime proxy creation\n crossModuleDeps: crossModuleDeps as CrossModuleDeps | undefined,\n };\n}\n\n/**\n * Create a module factory that produces named instances from a single definition.\n * Useful for multi-instance UIs (tabs, panels, multi-tenant) where you need\n * isolated state from the same schema.\n *\n * @param config - Module configuration (same shape as `createModule` minus the `id`)\n * @returns A factory function that accepts a name and returns a `ModuleDef`\n *\n * @example\n * ```typescript\n * const chatRoom = createModuleFactory({\n * schema: {\n * facts: { messages: t.array<string>(), users: t.array<string>() },\n * derivations: { count: t.number() },\n * },\n * init: (facts) => { facts.messages = []; facts.users = []; },\n * derive: { count: (facts) => facts.messages.length },\n * });\n *\n * const system = createSystem({\n * modules: {\n * lobby: chatRoom(\"lobby\"),\n * support: chatRoom(\"support\"),\n * },\n * });\n * ```\n *\n * @public\n */\nexport function createModuleFactory<const M extends ModuleSchema>(\n config: ModuleConfig<M>,\n): (name: string) => ModuleDef<M>;\nexport function createModuleFactory<\n const M extends ModuleSchema,\n const Deps extends CrossModuleDeps,\n>(config: ModuleConfigWithDeps<M, Deps>): (name: string) => ModuleDef<M>;\n/** @internal Implementation overload — see public overloads above. */\nexport function createModuleFactory<const M extends ModuleSchema>(\n config: ModuleConfig<M> | ModuleConfigWithDeps<M, CrossModuleDeps>,\n): (name: string) => ModuleDef<M> {\n // Pass config directly — createModule's implementation overload handles both types.\n // Do NOT cast to ModuleConfig<M> which would strip crossModuleDeps.\n return (name: string) => createModule(name, config);\n}\n","/**\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 * History — 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 Facts,\n FactsStore,\n HistoryAPI,\n HistoryOption,\n Schema,\n Snapshot,\n} from \"../core/types.js\";\nimport { isPrototypeSafe } from \"./utils.js\";\n\n// ============================================================================\n// History Manager\n// ============================================================================\n\n/**\n * A changeset groups multiple snapshots into a single undo/redo unit.\n *\n * @remarks\n * Use {@link HistoryManager.beginChangeset} and\n * {@link HistoryManager.endChangeset} to create changesets. When navigating\n * with `goBack`/`goForward`, the entire changeset is traversed as one step.\n *\n * @internal\n */\nexport interface Changeset {\n label: string;\n startIndex: number;\n endIndex: number;\n}\n\n/**\n * Internal history manager that extends the public {@link HistoryAPI}\n * with snapshot capture, restoration, and pause/resume controls.\n *\n * @remarks\n * - `takeSnapshot(trigger)` records the current facts into the ring buffer.\n * - `restore(snapshot)` deserializes a snapshot back into the facts store,\n * setting `isRestoring = true` so the engine skips reconciliation.\n * - `pause()` / `resume()` temporarily suspend snapshot recording (e.g.,\n * during bulk imports or programmatic state resets).\n * - `beginChangeset(label)` / `endChangeset()` group consecutive snapshots\n * so `goBack`/`goForward` treat them as a single undo/redo unit.\n *\n * @typeParam _S - The schema type (unused at runtime but preserved for type safety).\n *\n * @internal\n */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport interface HistoryManager<_S extends Schema> extends HistoryAPI {\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 history 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/**\n * Options for creating a history manager via {@link createHistoryManager}.\n *\n * @typeParam S - The facts schema type.\n *\n * @internal\n */\nexport interface CreateHistoryOptions<S extends Schema> {\n historyOption: HistoryOption;\n facts: Facts<S>;\n store: FactsStore<S>;\n /** Callback when a snapshot is taken */\n onSnapshot?: (snapshot: Snapshot) => void;\n /** Callback when history navigation occurs */\n onHistoryChange?: (from: number, to: number) => void;\n}\n\n/**\n * Resolve a HistoryOption (boolean | HistoryConfig) into concrete values.\n * @internal\n */\nfunction resolveHistoryOption(option: HistoryOption): {\n enabled: boolean;\n maxSnapshots: number;\n} {\n if (typeof option === \"boolean\") {\n return { enabled: option, maxSnapshots: 100 };\n }\n\n // Object config — presence implies enabled\n return {\n enabled: true,\n maxSnapshots: option.maxSnapshots ?? 100,\n };\n}\n\n/**\n * Create a snapshot-based history manager backed by a ring buffer.\n *\n * @remarks\n * Snapshots are taken automatically after fact changes (during reconciliation)\n * and can be navigated with `goBack`/`goForward`/`goTo`. Use\n * `beginChangeset(label)` and `endChangeset()` to group multiple snapshots\n * into a single undo/redo unit. The entire history can be exported to JSON\n * via `export()` and re-imported with `import()` for cross-session debugging.\n *\n * Call `pause()` to temporarily stop recording snapshots (e.g., during bulk\n * fact imports) and `resume()` to re-enable recording.\n *\n * @param options - History config, facts proxy, store, and optional snapshot/history callbacks.\n * @returns A {@link HistoryManager} with snapshot capture, navigation, changeset, and export/import methods.\n *\n * @internal\n */\nexport function createHistoryManager<S extends Schema>(\n options: CreateHistoryOptions<S>,\n): HistoryManager<S> {\n const { historyOption, facts, store, onSnapshot, onHistoryChange } = options;\n\n const { enabled: isEnabled, maxSnapshots } =\n resolveHistoryOption(historyOption);\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: HistoryManager<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 onHistoryChange?.(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 onHistoryChange?.(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 onHistoryChange?.(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 history data: expected object\");\n }\n if (data.version !== 1) {\n throw new Error(\n `Unsupported history export version: ${data.version}`,\n );\n }\n if (!Array.isArray(data.snapshots)) {\n throw new Error(\"Invalid history data: snapshots must be an array\");\n }\n if (typeof data.currentIndex !== \"number\") {\n throw new Error(\n \"Invalid history 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 history 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 history manager for use when history is disabled.\n *\n * @remarks\n * All methods are safe to call but perform no work. This avoids null-checks\n * throughout the engine -- callers can use the same {@link HistoryManager}\n * interface regardless of whether history is enabled.\n *\n * @returns A {@link HistoryManager} where every method is a no-op and `isEnabled` is `false`.\n *\n * @internal\n */\nexport function createDisabledHistory<\n S extends Schema,\n>(): HistoryManager<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 identity string for a requirement.\n *\n * When no custom key function is provided, the ID is formed from the\n * requirement's `type` plus a deterministic JSON serialization of its\n * remaining properties. A custom {@link RequirementKeyFn} can override\n * this to control deduplication granularity.\n *\n * @param req - The requirement to generate an ID for.\n * @param keyFn - Optional custom key function that overrides the default identity logic.\n * @returns A stable string that uniquely identifies this requirement for deduplication.\n *\n * @public\n */\n/** Cache for default requirement IDs (no custom keyFn) to avoid repeated stableStringify */\nconst reqIdCache = new WeakMap<Requirement, string>();\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 // Check cache first\n const cached = reqIdCache.get(req);\n if (cached !== undefined) {\n return cached;\n }\n\n // Default: type + stable JSON of other properties\n const { type, ...rest } = req;\n const sortedRest = stableStringify(rest);\n const id = `${type}:${sortedRest}`;\n\n reqIdCache.set(req, id);\n\n return id;\n}\n\n/**\n * Create a {@link RequirementWithId} by pairing a requirement with its\n * computed identity string and the constraint that produced it.\n *\n * @param requirement - The raw requirement object.\n * @param fromConstraint - Name of the constraint that emitted this requirement.\n * @param keyFn - Optional custom key function forwarded to {@link generateRequirementId}.\n * @returns A requirement bundled with its stable ID and originating constraint name.\n *\n * @public\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 * Create a typed requirement factory for a given requirement type string.\n *\n * Returns a function that, when called with a properties object, produces a\n * fully-typed {@link Requirement} whose `type` field is the literal `T`.\n * This is the recommended way to build requirements inside constraint\n * definitions because it keeps the type string in one place and gives you\n * full TypeScript inference on the payload.\n *\n * @param type - The requirement type string (e.g. `\"FETCH_USER\"`).\n * @returns A factory that merges `type` with arbitrary properties into a typed requirement.\n *\n * @example\n * ```typescript\n * const fetchUser = req(\"FETCH_USER\");\n *\n * // Use inside a module's constraint definition\n * constraints: {\n * needsUser: {\n * when: (facts) => facts.userId && !facts.user,\n * require: fetchUser({ userId: 123, priority: \"high\" }),\n * },\n * }\n *\n * // Produces: { type: \"FETCH_USER\", userId: 123, priority: \"high\" }\n * ```\n *\n * @public\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 * Type-narrowing guard that checks whether a requirement's `type` matches the\n * given string literal.\n *\n * After this guard returns `true`, TypeScript narrows `req` to\n * `Requirement & { type: T }`, giving you access to type-specific fields.\n *\n * @param req - The requirement to test.\n * @param type - The expected type string to match against.\n * @returns `true` when `req.type === type`.\n *\n * @public\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 function suitable for a resolver's `requirement`\n * predicate field.\n *\n * @remarks\n * The returned predicate narrows any {@link Requirement} to the concrete\n * type `R` (or `Requirement & { type: T }` when no explicit generic is\n * provided). This is a cleaner alternative to writing verbose inline type\n * guards in every resolver definition.\n *\n * @param type - The requirement type string to match.\n * @returns A predicate that returns `true` for requirements whose `type` matches, narrowing the value for downstream callbacks like `key` and `resolve`.\n *\n * @example\n * ```typescript\n * // With an explicit requirement interface (recommended for complex payloads)\n * interface FetchUserReq { type: \"FETCH_USER\"; userId: string }\n * requirement: forType<FetchUserReq>(\"FETCH_USER\"),\n * key: (req) => req.userId, // req is FetchUserReq\n *\n * // With a simple string literal\n * requirement: forType(\"FETCH_USER\"),\n * key: (req) => req.type, // req is Requirement & { type: \"FETCH_USER\" }\n * ```\n *\n * @public\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 };\n/** @internal Implementation overload — see public overloads above. */\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 deduplicated collection of {@link RequirementWithId} entries keyed by\n * their identity string.\n *\n * @remarks\n * Requirements are uniquely identified by their ID (generated from type +\n * properties via {@link generateRequirementId}). When adding a requirement\n * whose ID already exists, the first entry wins and the duplicate is\n * silently ignored. The {@link RequirementSet.diff | diff} method computes\n * added, removed, and unchanged entries relative to another set, which the\n * engine uses during reconciliation.\n *\n * @example\n * ```typescript\n * const set = new RequirementSet();\n * set.add(createRequirementWithId({ type: \"FETCH_USER\", userId: 1 }, \"c1\"));\n * set.add(createRequirementWithId({ type: \"FETCH_USER\", userId: 1 }, \"c2\")); // ignored\n * console.log(set.size); // 1\n *\n * const next = new RequirementSet();\n * next.add(createRequirementWithId({ type: \"FETCH_USER\", userId: 2 }, \"c1\"));\n * const { added, removed } = next.diff(set);\n * // added has userId: 2, removed has userId: 1\n * ```\n *\n * @public\n */\nexport class RequirementSet {\n private map = new Map<string, RequirementWithId>();\n\n /**\n * Add a requirement to the set (first-wins deduplication).\n *\n * @param req - The requirement with its computed ID to insert.\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 /**\n * Remove a requirement by its identity string.\n *\n * @param id - The requirement identity string to remove.\n * @returns `true` if the requirement existed and was removed.\n */\n remove(id: string): boolean {\n return this.map.delete(id);\n }\n\n /**\n * Check whether a requirement with the given ID is in the set.\n *\n * @param id - The requirement identity string to look up.\n * @returns `true` if the set contains a requirement with this ID.\n */\n has(id: string): boolean {\n return this.map.has(id);\n }\n\n /**\n * Retrieve a requirement by its identity string.\n *\n * @param id - The requirement identity string to look up.\n * @returns The matching requirement, or `undefined` if not found.\n */\n get(id: string): RequirementWithId | undefined {\n return this.map.get(id);\n }\n\n /**\n * Return a snapshot array of all requirements in the set.\n *\n * @returns A new array containing every {@link RequirementWithId} in insertion order.\n */\n all(): RequirementWithId[] {\n return [...this.map.values()];\n }\n\n /**\n * Return a snapshot array of all requirement identity strings.\n *\n * @returns A new array of ID strings in insertion order.\n */\n ids(): string[] {\n return [...this.map.keys()];\n }\n\n /**\n * The number of requirements currently in the set.\n */\n get size(): number {\n return this.map.size;\n }\n\n /**\n * Remove all requirements from the set.\n */\n clear(): void {\n this.map.clear();\n }\n\n /**\n * Create a shallow copy of this set.\n *\n * @returns A new {@link RequirementSet} containing the same entries.\n */\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 /**\n * Compute the difference between this set and another.\n *\n * @param other - The previous set to compare against.\n * @returns An object with `added` (in this but not other), `removed` (in other but not this), and `unchanged` arrays.\n */\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 (loop avoids spread overflow with deep stacks)\n for (const ctx of saved) {\n trackingStack.push(ctx);\n }\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/** Prototype pollution guard — shared across all proxy handlers */\nexport const BLOCKED_PROPS: ReadonlySet<string> = Object.freeze(\n new Set([\"__proto__\", \"constructor\", \"prototype\"]),\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/**\n * Manager returned by {@link createConstraintsManager} that evaluates\n * constraint rules against the current facts and produces unmet\n * {@link RequirementWithId | requirements}.\n *\n * @internal\n */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport interface ConstraintsManager<_S extends Schema> {\n /**\n * Evaluate all enabled constraints and return unmet requirements.\n *\n * @remarks\n * On the first call (or when `changedKeys` is empty), every enabled\n * constraint is evaluated. On subsequent calls, only constraints whose\n * tracked dependencies overlap with `changedKeys` are re-evaluated.\n * Sync constraints run first, async constraints run in parallel, and\n * `after` ordering is respected across multiple passes.\n *\n * @param changedKeys - Fact keys that changed since the last evaluation.\n * When omitted or empty, all constraints are evaluated.\n * @returns An array of {@link RequirementWithId} representing unmet requirements.\n */\n evaluate(changedKeys?: Set<string>): Promise<RequirementWithId[]>;\n /**\n * Get the current state of a constraint by its definition ID.\n *\n * @param id - The constraint definition ID.\n * @returns The {@link ConstraintState}, or `undefined` if the ID is unknown.\n */\n getState(id: string): ConstraintState | undefined;\n /**\n * Get the state of every registered constraint.\n *\n * @returns An array of all {@link ConstraintState} objects.\n */\n getAllStates(): ConstraintState[];\n /**\n * Disable a constraint so it is skipped during evaluation.\n *\n * @param id - The constraint definition ID.\n */\n disable(id: string): void;\n /**\n * Re-enable a previously disabled constraint.\n *\n * @param id - The constraint definition ID.\n */\n enable(id: string): void;\n /**\n * Mark all constraints that depend on `factKey` as dirty so they are\n * re-evaluated on the next {@link ConstraintsManager.evaluate | evaluate} call.\n *\n * @param factKey - The fact store key that changed.\n */\n invalidate(factKey: string): void;\n /**\n * Get the auto-tracked or explicit dependency set for a constraint.\n *\n * @param id - The constraint definition ID.\n * @returns A `Set` of fact keys, or `undefined` if no dependencies have been recorded.\n */\n getDependencies(id: string): Set<string> | undefined;\n /**\n * Record that a constraint's resolver completed successfully, unblocking\n * any constraints that list it in their `after` array.\n *\n * @param constraintId - The constraint definition ID whose resolver finished.\n */\n markResolved(constraintId: string): void;\n /**\n * Check whether a constraint is currently disabled.\n *\n * @param id - The constraint definition ID.\n * @returns `true` if the constraint has been disabled via {@link ConstraintsManager.disable | disable}.\n */\n isDisabled(id: string): boolean;\n /**\n * Check whether a constraint has been marked as resolved.\n *\n * @param constraintId - The constraint definition ID.\n * @returns `true` if {@link ConstraintsManager.markResolved | markResolved} was called for this constraint.\n */\n isResolved(constraintId: string): boolean;\n /**\n * Register additional constraint definitions at runtime (used for dynamic\n * module registration).\n *\n * @remarks\n * Rebuilds the topological order and reverse dependency map so new `after`\n * dependencies are validated for cycles and indexed.\n *\n * @param newDefs - New constraint definitions to merge into the manager.\n */\n registerDefinitions(newDefs: ConstraintsDef<Schema>): void;\n /**\n * Override an existing constraint definition.\n * Stores the original in an internal map for inspection.\n *\n * @param id - The constraint definition ID to override.\n * @param def - The new constraint definition.\n * @throws If no constraint with this ID exists.\n */\n assignDefinition(id: string, def: ConstraintsDef<Schema>[string]): void;\n /**\n * Remove a constraint definition and all its internal state.\n *\n * @param id - The constraint definition ID to remove.\n */\n unregisterDefinition(id: string): void;\n /**\n * Evaluate a single constraint and emit its requirement if active.\n * Props are merged into the requirement object.\n *\n * @param id - The constraint definition ID.\n * @param props - Optional properties to merge into the requirement.\n * @returns The emitted requirements (if any).\n */\n callOne(id: string, props?: Record<string, unknown>): Promise<RequirementWithId[]>;\n}\n\n/**\n * Configuration options accepted by {@link createConstraintsManager}.\n *\n * @internal\n */\nexport interface CreateConstraintsOptions<S extends Schema> {\n /** Constraint definitions keyed by ID. */\n definitions: ConstraintsDef<S>;\n /** Proxy-based facts object used to evaluate `when()` predicates. */\n facts: Facts<S>;\n /** Custom key functions for requirement deduplication, keyed by constraint ID. */\n requirementKeys?: Record<string, RequirementKeyFn>;\n /** Default timeout in milliseconds for async constraint evaluation (defaults to 5 000). */\n defaultTimeout?: number;\n /** Called after each constraint evaluation with the constraint ID and whether `when()` was active. */\n onEvaluate?: (id: string, active: boolean) => void;\n /** Called when a constraint's `when()` or `require()` throws. */\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 * @remarks\n * Constraints are evaluated in priority order (higher priority first), with\n * topological ordering for same-priority constraints connected by `after`\n * dependencies. The manager supports sync and async `when()` predicates,\n * incremental evaluation based on changed fact keys, and per-constraint\n * enable/disable toggling. Cycle detection runs eagerly at construction time\n * to prevent deadlocks in production.\n *\n * @param options - Configuration including constraint definitions, facts proxy,\n * custom requirement key functions, and lifecycle callbacks.\n * @returns A {@link ConstraintsManager} for evaluating, invalidating, and\n * managing constraint lifecycle.\n *\n * @example\n * ```typescript\n * const constraints = createConstraintsManager({\n * definitions: {\n * mustTransition: {\n * priority: 50,\n * when: (facts) => facts.phase === \"red\" && facts.elapsed > 30,\n * require: { type: \"TRANSITION\", to: \"green\" },\n * },\n * },\n * facts: factsProxy,\n * onEvaluate: (id, active) => console.log(id, active),\n * });\n *\n * const unmet = await constraints.evaluate();\n * ```\n *\n * @internal\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 dependsOnMe.clear();\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 // Short-circuit: skip full remove/add cycle when deps haven't changed\n if (oldDeps.size === newDeps.size && oldDeps.size > 0) {\n let same = true;\n for (const dep of newDeps) {\n if (!oldDeps.has(dep)) {\n same = false;\n break;\n }\n }\n if (same) {\n return;\n }\n }\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) {\n return false;\n }\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) {\n return false;\n }\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) {\n return { requirements: [], deps: new Set() };\n }\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) {\n return priorityDiff;\n }\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) {\n return true;\n }\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 let hasAfterDeps = false;\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 if (def.after?.length) {\n hasAfterDeps = true;\n }\n }\n // Invalidate cached sort order\n sortedConstraintIds = null;\n // Only rebuild topo order when new constraints have `after` dependencies\n if (hasAfterDeps) {\n detectCyclesAndComputeTopoOrder();\n }\n // Always rebuild reverse deps — existing constraints may reference\n // newly-added IDs in their `after` arrays (forward references)\n buildReverseDependencyMap();\n },\n\n assignDefinition(id: string, def: ConstraintsDef<Schema>[string]): void {\n if (!definitions[id]) {\n throw new Error(\n `[Directive] Cannot assign constraint \"${id}\" — it does not exist. Use register() to create it.`,\n );\n }\n\n // Replace definition\n (definitions as Record<string, unknown>)[id] = def;\n // Re-init state for the new definition\n initState(id);\n dirtyConstraints.add(id);\n // Invalidate cached sort order (priority may have changed)\n sortedConstraintIds = null;\n // Rebuild topo order + reverse deps in case `after` changed\n detectCyclesAndComputeTopoOrder();\n buildReverseDependencyMap();\n },\n\n unregisterDefinition(id: string): void {\n if (!definitions[id]) {\n return;\n }\n\n // Remove from all internal maps\n delete (definitions as Record<string, unknown>)[id];\n states.delete(id);\n disabled.delete(id);\n asyncConstraintIds.delete(id);\n dirtyConstraints.delete(id);\n noFireConstraints.delete(id);\n resolvedConstraints.delete(id);\n lastRequirements.delete(id);\n latestWhenDeps.delete(id);\n\n // Clean dependency maps\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\n // Clean reverse dependency map\n dependsOnMe.delete(id);\n for (const depSet of dependsOnMe.values()) {\n depSet.delete(id);\n }\n\n // Invalidate cached sort order\n sortedConstraintIds = null;\n // Rebuild topo order\n detectCyclesAndComputeTopoOrder();\n buildReverseDependencyMap();\n },\n\n async callOne(id: string, props?: Record<string, unknown>): Promise<RequirementWithId[]> {\n const def = definitions[id];\n if (!def) {\n throw new Error(\n `[Directive] Cannot call constraint \"${id}\" — it does not exist.`,\n );\n }\n\n // Respect disabled state\n if (disabled.has(id)) {\n return [];\n }\n\n const state = getState(id);\n let active: boolean;\n\n if (state.isAsync) {\n active = await evaluateAsync(id);\n } else {\n const result = evaluateSync(id);\n active = result instanceof Promise ? await result : result;\n }\n\n if (!active) {\n return [];\n }\n\n // Get requirements and merge props if provided\n const { requirements: reqs } = getRequirements(id);\n if (reqs.length === 0) {\n return [];\n }\n\n const keyFn = requirementKeys[id];\n const result: RequirementWithId[] = [];\n for (const req of reqs) {\n const merged = props ? { ...req, ...props } : req;\n result.push(createRequirementWithId(merged, id, keyFn));\n }\n\n return result;\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 { BLOCKED_PROPS, 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 /** Override an existing derivation function */\n assignDefinition(id: string, fn: DerivationsDef<S>[keyof DerivationsDef<S>]): void;\n /** Remove a derivation and clean up its state */\n unregisterDefinition(id: string): void;\n /** Compute a derivation immediately (ignores cache) */\n callOne(id: string): unknown;\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 // 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 // Short-circuit: skip full remove/add cycle when deps haven't changed\n if (oldDeps.size === newDeps.size) {\n let same = true;\n for (const dep of newDeps) {\n if (!oldDeps.has(dep)) {\n same = false;\n break;\n }\n }\n if (same) {\n return;\n }\n }\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 /**\n * Invalidate a derivation and its transitive dependents using iterative\n * traversal (work queue) to avoid stack overflow on deep chains.\n *\n * Accepts an optional shared `visited` Set so that `invalidateMany` can\n * coalesce multiple root invalidations into a single traversal.\n */\n function invalidateDerivation(\n startId: string,\n visited = new Set<string>(),\n ): void {\n const queue = [startId];\n\n while (queue.length > 0) {\n const id = queue.pop()!;\n if (visited.has(id)) continue;\n visited.add(id);\n\n const state = states.get(id);\n if (!state || state.isStale) continue;\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 // Queue transitive dependents\n const dependents = derivedToDerivedDeps.get(id);\n if (dependents) {\n for (const dependent of dependents) {\n queue.push(dependent);\n }\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\") {\n return undefined;\n }\n if (BLOCKED_PROPS.has(prop)) {\n return undefined;\n }\n\n // Return undefined for unknown derivation keys instead of throwing.\n // React 19 dev-mode traverses objects accessing $$typeof, toJSON, then, etc.\n if (!definitions[prop as keyof D]) {\n return undefined;\n }\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 set() {\n return false;\n },\n\n deleteProperty() {\n return false;\n },\n\n defineProperty() {\n return false;\n },\n\n getPrototypeOf() {\n return null;\n },\n\n setPrototypeOf() {\n return false;\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 const visited = new Set<string>();\n try {\n for (const id of dependents) {\n invalidateDerivation(id, visited);\n }\n } finally {\n invalidationDepth--;\n flushNotifications();\n }\n },\n\n invalidateMany(factKeys: Iterable<string>): void {\n invalidationDepth++;\n // Share a single visited Set across all root invalidations so\n // transitive dependents are only processed once.\n const visited = new Set<string>();\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, visited);\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 assignDefinition(id: string, fn: DerivationsDef<S>[keyof DerivationsDef<S>]): void {\n if (!definitions[id as keyof D]) {\n throw new Error(\n `[Directive] Cannot assign derivation \"${id}\" — it does not exist. Use register() to create it.`,\n );\n }\n\n // Replace definition\n (definitions as Record<string, unknown>)[id] = fn;\n\n // Mark stale so it recomputes with the new function\n const state = states.get(id);\n if (state) {\n state.isStale = true;\n pendingNotifications.add(id);\n }\n\n flushNotifications();\n },\n\n unregisterDefinition(id: string): void {\n if (!definitions[id as keyof D]) {\n return;\n }\n\n // Clean up dependency maps\n const state = states.get(id);\n if (state) {\n for (const dep of state.dependencies) {\n if (states.has(dep)) {\n const depSet = derivedToDerivedDeps.get(dep);\n depSet?.delete(id);\n if (depSet && depSet.size === 0) {\n derivedToDerivedDeps.delete(dep);\n }\n } else {\n const depSet = factToDerivedDeps.get(dep);\n depSet?.delete(id);\n if (depSet && depSet.size === 0) {\n factToDerivedDeps.delete(dep);\n }\n }\n }\n }\n\n // Invalidate dependents (derivations that depend on this one)\n const dependents = derivedToDerivedDeps.get(id);\n if (dependents) {\n invalidationDepth++;\n try {\n for (const dependent of dependents) {\n invalidateDerivation(dependent);\n }\n } finally {\n invalidationDepth--;\n }\n derivedToDerivedDeps.delete(id);\n }\n\n // Remove from all maps\n delete (definitions as Record<string, unknown>)[id];\n states.delete(id);\n listeners.delete(id);\n pendingNotifications.delete(id);\n\n flushNotifications();\n },\n\n callOne(id: string): unknown {\n const def = definitions[id as keyof D];\n if (!def) {\n throw new Error(\n `[Directive] Cannot call derivation \"${id}\" — it does not exist.`,\n );\n }\n\n // Always recompute (call ignores cache)\n return computeDerivation(id);\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/**\n * Manager returned by {@link createEffectsManager} that runs fire-and-forget\n * side effects after facts stabilize.\n *\n * @internal\n */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport interface EffectsManager<_S extends Schema = Schema> {\n /**\n * Run all effects whose tracked dependencies overlap with `changedKeys`.\n *\n * @remarks\n * Effects with no recorded dependencies (first run or auto-tracked with no\n * reads) run on any change. After execution, a snapshot of current facts is\n * stored for the `prev` parameter on the next invocation.\n *\n * @param changedKeys - Fact keys that changed since the last run.\n */\n runEffects(changedKeys: Set<string>): Promise<void>;\n /**\n * Run every enabled effect unconditionally, regardless of dependencies.\n */\n runAll(): Promise<void>;\n /**\n * Disable an effect so it is skipped during subsequent runs.\n *\n * @param id - The effect definition ID.\n */\n disable(id: string): void;\n /**\n * Re-enable a previously disabled effect.\n *\n * @param id - The effect definition ID.\n */\n enable(id: string): void;\n /**\n * Check whether an effect is currently enabled.\n *\n * @param id - The effect definition ID.\n * @returns `true` if the effect has not been disabled.\n */\n isEnabled(id: string): boolean;\n /**\n * Invoke every stored cleanup function and mark the manager as stopped.\n *\n * @remarks\n * After this call, any cleanup functions returned by in-flight async effects\n * will be invoked immediately rather than stored.\n */\n cleanupAll(): void;\n /**\n * Register additional effect definitions at runtime (used for dynamic\n * module registration).\n *\n * @param newDefs - New effect definitions to merge into the manager.\n */\n registerDefinitions(newDefs: EffectsDef<Schema>): void;\n /**\n * Override an existing effect definition. Runs cleanup of the old effect first.\n *\n * @param id - The effect definition ID to override.\n * @param def - The new effect definition.\n * @throws If no effect with this ID exists.\n */\n assignDefinition(id: string, def: EffectsDef<Schema>[string]): void;\n /**\n * Remove an effect definition. Runs cleanup (try-catch) and removes from state.\n *\n * @param id - The effect definition ID to remove.\n */\n unregisterDefinition(id: string): void;\n /**\n * Execute an effect's `run()` function immediately.\n *\n * @param id - The effect definition ID.\n */\n callOne(id: string): Promise<void>;\n}\n\n/** Number of consecutive identical dep sets before skipping re-tracking */\nconst STABLE_THRESHOLD = 3;\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 /** How many consecutive runs produced the same deps (auto-tracked only) */\n stableRunCount: number;\n /** Once true, skip withTracking() overhead until a tracked fact mutates */\n depsStable: boolean;\n}\n\n/**\n * Configuration options accepted by {@link createEffectsManager}.\n *\n * @internal\n */\nexport interface CreateEffectsOptions<S extends Schema> {\n /** Effect definitions keyed by ID. */\n definitions: EffectsDef<S>;\n /** Proxy-based facts object passed to effect `run()` functions. */\n facts: Facts<S>;\n /** Underlying fact store used for `batch()` coalescing of mutations. */\n store: FactsStore<S>;\n /** Called when an effect executes, with the fact keys that triggered it. */\n onRun?: (id: string, deps: string[]) => void;\n /** Called when an effect's `run()` or cleanup function throws. */\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 * @remarks\n * Effects support two dependency modes:\n *\n * - **Auto-tracked** (no `deps`): Dependencies are re-tracked on every run\n * via {@link withTracking}, so conditional fact reads are always captured.\n * Only synchronous reads are tracked; reads after an `await` are invisible.\n *\n * - **Explicit `deps`**: A fixed array of fact keys declared on the definition.\n * Preferred for async effects where auto-tracking cannot cross `await`\n * boundaries.\n *\n * Each effect can return a cleanup function that runs before the next\n * execution or when {@link EffectsManager.cleanupAll | cleanupAll} is called.\n * Errors in effects are isolated via try-catch and never break the\n * reconciliation loop. Synchronous fact mutations inside effects are\n * coalesced with `store.batch()`.\n *\n * @param options - Configuration including effect definitions, facts proxy,\n * store, and lifecycle callbacks.\n * @returns An {@link EffectsManager} for running, enabling/disabling, and\n * cleaning up effects.\n *\n * @example\n * ```typescript\n * const effects = createEffectsManager({\n * definitions: {\n * logPhase: {\n * run: (facts, prev) => {\n * if (prev?.phase !== facts.phase) {\n * console.log(`Phase changed to ${facts.phase}`);\n * }\n * },\n * },\n * },\n * facts: factsProxy,\n * store: factsStore,\n * });\n *\n * await effects.runEffects(new Set([\"phase\"]));\n * ```\n *\n * @internal\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 stableRunCount: 0,\n depsStable: false,\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) {\n return false;\n }\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)) {\n // Reset dep stability when a tracked fact changes so the next run\n // re-tracks via withTracking() and can discover new conditional reads.\n if (state.depsStable) {\n state.depsStable = false;\n state.stableRunCount = 0;\n }\n\n return true;\n }\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 if (state.depsStable && state.dependencies) {\n // Deps have been stable for STABLE_THRESHOLD runs — skip withTracking()\n // overhead and just run the effect directly.\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 } else {\n // Auto-tracked: re-track dependencies so conditional reads are picked up\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 const 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 // Check dep stability: if deps match previous run, increment counter\n if (\n state.dependencies &&\n trackedDeps.size === state.dependencies.size\n ) {\n let same = true;\n for (const dep of trackedDeps) {\n if (!state.dependencies.has(dep)) {\n same = false;\n break;\n }\n }\n if (same) {\n state.stableRunCount++;\n if (state.stableRunCount >= STABLE_THRESHOLD) {\n state.depsStable = true;\n }\n } else {\n state.stableRunCount = 0;\n state.depsStable = false;\n }\n } else {\n state.stableRunCount = 0;\n state.depsStable = false;\n }\n\n // Update tracked dependencies\n state.dependencies = trackedDeps.size > 0 ? trackedDeps : null;\n }\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 // Reset dep stability — we don't know what the effect would have read\n if (!state.hasExplicitDeps) {\n state.stableRunCount = 0;\n state.depsStable = false;\n }\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 // Reset stability so runEffect re-tracks deps\n // (runAll bypasses shouldRun where the normal reset lives)\n state.depsStable = false;\n state.stableRunCount = 0;\n\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 assignDefinition(id: string, def: EffectsDef<S>[string]): void {\n if (!definitions[id]) {\n throw new Error(\n `[Directive] Cannot assign effect \"${id}\" — it does not exist. Use register() to create it.`,\n );\n }\n\n // Run cleanup of old effect before replacing\n const state = states.get(id);\n if (state) {\n runCleanup(state);\n }\n\n // Replace definition and re-init state\n (definitions as Record<string, unknown>)[id] = def;\n initState(id);\n },\n\n unregisterDefinition(id: string): void {\n if (!definitions[id]) {\n return;\n }\n\n // Run cleanup (try-catch inside runCleanup)\n const state = states.get(id);\n if (state) {\n runCleanup(state);\n }\n\n // Remove from all maps\n delete (definitions as Record<string, unknown>)[id];\n states.delete(id);\n },\n\n async callOne(id: string): Promise<void> {\n const def = definitions[id];\n if (!def) {\n throw new Error(\n `[Directive] Cannot call effect \"${id}\" — it does not exist.`,\n );\n }\n\n const state = getState(id);\n if (!state.enabled) {\n return;\n }\n\n // Run cleanup of previous run\n runCleanup(state);\n\n onRun?.(id, state.dependencies ? [...state.dependencies] : []);\n\n try {\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 } catch (error) {\n onError?.(id, error);\n console.error(`[Directive] Effect \"${id}\" threw an error:`, error);\n }\n },\n };\n\n return manager;\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 * A queued retry entry tracking its source, attempt count, and scheduled time.\n *\n * @internal\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 * @remarks\n * Retries are stored in a Map keyed by source ID. Each entry tracks its\n * attempt number and the timestamp of the next eligible retry. When\n * {@link createRetryLaterManager | processDueRetries} is called (typically\n * during reconciliation), entries whose scheduled time has elapsed are\n * returned and removed from the queue. The delay grows exponentially:\n * `delayMs * backoffMultiplier^(attempt - 1)`, capped at `maxDelayMs`.\n *\n * @param config - Backoff configuration including `delayMs`, `maxRetries`, `backoffMultiplier`, and `maxDelayMs`.\n * @returns A manager exposing `scheduleRetry`, `getPendingRetries`, `processDueRetries`, `cancelRetry`, and `clearAll` methods.\n *\n * @internal\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 * 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\n/**\n * Handle returned by {@link createErrorBoundaryManager} for routing errors\n * through configurable recovery strategies.\n *\n * @internal\n */\nexport interface ErrorBoundaryManager {\n /**\n * Route an error through the configured recovery strategy for its source.\n *\n * @param source - The subsystem that produced the error.\n * @param sourceId - Identifier of the specific constraint, resolver, effect, or derivation.\n * @param error - The thrown value (coerced to {@link DirectiveError} internally).\n * @param context - Optional context forwarded to callbacks and retry entries.\n * @returns The {@link RecoveryStrategy} that was applied.\n */\n handleError(\n source: ErrorSource,\n sourceId: string,\n error: unknown,\n context?: unknown,\n ): RecoveryStrategy;\n /**\n * Return the most recently recorded error, or `null` if none exist.\n *\n * @returns The last {@link DirectiveError}, or `null`.\n */\n getLastError(): DirectiveError | null;\n /**\n * Return a snapshot array of all recorded errors (up to the last 100).\n *\n * @returns A shallow copy of the internal error ring buffer.\n */\n getAllErrors(): DirectiveError[];\n /** Clear all recorded errors. */\n clearErrors(): void;\n /**\n * Access the underlying retry-later manager for advanced scheduling.\n *\n * @returns The {@link createRetryLaterManager} instance used internally.\n */\n getRetryLaterManager(): ReturnType<typeof createRetryLaterManager>;\n /**\n * Drain and return retry entries whose scheduled time has elapsed.\n *\n * @returns An array of {@link PendingRetry} entries that are now due.\n */\n processDueRetries(): PendingRetry[];\n /**\n * Reset retry attempt tracking for a source, typically after a successful resolution.\n *\n * @param sourceId - The source identifier whose retry counter should be cleared.\n */\n clearRetryAttempts(sourceId: string): void;\n}\n\n/**\n * Options accepted by {@link createErrorBoundaryManager}.\n *\n * @internal\n */\nexport interface CreateErrorBoundaryOptions {\n /** Per-source recovery strategies and retry-later tuning. */\n config?: ErrorBoundaryConfig;\n /** Invoked every time an error is recorded, before the recovery strategy runs. */\n onError?: (error: DirectiveError) => void;\n /** Invoked after a recovery strategy has been selected for an error. */\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 * @remarks\n * Five recovery strategies are available:\n *\n * - `\"skip\"` -- Swallow the error and continue.\n * - `\"retry\"` -- Signal the caller to retry immediately.\n * - `\"retry-later\"` -- Enqueue a deferred retry with exponential backoff\n * (delegated to an internal {@link createRetryLaterManager}).\n * - `\"disable\"` -- Permanently disable the failing source.\n * - `\"throw\"` -- Re-throw the error as a {@link DirectiveError}.\n *\n * Recent errors are kept in a ring buffer (last 100) for inspection via\n * {@link ErrorBoundaryManager.getAllErrors | getAllErrors}. Each strategy\n * can be configured per source type (`onConstraintError`, `onResolverError`,\n * etc.) or as a callback that dynamically selects a strategy.\n *\n * @param options - Error boundary configuration, plus `onError` and `onRecovery` callbacks for plugin integration.\n * @returns An {@link ErrorBoundaryManager} for routing errors through the configured strategies.\n *\n * @internal\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 (capped to prevent unbounded growth)\n const retryAttempts = new Map<string, number>();\n const MAX_RETRY_SOURCES = 1000;\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 // FIFO eviction to prevent unbounded growth\n if (retryAttempts.size > MAX_RETRY_SOURCES) {\n const oldest = retryAttempts.keys().next().value;\n if (oldest !== undefined) {\n retryAttempts.delete(oldest);\n }\n }\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 { BLOCKED_PROPS, trackAccess, withoutTracking } from \"./tracking.js\";\nimport type {\n Facts,\n FactsSnapshot,\n FactsStore,\n InferSchema,\n Schema,\n} from \"./types.js\";\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// ============================================================================\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 * @remarks\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 {@link FactsStore} 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 *\n * @internal\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) {\n return st._typeName;\n }\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) {\n return \"[redacted]\";\n }\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: clear all listeners on destroy to release resources immediately.\n // Not part of the public FactsStore interface — called by engine.destroy().\n (store as unknown as Record<string, unknown>).destroy = () => {\n keyListeners.clear();\n allListeners.clear();\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\n/**\n * Create a Proxy wrapper around a {@link FactsStore} for clean property-style\n * access (`facts.phase`) with automatic dependency tracking.\n *\n * @remarks\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 {@link Facts} proxy with property-style get/set and prototype pollution guards\n *\n * @example\n * ```ts\n * const store = createFactsStore({ schema: { phase: t.string() } });\n * const facts = createFactsProxy(store, { phase: t.string() });\n *\n * facts.phase = \"red\";\n * console.log(facts.phase); // \"red\"\n * ```\n *\n * @internal\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\") {\n return store;\n }\n if (prop === \"$snapshot\") {\n return snapshot;\n }\n\n // Special properties\n if (typeof prop === \"symbol\") {\n return undefined;\n }\n\n // Prototype pollution protection\n if (BLOCKED_PROPS.has(prop)) {\n return undefined;\n }\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\") {\n return false;\n }\n if (prop === \"$store\" || prop === \"$snapshot\") {\n return false;\n }\n // Prototype pollution protection\n if (BLOCKED_PROPS.has(prop)) {\n return false;\n }\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\") {\n return false;\n }\n if (prop === \"$store\" || prop === \"$snapshot\") {\n return false;\n }\n // Prototype pollution protection\n if (BLOCKED_PROPS.has(prop)) {\n return false;\n }\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\") {\n return true;\n }\n if (typeof prop === \"symbol\") {\n return false;\n }\n // Prototype pollution protection\n if (BLOCKED_PROPS.has(prop)) {\n return false;\n }\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 defineProperty() {\n return false;\n },\n\n getPrototypeOf() {\n return null;\n },\n\n setPrototypeOf() {\n return false;\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 * @remarks\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 *\n * @internal\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 TraceEntry,\n Schema,\n Snapshot,\n System,\n} from \"./types.js\";\nimport type { DirectiveError } from \"./types.js\";\n\n// ============================================================================\n// Plugin Manager\n// ============================================================================\n\n/**\n * Internal manager that broadcasts lifecycle events to registered {@link Plugin} instances.\n *\n * @remarks\n * PluginManager uses `Schema` (flat) internally because the engine works with\n * flat schemas. The public API uses `ModuleSchema` (consolidated), and the\n * conversion happens in `createSystem`.\n *\n * Plugins execute in registration order. All hook invocations are wrapped in\n * try-catch so a misbehaving plugin never breaks the engine. Duplicate plugin\n * names are detected and the older registration is replaced with a warning.\n *\n * Lifecycle hook categories:\n * - **System lifecycle:** `emitInit`, `emitStart`, `emitStop`, `emitDestroy`\n * - **Facts:** `emitFactSet`, `emitFactDelete`, `emitFactsBatch`\n * - **Derivations:** `emitDerivationCompute`, `emitDerivationInvalidate`\n * - **Reconciliation:** `emitReconcileStart`, `emitReconcileEnd`\n * - **Constraints:** `emitConstraintEvaluate`, `emitConstraintError`\n * - **Requirements:** `emitRequirementCreated`, `emitRequirementMet`, `emitRequirementCanceled`\n * - **Resolvers:** `emitResolverStart`, `emitResolverComplete`, `emitResolverError`, `emitResolverRetry`, `emitResolverCancel`\n * - **Effects:** `emitEffectRun`, `emitEffectError`\n * - **History:** `emitSnapshot`, `emitHistoryNavigate`\n * - **Errors:** `emitError`, `emitErrorRecovery`\n * - **Trace:** `emitTraceComplete`\n *\n * @typeParam _S - The flat schema type (unused at runtime).\n *\n * @internal\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 // History hooks\n emitSnapshot(snapshot: Snapshot): void;\n emitHistoryNavigate(from: number, to: number): void;\n\n // Error boundary hooks\n emitError(error: DirectiveError): void;\n emitErrorRecovery(error: DirectiveError, strategy: RecoveryStrategy): void;\n\n // Dynamic definition hooks\n emitDefinitionRegister(type: string, id: string, def: unknown): void;\n emitDefinitionAssign(type: string, id: string, def: unknown, original: unknown): void;\n emitDefinitionUnregister(type: string, id: string): void;\n emitDefinitionCall(type: string, id: string, props?: unknown): void;\n\n // Trace hooks\n emitTraceComplete(run: TraceEntry): void;\n}\n\n/**\n * Create a {@link PluginManager} that broadcasts lifecycle events to registered plugins.\n *\n * @remarks\n * Plugins are called in registration order. All hook invocations are wrapped\n * in try-catch so a misbehaving plugin never breaks the engine. Duplicate\n * plugin names are detected and the older registration is replaced with a\n * console warning.\n *\n * @returns A {@link PluginManager} with `register`/`unregister`/`getPlugins` and `emit*` methods for every lifecycle event.\n *\n * @internal\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) {\n return undefined;\n }\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) {\n return undefined;\n }\n try {\n return await fn();\n } catch (error) {\n console.error(\"[Directive] Plugin error:\", error);\n return undefined;\n }\n }\n\n /** Create a sync broadcast function for a given plugin hook name */\n // biome-ignore lint/suspicious/noExplicitAny: Plugin hook signatures vary\n function broadcast<K extends keyof Plugin<any>>(hook: K) {\n return (...args: unknown[]) => {\n for (const plugin of plugins) {\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic hook dispatch\n safeCall(() => (plugin as any)[hook]?.(...args));\n }\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 (emitInit is async, handled separately)\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 emitStart: broadcast(\"onStart\"),\n emitStop: broadcast(\"onStop\"),\n emitDestroy: broadcast(\"onDestroy\"),\n\n // Fact hooks\n emitFactSet: broadcast(\"onFactSet\"),\n emitFactDelete: broadcast(\"onFactDelete\"),\n emitFactsBatch: broadcast(\"onFactsBatch\"),\n\n // Derivation hooks\n emitDerivationCompute: broadcast(\"onDerivationCompute\"),\n emitDerivationInvalidate: broadcast(\"onDerivationInvalidate\"),\n\n // Reconciliation hooks\n emitReconcileStart: broadcast(\"onReconcileStart\"),\n emitReconcileEnd: broadcast(\"onReconcileEnd\"),\n\n // Constraint hooks\n emitConstraintEvaluate: broadcast(\"onConstraintEvaluate\"),\n emitConstraintError: broadcast(\"onConstraintError\"),\n\n // Requirement hooks\n emitRequirementCreated: broadcast(\"onRequirementCreated\"),\n emitRequirementMet: broadcast(\"onRequirementMet\"),\n emitRequirementCanceled: broadcast(\"onRequirementCanceled\"),\n\n // Resolver hooks\n emitResolverStart: broadcast(\"onResolverStart\"),\n emitResolverComplete: broadcast(\"onResolverComplete\"),\n emitResolverError: broadcast(\"onResolverError\"),\n emitResolverRetry: broadcast(\"onResolverRetry\"),\n emitResolverCancel: broadcast(\"onResolverCancel\"),\n\n // Effect hooks\n emitEffectRun: broadcast(\"onEffectRun\"),\n emitEffectError: broadcast(\"onEffectError\"),\n\n // History hooks\n emitSnapshot: broadcast(\"onSnapshot\"),\n emitHistoryNavigate: broadcast(\"onHistoryNavigate\"),\n\n // Error boundary hooks\n emitError: broadcast(\"onError\"),\n emitErrorRecovery: broadcast(\"onErrorRecovery\"),\n\n // Dynamic definition hooks\n emitDefinitionRegister: broadcast(\"onDefinitionRegister\"),\n emitDefinitionAssign: broadcast(\"onDefinitionAssign\"),\n emitDefinitionUnregister: broadcast(\"onDefinitionUnregister\"),\n emitDefinitionCall: broadcast(\"onDefinitionCall\"),\n\n // Trace hooks\n emitTraceComplete: broadcast(\"onTraceComplete\"),\n } as PluginManager<S>;\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/**\n * Summary of a resolver that is currently in flight.\n *\n * @internal\n */\nexport interface InflightInfo {\n /** The unique requirement ID being resolved. */\n id: string;\n /** The definition ID of the resolver handling this requirement. */\n resolverId: string;\n /** Epoch timestamp (ms) when resolution started. */\n startedAt: number;\n}\n\n/**\n * Manager returned by {@link createResolversManager} that matches\n * requirements to resolver handlers and manages their execution lifecycle.\n *\n * @internal\n */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport interface ResolversManager<_S extends Schema> {\n /**\n * Start resolving a requirement by matching it to a resolver handler.\n *\n * @remarks\n * Duplicate in-flight requirements (same `req.id`) are silently ignored.\n * If the matched resolver has `batch.enabled`, the requirement is queued\n * for batch processing instead of being resolved immediately.\n *\n * @param req - The requirement (with a stable identity ID) to resolve.\n */\n resolve(req: RequirementWithId): void;\n /**\n * Cancel an in-flight or batch-queued resolver by requirement ID.\n *\n * @remarks\n * Aborts the `AbortController` for in-flight resolvers. For batch-queued\n * requirements, removes the requirement from the pending batch.\n *\n * @param requirementId - The unique requirement ID to cancel.\n */\n cancel(requirementId: string): void;\n /**\n * Cancel every in-flight resolver and flush all pending batch queues.\n */\n cancelAll(): void;\n /**\n * Get the current status of a resolver by requirement ID.\n *\n * @param requirementId - The unique requirement ID to look up.\n * @returns The {@link ResolverStatus} (idle, pending, running, success, error, or canceled).\n */\n getStatus(requirementId: string): ResolverStatus;\n /**\n * Get the requirement IDs of all currently in-flight resolvers.\n *\n * @returns An array of requirement ID strings.\n */\n getInflight(): string[];\n /**\n * Get detailed info for every in-flight resolver.\n *\n * @returns An array of {@link InflightInfo} objects.\n */\n getInflightInfo(): InflightInfo[];\n /**\n * Check whether a requirement is currently being resolved.\n *\n * @param requirementId - The unique requirement ID to check.\n * @returns `true` if the requirement has an active in-flight resolver.\n */\n isResolving(requirementId: string): boolean;\n /**\n * Immediately flush all pending batch queues, executing their resolvers.\n */\n processBatches(): void;\n /**\n * Check whether any batch queues have requirements waiting to be processed.\n *\n * @returns `true` if at least one batch queue is non-empty.\n */\n hasPendingBatches(): boolean;\n /**\n * Register additional resolver definitions at runtime (used for dynamic\n * module registration).\n *\n * @remarks\n * Clears the resolver-by-type cache so newly registered resolvers are\n * discoverable on the next {@link ResolversManager.resolve | resolve} call.\n *\n * @param newDefs - New resolver definitions to merge into the manager.\n */\n registerDefinitions(newDefs: ResolversDef<Schema>): void;\n /**\n * Override an existing resolver definition.\n *\n * @param id - The resolver definition ID to override.\n * @param def - The new resolver definition.\n * @throws If no resolver with this ID exists.\n */\n assignDefinition(id: string, def: ResolversDef<Schema>[string]): void;\n /**\n * Remove a resolver definition. Cancels any inflight resolution.\n *\n * @param id - The resolver definition ID to remove.\n */\n unregisterDefinition(id: string): void;\n /**\n * Execute a resolver with a given requirement object.\n *\n * @param id - The resolver definition ID.\n * @param requirement - The requirement to resolve.\n */\n callOne(id: string, requirement: Requirement): Promise<void>;\n /**\n * Clean up all internal state. Called on system destroy.\n */\n destroy(): 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/**\n * Configuration options accepted by {@link createResolversManager}.\n *\n * @internal\n */\nexport interface CreateResolversOptions<S extends Schema> {\n /** Resolver definitions keyed by ID. */\n definitions: ResolversDef<S>;\n /** Proxy-based facts object passed to resolver contexts. */\n facts: Facts<S>;\n /** Underlying fact store used for `batch()` coalescing of mutations. */\n store: FactsStore<S>;\n /** Called when a resolver begins execution. */\n onStart?: (resolver: string, req: RequirementWithId) => void;\n /** Called when a resolver completes successfully, with the wall-clock duration in ms. */\n onComplete?: (\n resolver: string,\n req: RequirementWithId,\n duration: number,\n ) => void;\n /** Called when a resolver exhausts all retry attempts. */\n onError?: (resolver: string, req: RequirementWithId, error: unknown) => void;\n /** Called before each retry attempt with the upcoming attempt number. */\n onRetry?: (resolver: string, req: RequirementWithId, attempt: number) => void;\n /** Called when a resolver is canceled via {@link ResolversManager.cancel | cancel}. */\n onCancel?: (resolver: string, req: RequirementWithId) => void;\n /** Called after any resolver finishes (success, error, or batch completion) to trigger 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 * 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 * @remarks\n * Resolvers are matched by requirement type (string equality) or a predicate\n * function. Each resolution runs with an `AbortController` for cancellation\n * and configurable retry policies (none, linear, or exponential backoff).\n *\n * **Batching:** When a resolver sets `batch.enabled`, incoming requirements\n * are queued and flushed either when `batch.maxSize` is reached or after\n * `batch.windowMs` elapses, whichever comes first. Batch resolvers can use\n * `resolveBatch` (all-or-nothing) or `resolveBatchWithResults` (per-item\n * success/failure). If only `resolve` is provided with batching enabled, the\n * manager falls back to individual resolution calls.\n *\n * Duplicate in-flight requirements (same requirement ID) are automatically\n * deduplicated. Resolver-by-type lookups are cached with FIFO eviction at\n * 1 000 entries to handle dynamic requirement types.\n *\n * @param options - Configuration including resolver definitions, facts proxy,\n * store, and lifecycle callbacks.\n * @returns A {@link ResolversManager} for dispatching, canceling, and\n * inspecting requirement resolution.\n *\n * @example\n * ```typescript\n * const resolvers = createResolversManager({\n * definitions: {\n * transition: {\n * requirement: \"TRANSITION\",\n * retry: { attempts: 3, backoff: \"exponential\" },\n * resolve: async (req, context) => {\n * context.facts.phase = req.to;\n * context.facts.elapsed = 0;\n * },\n * },\n * },\n * facts: factsProxy,\n * store: factsStore,\n * onComplete: (id, req, ms) => console.log(`${id} resolved in ${ms}ms`),\n * });\n *\n * resolvers.resolve(requirementWithId);\n * ```\n *\n * @internal\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, Set<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 // Move to end of Map iteration order (LRU: least recently used is first)\n resolversByType.delete(reqType);\n resolversByType.set(reqType, 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, new Set());\n }\n resolversByType.get(reqType)!.add(id);\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 /**\n * Shared retry catch-block logic: normalize error, check abort, check shouldRetry,\n * sleep with abort awareness. Returns \"abort\" if canceled, \"break\" if shouldRetry\n * returned false, or \"continue\" if the next attempt should proceed.\n */\n async function handleRetryError(\n error: unknown,\n attempt: number,\n retryPolicy: RetryPolicy & { attempts: number; backoff: string },\n controller: AbortController,\n ): Promise<{ action: \"abort\" | \"break\" | \"continue\"; error: Error }> {\n const normalizedError =\n error instanceof Error ? error : new Error(String(error));\n\n if (controller.signal.aborted) {\n return { action: \"abort\", error: normalizedError };\n }\n\n if (\n retryPolicy.shouldRetry &&\n !retryPolicy.shouldRetry(normalizedError, attempt)\n ) {\n return { action: \"break\", error: normalizedError };\n }\n\n if (attempt < retryPolicy.attempts) {\n if (controller.signal.aborted) {\n return { action: \"abort\", error: normalizedError };\n }\n\n const delay = calculateDelay(retryPolicy, attempt);\n\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 if (controller.signal.aborted) {\n return { action: \"abort\", error: normalizedError };\n }\n }\n\n return { action: \"continue\", error: normalizedError };\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 const result = await handleRetryError(\n error,\n attempt,\n retryPolicy,\n controller,\n );\n lastError = result.error;\n\n if (result.action === \"abort\") {\n return;\n }\n if (result.action === \"break\") {\n break;\n }\n\n // \"continue\" — notify retry and loop\n if (attempt < retryPolicy.attempts) {\n onRetry?.(resolverId, req, attempt + 1);\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 const result = await handleRetryError(\n error,\n attempt,\n retryPolicy,\n controller,\n );\n lastError = result.error;\n\n if (result.action === \"abort\") {\n return;\n }\n if (result.action === \"break\") {\n break;\n }\n\n // \"continue\" — notify retry for all requirements and loop\n if (attempt < retryPolicy.attempts) {\n for (const req of requirements) {\n onRetry?.(resolverId, req, attempt + 1);\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 if (process.env.NODE_ENV !== \"production\") {\n console.warn(\n `[Directive] No resolver found for requirement type \"${req.requirement.type}\" (id: ${req.id})`,\n );\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 assignDefinition(id: string, def: ResolversDef<Schema>[string]): void {\n if (!definitions[id]) {\n throw new Error(\n `[Directive] Cannot assign resolver \"${id}\" — it does not exist. Use register() to create it.`,\n );\n }\n\n // Replace definition\n (definitions as Record<string, unknown>)[id] = def;\n // Clear cache so the new definition is discoverable\n resolversByType.clear();\n },\n\n unregisterDefinition(id: string): void {\n if (!definitions[id]) {\n return;\n }\n\n // Cancel any inflight resolutions using this resolver\n for (const [reqId, state] of inflight) {\n if (state.resolverId === id) {\n state.controller.abort();\n inflight.delete(reqId);\n statuses.set(reqId, {\n state: \"canceled\",\n requirementId: reqId,\n canceledAt: Date.now(),\n });\n onCancel?.(id, state.originalRequirement);\n }\n }\n\n // Remove from batch queues\n const batch = batches.get(id);\n if (batch) {\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?.(id, req);\n }\n batches.delete(id);\n }\n\n delete (definitions as Record<string, unknown>)[id];\n resolversByType.clear();\n cleanupStatuses();\n },\n\n async callOne(id: string, requirement: Requirement): Promise<void> {\n const def = definitions[id];\n if (!def) {\n throw new Error(\n `[Directive] Cannot call resolver \"${id}\" — it does not exist.`,\n );\n }\n\n const controller = new AbortController();\n const ctx = createContext(controller.signal);\n\n if (def.resolve) {\n let resolvePromise!: Promise<void>;\n store.batch(() => {\n resolvePromise = def.resolve!(\n requirement as Parameters<NonNullable<typeof def.resolve>>[0],\n ctx,\n ) as Promise<void>;\n });\n\n await resolvePromise;\n }\n },\n\n destroy(): void {\n this.cancelAll();\n statuses.clear();\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 HistoryManager,\n createDisabledHistory,\n createHistoryManager,\n} from \"../utils/history.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\";\nimport { BLOCKED_PROPS } from \"./tracking.js\";\nimport type {\n ConstraintsDef,\n DerivationsDef,\n EffectsDef,\n EventsDef,\n FactsSnapshot,\n InferSchema,\n ReconcileResult,\n ResolversDef,\n TraceEntry,\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 history\n * into a single reactive system.\n *\n * @remarks\n * This is the internal factory used by {@link createSystem}. Most users should\n * call `createSystem` instead, which provides a friendlier API and handles\n * module composition.\n *\n * @param config - Full system configuration including modules, plugins, error boundary settings, and debug options\n * @returns A {@link 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 * @internal\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 if (section === \"schema\" && key.startsWith(\"$\")) {\n throw new Error(\n `[Directive] Module \"${module.id}\" has schema key \"${key}\" starting with \"$\". ` +\n \"Keys starting with $ are reserved for internal accessors ($store, $snapshot).\",\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 history.snapshotEvents, build the filter set.\n // Modules WITHOUT history.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 history.snapshotEvents at runtime\n const hasAnySnapshotEvents = config.modules.some(\n (m: any) => m.history?.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 history.snapshotEvents at runtime\n const mod = module as any;\n if (mod.history?.snapshotEvents) {\n for (const eventName of mod.history.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 createHistoryManager() below.\n let historyRef: HistoryManager<S> | null = null;\n\n // Trace (per-run reconciliation changelog, gated by config.trace)\n const traceEnabled = config.trace === true || (typeof config.trace === \"object\" && config.trace !== null);\n const maxRuns = (typeof config.trace === \"object\" && config.trace !== null ? config.trace.maxRuns : undefined) ?? 100;\n const traceEntries: TraceEntry[] = [];\n const traceById = new Map<number, TraceEntry>();\n let traceIdCounter = 0;\n let currentTrace: TraceEntry | null = null;\n const pendingFactChanges: Array<{\n key: string;\n oldValue: unknown;\n newValue: unknown;\n }> = [];\n // Async resolver attribution: requirementId → traceId\n const resolverTraceMap = new Map<string, number>();\n // Track inflight resolvers per trace: traceId → count of pending resolvers\n const traceInflightCount = new Map<number, number>();\n // Consistent duration: track start time per trace (performance.now() based)\n const traceStartMs = new Map<number, number>();\n // Cached trace getter (E1): avoid spread on every access\n let traceCache: TraceEntry[] | null = null;\n let traceCacheVersion = 0;\n let currentCacheVersion = 0;\n // Anomaly detection statistics\n const traceStats = {\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 trace\n if (traceEnabled) {\n pendingFactChanges.push({\n key: String(key),\n oldValue: prev,\n newValue: value,\n });\n }\n // During history 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 (historyRef?.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 trace\n if (traceEnabled) {\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 history restore, skip change tracking and reconciliation.\n if (historyRef?.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 (currentTrace) {\n currentTrace.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 (currentTrace) {\n currentTrace.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 (currentTrace) {\n currentTrace.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 trace entry when all its resolvers have settled */\n function finalizeTrace(traceId: number): void {\n const entry = traceById.get(traceId);\n if (entry && entry.status === \"pending\") {\n entry.status = \"settled\";\n // Consistent duration: use performance.now() when available\n const startMs = traceStartMs.get(traceId);\n entry.duration =\n startMs !== undefined\n ? performance.now() - startMs\n : Date.now() - entry.timestamp;\n traceStartMs.delete(traceId);\n traceInflightCount.delete(traceId);\n // Build causal chain on settlement\n entry.causalChain = buildCausalChain(entry);\n // Anomaly detection\n updateTraceStats(entry);\n currentCacheVersion++;\n pluginManager.emitTraceComplete(entry);\n }\n }\n\n /** Decrement inflight count for a trace entry and finalize if settled */\n function decrementTraceInflight(requirementId: string): void {\n const traceId = resolverTraceMap.get(requirementId);\n resolverTraceMap.delete(requirementId);\n if (traceId !== undefined) {\n const remaining = (traceInflightCount.get(traceId) ?? 1) - 1;\n if (remaining <= 0) {\n finalizeTrace(traceId);\n } else {\n traceInflightCount.set(traceId, remaining);\n }\n }\n }\n\n /** Evict the oldest trace entry from the ring buffer, cleaning up associated state (C1) */\n function evictOldestTrace(): void {\n const evicted = traceEntries.shift();\n if (evicted) {\n traceById.delete(evicted.id);\n traceStartMs.delete(evicted.id);\n if (evicted.status === \"pending\") {\n traceInflightCount.delete(evicted.id);\n for (const [reqId, rId] of resolverTraceMap) {\n if (rId === evicted.id) {\n resolverTraceMap.delete(reqId);\n }\n }\n }\n }\n }\n\n /** Build a human-readable causal chain summary from a trace entry (Part 6) */\n function buildCausalChain(entry: TraceEntry): string {\n const parts: string[] = [];\n\n for (const fc of entry.factChanges) {\n parts.push(`${fc.key} changed`);\n }\n\n for (const d of entry.derivationsRecomputed) {\n parts.push(`${d.id} recomputed`);\n }\n\n for (const c of entry.constraintsHit) {\n parts.push(`${c.id} constraint hit`);\n }\n\n for (const r of entry.requirementsAdded) {\n parts.push(`${r.type} requirement added`);\n }\n\n for (const rs of entry.resolversCompleted) {\n parts.push(`${rs.resolver} resolved (${rs.duration.toFixed(0)}ms)`);\n }\n\n for (const rs of entry.resolversErrored) {\n parts.push(`${rs.resolver} errored`);\n }\n\n for (const e of entry.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 trace entry (Part 8) */\n function updateTraceStats(entry: TraceEntry): void {\n traceStats.count++;\n traceStats.totalDuration += entry.duration;\n traceStats.avgDuration = traceStats.totalDuration / traceStats.count;\n if (entry.duration > traceStats.maxDuration) {\n traceStats.maxDuration = entry.duration;\n }\n\n const resolverCount = entry.resolversStarted.length;\n traceStats.totalResolverCount += resolverCount;\n traceStats.avgResolverCount = traceStats.totalResolverCount / traceStats.count;\n\n const factChangeCount = entry.factChanges.length;\n traceStats.totalFactChangeCount += factChangeCount;\n traceStats.avgFactChangeCount =\n traceStats.totalFactChangeCount / traceStats.count;\n\n // Flag anomalies (only after enough data)\n const anomalies: string[] = [];\n if (traceStats.count > 3 && entry.duration > traceStats.avgDuration * 5) {\n anomalies.push(\n `Duration ${entry.duration.toFixed(0)}ms is 5x+ above average (${traceStats.avgDuration.toFixed(0)}ms)`,\n );\n }\n\n if (entry.resolversErrored.length > 0) {\n anomalies.push(`${entry.resolversErrored.length} resolver(s) errored`);\n }\n\n if (anomalies.length > 0) {\n entry.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 trace entry that started this resolver\n if (traceEnabled) {\n const traceId = resolverTraceMap.get(req.id);\n if (traceId !== undefined) {\n const entry = traceById.get(traceId);\n if (entry) {\n entry.resolversCompleted.push({\n resolver,\n requirementId: req.id,\n duration,\n });\n }\n }\n decrementTraceInflight(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 trace entry that started this resolver\n if (traceEnabled) {\n const traceId = resolverTraceMap.get(req.id);\n if (traceId !== undefined) {\n const entry = traceById.get(traceId);\n if (entry) {\n entry.resolversErrored.push({\n resolver,\n requirementId: req.id,\n error: String(error),\n });\n }\n }\n decrementTraceInflight(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 trace entry\n if (traceEnabled) {\n decrementTraceInflight(req.id);\n }\n },\n onResolutionComplete: () => {\n // After a resolver completes, schedule another reconcile\n notifySettlementChange();\n scheduleReconcile();\n },\n });\n\n // History listeners — notified when snapshot state changes\n const historyListeners = new Set<() => void>();\n\n function notifyHistoryChange(): void {\n for (const listener of historyListeners) {\n listener();\n }\n }\n\n // Create history manager\n const historyManager: HistoryManager<S> = config.history\n ? createHistoryManager({\n historyOption: config.history,\n facts,\n store,\n onSnapshot: (snapshot) => {\n pluginManager.emitSnapshot(snapshot);\n notifyHistoryChange();\n },\n onHistoryChange: (from, to) => {\n pluginManager.emitHistoryNavigate(from, to);\n notifyHistoryChange();\n },\n })\n : createDisabledHistory();\n historyRef = historyManager;\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 const MAX_DEFERRED_REGISTRATIONS = 100;\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 // ============================================================================\n // Dynamic Definition Infrastructure\n // ============================================================================\n\n /** Track which definitions were dynamically registered (not from module defs) */\n const dynamicIds = {\n constraints: new Set<string>(),\n resolvers: new Set<string>(),\n derivations: new Set<string>(),\n effects: new Set<string>(),\n };\n\n /** Originals map for assigned definitions (stores the definition that was overridden) */\n const originals = {\n constraints: new Map<string, unknown>(),\n resolvers: new Map<string, unknown>(),\n derivations: new Map<string, unknown>(),\n effects: new Map<string, unknown>(),\n };\n\n /** Reserved derive method names — derivation IDs cannot use these */\n const RESERVED_DERIVE_NAMES = new Set([\n \"register\", \"assign\", \"unregister\", \"call\", \"isDynamic\", \"listDynamic\",\n ]);\n\n type DefType = \"constraint\" | \"resolver\" | \"derivation\" | \"effect\";\n type DeferredOp =\n | { op: \"register\"; type: DefType; id: string; def: unknown }\n | { op: \"assign\"; type: DefType; id: string; def: unknown }\n | { op: \"unregister\"; type: DefType; id: string };\n\n /**\n * Deferred registrations queue — applied after reconcile settles.\n *\n * While operations are deferred (i.e. during reconciliation), isDynamic()\n * and listDynamic() will NOT reflect the pending registration/unregistration\n * until the deferred queue is flushed after the current cycle completes.\n */\n const deferredRegistrations: DeferredOp[] = [];\n\n /** Validate a definition ID for safety */\n function validateDefId(id: string): void {\n if (typeof id !== \"string\" || id.length === 0) {\n throw new Error(\n `[Directive] Definition ID must be a non-empty string. Received: ${String(id)}`,\n );\n }\n if (BLOCKED_PROPS.has(id)) {\n throw new Error(\n `[Directive] Security: Definition ID \"${id}\" is a blocked property.`,\n );\n }\n if (id.includes(\"::\")) {\n throw new Error(\n `[Directive] Definition ID \"${id}\" cannot contain \"::\". This separator is reserved for namespacing.`,\n );\n }\n }\n\n /** Register a definition (called by engine, handles deferral) */\n function registerDefinition(type: DefType, id: string, def: unknown): void {\n if (state.isDestroyed) {\n throw new Error(\n `[Directive] Cannot register ${type} \"${id}\" on a destroyed system.`,\n );\n }\n\n validateDefId(id);\n\n // If reconciling, defer\n if (state.isReconciling) {\n if (deferredRegistrations.length >= MAX_DEFERRED_REGISTRATIONS) {\n throw new Error(\n `[Directive] Too many deferred registrations (max ${MAX_DEFERRED_REGISTRATIONS}). Avoid calling register/assign/unregister in resolver or effect callbacks during reconciliation.`,\n );\n }\n deferredRegistrations.push({ op: \"register\", type, id, def });\n\n return;\n }\n\n applyRegister(type, id, def);\n }\n\n /** Assign (override) a definition */\n function assignDefinition(type: DefType, id: string, def: unknown): void {\n if (state.isDestroyed) {\n throw new Error(\n `[Directive] Cannot assign ${type} \"${id}\" on a destroyed system.`,\n );\n }\n\n validateDefId(id);\n\n if (state.isReconciling) {\n if (deferredRegistrations.length >= MAX_DEFERRED_REGISTRATIONS) {\n throw new Error(\n `[Directive] Too many deferred registrations (max ${MAX_DEFERRED_REGISTRATIONS}). Avoid calling register/assign/unregister in resolver or effect callbacks during reconciliation.`,\n );\n }\n deferredRegistrations.push({ op: \"assign\", type, id, def });\n\n return;\n }\n\n applyAssign(type, id, def);\n }\n\n /** Unregister a definition */\n function unregisterDefinition(type: DefType, id: string): void {\n if (state.isDestroyed) {\n throw new Error(\n `[Directive] Cannot unregister ${type} \"${id}\" on a destroyed system.`,\n );\n }\n\n validateDefId(id);\n\n if (state.isReconciling) {\n if (deferredRegistrations.length >= MAX_DEFERRED_REGISTRATIONS) {\n throw new Error(\n `[Directive] Too many deferred registrations (max ${MAX_DEFERRED_REGISTRATIONS}). Avoid calling register/assign/unregister in resolver or effect callbacks during reconciliation.`,\n );\n }\n deferredRegistrations.push({ op: \"unregister\", type, id });\n\n return;\n }\n\n applyUnregister(type, id);\n }\n\n /** Call/invoke a definition */\n function callDefinition(type: DefType, id: string, props?: unknown): unknown {\n if (state.isDestroyed) {\n throw new Error(\n `[Directive] Cannot call ${type} \"${id}\" on a destroyed system.`,\n );\n }\n\n validateDefId(id);\n pluginManager.emitDefinitionCall(type, id, props);\n\n switch (type) {\n case \"constraint\":\n return constraintsManager.callOne(id, props as Record<string, unknown> | undefined);\n case \"resolver\":\n return resolversManager.callOne(id, props as { type: string; [key: string]: unknown });\n case \"derivation\":\n return derivationsManager.callOne(id);\n case \"effect\":\n return effectsManager.callOne(id);\n }\n }\n\n /** Apply a register operation immediately */\n function applyRegister(type: DefType, id: string, def: unknown): void {\n switch (type) {\n case \"constraint\": {\n if (id in mergedConstraints) {\n throw new Error(\n `[Directive] Constraint \"${id}\" already exists. Use assign() to override.`,\n );\n }\n const constraintDef = def as Record<string, unknown>;\n (mergedConstraints as Record<string, unknown>)[id] = constraintDef;\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic registration\n constraintsManager.registerDefinitions({ [id]: constraintDef } as any);\n dynamicIds.constraints.add(id);\n pluginManager.emitDefinitionRegister(type, id, def);\n scheduleReconcile();\n break;\n }\n case \"resolver\": {\n if (id in mergedResolvers) {\n throw new Error(\n `[Directive] Resolver \"${id}\" already exists. Use assign() to override.`,\n );\n }\n const resolverDef = def as Record<string, unknown>;\n (mergedResolvers as Record<string, unknown>)[id] = resolverDef;\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic registration\n resolversManager.registerDefinitions({ [id]: resolverDef } as any);\n dynamicIds.resolvers.add(id);\n pluginManager.emitDefinitionRegister(type, id, def);\n scheduleReconcile();\n break;\n }\n case \"derivation\": {\n if (RESERVED_DERIVE_NAMES.has(id)) {\n throw new Error(\n `[Directive] Derivation ID \"${id}\" conflicts with a reserved derive method name.`,\n );\n }\n if (id in mergedDerive) {\n throw new Error(\n `[Directive] Derivation \"${id}\" already exists. Use assign() to override.`,\n );\n }\n (mergedDerive as Record<string, unknown>)[id] = def;\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic registration\n derivationsManager.registerDefinitions({ [id]: def } as any);\n dynamicIds.derivations.add(id);\n pluginManager.emitDefinitionRegister(type, id, def);\n break;\n }\n case \"effect\": {\n if (id in mergedEffects) {\n throw new Error(\n `[Directive] Effect \"${id}\" already exists. Use assign() to override.`,\n );\n }\n const effectDef = def as Record<string, unknown>;\n (mergedEffects as Record<string, unknown>)[id] = effectDef;\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic registration\n effectsManager.registerDefinitions({ [id]: effectDef } as any);\n dynamicIds.effects.add(id);\n pluginManager.emitDefinitionRegister(type, id, def);\n break;\n }\n }\n }\n\n /**\n * Apply an assign operation immediately.\n *\n * Ordering is important for atomicity: the manager's assignDefinition() is\n * called first (it may validate and throw, e.g. cycle detection). Only on\n * success do we commit the original and update the merged map.\n */\n function applyAssign(type: DefType, id: string, def: unknown): void {\n switch (type) {\n case \"constraint\": {\n if (!(id in mergedConstraints)) {\n throw new Error(\n `[Directive] Constraint \"${id}\" does not exist. Use register() to create it.`,\n );\n }\n const original = (mergedConstraints as Record<string, unknown>)[id];\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic assignment\n constraintsManager.assignDefinition(id, def as any);\n originals.constraints.set(id, original);\n (mergedConstraints as Record<string, unknown>)[id] = def;\n pluginManager.emitDefinitionAssign(type, id, def, original);\n scheduleReconcile();\n break;\n }\n case \"resolver\": {\n if (!(id in mergedResolvers)) {\n throw new Error(\n `[Directive] Resolver \"${id}\" does not exist. Use register() to create it.`,\n );\n }\n const original = (mergedResolvers as Record<string, unknown>)[id];\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic assignment\n resolversManager.assignDefinition(id, def as any);\n originals.resolvers.set(id, original);\n (mergedResolvers as Record<string, unknown>)[id] = def;\n pluginManager.emitDefinitionAssign(type, id, def, original);\n scheduleReconcile();\n break;\n }\n case \"derivation\": {\n if (RESERVED_DERIVE_NAMES.has(id)) {\n throw new Error(\n `[Directive] Derivation ID \"${id}\" conflicts with a reserved derive method name.`,\n );\n }\n if (!(id in mergedDerive)) {\n throw new Error(\n `[Directive] Derivation \"${id}\" does not exist. Use register() to create it.`,\n );\n }\n const original = (mergedDerive as Record<string, unknown>)[id];\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic assignment\n derivationsManager.assignDefinition(id, def as any);\n originals.derivations.set(id, original);\n (mergedDerive as Record<string, unknown>)[id] = def;\n pluginManager.emitDefinitionAssign(type, id, def, original);\n break;\n }\n case \"effect\": {\n if (!(id in mergedEffects)) {\n throw new Error(\n `[Directive] Effect \"${id}\" does not exist. Use register() to create it.`,\n );\n }\n const original = (mergedEffects as Record<string, unknown>)[id];\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic assignment\n effectsManager.assignDefinition(id, def as any);\n originals.effects.set(id, original);\n (mergedEffects as Record<string, unknown>)[id] = def;\n pluginManager.emitDefinitionAssign(type, id, def, original);\n break;\n }\n }\n }\n\n /** Apply an unregister operation immediately */\n function applyUnregister(type: DefType, id: string): void {\n switch (type) {\n case \"constraint\": {\n if (!dynamicIds.constraints.has(id)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\n `[Directive] Cannot unregister static constraint \"${id}\". Only dynamically registered constraints can be removed.`,\n );\n }\n\n return;\n }\n constraintsManager.unregisterDefinition(id);\n delete (mergedConstraints as Record<string, unknown>)[id];\n dynamicIds.constraints.delete(id);\n originals.constraints.delete(id);\n pluginManager.emitDefinitionUnregister(type, id);\n scheduleReconcile();\n break;\n }\n case \"resolver\": {\n if (!dynamicIds.resolvers.has(id)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\n `[Directive] Cannot unregister static resolver \"${id}\". Only dynamically registered resolvers can be removed.`,\n );\n }\n\n return;\n }\n resolversManager.unregisterDefinition(id);\n delete (mergedResolvers as Record<string, unknown>)[id];\n dynamicIds.resolvers.delete(id);\n originals.resolvers.delete(id);\n pluginManager.emitDefinitionUnregister(type, id);\n break;\n }\n case \"derivation\": {\n if (!dynamicIds.derivations.has(id)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\n `[Directive] Cannot unregister static derivation \"${id}\". Only dynamically registered derivations can be removed.`,\n );\n }\n\n return;\n }\n derivationsManager.unregisterDefinition(id);\n delete (mergedDerive as Record<string, unknown>)[id];\n dynamicIds.derivations.delete(id);\n originals.derivations.delete(id);\n pluginManager.emitDefinitionUnregister(type, id);\n break;\n }\n case \"effect\": {\n if (!dynamicIds.effects.has(id)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\n `[Directive] Cannot unregister static effect \"${id}\". Only dynamically registered effects can be removed.`,\n );\n }\n\n return;\n }\n effectsManager.unregisterDefinition(id);\n delete (mergedEffects as Record<string, unknown>)[id];\n dynamicIds.effects.delete(id);\n originals.effects.delete(id);\n pluginManager.emitDefinitionUnregister(type, id);\n break;\n }\n }\n }\n\n /** Flush deferred registrations after reconcile settles */\n function flushDeferredRegistrations(): void {\n if (deferredRegistrations.length === 0) {\n return;\n }\n\n const ops = deferredRegistrations.splice(0);\n for (const op of ops) {\n try {\n switch (op.op) {\n case \"register\":\n applyRegister(op.type, op.id, op.def);\n break;\n case \"assign\":\n applyAssign(op.type, op.id, op.def);\n break;\n case \"unregister\":\n applyUnregister(op.type, op.id);\n break;\n }\n } catch (error) {\n if (process.env.NODE_ENV !== \"production\") {\n console.error(\n `[Directive] Error in deferred ${op.op} for ${op.type} \"${op.id}\":`,\n error,\n );\n }\n }\n }\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 trace entry (M4)\n if (traceEnabled) {\n pendingFactChanges.length = 0;\n }\n reconcileDepth = 0;\n return;\n }\n\n state.isReconciling = true;\n notifySettlementChange();\n\n const reconcileStartMs = traceEnabled ? performance.now() : 0;\n\n // Start a new trace entry\n if (traceEnabled) {\n const traceId = ++traceIdCounter;\n traceStartMs.set(traceId, reconcileStartMs);\n currentTrace = {\n id: traceId,\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 historyManager.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 trace\n if (currentTrace) {\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 currentTrace.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 trace\n if (currentTrace) {\n for (const req of added) {\n currentTrace.requirementsAdded.push({\n id: req.id,\n type: req.requirement.type,\n fromConstraint: req.fromConstraint,\n });\n }\n for (const req of removed) {\n currentTrace.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 trace\n if (currentTrace) {\n const inflightNow = resolversManager.getInflightInfo();\n // Build Map for O(1) lookups instead of O(n) find per requirement\n const inflightById = new Map(inflightNow.map((i) => [i.id, i]));\n for (const req of added) {\n const info = inflightById.get(req.id);\n currentTrace.resolversStarted.push({\n resolver: info?.resolverId ?? \"unknown\",\n requirementId: req.id,\n });\n // Track attribution for async completion\n resolverTraceMap.set(req.id, currentTrace.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 trace entry\n if (currentTrace) {\n currentTrace.duration = performance.now() - reconcileStartMs;\n\n // Skip empty runs\n const hasActivity =\n currentTrace.factChanges.length > 0 ||\n currentTrace.constraintsHit.length > 0 ||\n currentTrace.requirementsAdded.length > 0 ||\n currentTrace.effectsRun.length > 0;\n\n if (hasActivity) {\n const inflightCount = currentTrace.resolversStarted.length;\n if (inflightCount === 0) {\n // No resolvers — finalize immediately\n currentTrace.status = \"settled\";\n // Build causal chain for settled runs\n currentTrace.causalChain = buildCausalChain(currentTrace);\n // Anomaly detection\n updateTraceStats(currentTrace);\n traceEntries.push(currentTrace);\n traceById.set(currentTrace.id, currentTrace);\n if (traceEntries.length > maxRuns) {\n evictOldestTrace();\n }\n currentCacheVersion++;\n pluginManager.emitTraceComplete(currentTrace);\n } else {\n // Has resolvers — stays pending until they settle\n currentTrace.status = \"pending\";\n traceEntries.push(currentTrace);\n traceById.set(currentTrace.id, currentTrace);\n if (traceEntries.length > maxRuns) {\n evictOldestTrace();\n }\n currentCacheVersion++;\n traceInflightCount.set(currentTrace.id, inflightCount);\n }\n } else {\n // Empty trace entry — clean up start time\n traceStartMs.delete(currentTrace.id);\n }\n currentTrace = null;\n }\n\n state.isReconciling = false;\n\n // Flush any deferred dynamic definition operations that were queued\n // during this reconciliation cycle\n flushDeferredRegistrations();\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 // Method properties for derive accessor (dynamic definitions API)\n const deriveMethods: Record<string, unknown> = {\n register: (id: string, fn: unknown) => registerDefinition(\"derivation\", id, fn),\n assign: (id: string, fn: unknown) => assignDefinition(\"derivation\", id, fn),\n unregister: (id: string) => unregisterDefinition(\"derivation\", id),\n call: (id: string) => callDefinition(\"derivation\", id),\n isDynamic: (id: string) => dynamicIds.derivations.has(id),\n listDynamic: () => [...dynamicIds.derivations],\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\") {\n return undefined;\n }\n // Prototype pollution protection\n if (BLOCKED_PROPS.has(prop)) {\n return undefined;\n }\n // Check for method properties first (register, assign, etc.)\n if (prop in deriveMethods) {\n return deriveMethods[prop];\n }\n // Return undefined for unknown derivation keys instead of throwing.\n // React 19 dev-mode traverses objects accessing $$typeof, toJSON, then, etc.\n if (!(prop in mergedDerive)) {\n return undefined;\n }\n return derivationsManager.get(prop as keyof DerivationsDef<S>);\n },\n has(_, prop: string | symbol) {\n if (typeof prop === \"symbol\") {\n return false;\n }\n // Prototype pollution protection\n if (BLOCKED_PROPS.has(prop)) {\n return false;\n }\n return prop in mergedDerive || prop in deriveMethods;\n },\n ownKeys() {\n return Object.keys(mergedDerive);\n },\n getOwnPropertyDescriptor(_, prop: string | symbol) {\n if (typeof prop === \"symbol\") {\n return undefined;\n }\n // Prototype pollution protection\n if (BLOCKED_PROPS.has(prop)) {\n return undefined;\n }\n if (prop in mergedDerive || prop in deriveMethods) {\n return { configurable: true, enumerable: true };\n }\n return undefined;\n },\n set() {\n return false;\n },\n defineProperty() {\n return false;\n },\n getPrototypeOf() {\n return null;\n },\n setPrototypeOf() {\n return false;\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\") {\n return undefined;\n }\n // Prototype pollution protection\n if (BLOCKED_PROPS.has(prop)) {\n return undefined;\n }\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\") {\n return false;\n }\n // Prototype pollution protection\n if (BLOCKED_PROPS.has(prop)) {\n return false;\n }\n return prop in mergedEvents;\n },\n ownKeys() {\n return Object.keys(mergedEvents);\n },\n getOwnPropertyDescriptor(_, prop: string | symbol) {\n if (typeof prop === \"symbol\") {\n return undefined;\n }\n // Prototype pollution protection\n if (BLOCKED_PROPS.has(prop)) {\n return undefined;\n }\n if (prop in mergedEvents) {\n return { configurable: true, enumerable: true };\n }\n return undefined;\n },\n set() {\n return false;\n },\n defineProperty() {\n return false;\n },\n getPrototypeOf() {\n return null;\n },\n setPrototypeOf() {\n return false;\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 history: historyManager.isEnabled ? historyManager : null,\n // biome-ignore lint/suspicious/noExplicitAny: Proxy provides both derivation values and control methods at runtime\n derive: deriveAccessor as any,\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 // biome-ignore lint/suspicious/noExplicitAny: Runtime accepts any constraint def shape\n register: (id: string, def: any) => registerDefinition(\"constraint\", id, def),\n // biome-ignore lint/suspicious/noExplicitAny: Runtime accepts any constraint def shape\n assign: (id: string, def: any) => assignDefinition(\"constraint\", id, def),\n unregister: (id: string) => unregisterDefinition(\"constraint\", id),\n call: (id: string, props?: Record<string, unknown>) => callDefinition(\"constraint\", id, props) as Promise<Record<string, unknown>[]>,\n isDynamic: (id: string) => dynamicIds.constraints.has(id),\n listDynamic: () => [...dynamicIds.constraints],\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 // biome-ignore lint/suspicious/noExplicitAny: Runtime accepts any effect def shape\n register: (id: string, def: any) => registerDefinition(\"effect\", id, def),\n // biome-ignore lint/suspicious/noExplicitAny: Runtime accepts any effect def shape\n assign: (id: string, def: any) => assignDefinition(\"effect\", id, def),\n unregister: (id: string) => unregisterDefinition(\"effect\", id),\n call: (id: string) => callDefinition(\"effect\", id) as Promise<void>,\n isDynamic: (id: string) => dynamicIds.effects.has(id),\n listDynamic: () => [...dynamicIds.effects],\n },\n resolvers: {\n // biome-ignore lint/suspicious/noExplicitAny: Runtime accepts any resolver def shape\n register: (id: string, def: any) => registerDefinition(\"resolver\", id, def),\n // biome-ignore lint/suspicious/noExplicitAny: Runtime accepts any resolver def shape\n assign: (id: string, def: any) => assignDefinition(\"resolver\", id, def),\n unregister: (id: string) => unregisterDefinition(\"resolver\", id),\n call: (id: string, requirement: { type: string; [key: string]: unknown }) => callDefinition(\"resolver\", id, requirement) as Promise<void>,\n isDynamic: (id: string) => dynamicIds.resolvers.has(id),\n listDynamic: () => [...dynamicIds.resolvers],\n },\n\n get trace(): TraceEntry[] | null {\n if (!traceEnabled) {\n return null;\n }\n\n if (!traceCache || traceCacheVersion !== currentCacheVersion) {\n traceCache = [...traceEntries];\n traceCacheVersion = currentCacheVersion;\n }\n\n return traceCache;\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 if (state.isDestroyed) return;\n this.stop();\n state.isDestroyed = true;\n // Clean up store listeners\n (store as unknown as Record<string, () => void>).destroy?.();\n // Clean up resolvers (statuses, caches)\n resolversManager.destroy();\n // Clean up error boundary\n errorBoundary.clearErrors();\n settlementListeners.clear();\n historyListeners.clear();\n // Clean up deferred registrations (prevent closure retention)\n deferredRegistrations.length = 0;\n // Clean up trace state (C1)\n traceEntries.length = 0;\n traceById.clear();\n resolverTraceMap.clear();\n traceInflightCount.clear();\n traceStartMs.clear();\n pendingFactChanges.length = 0;\n currentTrace = null;\n traceCache = null;\n // Clean up dynamic definition state\n dynamicIds.constraints.clear();\n dynamicIds.resolvers.clear();\n dynamicIds.derivations.clear();\n dynamicIds.effects.clear();\n originals.constraints.clear();\n originals.resolvers.clear();\n originals.derivations.clear();\n originals.effects.clear();\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 traceEnabled,\n ...(traceEnabled\n ? {\n trace: traceEntries.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 getOriginal(type: \"constraint\" | \"resolver\" | \"derivation\" | \"effect\", id: string): unknown | undefined {\n const typeMap: Record<string, Map<string, unknown>> = {\n constraint: originals.constraints,\n resolver: originals.resolvers,\n derivation: originals.derivations,\n effect: originals.effects,\n };\n const map = typeMap[type];\n\n if (!map) {\n return undefined;\n }\n\n return map.get(id);\n },\n\n restoreOriginal(type: \"constraint\" | \"resolver\" | \"derivation\" | \"effect\", id: string): boolean {\n const typeMap: Record<string, Map<string, unknown>> = {\n constraint: originals.constraints,\n resolver: originals.resolvers,\n derivation: originals.derivations,\n effect: originals.effects,\n };\n const map = typeMap[type];\n\n if (!map || !map.has(id)) {\n return false;\n }\n\n const original = map.get(id);\n assignDefinition(type, id, original);\n map.delete(id);\n\n return true;\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 onHistoryChange(listener: () => void): () => void {\n historyListeners.add(listener);\n return () => {\n historyListeners.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, derived: 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 history?: { 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 if (section === \"schema\" && key.startsWith(\"$\")) {\n throw new Error(\n `[Directive] Module \"${module.id}\" has schema key \"${key}\" starting with \"$\". ` +\n \"Keys starting with $ are reserved for internal accessors ($store, $snapshot).\",\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.history?.snapshotEvents) {\n if (snapshotEventNames === null) {\n // First module with history.snapshotEvents — initialize the set with all existing event names\n snapshotEventNames = new Set<string>(Object.keys(mergedEvents));\n }\n for (const eventName of module.history.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 { BLOCKED_PROPS } from \"./tracking.js\";\nimport type {\n CreateSystemOptionsNamed,\n CreateSystemOptionsSingle,\n ModuleDef,\n ModuleSchema,\n ModulesMap,\n NamespacedSystem,\n SingleModuleSystem,\n} from \"./types.js\";\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 * @remarks\n * The system is the top-level runtime object. It owns the reconciliation loop,\n * manages plugins, and exposes reactive accessors for facts, derivations, and events.\n * Call `system.start()` to begin the lifecycle (init → ready → running → settled).\n *\n * @param options - System configuration with either `module` (single) or `modules` (namespaced)\n * @returns A fully-typed {@link System} instance with reactive accessors\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 *\n * @public\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>;\n/** @internal Implementation overload — see public overloads above. */\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 // Detect single ModuleDef accidentally passed to `modules:` instead of `module:`\n const mods = namedOptions.modules as Record<string, unknown>;\n if (mods && typeof mods === \"object\" && \"id\" in mods && \"schema\" in mods) {\n throw new Error(\n \"[Directive] A single module was passed to `modules:`. \" +\n \"For a single module, use `module:` instead:\\n\\n\" +\n \" createSystem({ module: myModule })\\n\\n\" +\n \"For multiple modules, wrap in an object:\\n\" +\n \" createSystem({ modules: { myName: myModule } })\",\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 historyConfig =\n typeof options.history === \"object\" ? options.history : null;\n const snapshotModulesSet = historyConfig?.snapshotModules\n ? new Set(historyConfig.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\" && historyConfig?.snapshotModules) {\n for (const name of historyConfig.snapshotModules) {\n if (!moduleNamespaces.has(name)) {\n console.warn(\n `[Directive] history.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 history = options.history;\n let trace = options.trace;\n let errorBoundary = options.errorBoundary;\n\n if (options.zeroConfig) {\n const isDev = process.env.NODE_ENV !== \"production\";\n\n history = history ?? isDev;\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 history: {\n snapshotEvents:\n snapshotModulesSet && !snapshotModulesSet.has(namespace)\n ? [] // Module excluded from snapshots\n : mod.history?.snapshotEvents?.map(\n (e: string) => `${namespace}${SEPARATOR}${e}`,\n ),\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 history: mod.history,\n })) as any,\n plugins: options.plugins,\n history,\n trace,\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 history: engine.history,\n derive: namespacedDeriveProxy,\n events: namespacedEventsProxy,\n constraints: engine.constraints,\n effects: engine.effects,\n resolvers: engine.resolvers,\n\n get trace() {\n return engine.trace;\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 onHistoryChange: engine.onHistoryChange.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 history: {\n snapshotEvents:\n snapshotModulesSet && !snapshotModulesSet.has(namespace)\n ? [] // Module excluded from snapshots\n : mod.history?.snapshotEvents?.map(\n (e: string) => `${namespace}${SEPARATOR}${e}`,\n ),\n },\n });\n },\n\n // biome-ignore lint/suspicious/noExplicitAny: Type narrowing for NamespacedSystem\n } as any;\n\n // Dev-mode warning if system.start() is never called\n if (process.env.NODE_ENV !== \"production\" && process.env.NODE_ENV !== \"test\") {\n setTimeout(() => {\n if (!system.isRunning && !system.isInitialized) {\n console.warn(\n \"[Directive] System created but start() was never called. \" +\n \"Constraints, resolvers, and effects will not run until you call system.start().\",\n );\n }\n }, 0);\n }\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) {\n return cached;\n }\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\") {\n return undefined;\n }\n if (BLOCKED_PROPS.has(prop)) {\n return undefined;\n }\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\") {\n return false;\n }\n if (BLOCKED_PROPS.has(prop)) {\n return false;\n }\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\") {\n return false;\n }\n if (BLOCKED_PROPS.has(prop)) {\n return false;\n }\n return `${namespace}${SEPARATOR}${prop}` in facts;\n },\n deleteProperty(_, prop: string | symbol) {\n if (typeof prop === \"symbol\") {\n return false;\n }\n if (BLOCKED_PROPS.has(prop)) {\n return false;\n }\n delete (facts as Record<string, unknown>)[\n `${namespace}${SEPARATOR}${prop}`\n ];\n return true;\n },\n defineProperty() {\n return false;\n },\n getPrototypeOf() {\n return null;\n },\n setPrototypeOf() {\n return false;\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) {\n return cached;\n }\n\n const proxy = new Proxy({} as Record<string, Record<string, unknown>>, {\n get(_, namespace: string | symbol) {\n if (typeof namespace === \"symbol\") {\n return undefined;\n }\n if (BLOCKED_PROPS.has(namespace)) {\n return undefined;\n }\n if (!Object.hasOwn(modulesMap, namespace)) {\n return undefined;\n }\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\") {\n return false;\n }\n if (BLOCKED_PROPS.has(namespace)) {\n return false;\n }\n return Object.hasOwn(modulesMap, namespace);\n },\n ownKeys() {\n return getModuleNames();\n },\n getOwnPropertyDescriptor(_, namespace: string | symbol) {\n if (typeof namespace === \"symbol\") {\n return undefined;\n }\n if (Object.hasOwn(modulesMap, namespace)) {\n return { configurable: true, enumerable: true };\n }\n return undefined;\n },\n defineProperty() {\n return false;\n },\n getPrototypeOf() {\n return null;\n },\n setPrototypeOf() {\n return false;\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) {\n return cached;\n }\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\") {\n return undefined;\n }\n if (BLOCKED_PROPS.has(key)) {\n return undefined;\n }\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\") {\n return false;\n }\n if (BLOCKED_PROPS.has(key)) {\n return false;\n }\n return key === \"self\" || depNamesSet.has(key);\n },\n ownKeys() {\n return allKeys;\n },\n getOwnPropertyDescriptor(_, key: string | symbol) {\n if (typeof key === \"symbol\") {\n return undefined;\n }\n if (key === \"self\" || depNamesSet.has(key)) {\n return { configurable: true, enumerable: true };\n }\n return undefined;\n },\n defineProperty() {\n return false;\n },\n getPrototypeOf() {\n return null;\n },\n setPrototypeOf() {\n return false;\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) {\n return cached;\n }\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\") {\n return undefined;\n }\n if (BLOCKED_PROPS.has(prop)) {\n return undefined;\n }\n return derive[`${namespace}${SEPARATOR}${prop}`];\n },\n has(_, prop: string | symbol) {\n if (typeof prop === \"symbol\") {\n return false;\n }\n if (BLOCKED_PROPS.has(prop)) {\n return false;\n }\n return `${namespace}${SEPARATOR}${prop}` in derive;\n },\n set() {\n return false;\n },\n defineProperty() {\n return false;\n },\n getPrototypeOf() {\n return null;\n },\n setPrototypeOf() {\n return false;\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) {\n return cached;\n }\n\n const proxy = new Proxy({} as Record<string, Record<string, unknown>>, {\n get(_, namespace: string | symbol) {\n if (typeof namespace === \"symbol\") {\n return undefined;\n }\n if (BLOCKED_PROPS.has(namespace)) {\n return undefined;\n }\n if (!Object.hasOwn(modulesMap, namespace)) {\n return undefined;\n }\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\") {\n return false;\n }\n if (BLOCKED_PROPS.has(namespace)) {\n return false;\n }\n return Object.hasOwn(modulesMap, namespace);\n },\n ownKeys() {\n return getModuleNames();\n },\n getOwnPropertyDescriptor(_, namespace: string | symbol) {\n if (typeof namespace === \"symbol\") {\n return undefined;\n }\n if (Object.hasOwn(modulesMap, namespace)) {\n return { configurable: true, enumerable: true };\n }\n return undefined;\n },\n set() {\n return false;\n },\n defineProperty() {\n return false;\n },\n getPrototypeOf() {\n return null;\n },\n setPrototypeOf() {\n return false;\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\") {\n return undefined;\n }\n if (BLOCKED_PROPS.has(namespace)) {\n return undefined;\n }\n if (!Object.hasOwn(modulesMap, namespace)) {\n return undefined;\n }\n\n // Check cache for this namespace's event proxy\n const cached = namespaceCache!.get(namespace);\n if (cached) {\n return cached;\n }\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\") {\n return undefined;\n }\n if (BLOCKED_PROPS.has(eventName)) {\n return undefined;\n }\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 set() {\n return false;\n },\n defineProperty() {\n return false;\n },\n getPrototypeOf() {\n return null;\n },\n setPrototypeOf() {\n return false;\n },\n },\n );\n\n namespaceCache!.set(namespace, moduleEventsProxy);\n return moduleEventsProxy;\n },\n has(_, namespace: string | symbol) {\n if (typeof namespace === \"symbol\") {\n return false;\n }\n if (BLOCKED_PROPS.has(namespace)) {\n return false;\n }\n return Object.hasOwn(modulesMap, namespace);\n },\n ownKeys() {\n return getModuleNames();\n },\n getOwnPropertyDescriptor(_, namespace: string | symbol) {\n if (typeof namespace === \"symbol\") {\n return undefined;\n }\n if (Object.hasOwn(modulesMap, namespace)) {\n return { configurable: true, enumerable: true };\n }\n return undefined;\n },\n set() {\n return false;\n },\n defineProperty() {\n return false;\n },\n getPrototypeOf() {\n return null;\n },\n setPrototypeOf() {\n return false;\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 const singleHistoryConfig =\n typeof options.history === \"object\" ? options.history : null;\n if (singleHistoryConfig?.snapshotModules) {\n console.warn(\n \"[Directive] history.snapshotModules has no effect in single-module mode. \" +\n \"Use history.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 history = options.history;\n let trace = options.trace;\n let errorBoundary = options.errorBoundary;\n\n if (options.zeroConfig) {\n const isDev = process.env.NODE_ENV !== \"production\";\n\n history = history ?? isDev;\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 history: mod.history,\n },\n // biome-ignore lint/suspicious/noExplicitAny: Module format\n ] as any,\n plugins: options.plugins,\n history,\n trace,\n errorBoundary,\n tickMs: options.tickMs,\n onAfterModuleInit: () => {\n // Apply initialFacts\n if (options.initialFacts) {\n if (!isPrototypeSafe(options.initialFacts)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\n \"[Directive] initialFacts contains potentially dangerous keys. Skipping.\",\n );\n }\n } else {\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 }\n // Apply hydrated facts (takes precedence)\n if (hydratedFacts) {\n if (!isPrototypeSafe(hydratedFacts)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\n \"[Directive] hydrate() data contains potentially dangerous keys. Skipping.\",\n );\n }\n } else {\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 }\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\") {\n return undefined;\n }\n if (BLOCKED_PROPS.has(eventName)) {\n return undefined;\n }\n\n return (payload?: Record<string, unknown>) => {\n engine.dispatch({ type: eventName, ...payload });\n };\n },\n set() {\n return false;\n },\n defineProperty() {\n return false;\n },\n getPrototypeOf() {\n return null;\n },\n setPrototypeOf() {\n return false;\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 history: engine.history,\n derive: engine.derive,\n events: eventsProxy as SingleModuleSystem<S>[\"events\"],\n constraints: engine.constraints,\n effects: engine.effects,\n resolvers: engine.resolvers,\n\n get trace() {\n return engine.trace;\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 onHistoryChange: engine.onHistoryChange.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 history: moduleDef.history,\n });\n },\n // biome-ignore lint/suspicious/noExplicitAny: Type narrowing\n } as any;\n\n // Dev-mode warning if system.start() is never called\n if (process.env.NODE_ENV !== \"production\" && process.env.NODE_ENV !== \"test\") {\n setTimeout(() => {\n if (!system.isRunning && !system.isInitialized) {\n console.warn(\n \"[Directive] System created but start() was never called. \" +\n \"Constraints, resolvers, and effects will not run until you call system.start().\",\n );\n }\n }, 0);\n }\n\n return system;\n}\n","/**\n * Requirement Status Utilities\n *\n * Provides reactive tracking of requirement status for UI feedback.\n */\n\nimport type { Plugin, RequirementWithId } from \"../core/types.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Status of a requirement type */\nexport interface RequirementTypeStatus {\n /** Number of pending (unmet) requirements of this type */\n pending: number;\n /** Number of inflight (being resolved) requirements of this type */\n inflight: number;\n /** Number of failed requirements of this type */\n failed: number;\n /** Whether any requirements of this type are loading (pending or inflight) */\n isLoading: boolean;\n /** Whether any requirements of this type have failed */\n hasError: boolean;\n /** Last error for this type (if any) */\n lastError: Error | null;\n}\n\n/** Status tracking state */\ninterface StatusState {\n pending: Map<string, Set<string>>; // type -> set of requirement IDs\n inflight: Map<string, Set<string>>; // type -> set of requirement IDs\n failed: Map<string, Set<string>>; // type -> set of requirement IDs\n errors: Map<string, Error>; // type -> last error\n listeners: Set<() => void>;\n}\n\n// ============================================================================\n// Requirement Status Plugin\n// ============================================================================\n\n/**\n * Create a plugin that tracks requirement status for reactive UI updates.\n *\n * @example\n * ```typescript\n * import { createRequirementStatusPlugin } from '@directive-run/core';\n *\n * const statusPlugin = createRequirementStatusPlugin();\n *\n * const system = createSystem({\n * modules: [myModule],\n * plugins: [statusPlugin.plugin],\n * });\n *\n * // Get status for a requirement type\n * const status = statusPlugin.getStatus(\"FETCH_USER\");\n * console.log(status.isLoading, status.hasError);\n *\n * // Subscribe to status changes\n * const unsubscribe = statusPlugin.subscribe(() => {\n * console.log(\"Status changed:\", statusPlugin.getStatus(\"FETCH_USER\"));\n * });\n * ```\n */\nexport function createRequirementStatusPlugin(): {\n plugin: Plugin<never>;\n getStatus: (type: string) => RequirementTypeStatus;\n getAllStatus: () => Map<string, RequirementTypeStatus>;\n subscribe: (listener: () => void) => () => void;\n reset: () => void;\n} {\n const state: StatusState = {\n pending: new Map(),\n inflight: new Map(),\n failed: new Map(),\n errors: new Map(),\n listeners: new Set(),\n };\n\n /** Notify all listeners */\n function notify(): void {\n for (const listener of state.listeners) {\n listener();\n }\n }\n\n /** Get or create a set for a type in a map */\n function getOrCreateSet(\n map: Map<string, Set<string>>,\n type: string,\n ): Set<string> {\n let set = map.get(type);\n if (!set) {\n set = new Set();\n map.set(type, set);\n }\n return set;\n }\n\n /** Get status for a requirement type */\n function getStatus(type: string): RequirementTypeStatus {\n const pendingSet = state.pending.get(type) ?? new Set();\n const inflightSet = state.inflight.get(type) ?? new Set();\n const failedSet = state.failed.get(type) ?? new Set();\n const lastError = state.errors.get(type) ?? null;\n\n return {\n pending: pendingSet.size,\n inflight: inflightSet.size,\n failed: failedSet.size,\n isLoading: pendingSet.size > 0 || inflightSet.size > 0,\n hasError: failedSet.size > 0,\n lastError,\n };\n }\n\n /** Get status for all tracked types */\n function getAllStatus(): Map<string, RequirementTypeStatus> {\n const allTypes = new Set([\n ...state.pending.keys(),\n ...state.inflight.keys(),\n ...state.failed.keys(),\n ]);\n\n const result = new Map<string, RequirementTypeStatus>();\n for (const type of allTypes) {\n result.set(type, getStatus(type));\n }\n return result;\n }\n\n /** Subscribe to status changes */\n function subscribe(listener: () => void): () => void {\n state.listeners.add(listener);\n return () => state.listeners.delete(listener);\n }\n\n /** Reset all status */\n function reset(): void {\n state.pending.clear();\n state.inflight.clear();\n state.failed.clear();\n state.errors.clear();\n notify();\n }\n\n const plugin: Plugin<never> = {\n name: \"requirement-status\",\n\n onRequirementCreated(req: RequirementWithId) {\n const type = req.requirement.type;\n getOrCreateSet(state.pending, type).add(req.id);\n // Clear from failed when a new requirement is created\n state.failed.get(type)?.delete(req.id);\n notify();\n },\n\n onResolverStart(_resolver: string, req: RequirementWithId) {\n const type = req.requirement.type;\n // Move from pending to inflight\n state.pending.get(type)?.delete(req.id);\n getOrCreateSet(state.inflight, type).add(req.id);\n notify();\n },\n\n onResolverComplete(_resolver: string, req: RequirementWithId) {\n const type = req.requirement.type;\n // Remove from inflight\n state.inflight.get(type)?.delete(req.id);\n state.pending.get(type)?.delete(req.id);\n notify();\n },\n\n onResolverError(_resolver: string, req: RequirementWithId, error: unknown) {\n const type = req.requirement.type;\n // Move from inflight to failed\n state.inflight.get(type)?.delete(req.id);\n getOrCreateSet(state.failed, type).add(req.id);\n state.errors.set(\n type,\n error instanceof Error ? error : new Error(String(error)),\n );\n notify();\n },\n\n onResolverCancel(_resolver: string, req: RequirementWithId) {\n const type = req.requirement.type;\n // Remove from all tracking\n state.pending.get(type)?.delete(req.id);\n state.inflight.get(type)?.delete(req.id);\n notify();\n },\n\n onRequirementMet(req: RequirementWithId) {\n const type = req.requirement.type;\n // Clean up when requirement is met\n state.pending.get(type)?.delete(req.id);\n state.inflight.get(type)?.delete(req.id);\n notify();\n },\n };\n\n return {\n plugin,\n getStatus,\n getAllStatus,\n subscribe,\n reset,\n };\n}\n\n// ============================================================================\n// React Hook Helper (for use with React adapter)\n// ============================================================================\n\n/**\n * Create a hook factory for requirement status.\n * This is designed to be used with React's useSyncExternalStore.\n *\n * @example\n * ```typescript\n * import { useSyncExternalStore } from 'react';\n * import { createRequirementStatusPlugin, createStatusHook } from '@directive-run/core';\n *\n * const statusPlugin = createRequirementStatusPlugin();\n * const useRequirementStatus = createStatusHook(statusPlugin);\n *\n * function MyComponent() {\n * const status = useRequirementStatus(\"FETCH_USER\");\n * if (status.isLoading) return <Spinner />;\n * if (status.hasError) return <Error error={status.lastError} />;\n * return <Content />;\n * }\n * ```\n */\nexport function createStatusHook(\n statusPlugin: ReturnType<typeof createRequirementStatusPlugin>,\n): (type: string) => RequirementTypeStatus {\n // This returns a function that can be used with useSyncExternalStore\n // The actual hook implementation would be in the React adapter\n return (type: string) => statusPlugin.getStatus(type);\n}\n","/**\n * System with Status Plugin Helper\n *\n * Convenience function for creating a system with status tracking enabled.\n */\n\nimport { createSystem } from \"../core/system.js\";\nimport type {\n ErrorBoundaryConfig,\n ModuleDef,\n ModuleSchema,\n Plugin,\n SingleModuleSystem,\n TraceOption,\n} from \"../core/types.js\";\nimport { createRequirementStatusPlugin } from \"./requirement-status.js\";\n\n/** Options for createSystemWithStatus */\nexport interface CreateSystemWithStatusOptions<M extends ModuleSchema> {\n /** The module to use for the system */\n module: ModuleDef<M>;\n /** Additional plugins to include alongside the status plugin */\n // biome-ignore lint/suspicious/noExplicitAny: Plugin generic contravariance issues\n plugins?: Plugin<any>[];\n /** Trace: per-run reconciliation changelog */\n trace?: TraceOption;\n /** Error boundary configuration */\n errorBoundary?: ErrorBoundaryConfig;\n /** Tick interval in milliseconds */\n tickMs?: number;\n /** Enable zero-config mode */\n zeroConfig?: boolean;\n /** Initial facts to set on the system */\n // biome-ignore lint/suspicious/noExplicitAny: Facts type varies by module\n initialFacts?: Record<string, any>;\n}\n\n/** Return type for createSystemWithStatus */\nexport interface SystemWithStatus<M extends ModuleSchema> {\n /**\n * The Directive system instance.\n * This is a SingleModuleSystem - use system.facts, system.dispatch(), etc.\n */\n system: SingleModuleSystem<M>;\n /** The status plugin for use with useRequirementStatus hooks */\n statusPlugin: ReturnType<typeof createRequirementStatusPlugin>;\n}\n\n/**\n * Create a Directive system with a status plugin pre-configured.\n *\n * This is a convenience wrapper around `createSystem` and `createRequirementStatusPlugin`\n * that handles the wiring automatically. The status plugin is added to the system's\n * plugins array so it receives lifecycle events.\n *\n * @param options - System configuration options\n * @returns An object containing both the system and the statusPlugin\n *\n * @example\n * ```tsx\n * import { createSystemWithStatus } from '@directive-run/core';\n * import { useRequirementStatus, useFact } from '@directive-run/react';\n *\n * // Simple setup - no provider needed\n * const { system, statusPlugin } = createSystemWithStatus({\n * module: myModule,\n * });\n * system.start();\n *\n * function App() {\n * const data = useFact(system, \"data\");\n * return <LoadingIndicator />;\n * }\n *\n * function LoadingIndicator() {\n * const status = useRequirementStatus(statusPlugin, \"FETCH_DATA\");\n * if (status.isLoading) return <Spinner />;\n * if (status.hasError) return <Error message={status.lastError?.message} />;\n * return <Content />;\n * }\n * ```\n */\nexport function createSystemWithStatus<M extends ModuleSchema>(\n options: CreateSystemWithStatusOptions<M>,\n): SystemWithStatus<M> {\n // Create the status plugin\n const statusPlugin = createRequirementStatusPlugin();\n\n // Add the plugin to the options\n const existingPlugins = options.plugins ?? [];\n\n // Create the system with the status plugin included\n // Use type assertion to bypass overload resolution issues\n // biome-ignore lint/suspicious/noExplicitAny: Required for overload compatibility\n const allPlugins = [...existingPlugins, statusPlugin.plugin] as Plugin<any>[];\n // biome-ignore lint/suspicious/noExplicitAny: Required for overload compatibility\n const system = createSystem({\n module: options.module,\n plugins: allPlugins,\n trace: options.trace,\n errorBoundary: options.errorBoundary,\n tickMs: options.tickMs,\n zeroConfig: options.zeroConfig,\n initialFacts: options.initialFacts,\n // biome-ignore lint/suspicious/noExplicitAny: Required for overload compatibility\n } as any);\n\n return {\n // The system returned by createSystem with a single module is a SingleModuleSystem\n system: system as SingleModuleSystem<M>,\n statusPlugin,\n };\n}\n","/**\n * @directive-run/core\n *\n * Constraint-driven runtime for TypeScript.\n *\n * Also available:\n * - `@directive-run/core/plugins` – Logging, devtools, persistence, observability, circuit breaker\n * - `@directive-run/core/testing` – Mock resolvers, fake timers, assertion helpers\n * - `@directive-run/core/migration` – Redux/Zustand/XState migration codemods\n * - `@directive-run/core/adapter-utils` – Shared framework adapter utilities\n * - `@directive-run/core/worker` – Web Worker support\n *\n * @packageDocumentation\n */\n\n// ============================================================================\n// Core Types\n// ============================================================================\n\nexport type {\n // Schema\n Schema,\n SchemaType,\n InferSchema,\n InferSchemaType,\n // Consolidated Module Schema\n ModuleSchema,\n DerivationsSchema,\n EventsSchema,\n EventPayloadSchema,\n InferFacts,\n InferDerivations,\n InferSelectorState,\n InferEventPayloadFromSchema,\n InferEvents,\n InferRequirementPayloadFromSchema,\n InferRequirements,\n InferRequirementTypes,\n // Facts\n Facts,\n FactsSnapshot,\n FactsStore,\n FactChange,\n // Derivations\n DerivationsDef,\n DerivationState,\n DerivedValues,\n TypedDerivationsDef,\n // Effects\n EffectsDef,\n EffectCleanup,\n // Requirements\n Requirement,\n RequirementWithId,\n RequirementKeyFn,\n RequirementPayloadSchema,\n RequirementsSchema,\n RequirementOutput,\n // Constraints\n ConstraintsDef,\n ConstraintState,\n TypedConstraintDef,\n TypedConstraintsDef,\n // Resolvers\n ResolversDef,\n ResolverContext,\n ResolverStatus,\n RetryPolicy,\n BatchConfig,\n BatchItemResult,\n BatchResolveResults,\n TypedResolverContext,\n TypedResolverDef,\n TypedResolversDef,\n // Plugins\n Plugin,\n ReconcileResult,\n Snapshot,\n RecoveryStrategy,\n // Errors\n ErrorSource,\n ErrorBoundaryConfig,\n RetryLaterConfig,\n // Module\n ModuleDef,\n ModuleHooks,\n TypedEventsDef,\n // Events\n EventsDef,\n SystemEvent,\n EventsAccessorFromSchema,\n DispatchEventsFromSchema,\n FlexibleEventHandler,\n // System\n System,\n SystemConfig,\n // Runtime Controls\n ConstraintsControl,\n DerivationsControl,\n EffectsControl,\n ResolversControl,\n // Dynamic Definition Types\n DynamicConstraintDef,\n DynamicEffectDef,\n DynamicResolverDef,\n SystemInspection,\n SystemSnapshot,\n TraceEntry,\n TraceConfig,\n TraceOption,\n DistributableSnapshotOptions,\n DistributableSnapshot,\n HistoryConfig,\n HistoryOption,\n HistoryAPI,\n HistoryState,\n SnapshotMeta,\n RequirementExplanation,\n // Accessors\n DeriveAccessor,\n EventsAccessor,\n FactKeys,\n FactReturnType,\n DerivationKeys,\n DerivationReturnType,\n ObservableKeys,\n // Typed Helper Utilities\n TypedConstraint,\n TypedResolver,\n // Composition (Namespaced Multi-Module)\n ModulesMap,\n NamespacedFacts,\n MutableNamespacedFacts,\n NamespacedDerivations,\n UnionEvents,\n NamespacedSystem,\n NamespacedEventsAccessor,\n CreateSystemOptionsNamed,\n // Single Module (no namespace)\n CreateSystemOptionsSingle,\n SingleModuleSystem,\n // Type Guards\n SystemMode,\n AnySystem,\n // Cross-Module Dependencies (for modules)\n CrossModuleDeps,\n CrossModuleFactsWithSelf,\n CrossModuleDerivationFn,\n CrossModuleDerivationsDef,\n CrossModuleConstraintDef,\n CrossModuleConstraintsDef,\n CrossModuleEffectDef,\n CrossModuleEffectsDef,\n} from \"./core/types.js\";\n\n// ============================================================================\n// Core Classes\n// ============================================================================\n\nexport { DirectiveError } from \"./core/types.js\";\n\n// ============================================================================\n// Schema Type Builders\n// ============================================================================\n\n/**\n * Schema type builders for defining fact types.\n *\n * Provides type-safe schema definitions with optional runtime validation:\n *\n * **Basic Types:**\n * - `t.string<T>()` - String type (with optional literal union)\n * - `t.number()` - Number type with `.min()` and `.max()` validation\n * - `t.boolean()` - Boolean type\n * - `t.bigint()` - BigInt type for large integers\n *\n * **Complex Types:**\n * - `t.array<T>()` - Array type with `.of()`, `.nonEmpty()`, `.minLength()`, `.maxLength()`\n * - `t.object<T>()` - Object type with `.shape()`, `.nonNull()`, `.hasKeys()`\n * - `t.record<V>(valueType)` - Record/map type `Record<string, V>`\n * - `t.tuple(types...)` - Fixed-length tuple type\n * - `t.union(types...)` - Union of multiple types\n *\n * **Literal & Enum Types:**\n * - `t.enum(...values)` - String enum from literal values\n * - `t.literal(value)` - Exact value matching (string, number, or boolean)\n *\n * **Wrappers:**\n * - `t.nullable(type)` - Nullable wrapper (`T | null`)\n * - `t.optional(type)` - Optional wrapper (`T | undefined`)\n *\n * **Validation Types:**\n * - `t.date()` - Date type\n * - `t.uuid()` - UUID string format\n * - `t.email()` - Email string format\n * - `t.url()` - URL string format\n *\n * **Chainable Methods (available on most types):**\n * - `.default(value)` - Set default value\n * - `.transform(fn)` - Transform values\n * - `.brand<B>()` - Add branded/nominal type\n * - `.describe(text)` - Add schema documentation\n * - `.refine(predicate, message)` - Custom validation with error message\n * - `.nullable()` - Make nullable (chainable alternative to `t.nullable()`)\n * - `.optional()` - Make optional (chainable alternative to `t.optional()`)\n * - `.validate(fn)` - Add custom validator\n *\n * @example\n * ```ts\n * import { t } from '@directive-run/core';\n *\n * const schema = {\n * facts: {\n * count: t.number().min(0).default(0),\n * name: t.string().describe(\"User's display name\"),\n * status: t.enum(\"idle\", \"loading\", \"success\", \"error\"),\n * user: t.object<User>().nullable(),\n * config: t.object<Config>().optional(),\n * userId: t.string().brand<\"UserId\">(),\n * age: t.number().refine(n => n >= 0, \"Age must be non-negative\"),\n * },\n * derivations: {\n * doubled: t.number(),\n * },\n * events: {\n * increment: {},\n * setStatus: { status: t.enum(\"idle\", \"loading\", \"success\", \"error\") },\n * },\n * requirements: {},\n * };\n * ```\n */\nexport {\n t,\n type Branded,\n type ExtendedSchemaType,\n type ChainableSchemaType,\n} from \"./core/schema-builders.js\";\n\n// ============================================================================\n// Module & System\n// ============================================================================\n\nexport {\n createModule,\n createModuleFactory,\n type ModuleConfig,\n type ModuleConfigWithDeps,\n} from \"./core/module.js\";\nexport { createSystem } from \"./core/system.js\";\n// Convenience helper for status plugin setup\nexport { createSystemWithStatus } from \"./utils/system-with-status.js\";\n\n// Helper factory functions for external constraint/resolver definitions\nexport {\n createConstraintFactory,\n createResolverFactory,\n typedConstraint,\n typedResolver,\n} from \"./core/types.js\";\n\n// ============================================================================\n// Requirements Helpers\n// ============================================================================\n\nexport {\n req,\n forType,\n isRequirementType,\n generateRequirementId,\n RequirementSet,\n} from \"./core/requirements.js\";\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\nexport {\n isSingleModuleSystem,\n isNamespacedSystem,\n} from \"./core/types/composition.js\";\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * Backoff strategy constants for retry policies.\n * Use for autocomplete when configuring resolver retry policies.\n *\n * @example\n * ```ts\n * import { Backoff } from '@directive-run/core';\n *\n * const resolver = {\n * requirement: \"FETCH_DATA\",\n * retry: {\n * attempts: 3,\n * backoff: Backoff.Exponential, // Autocomplete-friendly!\n * initialDelay: 100,\n * },\n * resolve: async (req, ctx) => { ... },\n * };\n * ```\n */\nexport const Backoff = {\n /** No delay between retries */\n None: \"none\",\n /** Linear delay increase (initialDelay * attempt) */\n Linear: \"linear\",\n /** Exponential delay increase (initialDelay * 2^attempt) */\n Exponential: \"exponential\",\n} as const;\n\n// ============================================================================\n// Lower-level APIs (for advanced use)\n// ============================================================================\n\nexport {\n createFacts,\n createFactsStore,\n createFactsProxy,\n} from \"./core/facts.js\";\nexport { createDerivationsManager } from \"./core/derivations.js\";\nexport { createEffectsManager } from \"./core/effects.js\";\nexport { createConstraintsManager } from \"./core/constraints.js\";\nexport { createResolversManager, type InflightInfo } from \"./core/resolvers.js\";\nexport { createPluginManager } from \"./core/plugins.js\";\nexport {\n createErrorBoundaryManager,\n createRetryLaterManager,\n type PendingRetry,\n} from \"./core/errors.js\";\nexport {\n createHistoryManager,\n createDisabledHistory,\n} from \"./utils/history.js\";\nexport { createEngine } from \"./core/engine.js\";\n\n// ============================================================================\n// Tracking (for custom derivations)\n// ============================================================================\n\nexport {\n getCurrentTracker,\n isTracking,\n withTracking,\n withoutTracking,\n trackAccess,\n} from \"./core/tracking.js\";\n\n// ============================================================================\n// Requirement Status Utilities\n// ============================================================================\n\nexport {\n createRequirementStatusPlugin,\n createStatusHook,\n type RequirementTypeStatus,\n} from \"./utils/requirement-status.js\";\n\n// ============================================================================\n// Distributable Snapshot Utilities\n// ============================================================================\n\nexport {\n shallowEqual,\n isSnapshotExpired,\n validateSnapshot,\n diffSnapshots,\n signSnapshot,\n verifySnapshotSignature,\n isSignedSnapshot,\n type DistributableSnapshotLike,\n type SnapshotDiff,\n type SnapshotDiffEntry,\n type SignedSnapshot,\n} from \"./utils/utils.js\";\n\n// Migration utilities available via \"@directive-run/core/migration\" subpath export.\n// Not re-exported from main entrypoint to avoid bundle bloat for all consumers.\n"]}
1
+ {"version":3,"sources":["../src/core/types/errors.ts","../src/core/types/helpers.ts","../src/core/types/composition.ts","../src/core/schema-builders.ts","../src/core/module.ts","../src/utils/utils.ts","../src/utils/history.ts","../src/core/requirements.ts","../src/core/tracking.ts","../src/core/constraints.ts","../src/core/derivations.ts","../src/core/effects.ts","../src/core/engine-accessors.ts","../src/core/engine-definitions.ts","../src/core/engine-trace.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/requirement-status.ts","../src/utils/system-with-status.ts","../src/index.ts"],"names":["DirectiveError","message","source","sourceId","context","recoverable","createConstraintFactory","constraint","createResolverFactory","resolver","typedConstraint","typedResolver","isSingleModuleSystem","system","isNamespacedSystem","createSchemaType","validators","typeName","defaultValue","transform","description","refinements","fn","createChainableType","value","v","intermediate","desc","predicate","newRefinements","t","createChainableNumber","n","createChainableArray","elementType","indexRef","chainable","ref","et","newRef","i","item","validator","createChainableObject","shapeSchema","key","schemaType","schemaT","keys","k","values","valueSet","innerType","innerTypeName","types","typeNames","valueType","valueTypeName","val","uuidRegex","emailRegex","createModule","id","config","schemaDerivations","deriveImpl","schemaDerivationKeys","deriveKeys","schemaEvents","eventImpl","schemaEventKeys","eventKeys","schemaEventKeysForValidation","eventName","requirementTypes","resolverName","resolverDef","crossModuleDeps","createModuleFactory","name","withTimeout","promise","ms","errorMessage","timeoutId","timeoutPromise","_","reject","stableStringify","maxDepth","seen","stringify","depth","type","result","obj","isPrototypeSafe","dangerousKeys","check","objVal","shallowEqual","a","b","keysA","keysB","hashObject","str","hash","isSnapshotExpired","snapshot","now","validateSnapshot","expiredAt","diffSnapshots","oldSnapshot","newSnapshot","changes","compare","oldObj","newObj","path","oldRecord","newRecord","allKeys","childPath","versionChanged","isSignedSnapshot","signSnapshot","secret","payload","signature","hmacSha256","verifySnapshotSignature","signedSnapshot","expectedSignature","timingSafeEqual","secretBytes","algorithm","messageBytes","resolveHistoryOption","option","createHistoryManager","options","historyOption","facts","store","onSnapshot","onHistoryChange","isEnabled","maxSnapshots","snapshots","currentIndex","nextId","paused","restoring","changesets","pendingChangesetLabel","pendingChangesetStart","getCurrentFacts","serializeFacts","factsObj","deserializeFacts","serialized","trigger","steps","fromIndex","toIndex","cs","c","earlierCs","snapshotId","index","s","json","data","snap","error","label","createDisabledHistory","noopSnapshot","reqIdCache","generateRequirementId","req","keyFn","cached","rest","sortedRest","createRequirementWithId","requirement","fromConstraint","props","isRequirementType","forType","RequirementSet","_RequirementSet","copy","other","added","removed","unchanged","trackingStack","createTrackingContext","dependencies","nullContext","getCurrentTracker","isTracking","withTracking","withoutTracking","saved","ctx","trackAccess","BLOCKED_PROPS","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","cycleStart","cycle","isAsyncConstraint","initState","isAsync","state","getState","updateDependencies","newDeps","oldDeps","same","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","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","hasAfterDeps","depSet","merged","createDerivationsManager","_store","onCompute","onInvalidate","listeners","factToDerivedDeps","derivedToDerivedDeps","invalidationDepth","pendingNotifications","isFlushing","MAX_FLUSH_ITERATIONS","derivedProxy","computeDerivation","oldValue","flushNotifications","iterations","remaining","ids","listener","invalidateDerivation","startId","queue","dependent","prop","factKeys","idStr","listenerSet","STABLE_THRESHOLD","createEffectsManager","onRun","previousSnapshot","stopped","createSnapshot","shouldRun","runCleanup","storeCleanup","runEffect","effectPromise","trackingResult","trackedDeps","effectsToRun","effectIds","createDeriveAccessor","mergedDerive","getDerivation","deriveMethods","createEventsAccessor","mergedEvents","dispatchEvent","RESERVED_DERIVE_NAMES","createDefinitionsRegistry","mergedConstraints","mergedResolvers","mergedEffects","constraintsManager","resolversManager","derivationsManager","effectsManager","pluginManager","scheduleReconcile","maxDeferredRegistrations","dynamicIds","originals","deferredRegistrations","validateDefId","applyRegister","constraintDef","effectDef","applyAssign","original","applyUnregister","flushDeferred","ops","op","guardedOp","isDestroyed","isReconciling","map","createTraceManager","traceConfig","maxRuns","traceEntries","traceById","traceIdCounter","currentTrace","pendingFactChanges","resolverTraceMap","traceInflightCount","traceStartMs","traceCache","traceCacheVersion","currentCacheVersion","traceStats","finalizeTrace","traceId","entry","startMs","buildCausalChain","updateTraceStats","decrementTraceInflightInternal","requirementId","evictOldestTrace","evicted","reqId","rId","parts","fc","d","rs","e","resolverCount","factChangeCount","anomalies","newValue","duration","reconcileStartMs","inflightCount","createRetryLaterManager","delayMs","maxRetries","backoffMultiplier","maxDelayMs","pendingRetries","calculateDelay","attempt","delay","callback","dueRetries","DEFAULT_STRATEGIES","createErrorBoundaryManager","onRecovery","errors","maxErrors","retryLaterManager","retryAttempts","MAX_RETRY_SOURCES","toDirectiveError","getStrategy","handler","directiveError","strategy","oldest","safeStringify","maxLength","createFactsStore","schema","onChange","onBatch","isTypeAssertionSchema","validate","strictKeys","redactErrors","knownKeys","keyListeners","allListeners","batching","batchChanges","dirtyKeys","isNotifying","pendingNonBatchedChanges","MAX_NOTIFY_ITERATIONS","isZodSchema","getExpectedType","st","formatValueForError","validateValue","valuePreview","expectedType","indexHint","validatorHint","notifyKey","notifyAll","notifyNonBatched","prev","deferred","change","flush","keyStr","set","newSchema","wrapWithNestedWarning","rootKey","target","createFactsProxy","createFacts","createPluginManager","plugins","safeCall","safeCallAsync","broadcast","hook","args","plugin","p","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","createContext","signal","handleRetryError","retryPolicy","controller","normalizedError","resolve","abortHandler","executeResolve","resolverId","lastError","resolvePromise","executeBatch","batchConfig","startedAt","reqPayloads","results","hasFailures","addToBatch","batch","processBatch","idx","status","createEngine","mergedSchema","schemaOwners","module","validateKeys","section","existingOwner","snapshotEventNames","m","mod","dispatchDepth","shouldTakeSnapshot","derivationNames","errorBoundary","retryLaterTimer","invalidateManyDerivations","historyRef","traceManager","traceEnabled","notifySettlementChange","historyListeners","notifyHistoryChange","historyManager","from","to","settlementListeners","MAX_RECONCILE_DEPTH","MAX_DEFERRED_REGISTRATIONS","reconcileDepth","reconcile","keysForConstraints","currentRequirements","currentSet","hitConstraintIds","cId","cState","cDeps","inflightNow","inflightById","info","inflightInfo","dispatchEventByName","deriveAccessor","eventsAccessor","intervalMs","event","derivationId","derivationIds","unsubs","u","isEqual","previousValue","next","old","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","mods","createNamespacedSystem","moduleNamespaces","historyConfig","snapshotModulesSet","orderedNamespaces","initOrder","explicitOrder","missingModules","ns","history","trace","applyZeroConfigDefaults","flatModules","hasCrossModuleDeps","depNamespaces","prefixedFacts","prefixedDerivations","prefixedEvents","prefixedInit","moduleFactsProxy","createModuleFactsProxy","prefixedDerive","derive","factsProxy","createCrossModuleFactsProxy","deriveProxy","createModuleDeriveProxy","prefixedEventHandlers","prefixedConstraints","prefixedResolvers","namespacedFacts","createNamespacedFactsProxy","prefixedEffects","effect","prevProxy","hydratedFacts","engine","applyNamespacedFacts","namespaceKeysMap","moduleNamesCache","getModuleNames","namespacedFactsProxy","namespacedDeriveProxy","createNamespacedDeriveProxy","namespacedEventsProxy","createNamespacedEventsProxy","tickInterval","tickMs","loader","tickEventKey","toInternalKey","internalIds","internalOptions","namespacedData","sepIndex","localKey","moduleDef","bindEnginePassthroughs","warnIfNotStarted","isDev","namespaceCache","proxy","crossModuleFactsProxyCache","selfNamespace","cacheKey","depNamesSet","moduleEventsProxyCache","moduleEventsProxy","eventsProxy","createRequirementStatusPlugin","notify","getOrCreateSet","getStatus","pendingSet","inflightSet","failedSet","getAllStatus","allTypes","subscribe","reset","_resolver","createStatusHook","statusPlugin","createSystemWithStatus","allPlugins","Backoff"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\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 // biome-ignore lint/suspicious/noConfusingVoidType: void semantics needed for implicit no-return\n | ((error: Error, constraint: string) => RecoveryStrategy | void);\n onResolverError?:\n | RecoveryStrategy\n // biome-ignore lint/suspicious/noConfusingVoidType: void semantics needed for implicit no-return\n | ((error: Error, resolver: string) => RecoveryStrategy | void);\n onEffectError?:\n | RecoveryStrategy\n // biome-ignore lint/suspicious/noConfusingVoidType: void semantics needed for implicit no-return\n | ((error: Error, effect: string) => RecoveryStrategy | void);\n onDerivationError?:\n | RecoveryStrategy\n // biome-ignore lint/suspicious/noConfusingVoidType: void semantics needed for implicit no-return\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 * Type Helpers - External typed constraint and resolver definitions\n *\n * These types enable defining constraints and resolvers with full type safety\n * outside of module definitions, while maintaining proper type inference.\n */\n\nimport type { Facts } from \"./facts.js\";\nimport type { Requirement, RequirementOutput } from \"./requirements.js\";\nimport type { BatchConfig, ResolverContext, RetryPolicy } from \"./resolvers.js\";\nimport type { Schema } from \"./schema.js\";\n\n// ============================================================================\n// Typed Constraint Definition\n// ============================================================================\n\n/**\n * External constraint definition with full typing.\n * Use this when defining constraints outside of createModule().\n *\n * @typeParam S - The schema type\n * @typeParam R - The requirement type (defaults to Requirement)\n *\n * @example\n * ```typescript\n * // Define a typed constraint factory\n * const createMaxCountConstraint = <S extends Schema>(\n * maxCount: number\n * ): TypedConstraint<S, { type: \"RESET_COUNT\" }> => ({\n * priority: 10,\n * when: (facts) => (facts as { count: number }).count > maxCount,\n * require: { type: \"RESET_COUNT\" },\n * });\n *\n * // Use in module\n * const module = createModule(\"counter\", {\n * schema: { count: t.number() },\n * constraints: {\n * maxCount: createMaxCountConstraint(100),\n * },\n * });\n * ```\n */\nexport interface TypedConstraint<\n S extends Schema,\n R extends Requirement = Requirement,\n> {\n /** Priority for ordering (higher runs first) */\n priority?: number;\n /** Mark this constraint as async (avoids runtime detection) */\n async?: boolean;\n /** Condition function (sync or async) */\n when: (facts: Facts<S>) => boolean | Promise<boolean>;\n /**\n * Requirement(s) to produce when condition is met.\n */\n require: RequirementOutput<R> | ((facts: Facts<S>) => RequirementOutput<R>);\n /** Timeout for async constraints (ms) */\n timeout?: number;\n /**\n * Constraint IDs whose resolvers must complete before this constraint is evaluated.\n * - If dependency's `when()` returns false, this constraint proceeds (nothing to wait for)\n * - If dependency's resolver fails, this constraint remains blocked until it succeeds\n * - Cross-module: use the constraint ID as it appears in the merged system\n */\n after?: string[];\n}\n\n// ============================================================================\n// Typed Resolver Definition\n// ============================================================================\n\n/**\n * External resolver definition with full typing.\n * Use this when defining resolvers outside of createModule().\n *\n * @typeParam S - The schema type\n * @typeParam R - The requirement type (defaults to Requirement)\n *\n * @example\n * ```typescript\n * // Define a typed resolver factory\n * interface FetchUserReq extends Requirement {\n * type: \"FETCH_USER\";\n * userId: string;\n * }\n *\n * const createFetchUserResolver = <S extends Schema>(\n * fetchFn: (userId: string) => Promise<User>\n * ): TypedResolver<S, FetchUserReq> => ({\n * requirement: (req): req is FetchUserReq => req.type === \"FETCH_USER\",\n * key: (req) => `fetch-user-${req.userId}`,\n * retry: { attempts: 3, backoff: \"exponential\" },\n * resolve: async (req, ctx) => {\n * const user = await fetchFn(req.userId);\n * (ctx.facts as { user: User }).user = user;\n * },\n * });\n * ```\n */\nexport interface TypedResolver<\n S extends Schema,\n R extends Requirement = Requirement,\n> {\n /**\n * Requirement type to handle.\n * - String: matches `req.type` directly (e.g., `requirement: \"FETCH_USER\"`)\n * - Function: type guard predicate (e.g., `requirement: (req) => req.type === \"FETCH_USER\"`)\n */\n requirement: R[\"type\"] | ((req: Requirement) => req is R);\n /** Custom key function for deduplication */\n key?: (req: R) => string;\n /** Retry policy */\n retry?: RetryPolicy;\n /** Timeout for resolver execution (ms) */\n timeout?: number;\n /** Batch configuration */\n batch?: BatchConfig;\n /** Resolve function for single requirement */\n resolve?: (req: R, ctx: ResolverContext<S>) => Promise<void>;\n /** Resolve function for batched requirements */\n resolveBatch?: (reqs: R[], ctx: ResolverContext<S>) => Promise<void>;\n}\n\n// ============================================================================\n// Factory Functions\n// ============================================================================\n\n/**\n * Create a typed constraint factory for a specific schema.\n * This enables creating reusable constraint definitions with proper typing.\n *\n * @example\n * ```typescript\n * const schema = { count: t.number(), threshold: t.number() };\n * const factory = createConstraintFactory<typeof schema>();\n *\n * const maxCountConstraint = factory.create({\n * when: (facts) => facts.count > facts.threshold,\n * require: { type: \"RESET\" },\n * });\n * ```\n */\nexport function createConstraintFactory<S extends Schema>() {\n return {\n /**\n * Create a typed constraint\n */\n create<R extends Requirement = Requirement>(\n constraint: TypedConstraint<S, R>,\n ): TypedConstraint<S, R> {\n return constraint;\n },\n };\n}\n\n/**\n * Create a typed resolver factory for a specific schema.\n * This enables creating reusable resolver definitions with proper typing.\n *\n * @example\n * ```typescript\n * const schema = { user: t.object<User>() };\n * const factory = createResolverFactory<typeof schema>();\n *\n * const fetchUserResolver = factory.create<FetchUserReq>({\n * requirement: (req): req is FetchUserReq => req.type === \"FETCH_USER\",\n * resolve: async (req, ctx) => {\n * ctx.facts.user = await fetchUser(req.userId);\n * },\n * });\n * ```\n */\nexport function createResolverFactory<S extends Schema>() {\n return {\n /**\n * Create a typed resolver\n */\n create<R extends Requirement = Requirement>(\n resolver: TypedResolver<S, R>,\n ): TypedResolver<S, R> {\n return resolver;\n },\n };\n}\n\n// ============================================================================\n// Simple Helper Functions\n// ============================================================================\n\n/**\n * Type-safe constraint creator.\n * Simpler alternative to createConstraintFactory when you don't need a factory pattern.\n *\n * @example\n * ```typescript\n * const constraint = typedConstraint<typeof schema, { type: \"RESET\" }>({\n * when: (facts) => facts.count > 100,\n * require: { type: \"RESET\" },\n * });\n * ```\n */\nexport function typedConstraint<\n S extends Schema,\n R extends Requirement = Requirement,\n>(constraint: TypedConstraint<S, R>): TypedConstraint<S, R> {\n return constraint;\n}\n\n/**\n * Type-safe resolver creator.\n * Simpler alternative to createResolverFactory when you don't need a factory pattern.\n *\n * @example\n * ```typescript\n * const resolver = typedResolver<typeof schema, FetchUserReq>({\n * requirement: (req): req is FetchUserReq => req.type === \"FETCH_USER\",\n * resolve: async (req, ctx) => {\n * ctx.facts.user = await fetchUser(req.userId);\n * },\n * });\n * ```\n */\nexport function typedResolver<\n S extends Schema,\n R extends Requirement = Requirement,\n>(resolver: TypedResolver<S, R>): TypedResolver<S, R> {\n return resolver;\n}\n","/**\n * Composition Types - Type definitions for single and multi-module systems\n *\n * Single module = direct access (no namespace):\n * @example\n * ```typescript\n * const system = createSystem({ modules: counterModule });\n * system.facts.count // Direct access\n * system.events.increment() // Direct events\n * ```\n *\n * Multiple modules = namespaced access:\n * @example\n * ```typescript\n * const system = createSystem({\n * modules: { auth: authModule, data: dataModule },\n * });\n * system.facts.auth.token // Namespaced access\n * system.derive.data.userCount // Namespaced derivations\n * system.events.auth.login() // Namespaced events\n * ```\n */\n\nimport type { ErrorBoundaryConfig } from \"./errors.js\";\nimport type { Facts } from \"./facts.js\";\nimport type { ModuleDef } from \"./module.js\";\nimport type { Plugin } from \"./plugins.js\";\nimport type {\n InferDerivations,\n InferEvents,\n InferFacts,\n ModuleSchema,\n} from \"./schema.js\";\nimport type {\n ConstraintsControl,\n DerivationsControl,\n DistributableSnapshot,\n DistributableSnapshotOptions,\n EffectsControl,\n ResolversControl,\n TraceEntry,\n TraceOption,\n SystemInspection,\n SystemSnapshot,\n HistoryAPI,\n HistoryOption,\n} from \"./system.js\";\n\n// ============================================================================\n// Module Map Types\n// ============================================================================\n\n/**\n * Extract the schema type from a module definition.\n */\nexport type ExtractSchema<M> = M extends ModuleDef<infer S> ? S : never;\n\n/**\n * Map of module name to module definition (object form).\n *\n * Uses `ModuleDef<any>` instead of `ModuleDef<ModuleSchema>` to preserve\n * specific schema types during inference. The actual schema types are\n * extracted via `ExtractSchema<M>` where needed.\n */\n// biome-ignore lint/suspicious/noExplicitAny: Required for TypeScript to preserve specific module schema types during inference\nexport type ModulesMap = Record<string, ModuleDef<any>>;\n\n// ============================================================================\n// Cross-Module Facts Types (for module-level type hints)\n// ============================================================================\n\n/**\n * Map of module name to schema (for cross-module typing).\n */\nexport type SchemasMap = Record<string, ModuleSchema>;\n\n/**\n * Create namespaced facts type from a map of schemas.\n * Use this to type cross-module effects and constraints within modules.\n *\n * @example\n * ```typescript\n * // types.ts - Create the combined type from schemas\n * import { authSchema } from './modules/auth';\n * import { dataSchema } from './modules/data';\n * import { uiSchema } from './modules/ui';\n * import type { CrossModuleFacts } from '@directive-run/core';\n *\n * export type AllFacts = CrossModuleFacts<{\n * auth: typeof authSchema;\n * data: typeof dataSchema;\n * ui: typeof uiSchema;\n * }>;\n *\n * // modules/ui.ts - Use the combined type in effects\n * import type { AllFacts } from '../types';\n *\n * effects: {\n * onAuthChange: {\n * run: (facts: AllFacts, prev: AllFacts | undefined) => {\n * facts.auth.isAuthenticated // ✅ typed!\n * facts.data.users // ✅ typed!\n * }\n * }\n * }\n * ```\n */\nexport type CrossModuleFacts<Schemas extends SchemasMap> = {\n [K in keyof Schemas]: InferFacts<Schemas[K]>;\n};\n\n/**\n * Create namespaced derivations type from a map of schemas.\n * Use this to type cross-module effects that read derivations.\n *\n * @example\n * ```typescript\n * import type { CrossModuleDerivations } from '@directive-run/core';\n *\n * export type AllDerivations = CrossModuleDerivations<{\n * auth: typeof authSchema;\n * data: typeof dataSchema;\n * }>;\n * ```\n */\nexport type CrossModuleDerivations<Schemas extends SchemasMap> = {\n readonly [K in keyof Schemas]: InferDerivations<Schemas[K]>;\n};\n\n// ============================================================================\n// Cross-Module Dependencies Types (for module-level crossModuleDeps)\n// ============================================================================\n\n/**\n * Map of namespace to schema for cross-module dependencies.\n * Used in module config to declare type-safe access to other modules' facts.\n */\nexport type CrossModuleDeps = Record<string, ModuleSchema>;\n\n/**\n * Cross-module facts type using \"self\" for own module.\n * Own module accessed via `facts.self.*`, dependencies via `facts.{dep}.*`.\n *\n * @example\n * ```typescript\n * // For a \"data\" module with crossModuleDeps: { auth: authSchema }\n * facts.self.users // ✅ own module via \"self\"\n * facts.auth.isAuthenticated // ✅ cross-module via namespace\n * ```\n */\nexport type CrossModuleFactsWithSelf<\n OwnSchema extends ModuleSchema,\n Deps extends CrossModuleDeps,\n> = { self: InferFacts<OwnSchema> } & {\n [K in keyof Deps]: InferFacts<Deps[K]>;\n};\n\n// ============================================================================\n// Namespaced Facts Types\n// ============================================================================\n\n/**\n * Namespace facts under module keys.\n * `facts.auth.token` instead of `facts.auth_token`\n */\nexport type NamespacedFacts<Modules extends ModulesMap> = {\n readonly [K in keyof Modules]: InferFacts<ExtractSchema<Modules[K]>>;\n};\n\n/**\n * Mutable version for constraint/resolver callbacks.\n */\nexport type MutableNamespacedFacts<Modules extends ModulesMap> = {\n [K in keyof Modules]: InferFacts<ExtractSchema<Modules[K]>>;\n};\n\n// ============================================================================\n// Namespaced Derivations Types\n// ============================================================================\n\n/**\n * Namespace derivations under module keys.\n * `derive.auth.status` instead of `derive.auth_status`\n */\nexport type NamespacedDerivations<Modules extends ModulesMap> = {\n readonly [K in keyof Modules]: InferDerivations<ExtractSchema<Modules[K]>>;\n};\n\n// ============================================================================\n// Union Event Types\n// ============================================================================\n\n/**\n * Union of all module events (not namespaced).\n * Events stay as discriminated union for dispatch.\n */\nexport type UnionEvents<Modules extends ModulesMap> = {\n [K in keyof Modules]: InferEvents<ExtractSchema<Modules[K]>>;\n}[keyof Modules];\n\n// ============================================================================\n// Namespaced System Options\n// ============================================================================\n\n/**\n * Options for createSystem with object modules (namespaced mode).\n */\nexport interface CreateSystemOptionsNamed<Modules extends ModulesMap> {\n /** Modules as object = namespaced access */\n modules: Modules;\n /** Plugins to register */\n plugins?: Array<Plugin<ModuleSchema>>;\n /** History configuration for snapshot-based state history */\n history?: HistoryOption;\n /** Trace: per-run reconciliation changelog */\n trace?: TraceOption;\n /** Error boundary configuration */\n errorBoundary?: ErrorBoundaryConfig;\n /**\n * Tick interval for time-based systems (ms).\n */\n tickMs?: number;\n /**\n * Enable zero-config mode with sensible defaults.\n */\n zeroConfig?: boolean;\n /**\n * Initial facts to set after module init (namespaced format).\n * Applied after all module `init()` functions but before reconciliation.\n *\n * @example\n * ```typescript\n * createSystem({\n * modules: { auth, data },\n * initialFacts: {\n * auth: { token: \"restored-token\", user: cachedUser },\n * data: { users: preloadedUsers },\n * },\n * });\n * ```\n */\n initialFacts?: Partial<{\n [K in keyof Modules]: Partial<InferFacts<ExtractSchema<Modules[K]>>>;\n }>;\n /**\n * Init order strategy:\n * - \"auto\" (default): Sort by crossModuleDeps topology\n * - \"declaration\": Use object key order (current behavior)\n * - string[]: Explicit order by namespace\n */\n initOrder?: \"auto\" | \"declaration\" | Array<keyof Modules & string>;\n}\n\n// ============================================================================\n// Namespaced System Interface\n// ============================================================================\n\n/**\n * System interface for namespaced modules.\n * Facts and derivations are accessed via module namespaces.\n */\nexport interface NamespacedSystem<Modules extends ModulesMap> {\n /** System mode discriminator for type guards */\n readonly _mode: \"namespaced\";\n /** Namespaced facts accessor: system.facts.auth.token */\n readonly facts: MutableNamespacedFacts<Modules>;\n /** History API for undo/redo, rollback, audit trails (if enabled) */\n readonly history: HistoryAPI | null;\n /** Namespaced derivations accessor: system.derive.auth.status */\n readonly derive: NamespacedDerivations<Modules> & DerivationsControl;\n /** Events accessor (union of all module events) */\n readonly events: NamespacedEventsAccessor<Modules>;\n /** Runtime control for constraints (disable/enable/isDisabled + dynamic CRUD) */\n readonly constraints: ConstraintsControl;\n /** Runtime control for effects (disable/enable/isEnabled + dynamic CRUD) */\n readonly effects: EffectsControl;\n /** Runtime control for resolvers (dynamic CRUD) */\n readonly resolvers: ResolversControl;\n /** Per-run trace entries (null if trace is not enabled) */\n readonly trace: TraceEntry[] | null;\n\n /** Initialize facts and derivations without starting reconciliation. Safe for SSR. */\n initialize(): void;\n /** Start the system (initialize modules, begin reconciliation) */\n start(): void;\n /** Stop the system (cancel resolvers, stop reconciliation) */\n stop(): void;\n /** Destroy the system (stop and cleanup) */\n destroy(): void;\n\n /** Whether the system is currently running */\n readonly isRunning: boolean;\n /** Whether all resolvers have completed */\n readonly isSettled: boolean;\n /** Whether all modules have completed initialization */\n readonly isInitialized: boolean;\n /** Whether system has completed first reconciliation */\n readonly isReady: boolean;\n\n /** Wait for system to be fully ready (after first reconciliation) */\n whenReady(): Promise<void>;\n\n /**\n * Hydrate facts from async source (call before start).\n * Useful for restoring state from localStorage, API, etc.\n *\n * @example\n * ```typescript\n * const system = createSystem({ modules: { auth, data } });\n * await system.hydrate(async () => {\n * const stored = localStorage.getItem(\"app-state\");\n * return stored ? JSON.parse(stored) : {};\n * });\n * system.start();\n * ```\n */\n hydrate(\n loader: () =>\n | Promise<\n Partial<{\n [K in keyof Modules]: Partial<\n InferFacts<ExtractSchema<Modules[K]>>\n >;\n }>\n >\n | Partial<{\n [K in keyof Modules]: Partial<InferFacts<ExtractSchema<Modules[K]>>>;\n }>,\n ): Promise<void>;\n\n /** Dispatch an event (union of all module events) */\n dispatch(event: UnionEvents<Modules>): void;\n\n /** Batch multiple fact changes */\n batch(fn: () => void): void;\n\n /**\n * Subscribe to settlement state changes.\n * Called whenever the system's settled state may have changed\n * (resolver starts/completes, reconcile starts/ends).\n */\n onSettledChange(listener: () => void): () => void;\n\n /** Subscribe to history state changes (snapshot taken, navigation). */\n onHistoryChange(listener: () => void): () => void;\n\n /**\n * Read a derivation value by namespaced key.\n * Accepts \"namespace.key\" format (e.g., \"auth.status\").\n *\n * @example\n * system.read(\"auth.status\") // → \"authenticated\"\n * system.read(\"data.count\") // → 5\n */\n read<T = unknown>(derivationId: string): T;\n\n /**\n * Subscribe to fact or derivation changes using namespaced keys.\n * Keys are auto-detected — pass any mix of fact keys and derivation keys.\n * Accepts \"namespace.key\" format (e.g., \"auth.status\", \"auth.token\").\n * Supports wildcard \"namespace.*\" to subscribe to all keys in a module.\n *\n * @example\n * system.subscribe([\"auth.token\", \"data.count\"], () => {\n * console.log(\"Auth or data changed\");\n * });\n *\n * @example Wildcard\n * system.subscribe([\"game.*\"], () => render());\n */\n subscribe(ids: string[], listener: () => void): () => void;\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 * system.subscribeModule(\"game\", () => render());\n * system.subscribeModule(\"chat\", () => render());\n */\n subscribeModule(\n namespace: keyof Modules & string,\n listener: () => void,\n ): () => void;\n\n /**\n * Watch a fact or derivation for changes using namespaced key.\n * The key is auto-detected -- works with both fact keys and derivation keys.\n * Accepts \"namespace.key\" format (e.g., \"auth.status\", \"auth.token\").\n * Pass `options.equalityFn` for custom comparison (e.g., shallow equality for objects).\n *\n * @example\n * system.watch(\"auth.token\", (newVal, oldVal) => {\n * console.log(`Token changed from ${oldVal} to ${newVal}`);\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\n /**\n * Returns a promise that resolves when the predicate becomes true.\n * The predicate is evaluated against current facts and re-evaluated on every change.\n * Uses namespaced facts: `facts.auth.token`, `facts.data.count`, etc.\n * Optionally pass a timeout in ms -- rejects with an error if exceeded.\n *\n * @example\n * await system.when((facts) => facts.auth.token !== null);\n * await system.when((facts) => facts.auth.token !== null, { timeout: 5000 });\n */\n when(\n predicate: (facts: Readonly<MutableNamespacedFacts<Modules>>) => boolean,\n options?: { timeout?: number },\n ): Promise<void>;\n\n /** Inspect system state */\n inspect(): SystemInspection;\n /** Wait for system to settle (all resolvers complete) */\n settle(maxWait?: number): Promise<void>;\n /** Explain why a requirement exists */\n explain(requirementId: string): string | null;\n /** Get serializable snapshot of system state */\n getSnapshot(): SystemSnapshot;\n /** Restore system state from snapshot */\n restore(snapshot: SystemSnapshot): void;\n\n /**\n * Register a new module into a running system.\n * The module is initialized, wired into constraint/resolver/derivation graphs,\n * and reconciliation is triggered.\n *\n * @example\n * ```typescript\n * // Lazy-load a module\n * const chatModule = await import('./modules/chat');\n * system.registerModule(\"chat\", chatModule.default);\n * ```\n */\n registerModule<S extends ModuleSchema>(\n namespace: string,\n moduleDef: ModuleDef<S>,\n ): void;\n\n /**\n * Get a distributable snapshot of computed derivations.\n * Use \"namespace.key\" format for derivation keys.\n *\n * @example\n * ```typescript\n * const snapshot = system.getDistributableSnapshot({\n * includeDerivations: ['auth.effectivePlan', 'auth.canUseFeature'],\n * ttlSeconds: 3600,\n * });\n * await redis.setex(`entitlements:${userId}`, 3600, JSON.stringify(snapshot));\n * ```\n */\n getDistributableSnapshot<T = Record<string, unknown>>(\n options?: DistributableSnapshotOptions,\n ): DistributableSnapshot<T>;\n\n /**\n * Watch for changes to distributable snapshot derivations.\n * Calls the callback whenever any of the included derivations change.\n * Use \"namespace.key\" format for derivation keys.\n * Returns an unsubscribe function.\n *\n * @example\n * ```typescript\n * const unsubscribe = system.watchDistributableSnapshot(\n * { includeDerivations: ['auth.effectivePlan', 'auth.canUseFeature'] },\n * (snapshot) => {\n * await redis.setex(`entitlements:${userId}`, 3600, JSON.stringify(snapshot));\n * }\n * );\n * ```\n */\n watchDistributableSnapshot<T = Record<string, unknown>>(\n options: DistributableSnapshotOptions,\n callback: (snapshot: DistributableSnapshot<T>) => void,\n ): () => void;\n}\n\n/**\n * Events accessor that groups event dispatchers by module namespace.\n */\nexport type NamespacedEventsAccessor<Modules extends ModulesMap> = {\n readonly [K in keyof Modules]: EventsDispatcherForModule<Modules[K]>;\n};\n\n/**\n * Event dispatcher functions for a single module.\n */\ntype EventsDispatcherForModule<M> = M extends ModuleDef<infer S>\n ? S extends ModuleSchema\n ? S[\"events\"] extends Record<string, unknown>\n ? {\n [E in keyof S[\"events\"]]: S[\"events\"][E] extends Record<\n string,\n unknown\n >\n ? keyof S[\"events\"][E] extends never\n ? () => void\n : (payload: InferEventPayload<S[\"events\"][E]>) => void\n : () => void;\n }\n : Record<string, never>\n : Record<string, never>\n : Record<string, never>;\n\n/**\n * Infer event payload from event schema.\n */\ntype InferEventPayload<E> = E extends Record<string, unknown>\n ? { [K in keyof E]: E[K] extends { _type: infer T } ? T : E[K] }\n : never;\n\n// ============================================================================\n// Merged Schema Type (for internal use)\n// ============================================================================\n\n/**\n * Merge multiple module schemas into a single flat schema.\n * Used internally by the engine for storage.\n *\n * @example\n * ```typescript\n * // auth: { facts: { token: string } }\n * // data: { facts: { users: User[] } }\n * // Merged: { auth_token: string, data_users: User[] }\n * ```\n */\nexport type MergedModuleSchema<Modules extends ModulesMap> = {\n facts: MergeFactsWithPrefix<Modules>;\n derivations: MergeDerivationsWithPrefix<Modules>;\n events: MergeEventsWithPrefix<Modules>;\n requirements: MergeRequirementsWithPrefix<Modules>;\n};\n\ntype MergeFactsWithPrefix<Modules extends ModulesMap> = {\n [K in keyof Modules as `${K & string}::${keyof ExtractSchema<Modules[K]>[\"facts\"] & string}`]: ExtractSchema<\n Modules[K]\n >[\"facts\"][keyof ExtractSchema<Modules[K]>[\"facts\"]];\n};\n\ntype MergeDerivationsWithPrefix<Modules extends ModulesMap> = {\n [K in keyof Modules as ExtractSchema<\n Modules[K]\n >[\"derivations\"] extends Record<string, unknown>\n ? `${K & string}::${keyof ExtractSchema<Modules[K]>[\"derivations\"] & string}`\n : never]: ExtractSchema<Modules[K]>[\"derivations\"] extends Record<\n string,\n unknown\n >\n ? ExtractSchema<Modules[K]>[\"derivations\"][keyof ExtractSchema<\n Modules[K]\n >[\"derivations\"]]\n : never;\n};\n\ntype MergeEventsWithPrefix<Modules extends ModulesMap> = {\n [K in keyof Modules as ExtractSchema<Modules[K]>[\"events\"] extends Record<\n string,\n unknown\n >\n ? `${K & string}::${keyof ExtractSchema<Modules[K]>[\"events\"] & string}`\n : never]: ExtractSchema<Modules[K]>[\"events\"] extends Record<\n string,\n unknown\n >\n ? ExtractSchema<Modules[K]>[\"events\"][keyof ExtractSchema<\n Modules[K]\n >[\"events\"]]\n : never;\n};\n\ntype MergeRequirementsWithPrefix<Modules extends ModulesMap> = {\n [K in keyof Modules as ExtractSchema<\n Modules[K]\n >[\"requirements\"] extends Record<string, unknown>\n ? keyof ExtractSchema<Modules[K]>[\"requirements\"] & string\n : never]: ExtractSchema<Modules[K]>[\"requirements\"] extends Record<\n string,\n unknown\n >\n ? ExtractSchema<Modules[K]>[\"requirements\"][keyof ExtractSchema<\n Modules[K]\n >[\"requirements\"]]\n : never;\n};\n\n// ============================================================================\n// Single Module Types (no namespace)\n// ============================================================================\n\n/**\n * Options for createSystem with a single module (no namespacing).\n */\nexport interface CreateSystemOptionsSingle<S extends ModuleSchema> {\n /** Single module = direct access (use `modules` for multiple) */\n module: ModuleDef<S>;\n /** Plugins to register */\n plugins?: Array<Plugin<ModuleSchema>>;\n /** History configuration for snapshot-based state history */\n history?: HistoryOption;\n /** Trace: per-run reconciliation changelog */\n trace?: TraceOption;\n /** Error boundary configuration */\n errorBoundary?: ErrorBoundaryConfig;\n /** Tick interval for time-based systems (ms) */\n tickMs?: number;\n /** Enable zero-config mode with sensible defaults */\n zeroConfig?: boolean;\n /**\n * Initial facts to set after module init.\n * Applied after module `init()` but before reconciliation.\n */\n initialFacts?: Partial<InferFacts<S>>;\n}\n\n/**\n * System interface for a single module (no namespace).\n * Facts, derivations, and events are accessed directly.\n */\nexport interface SingleModuleSystem<S extends ModuleSchema> {\n /** System mode discriminator for type guards */\n readonly _mode: \"single\";\n /** Direct facts accessor: system.facts.count */\n readonly facts: Facts<S[\"facts\"]>;\n /** History API for undo/redo, rollback, audit trails (if enabled) */\n readonly history: HistoryAPI | null;\n /** Direct derivations accessor: system.derive.doubled */\n readonly derive: InferDerivations<S> & DerivationsControl<S>;\n /** Direct events accessor: system.events.increment() */\n readonly events: SingleModuleEvents<S>;\n /** Runtime control for constraints (disable/enable/isDisabled) */\n readonly constraints: ConstraintsControl<S>;\n /** Runtime control for effects (disable/enable/isEnabled) */\n readonly effects: EffectsControl<S>;\n /** Runtime control for resolvers (register/assign/unregister/call) */\n readonly resolvers: ResolversControl<S>;\n /** Per-run trace entries (null if trace is not enabled) */\n readonly trace: TraceEntry[] | null;\n\n /** Initialize facts and derivations without starting reconciliation. Safe for SSR. */\n initialize(): void;\n /** Start the system (initialize modules, begin reconciliation) */\n start(): void;\n /** Stop the system (cancel resolvers, stop reconciliation) */\n stop(): void;\n /** Destroy the system (stop and cleanup) */\n destroy(): void;\n\n /** Whether the system is currently running */\n readonly isRunning: boolean;\n /** Whether all resolvers have completed */\n readonly isSettled: boolean;\n /** Whether module has completed initialization */\n readonly isInitialized: boolean;\n /** Whether system has completed first reconciliation */\n readonly isReady: boolean;\n\n /** Wait for system to be fully ready (after first reconciliation) */\n whenReady(): Promise<void>;\n\n /**\n * Hydrate facts from async source (call before start).\n */\n hydrate(\n loader: () => Promise<Partial<InferFacts<S>>> | Partial<InferFacts<S>>,\n ): Promise<void>;\n\n /** Dispatch an event */\n dispatch(event: InferEvents<S>): void;\n\n /** Batch multiple fact changes */\n batch(fn: () => void): void;\n\n /**\n * Subscribe to settlement state changes.\n * Called whenever the system's settled state may have changed\n * (resolver starts/completes, reconcile starts/ends).\n */\n onSettledChange(listener: () => void): () => void;\n\n /** Subscribe to history state changes (snapshot taken, navigation). */\n onHistoryChange(listener: () => void): () => void;\n\n /**\n * Read a derivation value by key.\n * @example system.read(\"doubled\")\n */\n read<T = unknown>(derivationId: string): T;\n\n /**\n * Subscribe to fact or derivation changes.\n * Keys are auto-detected -- pass any mix of fact keys and derivation keys.\n * @example system.subscribe([\"count\", \"doubled\"], () => { ... })\n */\n subscribe(ids: string[], listener: () => void): () => void;\n\n /**\n * Watch a fact or derivation for value changes.\n * The key is auto-detected -- works with both fact keys and derivation keys.\n * Pass `options.equalityFn` for custom comparison (e.g., shallow equality for objects).\n * @example system.watch(\"count\", (newVal, oldVal) => { ... })\n * @example system.watch(\"derived\", cb, { equalityFn: shallowEqual })\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\n /**\n * Returns a promise that resolves when the predicate becomes true.\n * The predicate is evaluated against current facts and re-evaluated on every change.\n * Optionally pass a timeout in ms -- rejects with an error if exceeded.\n *\n * @example\n * await system.when((facts) => facts.count > 10);\n * await system.when((facts) => facts.count > 10, { timeout: 5000 });\n */\n when(\n predicate: (facts: Readonly<InferFacts<S>>) => boolean,\n options?: { timeout?: number },\n ): Promise<void>;\n\n /** Inspect system state */\n inspect(): SystemInspection;\n /** Wait for system to settle (all resolvers complete) */\n settle(maxWait?: number): Promise<void>;\n /** Explain why a requirement exists */\n explain(requirementId: string): string | null;\n /** Get serializable snapshot of system state */\n getSnapshot(): SystemSnapshot;\n /** Restore system state from snapshot */\n restore(snapshot: SystemSnapshot): void;\n\n /**\n * Register a new module into a running system.\n * Module facts, derivations, effects, constraints, and resolvers are merged\n * into the existing engine and reconciliation is triggered.\n *\n * @example\n * ```typescript\n * const analyticsModule = await import('./modules/analytics');\n * system.registerModule(analyticsModule.default);\n * ```\n */\n registerModule<S2 extends ModuleSchema>(moduleDef: ModuleDef<S2>): void;\n\n /**\n * Get a distributable snapshot of computed derivations.\n *\n * @example\n * ```typescript\n * const snapshot = system.getDistributableSnapshot({\n * includeDerivations: ['effectivePlan', 'canUseFeature'],\n * ttlSeconds: 3600,\n * });\n * await redis.setex(`entitlements:${userId}`, 3600, JSON.stringify(snapshot));\n * ```\n */\n getDistributableSnapshot<T = Record<string, unknown>>(\n options?: DistributableSnapshotOptions,\n ): DistributableSnapshot<T>;\n\n /**\n * Watch for changes to distributable snapshot derivations.\n * Calls the callback whenever any of the included derivations change.\n * Returns an unsubscribe function.\n *\n * @example\n * ```typescript\n * const unsubscribe = system.watchDistributableSnapshot(\n * { includeDerivations: ['effectivePlan', 'canUseFeature'] },\n * (snapshot) => {\n * await redis.setex(`entitlements:${userId}`, 3600, JSON.stringify(snapshot));\n * }\n * );\n * ```\n */\n watchDistributableSnapshot<T = Record<string, unknown>>(\n options: DistributableSnapshotOptions,\n callback: (snapshot: DistributableSnapshot<T>) => void,\n ): () => void;\n}\n\n/**\n * Events dispatcher for a single module (direct access).\n */\ntype SingleModuleEvents<S extends ModuleSchema> = S[\"events\"] extends Record<\n string,\n unknown\n>\n ? {\n [E in keyof S[\"events\"]]: S[\"events\"][E] extends Record<string, unknown>\n ? keyof S[\"events\"][E] extends never\n ? () => void\n : (payload: InferEventPayload<S[\"events\"][E]>) => void\n : () => void;\n }\n : Record<string, never>;\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\n/**\n * System mode discriminator.\n * - \"single\": Single module with direct access (`system.facts.count`)\n * - \"namespaced\": Multiple modules with namespaced access (`system.facts.auth.token`)\n */\nexport type SystemMode = \"single\" | \"namespaced\";\n\n/**\n * Base system type for type guards.\n * Use this for functions that accept either system type.\n */\nexport interface AnySystem {\n readonly _mode: SystemMode;\n readonly isRunning: boolean;\n readonly isSettled: boolean;\n readonly isInitialized: boolean;\n readonly isReady: boolean;\n initialize(): void;\n start(): void;\n stop(): void;\n destroy(): void;\n}\n\n/**\n * Check if a system is a single module system.\n * Returns true if the system was created with `module:` (singular).\n *\n * @example\n * ```typescript\n * const system = createSystem({ module: counterModule });\n *\n * if (isSingleModuleSystem(system)) {\n * // system._mode === \"single\"\n * console.log(system.facts.count);\n * }\n * ```\n */\nexport function isSingleModuleSystem(system: AnySystem): boolean {\n return system._mode === \"single\";\n}\n\n/**\n * Check if a system is a namespaced (multi-module) system.\n * Returns true if the system was created with `modules:` (plural, object).\n *\n * @example\n * ```typescript\n * const system = createSystem({ modules: { auth, data } });\n *\n * if (isNamespacedSystem(system)) {\n * // system._mode === \"namespaced\"\n * console.log(system.facts.auth.token);\n * }\n * ```\n */\nexport function isNamespacedSystem(system: AnySystem): boolean {\n return system._mode === \"namespaced\";\n}\n","/**\n * Schema Type Builders\n *\n * Provides type-safe schema definitions with optional runtime validation.\n * Used to define fact types, derivation types, event payload types, etc.\n *\n * This module has no dependency on the facts store or tracking system.\n */\n\nimport type { SchemaType } 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/** 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 * @remarks\n * Each builder returns a chainable {@link ExtendedSchemaType} with validation\n * methods (`.min()`, `.max()`, `.pattern()`, etc.) and dev-mode runtime\n * type checking. Validators are tree-shaken in production builds.\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 *\n * @public\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 for any complex value.\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 * For arrays, prefer `t.array<T>()` which adds `Array.isArray` validation.\n */\n object<T>() {\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) {\n return true;\n }\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) {\n return true;\n }\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) {\n return false;\n }\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\") {\n return false;\n }\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 * Module - The declarative API for defining Directive modules\n *\n * Modules group related facts, constraints, resolvers, effects, and derivations.\n */\n\nimport type {\n CrossModuleConstraintsDef,\n CrossModuleDeps,\n CrossModuleDerivationsDef,\n CrossModuleEffectsDef,\n EffectsDef,\n Facts,\n ModuleDef,\n ModuleHooks,\n ModuleSchema,\n TypedConstraintsDef,\n TypedDerivationsDef,\n TypedEventsDef,\n TypedResolversDef,\n} from \"./types.js\";\n\n// ============================================================================\n// Module Configuration\n// ============================================================================\n\n/**\n * Module configuration with consolidated schema.\n *\n * derive and events are optional - omit them if your schema has empty derivations/events.\n */\nexport interface ModuleConfig<M extends ModuleSchema> {\n schema: M;\n init?: (facts: Facts<M[\"facts\"]>) => void;\n derive?: TypedDerivationsDef<M>;\n events?: TypedEventsDef<M>;\n effects?: EffectsDef<M[\"facts\"]>;\n constraints?: TypedConstraintsDef<M>;\n resolvers?: TypedResolversDef<M>;\n hooks?: ModuleHooks<M>;\n /** History configuration — controls which events create snapshots for undo/redo. */\n history?: {\n /** Events that create history snapshots. Omit to snapshot all events. */\n snapshotEvents?: Array<\n keyof (M[\"events\"] extends Record<string, unknown>\n ? M[\"events\"]\n : Record<string, never>) &\n string\n >;\n };\n}\n\n/**\n * Module configuration with cross-module dependencies for type-safe access\n * to other modules' facts in effects and constraints.\n *\n * When crossModuleDeps is provided:\n * - Own module facts: `facts.self.*`\n * - Cross-module facts: `facts.{dep}.*`\n *\n * @example\n * ```typescript\n * import { authSchema } from './auth';\n * import { dataSchema } from './data';\n *\n * const uiModule = createModule(\"ui\", {\n * schema: uiSchema,\n * crossModuleDeps: { auth: authSchema, data: dataSchema },\n * effects: {\n * onAuthChange: {\n * run: (facts) => {\n * facts.self.notifications // ✅ own module via \"self\"\n * facts.auth.isAuthenticated // ✅ cross-module (namespaced)\n * facts.data.users // ✅ cross-module (namespaced)\n * }\n * }\n * },\n * constraints: {\n * fetchWhenAuth: {\n * when: (facts) => facts.auth.isAuthenticated && facts.self.users.length === 0,\n * require: { type: \"FETCH_USERS\" },\n * }\n * }\n * });\n * ```\n */\nexport interface ModuleConfigWithDeps<\n M extends ModuleSchema,\n Deps extends CrossModuleDeps,\n> {\n schema: M;\n /**\n * Cross-module dependencies for type-safe access in derive/effects/constraints.\n *\n * **Access patterns by context:**\n * - `derive`, `effects`, `constraints`: Use `facts.self.*` for own module, `facts.{dep}.*` for cross-module\n * - `init`, `events`, `resolvers`: Use flat access (`facts.myFact`) - no cross-module access\n *\n * This separation ensures initialization and event handling stay scoped to own module,\n * while observers (derive/effects/constraints) can see across modules.\n *\n * @example\n * ```typescript\n * crossModuleDeps: { auth: authSchema },\n * init: (facts) => { facts.users = []; }, // flat access\n * derive: { count: (facts) => facts.self.users.length }, // facts.self.*\n * effects: { log: { run: (facts) => console.log(facts.auth.token) } }, // facts.{dep}.*\n * ```\n */\n crossModuleDeps: Deps;\n /** Initialize module facts. Uses flat access (`facts.myFact`) to ensure modules initialize independently. */\n init?: (facts: Facts<M[\"facts\"]>) => void;\n /** Derivations with cross-module facts access (`facts.self.*` + `facts.{dep}.*`) */\n derive?: CrossModuleDerivationsDef<M, Deps>;\n /** Event handlers. Uses flat access (`facts.myFact`) to keep mutations scoped to own module. */\n events?: TypedEventsDef<M>;\n /** Effects with cross-module facts access (`facts.self.*` + `facts.{dep}.*`) */\n effects?: CrossModuleEffectsDef<M, Deps>;\n /** Constraints with cross-module facts access (`facts.self.*` + `facts.{dep}.*`) */\n constraints?: CrossModuleConstraintsDef<M, Deps>;\n /** Resolvers. Uses flat access (`ctx.facts.myFact`) to keep async mutations scoped to own module. */\n resolvers?: TypedResolversDef<M>;\n hooks?: ModuleHooks<M>;\n /** History configuration — controls which events create snapshots for undo/redo. */\n history?: {\n /** Events that create history snapshots. Omit to snapshot all events. */\n snapshotEvents?: Array<\n keyof (M[\"events\"] extends Record<string, unknown>\n ? M[\"events\"]\n : Record<string, never>) &\n string\n >;\n };\n}\n\n/**\n * Create a module definition with full type inference.\n *\n * The consolidated schema provides:\n * - Derivation composition (`derived.otherDerivation` is typed)\n * - Event dispatch (`system.dispatch({ type: \"...\" })` has autocomplete)\n * - Resolver requirements (`req.payload` is typed based on requirement type)\n *\n * @param id - Unique module identifier (kebab-case recommended)\n * @param config - Module configuration including schema, init, derive, constraints, resolvers, etc.\n * @returns A frozen module definition ready for use with `createSystem`\n *\n * @example\n * ```ts\n * const trafficLight = createModule(\"traffic-light\", {\n * schema: {\n * facts: {\n * phase: t.string<\"red\" | \"green\" | \"yellow\">(),\n * elapsed: t.number(),\n * },\n * derivations: {\n * isRed: t.boolean(),\n * timeRemaining: t.number(),\n * },\n * events: {\n * tick: {},\n * setPhase: { phase: t.string<\"red\" | \"green\" | \"yellow\">() },\n * },\n * requirements: {\n * TRANSITION: { to: t.string<\"red\" | \"green\" | \"yellow\">() },\n * },\n * },\n * init: (facts) => {\n * facts.phase = \"red\";\n * facts.elapsed = 0;\n * },\n * derive: {\n * isRed: (facts) => facts.phase === \"red\",\n * timeRemaining: (facts, derived) => {\n * // derived.isRed is typed as boolean!\n * return derived.isRed ? 30 - facts.elapsed : 0;\n * },\n * },\n * events: {\n * tick: (facts) => { facts.elapsed += 1; },\n * setPhase: (facts, { phase }) => { facts.phase = phase; }, // phase is typed!\n * },\n * constraints: {\n * shouldTransition: {\n * when: (facts) => facts.phase === \"red\" && facts.elapsed > 30,\n * require: { type: \"TRANSITION\", to: \"green\" },\n * },\n * },\n * resolvers: {\n * transition: {\n * requirement: \"TRANSITION\",\n * resolve: async (req, ctx) => {\n * ctx.facts.phase = req.to; // req.to is typed!\n * ctx.facts.elapsed = 0;\n * },\n * },\n * },\n * });\n * ```\n *\n * @example With cross-module dependencies\n * ```ts\n * import { authSchema } from './auth';\n *\n * const dataModule = createModule(\"data\", {\n * schema: dataSchema,\n * crossModuleDeps: { auth: authSchema },\n * constraints: {\n * fetchWhenAuth: {\n * when: (facts) => {\n * // facts.self.* for own module, facts.auth.* for cross-module\n * return facts.auth.isAuthenticated && facts.self.users.length === 0;\n * },\n * require: { type: \"FETCH_USERS\" },\n * },\n * },\n * derive: {\n * canFetch: (facts) => facts.auth.isAuthenticated && facts.self.users.length === 0,\n * },\n * });\n * ```\n *\n * @public\n */\n// Overload 1: With crossModuleDeps\nexport function createModule<\n const M extends ModuleSchema,\n const Deps extends CrossModuleDeps,\n>(id: string, config: ModuleConfigWithDeps<M, Deps>): ModuleDef<M>;\n\n// Overload 2: Without crossModuleDeps (original signature)\nexport function createModule<const M extends ModuleSchema>(\n id: string,\n config: ModuleConfig<M>,\n): ModuleDef<M>;\n\n// Overload 3: Union (used by createModuleFactory)\nexport function createModule<const M extends ModuleSchema>(\n id: string,\n config: ModuleConfigWithDeps<M, CrossModuleDeps> | ModuleConfig<M>,\n): ModuleDef<M>;\n\n/** @internal Implementation overload — see public overloads above. */\nexport function createModule<const M extends ModuleSchema>(\n id: string,\n config: ModuleConfig<M> | ModuleConfigWithDeps<M, CrossModuleDeps>,\n): ModuleDef<M> {\n // Dev-mode validations\n if (process.env.NODE_ENV !== \"production\") {\n if (!id || typeof id !== \"string\") {\n console.warn(\"[Directive] Module ID must be a non-empty string\");\n } else if (!/^(__[a-z][a-z0-9_-]*|[a-z][a-z0-9-]*)$/i.test(id)) {\n console.warn(\n `[Directive] Module ID \"${id}\" should follow kebab-case convention (e.g., \"my-module\")`,\n );\n }\n\n if (!config.schema) {\n console.warn(\"[Directive] Module schema is required\");\n } else {\n if (!config.schema.facts) {\n console.warn(\"[Directive] Module schema.facts is required\");\n }\n // derivations, events, and requirements default to {} if not provided\n }\n\n // Validate derive keys match schema.derivations (if either is provided)\n const schemaDerivations = config.schema?.derivations ?? {};\n const deriveImpl = config.derive ?? {};\n const schemaDerivationKeys = new Set(Object.keys(schemaDerivations));\n const deriveKeys = new Set(Object.keys(deriveImpl));\n\n for (const key of deriveKeys) {\n if (!schemaDerivationKeys.has(key)) {\n console.warn(\n `[Directive] Derivation \"${key}\" not declared in schema.derivations`,\n );\n }\n }\n for (const key of schemaDerivationKeys) {\n if (!deriveKeys.has(key)) {\n console.warn(\n `[Directive] schema.derivations[\"${key}\"] has no matching implementation in derive`,\n );\n }\n }\n\n // Validate events keys match schema.events (if either is provided)\n const schemaEvents = config.schema?.events ?? {};\n const eventImpl = config.events ?? {};\n const schemaEventKeys = new Set(Object.keys(schemaEvents));\n const eventKeys = new Set(Object.keys(eventImpl));\n\n for (const key of eventKeys) {\n if (!schemaEventKeys.has(key)) {\n console.warn(\n `[Directive] Event \"${key}\" not declared in schema.events`,\n );\n }\n }\n for (const key of schemaEventKeys) {\n if (!eventKeys.has(key)) {\n console.warn(\n `[Directive] schema.events[\"${key}\"] has no matching handler in events`,\n );\n }\n }\n\n // Validate history.snapshotEvents reference valid event names\n if (config.history?.snapshotEvents) {\n if (config.history.snapshotEvents.length === 0) {\n console.warn(\n \"[Directive] history.snapshotEvents is an empty array — no events will create history snapshots. \" +\n \"Omit history.snapshotEvents entirely to snapshot all events, or list specific events.\",\n );\n }\n const schemaEventKeysForValidation = new Set(\n Object.keys(config.schema?.events ?? {}),\n );\n for (const eventName of config.history.snapshotEvents) {\n if (!schemaEventKeysForValidation.has(eventName)) {\n console.warn(\n `[Directive] history.snapshotEvents entry \"${eventName}\" not declared in schema.events. ` +\n `Available events: ${[...schemaEventKeysForValidation].join(\", \") || \"(none)\"}`,\n );\n }\n }\n }\n\n // Validate resolvers reference valid requirement types\n if (config.resolvers && config.schema?.requirements) {\n const requirementTypes = new Set(Object.keys(config.schema.requirements));\n for (const [resolverName, resolver] of Object.entries(config.resolvers)) {\n const resolverDef = resolver as { requirement?: string };\n if (\n typeof resolverDef.requirement === \"string\" &&\n !requirementTypes.has(resolverDef.requirement)\n ) {\n console.warn(\n `[Directive] Resolver \"${resolverName}\" references unknown requirement type \"${resolverDef.requirement}\". ` +\n `Available types: ${[...requirementTypes].join(\", \") || \"(none)\"}`,\n );\n }\n }\n }\n }\n\n // Extract crossModuleDeps if present (for runtime proxy creation)\n const crossModuleDeps =\n \"crossModuleDeps\" in config ? config.crossModuleDeps : undefined;\n\n return {\n id,\n schema: config.schema,\n init: config.init,\n // Cast to TypedDerivationsDef for ModuleDef compatibility (runtime handles both types)\n derive: (config.derive ?? {}) as TypedDerivationsDef<M>,\n events: config.events ?? ({} as TypedEventsDef<M>),\n effects: config.effects as EffectsDef<M[\"facts\"]> | undefined,\n constraints: config.constraints as TypedConstraintsDef<M> | undefined,\n resolvers: config.resolvers,\n hooks: config.hooks,\n history: config.history,\n // Store crossModuleDeps for runtime proxy creation\n crossModuleDeps: crossModuleDeps as CrossModuleDeps | undefined,\n };\n}\n\n/**\n * Create a module factory that produces named instances from a single definition.\n * Useful for multi-instance UIs (tabs, panels, multi-tenant) where you need\n * isolated state from the same schema.\n *\n * @param config - Module configuration (same shape as `createModule` minus the `id`)\n * @returns A factory function that accepts a name and returns a `ModuleDef`\n *\n * @example\n * ```typescript\n * const chatRoom = createModuleFactory({\n * schema: {\n * facts: { messages: t.array<string>(), users: t.array<string>() },\n * derivations: { count: t.number() },\n * },\n * init: (facts) => { facts.messages = []; facts.users = []; },\n * derive: { count: (facts) => facts.messages.length },\n * });\n *\n * const system = createSystem({\n * modules: {\n * lobby: chatRoom(\"lobby\"),\n * support: chatRoom(\"support\"),\n * },\n * });\n * ```\n *\n * @public\n */\nexport function createModuleFactory<const M extends ModuleSchema>(\n config: ModuleConfig<M>,\n): (name: string) => ModuleDef<M>;\nexport function createModuleFactory<\n const M extends ModuleSchema,\n const Deps extends CrossModuleDeps,\n>(config: ModuleConfigWithDeps<M, Deps>): (name: string) => ModuleDef<M>;\n/** @internal Implementation overload — see public overloads above. */\nexport function createModuleFactory<const M extends ModuleSchema>(\n config: ModuleConfig<M> | ModuleConfigWithDeps<M, CrossModuleDeps>,\n): (name: string) => ModuleDef<M> {\n // Pass config directly — createModule's implementation overload handles both types.\n // Do NOT cast to ModuleConfig<M> which would strip crossModuleDeps.\n return (name: string) => createModule(name, config);\n}\n","/**\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 * History — 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 Facts,\n FactsStore,\n HistoryAPI,\n HistoryOption,\n Schema,\n Snapshot,\n} from \"../core/types.js\";\nimport { isPrototypeSafe } from \"./utils.js\";\n\n// ============================================================================\n// History Manager\n// ============================================================================\n\n/**\n * A changeset groups multiple snapshots into a single undo/redo unit.\n *\n * @remarks\n * Use {@link HistoryManager.beginChangeset} and\n * {@link HistoryManager.endChangeset} to create changesets. When navigating\n * with `goBack`/`goForward`, the entire changeset is traversed as one step.\n *\n * @internal\n */\nexport interface Changeset {\n label: string;\n startIndex: number;\n endIndex: number;\n}\n\n/**\n * Internal history manager that extends the public {@link HistoryAPI}\n * with snapshot capture, restoration, and pause/resume controls.\n *\n * @remarks\n * - `takeSnapshot(trigger)` records the current facts into the ring buffer.\n * - `restore(snapshot)` deserializes a snapshot back into the facts store,\n * setting `isRestoring = true` so the engine skips reconciliation.\n * - `pause()` / `resume()` temporarily suspend snapshot recording (e.g.,\n * during bulk imports or programmatic state resets).\n * - `beginChangeset(label)` / `endChangeset()` group consecutive snapshots\n * so `goBack`/`goForward` treat them as a single undo/redo unit.\n *\n * @typeParam _S - The schema type (unused at runtime but preserved for type safety).\n *\n * @internal\n */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport interface HistoryManager<_S extends Schema> extends HistoryAPI {\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 history 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/**\n * Options for creating a history manager via {@link createHistoryManager}.\n *\n * @typeParam S - The facts schema type.\n *\n * @internal\n */\nexport interface CreateHistoryOptions<S extends Schema> {\n historyOption: HistoryOption;\n facts: Facts<S>;\n store: FactsStore<S>;\n /** Callback when a snapshot is taken */\n onSnapshot?: (snapshot: Snapshot) => void;\n /** Callback when history navigation occurs */\n onHistoryChange?: (from: number, to: number) => void;\n}\n\n/**\n * Resolve a HistoryOption (boolean | HistoryConfig) into concrete values.\n * @internal\n */\nfunction resolveHistoryOption(option: HistoryOption): {\n enabled: boolean;\n maxSnapshots: number;\n} {\n if (typeof option === \"boolean\") {\n return { enabled: option, maxSnapshots: 100 };\n }\n\n // Object config — presence implies enabled\n return {\n enabled: true,\n maxSnapshots: option.maxSnapshots ?? 100,\n };\n}\n\n/**\n * Create a snapshot-based history manager backed by a ring buffer.\n *\n * @remarks\n * Snapshots are taken automatically after fact changes (during reconciliation)\n * and can be navigated with `goBack`/`goForward`/`goTo`. Use\n * `beginChangeset(label)` and `endChangeset()` to group multiple snapshots\n * into a single undo/redo unit. The entire history can be exported to JSON\n * via `export()` and re-imported with `import()` for cross-session debugging.\n *\n * Call `pause()` to temporarily stop recording snapshots (e.g., during bulk\n * fact imports) and `resume()` to re-enable recording.\n *\n * @param options - History config, facts proxy, store, and optional snapshot/history callbacks.\n * @returns A {@link HistoryManager} with snapshot capture, navigation, changeset, and export/import methods.\n *\n * @internal\n */\nexport function createHistoryManager<S extends Schema>(\n options: CreateHistoryOptions<S>,\n): HistoryManager<S> {\n const { historyOption, facts, store, onSnapshot, onHistoryChange } = options;\n\n const { enabled: isEnabled, maxSnapshots } =\n resolveHistoryOption(historyOption);\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: HistoryManager<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 onHistoryChange?.(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 onHistoryChange?.(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 onHistoryChange?.(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 history data: expected object\");\n }\n if (data.version !== 1) {\n throw new Error(\n `Unsupported history export version: ${data.version}`,\n );\n }\n if (!Array.isArray(data.snapshots)) {\n throw new Error(\"Invalid history data: snapshots must be an array\");\n }\n if (typeof data.currentIndex !== \"number\") {\n throw new Error(\n \"Invalid history 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 history 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 history manager for use when history is disabled.\n *\n * @remarks\n * All methods are safe to call but perform no work. This avoids null-checks\n * throughout the engine -- callers can use the same {@link HistoryManager}\n * interface regardless of whether history is enabled.\n *\n * @returns A {@link HistoryManager} where every method is a no-op and `isEnabled` is `false`.\n *\n * @internal\n */\nexport function createDisabledHistory<\n S extends Schema,\n>(): HistoryManager<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 identity string for a requirement.\n *\n * When no custom key function is provided, the ID is formed from the\n * requirement's `type` plus a deterministic JSON serialization of its\n * remaining properties. A custom {@link RequirementKeyFn} can override\n * this to control deduplication granularity.\n *\n * @param req - The requirement to generate an ID for.\n * @param keyFn - Optional custom key function that overrides the default identity logic.\n * @returns A stable string that uniquely identifies this requirement for deduplication.\n *\n * @public\n */\n/** Cache for default requirement IDs (no custom keyFn) to avoid repeated stableStringify */\nconst reqIdCache = new WeakMap<Requirement, string>();\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 // Check cache first\n const cached = reqIdCache.get(req);\n if (cached !== undefined) {\n return cached;\n }\n\n // Default: type + stable JSON of other properties\n const { type, ...rest } = req;\n const sortedRest = stableStringify(rest);\n const id = `${type}:${sortedRest}`;\n\n reqIdCache.set(req, id);\n\n return id;\n}\n\n/**\n * Create a {@link RequirementWithId} by pairing a requirement with its\n * computed identity string and the constraint that produced it.\n *\n * @param requirement - The raw requirement object.\n * @param fromConstraint - Name of the constraint that emitted this requirement.\n * @param keyFn - Optional custom key function forwarded to {@link generateRequirementId}.\n * @returns A requirement bundled with its stable ID and originating constraint name.\n *\n * @public\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 * Create a typed requirement factory for a given requirement type string.\n *\n * Returns a function that, when called with a properties object, produces a\n * fully-typed {@link Requirement} whose `type` field is the literal `T`.\n * This is the recommended way to build requirements inside constraint\n * definitions because it keeps the type string in one place and gives you\n * full TypeScript inference on the payload.\n *\n * @param type - The requirement type string (e.g. `\"FETCH_USER\"`).\n * @returns A factory that merges `type` with arbitrary properties into a typed requirement.\n *\n * @example\n * ```typescript\n * const fetchUser = req(\"FETCH_USER\");\n *\n * // Use inside a module's constraint definition\n * constraints: {\n * needsUser: {\n * when: (facts) => facts.userId && !facts.user,\n * require: fetchUser({ userId: 123, priority: \"high\" }),\n * },\n * }\n *\n * // Produces: { type: \"FETCH_USER\", userId: 123, priority: \"high\" }\n * ```\n *\n * @public\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 * Type-narrowing guard that checks whether a requirement's `type` matches the\n * given string literal.\n *\n * After this guard returns `true`, TypeScript narrows `req` to\n * `Requirement & { type: T }`, giving you access to type-specific fields.\n *\n * @param req - The requirement to test.\n * @param type - The expected type string to match against.\n * @returns `true` when `req.type === type`.\n *\n * @public\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 function suitable for a resolver's `requirement`\n * predicate field.\n *\n * @remarks\n * The returned predicate narrows any {@link Requirement} to the concrete\n * type `R` (or `Requirement & { type: T }` when no explicit generic is\n * provided). This is a cleaner alternative to writing verbose inline type\n * guards in every resolver definition.\n *\n * @param type - The requirement type string to match.\n * @returns A predicate that returns `true` for requirements whose `type` matches, narrowing the value for downstream callbacks like `key` and `resolve`.\n *\n * @example\n * ```typescript\n * // With an explicit requirement interface (recommended for complex payloads)\n * interface FetchUserReq { type: \"FETCH_USER\"; userId: string }\n * requirement: forType<FetchUserReq>(\"FETCH_USER\"),\n * key: (req) => req.userId, // req is FetchUserReq\n *\n * // With a simple string literal\n * requirement: forType(\"FETCH_USER\"),\n * key: (req) => req.type, // req is Requirement & { type: \"FETCH_USER\" }\n * ```\n *\n * @public\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 };\n/** @internal Implementation overload — see public overloads above. */\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 deduplicated collection of {@link RequirementWithId} entries keyed by\n * their identity string.\n *\n * @remarks\n * Requirements are uniquely identified by their ID (generated from type +\n * properties via {@link generateRequirementId}). When adding a requirement\n * whose ID already exists, the first entry wins and the duplicate is\n * silently ignored. The {@link RequirementSet.diff | diff} method computes\n * added, removed, and unchanged entries relative to another set, which the\n * engine uses during reconciliation.\n *\n * @example\n * ```typescript\n * const set = new RequirementSet();\n * set.add(createRequirementWithId({ type: \"FETCH_USER\", userId: 1 }, \"c1\"));\n * set.add(createRequirementWithId({ type: \"FETCH_USER\", userId: 1 }, \"c2\")); // ignored\n * console.log(set.size); // 1\n *\n * const next = new RequirementSet();\n * next.add(createRequirementWithId({ type: \"FETCH_USER\", userId: 2 }, \"c1\"));\n * const { added, removed } = next.diff(set);\n * // added has userId: 2, removed has userId: 1\n * ```\n *\n * @public\n */\nexport class RequirementSet {\n private map = new Map<string, RequirementWithId>();\n\n /**\n * Add a requirement to the set (first-wins deduplication).\n *\n * @param req - The requirement with its computed ID to insert.\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 /**\n * Remove a requirement by its identity string.\n *\n * @param id - The requirement identity string to remove.\n * @returns `true` if the requirement existed and was removed.\n */\n remove(id: string): boolean {\n return this.map.delete(id);\n }\n\n /**\n * Check whether a requirement with the given ID is in the set.\n *\n * @param id - The requirement identity string to look up.\n * @returns `true` if the set contains a requirement with this ID.\n */\n has(id: string): boolean {\n return this.map.has(id);\n }\n\n /**\n * Retrieve a requirement by its identity string.\n *\n * @param id - The requirement identity string to look up.\n * @returns The matching requirement, or `undefined` if not found.\n */\n get(id: string): RequirementWithId | undefined {\n return this.map.get(id);\n }\n\n /**\n * Return a snapshot array of all requirements in the set.\n *\n * @returns A new array containing every {@link RequirementWithId} in insertion order.\n */\n all(): RequirementWithId[] {\n return [...this.map.values()];\n }\n\n /**\n * Return a snapshot array of all requirement identity strings.\n *\n * @returns A new array of ID strings in insertion order.\n */\n ids(): string[] {\n return [...this.map.keys()];\n }\n\n /**\n * The number of requirements currently in the set.\n */\n get size(): number {\n return this.map.size;\n }\n\n /**\n * Remove all requirements from the set.\n */\n clear(): void {\n this.map.clear();\n }\n\n /**\n * Create a shallow copy of this set.\n *\n * @returns A new {@link RequirementSet} containing the same entries.\n */\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 /**\n * Compute the difference between this set and another.\n *\n * @param other - The previous set to compare against.\n * @returns An object with `added` (in this but not other), `removed` (in other but not this), and `unchanged` arrays.\n */\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 *\n * @returns The active {@link TrackingContext}, or a null context (no-op) if\n * no tracking is active.\n *\n * @internal\n */\nexport function getCurrentTracker(): TrackingContext {\n return trackingStack[trackingStack.length - 1] ?? nullContext;\n}\n\n/**\n * Check if dependency tracking is currently active.\n *\n * @returns `true` if inside a {@link withTracking} call, `false` otherwise.\n *\n * @internal\n */\nexport function isTracking(): boolean {\n return trackingStack.length > 0;\n}\n\n/**\n * Run a function with dependency tracking.\n *\n * @remarks\n * Pushes a fresh tracking context onto the stack, executes `fn`, then pops\n * the context. Any fact reads inside `fn` are recorded as dependencies.\n * Nesting is supported — inner calls get their own independent context.\n *\n * @param fn - The function to execute under tracking.\n * @returns An object with the computed `value` and a `deps` Set of accessed\n * fact keys.\n *\n * @internal\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 *\n * @remarks\n * Temporarily clears the tracking stack so that fact reads inside `fn` do\n * not register as dependencies. The stack is restored after `fn` returns\n * (even on error). Useful for side-effect reads that should not trigger\n * derivation invalidation.\n *\n * @param fn - The function to execute without tracking.\n * @returns The return value of `fn`.\n *\n * @internal\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 (loop avoids spread overflow with deep stacks)\n for (const ctx of saved) {\n trackingStack.push(ctx);\n }\n }\n}\n\n/**\n * Track a specific key in the current context.\n *\n * @remarks\n * No-op if no tracking context is active.\n *\n * @param key - The fact key to record as a dependency.\n *\n * @internal\n */\nexport function trackAccess(key: string): void {\n getCurrentTracker().track(key);\n}\n\n/**\n * Prototype pollution guard — shared across all proxy handlers.\n *\n * @remarks\n * Contains `__proto__`, `constructor`, and `prototype`. Every proxy `get`\n * and `has` trap checks this set and returns `undefined` / `false` for\n * matching keys, preventing prototype pollution via proxy-based objects.\n *\n * @internal\n */\nexport const BLOCKED_PROPS: ReadonlySet<string> = Object.freeze(\n new Set([\"__proto__\", \"constructor\", \"prototype\"]),\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/**\n * Manager returned by {@link createConstraintsManager} that evaluates\n * constraint rules against the current facts and produces unmet\n * {@link RequirementWithId | requirements}.\n *\n * @internal\n */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport interface ConstraintsManager<_S extends Schema> {\n /**\n * Evaluate all enabled constraints and return unmet requirements.\n *\n * @remarks\n * On the first call (or when `changedKeys` is empty), every enabled\n * constraint is evaluated. On subsequent calls, only constraints whose\n * tracked dependencies overlap with `changedKeys` are re-evaluated.\n * Sync constraints run first, async constraints run in parallel, and\n * `after` ordering is respected across multiple passes.\n *\n * @param changedKeys - Fact keys that changed since the last evaluation.\n * When omitted or empty, all constraints are evaluated.\n * @returns An array of {@link RequirementWithId} representing unmet requirements.\n */\n evaluate(changedKeys?: Set<string>): Promise<RequirementWithId[]>;\n /**\n * Get the current state of a constraint by its definition ID.\n *\n * @param id - The constraint definition ID.\n * @returns The {@link ConstraintState}, or `undefined` if the ID is unknown.\n */\n getState(id: string): ConstraintState | undefined;\n /**\n * Get the state of every registered constraint.\n *\n * @returns An array of all {@link ConstraintState} objects.\n */\n getAllStates(): ConstraintState[];\n /**\n * Disable a constraint so it is skipped during evaluation.\n *\n * @param id - The constraint definition ID.\n */\n disable(id: string): void;\n /**\n * Re-enable a previously disabled constraint.\n *\n * @param id - The constraint definition ID.\n */\n enable(id: string): void;\n /**\n * Mark all constraints that depend on `factKey` as dirty so they are\n * re-evaluated on the next {@link ConstraintsManager.evaluate | evaluate} call.\n *\n * @param factKey - The fact store key that changed.\n */\n invalidate(factKey: string): void;\n /**\n * Get the auto-tracked or explicit dependency set for a constraint.\n *\n * @param id - The constraint definition ID.\n * @returns A `Set` of fact keys, or `undefined` if no dependencies have been recorded.\n */\n getDependencies(id: string): Set<string> | undefined;\n /**\n * Record that a constraint's resolver completed successfully, unblocking\n * any constraints that list it in their `after` array.\n *\n * @param constraintId - The constraint definition ID whose resolver finished.\n */\n markResolved(constraintId: string): void;\n /**\n * Check whether a constraint is currently disabled.\n *\n * @param id - The constraint definition ID.\n * @returns `true` if the constraint has been disabled via {@link ConstraintsManager.disable | disable}.\n */\n isDisabled(id: string): boolean;\n /**\n * Check whether a constraint has been marked as resolved.\n *\n * @param constraintId - The constraint definition ID.\n * @returns `true` if {@link ConstraintsManager.markResolved | markResolved} was called for this constraint.\n */\n isResolved(constraintId: string): boolean;\n /**\n * Register additional constraint definitions at runtime (used for dynamic\n * module registration).\n *\n * @remarks\n * Rebuilds the topological order and reverse dependency map so new `after`\n * dependencies are validated for cycles and indexed.\n *\n * @param newDefs - New constraint definitions to merge into the manager.\n */\n registerDefinitions(newDefs: ConstraintsDef<Schema>): void;\n /**\n * Override an existing constraint definition.\n * Stores the original in an internal map for inspection.\n *\n * @param id - The constraint definition ID to override.\n * @param def - The new constraint definition.\n * @throws If no constraint with this ID exists.\n */\n assignDefinition(id: string, def: ConstraintsDef<Schema>[string]): void;\n /**\n * Remove a constraint definition and all its internal state.\n *\n * @param id - The constraint definition ID to remove.\n */\n unregisterDefinition(id: string): void;\n /**\n * Evaluate a single constraint and emit its requirement if active.\n * Props are merged into the requirement object.\n *\n * @param id - The constraint definition ID.\n * @param props - Optional properties to merge into the requirement.\n * @returns The emitted requirements (if any).\n */\n callOne(id: string, props?: Record<string, unknown>): Promise<RequirementWithId[]>;\n}\n\n/**\n * Configuration options accepted by {@link createConstraintsManager}.\n *\n * @internal\n */\nexport interface CreateConstraintsOptions<S extends Schema> {\n /** Constraint definitions keyed by ID. */\n definitions: ConstraintsDef<S>;\n /** Proxy-based facts object used to evaluate `when()` predicates. */\n facts: Facts<S>;\n /** Custom key functions for requirement deduplication, keyed by constraint ID. */\n requirementKeys?: Record<string, RequirementKeyFn>;\n /** Default timeout in milliseconds for async constraint evaluation (defaults to 5 000). */\n defaultTimeout?: number;\n /** Called after each constraint evaluation with the constraint ID and whether `when()` was active. */\n onEvaluate?: (id: string, active: boolean) => void;\n /** Called when a constraint's `when()` or `require()` throws. */\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 * @remarks\n * Constraints are evaluated in priority order (higher priority first), with\n * topological ordering for same-priority constraints connected by `after`\n * dependencies. The manager supports sync and async `when()` predicates,\n * incremental evaluation based on changed fact keys, and per-constraint\n * enable/disable toggling. Cycle detection runs eagerly at construction time\n * to prevent deadlocks in production.\n *\n * @param options - Configuration including constraint definitions, facts proxy,\n * custom requirement key functions, and lifecycle callbacks.\n * @returns A {@link ConstraintsManager} for evaluating, invalidating, and\n * managing constraint lifecycle.\n *\n * @example\n * ```typescript\n * const constraints = createConstraintsManager({\n * definitions: {\n * mustTransition: {\n * priority: 50,\n * when: (facts) => facts.phase === \"red\" && facts.elapsed > 30,\n * require: { type: \"TRANSITION\", to: \"green\" },\n * },\n * },\n * facts: factsProxy,\n * onEvaluate: (id, active) => console.log(id, active),\n * });\n *\n * const unmet = await constraints.evaluate();\n * ```\n *\n * @internal\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 dependsOnMe.clear();\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 // Short-circuit: skip full remove/add cycle when deps haven't changed\n if (oldDeps.size === newDeps.size && oldDeps.size > 0) {\n let same = true;\n for (const dep of newDeps) {\n if (!oldDeps.has(dep)) {\n same = false;\n break;\n }\n }\n if (same) {\n return;\n }\n }\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) {\n return false;\n }\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) {\n return false;\n }\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) {\n return { requirements: [], deps: new Set() };\n }\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) {\n return priorityDiff;\n }\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) {\n return true;\n }\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 let hasAfterDeps = false;\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 if (def.after?.length) {\n hasAfterDeps = true;\n }\n }\n // Invalidate cached sort order\n sortedConstraintIds = null;\n // Only rebuild topo order when new constraints have `after` dependencies\n if (hasAfterDeps) {\n detectCyclesAndComputeTopoOrder();\n }\n // Always rebuild reverse deps — existing constraints may reference\n // newly-added IDs in their `after` arrays (forward references)\n buildReverseDependencyMap();\n },\n\n assignDefinition(id: string, def: ConstraintsDef<Schema>[string]): void {\n if (!definitions[id]) {\n throw new Error(\n `[Directive] Cannot assign constraint \"${id}\" — it does not exist. Use register() to create it.`,\n );\n }\n\n // Replace definition\n (definitions as Record<string, unknown>)[id] = def;\n // Re-init state for the new definition\n initState(id);\n dirtyConstraints.add(id);\n // Invalidate cached sort order (priority may have changed)\n sortedConstraintIds = null;\n // Rebuild topo order + reverse deps in case `after` changed\n detectCyclesAndComputeTopoOrder();\n buildReverseDependencyMap();\n },\n\n unregisterDefinition(id: string): void {\n if (!definitions[id]) {\n return;\n }\n\n // Remove from all internal maps\n delete (definitions as Record<string, unknown>)[id];\n states.delete(id);\n disabled.delete(id);\n asyncConstraintIds.delete(id);\n dirtyConstraints.delete(id);\n noFireConstraints.delete(id);\n resolvedConstraints.delete(id);\n lastRequirements.delete(id);\n latestWhenDeps.delete(id);\n\n // Clean dependency maps\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\n // Clean reverse dependency map\n dependsOnMe.delete(id);\n for (const depSet of dependsOnMe.values()) {\n depSet.delete(id);\n }\n\n // Invalidate cached sort order\n sortedConstraintIds = null;\n // Rebuild topo order\n detectCyclesAndComputeTopoOrder();\n buildReverseDependencyMap();\n },\n\n async callOne(id: string, props?: Record<string, unknown>): Promise<RequirementWithId[]> {\n const def = definitions[id];\n if (!def) {\n throw new Error(\n `[Directive] Cannot call constraint \"${id}\" — it does not exist.`,\n );\n }\n\n // Respect disabled state\n if (disabled.has(id)) {\n return [];\n }\n\n const state = getState(id);\n let active: boolean;\n\n if (state.isAsync) {\n active = await evaluateAsync(id);\n } else {\n const result = evaluateSync(id);\n active = result instanceof Promise ? await result : result;\n }\n\n if (!active) {\n return [];\n }\n\n // Get requirements and merge props if provided\n const { requirements: reqs } = getRequirements(id);\n if (reqs.length === 0) {\n return [];\n }\n\n const keyFn = requirementKeys[id];\n const result: RequirementWithId[] = [];\n for (const req of reqs) {\n const merged = props ? { ...req, ...props } : req;\n result.push(createRequirementWithId(merged, id, keyFn));\n }\n\n return result;\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 { BLOCKED_PROPS, 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 /** Override an existing derivation function */\n assignDefinition(id: string, fn: DerivationsDef<S>[keyof DerivationsDef<S>]): void;\n /** Remove a derivation and clean up its state */\n unregisterDefinition(id: string): void;\n /** Compute a derivation immediately (ignores cache) */\n callOne(id: string): unknown;\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\n * lifecycle callbacks.\n * @returns A {@link DerivationsManager} for accessing, invalidating, and\n * subscribing to derived values.\n *\n * @internal\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 // 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 // Short-circuit: skip full remove/add cycle when deps haven't changed\n if (oldDeps.size === newDeps.size) {\n let same = true;\n for (const dep of newDeps) {\n if (!oldDeps.has(dep)) {\n same = false;\n break;\n }\n }\n if (same) {\n return;\n }\n }\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 /**\n * Invalidate a derivation and its transitive dependents using iterative\n * traversal (work queue) to avoid stack overflow on deep chains.\n *\n * Accepts an optional shared `visited` Set so that `invalidateMany` can\n * coalesce multiple root invalidations into a single traversal.\n */\n function invalidateDerivation(\n startId: string,\n visited = new Set<string>(),\n ): void {\n const queue = [startId];\n\n while (queue.length > 0) {\n const id = queue.pop()!;\n if (visited.has(id)) continue;\n visited.add(id);\n\n const state = states.get(id);\n if (!state || state.isStale) continue;\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 // Queue transitive dependents\n const dependents = derivedToDerivedDeps.get(id);\n if (dependents) {\n for (const dependent of dependents) {\n queue.push(dependent);\n }\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\") {\n return undefined;\n }\n if (BLOCKED_PROPS.has(prop)) {\n return undefined;\n }\n\n // Return undefined for unknown derivation keys instead of throwing.\n // React 19 dev-mode traverses objects accessing $$typeof, toJSON, then, etc.\n if (!definitions[prop as keyof D]) {\n return undefined;\n }\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 set() {\n return false;\n },\n\n deleteProperty() {\n return false;\n },\n\n defineProperty() {\n return false;\n },\n\n getPrototypeOf() {\n return null;\n },\n\n setPrototypeOf() {\n return false;\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 const visited = new Set<string>();\n try {\n for (const id of dependents) {\n invalidateDerivation(id, visited);\n }\n } finally {\n invalidationDepth--;\n flushNotifications();\n }\n },\n\n invalidateMany(factKeys: Iterable<string>): void {\n invalidationDepth++;\n // Share a single visited Set across all root invalidations so\n // transitive dependents are only processed once.\n const visited = new Set<string>();\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, visited);\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 assignDefinition(id: string, fn: DerivationsDef<S>[keyof DerivationsDef<S>]): void {\n if (!definitions[id as keyof D]) {\n throw new Error(\n `[Directive] Cannot assign derivation \"${id}\" — it does not exist. Use register() to create it.`,\n );\n }\n\n // Replace definition\n (definitions as Record<string, unknown>)[id] = fn;\n\n // Mark stale so it recomputes with the new function\n const state = states.get(id);\n if (state) {\n state.isStale = true;\n pendingNotifications.add(id);\n }\n\n flushNotifications();\n },\n\n unregisterDefinition(id: string): void {\n if (!definitions[id as keyof D]) {\n return;\n }\n\n // Clean up dependency maps\n const state = states.get(id);\n if (state) {\n for (const dep of state.dependencies) {\n if (states.has(dep)) {\n const depSet = derivedToDerivedDeps.get(dep);\n depSet?.delete(id);\n if (depSet && depSet.size === 0) {\n derivedToDerivedDeps.delete(dep);\n }\n } else {\n const depSet = factToDerivedDeps.get(dep);\n depSet?.delete(id);\n if (depSet && depSet.size === 0) {\n factToDerivedDeps.delete(dep);\n }\n }\n }\n }\n\n // Invalidate dependents (derivations that depend on this one)\n const dependents = derivedToDerivedDeps.get(id);\n if (dependents) {\n invalidationDepth++;\n try {\n for (const dependent of dependents) {\n invalidateDerivation(dependent);\n }\n } finally {\n invalidationDepth--;\n }\n derivedToDerivedDeps.delete(id);\n }\n\n // Remove from all maps\n delete (definitions as Record<string, unknown>)[id];\n states.delete(id);\n listeners.delete(id);\n pendingNotifications.delete(id);\n\n flushNotifications();\n },\n\n callOne(id: string): unknown {\n const def = definitions[id as keyof D];\n if (!def) {\n throw new Error(\n `[Directive] Cannot call derivation \"${id}\" — it does not exist.`,\n );\n }\n\n // Always recompute (call ignores cache)\n return computeDerivation(id);\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/**\n * Manager returned by {@link createEffectsManager} that runs fire-and-forget\n * side effects after facts stabilize.\n *\n * @internal\n */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport interface EffectsManager<_S extends Schema = Schema> {\n /**\n * Run all effects whose tracked dependencies overlap with `changedKeys`.\n *\n * @remarks\n * Effects with no recorded dependencies (first run or auto-tracked with no\n * reads) run on any change. After execution, a snapshot of current facts is\n * stored for the `prev` parameter on the next invocation.\n *\n * @param changedKeys - Fact keys that changed since the last run.\n */\n runEffects(changedKeys: Set<string>): Promise<void>;\n /**\n * Run every enabled effect unconditionally, regardless of dependencies.\n */\n runAll(): Promise<void>;\n /**\n * Disable an effect so it is skipped during subsequent runs.\n *\n * @param id - The effect definition ID.\n */\n disable(id: string): void;\n /**\n * Re-enable a previously disabled effect.\n *\n * @param id - The effect definition ID.\n */\n enable(id: string): void;\n /**\n * Check whether an effect is currently enabled.\n *\n * @param id - The effect definition ID.\n * @returns `true` if the effect has not been disabled.\n */\n isEnabled(id: string): boolean;\n /**\n * Invoke every stored cleanup function and mark the manager as stopped.\n *\n * @remarks\n * After this call, any cleanup functions returned by in-flight async effects\n * will be invoked immediately rather than stored.\n */\n cleanupAll(): void;\n /**\n * Register additional effect definitions at runtime (used for dynamic\n * module registration).\n *\n * @param newDefs - New effect definitions to merge into the manager.\n */\n registerDefinitions(newDefs: EffectsDef<Schema>): void;\n /**\n * Override an existing effect definition. Runs cleanup of the old effect first.\n *\n * @param id - The effect definition ID to override.\n * @param def - The new effect definition.\n * @throws If no effect with this ID exists.\n */\n assignDefinition(id: string, def: EffectsDef<Schema>[string]): void;\n /**\n * Remove an effect definition. Runs cleanup (try-catch) and removes from state.\n *\n * @param id - The effect definition ID to remove.\n */\n unregisterDefinition(id: string): void;\n /**\n * Execute an effect's `run()` function immediately.\n *\n * @param id - The effect definition ID.\n */\n callOne(id: string): Promise<void>;\n}\n\n/** Number of consecutive identical dep sets before skipping re-tracking */\nconst STABLE_THRESHOLD = 3;\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 /** How many consecutive runs produced the same deps (auto-tracked only) */\n stableRunCount: number;\n /** Once true, skip withTracking() overhead until a tracked fact mutates */\n depsStable: boolean;\n}\n\n/**\n * Configuration options accepted by {@link createEffectsManager}.\n *\n * @internal\n */\nexport interface CreateEffectsOptions<S extends Schema> {\n /** Effect definitions keyed by ID. */\n definitions: EffectsDef<S>;\n /** Proxy-based facts object passed to effect `run()` functions. */\n facts: Facts<S>;\n /** Underlying fact store used for `batch()` coalescing of mutations. */\n store: FactsStore<S>;\n /** Called when an effect executes, with the fact keys that triggered it. */\n onRun?: (id: string, deps: string[]) => void;\n /** Called when an effect's `run()` or cleanup function throws. */\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 * @remarks\n * Effects support two dependency modes:\n *\n * - **Auto-tracked** (no `deps`): Dependencies are re-tracked on every run\n * via {@link withTracking}, so conditional fact reads are always captured.\n * Only synchronous reads are tracked; reads after an `await` are invisible.\n *\n * - **Explicit `deps`**: A fixed array of fact keys declared on the definition.\n * Preferred for async effects where auto-tracking cannot cross `await`\n * boundaries.\n *\n * Each effect can return a cleanup function that runs before the next\n * execution or when {@link EffectsManager.cleanupAll | cleanupAll} is called.\n * Errors in effects are isolated via try-catch and never break the\n * reconciliation loop. Synchronous fact mutations inside effects are\n * coalesced with `store.batch()`.\n *\n * @param options - Configuration including effect definitions, facts proxy,\n * store, and lifecycle callbacks.\n * @returns An {@link EffectsManager} for running, enabling/disabling, and\n * cleaning up effects.\n *\n * @example\n * ```typescript\n * const effects = createEffectsManager({\n * definitions: {\n * logPhase: {\n * run: (facts, prev) => {\n * if (prev?.phase !== facts.phase) {\n * console.log(`Phase changed to ${facts.phase}`);\n * }\n * },\n * },\n * },\n * facts: factsProxy,\n * store: factsStore,\n * });\n *\n * await effects.runEffects(new Set([\"phase\"]));\n * ```\n *\n * @internal\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 stableRunCount: 0,\n depsStable: false,\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) {\n return false;\n }\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)) {\n // Reset dep stability when a tracked fact changes so the next run\n // re-tracks via withTracking() and can discover new conditional reads.\n if (state.depsStable) {\n state.depsStable = false;\n state.stableRunCount = 0;\n }\n\n return true;\n }\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 if (state.depsStable && state.dependencies) {\n // Deps have been stable for STABLE_THRESHOLD runs — skip withTracking()\n // overhead and just run the effect directly.\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 } else {\n // Auto-tracked: re-track dependencies so conditional reads are picked up\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 const 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 // Check dep stability: if deps match previous run, increment counter\n if (\n state.dependencies &&\n trackedDeps.size === state.dependencies.size\n ) {\n let same = true;\n for (const dep of trackedDeps) {\n if (!state.dependencies.has(dep)) {\n same = false;\n break;\n }\n }\n if (same) {\n state.stableRunCount++;\n if (state.stableRunCount >= STABLE_THRESHOLD) {\n state.depsStable = true;\n }\n } else {\n state.stableRunCount = 0;\n state.depsStable = false;\n }\n } else {\n state.stableRunCount = 0;\n state.depsStable = false;\n }\n\n // Update tracked dependencies\n state.dependencies = trackedDeps.size > 0 ? trackedDeps : null;\n }\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 // Reset dep stability — we don't know what the effect would have read\n if (!state.hasExplicitDeps) {\n state.stableRunCount = 0;\n state.depsStable = false;\n }\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 // Reset stability so runEffect re-tracks deps\n // (runAll bypasses shouldRun where the normal reset lives)\n state.depsStable = false;\n state.stableRunCount = 0;\n\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 assignDefinition(id: string, def: EffectsDef<S>[string]): void {\n if (!definitions[id]) {\n throw new Error(\n `[Directive] Cannot assign effect \"${id}\" — it does not exist. Use register() to create it.`,\n );\n }\n\n // Run cleanup of old effect before replacing\n const state = states.get(id);\n if (state) {\n runCleanup(state);\n }\n\n // Replace definition and re-init state\n (definitions as Record<string, unknown>)[id] = def;\n initState(id);\n },\n\n unregisterDefinition(id: string): void {\n if (!definitions[id]) {\n return;\n }\n\n // Run cleanup (try-catch inside runCleanup)\n const state = states.get(id);\n if (state) {\n runCleanup(state);\n }\n\n // Remove from all maps\n delete (definitions as Record<string, unknown>)[id];\n states.delete(id);\n },\n\n async callOne(id: string): Promise<void> {\n const def = definitions[id];\n if (!def) {\n throw new Error(\n `[Directive] Cannot call effect \"${id}\" — it does not exist.`,\n );\n }\n\n const state = getState(id);\n if (!state.enabled) {\n return;\n }\n\n // Run cleanup of previous run\n runCleanup(state);\n\n onRun?.(id, state.dependencies ? [...state.dependencies] : []);\n\n try {\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 } catch (error) {\n onError?.(id, error);\n console.error(`[Directive] Effect \"${id}\" threw an error:`, error);\n }\n },\n };\n\n return manager;\n}\n","/**\n * Proxy-based accessors for the engine's derive and events surfaces.\n *\n * Extracted from engine.ts to reduce file size. Pure proxy creation —\n * all state mutation is delegated to callbacks.\n *\n * @internal\n */\n\nimport type { DefinitionsRegistry } from \"./engine-definitions.js\";\nimport { BLOCKED_PROPS } from \"./tracking.js\";\n\n// ============================================================================\n// Derive Accessor\n// ============================================================================\n\n/**\n * Options for creating the derive accessor proxy.\n *\n * @internal\n */\nexport interface CreateDeriveAccessorOptions {\n /** Merged derivation definitions (mutable reference, checked for key existence) */\n mergedDerive: Record<string, unknown>;\n /** Retrieve a computed derivation value by key */\n getDerivation: (key: string) => unknown;\n /** Definitions registry for dynamic definition methods */\n definitions: DefinitionsRegistry;\n}\n\n/**\n * Create a proxy that provides `system.derive.key` access to derivation values\n * plus dynamic definition methods (register, assign, unregister, etc.).\n *\n * @param options - Derivation definitions, getter, and dynamic registry\n * @returns A proxy combining derivation value access with definition management\n *\n * @internal\n */\nexport function createDeriveAccessor(\n options: CreateDeriveAccessorOptions,\n): Record<string, unknown> {\n const { mergedDerive, getDerivation, definitions } = options;\n\n // Method properties for derive accessor (dynamic definitions API)\n const deriveMethods: Record<string, unknown> = {\n register: (id: string, fn: unknown) =>\n definitions.register(\"derivation\", id, fn),\n assign: (id: string, fn: unknown) =>\n definitions.assign(\"derivation\", id, fn),\n unregister: (id: string) => definitions.unregister(\"derivation\", id),\n call: (id: string) => definitions.call(\"derivation\", id),\n isDynamic: (id: string) => definitions.isDynamic(\"derivation\", id),\n listDynamic: () => definitions.listDynamic(\"derivation\"),\n };\n\n return new Proxy({} as Record<string, unknown>, {\n get(_, prop: string | symbol) {\n if (typeof prop === \"symbol\") {\n return undefined;\n }\n // Prototype pollution protection\n if (BLOCKED_PROPS.has(prop)) {\n return undefined;\n }\n // Check for method properties first (register, assign, etc.)\n if (prop in deriveMethods) {\n return deriveMethods[prop];\n }\n // Return undefined for unknown derivation keys instead of throwing.\n // React 19 dev-mode traverses objects accessing $$typeof, toJSON, then, etc.\n if (!(prop in mergedDerive)) {\n return undefined;\n }\n return getDerivation(prop);\n },\n has(_, prop: string | symbol) {\n if (typeof prop === \"symbol\") {\n return false;\n }\n // Prototype pollution protection\n if (BLOCKED_PROPS.has(prop)) {\n return false;\n }\n return prop in mergedDerive || prop in deriveMethods;\n },\n ownKeys() {\n return Object.keys(mergedDerive);\n },\n getOwnPropertyDescriptor(_, prop: string | symbol) {\n if (typeof prop === \"symbol\") {\n return undefined;\n }\n // Prototype pollution protection\n if (BLOCKED_PROPS.has(prop)) {\n return undefined;\n }\n if (prop in mergedDerive || prop in deriveMethods) {\n return { configurable: true, enumerable: true };\n }\n return undefined;\n },\n set() {\n return false;\n },\n defineProperty() {\n return false;\n },\n getPrototypeOf() {\n return null;\n },\n setPrototypeOf() {\n return false;\n },\n });\n}\n\n// ============================================================================\n// Events Accessor\n// ============================================================================\n\n/**\n * Options for creating the events accessor proxy.\n *\n * @internal\n */\nexport interface CreateEventsAccessorOptions {\n /** Merged event definitions (mutable reference, checked for key existence) */\n mergedEvents: Record<string, unknown>;\n /** Dispatch an event by name with optional payload */\n dispatchEvent: (eventName: string, payload?: Record<string, unknown>) => void;\n}\n\n/**\n * Create a proxy that provides `system.events.eventName(payload)` syntax.\n * Dispatching is delegated to the provided callback.\n *\n * @param options - Event definitions and dispatch callback\n * @returns A proxy that returns dispatch functions per event name\n *\n * @internal\n */\nexport function createEventsAccessor(\n options: CreateEventsAccessorOptions,\n): Record<string, (payload?: Record<string, unknown>) => void> {\n const { mergedEvents, dispatchEvent } = options;\n\n return new Proxy(\n {} as Record<string, (payload?: Record<string, unknown>) => void>,\n {\n get(_, prop: string | symbol) {\n if (typeof prop === \"symbol\") {\n return undefined;\n }\n // Prototype pollution protection\n if (BLOCKED_PROPS.has(prop)) {\n return undefined;\n }\n // Return a function that dispatches the event\n return (payload?: Record<string, unknown>) => {\n dispatchEvent(prop, payload);\n };\n },\n has(_, prop: string | symbol) {\n if (typeof prop === \"symbol\") {\n return false;\n }\n // Prototype pollution protection\n if (BLOCKED_PROPS.has(prop)) {\n return false;\n }\n return prop in mergedEvents;\n },\n ownKeys() {\n return Object.keys(mergedEvents);\n },\n getOwnPropertyDescriptor(_, prop: string | symbol) {\n if (typeof prop === \"symbol\") {\n return undefined;\n }\n // Prototype pollution protection\n if (BLOCKED_PROPS.has(prop)) {\n return undefined;\n }\n if (prop in mergedEvents) {\n return { configurable: true, enumerable: true };\n }\n return undefined;\n },\n set() {\n return false;\n },\n defineProperty() {\n return false;\n },\n getPrototypeOf() {\n return null;\n },\n setPrototypeOf() {\n return false;\n },\n },\n );\n}\n","/**\n * Dynamic definition registry for the engine.\n *\n * Extracted from engine.ts to reduce file size. Handles register, assign,\n * unregister, call, getOriginal, restoreOriginal, isDynamic, and listDynamic\n * for constraints, resolvers, derivations, and effects.\n *\n * @internal\n */\n\nimport type { ConstraintsManager } from \"./constraints.js\";\nimport type { DerivationsManager } from \"./derivations.js\";\nimport type { EffectsManager } from \"./effects.js\";\nimport type { PluginManager } from \"./plugins.js\";\nimport type { ResolversManager } from \"./resolvers.js\";\nimport { BLOCKED_PROPS } from \"./tracking.js\";\nimport type {\n ConstraintsDef,\n DerivationsDef,\n EffectsDef,\n ResolversDef,\n Schema,\n} from \"./types.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Definition type for dynamic registration */\nexport type DefType = \"constraint\" | \"resolver\" | \"derivation\" | \"effect\";\n\ntype DeferredOp =\n | { op: \"register\"; type: DefType; id: string; def: unknown }\n | { op: \"assign\"; type: DefType; id: string; def: unknown }\n | { op: \"unregister\"; type: DefType; id: string };\n\n// ============================================================================\n// DefinitionsRegistry Interface\n// ============================================================================\n\n/**\n * Registry for dynamic definition management (register, assign, unregister, call).\n *\n * @remarks\n * Handles deferral during reconciliation — operations queued while reconciling\n * are applied atomically after the cycle completes. Tracks which definitions\n * were dynamically registered vs. statically defined from module configs.\n *\n * @internal\n */\nexport interface DefinitionsRegistry {\n /**\n * Register a new definition. Deferred if called during reconciliation.\n *\n * @param type - The definition type\n * @param id - Unique definition identifier\n * @param def - The definition object\n * @throws If the definition already exists, or the ID is invalid\n */\n register(type: DefType, id: string, def: unknown): void;\n\n /**\n * Override an existing definition. Deferred if called during reconciliation.\n * Stores the original for later restoration.\n *\n * @param type - The definition type\n * @param id - Definition identifier to override\n * @param def - The replacement definition\n * @throws If the definition does not exist, or the ID is invalid\n */\n assign(type: DefType, id: string, def: unknown): void;\n\n /**\n * Remove a dynamically registered definition. Deferred if called during reconciliation.\n * Static (module-defined) definitions cannot be unregistered.\n *\n * @param type - The definition type\n * @param id - Definition identifier to remove\n */\n unregister(type: DefType, id: string): void;\n\n /**\n * Invoke a definition directly (evaluate constraint, run resolver, etc.).\n *\n * @param type - The definition type\n * @param id - Definition identifier to invoke\n * @param props - Optional properties/payload\n * @returns The invocation result\n */\n call(type: DefType, id: string, props?: unknown): unknown;\n\n /**\n * Check if a definition was dynamically registered.\n *\n * @param type - The definition type\n * @param id - Definition identifier\n */\n isDynamic(type: DefType, id: string): boolean;\n\n /**\n * List all dynamically registered definition IDs for a type.\n *\n * @param type - The definition type\n */\n listDynamic(type: DefType): string[];\n\n /**\n * Flush deferred registrations queued during reconciliation.\n */\n flushDeferred(): void;\n\n /**\n * Get the original definition before it was assigned/overridden.\n *\n * @param type - The definition type\n * @param id - Definition identifier\n * @returns The original definition, or undefined if not overridden\n */\n getOriginal(type: DefType, id: string): unknown | undefined;\n\n /**\n * Restore a definition to its original value (before assign).\n *\n * @param type - The definition type\n * @param id - Definition identifier\n * @returns true if restored, false if no original was found\n */\n restoreOriginal(type: DefType, id: string): boolean;\n\n /**\n * Clean up all dynamic definition state.\n */\n destroy(): void;\n}\n\n// ============================================================================\n// Factory Options\n// ============================================================================\n\n/**\n * Options for creating a definitions registry.\n *\n * @internal\n */\nexport interface CreateDefinitionsRegistryOptions<S extends Schema> {\n /** Merged constraint definitions (mutable reference) */\n mergedConstraints: ConstraintsDef<S>;\n /** Merged resolver definitions (mutable reference) */\n mergedResolvers: ResolversDef<S>;\n /** Merged derivation definitions (mutable reference) */\n mergedDerive: DerivationsDef<S>;\n /** Merged effect definitions (mutable reference) */\n mergedEffects: EffectsDef<S>;\n /** Constraints manager */\n constraintsManager: ConstraintsManager<S>;\n /** Resolvers manager */\n resolversManager: ResolversManager<S>;\n /** Derivations manager */\n derivationsManager: DerivationsManager<S, DerivationsDef<S>>;\n /** Effects manager */\n effectsManager: EffectsManager<S>;\n /** Plugin manager */\n pluginManager: PluginManager<S>;\n /** Getter for engine state flags */\n getState: () => { isDestroyed: boolean; isReconciling: boolean };\n /** Trigger reconciliation */\n scheduleReconcile: () => void;\n /** Max deferred registrations */\n maxDeferredRegistrations: number;\n}\n\n// ============================================================================\n// Implementation\n// ============================================================================\n\n/** Reserved derive method names — derivation IDs cannot use these */\nconst RESERVED_DERIVE_NAMES = new Set([\n \"register\",\n \"assign\",\n \"unregister\",\n \"call\",\n \"isDynamic\",\n \"listDynamic\",\n]);\n\n/**\n * Create a definitions registry for dynamic definition management.\n *\n * @remarks\n * Receives mutable references to the merged definition maps and manager\n * instances. Operations modify these references directly to maintain\n * atomicity with the engine's state.\n *\n * @param options - Managers, merged maps, and engine state accessors\n * @returns A {@link DefinitionsRegistry} instance\n *\n * @internal\n */\nexport function createDefinitionsRegistry<S extends Schema>(\n options: CreateDefinitionsRegistryOptions<S>,\n): DefinitionsRegistry {\n const {\n mergedConstraints,\n mergedResolvers,\n mergedDerive,\n mergedEffects,\n constraintsManager,\n resolversManager,\n derivationsManager,\n effectsManager,\n pluginManager,\n getState,\n scheduleReconcile,\n maxDeferredRegistrations,\n } = options;\n\n /** Track which definitions were dynamically registered */\n const dynamicIds = {\n constraints: new Set<string>(),\n resolvers: new Set<string>(),\n derivations: new Set<string>(),\n effects: new Set<string>(),\n };\n\n /** Originals map for assigned definitions */\n const originals = {\n constraints: new Map<string, unknown>(),\n resolvers: new Map<string, unknown>(),\n derivations: new Map<string, unknown>(),\n effects: new Map<string, unknown>(),\n };\n\n /** Deferred registrations queue */\n const deferredRegistrations: DeferredOp[] = [];\n\n /** Validate a definition ID for safety */\n function validateDefId(id: string): void {\n if (typeof id !== \"string\" || id.length === 0) {\n throw new Error(\n `[Directive] Definition ID must be a non-empty string. Received: ${String(id)}`,\n );\n }\n if (BLOCKED_PROPS.has(id)) {\n throw new Error(\n `[Directive] Security: Definition ID \"${id}\" is a blocked property.`,\n );\n }\n if (id.includes(\"::\")) {\n throw new Error(\n `[Directive] Definition ID \"${id}\" cannot contain \"::\". This separator is reserved for namespacing.`,\n );\n }\n }\n\n /** Apply a register operation immediately */\n function applyRegister(type: DefType, id: string, def: unknown): void {\n switch (type) {\n case \"constraint\": {\n if (id in mergedConstraints) {\n throw new Error(\n `[Directive] Constraint \"${id}\" already exists. Use assign() to override.`,\n );\n }\n const constraintDef = def as Record<string, unknown>;\n (mergedConstraints as Record<string, unknown>)[id] = constraintDef;\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic registration\n constraintsManager.registerDefinitions({ [id]: constraintDef } as any);\n dynamicIds.constraints.add(id);\n pluginManager.emitDefinitionRegister(type, id, def);\n scheduleReconcile();\n break;\n }\n case \"resolver\": {\n if (id in mergedResolvers) {\n throw new Error(\n `[Directive] Resolver \"${id}\" already exists. Use assign() to override.`,\n );\n }\n const resolverDef = def as Record<string, unknown>;\n (mergedResolvers as Record<string, unknown>)[id] = resolverDef;\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic registration\n resolversManager.registerDefinitions({ [id]: resolverDef } as any);\n dynamicIds.resolvers.add(id);\n pluginManager.emitDefinitionRegister(type, id, def);\n scheduleReconcile();\n break;\n }\n case \"derivation\": {\n if (RESERVED_DERIVE_NAMES.has(id)) {\n throw new Error(\n `[Directive] Derivation ID \"${id}\" conflicts with a reserved derive method name.`,\n );\n }\n if (id in mergedDerive) {\n throw new Error(\n `[Directive] Derivation \"${id}\" already exists. Use assign() to override.`,\n );\n }\n (mergedDerive as Record<string, unknown>)[id] = def;\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic registration\n derivationsManager.registerDefinitions({ [id]: def } as any);\n dynamicIds.derivations.add(id);\n pluginManager.emitDefinitionRegister(type, id, def);\n break;\n }\n case \"effect\": {\n if (id in mergedEffects) {\n throw new Error(\n `[Directive] Effect \"${id}\" already exists. Use assign() to override.`,\n );\n }\n const effectDef = def as Record<string, unknown>;\n (mergedEffects as Record<string, unknown>)[id] = effectDef;\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic registration\n effectsManager.registerDefinitions({ [id]: effectDef } as any);\n dynamicIds.effects.add(id);\n pluginManager.emitDefinitionRegister(type, id, def);\n break;\n }\n }\n }\n\n /**\n * Apply an assign operation immediately.\n * Manager's assignDefinition() is called first (may validate/throw).\n * Only on success do we commit the original and update the merged map.\n */\n function applyAssign(type: DefType, id: string, def: unknown): void {\n switch (type) {\n case \"constraint\": {\n if (!(id in mergedConstraints)) {\n throw new Error(\n `[Directive] Constraint \"${id}\" does not exist. Use register() to create it.`,\n );\n }\n const original = (mergedConstraints as Record<string, unknown>)[id];\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic assignment\n constraintsManager.assignDefinition(id, def as any);\n originals.constraints.set(id, original);\n (mergedConstraints as Record<string, unknown>)[id] = def;\n pluginManager.emitDefinitionAssign(type, id, def, original);\n scheduleReconcile();\n break;\n }\n case \"resolver\": {\n if (!(id in mergedResolvers)) {\n throw new Error(\n `[Directive] Resolver \"${id}\" does not exist. Use register() to create it.`,\n );\n }\n const original = (mergedResolvers as Record<string, unknown>)[id];\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic assignment\n resolversManager.assignDefinition(id, def as any);\n originals.resolvers.set(id, original);\n (mergedResolvers as Record<string, unknown>)[id] = def;\n pluginManager.emitDefinitionAssign(type, id, def, original);\n scheduleReconcile();\n break;\n }\n case \"derivation\": {\n if (RESERVED_DERIVE_NAMES.has(id)) {\n throw new Error(\n `[Directive] Derivation ID \"${id}\" conflicts with a reserved derive method name.`,\n );\n }\n if (!(id in mergedDerive)) {\n throw new Error(\n `[Directive] Derivation \"${id}\" does not exist. Use register() to create it.`,\n );\n }\n const original = (mergedDerive as Record<string, unknown>)[id];\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic assignment\n derivationsManager.assignDefinition(id, def as any);\n originals.derivations.set(id, original);\n (mergedDerive as Record<string, unknown>)[id] = def;\n pluginManager.emitDefinitionAssign(type, id, def, original);\n break;\n }\n case \"effect\": {\n if (!(id in mergedEffects)) {\n throw new Error(\n `[Directive] Effect \"${id}\" does not exist. Use register() to create it.`,\n );\n }\n const original = (mergedEffects as Record<string, unknown>)[id];\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic assignment\n effectsManager.assignDefinition(id, def as any);\n originals.effects.set(id, original);\n (mergedEffects as Record<string, unknown>)[id] = def;\n pluginManager.emitDefinitionAssign(type, id, def, original);\n break;\n }\n }\n }\n\n /** Apply an unregister operation immediately */\n function applyUnregister(type: DefType, id: string): void {\n switch (type) {\n case \"constraint\": {\n if (!dynamicIds.constraints.has(id)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\n `[Directive] Cannot unregister static constraint \"${id}\". Only dynamically registered constraints can be removed.`,\n );\n }\n\n return;\n }\n constraintsManager.unregisterDefinition(id);\n delete (mergedConstraints as Record<string, unknown>)[id];\n dynamicIds.constraints.delete(id);\n originals.constraints.delete(id);\n pluginManager.emitDefinitionUnregister(type, id);\n scheduleReconcile();\n break;\n }\n case \"resolver\": {\n if (!dynamicIds.resolvers.has(id)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\n `[Directive] Cannot unregister static resolver \"${id}\". Only dynamically registered resolvers can be removed.`,\n );\n }\n\n return;\n }\n resolversManager.unregisterDefinition(id);\n delete (mergedResolvers as Record<string, unknown>)[id];\n dynamicIds.resolvers.delete(id);\n originals.resolvers.delete(id);\n pluginManager.emitDefinitionUnregister(type, id);\n break;\n }\n case \"derivation\": {\n if (!dynamicIds.derivations.has(id)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\n `[Directive] Cannot unregister static derivation \"${id}\". Only dynamically registered derivations can be removed.`,\n );\n }\n\n return;\n }\n derivationsManager.unregisterDefinition(id);\n delete (mergedDerive as Record<string, unknown>)[id];\n dynamicIds.derivations.delete(id);\n originals.derivations.delete(id);\n pluginManager.emitDefinitionUnregister(type, id);\n break;\n }\n case \"effect\": {\n if (!dynamicIds.effects.has(id)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\n `[Directive] Cannot unregister static effect \"${id}\". Only dynamically registered effects can be removed.`,\n );\n }\n\n return;\n }\n effectsManager.unregisterDefinition(id);\n delete (mergedEffects as Record<string, unknown>)[id];\n dynamicIds.effects.delete(id);\n originals.effects.delete(id);\n pluginManager.emitDefinitionUnregister(type, id);\n break;\n }\n }\n }\n\n /** Flush deferred registrations after reconcile settles */\n function flushDeferred(): void {\n if (deferredRegistrations.length === 0) {\n return;\n }\n\n const ops = deferredRegistrations.splice(0);\n for (const op of ops) {\n try {\n switch (op.op) {\n case \"register\":\n applyRegister(op.type, op.id, op.def);\n break;\n case \"assign\":\n applyAssign(op.type, op.id, op.def);\n break;\n case \"unregister\":\n applyUnregister(op.type, op.id);\n break;\n }\n } catch (error) {\n if (process.env.NODE_ENV !== \"production\") {\n console.error(\n `[Directive] Error in deferred ${op.op} for ${op.type} \"${op.id}\":`,\n error,\n );\n }\n }\n }\n }\n\n /** Enforce deferral or destroyed guards, then delegate */\n function guardedOp(\n op: \"register\" | \"assign\" | \"unregister\",\n type: DefType,\n id: string,\n def?: unknown,\n ): void {\n const { isDestroyed, isReconciling } = getState();\n\n if (isDestroyed) {\n throw new Error(\n `[Directive] Cannot ${op} ${type} \"${id}\" on a destroyed system.`,\n );\n }\n\n validateDefId(id);\n\n if (isReconciling) {\n if (deferredRegistrations.length >= maxDeferredRegistrations) {\n throw new Error(\n `[Directive] Too many deferred registrations (max ${maxDeferredRegistrations}). Avoid calling register/assign/unregister in resolver or effect callbacks during reconciliation.`,\n );\n }\n if (op === \"unregister\") {\n deferredRegistrations.push({ op, type, id });\n } else {\n deferredRegistrations.push({ op, type, id, def: def! });\n }\n\n return;\n }\n\n switch (op) {\n case \"register\":\n applyRegister(type, id, def!);\n break;\n case \"assign\":\n applyAssign(type, id, def!);\n break;\n case \"unregister\":\n applyUnregister(type, id);\n break;\n }\n }\n\n return {\n register(type: DefType, id: string, def: unknown) {\n guardedOp(\"register\", type, id, def);\n },\n\n assign(type: DefType, id: string, def: unknown) {\n guardedOp(\"assign\", type, id, def);\n },\n\n unregister(type: DefType, id: string) {\n guardedOp(\"unregister\", type, id);\n },\n\n call(type: DefType, id: string, props?: unknown): unknown {\n const { isDestroyed } = getState();\n if (isDestroyed) {\n throw new Error(\n `[Directive] Cannot call ${type} \"${id}\" on a destroyed system.`,\n );\n }\n\n validateDefId(id);\n pluginManager.emitDefinitionCall(type, id, props);\n\n switch (type) {\n case \"constraint\":\n return constraintsManager.callOne(\n id,\n props as Record<string, unknown> | undefined,\n );\n case \"resolver\":\n return resolversManager.callOne(\n id,\n props as { type: string; [key: string]: unknown },\n );\n case \"derivation\":\n return derivationsManager.callOne(id);\n case \"effect\":\n return effectsManager.callOne(id);\n }\n },\n\n isDynamic(type: DefType, id: string): boolean {\n switch (type) {\n case \"constraint\":\n return dynamicIds.constraints.has(id);\n case \"resolver\":\n return dynamicIds.resolvers.has(id);\n case \"derivation\":\n return dynamicIds.derivations.has(id);\n case \"effect\":\n return dynamicIds.effects.has(id);\n }\n },\n\n listDynamic(type: DefType): string[] {\n switch (type) {\n case \"constraint\":\n return [...dynamicIds.constraints];\n case \"resolver\":\n return [...dynamicIds.resolvers];\n case \"derivation\":\n return [...dynamicIds.derivations];\n case \"effect\":\n return [...dynamicIds.effects];\n }\n },\n\n flushDeferred,\n\n getOriginal(\n type: DefType,\n id: string,\n ): unknown | undefined {\n const typeMap: Record<string, Map<string, unknown>> = {\n constraint: originals.constraints,\n resolver: originals.resolvers,\n derivation: originals.derivations,\n effect: originals.effects,\n };\n const map = typeMap[type];\n\n if (!map) {\n return undefined;\n }\n\n return map.get(id);\n },\n\n restoreOriginal(type: DefType, id: string): boolean {\n const typeMap: Record<string, Map<string, unknown>> = {\n constraint: originals.constraints,\n resolver: originals.resolvers,\n derivation: originals.derivations,\n effect: originals.effects,\n };\n const map = typeMap[type];\n\n if (!map || !map.has(id)) {\n return false;\n }\n\n const original = map.get(id);\n guardedOp(\"assign\", type, id, original);\n map.delete(id);\n\n return true;\n },\n\n destroy() {\n deferredRegistrations.length = 0;\n dynamicIds.constraints.clear();\n dynamicIds.resolvers.clear();\n dynamicIds.derivations.clear();\n dynamicIds.effects.clear();\n originals.constraints.clear();\n originals.resolvers.clear();\n originals.derivations.clear();\n originals.effects.clear();\n },\n };\n}\n","/**\n * Trace management for the engine reconciliation loop.\n *\n * Extracted from engine.ts to reduce file size. Owns all trace state:\n * ring buffer, per-run entries, resolver attribution maps, anomaly stats,\n * and the cached snapshot array.\n *\n * @internal\n */\n\nimport type { PluginManager } from \"./plugins.js\";\nimport type { Schema, TraceEntry } from \"./types.js\";\n\n// ============================================================================\n// TraceManager Interface\n// ============================================================================\n\n/**\n * Manages per-run reconciliation traces for the engine.\n *\n * @remarks\n * Each reconcile cycle starts a new trace entry that accumulates fact changes,\n * derivation recomputations, constraint hits, requirement diffs, resolver\n * starts/completions/errors, and effect runs. Entries stay \"pending\" while\n * resolvers are inflight and finalize to \"settled\" when all complete.\n *\n * The ring buffer caps at `maxRuns` entries with FIFO eviction. A cached\n * snapshot array avoids re-spreading on every `system.trace` read.\n *\n * @internal\n */\nexport interface TraceManager {\n /** Whether tracing is enabled */\n readonly enabled: boolean;\n\n /**\n * Record a fact change (queued until the next reconcile starts).\n *\n * @param key - The fact key that changed\n * @param oldValue - Previous value\n * @param newValue - New value\n */\n recordFactChange(key: string, oldValue: unknown, newValue: unknown): void;\n\n /**\n * Start a new trace entry for the current reconcile run.\n * Drains pending fact changes into the new entry.\n *\n * @returns The start timestamp (performance.now()) for duration calculation\n */\n startRun(): number;\n\n /** The current in-progress trace entry, or null between reconcile runs */\n currentTrace: TraceEntry | null;\n\n /**\n * Get the cached trace entries array (returns null when tracing is disabled).\n * Re-builds the cache only when the version counter has changed.\n */\n getEntries(): TraceEntry[] | null;\n\n /**\n * Attribute a resolver start to the current trace entry.\n *\n * @param requirementId - The requirement being resolved\n */\n attributeResolverStart(requirementId: string): void;\n\n /**\n * Record a resolver completion on its originating trace entry.\n *\n * @param requirementId - The requirement that was resolved\n * @param resolver - The resolver ID\n * @param duration - Resolution time in ms\n */\n recordResolverComplete(requirementId: string, resolver: string, duration: number): void;\n\n /**\n * Record a resolver error on its originating trace entry.\n *\n * @param requirementId - The requirement that errored\n * @param resolver - The resolver ID\n * @param error - The error (stringified)\n */\n recordResolverError(requirementId: string, resolver: string, error: string): void;\n\n /**\n * Decrement inflight count for the trace associated with a requirement.\n * Finalizes the trace entry when all resolvers have settled.\n *\n * @param requirementId - The requirement whose resolver settled\n */\n decrementInflight(requirementId: string): void;\n\n /**\n * Finalize the current trace entry at the end of a reconcile cycle.\n * Determines whether the entry has activity, pushes it to the ring buffer,\n * and either settles immediately or leaves it pending for inflight resolvers.\n *\n * @param reconcileStartMs - The performance.now() timestamp from startRun()\n */\n finalizeCurrentRun(reconcileStartMs: number): void;\n\n /**\n * Drain any pending fact changes (e.g., on reconcile depth overflow).\n */\n drainPendingChanges(): void;\n\n /**\n * Clean up all trace state.\n */\n destroy(): void;\n}\n\n// ============================================================================\n// TraceManager Implementation\n// ============================================================================\n\n/**\n * Options for creating a trace manager.\n *\n * @internal\n */\nexport interface CreateTraceManagerOptions<S extends Schema> {\n /** Trace config from system options (true, object, or falsy) */\n traceConfig: boolean | { maxRuns?: number } | undefined;\n /** Plugin manager for emitting trace lifecycle events */\n pluginManager: PluginManager<S>;\n}\n\n/**\n * Create a trace manager that handles reconciliation trace lifecycle.\n *\n * @remarks\n * When tracing is disabled, returns a no-op manager with zero overhead.\n * When enabled, maintains a ring buffer of trace entries with FIFO eviction,\n * resolver attribution maps, anomaly detection statistics, and a cached\n * snapshot array.\n *\n * @param options - Trace configuration and plugin manager\n * @returns A {@link TraceManager} instance\n *\n * @internal\n */\nexport function createTraceManager<S extends Schema>(\n options: CreateTraceManagerOptions<S>,\n): TraceManager {\n const { traceConfig, pluginManager } = options;\n const enabled =\n traceConfig === true ||\n (typeof traceConfig === \"object\" && traceConfig !== null);\n\n if (!enabled) {\n // Return a no-op manager\n return {\n enabled: false,\n recordFactChange() {},\n startRun() {\n return 0;\n },\n currentTrace: null,\n getEntries() {\n return null;\n },\n attributeResolverStart() {},\n recordResolverComplete() {},\n recordResolverError() {},\n decrementInflight() {},\n finalizeCurrentRun() {},\n drainPendingChanges() {},\n destroy() {},\n };\n }\n\n const maxRuns =\n (typeof traceConfig === \"object\" && traceConfig !== null\n ? traceConfig.maxRuns\n : undefined) ?? 100;\n\n const traceEntries: TraceEntry[] = [];\n const traceById = new Map<number, TraceEntry>();\n let traceIdCounter = 0;\n let currentTrace: TraceEntry | null = null;\n const pendingFactChanges: Array<{\n key: string;\n oldValue: unknown;\n newValue: unknown;\n }> = [];\n\n // Async resolver attribution: requirementId → traceId\n const resolverTraceMap = new Map<string, number>();\n // Track inflight resolvers per trace: traceId → count of pending resolvers\n const traceInflightCount = new Map<number, number>();\n // Consistent duration: track start time per trace (performance.now() based)\n const traceStartMs = new Map<number, number>();\n\n // Cached trace getter: avoid spread on every access\n let traceCache: TraceEntry[] | null = null;\n let traceCacheVersion = 0;\n let currentCacheVersion = 0;\n\n // Anomaly detection statistics\n const traceStats = {\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 /** Finalize a trace entry when all its resolvers have settled */\n function finalizeTrace(traceId: number): void {\n const entry = traceById.get(traceId);\n if (entry && entry.status === \"pending\") {\n entry.status = \"settled\";\n // Consistent duration: use performance.now() when available\n const startMs = traceStartMs.get(traceId);\n entry.duration =\n startMs !== undefined\n ? performance.now() - startMs\n : Date.now() - entry.timestamp;\n traceStartMs.delete(traceId);\n traceInflightCount.delete(traceId);\n // Build causal chain on settlement\n entry.causalChain = buildCausalChain(entry);\n // Anomaly detection\n updateTraceStats(entry);\n currentCacheVersion++;\n pluginManager.emitTraceComplete(entry);\n }\n }\n\n /** Decrement inflight count for a trace entry and finalize if settled */\n function decrementTraceInflightInternal(requirementId: string): void {\n const traceId = resolverTraceMap.get(requirementId);\n resolverTraceMap.delete(requirementId);\n if (traceId !== undefined) {\n const remaining = (traceInflightCount.get(traceId) ?? 1) - 1;\n if (remaining <= 0) {\n finalizeTrace(traceId);\n } else {\n traceInflightCount.set(traceId, remaining);\n }\n }\n }\n\n /** Evict the oldest trace entry from the ring buffer */\n function evictOldestTrace(): void {\n const evicted = traceEntries.shift();\n if (evicted) {\n traceById.delete(evicted.id);\n traceStartMs.delete(evicted.id);\n if (evicted.status === \"pending\") {\n traceInflightCount.delete(evicted.id);\n for (const [reqId, rId] of resolverTraceMap) {\n if (rId === evicted.id) {\n resolverTraceMap.delete(reqId);\n }\n }\n }\n }\n }\n\n /** Build a human-readable causal chain summary from a trace entry */\n function buildCausalChain(entry: TraceEntry): string {\n const parts: string[] = [];\n\n for (const fc of entry.factChanges) {\n parts.push(`${fc.key} changed`);\n }\n\n for (const d of entry.derivationsRecomputed) {\n parts.push(`${d.id} recomputed`);\n }\n\n for (const c of entry.constraintsHit) {\n parts.push(`${c.id} constraint hit`);\n }\n\n for (const r of entry.requirementsAdded) {\n parts.push(`${r.type} requirement added`);\n }\n\n for (const rs of entry.resolversCompleted) {\n parts.push(`${rs.resolver} resolved (${rs.duration.toFixed(0)}ms)`);\n }\n\n for (const rs of entry.resolversErrored) {\n parts.push(`${rs.resolver} errored`);\n }\n\n for (const e of entry.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 trace entry */\n function updateTraceStats(entry: TraceEntry): void {\n traceStats.count++;\n traceStats.totalDuration += entry.duration;\n traceStats.avgDuration = traceStats.totalDuration / traceStats.count;\n if (entry.duration > traceStats.maxDuration) {\n traceStats.maxDuration = entry.duration;\n }\n\n const resolverCount = entry.resolversStarted.length;\n traceStats.totalResolverCount += resolverCount;\n traceStats.avgResolverCount =\n traceStats.totalResolverCount / traceStats.count;\n\n const factChangeCount = entry.factChanges.length;\n traceStats.totalFactChangeCount += factChangeCount;\n traceStats.avgFactChangeCount =\n traceStats.totalFactChangeCount / traceStats.count;\n\n // Flag anomalies (only after enough data)\n const anomalies: string[] = [];\n if (traceStats.count > 3 && entry.duration > traceStats.avgDuration * 5) {\n anomalies.push(\n `Duration ${entry.duration.toFixed(0)}ms is 5x+ above average (${traceStats.avgDuration.toFixed(0)}ms)`,\n );\n }\n\n if (entry.resolversErrored.length > 0) {\n anomalies.push(`${entry.resolversErrored.length} resolver(s) errored`);\n }\n\n if (anomalies.length > 0) {\n entry.anomalies = anomalies;\n }\n }\n\n const manager: TraceManager = {\n enabled: true,\n\n get currentTrace() {\n return currentTrace;\n },\n set currentTrace(value: TraceEntry | null) {\n currentTrace = value;\n },\n\n recordFactChange(key: string, oldValue: unknown, newValue: unknown) {\n pendingFactChanges.push({ key, oldValue, newValue });\n },\n\n startRun(): number {\n const startMs = performance.now();\n const traceId = ++traceIdCounter;\n traceStartMs.set(traceId, startMs);\n currentTrace = {\n id: traceId,\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 return startMs;\n },\n\n getEntries(): TraceEntry[] | null {\n if (!traceCache || traceCacheVersion !== currentCacheVersion) {\n traceCache = [...traceEntries];\n traceCacheVersion = currentCacheVersion;\n }\n\n return traceCache;\n },\n\n attributeResolverStart(requirementId: string) {\n if (currentTrace) {\n resolverTraceMap.set(requirementId, currentTrace.id);\n }\n },\n\n recordResolverComplete(\n requirementId: string,\n resolver: string,\n duration: number,\n ) {\n const traceId = resolverTraceMap.get(requirementId);\n if (traceId !== undefined) {\n const entry = traceById.get(traceId);\n if (entry) {\n entry.resolversCompleted.push({\n resolver,\n requirementId,\n duration,\n });\n }\n }\n },\n\n recordResolverError(\n requirementId: string,\n resolver: string,\n error: string,\n ) {\n const traceId = resolverTraceMap.get(requirementId);\n if (traceId !== undefined) {\n const entry = traceById.get(traceId);\n if (entry) {\n entry.resolversErrored.push({\n resolver,\n requirementId,\n error,\n });\n }\n }\n },\n\n decrementInflight(requirementId: string) {\n decrementTraceInflightInternal(requirementId);\n },\n\n finalizeCurrentRun(reconcileStartMs: number) {\n if (!currentTrace) {\n return;\n }\n\n currentTrace.duration = performance.now() - reconcileStartMs;\n\n // Skip empty runs\n const hasActivity =\n currentTrace.factChanges.length > 0 ||\n currentTrace.constraintsHit.length > 0 ||\n currentTrace.requirementsAdded.length > 0 ||\n currentTrace.effectsRun.length > 0;\n\n if (hasActivity) {\n const inflightCount = currentTrace.resolversStarted.length;\n if (inflightCount === 0) {\n // No resolvers — finalize immediately\n currentTrace.status = \"settled\";\n currentTrace.causalChain = buildCausalChain(currentTrace);\n updateTraceStats(currentTrace);\n traceEntries.push(currentTrace);\n traceById.set(currentTrace.id, currentTrace);\n if (traceEntries.length > maxRuns) {\n evictOldestTrace();\n }\n currentCacheVersion++;\n pluginManager.emitTraceComplete(currentTrace);\n } else {\n // Has resolvers — stays pending until they settle\n currentTrace.status = \"pending\";\n traceEntries.push(currentTrace);\n traceById.set(currentTrace.id, currentTrace);\n if (traceEntries.length > maxRuns) {\n evictOldestTrace();\n }\n currentCacheVersion++;\n traceInflightCount.set(currentTrace.id, inflightCount);\n }\n } else {\n // Empty trace entry — clean up start time\n traceStartMs.delete(currentTrace.id);\n }\n\n currentTrace = null;\n },\n\n drainPendingChanges() {\n pendingFactChanges.length = 0;\n },\n\n destroy() {\n traceEntries.length = 0;\n traceById.clear();\n resolverTraceMap.clear();\n traceInflightCount.clear();\n traceStartMs.clear();\n pendingFactChanges.length = 0;\n currentTrace = null;\n traceCache = null;\n },\n };\n\n return manager;\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 * A queued retry entry tracking its source, attempt count, and scheduled time.\n *\n * @internal\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 * @remarks\n * Retries are stored in a Map keyed by source ID. Each entry tracks its\n * attempt number and the timestamp of the next eligible retry. When\n * {@link createRetryLaterManager | processDueRetries} is called (typically\n * during reconciliation), entries whose scheduled time has elapsed are\n * returned and removed from the queue. The delay grows exponentially:\n * `delayMs * backoffMultiplier^(attempt - 1)`, capped at `maxDelayMs`.\n *\n * @param config - Backoff configuration including `delayMs`, `maxRetries`, `backoffMultiplier`, and `maxDelayMs`.\n * @returns A manager exposing `scheduleRetry`, `getPendingRetries`, `processDueRetries`, `cancelRetry`, and `clearAll` methods.\n *\n * @internal\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 * 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\n/**\n * Handle returned by {@link createErrorBoundaryManager} for routing errors\n * through configurable recovery strategies.\n *\n * @internal\n */\nexport interface ErrorBoundaryManager {\n /**\n * Route an error through the configured recovery strategy for its source.\n *\n * @param source - The subsystem that produced the error.\n * @param sourceId - Identifier of the specific constraint, resolver, effect, or derivation.\n * @param error - The thrown value (coerced to {@link DirectiveError} internally).\n * @param context - Optional context forwarded to callbacks and retry entries.\n * @returns The {@link RecoveryStrategy} that was applied.\n */\n handleError(\n source: ErrorSource,\n sourceId: string,\n error: unknown,\n context?: unknown,\n ): RecoveryStrategy;\n /**\n * Return the most recently recorded error, or `null` if none exist.\n *\n * @returns The last {@link DirectiveError}, or `null`.\n */\n getLastError(): DirectiveError | null;\n /**\n * Return a snapshot array of all recorded errors (up to the last 100).\n *\n * @returns A shallow copy of the internal error ring buffer.\n */\n getAllErrors(): DirectiveError[];\n /** Clear all recorded errors. */\n clearErrors(): void;\n /**\n * Access the underlying retry-later manager for advanced scheduling.\n *\n * @returns The {@link createRetryLaterManager} instance used internally.\n */\n getRetryLaterManager(): ReturnType<typeof createRetryLaterManager>;\n /**\n * Drain and return retry entries whose scheduled time has elapsed.\n *\n * @returns An array of {@link PendingRetry} entries that are now due.\n */\n processDueRetries(): PendingRetry[];\n /**\n * Reset retry attempt tracking for a source, typically after a successful resolution.\n *\n * @param sourceId - The source identifier whose retry counter should be cleared.\n */\n clearRetryAttempts(sourceId: string): void;\n}\n\n/**\n * Options accepted by {@link createErrorBoundaryManager}.\n *\n * @internal\n */\nexport interface CreateErrorBoundaryOptions {\n /** Per-source recovery strategies and retry-later tuning. */\n config?: ErrorBoundaryConfig;\n /** Invoked every time an error is recorded, before the recovery strategy runs. */\n onError?: (error: DirectiveError) => void;\n /** Invoked after a recovery strategy has been selected for an error. */\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 * @remarks\n * Five recovery strategies are available:\n *\n * - `\"skip\"` -- Swallow the error and continue.\n * - `\"retry\"` -- Signal the caller to retry immediately.\n * - `\"retry-later\"` -- Enqueue a deferred retry with exponential backoff\n * (delegated to an internal {@link createRetryLaterManager}).\n * - `\"disable\"` -- Permanently disable the failing source.\n * - `\"throw\"` -- Re-throw the error as a {@link DirectiveError}.\n *\n * Recent errors are kept in a ring buffer (last 100) for inspection via\n * {@link ErrorBoundaryManager.getAllErrors | getAllErrors}. Each strategy\n * can be configured per source type (`onConstraintError`, `onResolverError`,\n * etc.) or as a callback that dynamically selects a strategy.\n *\n * @param options - Error boundary configuration, plus `onError` and `onRecovery` callbacks for plugin integration.\n * @returns An {@link ErrorBoundaryManager} for routing errors through the configured strategies.\n *\n * @internal\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 (capped to prevent unbounded growth)\n const retryAttempts = new Map<string, number>();\n const MAX_RETRY_SOURCES = 1000;\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 // FIFO eviction to prevent unbounded growth\n if (retryAttempts.size > MAX_RETRY_SOURCES) {\n const oldest = retryAttempts.keys().next().value;\n if (oldest !== undefined) {\n retryAttempts.delete(oldest);\n }\n }\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 { BLOCKED_PROPS, trackAccess, withoutTracking } from \"./tracking.js\";\nimport type {\n Facts,\n FactsSnapshot,\n FactsStore,\n InferSchema,\n Schema,\n} from \"./types.js\";\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// ============================================================================\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 * @remarks\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 {@link FactsStore} 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 *\n * @internal\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) {\n return st._typeName;\n }\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) {\n return \"[redacted]\";\n }\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: clear all listeners on destroy to release resources immediately.\n // Not part of the public FactsStore interface — called by engine.destroy().\n (store as unknown as Record<string, unknown>).destroy = () => {\n keyListeners.clear();\n allListeners.clear();\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// Dev-mode nested mutation warning\n// ============================================================================\n\n/**\n * Wrap an object in a Proxy that warns when properties are set.\n * Catches `facts.user.name = \"John\"` which silently skips reactivity.\n * Only used in dev mode — tree-shaken in production builds.\n */\nfunction wrapWithNestedWarning(\n obj: object,\n rootKey: string,\n path = rootKey,\n): object {\n return new Proxy(obj, {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n if (typeof prop === \"symbol\" || typeof value !== \"object\" || value === null) {\n return value;\n }\n\n return wrapWithNestedWarning(value as object, rootKey, `${path}.${String(prop)}`);\n },\n set(target, prop, newValue) {\n if (typeof prop !== \"symbol\") {\n console.warn(\n `[Directive] Nested mutation on \"facts.${path}.${String(prop)}\" will not trigger reactivity. ` +\n `Use: facts.${rootKey} = { ...facts.${rootKey}, ... }`,\n );\n }\n\n return Reflect.set(target, prop, newValue);\n },\n });\n}\n\n// ============================================================================\n// Proxy-based Facts Accessor\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 * @remarks\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 {@link Facts} proxy with property-style get/set and prototype pollution guards\n *\n * @example\n * ```ts\n * const store = createFactsStore({ schema: { phase: t.string() } });\n * const facts = createFactsProxy(store, { phase: t.string() });\n *\n * facts.phase = \"red\";\n * console.log(facts.phase); // \"red\"\n * ```\n *\n * @internal\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\") {\n return store;\n }\n if (prop === \"$snapshot\") {\n return snapshot;\n }\n\n // Special properties\n if (typeof prop === \"symbol\") {\n return undefined;\n }\n\n // Prototype pollution protection\n if (BLOCKED_PROPS.has(prop)) {\n return undefined;\n }\n\n const value = store.get(prop as keyof InferSchema<S>);\n\n // Dev-mode: warn when users mutate nested objects (won't trigger reactivity)\n if (\n process.env.NODE_ENV !== \"production\" &&\n value !== null &&\n typeof value === \"object\"\n ) {\n return wrapWithNestedWarning(value as object, prop);\n }\n\n return value;\n },\n\n set(_, prop: string | symbol, value: unknown) {\n if (typeof prop === \"symbol\") {\n return false;\n }\n if (prop === \"$store\" || prop === \"$snapshot\") {\n return false;\n }\n // Prototype pollution protection\n if (BLOCKED_PROPS.has(prop)) {\n return false;\n }\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\") {\n return false;\n }\n if (prop === \"$store\" || prop === \"$snapshot\") {\n return false;\n }\n // Prototype pollution protection\n if (BLOCKED_PROPS.has(prop)) {\n return false;\n }\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\") {\n return true;\n }\n if (typeof prop === \"symbol\") {\n return false;\n }\n // Prototype pollution protection\n if (BLOCKED_PROPS.has(prop)) {\n return false;\n }\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 defineProperty() {\n return false;\n },\n\n getPrototypeOf() {\n return null;\n },\n\n setPrototypeOf() {\n return false;\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 * @remarks\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 *\n * @internal\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 TraceEntry,\n Schema,\n Snapshot,\n System,\n} from \"./types.js\";\nimport type { DirectiveError } from \"./types.js\";\n\n// ============================================================================\n// Plugin Manager\n// ============================================================================\n\n/**\n * Internal manager that broadcasts lifecycle events to registered {@link Plugin} instances.\n *\n * @remarks\n * PluginManager uses `Schema` (flat) internally because the engine works with\n * flat schemas. The public API uses `ModuleSchema` (consolidated), and the\n * conversion happens in `createSystem`.\n *\n * Plugins execute in registration order. All hook invocations are wrapped in\n * try-catch so a misbehaving plugin never breaks the engine. Duplicate plugin\n * names are detected and the older registration is replaced with a warning.\n *\n * Lifecycle hook categories:\n * - **System lifecycle:** `emitInit`, `emitStart`, `emitStop`, `emitDestroy`\n * - **Facts:** `emitFactSet`, `emitFactDelete`, `emitFactsBatch`\n * - **Derivations:** `emitDerivationCompute`, `emitDerivationInvalidate`\n * - **Reconciliation:** `emitReconcileStart`, `emitReconcileEnd`\n * - **Constraints:** `emitConstraintEvaluate`, `emitConstraintError`\n * - **Requirements:** `emitRequirementCreated`, `emitRequirementMet`, `emitRequirementCanceled`\n * - **Resolvers:** `emitResolverStart`, `emitResolverComplete`, `emitResolverError`, `emitResolverRetry`, `emitResolverCancel`\n * - **Effects:** `emitEffectRun`, `emitEffectError`\n * - **History:** `emitSnapshot`, `emitHistoryNavigate`\n * - **Errors:** `emitError`, `emitErrorRecovery`\n * - **Trace:** `emitTraceComplete`\n *\n * @typeParam _S - The flat schema type (unused at runtime).\n *\n * @internal\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 // History hooks\n emitSnapshot(snapshot: Snapshot): void;\n emitHistoryNavigate(from: number, to: number): void;\n\n // Error boundary hooks\n emitError(error: DirectiveError): void;\n emitErrorRecovery(error: DirectiveError, strategy: RecoveryStrategy): void;\n\n // Dynamic definition hooks\n emitDefinitionRegister(type: string, id: string, def: unknown): void;\n emitDefinitionAssign(type: string, id: string, def: unknown, original: unknown): void;\n emitDefinitionUnregister(type: string, id: string): void;\n emitDefinitionCall(type: string, id: string, props?: unknown): void;\n\n // Trace hooks\n emitTraceComplete(run: TraceEntry): void;\n}\n\n/**\n * Create a {@link PluginManager} that broadcasts lifecycle events to registered plugins.\n *\n * @remarks\n * Plugins are called in registration order. All hook invocations are wrapped\n * in try-catch so a misbehaving plugin never breaks the engine. Duplicate\n * plugin names are detected and the older registration is replaced with a\n * console warning.\n *\n * @returns A {@link PluginManager} with `register`/`unregister`/`getPlugins` and `emit*` methods for every lifecycle event.\n *\n * @internal\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) {\n return undefined;\n }\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) {\n return undefined;\n }\n try {\n return await fn();\n } catch (error) {\n console.error(\"[Directive] Plugin error:\", error);\n return undefined;\n }\n }\n\n /** Create a sync broadcast function for a given plugin hook name */\n // biome-ignore lint/suspicious/noExplicitAny: Plugin hook signatures vary\n function broadcast<K extends keyof Plugin<any>>(hook: K) {\n return (...args: unknown[]) => {\n for (const plugin of plugins) {\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic hook dispatch\n safeCall(() => (plugin as any)[hook]?.(...args));\n }\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 (emitInit is async, handled separately)\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 emitStart: broadcast(\"onStart\"),\n emitStop: broadcast(\"onStop\"),\n emitDestroy: broadcast(\"onDestroy\"),\n\n // Fact hooks\n emitFactSet: broadcast(\"onFactSet\"),\n emitFactDelete: broadcast(\"onFactDelete\"),\n emitFactsBatch: broadcast(\"onFactsBatch\"),\n\n // Derivation hooks\n emitDerivationCompute: broadcast(\"onDerivationCompute\"),\n emitDerivationInvalidate: broadcast(\"onDerivationInvalidate\"),\n\n // Reconciliation hooks\n emitReconcileStart: broadcast(\"onReconcileStart\"),\n emitReconcileEnd: broadcast(\"onReconcileEnd\"),\n\n // Constraint hooks\n emitConstraintEvaluate: broadcast(\"onConstraintEvaluate\"),\n emitConstraintError: broadcast(\"onConstraintError\"),\n\n // Requirement hooks\n emitRequirementCreated: broadcast(\"onRequirementCreated\"),\n emitRequirementMet: broadcast(\"onRequirementMet\"),\n emitRequirementCanceled: broadcast(\"onRequirementCanceled\"),\n\n // Resolver hooks\n emitResolverStart: broadcast(\"onResolverStart\"),\n emitResolverComplete: broadcast(\"onResolverComplete\"),\n emitResolverError: broadcast(\"onResolverError\"),\n emitResolverRetry: broadcast(\"onResolverRetry\"),\n emitResolverCancel: broadcast(\"onResolverCancel\"),\n\n // Effect hooks\n emitEffectRun: broadcast(\"onEffectRun\"),\n emitEffectError: broadcast(\"onEffectError\"),\n\n // History hooks\n emitSnapshot: broadcast(\"onSnapshot\"),\n emitHistoryNavigate: broadcast(\"onHistoryNavigate\"),\n\n // Error boundary hooks\n emitError: broadcast(\"onError\"),\n emitErrorRecovery: broadcast(\"onErrorRecovery\"),\n\n // Dynamic definition hooks\n emitDefinitionRegister: broadcast(\"onDefinitionRegister\"),\n emitDefinitionAssign: broadcast(\"onDefinitionAssign\"),\n emitDefinitionUnregister: broadcast(\"onDefinitionUnregister\"),\n emitDefinitionCall: broadcast(\"onDefinitionCall\"),\n\n // Trace hooks\n emitTraceComplete: broadcast(\"onTraceComplete\"),\n } as PluginManager<S>;\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/**\n * Summary of a resolver that is currently in flight.\n *\n * @internal\n */\nexport interface InflightInfo {\n /** The unique requirement ID being resolved. */\n id: string;\n /** The definition ID of the resolver handling this requirement. */\n resolverId: string;\n /** Epoch timestamp (ms) when resolution started. */\n startedAt: number;\n}\n\n/**\n * Manager returned by {@link createResolversManager} that matches\n * requirements to resolver handlers and manages their execution lifecycle.\n *\n * @internal\n */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport interface ResolversManager<_S extends Schema> {\n /**\n * Start resolving a requirement by matching it to a resolver handler.\n *\n * @remarks\n * Duplicate in-flight requirements (same `req.id`) are silently ignored.\n * If the matched resolver has `batch.enabled`, the requirement is queued\n * for batch processing instead of being resolved immediately.\n *\n * @param req - The requirement (with a stable identity ID) to resolve.\n */\n resolve(req: RequirementWithId): void;\n /**\n * Cancel an in-flight or batch-queued resolver by requirement ID.\n *\n * @remarks\n * Aborts the `AbortController` for in-flight resolvers. For batch-queued\n * requirements, removes the requirement from the pending batch.\n *\n * @param requirementId - The unique requirement ID to cancel.\n */\n cancel(requirementId: string): void;\n /**\n * Cancel every in-flight resolver and flush all pending batch queues.\n */\n cancelAll(): void;\n /**\n * Get the current status of a resolver by requirement ID.\n *\n * @param requirementId - The unique requirement ID to look up.\n * @returns The {@link ResolverStatus} (idle, pending, running, success, error, or canceled).\n */\n getStatus(requirementId: string): ResolverStatus;\n /**\n * Get the requirement IDs of all currently in-flight resolvers.\n *\n * @returns An array of requirement ID strings.\n */\n getInflight(): string[];\n /**\n * Get detailed info for every in-flight resolver.\n *\n * @returns An array of {@link InflightInfo} objects.\n */\n getInflightInfo(): InflightInfo[];\n /**\n * Check whether a requirement is currently being resolved.\n *\n * @param requirementId - The unique requirement ID to check.\n * @returns `true` if the requirement has an active in-flight resolver.\n */\n isResolving(requirementId: string): boolean;\n /**\n * Immediately flush all pending batch queues, executing their resolvers.\n */\n processBatches(): void;\n /**\n * Check whether any batch queues have requirements waiting to be processed.\n *\n * @returns `true` if at least one batch queue is non-empty.\n */\n hasPendingBatches(): boolean;\n /**\n * Register additional resolver definitions at runtime (used for dynamic\n * module registration).\n *\n * @remarks\n * Clears the resolver-by-type cache so newly registered resolvers are\n * discoverable on the next {@link ResolversManager.resolve | resolve} call.\n *\n * @param newDefs - New resolver definitions to merge into the manager.\n */\n registerDefinitions(newDefs: ResolversDef<Schema>): void;\n /**\n * Override an existing resolver definition.\n *\n * @param id - The resolver definition ID to override.\n * @param def - The new resolver definition.\n * @throws If no resolver with this ID exists.\n */\n assignDefinition(id: string, def: ResolversDef<Schema>[string]): void;\n /**\n * Remove a resolver definition. Cancels any inflight resolution.\n *\n * @param id - The resolver definition ID to remove.\n */\n unregisterDefinition(id: string): void;\n /**\n * Execute a resolver with a given requirement object.\n *\n * @param id - The resolver definition ID.\n * @param requirement - The requirement to resolve.\n */\n callOne(id: string, requirement: Requirement): Promise<void>;\n /**\n * Clean up all internal state. Called on system destroy.\n */\n destroy(): 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/**\n * Configuration options accepted by {@link createResolversManager}.\n *\n * @internal\n */\nexport interface CreateResolversOptions<S extends Schema> {\n /** Resolver definitions keyed by ID. */\n definitions: ResolversDef<S>;\n /** Proxy-based facts object passed to resolver contexts. */\n facts: Facts<S>;\n /** Underlying fact store used for `batch()` coalescing of mutations. */\n store: FactsStore<S>;\n /** Called when a resolver begins execution. */\n onStart?: (resolver: string, req: RequirementWithId) => void;\n /** Called when a resolver completes successfully, with the wall-clock duration in ms. */\n onComplete?: (\n resolver: string,\n req: RequirementWithId,\n duration: number,\n ) => void;\n /** Called when a resolver exhausts all retry attempts. */\n onError?: (resolver: string, req: RequirementWithId, error: unknown) => void;\n /** Called before each retry attempt with the upcoming attempt number. */\n onRetry?: (resolver: string, req: RequirementWithId, attempt: number) => void;\n /** Called when a resolver is canceled via {@link ResolversManager.cancel | cancel}. */\n onCancel?: (resolver: string, req: RequirementWithId) => void;\n /** Called after any resolver finishes (success, error, or batch completion) to trigger 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 * 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 * @remarks\n * Resolvers are matched by requirement type (string equality) or a predicate\n * function. Each resolution runs with an `AbortController` for cancellation\n * and configurable retry policies (none, linear, or exponential backoff).\n *\n * **Batching:** When a resolver sets `batch.enabled`, incoming requirements\n * are queued and flushed either when `batch.maxSize` is reached or after\n * `batch.windowMs` elapses, whichever comes first. Batch resolvers can use\n * `resolveBatch` (all-or-nothing) or `resolveBatchWithResults` (per-item\n * success/failure). If only `resolve` is provided with batching enabled, the\n * manager falls back to individual resolution calls.\n *\n * Duplicate in-flight requirements (same requirement ID) are automatically\n * deduplicated. Resolver-by-type lookups are cached with FIFO eviction at\n * 1 000 entries to handle dynamic requirement types.\n *\n * @param options - Configuration including resolver definitions, facts proxy,\n * store, and lifecycle callbacks.\n * @returns A {@link ResolversManager} for dispatching, canceling, and\n * inspecting requirement resolution.\n *\n * @example\n * ```typescript\n * const resolvers = createResolversManager({\n * definitions: {\n * transition: {\n * requirement: \"TRANSITION\",\n * retry: { attempts: 3, backoff: \"exponential\" },\n * resolve: async (req, context) => {\n * context.facts.phase = req.to;\n * context.facts.elapsed = 0;\n * },\n * },\n * },\n * facts: factsProxy,\n * store: factsStore,\n * onComplete: (id, req, ms) => console.log(`${id} resolved in ${ms}ms`),\n * });\n *\n * resolvers.resolve(requirementWithId);\n * ```\n *\n * @internal\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, Set<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 // Move to end of Map iteration order (LRU: least recently used is first)\n resolversByType.delete(reqType);\n resolversByType.set(reqType, 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, new Set());\n }\n resolversByType.get(reqType)!.add(id);\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 /**\n * Shared retry catch-block logic: normalize error, check abort, check shouldRetry,\n * sleep with abort awareness. Returns \"abort\" if canceled, \"break\" if shouldRetry\n * returned false, or \"continue\" if the next attempt should proceed.\n */\n async function handleRetryError(\n error: unknown,\n attempt: number,\n retryPolicy: RetryPolicy & { attempts: number; backoff: string },\n controller: AbortController,\n ): Promise<{ action: \"abort\" | \"break\" | \"continue\"; error: Error }> {\n const normalizedError =\n error instanceof Error ? error : new Error(String(error));\n\n if (controller.signal.aborted) {\n return { action: \"abort\", error: normalizedError };\n }\n\n if (\n retryPolicy.shouldRetry &&\n !retryPolicy.shouldRetry(normalizedError, attempt)\n ) {\n return { action: \"break\", error: normalizedError };\n }\n\n if (attempt < retryPolicy.attempts) {\n if (controller.signal.aborted) {\n return { action: \"abort\", error: normalizedError };\n }\n\n const delay = calculateDelay(retryPolicy, attempt);\n\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 if (controller.signal.aborted) {\n return { action: \"abort\", error: normalizedError };\n }\n }\n\n return { action: \"continue\", error: normalizedError };\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 const result = await handleRetryError(\n error,\n attempt,\n retryPolicy,\n controller,\n );\n lastError = result.error;\n\n if (result.action === \"abort\") {\n return;\n }\n if (result.action === \"break\") {\n break;\n }\n\n // \"continue\" — notify retry and loop\n if (attempt < retryPolicy.attempts) {\n onRetry?.(resolverId, req, attempt + 1);\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 const result = await handleRetryError(\n error,\n attempt,\n retryPolicy,\n controller,\n );\n lastError = result.error;\n\n if (result.action === \"abort\") {\n return;\n }\n if (result.action === \"break\") {\n break;\n }\n\n // \"continue\" — notify retry for all requirements and loop\n if (attempt < retryPolicy.attempts) {\n for (const req of requirements) {\n onRetry?.(resolverId, req, attempt + 1);\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 if (process.env.NODE_ENV !== \"production\") {\n console.warn(\n `[Directive] No resolver found for requirement type \"${req.requirement.type}\" (id: ${req.id})`,\n );\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 assignDefinition(id: string, def: ResolversDef<Schema>[string]): void {\n if (!definitions[id]) {\n throw new Error(\n `[Directive] Cannot assign resolver \"${id}\" — it does not exist. Use register() to create it.`,\n );\n }\n\n // Replace definition\n (definitions as Record<string, unknown>)[id] = def;\n // Clear cache so the new definition is discoverable\n resolversByType.clear();\n },\n\n unregisterDefinition(id: string): void {\n if (!definitions[id]) {\n return;\n }\n\n // Cancel any inflight resolutions using this resolver\n for (const [reqId, state] of inflight) {\n if (state.resolverId === id) {\n state.controller.abort();\n inflight.delete(reqId);\n statuses.set(reqId, {\n state: \"canceled\",\n requirementId: reqId,\n canceledAt: Date.now(),\n });\n onCancel?.(id, state.originalRequirement);\n }\n }\n\n // Remove from batch queues\n const batch = batches.get(id);\n if (batch) {\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?.(id, req);\n }\n batches.delete(id);\n }\n\n delete (definitions as Record<string, unknown>)[id];\n resolversByType.clear();\n cleanupStatuses();\n },\n\n async callOne(id: string, requirement: Requirement): Promise<void> {\n const def = definitions[id];\n if (!def) {\n throw new Error(\n `[Directive] Cannot call resolver \"${id}\" — it does not exist.`,\n );\n }\n\n const controller = new AbortController();\n const ctx = createContext(controller.signal);\n\n if (def.resolve) {\n let resolvePromise!: Promise<void>;\n store.batch(() => {\n resolvePromise = def.resolve!(\n requirement as Parameters<NonNullable<typeof def.resolve>>[0],\n ctx,\n ) as Promise<void>;\n });\n\n await resolvePromise;\n }\n },\n\n destroy(): void {\n this.cancelAll();\n statuses.clear();\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 HistoryManager,\n createDisabledHistory,\n createHistoryManager,\n} from \"../utils/history.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 { createDeriveAccessor, createEventsAccessor } from \"./engine-accessors.js\";\nimport { createDefinitionsRegistry } from \"./engine-definitions.js\";\nimport { createTraceManager } from \"./engine-trace.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\";\nimport { BLOCKED_PROPS } from \"./tracking.js\";\nimport type {\n ConstraintsDef,\n DerivationsDef,\n EffectsDef,\n EventsDef,\n FactsSnapshot,\n InferSchema,\n ReconcileResult,\n ResolversDef,\n TraceEntry,\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 history\n * into a single reactive system.\n *\n * @remarks\n * This is the internal factory used by {@link createSystem}. Most users should\n * call `createSystem` instead, which provides a friendlier API and handles\n * module composition.\n *\n * @param config - Full system configuration including modules, plugins, error boundary settings, and debug options\n * @returns A {@link 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 * @internal\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 if (section === \"schema\" && key.startsWith(\"$\")) {\n throw new Error(\n `[Directive] Module \"${module.id}\" has schema key \"${key}\" starting with \"$\". ` +\n \"Keys starting with $ are reserved for internal accessors ($store, $snapshot).\",\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 history.snapshotEvents, build the filter set.\n // Modules WITHOUT history.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 history.snapshotEvents at runtime\n const hasAnySnapshotEvents = config.modules.some(\n (m: any) => m.history?.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 history.snapshotEvents at runtime\n const mod = module as any;\n if (mod.history?.snapshotEvents) {\n for (const eventName of mod.history.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 createHistoryManager() below.\n let historyRef: HistoryManager<S> | null = null;\n\n // Trace management (per-run reconciliation changelog, gated by config.trace)\n const traceManager = createTraceManager({\n traceConfig: config.trace,\n pluginManager,\n });\n const traceEnabled = traceManager.enabled;\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 trace\n if (traceEnabled) {\n traceManager.recordFactChange(String(key), prev, value);\n }\n // During history 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 (historyRef?.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 trace\n if (traceEnabled) {\n for (const change of changes) {\n traceManager.recordFactChange(\n change.key,\n change.prev,\n change.type === \"delete\" ? undefined : change.value,\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 history restore, skip change tracking and reconciliation.\n if (historyRef?.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 (traceManager.currentTrace) {\n traceManager.currentTrace.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 (traceManager.currentTrace) {\n traceManager.currentTrace.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 (traceManager.currentTrace) {\n traceManager.currentTrace.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 // 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 trace entry that started this resolver\n if (traceEnabled) {\n traceManager.recordResolverComplete(req.id, resolver, duration);\n traceManager.decrementInflight(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 trace entry that started this resolver\n if (traceEnabled) {\n traceManager.recordResolverError(req.id, resolver, String(error));\n traceManager.decrementInflight(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 trace entry\n if (traceEnabled) {\n traceManager.decrementInflight(req.id);\n }\n },\n onResolutionComplete: () => {\n // After a resolver completes, schedule another reconcile\n notifySettlementChange();\n scheduleReconcile();\n },\n });\n\n // History listeners — notified when snapshot state changes\n const historyListeners = new Set<() => void>();\n\n function notifyHistoryChange(): void {\n for (const listener of historyListeners) {\n listener();\n }\n }\n\n // Create history manager\n const historyManager: HistoryManager<S> = config.history\n ? createHistoryManager({\n historyOption: config.history,\n facts,\n store,\n onSnapshot: (snapshot) => {\n pluginManager.emitSnapshot(snapshot);\n notifyHistoryChange();\n },\n onHistoryChange: (from, to) => {\n pluginManager.emitHistoryNavigate(from, to);\n notifyHistoryChange();\n },\n })\n : createDisabledHistory();\n historyRef = historyManager;\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 const MAX_DEFERRED_REGISTRATIONS = 100;\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 // Dynamic definition registry (register, assign, unregister, call)\n const definitions = createDefinitionsRegistry({\n mergedConstraints,\n mergedResolvers,\n mergedDerive,\n mergedEffects,\n constraintsManager,\n resolversManager,\n derivationsManager,\n effectsManager,\n pluginManager,\n getState: () => state,\n scheduleReconcile,\n maxDeferredRegistrations: MAX_DEFERRED_REGISTRATIONS,\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 trace entry (M4)\n if (traceEnabled) {\n traceManager.drainPendingChanges();\n }\n reconcileDepth = 0;\n return;\n }\n\n state.isReconciling = true;\n notifySettlementChange();\n\n const reconcileStartMs = traceEnabled ? traceManager.startRun() : 0;\n const currentTrace = traceManager.currentTrace;\n\n try {\n // Take snapshot before reconciliation (respects snapshotEvents filtering)\n if (state.changedKeys.size > 0) {\n if (snapshotEventNames === null || shouldTakeSnapshot) {\n historyManager.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 trace\n if (currentTrace) {\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 currentTrace.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 trace\n if (currentTrace) {\n for (const req of added) {\n currentTrace.requirementsAdded.push({\n id: req.id,\n type: req.requirement.type,\n fromConstraint: req.fromConstraint,\n });\n }\n for (const req of removed) {\n currentTrace.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 trace\n if (currentTrace) {\n const inflightNow = resolversManager.getInflightInfo();\n // Build Map for O(1) lookups instead of O(n) find per requirement\n const inflightById = new Map(inflightNow.map((i) => [i.id, i]));\n for (const req of added) {\n const info = inflightById.get(req.id);\n currentTrace.resolversStarted.push({\n resolver: info?.resolverId ?? \"unknown\",\n requirementId: req.id,\n });\n // Track attribution for async completion\n traceManager.attributeResolverStart(req.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 trace entry\n if (traceEnabled) {\n traceManager.finalizeCurrentRun(reconcileStartMs);\n }\n\n state.isReconciling = false;\n\n // Flush any deferred dynamic definition operations that were queued\n // during this reconciliation cycle\n definitions.flushDeferred();\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 /** Dispatch an event by name, handling snapshot flags and batching */\n function dispatchEventByName(\n eventName: string,\n payload?: Record<string, unknown>,\n ): void {\n const handler = mergedEvents[eventName];\n if (handler) {\n dispatchDepth++;\n if (snapshotEventNames === null || snapshotEventNames.has(eventName)) {\n shouldTakeSnapshot = true;\n }\n try {\n store.batch(() => {\n handler(facts, { type: eventName, ...payload });\n });\n } finally {\n dispatchDepth--;\n }\n } else if (process.env.NODE_ENV !== \"production\") {\n console.warn(\n `[Directive] Unknown event type \"${eventName}\". ` +\n \"No handler is registered for this event. \" +\n `Available events: ${Object.keys(mergedEvents).join(\", \") || \"(none)\"}`,\n );\n }\n }\n\n // Create typed derive accessor using a Proxy\n const deriveAccessor = createDeriveAccessor({\n mergedDerive: mergedDerive as Record<string, unknown>,\n getDerivation: (key) =>\n derivationsManager.get(key as keyof DerivationsDef<S>),\n definitions,\n });\n\n // Create typed events accessor using a Proxy\n const eventsAccessor = createEventsAccessor({\n mergedEvents: mergedEvents as Record<string, unknown>,\n dispatchEvent: dispatchEventByName,\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 history: historyManager.isEnabled ? historyManager : null,\n // biome-ignore lint/suspicious/noExplicitAny: Proxy provides both derivation values and control methods at runtime\n derive: deriveAccessor as any,\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 // biome-ignore lint/suspicious/noExplicitAny: Runtime accepts any constraint def shape\n register: (id: string, def: any) => definitions.register(\"constraint\", id, def),\n // biome-ignore lint/suspicious/noExplicitAny: Runtime accepts any constraint def shape\n assign: (id: string, def: any) => definitions.assign(\"constraint\", id, def),\n unregister: (id: string) => definitions.unregister(\"constraint\", id),\n call: (id: string, props?: Record<string, unknown>) => definitions.call(\"constraint\", id, props) as Promise<Record<string, unknown>[]>,\n isDynamic: (id: string) => definitions.isDynamic(\"constraint\", id),\n listDynamic: () => definitions.listDynamic(\"constraint\"),\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 // biome-ignore lint/suspicious/noExplicitAny: Runtime accepts any effect def shape\n register: (id: string, def: any) => definitions.register(\"effect\", id, def),\n // biome-ignore lint/suspicious/noExplicitAny: Runtime accepts any effect def shape\n assign: (id: string, def: any) => definitions.assign(\"effect\", id, def),\n unregister: (id: string) => definitions.unregister(\"effect\", id),\n call: (id: string) => definitions.call(\"effect\", id) as Promise<void>,\n isDynamic: (id: string) => definitions.isDynamic(\"effect\", id),\n listDynamic: () => definitions.listDynamic(\"effect\"),\n },\n resolvers: {\n // biome-ignore lint/suspicious/noExplicitAny: Runtime accepts any resolver def shape\n register: (id: string, def: any) => definitions.register(\"resolver\", id, def),\n // biome-ignore lint/suspicious/noExplicitAny: Runtime accepts any resolver def shape\n assign: (id: string, def: any) => definitions.assign(\"resolver\", id, def),\n unregister: (id: string) => definitions.unregister(\"resolver\", id),\n call: (id: string, requirement: { type: string; [key: string]: unknown }) => definitions.call(\"resolver\", id, requirement) as Promise<void>,\n isDynamic: (id: string) => definitions.isDynamic(\"resolver\", id),\n listDynamic: () => definitions.listDynamic(\"resolver\"),\n },\n\n get trace(): TraceEntry[] | null {\n return traceManager.getEntries();\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 if (state.isDestroyed) return;\n this.stop();\n state.isDestroyed = true;\n // Clean up store listeners\n (store as unknown as Record<string, () => void>).destroy?.();\n // Clean up resolvers (statuses, caches)\n resolversManager.destroy();\n // Clean up error boundary\n errorBoundary.clearErrors();\n settlementListeners.clear();\n historyListeners.clear();\n // Clean up trace state (C1)\n traceManager.destroy();\n // Clean up dynamic definition state\n definitions.destroy();\n pluginManager.emitDestroy(system);\n },\n\n dispatch(event: SystemEvent): void {\n if (BLOCKED_PROPS.has(event.type)) return;\n dispatchEventByName(event.type, event as Record<string, unknown>);\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 traceEnabled,\n ...(traceEnabled\n ? {\n trace: (traceManager.getEntries() ?? []).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 getOriginal(type: \"constraint\" | \"resolver\" | \"derivation\" | \"effect\", id: string): unknown | undefined {\n return definitions.getOriginal(type, id);\n },\n\n restoreOriginal(type: \"constraint\" | \"resolver\" | \"derivation\" | \"effect\", id: string): boolean {\n return definitions.restoreOriginal(type, id);\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 onHistoryChange(listener: () => void): () => void {\n historyListeners.add(listener);\n return () => {\n historyListeners.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, derived: 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 history?: { 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 if (section === \"schema\" && key.startsWith(\"$\")) {\n throw new Error(\n `[Directive] Module \"${module.id}\" has schema key \"${key}\" starting with \"$\". ` +\n \"Keys starting with $ are reserved for internal accessors ($store, $snapshot).\",\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.history?.snapshotEvents) {\n if (snapshotEventNames === null) {\n // First module with history.snapshotEvents — initialize the set with all existing event names\n snapshotEventNames = new Set<string>(Object.keys(mergedEvents));\n }\n for (const eventName of module.history.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 { BLOCKED_PROPS } from \"./tracking.js\";\nimport type {\n CreateSystemOptionsNamed,\n CreateSystemOptionsSingle,\n ErrorBoundaryConfig,\n HistoryOption,\n ModuleDef,\n ModuleSchema,\n ModulesMap,\n NamespacedSystem,\n SingleModuleSystem,\n TraceOption,\n} from \"./types.js\";\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 * @remarks\n * The system is the top-level runtime object. It owns the reconciliation loop,\n * manages plugins, and exposes reactive accessors for facts, derivations, and events.\n * Call `system.start()` to begin the lifecycle (init → ready → running → settled).\n *\n * @param options - System configuration with either `module` (single) or `modules` (namespaced)\n * @returns A fully-typed {@link System} instance with reactive accessors\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 *\n * @public\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>;\n/** @internal Implementation overload — see public overloads above. */\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 // Detect single ModuleDef accidentally passed to `modules:` instead of `module:`\n const mods = namedOptions.modules as Record<string, unknown>;\n if (mods && typeof mods === \"object\" && \"id\" in mods && \"schema\" in mods) {\n throw new Error(\n \"[Directive] A single module was passed to `modules:`. \" +\n \"For a single module, use `module:` instead:\\n\\n\" +\n \" createSystem({ module: myModule })\\n\\n\" +\n \"For multiple modules, wrap in an object:\\n\" +\n \" createSystem({ modules: { myName: myModule } })\",\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 historyConfig =\n typeof options.history === \"object\" ? options.history : null;\n const snapshotModulesSet = historyConfig?.snapshotModules\n ? new Set(historyConfig.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\" && historyConfig?.snapshotModules) {\n for (const name of historyConfig.snapshotModules) {\n if (!moduleNamespaces.has(name)) {\n console.warn(\n `[Directive] history.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 const { history, trace, errorBoundary } = applyZeroConfigDefaults(options);\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 history: {\n snapshotEvents:\n snapshotModulesSet && !snapshotModulesSet.has(namespace)\n ? [] // Module excluded from snapshots\n : mod.history?.snapshotEvents?.map(\n (e: string) => `${namespace}${SEPARATOR}${e}`,\n ),\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 history: mod.history,\n })) as any,\n plugins: options.plugins,\n history,\n trace,\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 history: engine.history,\n derive: namespacedDeriveProxy,\n events: namespacedEventsProxy,\n constraints: engine.constraints,\n effects: engine.effects,\n resolvers: engine.resolvers,\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 engine.dispatch(event);\n },\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 /**\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 history: {\n snapshotEvents:\n snapshotModulesSet && !snapshotModulesSet.has(namespace)\n ? [] // Module excluded from snapshots\n : mod.history?.snapshotEvents?.map(\n (e: string) => `${namespace}${SEPARATOR}${e}`,\n ),\n },\n });\n },\n\n // biome-ignore lint/suspicious/noExplicitAny: Type narrowing for NamespacedSystem\n } as any;\n\n bindEnginePassthroughs(system, engine);\n warnIfNotStarted(system);\n\n return system;\n}\n\n// ============================================================================\n// Shared Helpers (deduplication between single-module and namespaced systems)\n// ============================================================================\n\n/**\n * Apply zero-config defaults to system options (history, trace, errorBoundary).\n * Returns the resolved values; does not mutate the options object.\n */\nfunction applyZeroConfigDefaults(options: {\n zeroConfig?: boolean;\n history?: HistoryOption;\n trace?: TraceOption;\n errorBoundary?: ErrorBoundaryConfig;\n}): {\n history: HistoryOption | undefined;\n trace: TraceOption | undefined;\n errorBoundary: ErrorBoundaryConfig | undefined;\n} {\n let history: HistoryOption | undefined = options.history;\n let trace: TraceOption | undefined = options.trace;\n let errorBoundary: ErrorBoundaryConfig | undefined = options.errorBoundary;\n\n if (options.zeroConfig) {\n const isDev = process.env.NODE_ENV !== \"production\";\n\n history = history ?? isDev;\n\n errorBoundary = {\n onConstraintError: \"skip\",\n onResolverError: \"skip\",\n onEffectError: \"skip\",\n onDerivationError: \"skip\",\n ...options.errorBoundary,\n };\n }\n\n return { history, trace, errorBoundary };\n}\n\n/**\n * Bind shared engine passthrough properties and methods onto a system object.\n * These are identical between single-module and namespaced systems.\n */\nfunction bindEnginePassthroughs(\n // biome-ignore lint/suspicious/noExplicitAny: Engine type\n system: any,\n // biome-ignore lint/suspicious/noExplicitAny: Engine type\n engine: any,\n): void {\n Object.defineProperties(system, {\n trace: {\n get() {\n return engine.trace;\n },\n enumerable: true,\n configurable: true,\n },\n isRunning: {\n get() {\n return engine.isRunning;\n },\n enumerable: true,\n configurable: true,\n },\n isSettled: {\n get() {\n return engine.isSettled;\n },\n enumerable: true,\n configurable: true,\n },\n isInitialized: {\n get() {\n return engine.isInitialized;\n },\n enumerable: true,\n configurable: true,\n },\n isReady: {\n get() {\n return engine.isReady;\n },\n enumerable: true,\n configurable: true,\n },\n });\n\n system.whenReady = engine.whenReady.bind(engine);\n system.batch = engine.batch.bind(engine);\n system.onSettledChange = engine.onSettledChange.bind(engine);\n system.onHistoryChange = engine.onHistoryChange.bind(engine);\n system.inspect = engine.inspect.bind(engine);\n system.settle = engine.settle.bind(engine);\n system.explain = engine.explain.bind(engine);\n system.getSnapshot = engine.getSnapshot.bind(engine);\n system.restore = engine.restore.bind(engine);\n}\n\n/**\n * Emit a dev-mode warning if system.start() is never called.\n */\nfunction warnIfNotStarted(\n // biome-ignore lint/suspicious/noExplicitAny: System type\n system: any,\n): void {\n if (\n process.env.NODE_ENV !== \"production\" &&\n process.env.NODE_ENV !== \"test\"\n ) {\n setTimeout(() => {\n if (!system.isRunning && !system.isInitialized) {\n console.warn(\n \"[Directive] System created but start() was never called. \" +\n \"Constraints, resolvers, and effects will not run until you call system.start().\",\n );\n }\n }, 0);\n }\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) {\n return cached;\n }\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\") {\n return undefined;\n }\n if (BLOCKED_PROPS.has(prop)) {\n return undefined;\n }\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\") {\n return false;\n }\n if (BLOCKED_PROPS.has(prop)) {\n return false;\n }\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\") {\n return false;\n }\n if (BLOCKED_PROPS.has(prop)) {\n return false;\n }\n return `${namespace}${SEPARATOR}${prop}` in facts;\n },\n deleteProperty(_, prop: string | symbol) {\n if (typeof prop === \"symbol\") {\n return false;\n }\n if (BLOCKED_PROPS.has(prop)) {\n return false;\n }\n delete (facts as Record<string, unknown>)[\n `${namespace}${SEPARATOR}${prop}`\n ];\n return true;\n },\n defineProperty() {\n return false;\n },\n getPrototypeOf() {\n return null;\n },\n setPrototypeOf() {\n return false;\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) {\n return cached;\n }\n\n const proxy = new Proxy({} as Record<string, Record<string, unknown>>, {\n get(_, namespace: string | symbol) {\n if (typeof namespace === \"symbol\") {\n return undefined;\n }\n if (BLOCKED_PROPS.has(namespace)) {\n return undefined;\n }\n if (!Object.hasOwn(modulesMap, namespace)) {\n return undefined;\n }\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\") {\n return false;\n }\n if (BLOCKED_PROPS.has(namespace)) {\n return false;\n }\n return Object.hasOwn(modulesMap, namespace);\n },\n ownKeys() {\n return getModuleNames();\n },\n getOwnPropertyDescriptor(_, namespace: string | symbol) {\n if (typeof namespace === \"symbol\") {\n return undefined;\n }\n if (Object.hasOwn(modulesMap, namespace)) {\n return { configurable: true, enumerable: true };\n }\n return undefined;\n },\n defineProperty() {\n return false;\n },\n getPrototypeOf() {\n return null;\n },\n setPrototypeOf() {\n return false;\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) {\n return cached;\n }\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\") {\n return undefined;\n }\n if (BLOCKED_PROPS.has(key)) {\n return undefined;\n }\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\") {\n return false;\n }\n if (BLOCKED_PROPS.has(key)) {\n return false;\n }\n return key === \"self\" || depNamesSet.has(key);\n },\n ownKeys() {\n return allKeys;\n },\n getOwnPropertyDescriptor(_, key: string | symbol) {\n if (typeof key === \"symbol\") {\n return undefined;\n }\n if (key === \"self\" || depNamesSet.has(key)) {\n return { configurable: true, enumerable: true };\n }\n return undefined;\n },\n defineProperty() {\n return false;\n },\n getPrototypeOf() {\n return null;\n },\n setPrototypeOf() {\n return false;\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) {\n return cached;\n }\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\") {\n return undefined;\n }\n if (BLOCKED_PROPS.has(prop)) {\n return undefined;\n }\n return derive[`${namespace}${SEPARATOR}${prop}`];\n },\n has(_, prop: string | symbol) {\n if (typeof prop === \"symbol\") {\n return false;\n }\n if (BLOCKED_PROPS.has(prop)) {\n return false;\n }\n return `${namespace}${SEPARATOR}${prop}` in derive;\n },\n set() {\n return false;\n },\n defineProperty() {\n return false;\n },\n getPrototypeOf() {\n return null;\n },\n setPrototypeOf() {\n return false;\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) {\n return cached;\n }\n\n const proxy = new Proxy({} as Record<string, Record<string, unknown>>, {\n get(_, namespace: string | symbol) {\n if (typeof namespace === \"symbol\") {\n return undefined;\n }\n if (BLOCKED_PROPS.has(namespace)) {\n return undefined;\n }\n if (!Object.hasOwn(modulesMap, namespace)) {\n return undefined;\n }\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\") {\n return false;\n }\n if (BLOCKED_PROPS.has(namespace)) {\n return false;\n }\n return Object.hasOwn(modulesMap, namespace);\n },\n ownKeys() {\n return getModuleNames();\n },\n getOwnPropertyDescriptor(_, namespace: string | symbol) {\n if (typeof namespace === \"symbol\") {\n return undefined;\n }\n if (Object.hasOwn(modulesMap, namespace)) {\n return { configurable: true, enumerable: true };\n }\n return undefined;\n },\n set() {\n return false;\n },\n defineProperty() {\n return false;\n },\n getPrototypeOf() {\n return null;\n },\n setPrototypeOf() {\n return false;\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\") {\n return undefined;\n }\n if (BLOCKED_PROPS.has(namespace)) {\n return undefined;\n }\n if (!Object.hasOwn(modulesMap, namespace)) {\n return undefined;\n }\n\n // Check cache for this namespace's event proxy\n const cached = namespaceCache!.get(namespace);\n if (cached) {\n return cached;\n }\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\") {\n return undefined;\n }\n if (BLOCKED_PROPS.has(eventName)) {\n return undefined;\n }\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 set() {\n return false;\n },\n defineProperty() {\n return false;\n },\n getPrototypeOf() {\n return null;\n },\n setPrototypeOf() {\n return false;\n },\n },\n );\n\n namespaceCache!.set(namespace, moduleEventsProxy);\n return moduleEventsProxy;\n },\n has(_, namespace: string | symbol) {\n if (typeof namespace === \"symbol\") {\n return false;\n }\n if (BLOCKED_PROPS.has(namespace)) {\n return false;\n }\n return Object.hasOwn(modulesMap, namespace);\n },\n ownKeys() {\n return getModuleNames();\n },\n getOwnPropertyDescriptor(_, namespace: string | symbol) {\n if (typeof namespace === \"symbol\") {\n return undefined;\n }\n if (Object.hasOwn(modulesMap, namespace)) {\n return { configurable: true, enumerable: true };\n }\n return undefined;\n },\n set() {\n return false;\n },\n defineProperty() {\n return false;\n },\n getPrototypeOf() {\n return null;\n },\n setPrototypeOf() {\n return false;\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 const singleHistoryConfig =\n typeof options.history === \"object\" ? options.history : null;\n if (singleHistoryConfig?.snapshotModules) {\n console.warn(\n \"[Directive] history.snapshotModules has no effect in single-module mode. \" +\n \"Use history.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 const { history, trace, errorBoundary } = applyZeroConfigDefaults(options);\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 history: mod.history,\n },\n // biome-ignore lint/suspicious/noExplicitAny: Module format\n ] as any,\n plugins: options.plugins,\n history,\n trace,\n errorBoundary,\n tickMs: options.tickMs,\n onAfterModuleInit: () => {\n // Apply initialFacts\n if (options.initialFacts) {\n if (!isPrototypeSafe(options.initialFacts)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\n \"[Directive] initialFacts contains potentially dangerous keys. Skipping.\",\n );\n }\n } else {\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 }\n // Apply hydrated facts (takes precedence)\n if (hydratedFacts) {\n if (!isPrototypeSafe(hydratedFacts)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\n \"[Directive] hydrate() data contains potentially dangerous keys. Skipping.\",\n );\n }\n } else {\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 }\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\") {\n return undefined;\n }\n if (BLOCKED_PROPS.has(eventName)) {\n return undefined;\n }\n\n return (payload?: Record<string, unknown>) => {\n engine.dispatch({ type: eventName, ...payload });\n };\n },\n set() {\n return false;\n },\n defineProperty() {\n return false;\n },\n getPrototypeOf() {\n return null;\n },\n setPrototypeOf() {\n return false;\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 history: engine.history,\n derive: engine.derive,\n events: eventsProxy as SingleModuleSystem<S>[\"events\"],\n constraints: engine.constraints,\n effects: engine.effects,\n resolvers: engine.resolvers,\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 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 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 history: moduleDef.history,\n });\n },\n // biome-ignore lint/suspicious/noExplicitAny: Type narrowing\n } as any;\n\n bindEnginePassthroughs(system, engine);\n warnIfNotStarted(system);\n\n return system;\n}\n","/**\n * Requirement Status Utilities\n *\n * Provides reactive tracking of requirement status for UI feedback.\n */\n\nimport type { Plugin, RequirementWithId } from \"../core/types.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Status of a requirement type */\nexport interface RequirementTypeStatus {\n /** Number of pending (unmet) requirements of this type */\n pending: number;\n /** Number of inflight (being resolved) requirements of this type */\n inflight: number;\n /** Number of failed requirements of this type */\n failed: number;\n /** Whether any requirements of this type are loading (pending or inflight) */\n isLoading: boolean;\n /** Whether any requirements of this type have failed */\n hasError: boolean;\n /** Last error for this type (if any) */\n lastError: Error | null;\n}\n\n/** Status tracking state */\ninterface StatusState {\n pending: Map<string, Set<string>>; // type -> set of requirement IDs\n inflight: Map<string, Set<string>>; // type -> set of requirement IDs\n failed: Map<string, Set<string>>; // type -> set of requirement IDs\n errors: Map<string, Error>; // type -> last error\n listeners: Set<() => void>;\n}\n\n// ============================================================================\n// Requirement Status Plugin\n// ============================================================================\n\n/**\n * Create a plugin that tracks requirement status for reactive UI updates.\n *\n * @example\n * ```typescript\n * import { createRequirementStatusPlugin } from '@directive-run/core';\n *\n * const statusPlugin = createRequirementStatusPlugin();\n *\n * const system = createSystem({\n * modules: [myModule],\n * plugins: [statusPlugin.plugin],\n * });\n *\n * // Get status for a requirement type\n * const status = statusPlugin.getStatus(\"FETCH_USER\");\n * console.log(status.isLoading, status.hasError);\n *\n * // Subscribe to status changes\n * const unsubscribe = statusPlugin.subscribe(() => {\n * console.log(\"Status changed:\", statusPlugin.getStatus(\"FETCH_USER\"));\n * });\n * ```\n */\nexport function createRequirementStatusPlugin(): {\n plugin: Plugin<never>;\n getStatus: (type: string) => RequirementTypeStatus;\n getAllStatus: () => Map<string, RequirementTypeStatus>;\n subscribe: (listener: () => void) => () => void;\n reset: () => void;\n} {\n const state: StatusState = {\n pending: new Map(),\n inflight: new Map(),\n failed: new Map(),\n errors: new Map(),\n listeners: new Set(),\n };\n\n /** Notify all listeners */\n function notify(): void {\n for (const listener of state.listeners) {\n listener();\n }\n }\n\n /** Get or create a set for a type in a map */\n function getOrCreateSet(\n map: Map<string, Set<string>>,\n type: string,\n ): Set<string> {\n let set = map.get(type);\n if (!set) {\n set = new Set();\n map.set(type, set);\n }\n return set;\n }\n\n /** Get status for a requirement type */\n function getStatus(type: string): RequirementTypeStatus {\n const pendingSet = state.pending.get(type) ?? new Set();\n const inflightSet = state.inflight.get(type) ?? new Set();\n const failedSet = state.failed.get(type) ?? new Set();\n const lastError = state.errors.get(type) ?? null;\n\n return {\n pending: pendingSet.size,\n inflight: inflightSet.size,\n failed: failedSet.size,\n isLoading: pendingSet.size > 0 || inflightSet.size > 0,\n hasError: failedSet.size > 0,\n lastError,\n };\n }\n\n /** Get status for all tracked types */\n function getAllStatus(): Map<string, RequirementTypeStatus> {\n const allTypes = new Set([\n ...state.pending.keys(),\n ...state.inflight.keys(),\n ...state.failed.keys(),\n ]);\n\n const result = new Map<string, RequirementTypeStatus>();\n for (const type of allTypes) {\n result.set(type, getStatus(type));\n }\n return result;\n }\n\n /** Subscribe to status changes */\n function subscribe(listener: () => void): () => void {\n state.listeners.add(listener);\n return () => state.listeners.delete(listener);\n }\n\n /** Reset all status */\n function reset(): void {\n state.pending.clear();\n state.inflight.clear();\n state.failed.clear();\n state.errors.clear();\n notify();\n }\n\n const plugin: Plugin<never> = {\n name: \"requirement-status\",\n\n onRequirementCreated(req: RequirementWithId) {\n const type = req.requirement.type;\n getOrCreateSet(state.pending, type).add(req.id);\n // Clear from failed when a new requirement is created\n state.failed.get(type)?.delete(req.id);\n notify();\n },\n\n onResolverStart(_resolver: string, req: RequirementWithId) {\n const type = req.requirement.type;\n // Move from pending to inflight\n state.pending.get(type)?.delete(req.id);\n getOrCreateSet(state.inflight, type).add(req.id);\n notify();\n },\n\n onResolverComplete(_resolver: string, req: RequirementWithId) {\n const type = req.requirement.type;\n // Remove from inflight\n state.inflight.get(type)?.delete(req.id);\n state.pending.get(type)?.delete(req.id);\n notify();\n },\n\n onResolverError(_resolver: string, req: RequirementWithId, error: unknown) {\n const type = req.requirement.type;\n // Move from inflight to failed\n state.inflight.get(type)?.delete(req.id);\n getOrCreateSet(state.failed, type).add(req.id);\n state.errors.set(\n type,\n error instanceof Error ? error : new Error(String(error)),\n );\n notify();\n },\n\n onResolverCancel(_resolver: string, req: RequirementWithId) {\n const type = req.requirement.type;\n // Remove from all tracking\n state.pending.get(type)?.delete(req.id);\n state.inflight.get(type)?.delete(req.id);\n notify();\n },\n\n onRequirementMet(req: RequirementWithId) {\n const type = req.requirement.type;\n // Clean up when requirement is met\n state.pending.get(type)?.delete(req.id);\n state.inflight.get(type)?.delete(req.id);\n notify();\n },\n };\n\n return {\n plugin,\n getStatus,\n getAllStatus,\n subscribe,\n reset,\n };\n}\n\n// ============================================================================\n// React Hook Helper (for use with React adapter)\n// ============================================================================\n\n/**\n * Create a hook factory for requirement status.\n * This is designed to be used with React's useSyncExternalStore.\n *\n * @example\n * ```typescript\n * import { useSyncExternalStore } from 'react';\n * import { createRequirementStatusPlugin, createStatusHook } from '@directive-run/core';\n *\n * const statusPlugin = createRequirementStatusPlugin();\n * const useRequirementStatus = createStatusHook(statusPlugin);\n *\n * function MyComponent() {\n * const status = useRequirementStatus(\"FETCH_USER\");\n * if (status.isLoading) return <Spinner />;\n * if (status.hasError) return <Error error={status.lastError} />;\n * return <Content />;\n * }\n * ```\n */\nexport function createStatusHook(\n statusPlugin: ReturnType<typeof createRequirementStatusPlugin>,\n): (type: string) => RequirementTypeStatus {\n // This returns a function that can be used with useSyncExternalStore\n // The actual hook implementation would be in the React adapter\n return (type: string) => statusPlugin.getStatus(type);\n}\n","/**\n * System with Status Plugin Helper\n *\n * Convenience function for creating a system with status tracking enabled.\n */\n\nimport { createSystem } from \"../core/system.js\";\nimport type {\n ErrorBoundaryConfig,\n ModuleDef,\n ModuleSchema,\n Plugin,\n SingleModuleSystem,\n TraceOption,\n} from \"../core/types.js\";\nimport { createRequirementStatusPlugin } from \"./requirement-status.js\";\n\n/** Options for createSystemWithStatus */\nexport interface CreateSystemWithStatusOptions<M extends ModuleSchema> {\n /** The module to use for the system */\n module: ModuleDef<M>;\n /** Additional plugins to include alongside the status plugin */\n // biome-ignore lint/suspicious/noExplicitAny: Plugin generic contravariance issues\n plugins?: Plugin<any>[];\n /** Trace: per-run reconciliation changelog */\n trace?: TraceOption;\n /** Error boundary configuration */\n errorBoundary?: ErrorBoundaryConfig;\n /** Tick interval in milliseconds */\n tickMs?: number;\n /** Enable zero-config mode */\n zeroConfig?: boolean;\n /** Initial facts to set on the system */\n // biome-ignore lint/suspicious/noExplicitAny: Facts type varies by module\n initialFacts?: Record<string, any>;\n}\n\n/** Return type for createSystemWithStatus */\nexport interface SystemWithStatus<M extends ModuleSchema> {\n /**\n * The Directive system instance.\n * This is a SingleModuleSystem - use system.facts, system.dispatch(), etc.\n */\n system: SingleModuleSystem<M>;\n /** The status plugin for use with useRequirementStatus hooks */\n statusPlugin: ReturnType<typeof createRequirementStatusPlugin>;\n}\n\n/**\n * Create a Directive system with a status plugin pre-configured.\n *\n * This is a convenience wrapper around `createSystem` and `createRequirementStatusPlugin`\n * that handles the wiring automatically. The status plugin is added to the system's\n * plugins array so it receives lifecycle events.\n *\n * @param options - System configuration options\n * @returns An object containing both the system and the statusPlugin\n *\n * @example\n * ```tsx\n * import { createSystemWithStatus } from '@directive-run/core';\n * import { useRequirementStatus, useFact } from '@directive-run/react';\n *\n * // Simple setup - no provider needed\n * const { system, statusPlugin } = createSystemWithStatus({\n * module: myModule,\n * });\n * system.start();\n *\n * function App() {\n * const data = useFact(system, \"data\");\n * return <LoadingIndicator />;\n * }\n *\n * function LoadingIndicator() {\n * const status = useRequirementStatus(statusPlugin, \"FETCH_DATA\");\n * if (status.isLoading) return <Spinner />;\n * if (status.hasError) return <Error message={status.lastError?.message} />;\n * return <Content />;\n * }\n * ```\n */\nexport function createSystemWithStatus<M extends ModuleSchema>(\n options: CreateSystemWithStatusOptions<M>,\n): SystemWithStatus<M> {\n // Create the status plugin\n const statusPlugin = createRequirementStatusPlugin();\n\n // Add the plugin to the options\n const existingPlugins = options.plugins ?? [];\n\n // Create the system with the status plugin included\n // Use type assertion to bypass overload resolution issues\n // biome-ignore lint/suspicious/noExplicitAny: Required for overload compatibility\n const allPlugins = [...existingPlugins, statusPlugin.plugin] as Plugin<any>[];\n // biome-ignore lint/suspicious/noExplicitAny: Required for overload compatibility\n const system = createSystem({\n module: options.module,\n plugins: allPlugins,\n trace: options.trace,\n errorBoundary: options.errorBoundary,\n tickMs: options.tickMs,\n zeroConfig: options.zeroConfig,\n initialFacts: options.initialFacts,\n // biome-ignore lint/suspicious/noExplicitAny: Required for overload compatibility\n } as any);\n\n return {\n // The system returned by createSystem with a single module is a SingleModuleSystem\n system: system as SingleModuleSystem<M>,\n statusPlugin,\n };\n}\n","/**\n * @directive-run/core\n *\n * Constraint-driven runtime for TypeScript.\n *\n * Also available:\n * - `@directive-run/core/plugins` – Logging, devtools, persistence, observability, circuit breaker\n * - `@directive-run/core/testing` – Mock resolvers, fake timers, assertion helpers\n * - `@directive-run/core/migration` – Redux/Zustand/XState migration codemods\n * - `@directive-run/core/adapter-utils` – Shared framework adapter utilities\n * - `@directive-run/core/worker` – Web Worker support\n *\n * @packageDocumentation\n */\n\n// ============================================================================\n// Core Types\n// ============================================================================\n\nexport type {\n // Schema\n Schema,\n SchemaType,\n InferSchema,\n InferSchemaType,\n // Consolidated Module Schema\n ModuleSchema,\n DerivationsSchema,\n EventsSchema,\n EventPayloadSchema,\n InferFacts,\n InferDerivations,\n InferSelectorState,\n InferEventPayloadFromSchema,\n InferEvents,\n InferRequirementPayloadFromSchema,\n InferRequirements,\n InferRequirementTypes,\n // Facts\n Facts,\n FactsSnapshot,\n FactsStore,\n FactChange,\n // Derivations\n DerivationsDef,\n DerivationState,\n DerivedValues,\n TypedDerivationsDef,\n // Effects\n EffectsDef,\n EffectCleanup,\n // Requirements\n Requirement,\n RequirementWithId,\n RequirementKeyFn,\n RequirementPayloadSchema,\n RequirementsSchema,\n RequirementOutput,\n // Constraints\n ConstraintsDef,\n ConstraintState,\n TypedConstraintDef,\n TypedConstraintsDef,\n // Resolvers\n ResolversDef,\n ResolverContext,\n ResolverStatus,\n RetryPolicy,\n BatchConfig,\n BatchItemResult,\n BatchResolveResults,\n TypedResolverContext,\n TypedResolverDef,\n TypedResolversDef,\n // Plugins\n Plugin,\n ReconcileResult,\n Snapshot,\n RecoveryStrategy,\n // Errors\n ErrorSource,\n ErrorBoundaryConfig,\n RetryLaterConfig,\n // Module\n ModuleDef,\n ModuleHooks,\n TypedEventsDef,\n // Events\n EventsDef,\n SystemEvent,\n EventsAccessorFromSchema,\n DispatchEventsFromSchema,\n FlexibleEventHandler,\n // System\n System,\n SystemConfig,\n // Runtime Controls\n ConstraintsControl,\n DerivationsControl,\n EffectsControl,\n ResolversControl,\n // Dynamic Definition Types\n DynamicConstraintDef,\n DynamicEffectDef,\n DynamicResolverDef,\n SystemInspection,\n SystemSnapshot,\n TraceEntry,\n TraceConfig,\n TraceOption,\n DistributableSnapshotOptions,\n DistributableSnapshot,\n HistoryConfig,\n HistoryOption,\n HistoryAPI,\n HistoryState,\n SnapshotMeta,\n RequirementExplanation,\n // Accessors\n DeriveAccessor,\n EventsAccessor,\n FactKeys,\n FactReturnType,\n DerivationKeys,\n DerivationReturnType,\n ObservableKeys,\n // Typed Helper Utilities\n TypedConstraint,\n TypedResolver,\n // Composition (Namespaced Multi-Module)\n ModulesMap,\n NamespacedFacts,\n MutableNamespacedFacts,\n NamespacedDerivations,\n UnionEvents,\n NamespacedSystem,\n NamespacedEventsAccessor,\n CreateSystemOptionsNamed,\n // Single Module (no namespace)\n CreateSystemOptionsSingle,\n SingleModuleSystem,\n // Type Guards\n SystemMode,\n AnySystem,\n // Cross-Module Dependencies (for modules)\n CrossModuleDeps,\n CrossModuleFactsWithSelf,\n CrossModuleDerivationFn,\n CrossModuleDerivationsDef,\n CrossModuleConstraintDef,\n CrossModuleConstraintsDef,\n CrossModuleEffectDef,\n CrossModuleEffectsDef,\n} from \"./core/types.js\";\n\n// ============================================================================\n// Core Classes\n// ============================================================================\n\nexport { DirectiveError } from \"./core/types.js\";\n\n// ============================================================================\n// Schema Type Builders\n// ============================================================================\n\n/**\n * Schema type builders for defining fact types.\n *\n * Provides type-safe schema definitions with optional runtime validation:\n *\n * **Basic Types:**\n * - `t.string<T>()` - String type (with optional literal union)\n * - `t.number()` - Number type with `.min()` and `.max()` validation\n * - `t.boolean()` - Boolean type\n * - `t.bigint()` - BigInt type for large integers\n *\n * **Complex Types:**\n * - `t.array<T>()` - Array type with `.of()`, `.nonEmpty()`, `.minLength()`, `.maxLength()`\n * - `t.object<T>()` - Object type with `.shape()`, `.nonNull()`, `.hasKeys()`\n * - `t.record<V>(valueType)` - Record/map type `Record<string, V>`\n * - `t.tuple(types...)` - Fixed-length tuple type\n * - `t.union(types...)` - Union of multiple types\n *\n * **Literal & Enum Types:**\n * - `t.enum(...values)` - String enum from literal values\n * - `t.literal(value)` - Exact value matching (string, number, or boolean)\n *\n * **Wrappers:**\n * - `t.nullable(type)` - Nullable wrapper (`T | null`)\n * - `t.optional(type)` - Optional wrapper (`T | undefined`)\n *\n * **Validation Types:**\n * - `t.date()` - Date type\n * - `t.uuid()` - UUID string format\n * - `t.email()` - Email string format\n * - `t.url()` - URL string format\n *\n * **Chainable Methods (available on most types):**\n * - `.default(value)` - Set default value\n * - `.transform(fn)` - Transform values\n * - `.brand<B>()` - Add branded/nominal type\n * - `.describe(text)` - Add schema documentation\n * - `.refine(predicate, message)` - Custom validation with error message\n * - `.nullable()` - Make nullable (chainable alternative to `t.nullable()`)\n * - `.optional()` - Make optional (chainable alternative to `t.optional()`)\n * - `.validate(fn)` - Add custom validator\n *\n * @example\n * ```ts\n * import { t } from '@directive-run/core';\n *\n * const schema = {\n * facts: {\n * count: t.number().min(0).default(0),\n * name: t.string().describe(\"User's display name\"),\n * status: t.enum(\"idle\", \"loading\", \"success\", \"error\"),\n * user: t.object<User>().nullable(),\n * config: t.object<Config>().optional(),\n * userId: t.string().brand<\"UserId\">(),\n * age: t.number().refine(n => n >= 0, \"Age must be non-negative\"),\n * },\n * derivations: {\n * doubled: t.number(),\n * },\n * events: {\n * increment: {},\n * setStatus: { status: t.enum(\"idle\", \"loading\", \"success\", \"error\") },\n * },\n * requirements: {},\n * };\n * ```\n */\nexport {\n t,\n type Branded,\n type ExtendedSchemaType,\n type ChainableSchemaType,\n} from \"./core/schema-builders.js\";\n\n// ============================================================================\n// Module & System\n// ============================================================================\n\nexport {\n createModule,\n createModuleFactory,\n type ModuleConfig,\n type ModuleConfigWithDeps,\n} from \"./core/module.js\";\nexport { createSystem } from \"./core/system.js\";\n// Convenience helper for status plugin setup\nexport { createSystemWithStatus } from \"./utils/system-with-status.js\";\n\n// Helper factory functions for external constraint/resolver definitions\nexport {\n createConstraintFactory,\n createResolverFactory,\n typedConstraint,\n typedResolver,\n} from \"./core/types.js\";\n\n// ============================================================================\n// Requirements Helpers\n// ============================================================================\n\nexport {\n req,\n forType,\n isRequirementType,\n generateRequirementId,\n RequirementSet,\n} from \"./core/requirements.js\";\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\nexport {\n isSingleModuleSystem,\n isNamespacedSystem,\n} from \"./core/types/composition.js\";\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * Backoff strategy constants for retry policies.\n * Use for autocomplete when configuring resolver retry policies.\n *\n * @example\n * ```ts\n * import { Backoff } from '@directive-run/core';\n *\n * const resolver = {\n * requirement: \"FETCH_DATA\",\n * retry: {\n * attempts: 3,\n * backoff: Backoff.Exponential, // Autocomplete-friendly!\n * initialDelay: 100,\n * },\n * resolve: async (req, ctx) => { ... },\n * };\n * ```\n */\nexport const Backoff = {\n /** No delay between retries */\n None: \"none\",\n /** Linear delay increase (initialDelay * attempt) */\n Linear: \"linear\",\n /** Exponential delay increase (initialDelay * 2^attempt) */\n Exponential: \"exponential\",\n} as const;\n\n// ============================================================================\n// Lower-level APIs (for advanced use)\n// ============================================================================\n\nexport {\n createFacts,\n createFactsStore,\n createFactsProxy,\n} from \"./core/facts.js\";\nexport { createDerivationsManager } from \"./core/derivations.js\";\nexport { createEffectsManager } from \"./core/effects.js\";\nexport { createConstraintsManager } from \"./core/constraints.js\";\nexport { createResolversManager, type InflightInfo } from \"./core/resolvers.js\";\nexport { createPluginManager } from \"./core/plugins.js\";\nexport {\n createErrorBoundaryManager,\n createRetryLaterManager,\n type PendingRetry,\n} from \"./core/errors.js\";\nexport {\n createHistoryManager,\n createDisabledHistory,\n} from \"./utils/history.js\";\nexport { createEngine } from \"./core/engine.js\";\n\n// ============================================================================\n// Tracking (for custom derivations)\n// ============================================================================\n\nexport {\n getCurrentTracker,\n isTracking,\n withTracking,\n withoutTracking,\n trackAccess,\n} from \"./core/tracking.js\";\n\n// ============================================================================\n// Requirement Status Utilities\n// ============================================================================\n\nexport {\n createRequirementStatusPlugin,\n createStatusHook,\n type RequirementTypeStatus,\n} from \"./utils/requirement-status.js\";\n\n// ============================================================================\n// Distributable Snapshot Utilities\n// ============================================================================\n\nexport {\n shallowEqual,\n isSnapshotExpired,\n validateSnapshot,\n diffSnapshots,\n signSnapshot,\n verifySnapshotSignature,\n isSignedSnapshot,\n type DistributableSnapshotLike,\n type SnapshotDiff,\n type SnapshotDiffEntry,\n type SignedSnapshot,\n} from \"./utils/utils.js\";\n\n// Migration utilities available via \"@directive-run/core/migration\" subpath export.\n// Not re-exported from main entrypoint to avoid bundle bloat for all consumers.\n"]}