@directive-run/core 0.1.1 → 0.3.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/plugins/logging.ts","../../src/plugins/devtools.ts","../../src/utils/utils.ts","../../src/plugins/persistence.ts","../../src/plugins/performance.ts","../../src/plugins/observability.ts","../../src/plugins/otlp-exporter.ts","../../src/plugins/circuit-breaker.ts"],"names":["LOG_LEVELS","loggingPlugin","options","level","filter","logger","prefix","minLevel","log","eventLevel","event","args","key","value","prev","changes","id","deps","result","active","error","req","byResolver","resolver","duration","attempt","snapshot","from","to","strategy","initDevtools","systems","name","devtoolsPlugin","trace","devtools","state","addEvent","type","data","system","isPrototypeSafe","obj","maxDepth","dangerousKeys","seen","check","val","depth","objVal","item","persistencePlugin","storage","include","exclude","debounce","onRestore","onSave","onError","saveTimeout","trackedKeys","shouldPersist","factKey","load","json","save","scheduleSave","sys","shouldSave","change","performancePlugin","onSlowConstraint","onSlowResolver","slowConstraintThresholdMs","slowResolverThresholdMs","constraints","resolvers","effects","reconcile","startedAt","reconcileStartTime","lastConstraintEvalEndTime","getConstraintMetrics","m","getResolverMetrics","getEffectMetrics","_active","now","timedEvals","_req","_error","_attempt","constraintsObj","resolversObj","effectsObj","generateId","calculatePercentile","values","percentile","sorted","a","b","index","createObservability","config","serviceName","metricsConfig","tracingConfig","alertConfigs","summaryMetricsConfig","events","summaryMetricNames","metricsEnabled","exportInterval","metricsExporter","maxDataPoints","tracingEnabled","sampleRate","maxSpans","tracingExporter","startTime","metricDataPoints","activeSpans","completedSpans","alertEvents","alertCooldowns","aggregatedMetrics","exportTimer","spansToExport","recordMetric","dataPoint","points","updateAggregation","checkAlerts","p","sum","firstPoint","lastValue","aggregated","metricName","alertConfig","metric","cooldownKey","lastAlert","cooldown","operator","threshold","triggered","alertEvent","getPercentiles","allValues","labels","operationName","parentSpanId","span","spanId","status","message","requestsMetric","errorsMetric","latencyMetric","tokensMetric","costMetric","totalRequests","totalErrors","errorRate","latencyPercentiles","percentiles","limit","activeAlertCount","createAgentMetrics","obs","agentName","guardrailName","toolName","fromAgent","toAgent","latencyMs","buildResource","attrs","toNanos","timestampMs","metricTypeToOTLP","convertMetrics","metrics","resource","scopeVersion","scopeMetrics","startTimeMs","dataPoints","otlpType","metricData","convertTraces","traces","spans","attributes","statusCode","createOTLPExporter","endpoint","headers","timeoutMs","fetchFn","url","send","path","body","controller","timer","response","err","CircuitBreakerOpenError","retryAfterMs","detail","msg","createCircuitBreaker","failureThreshold","recoveryTimeMs","halfOpenMaxRequests","failureWindowMs","observability","metricPrefix","isFailure","onStateChange","failureTimestamps","halfOpenRequests","halfOpenSuccesses","lastStateChange","openedAt","totalFailures","totalSuccesses","totalRejected","lastFailureTime","lastSuccessTime","transition","newState","oldState","getRecentFailures","cutoff","t","recordSuccess","recordFailure","maxTimestamps","fn","start"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Logging Plugin - Console logging for Directive events\n */\n\nimport type { Plugin, ModuleSchema } from \"../core/types.js\";\n\nexport interface LoggingPluginOptions {\n\t/** Log level */\n\tlevel?: \"debug\" | \"info\" | \"warn\" | \"error\";\n\t/** Filter function to include/exclude events */\n\tfilter?: (event: string) => boolean;\n\t/** Custom logger (defaults to console) */\n\tlogger?: Pick<Console, \"debug\" | \"info\" | \"warn\" | \"error\" | \"group\" | \"groupEnd\">;\n\t/** Prefix for log messages */\n\tprefix?: string;\n}\n\nconst LOG_LEVELS = { debug: 0, info: 1, warn: 2, error: 3 };\n\n/**\n * Create a logging plugin.\n *\n * @example\n * ```ts\n * const system = createSystem({\n * modules: [myModule],\n * plugins: [loggingPlugin({ level: \"debug\" })],\n * });\n * ```\n */\nexport function loggingPlugin<M extends ModuleSchema = ModuleSchema>(\n\toptions: LoggingPluginOptions = {},\n): Plugin<M> {\n\tconst {\n\t\tlevel = \"info\",\n\t\tfilter = () => true,\n\t\tlogger = console,\n\t\tprefix = \"[Directive]\",\n\t} = options;\n\n\tconst minLevel = LOG_LEVELS[level];\n\n\tconst log = (eventLevel: keyof typeof LOG_LEVELS, event: string, ...args: unknown[]) => {\n\t\tif (LOG_LEVELS[eventLevel] < minLevel) return;\n\t\tif (!filter(event)) return;\n\t\tlogger[eventLevel](`${prefix} ${event}`, ...args);\n\t};\n\n\treturn {\n\t\tname: \"logging\",\n\n\t\tonInit: () => log(\"debug\", \"init\"),\n\t\tonStart: () => log(\"info\", \"start\"),\n\t\tonStop: () => log(\"info\", \"stop\"),\n\t\tonDestroy: () => log(\"debug\", \"destroy\"),\n\n\t\tonFactSet: (key, value, prev) => {\n\t\t\tlog(\"debug\", \"fact.set\", { key, value, prev });\n\t\t},\n\n\t\tonFactDelete: (key, prev) => {\n\t\t\tlog(\"debug\", \"fact.delete\", { key, prev });\n\t\t},\n\n\t\tonFactsBatch: (changes) => {\n\t\t\tlog(\"debug\", \"facts.batch\", { count: changes.length, changes });\n\t\t},\n\n\t\tonDerivationCompute: (id, value, deps) => {\n\t\t\tlog(\"debug\", \"derivation.compute\", { id, value, deps });\n\t\t},\n\n\t\tonDerivationInvalidate: (id) => {\n\t\t\tlog(\"debug\", \"derivation.invalidate\", { id });\n\t\t},\n\n\t\tonReconcileStart: () => {\n\t\t\tlog(\"debug\", \"reconcile.start\");\n\t\t},\n\n\t\tonReconcileEnd: (result) => {\n\t\t\tlog(\"debug\", \"reconcile.end\", {\n\t\t\t\tunmet: result.unmet.length,\n\t\t\t\tinflight: result.inflight.length,\n\t\t\t\tcompleted: result.completed.length,\n\t\t\t\tcanceled: result.canceled.length,\n\t\t\t});\n\t\t},\n\n\t\tonConstraintEvaluate: (id, active) => {\n\t\t\tlog(\"debug\", \"constraint.evaluate\", { id, active });\n\t\t},\n\n\t\tonConstraintError: (id, error) => {\n\t\t\tlog(\"error\", \"constraint.error\", { id, error });\n\t\t},\n\n\t\tonRequirementCreated: (req) => {\n\t\t\tlog(\"debug\", \"requirement.created\", { id: req.id, type: req.requirement.type });\n\t\t},\n\n\t\tonRequirementMet: (req, byResolver) => {\n\t\t\tlog(\"info\", \"requirement.met\", { id: req.id, byResolver });\n\t\t},\n\n\t\tonRequirementCanceled: (req) => {\n\t\t\tlog(\"debug\", \"requirement.canceled\", { id: req.id });\n\t\t},\n\n\t\tonResolverStart: (resolver, req) => {\n\t\t\tlog(\"debug\", \"resolver.start\", { resolver, requirementId: req.id });\n\t\t},\n\n\t\tonResolverComplete: (resolver, req, duration) => {\n\t\t\tlog(\"info\", \"resolver.complete\", { resolver, requirementId: req.id, duration });\n\t\t},\n\n\t\tonResolverError: (resolver, req, error) => {\n\t\t\tlog(\"error\", \"resolver.error\", { resolver, requirementId: req.id, error });\n\t\t},\n\n\t\tonResolverRetry: (resolver, req, attempt) => {\n\t\t\tlog(\"warn\", \"resolver.retry\", { resolver, requirementId: req.id, attempt });\n\t\t},\n\n\t\tonResolverCancel: (resolver, req) => {\n\t\t\tlog(\"debug\", \"resolver.cancel\", { resolver, requirementId: req.id });\n\t\t},\n\n\t\tonEffectRun: (id) => {\n\t\t\tlog(\"debug\", \"effect.run\", { id });\n\t\t},\n\n\t\tonEffectError: (id, error) => {\n\t\t\tlog(\"error\", \"effect.error\", { id, error });\n\t\t},\n\n\t\tonSnapshot: (snapshot) => {\n\t\t\tlog(\"debug\", \"timetravel.snapshot\", { id: snapshot.id, trigger: snapshot.trigger });\n\t\t},\n\n\t\tonTimeTravel: (from, to) => {\n\t\t\tlog(\"info\", \"timetravel.jump\", { from, to });\n\t\t},\n\n\t\tonError: (error) => {\n\t\t\tlog(\"error\", \"error\", { source: error.source, sourceId: error.sourceId, message: error.message });\n\t\t},\n\n\t\tonErrorRecovery: (error, strategy) => {\n\t\t\tlog(\"warn\", \"error.recovery\", { source: error.source, sourceId: error.sourceId, strategy });\n\t\t},\n\t};\n}\n","/**\n * Devtools Plugin - Browser devtools integration\n *\n * Exposes the system to browser devtools via window.__DIRECTIVE__\n */\n\nimport type { Plugin, ModuleSchema, System } from \"../core/types.js\";\n\nexport interface DevtoolsPluginOptions {\n\t/** Name for this system in devtools */\n\tname?: string;\n\t/** Enable trace logging */\n\ttrace?: boolean;\n}\n\ninterface DevtoolsState<M extends ModuleSchema> {\n\tsystem: System<M> | null;\n\tevents: Array<{ timestamp: number; type: string; data: unknown }>;\n\tmaxEvents: number;\n}\n\ndeclare global {\n\tinterface Window {\n\t\t__DIRECTIVE__?: {\n\t\t\tsystems: Map<string, DevtoolsState<ModuleSchema>>;\n\t\t\tgetSystem(name?: string): System<ModuleSchema> | null;\n\t\t\tgetSystems(): string[];\n\t\t\tinspect(name?: string): unknown;\n\t\t\tgetEvents(name?: string): Array<{ timestamp: number; type: string; data: unknown }>;\n\t\t};\n\t}\n}\n\n/**\n * Initialize global devtools object.\n */\nfunction initDevtools(): NonNullable<Window[\"__DIRECTIVE__\"]> {\n\tif (typeof window === \"undefined\") {\n\t\t// Return no-op for non-browser environments\n\t\treturn {\n\t\t\tsystems: new Map(),\n\t\t\tgetSystem: () => null,\n\t\t\tgetSystems: () => [],\n\t\t\tinspect: () => null,\n\t\t\tgetEvents: () => [],\n\t\t};\n\t}\n\n\tif (!window.__DIRECTIVE__) {\n\t\tconst systems = new Map<string, DevtoolsState<ModuleSchema>>();\n\n\t\twindow.__DIRECTIVE__ = {\n\t\t\tsystems,\n\t\t\tgetSystem(name) {\n\t\t\t\tif (name) {\n\t\t\t\t\treturn systems.get(name)?.system ?? null;\n\t\t\t\t}\n\t\t\t\t// Return first system if no name specified\n\t\t\t\tconst first = systems.values().next().value;\n\t\t\t\treturn first?.system ?? null;\n\t\t\t},\n\t\t\tgetSystems() {\n\t\t\t\treturn [...systems.keys()];\n\t\t\t},\n\t\t\tinspect(name) {\n\t\t\t\tconst system = this.getSystem(name);\n\t\t\t\treturn system?.inspect() ?? null;\n\t\t\t},\n\t\t\tgetEvents(name) {\n\t\t\t\tif (name) {\n\t\t\t\t\treturn systems.get(name)?.events ?? [];\n\t\t\t\t}\n\t\t\t\tconst first = systems.values().next().value;\n\t\t\t\treturn first?.events ?? [];\n\t\t\t},\n\t\t};\n\t}\n\n\treturn window.__DIRECTIVE__;\n}\n\n/**\n * Create a devtools plugin.\n *\n * @example\n * ```ts\n * const system = createSystem({\n * modules: [myModule],\n * plugins: [devtoolsPlugin({ name: \"my-app\" })],\n * });\n *\n * // In browser console:\n * // __DIRECTIVE__.inspect()\n * // __DIRECTIVE__.getEvents()\n * ```\n */\nexport function devtoolsPlugin<M extends ModuleSchema = ModuleSchema>(\n\toptions: DevtoolsPluginOptions = {},\n): Plugin<M> {\n\tconst { name = \"default\", trace = false } = options;\n\n\tconst devtools = initDevtools();\n\tconst state: DevtoolsState<M> = {\n\t\tsystem: null,\n\t\tevents: [],\n\t\tmaxEvents: 1000,\n\t};\n\n\tdevtools.systems.set(name, state as DevtoolsState<ModuleSchema>);\n\n\tconst addEvent = (type: string, data: unknown) => {\n\t\tif (!trace) return;\n\n\t\tstate.events.push({\n\t\t\ttimestamp: Date.now(),\n\t\t\ttype,\n\t\t\tdata,\n\t\t});\n\n\t\t// Keep events bounded\n\t\tif (state.events.length > state.maxEvents) {\n\t\t\tstate.events.shift();\n\t\t}\n\t};\n\n\treturn {\n\t\tname: \"devtools\",\n\n\t\tonInit: (system) => {\n\t\t\tstate.system = system;\n\t\t\taddEvent(\"init\", {});\n\n\t\t\tif (typeof window !== \"undefined\") {\n\t\t\t\tconsole.log(\n\t\t\t\t\t`%c[Directive Devtools]%c System \"${name}\" initialized. Access via window.__DIRECTIVE__`,\n\t\t\t\t\t\"color: #7c3aed; font-weight: bold\",\n\t\t\t\t\t\"color: inherit\",\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\n\t\tonStart: () => addEvent(\"start\", {}),\n\t\tonStop: () => addEvent(\"stop\", {}),\n\n\t\tonDestroy: () => {\n\t\t\taddEvent(\"destroy\", {});\n\t\t\tdevtools.systems.delete(name);\n\t\t},\n\n\t\tonFactSet: (key, value, prev) => {\n\t\t\taddEvent(\"fact.set\", { key, value, prev });\n\t\t},\n\n\t\tonFactsBatch: (changes) => {\n\t\t\taddEvent(\"facts.batch\", { changes });\n\t\t},\n\n\t\tonReconcileStart: () => {\n\t\t\taddEvent(\"reconcile.start\", {});\n\t\t},\n\n\t\tonReconcileEnd: (result) => {\n\t\t\taddEvent(\"reconcile.end\", result);\n\t\t},\n\n\t\tonConstraintEvaluate: (id, active) => {\n\t\t\taddEvent(\"constraint.evaluate\", { id, active });\n\t\t},\n\n\t\tonRequirementCreated: (req) => {\n\t\t\taddEvent(\"requirement.created\", { id: req.id, type: req.requirement.type });\n\t\t},\n\n\t\tonRequirementMet: (req, byResolver) => {\n\t\t\taddEvent(\"requirement.met\", { id: req.id, byResolver });\n\t\t},\n\n\t\tonResolverStart: (resolver, req) => {\n\t\t\taddEvent(\"resolver.start\", { resolver, requirementId: req.id });\n\t\t},\n\n\t\tonResolverComplete: (resolver, req, duration) => {\n\t\t\taddEvent(\"resolver.complete\", { resolver, requirementId: req.id, duration });\n\t\t},\n\n\t\tonResolverError: (resolver, req, error) => {\n\t\t\taddEvent(\"resolver.error\", { resolver, requirementId: req.id, error: String(error) });\n\t\t},\n\n\t\tonSnapshot: (snapshot) => {\n\t\t\taddEvent(\"timetravel.snapshot\", { id: snapshot.id, trigger: snapshot.trigger });\n\t\t},\n\n\t\tonTimeTravel: (from, to) => {\n\t\t\taddEvent(\"timetravel.jump\", { from, to });\n\t\t},\n\n\t\tonError: (error) => {\n\t\t\taddEvent(\"error\", { source: error.source, sourceId: error.sourceId, message: error.message });\n\t\t},\n\t};\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\tpromise: Promise<T>,\n\tms: number,\n\terrorMessage: string,\n): Promise<T> {\n\tlet timeoutId: ReturnType<typeof setTimeout>;\n\n\tconst timeoutPromise = new Promise<never>((_, reject) => {\n\t\ttimeoutId = setTimeout(() => reject(new Error(errorMessage)), ms);\n\t});\n\n\ttry {\n\t\treturn await Promise.race([promise, timeoutPromise]);\n\t} finally {\n\t\tclearTimeout(timeoutId!);\n\t}\n}\n\n/**\n * Normalize an error to an Error instance.\n * Ensures consistent error handling throughout the library.\n *\n * @param error - The error to normalize (can be anything)\n * @returns An Error instance\n */\nexport function normalizeError(error: unknown): Error {\n\tif (error instanceof Error) {\n\t\treturn error;\n\t}\n\treturn new Error(String(error));\n}\n\n/**\n * Create a stable JSON string with sorted keys.\n * Handles circular references and deeply nested objects safely.\n *\n * @param value - The value to stringify\n * @param maxDepth - Maximum nesting depth (default: 50)\n * @returns A stable JSON string\n */\nexport function stableStringify(value: unknown, maxDepth = 50): string {\n\tconst seen = new WeakSet();\n\n\tfunction stringify(val: unknown, depth: number): string {\n\t\tif (depth > maxDepth) {\n\t\t\treturn '\"[max depth exceeded]\"';\n\t\t}\n\n\t\tif (val === null) return \"null\";\n\t\tif (val === undefined) return \"undefined\";\n\n\t\tconst type = typeof val;\n\n\t\tif (type === \"string\") return JSON.stringify(val);\n\t\tif (type === \"number\" || type === \"boolean\") return String(val);\n\t\tif (type === \"function\") return '\"[function]\"';\n\t\tif (type === \"symbol\") return '\"[symbol]\"';\n\n\t\tif (Array.isArray(val)) {\n\t\t\t// Check for circular reference\n\t\t\tif (seen.has(val)) {\n\t\t\t\treturn '\"[circular]\"';\n\t\t\t}\n\t\t\tseen.add(val);\n\t\t\tconst result = `[${val.map((v) => stringify(v, depth + 1)).join(\",\")}]`;\n\t\t\tseen.delete(val);\n\t\t\treturn result;\n\t\t}\n\n\t\tif (type === \"object\") {\n\t\t\tconst obj = val as Record<string, unknown>;\n\t\t\t// Check for circular reference\n\t\t\tif (seen.has(obj)) {\n\t\t\t\treturn '\"[circular]\"';\n\t\t\t}\n\t\t\tseen.add(obj);\n\t\t\tconst keys = Object.keys(obj).sort();\n\t\t\tconst pairs = keys.map((k) => `${JSON.stringify(k)}:${stringify(obj[k], depth + 1)}`);\n\t\t\tconst result = `{${pairs.join(\",\")}}`;\n\t\t\tseen.delete(obj);\n\t\t\treturn result;\n\t\t}\n\n\t\treturn '\"[unknown]\"';\n\t}\n\n\treturn stringify(value, 0);\n}\n\n/**\n * Check for prototype pollution in an object, including nested objects.\n * Returns true if the object is safe, false if dangerous keys are found.\n *\n * @param obj - The object to check\n * @param maxDepth - Maximum nesting depth to check (default: 50)\n * @returns True if safe, false if dangerous keys found\n */\nexport function isPrototypeSafe(obj: unknown, maxDepth = 50): boolean {\n\tconst dangerousKeys = new Set([\"__proto__\", \"constructor\", \"prototype\"]);\n\tconst seen = new WeakSet();\n\n\tfunction check(val: unknown, depth: number): boolean {\n\t\tif (depth > maxDepth) return false; // Fail safe at max depth - don't assume safety\n\t\tif (val === null || val === undefined) return true;\n\t\tif (typeof val !== \"object\") return true;\n\n\t\tconst objVal = val as Record<string, unknown>;\n\n\t\t// Check for circular reference\n\t\tif (seen.has(objVal)) return true;\n\t\tseen.add(objVal);\n\n\t\t// Check array elements\n\t\tif (Array.isArray(objVal)) {\n\t\t\tfor (const item of objVal) {\n\t\t\t\tif (!check(item, depth + 1)) {\n\t\t\t\t\tseen.delete(objVal);\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tseen.delete(objVal);\n\t\t\treturn true;\n\t\t}\n\n\t\t// Check object keys and values\n\t\tfor (const key of Object.keys(objVal)) {\n\t\t\tif (dangerousKeys.has(key)) {\n\t\t\t\tseen.delete(objVal);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (!check(objVal[key], depth + 1)) {\n\t\t\t\tseen.delete(objVal);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tseen.delete(objVal);\n\t\treturn true;\n\t}\n\n\treturn check(obj, 0);\n}\n\n/**\n * Shallow equality comparison for objects.\n * Used by React hooks to avoid unnecessary re-renders.\n *\n * @param a - First object\n * @param b - Second object\n * @returns True if objects are shallowly equal\n */\nexport function shallowEqual<T extends Record<string, unknown>>(a: T, b: T): boolean {\n\tif (a === b) return true;\n\tif (!a || !b) return false;\n\n\tconst keysA = Object.keys(a);\n\tconst keysB = Object.keys(b);\n\n\tif (keysA.length !== keysB.length) return false;\n\n\tfor (const key of keysA) {\n\t\tif (a[key] !== b[key]) return false;\n\t}\n\n\treturn true;\n}\n\n/**\n * Generate a simple hash string from an object.\n * Uses djb2 algorithm on the stable stringified value.\n *\n * **Limitations:**\n * - 32-bit hash output means collision probability increases with data set size\n * (birthday paradox: ~50% collision chance at ~77,000 distinct values)\n * - Suitable for: cache invalidation, change detection, deduplication of small sets\n * - NOT suitable for: cryptographic use, security-sensitive operations, large-scale deduplication\n *\n * For security-sensitive use cases requiring stronger collision resistance,\n * consider using a cryptographic hash like SHA-256.\n *\n * @param value - The value to hash\n * @returns A hex hash string (8 characters, 32 bits)\n */\nexport function hashObject(value: unknown): string {\n\tconst str = stableStringify(value);\n\tlet hash = 5381;\n\tfor (let i = 0; i < str.length; i++) {\n\t\thash = ((hash << 5) + hash) ^ str.charCodeAt(i);\n\t}\n\t// Convert to unsigned 32-bit and then to hex\n\treturn (hash >>> 0).toString(16);\n}\n\n// ============================================================================\n// Distributable Snapshot Utilities\n// ============================================================================\n\n/**\n * Distributable snapshot type for type-safe helper functions.\n */\nexport interface DistributableSnapshotLike<T = Record<string, unknown>> {\n\tdata: T;\n\tcreatedAt: number;\n\texpiresAt?: number;\n\tversion?: string;\n\tmetadata?: Record<string, unknown>;\n}\n\n/**\n * Check if a distributable snapshot has expired.\n * Returns false if the snapshot has no expiresAt field.\n *\n * @example\n * ```typescript\n * const snapshot = system.getDistributableSnapshot({ ttlSeconds: 3600 });\n * // ... later ...\n * if (isSnapshotExpired(snapshot)) {\n * // Refresh the snapshot\n * }\n * ```\n *\n * @param snapshot - The snapshot to check\n * @param now - Optional current timestamp (defaults to Date.now())\n * @returns True if the snapshot has expired, false otherwise\n */\nexport function isSnapshotExpired<T>(\n\tsnapshot: DistributableSnapshotLike<T>,\n\tnow: number = Date.now(),\n): boolean {\n\treturn snapshot.expiresAt !== undefined && now > snapshot.expiresAt;\n}\n\n/**\n * Validate a distributable snapshot and return its data.\n * Throws if the snapshot is malformed or has expired.\n *\n * @example\n * ```typescript\n * const cached = JSON.parse(await redis.get(`entitlements:${userId}`));\n * try {\n * const data = validateSnapshot(cached);\n * // Use data.canUseFeature, etc.\n * } catch (e) {\n * // Snapshot invalid or expired, refresh it\n * }\n * ```\n *\n * @example Using custom timestamp for testing\n * ```typescript\n * const snapshot = { data: { test: true }, createdAt: 1000, expiresAt: 2000 };\n * validateSnapshot(snapshot, 1500); // Returns { test: true }\n * validateSnapshot(snapshot, 2500); // Throws: Snapshot expired\n * ```\n *\n * @param snapshot - The snapshot to validate\n * @param now - Optional current timestamp (defaults to Date.now())\n * @returns The snapshot data if valid\n * @throws Error if the snapshot is malformed or has expired\n */\nexport function validateSnapshot<T>(\n\tsnapshot: DistributableSnapshotLike<T>,\n\tnow: number = Date.now(),\n): T {\n\t// Structural validation\n\tif (!snapshot || typeof snapshot !== \"object\") {\n\t\tthrow new Error(\n\t\t\t\"[Directive] Invalid snapshot: expected an object with 'data' and 'createdAt' properties.\",\n\t\t);\n\t}\n\tif (!(\"data\" in snapshot)) {\n\t\tthrow new Error(\n\t\t\t\"[Directive] Invalid snapshot: missing required 'data' property.\",\n\t\t);\n\t}\n\tif (!(\"createdAt\" in snapshot) || typeof snapshot.createdAt !== \"number\") {\n\t\tthrow new Error(\n\t\t\t\"[Directive] Invalid snapshot: missing or invalid 'createdAt' property (expected number).\",\n\t\t);\n\t}\n\n\t// Expiration validation\n\tif (isSnapshotExpired(snapshot, now)) {\n\t\tconst expiredAt = new Date(snapshot.expiresAt!).toISOString();\n\t\tthrow new Error(\n\t\t\t`[Directive] Snapshot expired at ${expiredAt}. Obtain a fresh snapshot from the source.`,\n\t\t);\n\t}\n\treturn snapshot.data;\n}\n\n/**\n * Diff result for a single changed value.\n */\nexport interface SnapshotDiffEntry {\n\t/** The key path that changed (e.g., \"canUseApi\" or \"limits.apiCalls\") */\n\tpath: string;\n\t/** The value in the old snapshot */\n\toldValue: unknown;\n\t/** The value in the new snapshot */\n\tnewValue: unknown;\n\t/** Type of change: \"added\", \"removed\", or \"changed\" */\n\ttype: \"added\" | \"removed\" | \"changed\";\n}\n\n/**\n * Result of diffing two snapshots.\n */\nexport interface SnapshotDiff {\n\t/** Whether the snapshots are identical */\n\tidentical: boolean;\n\t/** List of changes between snapshots */\n\tchanges: SnapshotDiffEntry[];\n\t/** Whether the version changed (if both have versions) */\n\tversionChanged: boolean;\n\t/** Old version (if available) */\n\toldVersion?: string;\n\t/** New version (if available) */\n\tnewVersion?: string;\n}\n\n/**\n * Compare two distributable snapshots and return the differences.\n * Useful for debugging, audit logs, and webhook payloads.\n *\n * @example\n * ```typescript\n * const oldSnapshot = system.getDistributableSnapshot({ includeVersion: true });\n * system.dispatch({ type: \"upgradePlan\", plan: \"pro\" });\n * const newSnapshot = system.getDistributableSnapshot({ includeVersion: true });\n *\n * const diff = diffSnapshots(oldSnapshot, newSnapshot);\n * if (!diff.identical) {\n * console.log(\"Changes:\", diff.changes);\n * // [{ path: \"canUseApi\", oldValue: false, newValue: true, type: \"changed\" }]\n * }\n * ```\n *\n * @param oldSnapshot - The previous snapshot\n * @param newSnapshot - The new snapshot\n * @returns A diff result with all changes\n */\nexport function diffSnapshots<T = Record<string, unknown>>(\n\toldSnapshot: DistributableSnapshotLike<T>,\n\tnewSnapshot: DistributableSnapshotLike<T>,\n): SnapshotDiff {\n\tconst changes: SnapshotDiffEntry[] = [];\n\n\t// Deep compare function\n\tfunction compare(\n\t\toldObj: unknown,\n\t\tnewObj: unknown,\n\t\tpath: string,\n\t): void {\n\t\t// Handle null/undefined\n\t\tif (oldObj === null || oldObj === undefined) {\n\t\t\tif (newObj !== null && newObj !== undefined) {\n\t\t\t\tchanges.push({ path, oldValue: oldObj, newValue: newObj, type: \"added\" });\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (newObj === null || newObj === undefined) {\n\t\t\tchanges.push({ path, oldValue: oldObj, newValue: newObj, type: \"removed\" });\n\t\t\treturn;\n\t\t}\n\n\t\t// Handle primitives\n\t\tif (typeof oldObj !== \"object\" || typeof newObj !== \"object\") {\n\t\t\tif (!Object.is(oldObj, newObj)) {\n\t\t\t\tchanges.push({ path, oldValue: oldObj, newValue: newObj, type: \"changed\" });\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Handle arrays\n\t\tif (Array.isArray(oldObj) && Array.isArray(newObj)) {\n\t\t\tif (oldObj.length !== newObj.length) {\n\t\t\t\tchanges.push({ path, oldValue: oldObj, newValue: newObj, type: \"changed\" });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfor (let i = 0; i < oldObj.length; i++) {\n\t\t\t\tcompare(oldObj[i], newObj[i], `${path}[${i}]`);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Handle objects\n\t\tconst oldRecord = oldObj as Record<string, unknown>;\n\t\tconst newRecord = newObj as Record<string, unknown>;\n\t\tconst allKeys = new Set([...Object.keys(oldRecord), ...Object.keys(newRecord)]);\n\n\t\tfor (const key of allKeys) {\n\t\t\tconst childPath = path ? `${path}.${key}` : key;\n\t\t\tif (!(key in oldRecord)) {\n\t\t\t\tchanges.push({ path: childPath, oldValue: undefined, newValue: newRecord[key], type: \"added\" });\n\t\t\t} else if (!(key in newRecord)) {\n\t\t\t\tchanges.push({ path: childPath, oldValue: oldRecord[key], newValue: undefined, type: \"removed\" });\n\t\t\t} else {\n\t\t\t\tcompare(oldRecord[key], newRecord[key], childPath);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compare data\n\tcompare(oldSnapshot.data, newSnapshot.data, \"\");\n\n\t// Check version change\n\tconst versionChanged = oldSnapshot.version !== newSnapshot.version &&\n\t\t(oldSnapshot.version !== undefined || newSnapshot.version !== undefined);\n\n\treturn {\n\t\tidentical: changes.length === 0,\n\t\tchanges,\n\t\tversionChanged,\n\t\toldVersion: oldSnapshot.version,\n\t\tnewVersion: newSnapshot.version,\n\t};\n}\n\n// ============================================================================\n// Snapshot Signing (HMAC)\n// ============================================================================\n\n/**\n * A signed distributable snapshot.\n * Contains the original snapshot plus a cryptographic signature.\n */\nexport interface SignedSnapshot<T = Record<string, unknown>>\n\textends DistributableSnapshotLike<T> {\n\t/** HMAC-SHA256 signature in hex format */\n\tsignature: string;\n\t/** Signing algorithm used */\n\talgorithm: \"hmac-sha256\";\n}\n\n/**\n * Check if a snapshot is signed.\n *\n * @param snapshot - The snapshot to check\n * @returns True if the snapshot has a signature\n */\nexport function isSignedSnapshot<T>(\n\tsnapshot: DistributableSnapshotLike<T> | SignedSnapshot<T>,\n): snapshot is SignedSnapshot<T> {\n\treturn \"signature\" in snapshot && typeof snapshot.signature === \"string\";\n}\n\n/**\n * Sign a distributable snapshot using HMAC-SHA256.\n * Creates a tamper-proof signature that can be verified later.\n *\n * **Security Notes:**\n * - Use a cryptographically random secret of at least 32 bytes\n * - Store the secret securely (environment variable, secrets manager)\n * - Never expose the secret to clients\n * - The signature covers all snapshot fields for integrity\n *\n * @example\n * ```typescript\n * const snapshot = system.getDistributableSnapshot({\n * includeDerivations: ['canUseFeature', 'limits'],\n * ttlSeconds: 3600,\n * });\n *\n * // Sign the snapshot (server-side only)\n * const signed = await signSnapshot(snapshot, process.env.SNAPSHOT_SECRET);\n *\n * // Store in JWT, Redis, or send to client\n * const jwt = createJWT({ snapshot: signed });\n *\n * // Later, verify the signature\n * const isValid = await verifySnapshotSignature(signed, process.env.SNAPSHOT_SECRET);\n * if (!isValid) {\n * throw new Error('Snapshot has been tampered with');\n * }\n * ```\n *\n * @param snapshot - The snapshot to sign\n * @param secret - The HMAC secret (string or Uint8Array)\n * @returns A signed snapshot with the signature attached\n */\nexport async function signSnapshot<T>(\n\tsnapshot: DistributableSnapshotLike<T>,\n\tsecret: string | Uint8Array,\n): Promise<SignedSnapshot<T>> {\n\t// Create a canonical representation for signing\n\tconst payload = stableStringify({\n\t\tdata: snapshot.data,\n\t\tcreatedAt: snapshot.createdAt,\n\t\texpiresAt: snapshot.expiresAt,\n\t\tversion: snapshot.version,\n\t\tmetadata: snapshot.metadata,\n\t});\n\n\tconst signature = await hmacSha256(payload, secret);\n\n\treturn {\n\t\t...snapshot,\n\t\tsignature,\n\t\talgorithm: \"hmac-sha256\",\n\t};\n}\n\n/**\n * Verify the signature of a signed snapshot.\n * Returns true if the signature is valid, false otherwise.\n *\n * **Important:** Always verify signatures before trusting snapshot data,\n * especially if the snapshot was received from an untrusted source (client, cache).\n *\n * @example\n * ```typescript\n * // Receive signed snapshot from client or cache\n * const snapshot = JSON.parse(cachedData);\n *\n * // Verify before using\n * const isValid = await verifySnapshotSignature(snapshot, process.env.SNAPSHOT_SECRET);\n * if (!isValid) {\n * throw new Error('Invalid snapshot signature - possible tampering');\n * }\n *\n * // Now safe to use snapshot.data\n * if (snapshot.data.canUseFeature.api) {\n * // Grant access\n * }\n * ```\n *\n * @param signedSnapshot - The signed snapshot to verify\n * @param secret - The HMAC secret (must match the signing secret)\n * @returns True if signature is valid, false otherwise\n */\nexport async function verifySnapshotSignature<T>(\n\tsignedSnapshot: SignedSnapshot<T>,\n\tsecret: string | Uint8Array,\n): Promise<boolean> {\n\tif (!signedSnapshot.signature || signedSnapshot.algorithm !== \"hmac-sha256\") {\n\t\treturn false;\n\t}\n\n\t// Recreate the canonical payload (same as signing)\n\tconst payload = stableStringify({\n\t\tdata: signedSnapshot.data,\n\t\tcreatedAt: signedSnapshot.createdAt,\n\t\texpiresAt: signedSnapshot.expiresAt,\n\t\tversion: signedSnapshot.version,\n\t\tmetadata: signedSnapshot.metadata,\n\t});\n\n\tconst expectedSignature = await hmacSha256(payload, secret);\n\n\t// Use timing-safe comparison\n\treturn timingSafeEqual(signedSnapshot.signature, expectedSignature);\n}\n\n/**\n * Create HMAC-SHA256 signature of a message.\n * Uses Web Crypto API for cross-platform support (Node.js, browsers, Deno, Bun).\n */\nasync function hmacSha256(\n\tmessage: string,\n\tsecret: string | Uint8Array,\n): Promise<string> {\n\t// Convert secret to Uint8Array if string\n\tconst secretBytes: Uint8Array =\n\t\ttypeof secret === \"string\" ? new TextEncoder().encode(secret) : secret;\n\n\t// Import key for HMAC\n\tconst algorithm: HmacImportParams = { name: \"HMAC\", hash: { name: \"SHA-256\" } };\n\tconst key = await crypto.subtle.importKey(\n\t\t\"raw\",\n\t\tsecretBytes as unknown as ArrayBuffer,\n\t\talgorithm,\n\t\tfalse,\n\t\t[\"sign\"],\n\t);\n\n\t// Sign the message\n\tconst messageBytes = new TextEncoder().encode(message);\n\tconst signature = await crypto.subtle.sign(\"HMAC\", key, messageBytes);\n\n\t// Convert to hex string\n\treturn Array.from(new Uint8Array(signature))\n\t\t.map((b) => b.toString(16).padStart(2, \"0\"))\n\t\t.join(\"\");\n}\n\n/**\n * Timing-safe string comparison to prevent timing attacks.\n * Both strings should be the same length (hex signatures from same algorithm).\n */\nfunction timingSafeEqual(a: string, b: string): boolean {\n\tif (a.length !== b.length) {\n\t\treturn false;\n\t}\n\n\tlet result = 0;\n\tfor (let i = 0; i < a.length; i++) {\n\t\tresult |= a.charCodeAt(i) ^ b.charCodeAt(i);\n\t}\n\treturn result === 0;\n}\n","/**\n * Persistence Plugin - Save/restore facts to storage\n */\n\nimport type { Plugin, ModuleSchema, System } from \"../core/types.js\";\nimport { isPrototypeSafe } from \"../utils/utils.js\";\n\nexport interface PersistencePluginOptions {\n\t/** Storage backend (localStorage, sessionStorage, or custom) */\n\tstorage: Storage;\n\t/** Key to use in storage */\n\tkey: string;\n\t/** Only persist these fact keys (default: all) */\n\tinclude?: string[];\n\t/** Exclude these fact keys from persistence */\n\texclude?: string[];\n\t/** Debounce saves by this many ms (default: 100) */\n\tdebounce?: number;\n\t/** Called when state is restored */\n\tonRestore?: (data: Record<string, unknown>) => void;\n\t/** Called when state is saved */\n\tonSave?: (data: Record<string, unknown>) => void;\n\t/** Called on error */\n\tonError?: (error: Error) => void;\n}\n\n/**\n * Create a persistence plugin.\n *\n * @example\n * ```ts\n * const system = createSystem({\n * modules: [myModule],\n * plugins: [\n * persistencePlugin({\n * storage: localStorage,\n * key: \"my-app-state\",\n * include: [\"user\", \"preferences\"],\n * }),\n * ],\n * });\n * ```\n */\nexport function persistencePlugin<M extends ModuleSchema = ModuleSchema>(\n\toptions: PersistencePluginOptions,\n): Plugin<M> {\n\tconst {\n\t\tstorage,\n\t\tkey,\n\t\tinclude,\n\t\texclude = [],\n\t\tdebounce = 100,\n\t\tonRestore,\n\t\tonSave,\n\t\tonError,\n\t} = options;\n\n\tlet saveTimeout: ReturnType<typeof setTimeout> | null = null;\n\tlet system: System<M> | null = null;\n\tconst trackedKeys = new Set<string>();\n\n\t/** Check if a key should be persisted */\n\tconst shouldPersist = (factKey: string): boolean => {\n\t\tif (exclude.includes(factKey)) return false;\n\t\tif (include) return include.includes(factKey);\n\t\treturn true;\n\t};\n\n\t/** Load state from storage */\n\tconst load = (): Record<string, unknown> | null => {\n\t\ttry {\n\t\t\tconst json = storage.getItem(key);\n\t\t\tif (!json) return null;\n\n\t\t\tconst data = JSON.parse(json);\n\t\t\tif (typeof data !== \"object\" || data === null) return null;\n\n\t\t\t// Security: Check for prototype pollution\n\t\t\tif (!isPrototypeSafe(data)) {\n\t\t\t\tonError?.(new Error(\"Potential prototype pollution detected in stored data\"));\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn data as Record<string, unknown>;\n\t\t} catch (error) {\n\t\t\tonError?.(error instanceof Error ? error : new Error(String(error)));\n\t\t\treturn null;\n\t\t}\n\t};\n\n\t/** Save state to storage */\n\tconst save = () => {\n\t\tif (!system) return;\n\n\t\ttry {\n\t\t\tconst data: Record<string, unknown> = {};\n\n\t\t\tfor (const factKey of trackedKeys) {\n\t\t\t\tif (shouldPersist(factKey)) {\n\t\t\t\t\tdata[factKey] = (system.facts as Record<string, unknown>)[factKey];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tstorage.setItem(key, JSON.stringify(data));\n\t\t\tonSave?.(data);\n\t\t} catch (error) {\n\t\t\tonError?.(error instanceof Error ? error : new Error(String(error)));\n\t\t}\n\t};\n\n\t/** Schedule a debounced save */\n\tconst scheduleSave = () => {\n\t\tif (saveTimeout) {\n\t\t\tclearTimeout(saveTimeout);\n\t\t}\n\t\tsaveTimeout = setTimeout(save, debounce);\n\t};\n\n\treturn {\n\t\tname: \"persistence\",\n\n\t\tonInit: (sys) => {\n\t\t\tsystem = sys;\n\n\t\t\t// Restore state from storage\n\t\t\tconst data = load();\n\t\t\tif (data) {\n\t\t\t\tsystem.facts.$store.batch(() => {\n\t\t\t\t\tfor (const [factKey, value] of Object.entries(data)) {\n\t\t\t\t\t\tif (shouldPersist(factKey)) {\n\t\t\t\t\t\t\t(system!.facts as Record<string, unknown>)[factKey] = value;\n\t\t\t\t\t\t\ttrackedKeys.add(factKey);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tonRestore?.(data);\n\t\t\t}\n\t\t},\n\n\t\tonDestroy: () => {\n\t\t\t// Final save before destroy\n\t\t\tif (saveTimeout) {\n\t\t\t\tclearTimeout(saveTimeout);\n\t\t\t}\n\t\t\tsave();\n\t\t},\n\n\t\tonFactSet: (factKey) => {\n\t\t\ttrackedKeys.add(factKey);\n\t\t\tif (shouldPersist(factKey)) {\n\t\t\t\tscheduleSave();\n\t\t\t}\n\t\t},\n\n\t\tonFactDelete: (factKey) => {\n\t\t\ttrackedKeys.delete(factKey);\n\t\t\tif (shouldPersist(factKey)) {\n\t\t\t\tscheduleSave();\n\t\t\t}\n\t\t},\n\n\t\tonFactsBatch: (changes) => {\n\t\t\tlet shouldSave = false;\n\t\t\tfor (const change of changes) {\n\t\t\t\tif (change.type === \"set\") {\n\t\t\t\t\ttrackedKeys.add(change.key);\n\t\t\t\t} else {\n\t\t\t\t\ttrackedKeys.delete(change.key);\n\t\t\t\t}\n\t\t\t\tif (shouldPersist(change.key)) {\n\t\t\t\t\tshouldSave = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (shouldSave) {\n\t\t\t\tscheduleSave();\n\t\t\t}\n\t\t},\n\t};\n}\n","/**\n * Performance Plugin - Track constraint, resolver, and reconciliation metrics\n *\n * Uses existing plugin hooks to measure performance without modifying core runtime.\n */\n\nimport type { Plugin, ModuleSchema } from \"../core/types.js\";\n\n/** Metrics for a single constraint */\nexport interface ConstraintMetrics {\n\tevaluations: number;\n\ttotalDurationMs: number;\n\tavgDurationMs: number;\n\tmaxDurationMs: number;\n\tlastEvaluatedAt: number;\n}\n\n/** Metrics for a single resolver */\nexport interface ResolverMetrics {\n\tstarts: number;\n\tcompletions: number;\n\terrors: number;\n\tretries: number;\n\tcancellations: number;\n\ttotalDurationMs: number;\n\tavgDurationMs: number;\n\tmaxDurationMs: number;\n\tlastCompletedAt: number;\n}\n\n/** Metrics for the reconciliation loop */\nexport interface ReconcileMetrics {\n\truns: number;\n\ttotalDurationMs: number;\n\tavgDurationMs: number;\n\tmaxDurationMs: number;\n}\n\n/** Metrics for effects */\nexport interface EffectMetrics {\n\truns: number;\n\terrors: number;\n\tlastRunAt: number;\n}\n\n/** Full performance snapshot */\nexport interface PerformanceSnapshot {\n\tconstraints: Record<string, ConstraintMetrics>;\n\tresolvers: Record<string, ResolverMetrics>;\n\teffects: Record<string, EffectMetrics>;\n\treconcile: ReconcileMetrics;\n\tuptime: number;\n}\n\n/** Options for the performance plugin */\nexport interface PerformancePluginOptions {\n\t/** Callback when a slow constraint is detected (default threshold: 16ms) */\n\tonSlowConstraint?: (id: string, durationMs: number) => void;\n\t/** Callback when a slow resolver is detected (default threshold: 1000ms) */\n\tonSlowResolver?: (id: string, durationMs: number) => void;\n\t/** Threshold in ms for slow constraint warning (default: 16) */\n\tslowConstraintThresholdMs?: number;\n\t/** Threshold in ms for slow resolver warning (default: 1000) */\n\tslowResolverThresholdMs?: number;\n}\n\n/**\n * Create a performance monitoring plugin.\n *\n * Tracks constraint evaluation time, resolver latency, reconciliation cost,\n * and effect runs using existing plugin hooks.\n *\n * @example\n * ```typescript\n * const perf = performancePlugin({\n * onSlowResolver: (id, ms) => console.warn(`Slow resolver ${id}: ${ms}ms`),\n * });\n *\n * const system = createSystem({\n * module: myModule,\n * plugins: [perf],\n * });\n *\n * // Later: get a performance snapshot\n * const snapshot = perf.getSnapshot();\n * console.log(snapshot.resolvers);\n * ```\n */\nexport function performancePlugin<M extends ModuleSchema = ModuleSchema>(\n\toptions: PerformancePluginOptions = {},\n): Plugin<M> & { getSnapshot(): PerformanceSnapshot; reset(): void } {\n\tconst {\n\t\tonSlowConstraint,\n\t\tonSlowResolver,\n\t\tslowConstraintThresholdMs = 16,\n\t\tslowResolverThresholdMs = 1000,\n\t} = options;\n\n\tconst constraints = new Map<string, ConstraintMetrics>();\n\tconst resolvers = new Map<string, ResolverMetrics>();\n\tconst effects = new Map<string, EffectMetrics>();\n\tconst reconcile: ReconcileMetrics = { runs: 0, totalDurationMs: 0, avgDurationMs: 0, maxDurationMs: 0 };\n\n\tlet startedAt = 0;\n\tlet reconcileStartTime = 0;\n\n\t// Track constraint evaluation timing within a reconcile cycle.\n\t// Since constraints are evaluated sequentially, the time between consecutive\n\t// onConstraintEvaluate calls approximates each constraint's evaluation time.\n\t// The first constraint in each cycle cannot be timed (no baseline), so only\n\t// subsequent constraints get duration metrics.\n\tlet lastConstraintEvalEndTime = 0;\n\n\tfunction getConstraintMetrics(id: string): ConstraintMetrics {\n\t\tlet m = constraints.get(id);\n\t\tif (!m) {\n\t\t\tm = { evaluations: 0, totalDurationMs: 0, avgDurationMs: 0, maxDurationMs: 0, lastEvaluatedAt: 0 };\n\t\t\tconstraints.set(id, m);\n\t\t}\n\t\treturn m;\n\t}\n\n\tfunction getResolverMetrics(id: string): ResolverMetrics {\n\t\tlet m = resolvers.get(id);\n\t\tif (!m) {\n\t\t\tm = { starts: 0, completions: 0, errors: 0, retries: 0, cancellations: 0, totalDurationMs: 0, avgDurationMs: 0, maxDurationMs: 0, lastCompletedAt: 0 };\n\t\t\tresolvers.set(id, m);\n\t\t}\n\t\treturn m;\n\t}\n\n\tfunction getEffectMetrics(id: string): EffectMetrics {\n\t\tlet m = effects.get(id);\n\t\tif (!m) {\n\t\t\tm = { runs: 0, errors: 0, lastRunAt: 0 };\n\t\t\teffects.set(id, m);\n\t\t}\n\t\treturn m;\n\t}\n\n\tconst plugin: Plugin<M> & { getSnapshot(): PerformanceSnapshot; reset(): void } = {\n\t\tname: \"performance\",\n\n\t\tonStart() {\n\t\t\tstartedAt = Date.now();\n\t\t},\n\n\t\tonConstraintEvaluate(id, _active) {\n\t\t\tconst now = performance.now();\n\t\t\tconst m = getConstraintMetrics(id);\n\t\t\tm.evaluations++;\n\t\t\tm.lastEvaluatedAt = Date.now();\n\n\t\t\t// Constraints evaluate sequentially within a reconcile cycle.\n\t\t\t// Measure duration as time since the previous constraint finished evaluating\n\t\t\t// (or since reconcileStart for the first constraint in the cycle).\n\t\t\t// The first constraint per cycle has no baseline and is not timed.\n\t\t\tif (lastConstraintEvalEndTime > 0) {\n\t\t\t\tconst duration = now - lastConstraintEvalEndTime;\n\t\t\t\tm.totalDurationMs += duration;\n\t\t\t\tconst timedEvals = m.evaluations; // approximation — some evals may be untimed\n\t\t\t\tm.avgDurationMs = m.totalDurationMs / timedEvals;\n\t\t\t\tif (duration > m.maxDurationMs) m.maxDurationMs = duration;\n\t\t\t\tif (duration > slowConstraintThresholdMs) {\n\t\t\t\t\tonSlowConstraint?.(id, duration);\n\t\t\t\t}\n\t\t\t}\n\t\t\tlastConstraintEvalEndTime = now;\n\t\t},\n\n\t\tonResolverStart(resolver, _req) {\n\t\t\tconst m = getResolverMetrics(resolver);\n\t\t\tm.starts++;\n\t\t},\n\n\t\tonResolverComplete(resolver, _req, duration) {\n\t\t\tconst m = getResolverMetrics(resolver);\n\t\t\tm.completions++;\n\t\t\tm.totalDurationMs += duration;\n\t\t\tm.avgDurationMs = m.totalDurationMs / m.completions;\n\t\t\tif (duration > m.maxDurationMs) m.maxDurationMs = duration;\n\t\t\tm.lastCompletedAt = Date.now();\n\t\t\tif (duration > slowResolverThresholdMs) {\n\t\t\t\tonSlowResolver?.(resolver, duration);\n\t\t\t}\n\t\t},\n\n\t\tonResolverError(resolver, _req, _error) {\n\t\t\tgetResolverMetrics(resolver).errors++;\n\t\t},\n\n\t\tonResolverRetry(resolver, _req, _attempt) {\n\t\t\tgetResolverMetrics(resolver).retries++;\n\t\t},\n\n\t\tonResolverCancel(resolver, _req) {\n\t\t\tgetResolverMetrics(resolver).cancellations++;\n\t\t},\n\n\t\tonEffectRun(id) {\n\t\t\tconst m = getEffectMetrics(id);\n\t\t\tm.runs++;\n\t\t\tm.lastRunAt = Date.now();\n\t\t},\n\n\t\tonEffectError(id, _error) {\n\t\t\tgetEffectMetrics(id).errors++;\n\t\t},\n\n\t\tonReconcileStart() {\n\t\t\treconcileStartTime = performance.now();\n\t\t\t// Reset constraint timing baseline — first constraint in this cycle won't be timed\n\t\t\tlastConstraintEvalEndTime = 0;\n\t\t},\n\n\t\tonReconcileEnd() {\n\t\t\tconst duration = performance.now() - reconcileStartTime;\n\t\t\treconcile.runs++;\n\t\t\treconcile.totalDurationMs += duration;\n\t\t\treconcile.avgDurationMs = reconcile.totalDurationMs / reconcile.runs;\n\t\t\tif (duration > reconcile.maxDurationMs) reconcile.maxDurationMs = duration;\n\t\t},\n\n\t\tgetSnapshot(): PerformanceSnapshot {\n\t\t\tconst constraintsObj: Record<string, ConstraintMetrics> = {};\n\t\t\tfor (const [id, m] of constraints) constraintsObj[id] = { ...m };\n\n\t\t\tconst resolversObj: Record<string, ResolverMetrics> = {};\n\t\t\tfor (const [id, m] of resolvers) resolversObj[id] = { ...m };\n\n\t\t\tconst effectsObj: Record<string, EffectMetrics> = {};\n\t\t\tfor (const [id, m] of effects) effectsObj[id] = { ...m };\n\n\t\t\treturn {\n\t\t\t\tconstraints: constraintsObj,\n\t\t\t\tresolvers: resolversObj,\n\t\t\t\teffects: effectsObj,\n\t\t\t\treconcile: { ...reconcile },\n\t\t\t\tuptime: startedAt ? Date.now() - startedAt : 0,\n\t\t\t};\n\t\t},\n\n\t\treset(): void {\n\t\t\tconstraints.clear();\n\t\t\tresolvers.clear();\n\t\t\teffects.clear();\n\t\t\treconcile.runs = 0;\n\t\t\treconcile.totalDurationMs = 0;\n\t\t\treconcile.avgDurationMs = 0;\n\t\t\treconcile.maxDurationMs = 0;\n\t\t\tlastConstraintEvalEndTime = 0;\n\t\t},\n\t};\n\n\treturn plugin;\n}\n","/**\n * Observability Dashboard Plugin\n *\n * Provides comprehensive monitoring, metrics collection, and dashboard integration\n * for AI agent operations.\n *\n * @example\n * ```typescript\n * import { createObservability, createAgentMetrics } from '@directive-run/ai';\n *\n * const observability = createObservability({\n * metrics: {\n * enabled: true,\n * exportInterval: 10000, // Export every 10 seconds\n * },\n * tracing: {\n * enabled: true,\n * sampleRate: 1.0, // 100% sampling for dev\n * },\n * alerts: [\n * { metric: 'agent.errors', threshold: 10, action: 'warn' },\n * { metric: 'agent.latency', threshold: 5000, action: 'alert' },\n * ],\n * });\n *\n * // Use createAgentMetrics for standard metric names (required for getDashboard() summary)\n * const agentMetrics = createAgentMetrics(observability);\n *\n * // Access dashboard data\n * const dashboard = observability.getDashboard();\n *\n * // Clean up when done\n * await observability.dispose();\n * ```\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Metric types that can be collected */\nexport type MetricType =\n\t| \"counter\"\n\t| \"gauge\"\n\t| \"histogram\"\n\t| \"summary\";\n\n/** A single metric data point */\nexport interface MetricDataPoint {\n\tname: string;\n\ttype: MetricType;\n\tvalue: number;\n\tlabels: Record<string, string>;\n\ttimestamp: number;\n}\n\n/** Histogram bucket for latency/size distributions */\nexport interface HistogramBucket {\n\tle: number; // less than or equal\n\tcount: number;\n}\n\n/** Aggregated metric for dashboard display */\nexport interface AggregatedMetric {\n\tname: string;\n\ttype: MetricType;\n\tcount: number;\n\tsum: number;\n\tmin: number;\n\tmax: number;\n\tavg: number;\n\tp50?: number;\n\tp90?: number;\n\tp99?: number;\n\tlastValue: number;\n\tlastUpdated: number;\n}\n\n/** Trace span for distributed tracing */\nexport interface TraceSpan {\n\ttraceId: string;\n\tspanId: string;\n\tparentSpanId?: string;\n\toperationName: string;\n\tserviceName: string;\n\tstartTime: number;\n\tendTime?: number;\n\tduration?: number;\n\tstatus: \"ok\" | \"error\" | \"timeout\";\n\ttags: Record<string, string | number | boolean>;\n\tlogs: Array<{\n\t\ttimestamp: number;\n\t\tmessage: string;\n\t\tlevel: \"debug\" | \"info\" | \"warn\" | \"error\";\n\t}>;\n}\n\n/** Alert configuration */\nexport interface AlertConfig {\n\tmetric: string;\n\tthreshold: number;\n\toperator?: \">\" | \"<\" | \">=\" | \"<=\" | \"==\";\n\taction: \"log\" | \"warn\" | \"alert\" | \"callback\";\n\tcallback?: (metric: AggregatedMetric, threshold: number) => void;\n\tcooldownMs?: number;\n}\n\n/** Alert event when threshold is crossed */\nexport interface AlertEvent {\n\talertId: string;\n\tmetric: string;\n\tcurrentValue: number;\n\tthreshold: number;\n\toperator: string;\n\taction: string;\n\ttimestamp: number;\n\tmessage: string;\n}\n\n/** Observability configuration */\nexport interface ObservabilityConfig {\n\t/** Service name for tracing */\n\tserviceName?: string;\n\t/** Metrics configuration */\n\tmetrics?: {\n\t\tenabled?: boolean;\n\t\t/** Export interval in milliseconds */\n\t\texportInterval?: number;\n\t\t/** Custom exporter function */\n\t\texporter?: (metrics: AggregatedMetric[]) => Promise<void>;\n\t\t/** Maximum data points to retain per metric */\n\t\tmaxDataPoints?: number;\n\t};\n\t/** Tracing configuration */\n\ttracing?: {\n\t\tenabled?: boolean;\n\t\t/** Sample rate (0.0 to 1.0) */\n\t\tsampleRate?: number;\n\t\t/** Maximum spans to retain */\n\t\tmaxSpans?: number;\n\t\t/** Custom trace exporter */\n\t\texporter?: (spans: TraceSpan[]) => Promise<void>;\n\t};\n\t/** Alert configurations */\n\talerts?: AlertConfig[];\n\t/**\n\t * Metric names used by `getDashboard().summary` and `getHealthStatus()`.\n\t * Defaults to `agent.requests`, `agent.errors`, `agent.latency`, `agent.tokens`, `agent.cost`.\n\t * Must match the metric names you record via `incrementCounter` / `observeHistogram`,\n\t * or use `createAgentMetrics()` which records with these default names.\n\t */\n\tsummaryMetrics?: {\n\t\trequests?: string;\n\t\terrors?: string;\n\t\tlatency?: string;\n\t\ttokens?: string;\n\t\tcost?: string;\n\t};\n\t/** Event callbacks */\n\tevents?: {\n\t\tonMetricRecorded?: (metric: MetricDataPoint) => void;\n\t\tonSpanStart?: (span: TraceSpan) => void;\n\t\tonSpanEnd?: (span: TraceSpan) => void;\n\t\tonAlert?: (alert: AlertEvent) => void;\n\t};\n}\n\n/** Dashboard data for UI display */\nexport interface DashboardData {\n\t/** Service info */\n\tservice: {\n\t\tname: string;\n\t\tuptime: number;\n\t\tstartTime: number;\n\t};\n\t/** Aggregated metrics */\n\tmetrics: Record<string, AggregatedMetric>;\n\t/** Recent traces */\n\ttraces: TraceSpan[];\n\t/** Active alerts */\n\talerts: AlertEvent[];\n\t/** Summary stats */\n\tsummary: {\n\t\ttotalRequests: number;\n\t\ttotalErrors: number;\n\t\terrorRate: number;\n\t\tavgLatency: number;\n\t\tp99Latency: number;\n\t\tactiveSpans: number;\n\t\ttotalTokens: number;\n\t\ttotalCost: number;\n\t};\n}\n\n/** Observability instance */\nexport interface ObservabilityInstance {\n\t/** Record a counter metric */\n\tincrementCounter(name: string, labels?: Record<string, string>, value?: number): void;\n\t/** Record a gauge metric */\n\tsetGauge(name: string, value: number, labels?: Record<string, string>): void;\n\t/** Record a histogram observation */\n\tobserveHistogram(name: string, value: number, labels?: Record<string, string>): void;\n\t/** Start a trace span */\n\tstartSpan(operationName: string, parentSpanId?: string): TraceSpan;\n\t/** End a trace span */\n\tendSpan(spanId: string, status?: \"ok\" | \"error\" | \"timeout\"): void;\n\t/** Add log to a span */\n\taddSpanLog(spanId: string, message: string, level?: \"debug\" | \"info\" | \"warn\" | \"error\"): void;\n\t/** Add tag to a span */\n\taddSpanTag(spanId: string, key: string, value: string | number | boolean): void;\n\t/** Get dashboard data */\n\tgetDashboard(): DashboardData;\n\t/** Get a specific metric */\n\tgetMetric(name: string): AggregatedMetric | undefined;\n\t/** Get recent traces */\n\tgetTraces(limit?: number): TraceSpan[];\n\t/** Get active alerts */\n\tgetAlerts(): AlertEvent[];\n\t/** Export all data */\n\texport(): { metrics: AggregatedMetric[]; traces: TraceSpan[]; alerts: AlertEvent[] };\n\t/** Clear all data and reset statistics */\n\tclear(): void;\n\t/** Dispose of the instance, clearing timers and flushing data */\n\tdispose(): Promise<void>;\n\t/** Get health status for status pages */\n\tgetHealthStatus(): {\n\t\thealthy: boolean;\n\t\tuptime: number;\n\t\terrorRate: number;\n\t\tactiveAlerts: number;\n\t};\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\nfunction generateId(): string {\n\treturn globalThis.crypto?.randomUUID?.() ?? `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 11)}`;\n}\n\nfunction calculatePercentile(values: number[], percentile: number): number {\n\tif (values.length === 0) return 0;\n\tconst sorted = [...values].sort((a, b) => a - b);\n\tconst index = Math.ceil((percentile / 100) * sorted.length) - 1;\n\treturn sorted[Math.max(0, index)] ?? 0;\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\n/**\n * Create an observability instance for monitoring AI agents.\n *\n * @example\n * ```typescript\n * const obs = createObservability({\n * serviceName: 'my-agent-service',\n * metrics: { enabled: true },\n * tracing: { enabled: true, sampleRate: 0.1 },\n * alerts: [\n * { metric: 'agent.errors', threshold: 10, action: 'alert' },\n * ],\n * });\n *\n * // Track agent operations\n * const span = obs.startSpan('agent.run');\n * obs.incrementCounter('agent.requests', { agent: 'support' });\n *\n * try {\n * await runAgent();\n * obs.observeHistogram('agent.latency', Date.now() - start);\n * obs.endSpan(span.spanId, 'ok');\n * } catch (e) {\n * obs.incrementCounter('agent.errors');\n * obs.endSpan(span.spanId, 'error');\n * }\n * ```\n */\nexport function createObservability(config: ObservabilityConfig = {}): ObservabilityInstance {\n\tconst {\n\t\tserviceName = \"directive-agents\",\n\t\tmetrics: metricsConfig = {},\n\t\ttracing: tracingConfig = {},\n\t\talerts: alertConfigs = [],\n\t\tsummaryMetrics: summaryMetricsConfig = {},\n\t\tevents = {},\n\t} = config;\n\n\tconst summaryMetricNames = {\n\t\trequests: summaryMetricsConfig.requests ?? \"agent.requests\",\n\t\terrors: summaryMetricsConfig.errors ?? \"agent.errors\",\n\t\tlatency: summaryMetricsConfig.latency ?? \"agent.latency\",\n\t\ttokens: summaryMetricsConfig.tokens ?? \"agent.tokens\",\n\t\tcost: summaryMetricsConfig.cost ?? \"agent.cost\",\n\t};\n\n\tconst {\n\t\tenabled: metricsEnabled = true,\n\t\texportInterval,\n\t\texporter: metricsExporter,\n\t\tmaxDataPoints = 1000,\n\t} = metricsConfig;\n\n\tconst {\n\t\tenabled: tracingEnabled = true,\n\t\tsampleRate = 1.0,\n\t\tmaxSpans = 1000,\n\t\texporter: tracingExporter,\n\t} = tracingConfig;\n\n\t// State\n\tconst startTime = Date.now();\n\tconst metricDataPoints = new Map<string, MetricDataPoint[]>();\n\tconst activeSpans = new Map<string, TraceSpan>();\n\tconst completedSpans: TraceSpan[] = [];\n\tconst alertEvents: AlertEvent[] = [];\n\tconst alertCooldowns = new Map<string, number>();\n\n\t// Aggregated metrics cache\n\tconst aggregatedMetrics = new Map<string, AggregatedMetric>();\n\n\t// Export timer\n\tlet exportTimer: ReturnType<typeof setInterval> | undefined;\n\tif (exportInterval && (metricsExporter || tracingExporter)) {\n\t\texportTimer = setInterval(async () => {\n\t\t\ttry {\n\t\t\t\tif (metricsExporter && metricsEnabled) {\n\t\t\t\t\tawait metricsExporter(Array.from(aggregatedMetrics.values()));\n\t\t\t\t}\n\t\t\t\tif (tracingExporter && tracingEnabled) {\n\t\t\t\t\tconst spansToExport = completedSpans.splice(0, 100);\n\t\t\t\t\tif (spansToExport.length > 0) {\n\t\t\t\t\t\tawait tracingExporter(spansToExport);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(\"[Directive Observability] Export error:\", error);\n\t\t\t}\n\t\t}, exportInterval);\n\t}\n\n\tfunction recordMetric(dataPoint: MetricDataPoint): void {\n\t\tif (!metricsEnabled) return;\n\n\t\tconst key = `${dataPoint.name}:${JSON.stringify(Object.fromEntries(Object.entries(dataPoint.labels).sort()))}`;\n\t\tlet points = metricDataPoints.get(key);\n\t\tif (!points) {\n\t\t\tpoints = [];\n\t\t\tmetricDataPoints.set(key, points);\n\t\t}\n\n\t\tpoints.push(dataPoint);\n\n\t\t// Trim old data points\n\t\tif (points.length > maxDataPoints) {\n\t\t\tpoints.shift();\n\t\t}\n\n\t\t// Update aggregation\n\t\tupdateAggregation(dataPoint.name, points);\n\n\t\tevents.onMetricRecorded?.(dataPoint);\n\n\t\t// Check alerts\n\t\tcheckAlerts(dataPoint.name);\n\t}\n\n\tfunction updateAggregation(name: string, points: MetricDataPoint[]): void {\n\t\tif (points.length === 0) return;\n\n\t\tconst values = points.map((p) => p.value);\n\t\tconst sum = values.reduce((a, b) => a + b, 0);\n\n\t\t// We've already checked points.length === 0 above, so these are safe\n\t\tconst firstPoint = points[0]!;\n\t\tconst lastValue = values[values.length - 1]!;\n\n\t\tconst aggregated: AggregatedMetric = {\n\t\t\tname,\n\t\t\ttype: firstPoint.type,\n\t\t\tcount: points.length,\n\t\t\tsum,\n\t\t\tmin: Math.min(...values),\n\t\t\tmax: Math.max(...values),\n\t\t\tavg: sum / points.length,\n\t\t\tlastValue,\n\t\t\tlastUpdated: Date.now(),\n\t\t};\n\n\t\taggregatedMetrics.set(name, aggregated);\n\t}\n\n\tfunction checkAlerts(metricName: string): void {\n\t\tfor (const alertConfig of alertConfigs) {\n\t\t\tif (alertConfig.metric !== metricName) continue;\n\n\t\t\tconst metric = aggregatedMetrics.get(metricName);\n\t\t\tif (!metric) continue;\n\n\t\t\tconst cooldownKey = `${alertConfig.metric}:${alertConfig.threshold}`;\n\t\t\tconst lastAlert = alertCooldowns.get(cooldownKey);\n\t\t\tconst cooldown = alertConfig.cooldownMs ?? 60000;\n\n\t\t\tif (lastAlert && Date.now() - lastAlert < cooldown) continue;\n\n\t\t\tconst operator = alertConfig.operator ?? \">\";\n\t\t\tconst value = metric.lastValue;\n\t\t\tconst threshold = alertConfig.threshold;\n\n\t\t\tlet triggered = false;\n\t\t\tswitch (operator) {\n\t\t\t\tcase \">\":\n\t\t\t\t\ttriggered = value > threshold;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"<\":\n\t\t\t\t\ttriggered = value < threshold;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \">=\":\n\t\t\t\t\ttriggered = value >= threshold;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"<=\":\n\t\t\t\t\ttriggered = value <= threshold;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"==\":\n\t\t\t\t\ttriggered = value === threshold;\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (triggered) {\n\t\t\t\tconst alertEvent: AlertEvent = {\n\t\t\t\t\talertId: generateId(),\n\t\t\t\t\tmetric: metricName,\n\t\t\t\t\tcurrentValue: value,\n\t\t\t\t\tthreshold,\n\t\t\t\t\toperator,\n\t\t\t\t\taction: alertConfig.action,\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\tmessage: `Alert: ${metricName} ${operator} ${threshold} (current: ${value})`,\n\t\t\t\t};\n\n\t\t\t\talertEvents.push(alertEvent);\n\t\t\t\tif (alertEvents.length > 1000) alertEvents.splice(0, alertEvents.length - 1000);\n\t\t\t\talertCooldowns.set(cooldownKey, Date.now());\n\n\t\t\t\tevents.onAlert?.(alertEvent);\n\n\t\t\t\tswitch (alertConfig.action) {\n\t\t\t\t\tcase \"log\":\n\t\t\t\t\t\tconsole.log(`[Observability] ${alertEvent.message}`);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"warn\":\n\t\t\t\t\t\tconsole.warn(`[Observability] ${alertEvent.message}`);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"alert\":\n\t\t\t\t\t\tconsole.error(`[Observability ALERT] ${alertEvent.message}`);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"callback\":\n\t\t\t\t\t\talertConfig.callback?.(metric, threshold);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction getPercentiles(name: string): { p50?: number; p90?: number; p99?: number } {\n\t\t// Collect all data points for this metric name across all label combinations\n\t\tconst allValues: number[] = [];\n\t\tfor (const [key, points] of metricDataPoints) {\n\t\t\tif (key.startsWith(`${name}:`)) {\n\t\t\t\tfor (const p of points) {\n\t\t\t\t\tallValues.push(p.value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (allValues.length === 0) return {};\n\t\treturn {\n\t\t\tp50: calculatePercentile(allValues, 50),\n\t\t\tp90: calculatePercentile(allValues, 90),\n\t\t\tp99: calculatePercentile(allValues, 99),\n\t\t};\n\t}\n\n\treturn {\n\t\tincrementCounter(name: string, labels: Record<string, string> = {}, value = 1): void {\n\t\t\trecordMetric({\n\t\t\t\tname,\n\t\t\t\ttype: \"counter\",\n\t\t\t\tvalue,\n\t\t\t\tlabels,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t});\n\t\t},\n\n\t\tsetGauge(name: string, value: number, labels: Record<string, string> = {}): void {\n\t\t\trecordMetric({\n\t\t\t\tname,\n\t\t\t\ttype: \"gauge\",\n\t\t\t\tvalue,\n\t\t\t\tlabels,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t});\n\t\t},\n\n\t\tobserveHistogram(name: string, value: number, labels: Record<string, string> = {}): void {\n\t\t\trecordMetric({\n\t\t\t\tname,\n\t\t\t\ttype: \"histogram\",\n\t\t\t\tvalue,\n\t\t\t\tlabels,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t});\n\t\t},\n\n\t\tstartSpan(operationName: string, parentSpanId?: string): TraceSpan {\n\t\t\t// Apply sampling\n\t\t\tif (Math.random() > sampleRate) {\n\t\t\t\t// Return a no-op span that won't be tracked\n\t\t\t\treturn {\n\t\t\t\t\ttraceId: \"sampled-out\",\n\t\t\t\t\tspanId: \"sampled-out\",\n\t\t\t\t\toperationName,\n\t\t\t\t\tserviceName,\n\t\t\t\t\tstartTime: Date.now(),\n\t\t\t\t\tstatus: \"ok\",\n\t\t\t\t\ttags: {},\n\t\t\t\t\tlogs: [],\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst span: TraceSpan = {\n\t\t\t\ttraceId: parentSpanId\n\t\t\t\t\t? activeSpans.get(parentSpanId)?.traceId ?? generateId()\n\t\t\t\t\t: generateId(),\n\t\t\t\tspanId: generateId(),\n\t\t\t\tparentSpanId,\n\t\t\t\toperationName,\n\t\t\t\tserviceName,\n\t\t\t\tstartTime: Date.now(),\n\t\t\t\tstatus: \"ok\",\n\t\t\t\ttags: {},\n\t\t\t\tlogs: [],\n\t\t\t};\n\n\t\t\tif (tracingEnabled) {\n\t\t\t\tactiveSpans.set(span.spanId, span);\n\t\t\t\tevents.onSpanStart?.(span);\n\t\t\t}\n\n\t\t\treturn span;\n\t\t},\n\n\t\tendSpan(spanId: string, status: \"ok\" | \"error\" | \"timeout\" = \"ok\"): void {\n\t\t\tif (spanId === \"sampled-out\") return;\n\n\t\t\tconst span = activeSpans.get(spanId);\n\t\t\tif (!span) return;\n\n\t\t\tspan.endTime = Date.now();\n\t\t\tspan.duration = span.endTime - span.startTime;\n\t\t\tspan.status = status;\n\n\t\t\tactiveSpans.delete(spanId);\n\t\t\tcompletedSpans.push(span);\n\n\t\t\t// Trim old spans\n\t\t\twhile (completedSpans.length > maxSpans) {\n\t\t\t\tcompletedSpans.shift();\n\t\t\t}\n\n\t\t\t// Record latency metric (use recordMetric directly to avoid `this` binding issues)\n\t\t\trecordMetric({\n\t\t\t\tname: `${span.operationName}.latency`,\n\t\t\t\ttype: \"histogram\",\n\t\t\t\tvalue: span.duration,\n\t\t\t\tlabels: {},\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t});\n\n\t\t\tif (status === \"error\") {\n\t\t\t\trecordMetric({\n\t\t\t\t\tname: `${span.operationName}.errors`,\n\t\t\t\t\ttype: \"counter\",\n\t\t\t\t\tvalue: 1,\n\t\t\t\t\tlabels: {},\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tevents.onSpanEnd?.(span);\n\t\t},\n\n\t\taddSpanLog(spanId: string, message: string, level: \"debug\" | \"info\" | \"warn\" | \"error\" = \"info\"): void {\n\t\t\tif (spanId === \"sampled-out\") return;\n\n\t\t\tconst span = activeSpans.get(spanId);\n\t\t\tif (!span) return;\n\n\t\t\tspan.logs.push({\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\tmessage,\n\t\t\t\tlevel,\n\t\t\t});\n\t\t},\n\n\t\taddSpanTag(spanId: string, key: string, value: string | number | boolean): void {\n\t\t\tif (spanId === \"sampled-out\") return;\n\n\t\t\tconst span = activeSpans.get(spanId);\n\t\t\tif (!span) return;\n\n\t\t\tspan.tags[key] = value;\n\t\t},\n\n\t\tgetDashboard(): DashboardData {\n\t\t\t// Calculate summary stats using configurable metric names\n\t\t\tconst requestsMetric = aggregatedMetrics.get(summaryMetricNames.requests);\n\t\t\tconst errorsMetric = aggregatedMetrics.get(summaryMetricNames.errors);\n\t\t\tconst latencyMetric = aggregatedMetrics.get(summaryMetricNames.latency);\n\t\t\tconst tokensMetric = aggregatedMetrics.get(summaryMetricNames.tokens);\n\t\t\tconst costMetric = aggregatedMetrics.get(summaryMetricNames.cost);\n\n\t\t\tconst totalRequests = requestsMetric?.sum ?? 0;\n\t\t\tconst totalErrors = errorsMetric?.sum ?? 0;\n\t\t\tconst errorRate = totalRequests > 0 ? totalErrors / totalRequests : 0;\n\n\t\t\t// Calculate percentiles on demand for latency\n\t\t\tconst latencyPercentiles = latencyMetric ? getPercentiles(summaryMetricNames.latency) : {};\n\n\t\t\treturn {\n\t\t\t\tservice: {\n\t\t\t\t\tname: serviceName,\n\t\t\t\t\tuptime: Date.now() - startTime,\n\t\t\t\t\tstartTime,\n\t\t\t\t},\n\t\t\t\tmetrics: Object.fromEntries(aggregatedMetrics),\n\t\t\t\ttraces: [...completedSpans].slice(-100),\n\t\t\t\talerts: [...alertEvents].slice(-50),\n\t\t\t\tsummary: {\n\t\t\t\t\ttotalRequests,\n\t\t\t\t\ttotalErrors,\n\t\t\t\t\terrorRate,\n\t\t\t\t\tavgLatency: latencyMetric?.avg ?? 0,\n\t\t\t\t\tp99Latency: latencyPercentiles.p99 ?? 0,\n\t\t\t\t\tactiveSpans: activeSpans.size,\n\t\t\t\t\ttotalTokens: tokensMetric?.sum ?? 0,\n\t\t\t\t\ttotalCost: costMetric?.sum ?? 0,\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\n\t\tgetMetric(name: string): AggregatedMetric | undefined {\n\t\t\tconst metric = aggregatedMetrics.get(name);\n\t\t\tif (!metric) return undefined;\n\t\t\t// Calculate percentiles on demand\n\t\t\tconst percentiles = getPercentiles(name);\n\t\t\treturn { ...metric, ...percentiles };\n\t\t},\n\n\t\tgetTraces(limit = 100): TraceSpan[] {\n\t\t\treturn [...completedSpans].slice(-limit);\n\t\t},\n\n\t\tgetAlerts(): AlertEvent[] {\n\t\t\treturn [...alertEvents];\n\t\t},\n\n\t\texport() {\n\t\t\treturn {\n\t\t\t\tmetrics: Array.from(aggregatedMetrics.values()),\n\t\t\t\ttraces: [...completedSpans],\n\t\t\t\talerts: [...alertEvents],\n\t\t\t};\n\t\t},\n\n\t\tclear() {\n\t\t\tmetricDataPoints.clear();\n\t\t\taggregatedMetrics.clear();\n\t\t\tactiveSpans.clear();\n\t\t\tcompletedSpans.length = 0;\n\t\t\talertEvents.length = 0;\n\t\t\talertCooldowns.clear();\n\t\t},\n\n\t\tasync dispose() {\n\t\t\t// Clear the export timer\n\t\t\tif (exportTimer) {\n\t\t\t\tclearInterval(exportTimer);\n\t\t\t\texportTimer = undefined;\n\t\t\t}\n\n\t\t\t// Flush any remaining data to exporters\n\t\t\ttry {\n\t\t\t\tif (metricsExporter && metricsEnabled && aggregatedMetrics.size > 0) {\n\t\t\t\t\tawait metricsExporter(Array.from(aggregatedMetrics.values()));\n\t\t\t\t}\n\t\t\t\tif (tracingExporter && tracingEnabled && completedSpans.length > 0) {\n\t\t\t\t\tawait tracingExporter([...completedSpans]);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(\"[Directive Observability] Error flushing data during dispose:\", error);\n\t\t\t}\n\n\t\t\t// Clear all data\n\t\t\tmetricDataPoints.clear();\n\t\t\taggregatedMetrics.clear();\n\t\t\tactiveSpans.clear();\n\t\t\tcompletedSpans.length = 0;\n\t\t\talertEvents.length = 0;\n\t\t\talertCooldowns.clear();\n\t\t},\n\n\t\tgetHealthStatus() {\n\t\t\tconst requestsMetric = aggregatedMetrics.get(summaryMetricNames.requests);\n\t\t\tconst errorsMetric = aggregatedMetrics.get(summaryMetricNames.errors);\n\n\t\t\tconst totalRequests = requestsMetric?.sum ?? 0;\n\t\t\tconst totalErrors = errorsMetric?.sum ?? 0;\n\t\t\tconst errorRate = totalRequests > 0 ? totalErrors / totalRequests : 0;\n\n\t\t\t// Consider unhealthy if error rate > 10% or there are active alerts\n\t\t\tconst activeAlertCount = alertEvents.filter(\n\t\t\t\t(a) => Date.now() - a.timestamp < 300000 // Last 5 minutes\n\t\t\t).length;\n\n\t\t\treturn {\n\t\t\t\thealthy: errorRate < 0.1 && activeAlertCount === 0,\n\t\t\t\tuptime: Date.now() - startTime,\n\t\t\t\terrorRate,\n\t\t\t\tactiveAlerts: activeAlertCount,\n\t\t\t};\n\t\t},\n\t};\n}\n\n// ============================================================================\n// Pre-built Metric Helpers\n// ============================================================================\n\n/**\n * Create standard agent metrics for an observability instance.\n *\n * @example\n * ```typescript\n * const obs = createObservability({ serviceName: 'my-service' });\n * const agentMetrics = createAgentMetrics(obs);\n *\n * // Track an agent run\n * agentMetrics.trackRun('support-agent', {\n * success: true,\n * latencyMs: 1500,\n * inputTokens: 100,\n * outputTokens: 500,\n * cost: 0.05,\n * });\n * ```\n */\nexport function createAgentMetrics(obs: ObservabilityInstance) {\n\treturn {\n\t\ttrackRun(\n\t\t\tagentName: string,\n\t\t\tresult: {\n\t\t\t\tsuccess: boolean;\n\t\t\t\tlatencyMs: number;\n\t\t\t\tinputTokens?: number;\n\t\t\t\toutputTokens?: number;\n\t\t\t\tcost?: number;\n\t\t\t\ttoolCalls?: number;\n\t\t\t}\n\t\t): void {\n\t\t\tconst labels = { agent: agentName };\n\n\t\t\tobs.incrementCounter(\"agent.requests\", labels);\n\n\t\t\tif (!result.success) {\n\t\t\t\tobs.incrementCounter(\"agent.errors\", labels);\n\t\t\t}\n\n\t\t\tobs.observeHistogram(\"agent.latency\", result.latencyMs, labels);\n\n\t\t\tif (result.inputTokens !== undefined) {\n\t\t\t\tobs.incrementCounter(\"agent.tokens.input\", labels, result.inputTokens);\n\t\t\t\tobs.incrementCounter(\"agent.tokens\", labels, result.inputTokens);\n\t\t\t}\n\n\t\t\tif (result.outputTokens !== undefined) {\n\t\t\t\tobs.incrementCounter(\"agent.tokens.output\", labels, result.outputTokens);\n\t\t\t\tobs.incrementCounter(\"agent.tokens\", labels, result.outputTokens);\n\t\t\t}\n\n\t\t\tif (result.cost !== undefined) {\n\t\t\t\tobs.incrementCounter(\"agent.cost\", labels, result.cost);\n\t\t\t}\n\n\t\t\tif (result.toolCalls !== undefined) {\n\t\t\t\tobs.incrementCounter(\"agent.tool_calls\", labels, result.toolCalls);\n\t\t\t}\n\t\t},\n\n\t\ttrackGuardrail(\n\t\t\tguardrailName: string,\n\t\t\tresult: {\n\t\t\t\tpassed: boolean;\n\t\t\t\tlatencyMs: number;\n\t\t\t\tblocked?: boolean;\n\t\t\t}\n\t\t): void {\n\t\t\tconst labels = { guardrail: guardrailName };\n\n\t\t\tobs.incrementCounter(\"guardrail.checks\", labels);\n\n\t\t\tif (!result.passed) {\n\t\t\t\tobs.incrementCounter(\"guardrail.failures\", labels);\n\t\t\t}\n\n\t\t\tif (result.blocked) {\n\t\t\t\tobs.incrementCounter(\"guardrail.blocks\", labels);\n\t\t\t}\n\n\t\t\tobs.observeHistogram(\"guardrail.latency\", result.latencyMs, labels);\n\t\t},\n\n\t\ttrackApproval(\n\t\t\ttoolName: string,\n\t\t\tresult: {\n\t\t\t\tapproved: boolean;\n\t\t\t\twaitTimeMs: number;\n\t\t\t\ttimedOut?: boolean;\n\t\t\t}\n\t\t): void {\n\t\t\tconst labels = { tool: toolName };\n\n\t\t\tobs.incrementCounter(\"approval.requests\", labels);\n\n\t\t\tif (result.approved) {\n\t\t\t\tobs.incrementCounter(\"approval.approved\", labels);\n\t\t\t} else {\n\t\t\t\tobs.incrementCounter(\"approval.rejected\", labels);\n\t\t\t}\n\n\t\t\tif (result.timedOut) {\n\t\t\t\tobs.incrementCounter(\"approval.timeouts\", labels);\n\t\t\t}\n\n\t\t\tobs.observeHistogram(\"approval.wait_time\", result.waitTimeMs, labels);\n\t\t},\n\n\t\ttrackHandoff(\n\t\t\tfromAgent: string,\n\t\t\ttoAgent: string,\n\t\t\tlatencyMs: number\n\t\t): void {\n\t\t\tobs.incrementCounter(\"handoff.count\", { from: fromAgent, to: toAgent });\n\t\t\tobs.observeHistogram(\"handoff.latency\", latencyMs);\n\t\t},\n\t};\n}\n","/**\n * OTLP (OpenTelemetry Protocol) Exporter\n *\n * Converts Directive observability data to OTLP JSON format for export to\n * Grafana, Datadog, Jaeger, and other OpenTelemetry-compatible backends.\n *\n * @example\n * ```typescript\n * import { createObservability } from '@directive-run/ai';\n * import { createOTLPExporter } from '@directive-run/ai';\n *\n * const exporter = createOTLPExporter({\n * endpoint: 'http://localhost:4318',\n * headers: { 'Authorization': 'Bearer token' },\n * serviceName: 'my-agent-service',\n * });\n *\n * const obs = createObservability({\n * metrics: { exporter: exporter.exportMetrics, exportInterval: 10000 },\n * tracing: { exporter: exporter.exportTraces },\n * });\n * ```\n */\n\nimport type { AggregatedMetric, TraceSpan } from \"./observability.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** OTLP exporter configuration */\nexport interface OTLPExporterConfig {\n\t/** OTLP endpoint base URL (e.g., http://localhost:4318) */\n\tendpoint: string;\n\t/** Optional headers (e.g., auth tokens) */\n\theaders?: Record<string, string>;\n\t/** Service name for resource identification */\n\tserviceName?: string;\n\t/** Service version */\n\tserviceVersion?: string;\n\t/** Custom resource attributes */\n\tresourceAttributes?: Record<string, string>;\n\t/** Instrumentation scope version (default: \"0.1.0\") */\n\tscopeVersion?: string;\n\t/** Request timeout in ms (default: 10000) */\n\ttimeoutMs?: number;\n\t/** Custom fetch function (for testing or custom HTTP clients) */\n\tfetch?: typeof globalThis.fetch;\n\t/** Callback on export error */\n\tonError?: (error: Error, type: \"metrics\" | \"traces\") => void;\n}\n\n/** OTLP exporter instance */\nexport interface OTLPExporter {\n\t/** Export metrics in OTLP format (compatible with ObservabilityConfig.metrics.exporter) */\n\texportMetrics: (metrics: AggregatedMetric[]) => Promise<void>;\n\t/** Export traces in OTLP format (compatible with ObservabilityConfig.tracing.exporter) */\n\texportTraces: (traces: TraceSpan[]) => Promise<void>;\n}\n\n// ============================================================================\n// OTLP JSON Conversion\n// ============================================================================\n\ninterface OTLPResource {\n\tattributes: Array<{ key: string; value: { stringValue: string } }>;\n}\n\nfunction buildResource(config: OTLPExporterConfig): OTLPResource {\n\tconst attrs: Array<{ key: string; value: { stringValue: string } }> = [\n\t\t{ key: \"service.name\", value: { stringValue: config.serviceName ?? \"directive-agents\" } },\n\t];\n\n\tif (config.serviceVersion) {\n\t\tattrs.push({ key: \"service.version\", value: { stringValue: config.serviceVersion } });\n\t}\n\n\tif (config.resourceAttributes) {\n\t\tfor (const [key, val] of Object.entries(config.resourceAttributes)) {\n\t\t\tattrs.push({ key, value: { stringValue: val } });\n\t\t}\n\t}\n\n\treturn { attributes: attrs };\n}\n\nfunction toNanos(timestampMs: number): string {\n\treturn `${BigInt(timestampMs) * BigInt(1_000_000)}`;\n}\n\nfunction metricTypeToOTLP(type: string): string {\n\tswitch (type) {\n\t\tcase \"counter\":\n\t\t\treturn \"sum\";\n\t\tcase \"gauge\":\n\t\t\treturn \"gauge\";\n\t\tcase \"histogram\":\n\t\t\treturn \"histogram\";\n\t\tdefault:\n\t\t\treturn \"gauge\";\n\t}\n}\n\nfunction convertMetrics(\n\tmetrics: AggregatedMetric[],\n\tresource: OTLPResource,\n\tscopeVersion: string,\n): Record<string, unknown> {\n\tconst scopeMetrics = metrics.map((metric) => {\n\t\t// Known limitation: startTimeUnixNano is approximated as lastUpdated minus 60s.\n\t\t// A more accurate value would require tracking the actual collection start time\n\t\t// per metric, which is not available in the current AggregatedMetric type.\n\t\tconst startTimeMs = metric.lastUpdated - 60000;\n\n\t\tconst dataPoints = [\n\t\t\t{\n\t\t\t\tasInt: metric.type === \"counter\" ? metric.sum : undefined,\n\t\t\t\tasDouble: metric.type !== \"counter\" ? metric.lastValue : undefined,\n\t\t\t\ttimeUnixNano: toNanos(metric.lastUpdated),\n\t\t\t\tstartTimeUnixNano: toNanos(startTimeMs),\n\t\t\t\tattributes: [],\n\t\t\t},\n\t\t];\n\n\t\tconst otlpType = metricTypeToOTLP(metric.type);\n\t\tconst metricData: Record<string, unknown> = {\n\t\t\tname: metric.name,\n\t\t\tunit: \"\",\n\t\t};\n\n\t\tif (otlpType === \"sum\") {\n\t\t\tmetricData.sum = {\n\t\t\t\tdataPoints,\n\t\t\t\taggregationTemporality: 2, // CUMULATIVE\n\t\t\t\tisMonotonic: true,\n\t\t\t};\n\t\t} else if (otlpType === \"histogram\") {\n\t\t\tmetricData.histogram = {\n\t\t\t\tdataPoints: [\n\t\t\t\t\t{\n\t\t\t\t\t\tcount: metric.count,\n\t\t\t\t\t\tsum: metric.sum,\n\t\t\t\t\t\tmin: metric.min,\n\t\t\t\t\t\tmax: metric.max,\n\t\t\t\t\t\ttimeUnixNano: toNanos(metric.lastUpdated),\n\t\t\t\t\t\tstartTimeUnixNano: toNanos(startTimeMs),\n\t\t\t\t\t\tattributes: [],\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\taggregationTemporality: 2,\n\t\t\t};\n\t\t} else {\n\t\t\tmetricData.gauge = { dataPoints };\n\t\t}\n\n\t\treturn metricData;\n\t});\n\n\treturn {\n\t\tresourceMetrics: [\n\t\t\t{\n\t\t\t\tresource,\n\t\t\t\tscopeMetrics: [\n\t\t\t\t\t{\n\t\t\t\t\t\tscope: { name: \"directive\", version: scopeVersion },\n\t\t\t\t\t\tmetrics: scopeMetrics,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t};\n}\n\nfunction convertTraces(\n\ttraces: TraceSpan[],\n\tresource: OTLPResource,\n\tscopeVersion: string,\n): Record<string, unknown> {\n\tconst spans = traces.map((span) => {\n\t\tconst events = span.logs.map((log) => ({\n\t\t\ttimeUnixNano: toNanos(log.timestamp),\n\t\t\tname: log.level,\n\t\t\tattributes: [\n\t\t\t\t{ key: \"message\", value: { stringValue: log.message } },\n\t\t\t\t{ key: \"level\", value: { stringValue: log.level } },\n\t\t\t],\n\t\t}));\n\n\t\tconst attributes = Object.entries(span.tags).map(([key, val]) => ({\n\t\t\tkey,\n\t\t\tvalue:\n\t\t\t\ttypeof val === \"string\"\n\t\t\t\t\t? { stringValue: val }\n\t\t\t\t\t: typeof val === \"number\"\n\t\t\t\t\t\t? { intValue: `${val}` }\n\t\t\t\t\t\t: { boolValue: val },\n\t\t}));\n\n\t\tconst statusCode =\n\t\t\tspan.status === \"ok\" ? 1 : span.status === \"error\" ? 2 : 0;\n\n\t\treturn {\n\t\t\ttraceId: span.traceId.replace(/-/g, \"\").padEnd(32, \"0\").slice(0, 32),\n\t\t\tspanId: span.spanId.replace(/-/g, \"\").padEnd(16, \"0\").slice(0, 16),\n\t\t\tparentSpanId: span.parentSpanId\n\t\t\t\t? span.parentSpanId.replace(/-/g, \"\").padEnd(16, \"0\").slice(0, 16)\n\t\t\t\t: undefined,\n\t\t\tname: span.operationName,\n\t\t\tkind: 1, // INTERNAL\n\t\t\tstartTimeUnixNano: toNanos(span.startTime),\n\t\t\tendTimeUnixNano: span.endTime ? toNanos(span.endTime) : toNanos(span.startTime),\n\t\t\tattributes,\n\t\t\tevents,\n\t\t\tstatus: { code: statusCode },\n\t\t};\n\t});\n\n\treturn {\n\t\tresourceSpans: [\n\t\t\t{\n\t\t\t\tresource,\n\t\t\t\tscopeSpans: [\n\t\t\t\t\t{\n\t\t\t\t\t\tscope: { name: \"directive\", version: scopeVersion },\n\t\t\t\t\t\tspans,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t};\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\n/**\n * Create an OTLP exporter for sending metrics and traces to OpenTelemetry-compatible backends.\n *\n * Supports:\n * - Grafana (via OTLP endpoint)\n * - Datadog (via OTLP ingest)\n * - Jaeger (via OTLP collector)\n * - Any OpenTelemetry Collector\n *\n * @example\n * ```typescript\n * const exporter = createOTLPExporter({\n * endpoint: 'http://localhost:4318',\n * serviceName: 'my-agent-service',\n * });\n *\n * // Wire into observability\n * const obs = createObservability({\n * metrics: { exporter: exporter.exportMetrics, exportInterval: 10000 },\n * tracing: { exporter: exporter.exportTraces },\n * });\n * ```\n */\nexport function createOTLPExporter(config: OTLPExporterConfig): OTLPExporter {\n\tconst {\n\t\tendpoint,\n\t\theaders = {},\n\t\tscopeVersion = \"0.1.0\",\n\t\ttimeoutMs = 10000,\n\t\tfetch: fetchFn = globalThis.fetch,\n\t\tonError,\n\t} = config;\n\n\t// Validate endpoint URL\n\ttry {\n\t\tconst url = new URL(endpoint);\n\t\tif (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n\t\t\tthrow new Error(\"Only http: and https: protocols are supported\");\n\t\t}\n\t} catch (error) {\n\t\tthrow new Error(\n\t\t\t`[Directive OTLP] Invalid endpoint URL \"${endpoint}\": ${error instanceof Error ? error.message : String(error)}`\n\t\t);\n\t}\n\n\t// Warn if endpoint already contains a path like /v1/metrics or /v1/traces\n\tif (/\\/v1\\/(metrics|traces)/.test(endpoint)) {\n\t\tconsole.warn(\n\t\t\t`[Directive OTLP] Endpoint \"${endpoint}\" already contains a /v1/metrics or /v1/traces path. ` +\n\t\t\t`The exporter will append /v1/metrics or /v1/traces automatically. ` +\n\t\t\t`Use the base URL (e.g., \"http://localhost:4318\") instead.`\n\t\t);\n\t}\n\n\t// Validate timeoutMs\n\tif (timeoutMs <= 0 || !Number.isFinite(timeoutMs)) {\n\t\tthrow new Error(`[Directive OTLP] timeoutMs must be > 0, got ${timeoutMs}`);\n\t}\n\n\tconst resource = buildResource(config);\n\n\tasync function send(path: string, body: Record<string, unknown>, type: \"metrics\" | \"traces\"): Promise<void> {\n\t\tconst url = `${endpoint.replace(/\\/$/, \"\")}${path}`;\n\t\tconst controller = new AbortController();\n\t\tconst timer = setTimeout(() => controller.abort(), timeoutMs);\n\n\t\ttry {\n\t\t\tconst response = await fetchFn(url, {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\t...headers,\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify(body),\n\t\t\t\tsignal: controller.signal,\n\t\t\t});\n\n\t\t\tif (!response.ok) {\n\t\t\t\tthrow new Error(`OTLP export failed: ${response.status} ${response.statusText}`);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconst err = error instanceof Error ? error : new Error(String(error));\n\t\t\tif (onError) {\n\t\t\t\tonError(err, type);\n\t\t\t} else {\n\t\t\t\tconsole.error(`[Directive OTLP] Export ${type} error:`, err.message);\n\t\t\t}\n\t\t} finally {\n\t\t\tclearTimeout(timer);\n\t\t}\n\t}\n\n\treturn {\n\t\tasync exportMetrics(metrics: AggregatedMetric[]): Promise<void> {\n\t\t\tif (metrics.length === 0) return;\n\t\t\tconst body = convertMetrics(metrics, resource, scopeVersion);\n\t\t\tawait send(\"/v1/metrics\", body, \"metrics\");\n\t\t},\n\n\t\tasync exportTraces(traces: TraceSpan[]): Promise<void> {\n\t\t\tif (traces.length === 0) return;\n\t\t\tconst body = convertTraces(traces, resource, scopeVersion);\n\t\t\tawait send(\"/v1/traces\", body, \"traces\");\n\t\t},\n\t};\n}\n","/**\n * Circuit Breaker for AI Agent Operations\n *\n * Implements the circuit breaker pattern to prevent cascading failures when\n * downstream services (MCP servers, LLM APIs) are degraded. Integrates with\n * the observability plugin to wire error rates into constraint decisions.\n *\n * States:\n * - CLOSED: Normal operation, requests pass through\n * - OPEN: Failures exceeded threshold, requests are rejected immediately\n * - HALF_OPEN: After recovery timeout, a limited number of requests are allowed through\n *\n * @example\n * ```typescript\n * import { createCircuitBreaker } from '@directive-run/ai';\n *\n * const breaker = createCircuitBreaker({\n * failureThreshold: 5,\n * recoveryTimeMs: 30000,\n * halfOpenMaxRequests: 3,\n * });\n *\n * // Use with MCP or any async operation\n * const result = await breaker.execute(async () => {\n * return await callExternalAPI();\n * });\n *\n * // Wire into Directive constraints\n * constraints: {\n * apiDown: {\n * when: () => breaker.getState() === 'OPEN',\n * require: { type: 'FALLBACK_RESPONSE' },\n * },\n * }\n * ```\n */\n\nimport type { ObservabilityInstance } from \"./observability.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Circuit breaker states */\nexport type CircuitState = \"CLOSED\" | \"OPEN\" | \"HALF_OPEN\";\n\n/** Circuit breaker configuration */\nexport interface CircuitBreakerConfig {\n\t/** Number of failures before opening the circuit (default: 5) */\n\tfailureThreshold?: number;\n\t/** Time in ms before transitioning from OPEN to HALF_OPEN (default: 30000) */\n\trecoveryTimeMs?: number;\n\t/** Number of requests allowed in HALF_OPEN state (default: 3) */\n\thalfOpenMaxRequests?: number;\n\t/** Time window in ms for counting failures (default: 60000). Failures outside this window are forgotten. */\n\tfailureWindowMs?: number;\n\t/** Optional observability instance for automatic metric tracking */\n\tobservability?: ObservabilityInstance;\n\t/** Metric name prefix for observability (default: \"circuit_breaker\") */\n\tmetricPrefix?: string;\n\t/** Name for this circuit breaker (used in metrics and errors) */\n\tname?: string;\n\t/** Custom error classifier. Return true if the error should count as a failure. Default: all errors count. */\n\tisFailure?: (error: Error) => boolean;\n\t/** Callback when state changes */\n\tonStateChange?: (from: CircuitState, to: CircuitState) => void;\n}\n\n/** Circuit breaker statistics */\nexport interface CircuitBreakerStats {\n\tstate: CircuitState;\n\ttotalRequests: number;\n\ttotalFailures: number;\n\ttotalSuccesses: number;\n\ttotalRejected: number;\n\trecentFailures: number;\n\tlastFailureTime: number | null;\n\tlastSuccessTime: number | null;\n\tlastStateChange: number;\n}\n\n/** Circuit breaker instance */\nexport interface CircuitBreaker {\n\t/** Execute an operation through the circuit breaker */\n\texecute<T>(fn: () => Promise<T>): Promise<T>;\n\t/** Get the current state */\n\tgetState(): CircuitState;\n\t/** Get statistics */\n\tgetStats(): CircuitBreakerStats;\n\t/** Force the circuit to a specific state (useful for testing) */\n\tforceState(state: CircuitState): void;\n\t/** Reset the circuit breaker to CLOSED with cleared stats */\n\treset(): void;\n\t/** Check if a request would be allowed (without executing) */\n\tisAllowed(): boolean;\n}\n\n// ============================================================================\n// Errors\n// ============================================================================\n\n/** Error thrown when a request is rejected because the circuit is open */\nexport class CircuitBreakerOpenError extends Error {\n\treadonly code = \"CIRCUIT_OPEN\" as const;\n\treadonly retryAfterMs: number;\n\treadonly state: \"OPEN\" | \"HALF_OPEN\";\n\n\tconstructor(name: string, retryAfterMs: number, state: \"OPEN\" | \"HALF_OPEN\" = \"OPEN\", detail?: string) {\n\t\tconst msg = detail\n\t\t\t? `[Directive CircuitBreaker] Circuit \"${name}\" is ${state}. ${detail}`\n\t\t\t: `[Directive CircuitBreaker] Circuit \"${name}\" is ${state}. Request rejected. Try again in ${Math.ceil(retryAfterMs / 1000)}s.`;\n\t\tsuper(msg);\n\t\tthis.name = \"CircuitBreakerOpenError\";\n\t\tthis.retryAfterMs = retryAfterMs;\n\t\tthis.state = state;\n\t}\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\n/**\n * Create a circuit breaker for protecting against cascading failures.\n *\n * @example\n * ```typescript\n * const breaker = createCircuitBreaker({\n * name: 'openai-api',\n * failureThreshold: 5,\n * recoveryTimeMs: 30000,\n * observability: obs, // Optional: auto-track metrics\n * });\n *\n * try {\n * const result = await breaker.execute(async () => {\n * return await openai.chat.completions.create({ ... });\n * });\n * } catch (error) {\n * if (error.message.includes('Circuit breaker')) {\n * // Circuit is open, use fallback\n * }\n * }\n * ```\n *\n * @throws {Error} If failureThreshold is less than 1 or not a finite number\n * @throws {Error} If recoveryTimeMs is not positive or not a finite number\n * @throws {Error} If halfOpenMaxRequests is less than 1 or not a finite number\n * @throws {Error} If failureWindowMs is not positive or not a finite number\n */\nexport function createCircuitBreaker(config: CircuitBreakerConfig = {}): CircuitBreaker {\n\tconst {\n\t\tfailureThreshold = 5,\n\t\trecoveryTimeMs = 30000,\n\t\thalfOpenMaxRequests = 3,\n\t\tfailureWindowMs = 60000,\n\t\tobservability,\n\t\tmetricPrefix = \"circuit_breaker\",\n\t\tname = \"default\",\n\t\tisFailure = () => true,\n\t\tonStateChange,\n\t} = config;\n\n\t// Validate config\n\tif (failureThreshold < 1 || !Number.isFinite(failureThreshold)) {\n\t\tthrow new Error(`[Directive CircuitBreaker] failureThreshold must be >= 1, got ${failureThreshold}`);\n\t}\n\tif (recoveryTimeMs <= 0 || !Number.isFinite(recoveryTimeMs)) {\n\t\tthrow new Error(`[Directive CircuitBreaker] recoveryTimeMs must be > 0, got ${recoveryTimeMs}`);\n\t}\n\tif (halfOpenMaxRequests < 1 || !Number.isFinite(halfOpenMaxRequests)) {\n\t\tthrow new Error(`[Directive CircuitBreaker] halfOpenMaxRequests must be >= 1, got ${halfOpenMaxRequests}`);\n\t}\n\tif (failureWindowMs <= 0 || !Number.isFinite(failureWindowMs)) {\n\t\tthrow new Error(`[Directive CircuitBreaker] failureWindowMs must be > 0, got ${failureWindowMs}`);\n\t}\n\n\tlet state: CircuitState = \"CLOSED\";\n\tlet failureTimestamps: number[] = [];\n\tlet halfOpenRequests = 0;\n\tlet halfOpenSuccesses = 0;\n\tlet lastStateChange = Date.now();\n\tlet openedAt = 0;\n\n\t// Stats\n\tlet totalRequests = 0;\n\tlet totalFailures = 0;\n\tlet totalSuccesses = 0;\n\tlet totalRejected = 0;\n\tlet lastFailureTime: number | null = null;\n\tlet lastSuccessTime: number | null = null;\n\n\tfunction transition(newState: CircuitState): void {\n\t\tif (state === newState) return;\n\t\tconst oldState = state;\n\t\tstate = newState;\n\t\tlastStateChange = Date.now();\n\n\t\tif (newState === \"OPEN\") {\n\t\t\topenedAt = Date.now();\n\t\t}\n\t\tif (newState === \"HALF_OPEN\") {\n\t\t\thalfOpenRequests = 0;\n\t\t\thalfOpenSuccesses = 0;\n\t\t}\n\n\t\tonStateChange?.(oldState, newState);\n\n\t\tif (observability) {\n\t\t\tobservability.incrementCounter(`${metricPrefix}.state_change`, {\n\t\t\t\tname,\n\t\t\t\tfrom: oldState,\n\t\t\t\tto: newState,\n\t\t\t});\n\t\t}\n\t}\n\n\tfunction getRecentFailures(): number {\n\t\tconst cutoff = Date.now() - failureWindowMs;\n\t\tfailureTimestamps = failureTimestamps.filter((t) => t > cutoff);\n\t\treturn failureTimestamps.length;\n\t}\n\n\tfunction recordSuccess(): void {\n\t\ttotalSuccesses++;\n\t\tlastSuccessTime = Date.now();\n\n\t\tif (observability) {\n\t\t\tobservability.incrementCounter(`${metricPrefix}.success`, { name });\n\t\t}\n\n\t\tif (state === \"HALF_OPEN\") {\n\t\t\thalfOpenSuccesses++;\n\t\t\tif (halfOpenSuccesses >= halfOpenMaxRequests) {\n\t\t\t\ttransition(\"CLOSED\");\n\t\t\t\tfailureTimestamps = [];\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction recordFailure(error: Error): void {\n\t\tif (!isFailure(error)) {\n\t\t\trecordSuccess();\n\t\t\treturn;\n\t\t}\n\n\t\ttotalFailures++;\n\t\tlastFailureTime = Date.now();\n\t\tfailureTimestamps.push(Date.now());\n\n\t\t// Cap array to prevent unbounded growth (keep 2x threshold as headroom)\n\t\tconst maxTimestamps = failureThreshold * 2;\n\t\tif (failureTimestamps.length > maxTimestamps) {\n\t\t\tfailureTimestamps = failureTimestamps.slice(-maxTimestamps);\n\t\t}\n\n\t\tif (observability) {\n\t\t\tobservability.incrementCounter(`${metricPrefix}.failure`, { name });\n\t\t}\n\n\t\tif (state === \"HALF_OPEN\") {\n\t\t\ttransition(\"OPEN\");\n\t\t\treturn;\n\t\t}\n\n\t\tif (state === \"CLOSED\" && getRecentFailures() >= failureThreshold) {\n\t\t\ttransition(\"OPEN\");\n\t\t}\n\t}\n\n\treturn {\n\t\tasync execute<T>(fn: () => Promise<T>): Promise<T> {\n\t\t\ttotalRequests++;\n\n\t\t\tif (observability) {\n\t\t\t\tobservability.incrementCounter(`${metricPrefix}.requests`, { name });\n\t\t\t}\n\n\t\t\t// Check if request should be allowed\n\t\t\tif (state === \"OPEN\") {\n\t\t\t\t// Check if recovery time has elapsed\n\t\t\t\tif (Date.now() - openedAt >= recoveryTimeMs) {\n\t\t\t\t\ttransition(\"HALF_OPEN\");\n\t\t\t\t} else {\n\t\t\t\t\ttotalRejected++;\n\t\t\t\t\tif (observability) {\n\t\t\t\t\t\tobservability.incrementCounter(`${metricPrefix}.rejected`, { name });\n\t\t\t\t\t}\n\t\t\t\t\tthrow new CircuitBreakerOpenError(name, recoveryTimeMs - (Date.now() - openedAt));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (state === \"HALF_OPEN\") {\n\t\t\t\tif (halfOpenRequests >= halfOpenMaxRequests) {\n\t\t\t\t\ttotalRejected++;\n\t\t\t\t\tthrow new CircuitBreakerOpenError(name, recoveryTimeMs, \"HALF_OPEN\", `Max trial requests (${halfOpenMaxRequests}) reached.`);\n\t\t\t\t}\n\t\t\t\thalfOpenRequests++;\n\t\t\t}\n\n\t\t\t// Execute the operation\n\t\t\tconst start = Date.now();\n\t\t\ttry {\n\t\t\t\tconst result = await fn();\n\t\t\t\trecordSuccess();\n\n\t\t\t\tif (observability) {\n\t\t\t\t\tobservability.observeHistogram(`${metricPrefix}.latency`, Date.now() - start, { name });\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\t\t\t} catch (error) {\n\t\t\t\tconst err = error instanceof Error ? error : new Error(String(error));\n\t\t\t\trecordFailure(err);\n\n\t\t\t\tif (observability) {\n\t\t\t\t\tobservability.observeHistogram(`${metricPrefix}.latency`, Date.now() - start, { name });\n\t\t\t\t}\n\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t},\n\n\t\tgetState(): CircuitState {\n\t\t\t// Auto-transition from OPEN to HALF_OPEN when recovery time has passed\n\t\t\tif (state === \"OPEN\" && Date.now() - openedAt >= recoveryTimeMs) {\n\t\t\t\ttransition(\"HALF_OPEN\");\n\t\t\t}\n\t\t\treturn state;\n\t\t},\n\n\t\tgetStats(): CircuitBreakerStats {\n\t\t\t// Ensure state freshness (auto-transition OPEN → HALF_OPEN)\n\t\t\tconst currentState = this.getState();\n\t\t\treturn {\n\t\t\t\tstate: currentState,\n\t\t\t\ttotalRequests,\n\t\t\t\ttotalFailures,\n\t\t\t\ttotalSuccesses,\n\t\t\t\ttotalRejected,\n\t\t\t\trecentFailures: getRecentFailures(),\n\t\t\t\tlastFailureTime,\n\t\t\t\tlastSuccessTime,\n\t\t\t\tlastStateChange,\n\t\t\t};\n\t\t},\n\n\t\tforceState(newState: CircuitState): void {\n\t\t\ttransition(newState);\n\t\t},\n\n\t\treset(): void {\n\t\t\tconst oldState = state;\n\t\t\tstate = \"CLOSED\";\n\t\t\tfailureTimestamps = [];\n\t\t\thalfOpenRequests = 0;\n\t\t\thalfOpenSuccesses = 0;\n\t\t\tlastStateChange = Date.now();\n\t\t\topenedAt = 0;\n\t\t\ttotalRequests = 0;\n\t\t\ttotalFailures = 0;\n\t\t\ttotalSuccesses = 0;\n\t\t\ttotalRejected = 0;\n\t\t\tlastFailureTime = null;\n\t\t\tlastSuccessTime = null;\n\t\t\tif (oldState !== \"CLOSED\") {\n\t\t\t\tonStateChange?.(oldState, \"CLOSED\");\n\t\t\t}\n\t\t},\n\n\t\tisAllowed(): boolean {\n\t\t\tif (state === \"CLOSED\") return true;\n\t\t\tif (state === \"OPEN\") {\n\t\t\t\treturn Date.now() - openedAt >= recoveryTimeMs;\n\t\t\t}\n\t\t\t// HALF_OPEN\n\t\t\treturn halfOpenRequests < halfOpenMaxRequests;\n\t\t},\n\t};\n}\n"]}
1
+ {"version":3,"sources":["../../src/plugins/logging.ts","../../src/plugins/devtools-types.ts","../../src/plugins/devtools-panel.ts","../../src/plugins/devtools-graph.ts","../../src/plugins/devtools.ts","../../src/plugins/devtools-ai-bridge.ts","../../src/utils/utils.ts","../../src/plugins/persistence.ts","../../src/plugins/performance.ts","../../src/plugins/observability.ts","../../src/plugins/otlp-exporter.ts","../../src/plugins/circuit-breaker.ts"],"names":["LOG_LEVELS","loggingPlugin","options","level","filter","logger","prefix","minLevel","log","eventLevel","event","args","key","value","prev","changes","id","deps","result","active","error","req","byResolver","resolver","duration","attempt","snapshot","from","to","strategy","CircularBuffer","capacity","item","isDevMode","formatValue","str","_k","v","truncate","max","safeInspect","system","cloneViaJSON","data","validateMaxEvents","createPerfMetrics","MAX_TIMELINE_ENTRIES","TIMELINE_SVG_W","TIMELINE_ROW_H","TIMELINE_LABEL_W","TIMELINE_BAR_MIN_W","TIMELINE_COLORS","createTimelineState","createDepGraph","MAX_RECORDED_EVENTS","MAX_RECORDED_SNAPSHOTS","createRecordingState","MAX_PANEL_EVENTS","MAX_RESOLVER_STATS","S","FLOW","createPanel","systemName","position","defaultOpen","showEvents","destroyed","posStyles","styleEl","toggleBtn","container","header","titleEl","closeBtn","statusRow","statusEl","timeTravelSection","undoBtn","redoBtn","timeTravelLabel","createTableSection","label","open","details","summary","countSpan","table","thead","headRow","col","th","tbody","createListSection","color","list","factsSection","derivSection","inflightSection","unmetSection","perfDetails","perfSummary","perfBody","flowDetails","flowSummary","flowSvg","timelineDetails","timelineSummary","timelineSvg","timelineEmpty","eventsSection","eventsList","eventsCount","traceHint","evDetails","evSummary","waitingMsg","recordRow","recordBtn","exportBtn","e","el","atTop","atBottom","panelOpen","flashTimers","close","onKeyDown","onGlobalKeyDown","mount","destroy","upsertTableRow","rowMap","flash","display","row","cells","cell","tid","keyCell","valCell","removeTableRow","renderRequirements","refs","inflight","unmet","li","renderStatus","inflightCount","unmetCount","isSettled","updateDerivations","derivRowMap","derivationKeys","keySet","addEventRow","type","eventCount","empty","now","time","preview","timeSpan","typeSpan","previewSpan","updatePerfSection","perf","avgReconcile","lines","line","div","resolverHeader","sorted","a","b","stats","avg","updateTimeTravelControls","tt","current","total","canUndo","canRedo","setupTimeTravelButtons","graphCaches","computeFingerprint","factKeys","derivKeys","constraints","reqMap","resolverIds","activeResolverIds","r","updateAnimationAttrs","cache","depGraph","constraintIds","node","pulsing","updateDependencyGraph","inspection","allConstraints","unmetReqs","inflightReqs","u","f","text","fingerprint","existingCache","c","colW","colX","totalW","layoutColumn","items","y","factNodes","k","derivNodes","constraintNodes","reqNodeArr","resolverNodeArr","maxRows","totalH","headers","i","newCache","drawNode","x","cy","nodeId","dimmed","g","rect","drawEdge","x1","y1","x2","y2","factPositions","derivPositions","constraintPositions","reqPositions","pos","d","isActive","dPos","dep","fPos","cPos","rPos","rn","n","scheduleAnimationClear","updateTimeline","timeline","entries","minMs","maxMs","startMs","range","barAreaW","resolverOrder","seen","visibleResolvers","markers","ms","colorIdx","resolverEntries","entry","w","title","durationMs","inflightStart","initDevtools","systems","api","name","s","requirementId","callback","target","attached","timer","t","stop","json","maxImport","events","start","evt","devtoolsPlugin","trace","maxEventsRaw","panelEnabled","maxEventsOpt","devtools","state","addEvent","sub","panel","factsRowMap","recording","shouldCreatePanel","rafId","dirty","D_FACTS","D_DERIV","D_REQS","D_STATUS","D_PERF","D_FLOW","D_TT","D_TIMELINE","pendingFactUpdates","pendingFactDeletes","lastResult","schedulePanelUpdate","bits","flushPanelUpdates","sys","flags","panelEvent","recordEvent","facts","payload","blob","url","_system","change","_snapshot","oldest","run","DEVTOOLS_EVENT_NAME","BLOCKED_KEYS","SESSION_NONCE","getNextId","sanitizeEvent","needsSanitize","clean","emitDevToolsEvent","safe","full","isPrototypeSafe","obj","maxDepth","dangerousKeys","check","val","depth","objVal","persistencePlugin","storage","include","exclude","debounce","onRestore","onSave","onError","saveTimeout","trackedKeys","shouldPersist","factKey","load","save","scheduleSave","shouldSave","performancePlugin","onSlowConstraint","onSlowResolver","slowConstraintThresholdMs","slowResolverThresholdMs","resolvers","effects","reconcile","startedAt","reconcileStartTime","lastConstraintEvalEndTime","getConstraintMetrics","m","getResolverMetrics","getEffectMetrics","_active","timedEvals","_req","_error","_attempt","constraintsObj","resolversObj","effectsObj","generateId","calculatePercentile","values","percentile","index","createObservability","config","serviceName","metricsConfig","tracingConfig","alertConfigs","summaryMetricsConfig","summaryMetricNames","metricsEnabled","exportInterval","metricsExporter","maxDataPoints","tracingEnabled","sampleRate","maxSpans","tracingExporter","startTime","metricDataPoints","activeSpans","completedSpans","alertEvents","alertCooldowns","aggregatedMetrics","exportTimer","spansToExport","recordMetric","dataPoint","points","updateAggregation","checkAlerts","p","sum","firstPoint","lastValue","aggregated","metricName","alertConfig","metric","cooldownKey","lastAlert","cooldown","operator","threshold","triggered","alertEvent","getPercentiles","allValues","labels","operationName","parentSpanId","span","spanId","status","message","requestsMetric","errorsMetric","latencyMetric","tokensMetric","costMetric","totalRequests","totalErrors","errorRate","latencyPercentiles","percentiles","limit","activeAlertCount","createAgentMetrics","obs","agentName","guardrailName","toolName","fromAgent","toAgent","latencyMs","buildResource","attrs","toNanos","timestampMs","metricTypeToOTLP","convertMetrics","metrics","resource","scopeVersion","scopeMetrics","startTimeMs","dataPoints","otlpType","metricData","convertTraces","traces","spans","attributes","statusCode","createOTLPExporter","endpoint","timeoutMs","fetchFn","send","path","body","controller","response","err","CircuitBreakerOpenError","retryAfterMs","detail","msg","createCircuitBreaker","failureThreshold","recoveryTimeMs","halfOpenMaxRequests","failureWindowMs","observability","metricPrefix","isFailure","onStateChange","failureTimestamps","halfOpenRequests","halfOpenSuccesses","lastStateChange","openedAt","totalFailures","totalSuccesses","totalRejected","lastFailureTime","lastSuccessTime","transition","newState","oldState","getRecentFailures","cutoff","recordSuccess","recordFailure","maxTimestamps","fn"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Logging Plugin - Console logging for Directive events\n */\n\nimport type { Plugin, ModuleSchema } from \"../core/types.js\";\n\nexport interface LoggingPluginOptions {\n\t/** Log level */\n\tlevel?: \"debug\" | \"info\" | \"warn\" | \"error\";\n\t/** Filter function to include/exclude events */\n\tfilter?: (event: string) => boolean;\n\t/** Custom logger (defaults to console) */\n\tlogger?: Pick<Console, \"debug\" | \"info\" | \"warn\" | \"error\" | \"group\" | \"groupEnd\">;\n\t/** Prefix for log messages */\n\tprefix?: string;\n}\n\nconst LOG_LEVELS = { debug: 0, info: 1, warn: 2, error: 3 };\n\n/**\n * Create a logging plugin.\n *\n * @example\n * ```ts\n * const system = createSystem({\n * modules: [myModule],\n * plugins: [loggingPlugin({ level: \"debug\" })],\n * });\n * ```\n */\nexport function loggingPlugin<M extends ModuleSchema = ModuleSchema>(\n\toptions: LoggingPluginOptions = {},\n): Plugin<M> {\n\tconst {\n\t\tlevel = \"info\",\n\t\tfilter = () => true,\n\t\tlogger = console,\n\t\tprefix = \"[Directive]\",\n\t} = options;\n\n\tconst minLevel = LOG_LEVELS[level];\n\n\tconst log = (eventLevel: keyof typeof LOG_LEVELS, event: string, ...args: unknown[]) => {\n\t\tif (LOG_LEVELS[eventLevel] < minLevel) return;\n\t\tif (!filter(event)) return;\n\t\tlogger[eventLevel](`${prefix} ${event}`, ...args);\n\t};\n\n\treturn {\n\t\tname: \"logging\",\n\n\t\tonInit: () => log(\"debug\", \"init\"),\n\t\tonStart: () => log(\"info\", \"start\"),\n\t\tonStop: () => log(\"info\", \"stop\"),\n\t\tonDestroy: () => log(\"debug\", \"destroy\"),\n\n\t\tonFactSet: (key, value, prev) => {\n\t\t\tlog(\"debug\", \"fact.set\", { key, value, prev });\n\t\t},\n\n\t\tonFactDelete: (key, prev) => {\n\t\t\tlog(\"debug\", \"fact.delete\", { key, prev });\n\t\t},\n\n\t\tonFactsBatch: (changes) => {\n\t\t\tlog(\"debug\", \"facts.batch\", { count: changes.length, changes });\n\t\t},\n\n\t\tonDerivationCompute: (id, value, deps) => {\n\t\t\tlog(\"debug\", \"derivation.compute\", { id, value, deps });\n\t\t},\n\n\t\tonDerivationInvalidate: (id) => {\n\t\t\tlog(\"debug\", \"derivation.invalidate\", { id });\n\t\t},\n\n\t\tonReconcileStart: () => {\n\t\t\tlog(\"debug\", \"reconcile.start\");\n\t\t},\n\n\t\tonReconcileEnd: (result) => {\n\t\t\tlog(\"debug\", \"reconcile.end\", {\n\t\t\t\tunmet: result.unmet.length,\n\t\t\t\tinflight: result.inflight.length,\n\t\t\t\tcompleted: result.completed.length,\n\t\t\t\tcanceled: result.canceled.length,\n\t\t\t});\n\t\t},\n\n\t\tonConstraintEvaluate: (id, active) => {\n\t\t\tlog(\"debug\", \"constraint.evaluate\", { id, active });\n\t\t},\n\n\t\tonConstraintError: (id, error) => {\n\t\t\tlog(\"error\", \"constraint.error\", { id, error });\n\t\t},\n\n\t\tonRequirementCreated: (req) => {\n\t\t\tlog(\"debug\", \"requirement.created\", { id: req.id, type: req.requirement.type });\n\t\t},\n\n\t\tonRequirementMet: (req, byResolver) => {\n\t\t\tlog(\"info\", \"requirement.met\", { id: req.id, byResolver });\n\t\t},\n\n\t\tonRequirementCanceled: (req) => {\n\t\t\tlog(\"debug\", \"requirement.canceled\", { id: req.id });\n\t\t},\n\n\t\tonResolverStart: (resolver, req) => {\n\t\t\tlog(\"debug\", \"resolver.start\", { resolver, requirementId: req.id });\n\t\t},\n\n\t\tonResolverComplete: (resolver, req, duration) => {\n\t\t\tlog(\"info\", \"resolver.complete\", { resolver, requirementId: req.id, duration });\n\t\t},\n\n\t\tonResolverError: (resolver, req, error) => {\n\t\t\tlog(\"error\", \"resolver.error\", { resolver, requirementId: req.id, error });\n\t\t},\n\n\t\tonResolverRetry: (resolver, req, attempt) => {\n\t\t\tlog(\"warn\", \"resolver.retry\", { resolver, requirementId: req.id, attempt });\n\t\t},\n\n\t\tonResolverCancel: (resolver, req) => {\n\t\t\tlog(\"debug\", \"resolver.cancel\", { resolver, requirementId: req.id });\n\t\t},\n\n\t\tonEffectRun: (id) => {\n\t\t\tlog(\"debug\", \"effect.run\", { id });\n\t\t},\n\n\t\tonEffectError: (id, error) => {\n\t\t\tlog(\"error\", \"effect.error\", { id, error });\n\t\t},\n\n\t\tonSnapshot: (snapshot) => {\n\t\t\tlog(\"debug\", \"timetravel.snapshot\", { id: snapshot.id, trigger: snapshot.trigger });\n\t\t},\n\n\t\tonTimeTravel: (from, to) => {\n\t\t\tlog(\"info\", \"timetravel.jump\", { from, to });\n\t\t},\n\n\t\tonError: (error) => {\n\t\t\tlog(\"error\", \"error\", { source: error.source, sourceId: error.sourceId, message: error.message });\n\t\t},\n\n\t\tonErrorRecovery: (error, strategy) => {\n\t\t\tlog(\"warn\", \"error.recovery\", { source: error.source, sourceId: error.sourceId, strategy });\n\t\t},\n\t};\n}\n","/**\n * Devtools Plugin — Shared types, constants, and utility functions\n *\n * This module is the leaf dependency for the devtools plugin.\n * It contains no DOM code and no side effects.\n */\n\nimport type { ModuleSchema, System } from \"../core/types.js\";\n\n// ============================================================================\n// Options\n// ============================================================================\n\nexport interface DevtoolsPluginOptions {\n\t/** Name for this system in devtools */\n\tname?: string;\n\t/** Enable trace logging */\n\ttrace?: boolean;\n\t/** Maximum number of trace events to retain (default: 1000) */\n\tmaxEvents?: number;\n\t/** Show floating debug panel (dev mode only, requires browser) */\n\tpanel?: boolean;\n\t/** Panel position */\n\tposition?: \"bottom-right\" | \"bottom-left\" | \"top-right\" | \"top-left\";\n\t/** Start panel open */\n\tdefaultOpen?: boolean;\n}\n\n// ============================================================================\n// Circular Buffer — O(1) push with bounded capacity\n// ============================================================================\n\nexport interface TraceEvent {\n\ttimestamp: number;\n\ttype: string;\n\tdata: unknown;\n}\n\nexport class CircularBuffer<T> {\n\tprivate buf: (T | undefined)[];\n\tprivate head = 0;\n\tprivate _size = 0;\n\n\tconstructor(private capacity: number) {\n\t\tthis.buf = new Array(capacity);\n\t}\n\n\tget size() {\n\t\treturn this._size;\n\t}\n\n\tpush(item: T) {\n\t\tthis.buf[this.head] = item;\n\t\tthis.head = (this.head + 1) % this.capacity;\n\t\tif (this._size < this.capacity) {\n\t\t\tthis._size++;\n\t\t}\n\t}\n\n\ttoArray(): T[] {\n\t\tif (this._size === 0) {\n\t\t\treturn [];\n\t\t}\n\t\tif (this._size < this.capacity) {\n\t\t\treturn this.buf.slice(0, this._size) as T[];\n\t\t}\n\n\t\treturn [\n\t\t\t...(this.buf.slice(this.head) as T[]),\n\t\t\t...(this.buf.slice(0, this.head) as T[]),\n\t\t];\n\t}\n\n\tclear() {\n\t\tthis.buf = new Array(this.capacity);\n\t\tthis.head = 0;\n\t\tthis._size = 0;\n\t}\n}\n\n// ============================================================================\n// Subscriber\n// ============================================================================\n\nexport type DevtoolsSubscriber = (event: TraceEvent) => void;\n\n// ============================================================================\n// Devtools State\n// ============================================================================\n\nexport interface DevtoolsState {\n\tsystem: System<ModuleSchema> | null;\n\tevents: CircularBuffer<TraceEvent>;\n\tmaxEvents: number;\n\tsubscribers: Set<DevtoolsSubscriber>;\n\tresolverStats: Map<string, { count: number; totalMs: number; errors: number }>;\n}\n\ndeclare global {\n\tinterface Window {\n\t\t__DIRECTIVE__?: {\n\t\t\tsystems: Map<string, DevtoolsState>;\n\t\t\tgetSystem(name?: string): System<ModuleSchema> | null;\n\t\t\tgetSystems(): string[];\n\t\t\tinspect(name?: string): unknown;\n\t\t\tgetEvents(name?: string): TraceEvent[];\n\t\t\texplain(requirementId: string, name?: string): string | null;\n\t\t\texportSession(name?: string): string | null;\n\t\t\timportSession(json: string, name?: string): boolean;\n\t\t\tclearEvents(name?: string): void;\n\t\t\t/** Subscribe to trace events. Returns unsubscribe function. */\n\t\t\tsubscribe(callback: DevtoolsSubscriber, systemName?: string): () => void;\n\t\t};\n\t}\n}\n\n// ============================================================================\n// Shared Helpers\n// ============================================================================\n\n/** Safe check for dev mode. Returns false when process is unavailable. */\nexport function isDevMode(): boolean {\n\ttry {\n\t\tif (typeof process !== \"undefined\" && process.env?.NODE_ENV === \"production\") {\n\t\t\treturn false;\n\t\t}\n\t} catch {\n\t\t// process not available\n\t}\n\ttry {\n\t\t// @ts-expect-error — import.meta.env is Vite-specific\n\t\tif (typeof import.meta !== \"undefined\" && import.meta.env?.MODE === \"production\") {\n\t\t\treturn false;\n\t\t}\n\t} catch {\n\t\t// import.meta.env not available\n\t}\n\treturn true;\n}\n\nexport function formatValue(value: unknown): string {\n\ttry {\n\t\tif (value === undefined) {\n\t\t\treturn \"undefined\";\n\t\t}\n\t\tif (value === null) {\n\t\t\treturn \"null\";\n\t\t}\n\t\tif (typeof value === \"bigint\") {\n\t\t\treturn String(value) + \"n\";\n\t\t}\n\t\tif (typeof value === \"symbol\") {\n\t\t\treturn String(value);\n\t\t}\n\t\tif (typeof value === \"object\") {\n\t\t\tconst str = JSON.stringify(value, (_k, v) => {\n\t\t\t\tif (typeof v === \"bigint\") {\n\t\t\t\t\treturn String(v) + \"n\";\n\t\t\t\t}\n\t\t\t\tif (typeof v === \"symbol\") {\n\t\t\t\t\treturn String(v);\n\t\t\t\t}\n\n\t\t\t\treturn v;\n\t\t\t});\n\n\t\t\treturn str.length > 120 ? str.slice(0, 117) + \"...\" : str;\n\t\t}\n\n\t\treturn String(value);\n\t} catch {\n\t\treturn \"<error>\";\n\t}\n}\n\nexport function truncate(str: string, max: number): string {\n\tif (str.length <= max) {\n\t\treturn str;\n\t}\n\n\treturn str.slice(0, max - 3) + \"...\";\n}\n\nexport function safeInspect(system: System<ModuleSchema>) {\n\ttry {\n\t\treturn system.inspect();\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/** E15: Deep-clone event data via JSON round-trip to prevent reference sharing */\nexport function cloneViaJSON(data: unknown): unknown {\n\ttry {\n\t\tif (data === null || data === undefined || typeof data !== \"object\") {\n\t\t\treturn data;\n\t\t}\n\n\t\treturn JSON.parse(JSON.stringify(data));\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/** M7: Validate maxEvents — floor at 1, default 1000 */\nexport function validateMaxEvents(value: number | undefined): number {\n\tif (value === undefined) {\n\t\treturn 1000;\n\t}\n\tif (!Number.isFinite(value) || value < 1) {\n\t\tif (isDevMode()) {\n\t\t\tconsole.warn(`[directive:devtools] Invalid maxEvents value (${value}), using default 1000`);\n\t\t}\n\n\t\treturn 1000;\n\t}\n\n\treturn Math.floor(value);\n}\n\n// ============================================================================\n// Performance Metrics\n// ============================================================================\n\nexport interface PerfMetrics {\n\treconcileCount: number;\n\treconcileTotalMs: number;\n\tresolverStats: Map<string, { count: number; totalMs: number; errors: number }>;\n\teffectRunCount: number;\n\teffectErrorCount: number;\n\tlastReconcileStartMs: number;\n}\n\nexport function createPerfMetrics(): PerfMetrics {\n\treturn {\n\t\treconcileCount: 0,\n\t\treconcileTotalMs: 0,\n\t\tresolverStats: new Map(),\n\t\teffectRunCount: 0,\n\t\teffectErrorCount: 0,\n\t\tlastReconcileStartMs: 0,\n\t};\n}\n\n// ============================================================================\n// Timeline/Flamechart\n// ============================================================================\n\nexport const MAX_TIMELINE_ENTRIES = 200;\nexport const TIMELINE_SVG_W = 340;\nexport const TIMELINE_ROW_H = 16;\nexport const TIMELINE_LABEL_W = 80;\nexport const TIMELINE_BAR_MIN_W = 2;\nexport const TIMELINE_COLORS = [\"#8b9aff\", \"#4ade80\", \"#fbbf24\", \"#c084fc\", \"#f472b6\", \"#22d3ee\"] as const;\n\nexport interface TimelineEntry {\n\tresolver: string;\n\tstartMs: number;\n\tendMs: number;\n\terror: boolean;\n}\n\nexport interface TimelineState {\n\tentries: CircularBuffer<TimelineEntry>;\n\t/** Map of resolver → startMs for inflight resolvers */\n\tinflight: Map<string, number>;\n}\n\nexport function createTimelineState(): TimelineState {\n\treturn {\n\t\tentries: new CircularBuffer<TimelineEntry>(MAX_TIMELINE_ENTRIES),\n\t\tinflight: new Map(),\n\t};\n}\n\n// ============================================================================\n// Dependency Graph Tracking\n// ============================================================================\n\nexport interface DepGraph {\n\t/** derivation ID → fact keys it depends on */\n\tderivationDeps: Map<string, string[]>;\n\t/** currently active constraint IDs */\n\tactiveConstraints: Set<string>;\n\t/** set of fact keys that recently changed (for animation) */\n\trecentlyChangedFacts: Set<string>;\n\t/** set of derivation IDs that recently recomputed */\n\trecentlyComputedDerivations: Set<string>;\n\t/** set of constraint IDs that recently evaluated to active */\n\trecentlyActiveConstraints: Set<string>;\n\t/** animation clear timer */\n\tanimationTimer: ReturnType<typeof setTimeout> | null;\n}\n\nexport function createDepGraph(): DepGraph {\n\treturn {\n\t\tderivationDeps: new Map(),\n\t\tactiveConstraints: new Set(),\n\t\trecentlyChangedFacts: new Set(),\n\t\trecentlyComputedDerivations: new Set(),\n\t\trecentlyActiveConstraints: new Set(),\n\t\tanimationTimer: null,\n\t};\n}\n\n// ============================================================================\n// Record & Replay\n// ============================================================================\n\n// C3: Recording caps to prevent unbounded growth\nexport const MAX_RECORDED_EVENTS = 10_000;\nexport const MAX_RECORDED_SNAPSHOTS = 100;\n\nexport interface RecordingState {\n\tisRecording: boolean;\n\trecordedEvents: TraceEvent[];\n\tsnapshots: Array<{ timestamp: number; facts: Record<string, unknown> }>;\n}\n\nexport function createRecordingState(): RecordingState {\n\treturn {\n\t\tisRecording: false,\n\t\trecordedEvents: [],\n\t\tsnapshots: [],\n\t};\n}\n\n// ============================================================================\n// Panel Constants & Types\n// ============================================================================\n\nexport const MAX_PANEL_EVENTS = 50;\nexport const MAX_RESOLVER_STATS = 200;\n\n// Style constants — WCAG AA contrast ratios verified against #1a1a2e bg\nexport const S = {\n\tbg: \"#1a1a2e\",\n\ttext: \"#e0e0e0\",\n\taccent: \"#8b9aff\", // 6.63:1 contrast ratio\n\tmuted: \"#b0b0d0\", // 8.10:1 contrast ratio\n\tborder: \"#333\",\n\trowBorder: \"#2a2a4a\",\n\tgreen: \"#4ade80\",\n\tyellow: \"#fbbf24\",\n\tred: \"#f87171\",\n\tcloseBtn: \"#aaa\", // 7.34:1 contrast ratio\n\tfont: \"ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace\",\n} as const;\n\n// Flow diagram layout constants\nexport const FLOW = {\n\tnodeW: 90,\n\tnodeH: 16,\n\tnodeGap: 6,\n\tstartY: 16,\n\tcolumns: 5, // facts, derivations, constraints, requirements, resolvers\n\tcolGap: 20,\n\tfontSize: 10,\n\tlabelMaxChars: 11,\n} as const;\n\nexport interface PanelRefs {\n\tcontainer: HTMLDivElement;\n\ttoggleBtn: HTMLButtonElement;\n\ttitleEl: HTMLElement;\n\tstatusEl: HTMLSpanElement;\n\tfactsBody: HTMLTableSectionElement;\n\tfactsCount: HTMLSpanElement;\n\tderivBody: HTMLTableSectionElement;\n\tderivCount: HTMLSpanElement;\n\tderivSection: HTMLDetailsElement;\n\tinflightList: HTMLUListElement;\n\tinflightSection: HTMLDetailsElement;\n\tinflightCount: HTMLSpanElement;\n\tunmetList: HTMLUListElement;\n\tunmetSection: HTMLDetailsElement;\n\tunmetCount: HTMLSpanElement;\n\tperfSection: HTMLDetailsElement;\n\tperfBody: HTMLDivElement;\n\ttimeTravelSection: HTMLDivElement;\n\ttimeTravelLabel: HTMLSpanElement;\n\tundoBtn: HTMLButtonElement;\n\tredoBtn: HTMLButtonElement;\n\tflowSection: HTMLDetailsElement;\n\tflowSvg: SVGSVGElement;\n\ttimelineSection: HTMLDetailsElement;\n\ttimelineSvg: SVGSVGElement;\n\teventsSection: HTMLDetailsElement;\n\teventsList: HTMLDivElement;\n\teventsCount: HTMLSpanElement;\n\ttraceHint: HTMLDivElement;\n\trecordBtn: HTMLButtonElement;\n\texportBtn: HTMLButtonElement;\n}\n","/**\n * Devtools Plugin — Floating panel creation and DOM update helpers\n *\n * All DOM manipulation for the debug panel lives here.\n * Imported by devtools.ts; depends only on devtools-types.ts.\n */\n\nimport type { ModuleSchema, System } from \"../core/types.js\";\nimport {\n\ttype DevtoolsPluginOptions,\n\ttype PanelRefs,\n\ttype PerfMetrics,\n\tS,\n\tTIMELINE_SVG_W,\n\tMAX_PANEL_EVENTS,\n\tformatValue,\n\ttruncate,\n} from \"./devtools-types.js\";\n\n// ============================================================================\n// Panel Creation\n// ============================================================================\n\nexport function createPanel(\n\tsystemName: string,\n\tposition: NonNullable<DevtoolsPluginOptions[\"position\"]>,\n\tdefaultOpen: boolean,\n\tshowEvents: boolean,\n): { refs: PanelRefs; destroy: () => void; isOpen: () => boolean; flashTimers: Set<ReturnType<typeof setTimeout>> } {\n\tlet destroyed = false;\n\tconst posStyles: Record<string, string> = {\n\t\tposition: \"fixed\",\n\t\tzIndex: \"99999\",\n\t\t...(position.includes(\"bottom\") ? { bottom: \"12px\" } : { top: \"12px\" }),\n\t\t...(position.includes(\"right\") ? { right: \"12px\" } : { left: \"12px\" }),\n\t};\n\n\t// Inject focus-visible styles (E3)\n\tconst styleEl = document.createElement(\"style\");\n\tstyleEl.textContent = `[data-directive-devtools] summary:focus-visible{outline:2px solid ${S.accent};outline-offset:2px;border-radius:2px}[data-directive-devtools] button:focus-visible{outline:2px solid ${S.accent};outline-offset:2px}`;\n\tdocument.head.appendChild(styleEl);\n\n\t// Toggle button — 44x44px minimum touch target\n\tconst toggleBtn = document.createElement(\"button\");\n\ttoggleBtn.setAttribute(\"aria-label\", \"Open Directive DevTools\");\n\ttoggleBtn.setAttribute(\"aria-expanded\", String(defaultOpen));\n\ttoggleBtn.title = \"Ctrl+Shift+D to toggle\";\n\tObject.assign(toggleBtn.style, {\n\t\t...posStyles,\n\t\tbackground: S.bg,\n\t\tcolor: S.text,\n\t\tborder: `1px solid ${S.border}`,\n\t\tborderRadius: \"6px\",\n\t\tpadding: \"10px 14px\",\n\t\tminWidth: \"44px\",\n\t\tminHeight: \"44px\",\n\t\tcursor: \"pointer\",\n\t\tfontFamily: S.font,\n\t\tfontSize: \"12px\",\n\t\tdisplay: defaultOpen ? \"none\" : \"block\",\n\t});\n\ttoggleBtn.textContent = \"Directive\";\n\n\t// Container — responsive sizing\n\tconst container = document.createElement(\"div\");\n\tcontainer.setAttribute(\"role\", \"region\");\n\tcontainer.setAttribute(\"aria-label\", \"Directive DevTools\");\n\tcontainer.setAttribute(\"data-directive-devtools\", \"\");\n\tcontainer.tabIndex = -1;\n\tObject.assign(container.style, {\n\t\t...posStyles,\n\t\tbackground: S.bg,\n\t\tcolor: S.text,\n\t\tborder: `1px solid ${S.border}`,\n\t\tborderRadius: \"8px\",\n\t\tpadding: \"12px\",\n\t\tfontFamily: S.font,\n\t\tfontSize: \"11px\",\n\t\tmaxWidth: \"min(380px, calc(100vw - 24px))\",\n\t\tmaxHeight: \"min(500px, calc(100vh - 24px))\",\n\t\toverflow: \"auto\",\n\t\tboxShadow: \"0 4px 20px rgba(0,0,0,0.5)\",\n\t\tdisplay: defaultOpen ? \"block\" : \"none\",\n\t});\n\n\t// Header\n\tconst header = document.createElement(\"div\");\n\tObject.assign(header.style, { display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\", marginBottom: \"8px\" });\n\tconst titleEl = document.createElement(\"strong\");\n\ttitleEl.style.color = S.accent;\n\ttitleEl.textContent = systemName === \"default\" ? \"Directive DevTools\" : `DevTools (${systemName})`;\n\tconst closeBtn = document.createElement(\"button\");\n\tcloseBtn.setAttribute(\"aria-label\", \"Close DevTools\");\n\tObject.assign(closeBtn.style, {\n\t\tbackground: \"none\",\n\t\tborder: \"none\",\n\t\tcolor: S.closeBtn,\n\t\tcursor: \"pointer\",\n\t\tfontSize: \"16px\",\n\t\tpadding: \"8px 12px\",\n\t\tminWidth: \"44px\",\n\t\tminHeight: \"44px\",\n\t\tlineHeight: \"1\",\n\t\tdisplay: \"flex\",\n\t\talignItems: \"center\",\n\t\tjustifyContent: \"center\",\n\t});\n\tcloseBtn.textContent = \"\\u00D7\";\n\theader.appendChild(titleEl);\n\theader.appendChild(closeBtn);\n\tcontainer.appendChild(header);\n\n\t// Status\n\tconst statusRow = document.createElement(\"div\");\n\tstatusRow.style.marginBottom = \"6px\";\n\tstatusRow.setAttribute(\"aria-live\", \"polite\");\n\tconst statusEl = document.createElement(\"span\");\n\tstatusEl.style.color = S.green;\n\tstatusEl.textContent = \"Settled\";\n\tstatusRow.appendChild(statusEl);\n\tcontainer.appendChild(statusRow);\n\n\t// Time-travel controls — 44px touch targets (M6)\n\tconst timeTravelSection = document.createElement(\"div\");\n\tObject.assign(timeTravelSection.style, {\n\t\tdisplay: \"none\",\n\t\tmarginBottom: \"8px\",\n\t\tpadding: \"4px 8px\",\n\t\tbackground: \"#252545\",\n\t\tborderRadius: \"4px\",\n\t\talignItems: \"center\",\n\t\tgap: \"6px\",\n\t});\n\tconst undoBtn = document.createElement(\"button\");\n\tObject.assign(undoBtn.style, {\n\t\tbackground: \"none\", border: `1px solid ${S.border}`, color: S.text, cursor: \"pointer\",\n\t\tpadding: \"4px 10px\", borderRadius: \"3px\", fontFamily: S.font, fontSize: \"11px\",\n\t\tminWidth: \"44px\", minHeight: \"44px\",\n\t});\n\tundoBtn.textContent = \"\\u25C0 Undo\";\n\tundoBtn.disabled = true;\n\tconst redoBtn = document.createElement(\"button\");\n\tObject.assign(redoBtn.style, {\n\t\tbackground: \"none\", border: `1px solid ${S.border}`, color: S.text, cursor: \"pointer\",\n\t\tpadding: \"4px 10px\", borderRadius: \"3px\", fontFamily: S.font, fontSize: \"11px\",\n\t\tminWidth: \"44px\", minHeight: \"44px\",\n\t});\n\tredoBtn.textContent = \"Redo \\u25B6\";\n\tredoBtn.disabled = true;\n\tconst timeTravelLabel = document.createElement(\"span\");\n\ttimeTravelLabel.style.color = S.muted;\n\ttimeTravelLabel.style.fontSize = \"10px\";\n\ttimeTravelSection.appendChild(undoBtn);\n\ttimeTravelSection.appendChild(redoBtn);\n\ttimeTravelSection.appendChild(timeTravelLabel);\n\tcontainer.appendChild(timeTravelSection);\n\n\t// Helper: create table section\n\tfunction createTableSection(label: string, open: boolean) {\n\t\tconst details = document.createElement(\"details\");\n\t\tif (open) {\n\t\t\tdetails.open = true;\n\t\t}\n\t\tdetails.style.marginBottom = \"4px\";\n\t\tconst summary = document.createElement(\"summary\");\n\t\tObject.assign(summary.style, { cursor: \"pointer\", color: S.accent, marginBottom: \"4px\" });\n\t\tconst countSpan = document.createElement(\"span\");\n\t\tsummary.textContent = `${label} (`;\n\t\tsummary.appendChild(countSpan);\n\t\tsummary.appendChild(document.createTextNode(\")\"));\n\t\tcountSpan.textContent = \"0\";\n\t\tdetails.appendChild(summary);\n\n\t\tconst table = document.createElement(\"table\");\n\t\tObject.assign(table.style, { width: \"100%\", borderCollapse: \"collapse\", fontSize: \"11px\" });\n\t\tconst thead = document.createElement(\"thead\");\n\t\tconst headRow = document.createElement(\"tr\");\n\t\tfor (const col of [\"Key\", \"Value\"]) {\n\t\t\tconst th = document.createElement(\"th\");\n\t\t\tth.scope = \"col\";\n\t\t\tObject.assign(th.style, { textAlign: \"left\", padding: \"2px 4px\", color: S.accent });\n\t\t\tth.textContent = col;\n\t\t\theadRow.appendChild(th);\n\t\t}\n\t\tthead.appendChild(headRow);\n\t\ttable.appendChild(thead);\n\t\tconst tbody = document.createElement(\"tbody\");\n\t\ttable.appendChild(tbody);\n\t\tdetails.appendChild(table);\n\n\t\treturn { details, tbody, countSpan };\n\t}\n\n\t// Helper: create list section with empty state\n\tfunction createListSection(label: string, color: string) {\n\t\tconst details = document.createElement(\"details\");\n\t\tdetails.style.marginBottom = \"4px\";\n\t\tconst summary = document.createElement(\"summary\");\n\t\tObject.assign(summary.style, { cursor: \"pointer\", color, marginBottom: \"4px\" });\n\t\tconst countSpan = document.createElement(\"span\");\n\t\tsummary.textContent = `${label} (`;\n\t\tsummary.appendChild(countSpan);\n\t\tsummary.appendChild(document.createTextNode(\")\"));\n\t\tcountSpan.textContent = \"0\";\n\t\tdetails.appendChild(summary);\n\t\tconst list = document.createElement(\"ul\");\n\t\tObject.assign(list.style, { margin: \"0\", paddingLeft: \"16px\" });\n\t\tdetails.appendChild(list);\n\n\t\treturn { details, list, countSpan };\n\t}\n\n\t// Facts section\n\tconst factsSection = createTableSection(\"Facts\", true);\n\tcontainer.appendChild(factsSection.details);\n\n\t// Derivations section (always visible, shows empty state E1)\n\tconst derivSection = createTableSection(\"Derivations\", false);\n\tcontainer.appendChild(derivSection.details);\n\n\t// Inflight section\n\tconst inflightSection = createListSection(\"Inflight\", S.yellow);\n\tcontainer.appendChild(inflightSection.details);\n\n\t// Unmet section\n\tconst unmetSection = createListSection(\"Unmet\", S.red);\n\tcontainer.appendChild(unmetSection.details);\n\n\t// Performance section\n\tconst perfDetails = document.createElement(\"details\");\n\tperfDetails.style.marginBottom = \"4px\";\n\tconst perfSummary = document.createElement(\"summary\");\n\tObject.assign(perfSummary.style, { cursor: \"pointer\", color: S.accent, marginBottom: \"4px\" });\n\tperfSummary.textContent = \"Performance\";\n\tperfDetails.appendChild(perfSummary);\n\tconst perfBody = document.createElement(\"div\");\n\tperfBody.style.fontSize = \"10px\";\n\tperfBody.style.color = S.muted;\n\tperfBody.textContent = \"No data yet\";\n\tperfDetails.appendChild(perfBody);\n\tcontainer.appendChild(perfDetails);\n\n\t// Flow diagram section (I2: full dependency graph)\n\tconst flowDetails = document.createElement(\"details\");\n\tflowDetails.style.marginBottom = \"4px\";\n\tconst flowSummary = document.createElement(\"summary\");\n\tObject.assign(flowSummary.style, { cursor: \"pointer\", color: S.accent, marginBottom: \"4px\" });\n\tflowSummary.textContent = \"Dependency Graph\";\n\tflowDetails.appendChild(flowSummary);\n\tconst flowSvg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n\tflowSvg.setAttribute(\"width\", \"100%\");\n\tflowSvg.setAttribute(\"height\", \"120\");\n\tflowSvg.setAttribute(\"role\", \"img\");\n\tflowSvg.setAttribute(\"aria-label\", \"System dependency graph\");\n\tflowSvg.style.display = \"block\";\n\t// E7: Responsive — use viewBox so SVG scales\n\tflowSvg.setAttribute(\"viewBox\", \"0 0 460 120\");\n\tflowSvg.setAttribute(\"preserveAspectRatio\", \"xMinYMin meet\");\n\tflowDetails.appendChild(flowSvg);\n\tcontainer.appendChild(flowDetails);\n\n\t// I1: Timeline/Flamechart section\n\tconst timelineDetails = document.createElement(\"details\");\n\ttimelineDetails.style.marginBottom = \"4px\";\n\tconst timelineSummary = document.createElement(\"summary\");\n\tObject.assign(timelineSummary.style, { cursor: \"pointer\", color: S.accent, marginBottom: \"4px\" });\n\ttimelineSummary.textContent = \"Timeline\";\n\ttimelineDetails.appendChild(timelineSummary);\n\tconst timelineSvg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n\ttimelineSvg.setAttribute(\"width\", \"100%\");\n\ttimelineSvg.setAttribute(\"height\", \"60\");\n\ttimelineSvg.setAttribute(\"role\", \"img\");\n\ttimelineSvg.setAttribute(\"aria-label\", \"Resolver execution timeline\");\n\ttimelineSvg.style.display = \"block\";\n\ttimelineSvg.setAttribute(\"viewBox\", `0 0 ${TIMELINE_SVG_W} 60`);\n\ttimelineSvg.setAttribute(\"preserveAspectRatio\", \"xMinYMin meet\");\n\tconst timelineEmpty = document.createElementNS(\"http://www.w3.org/2000/svg\", \"text\");\n\ttimelineEmpty.setAttribute(\"x\", String(TIMELINE_SVG_W / 2));\n\ttimelineEmpty.setAttribute(\"y\", \"30\");\n\ttimelineEmpty.setAttribute(\"text-anchor\", \"middle\");\n\ttimelineEmpty.setAttribute(\"fill\", S.muted);\n\ttimelineEmpty.setAttribute(\"font-size\", \"10\");\n\ttimelineEmpty.setAttribute(\"font-family\", S.font);\n\ttimelineEmpty.textContent = \"No resolver activity yet\";\n\ttimelineSvg.appendChild(timelineEmpty);\n\ttimelineDetails.appendChild(timelineSvg);\n\tcontainer.appendChild(timelineDetails);\n\n\t// Events section\n\tlet eventsSection: HTMLDetailsElement;\n\tlet eventsList: HTMLDivElement;\n\tlet eventsCount: HTMLSpanElement;\n\tlet traceHint: HTMLDivElement;\n\n\tif (showEvents) {\n\t\tconst evDetails = document.createElement(\"details\");\n\t\tevDetails.style.marginBottom = \"4px\";\n\t\tconst evSummary = document.createElement(\"summary\");\n\t\tObject.assign(evSummary.style, { cursor: \"pointer\", color: S.accent, marginBottom: \"4px\" });\n\t\teventsCount = document.createElement(\"span\");\n\t\teventsCount.textContent = \"0\";\n\t\tevSummary.textContent = \"Events (\";\n\t\tevSummary.appendChild(eventsCount);\n\t\tevSummary.appendChild(document.createTextNode(\")\"));\n\t\tevDetails.appendChild(evSummary);\n\t\teventsList = document.createElement(\"div\");\n\t\tObject.assign(eventsList.style, { maxHeight: \"150px\", overflow: \"auto\", fontSize: \"10px\" });\n\t\teventsList.setAttribute(\"role\", \"log\");\n\t\teventsList.setAttribute(\"aria-live\", \"polite\");\n\t\teventsList.tabIndex = 0;\n\t\t// E2: Empty state for events\n\t\tconst waitingMsg = document.createElement(\"div\");\n\t\twaitingMsg.style.color = S.muted;\n\t\twaitingMsg.style.padding = \"4px\";\n\t\twaitingMsg.textContent = \"Waiting for events...\";\n\t\twaitingMsg.className = \"dt-events-empty\";\n\t\teventsList.appendChild(waitingMsg);\n\t\tevDetails.appendChild(eventsList);\n\t\tcontainer.appendChild(evDetails);\n\t\teventsSection = evDetails;\n\t\ttraceHint = document.createElement(\"div\");\n\t} else {\n\t\teventsSection = document.createElement(\"details\");\n\t\teventsList = document.createElement(\"div\");\n\t\teventsCount = document.createElement(\"span\");\n\t\t// E13: Trace hint when trace is off\n\t\ttraceHint = document.createElement(\"div\");\n\t\ttraceHint.style.fontSize = \"10px\";\n\t\ttraceHint.style.color = S.muted;\n\t\ttraceHint.style.marginTop = \"4px\";\n\t\ttraceHint.style.fontStyle = \"italic\";\n\t\ttraceHint.textContent = \"Enable trace: true for event log\";\n\t\tcontainer.appendChild(traceHint);\n\t}\n\n\t// Record & export buttons (I3)\n\tconst recordRow = document.createElement(\"div\");\n\tObject.assign(recordRow.style, { display: \"flex\", gap: \"6px\", marginTop: \"6px\" });\n\tconst recordBtn = document.createElement(\"button\");\n\tObject.assign(recordBtn.style, {\n\t\tbackground: \"none\", border: `1px solid ${S.border}`, color: S.text, cursor: \"pointer\",\n\t\tpadding: \"8px 12px\", borderRadius: \"3px\", fontFamily: S.font, fontSize: \"10px\",\n\t\tminWidth: \"44px\", minHeight: \"44px\",\n\t});\n\trecordBtn.textContent = \"\\u23FA Record\";\n\tconst exportBtn = document.createElement(\"button\");\n\tObject.assign(exportBtn.style, {\n\t\tbackground: \"none\", border: `1px solid ${S.border}`, color: S.text, cursor: \"pointer\",\n\t\tpadding: \"8px 12px\", borderRadius: \"3px\", fontFamily: S.font, fontSize: \"10px\",\n\t\tminWidth: \"44px\", minHeight: \"44px\",\n\t});\n\texportBtn.textContent = \"\\u2913 Export\";\n\trecordRow.appendChild(recordBtn);\n\trecordRow.appendChild(exportBtn);\n\tcontainer.appendChild(recordRow);\n\n\t// E4: Scroll isolation — prevent page scroll when scrolling within panel\n\tcontainer.addEventListener(\"wheel\", (e: WheelEvent) => {\n\t\tconst el = container;\n\t\tconst atTop = el.scrollTop === 0 && e.deltaY < 0;\n\t\tconst atBottom = el.scrollTop + el.clientHeight >= el.scrollHeight && e.deltaY > 0;\n\t\tif (atTop || atBottom) {\n\t\t\te.preventDefault();\n\t\t}\n\t}, { passive: false });\n\n\t// Open/close logic\n\tlet panelOpen = defaultOpen;\n\tconst flashTimers = new Set<ReturnType<typeof setTimeout>>();\n\n\tfunction open() {\n\t\tpanelOpen = true;\n\t\tcontainer.style.display = \"block\";\n\t\ttoggleBtn.style.display = \"none\";\n\t\ttoggleBtn.setAttribute(\"aria-expanded\", \"true\");\n\t\tcloseBtn.focus();\n\t}\n\n\tfunction close() {\n\t\tpanelOpen = false;\n\t\tcontainer.style.display = \"none\";\n\t\ttoggleBtn.style.display = \"block\";\n\t\ttoggleBtn.setAttribute(\"aria-expanded\", \"false\");\n\t\ttoggleBtn.focus();\n\t}\n\n\ttoggleBtn.addEventListener(\"click\", open);\n\tcloseBtn.addEventListener(\"click\", close);\n\n\tfunction onKeyDown(e: KeyboardEvent) {\n\t\tif (e.key === \"Escape\" && panelOpen) {\n\t\t\tclose();\n\t\t}\n\t}\n\tcontainer.addEventListener(\"keydown\", onKeyDown);\n\n\t// Global keyboard shortcut Ctrl+Shift+D / Cmd+Shift+D\n\tfunction onGlobalKeyDown(e: KeyboardEvent) {\n\t\tif (e.key === \"d\" && e.shiftKey && (e.ctrlKey || e.metaKey)) {\n\t\t\te.preventDefault();\n\t\t\tif (panelOpen) {\n\t\t\t\tclose();\n\t\t\t} else {\n\t\t\t\topen();\n\t\t\t}\n\t\t}\n\t}\n\tdocument.addEventListener(\"keydown\", onGlobalKeyDown);\n\n\t// Mount — guard document.body (M1)\n\tfunction mount() {\n\t\tif (destroyed) {\n\t\t\treturn;\n\t\t}\n\t\tdocument.body.appendChild(toggleBtn);\n\t\tdocument.body.appendChild(container);\n\t}\n\n\tif (document.body) {\n\t\tmount();\n\t} else {\n\t\t// M8: Store reference for cleanup\n\t\tdocument.addEventListener(\"DOMContentLoaded\", mount, { once: true });\n\t}\n\n\tfunction destroy() {\n\t\tdestroyed = true;\n\t\ttoggleBtn.removeEventListener(\"click\", open);\n\t\tcloseBtn.removeEventListener(\"click\", close);\n\t\tcontainer.removeEventListener(\"keydown\", onKeyDown);\n\t\tdocument.removeEventListener(\"keydown\", onGlobalKeyDown);\n\t\t// M8: Clean up DOMContentLoaded listener in case body wasn't ready\n\t\tdocument.removeEventListener(\"DOMContentLoaded\", mount);\n\t\tfor (const id of flashTimers) {\n\t\t\tclearTimeout(id);\n\t\t}\n\t\tflashTimers.clear();\n\t\ttoggleBtn.remove();\n\t\tcontainer.remove();\n\t\tstyleEl.remove();\n\t}\n\n\treturn {\n\t\trefs: {\n\t\t\tcontainer,\n\t\t\ttoggleBtn,\n\t\t\ttitleEl,\n\t\t\tstatusEl,\n\t\t\tfactsBody: factsSection.tbody,\n\t\t\tfactsCount: factsSection.countSpan,\n\t\t\tderivBody: derivSection.tbody,\n\t\t\tderivCount: derivSection.countSpan,\n\t\t\tderivSection: derivSection.details,\n\t\t\tinflightList: inflightSection.list,\n\t\t\tinflightSection: inflightSection.details,\n\t\t\tinflightCount: inflightSection.countSpan,\n\t\t\tunmetList: unmetSection.list,\n\t\t\tunmetSection: unmetSection.details,\n\t\t\tunmetCount: unmetSection.countSpan,\n\t\t\tperfSection: perfDetails,\n\t\t\tperfBody,\n\t\t\ttimeTravelSection,\n\t\t\ttimeTravelLabel,\n\t\t\tundoBtn,\n\t\t\tredoBtn,\n\t\t\tflowSection: flowDetails,\n\t\t\tflowSvg,\n\t\t\ttimelineSection: timelineDetails,\n\t\t\ttimelineSvg,\n\t\t\teventsSection,\n\t\t\teventsList,\n\t\t\teventsCount,\n\t\t\ttraceHint,\n\t\t\trecordBtn,\n\t\t\texportBtn,\n\t\t},\n\t\tdestroy,\n\t\tisOpen: () => panelOpen,\n\t\tflashTimers,\n\t};\n}\n\n// ============================================================================\n// Panel Update Helpers\n// ============================================================================\n\n/** Upsert a key/value row in a table. Returns true if the row was new. */\nexport function upsertTableRow(\n\trowMap: Map<string, HTMLTableRowElement>,\n\ttbody: HTMLTableSectionElement,\n\tkey: string,\n\tvalue: unknown,\n\tflash: boolean,\n\tflashTimers?: Set<ReturnType<typeof setTimeout>>,\n) {\n\tconst display = formatValue(value);\n\tlet row = rowMap.get(key);\n\n\tif (row) {\n\t\tconst cells = row.cells;\n\t\tif (cells[1]) {\n\t\t\tcells[1].textContent = display;\n\t\t\tif (flash && flashTimers) {\n\t\t\t\tconst cell = cells[1];\n\t\t\t\tcell.style.background = \"rgba(139, 154, 255, 0.25)\";\n\t\t\t\tconst tid = setTimeout(() => {\n\t\t\t\t\tcell.style.background = \"\";\n\t\t\t\t\tflashTimers.delete(tid);\n\t\t\t\t}, 300);\n\t\t\t\tflashTimers.add(tid);\n\t\t\t}\n\t\t}\n\t} else {\n\t\trow = document.createElement(\"tr\");\n\t\trow.style.borderBottom = `1px solid ${S.rowBorder}`;\n\t\tconst keyCell = document.createElement(\"td\");\n\t\tObject.assign(keyCell.style, { padding: \"2px 4px\", color: S.muted });\n\t\tkeyCell.textContent = key;\n\t\tconst valCell = document.createElement(\"td\");\n\t\tvalCell.style.padding = \"2px 4px\";\n\t\tvalCell.textContent = display;\n\t\trow.appendChild(keyCell);\n\t\trow.appendChild(valCell);\n\t\ttbody.appendChild(row);\n\t\trowMap.set(key, row);\n\t}\n}\n\nexport function removeTableRow(rowMap: Map<string, HTMLTableRowElement>, key: string) {\n\tconst row = rowMap.get(key);\n\tif (row) {\n\t\trow.remove();\n\t\trowMap.delete(key);\n\t}\n}\n\n/** Render inflight + unmet requirement lists */\nexport function renderRequirements(\n\trefs: PanelRefs,\n\tinflight: Array<{ id: string; resolverId: string; startedAt: number }>,\n\tunmet: Array<{ id: string; requirement: { type: string }; fromConstraint: string }>,\n) {\n\trefs.inflightList.replaceChildren();\n\trefs.inflightCount.textContent = String(inflight.length);\n\tif (inflight.length > 0) {\n\t\tfor (const r of inflight) {\n\t\t\tconst li = document.createElement(\"li\");\n\t\t\tli.style.fontSize = \"11px\";\n\t\t\tli.textContent = `${r.resolverId} (${r.id})`;\n\t\t\trefs.inflightList.appendChild(li);\n\t\t}\n\t} else {\n\t\tconst li = document.createElement(\"li\");\n\t\tli.style.fontSize = \"10px\";\n\t\tli.style.color = S.muted;\n\t\tli.textContent = \"None\";\n\t\trefs.inflightList.appendChild(li);\n\t}\n\n\trefs.unmetList.replaceChildren();\n\trefs.unmetCount.textContent = String(unmet.length);\n\tif (unmet.length > 0) {\n\t\tfor (const r of unmet) {\n\t\t\tconst li = document.createElement(\"li\");\n\t\t\tli.style.fontSize = \"11px\";\n\t\t\tli.textContent = `${r.requirement.type} from ${r.fromConstraint}`;\n\t\t\trefs.unmetList.appendChild(li);\n\t\t}\n\t} else {\n\t\tconst li = document.createElement(\"li\");\n\t\tli.style.fontSize = \"10px\";\n\t\tli.style.color = S.muted;\n\t\tli.textContent = \"None\";\n\t\trefs.unmetList.appendChild(li);\n\t}\n}\n\n/** Render status indicator */\nexport function renderStatus(\n\trefs: PanelRefs,\n\tinflightCount: number,\n\tunmetCount: number,\n) {\n\tconst isSettled = inflightCount === 0 && unmetCount === 0;\n\trefs.statusEl.style.color = isSettled ? S.green : S.yellow;\n\trefs.statusEl.textContent = isSettled ? \"Settled\" : \"Working...\";\n\trefs.toggleBtn.textContent = isSettled ? \"Directive\" : \"Directive...\";\n\trefs.toggleBtn.setAttribute(\n\t\t\"aria-label\",\n\t\t`Open Directive DevTools${isSettled ? \"\" : \" (system working)\"}`,\n\t);\n}\n\nexport function updateDerivations(\n\trefs: PanelRefs,\n\tderivRowMap: Map<string, HTMLTableRowElement>,\n\tsystem: System<ModuleSchema>,\n\tflashTimers?: Set<ReturnType<typeof setTimeout>>,\n) {\n\tconst derivationKeys = Object.keys(system.derive);\n\trefs.derivCount.textContent = String(derivationKeys.length);\n\n\t// E1: Show empty state instead of hiding\n\tif (derivationKeys.length === 0) {\n\t\tderivRowMap.clear();\n\t\trefs.derivBody.replaceChildren();\n\t\tconst row = document.createElement(\"tr\");\n\t\tconst cell = document.createElement(\"td\");\n\t\tcell.colSpan = 2;\n\t\tcell.style.color = S.muted;\n\t\tcell.style.fontSize = \"10px\";\n\t\tcell.textContent = \"No derivations defined\";\n\t\trow.appendChild(cell);\n\t\trefs.derivBody.appendChild(row);\n\n\t\treturn;\n\t}\n\n\t// Remove stale rows (E6: use Set for O(1) lookup)\n\tconst keySet = new Set(derivationKeys);\n\tfor (const [key, row] of derivRowMap) {\n\t\tif (!keySet.has(key)) {\n\t\t\trow.remove();\n\t\t\tderivRowMap.delete(key);\n\t\t}\n\t}\n\n\t// Update/add rows (E5: flash on derivation change)\n\tfor (const key of derivationKeys) {\n\t\tlet display: string;\n\t\ttry {\n\t\t\tdisplay = formatValue(system.read(key));\n\t\t} catch {\n\t\t\tdisplay = \"<error>\";\n\t\t}\n\t\tupsertTableRow(derivRowMap, refs.derivBody, key, display, true, flashTimers);\n\t}\n}\n\n// Safe event row creation — textContent only, no innerHTML\nexport function addEventRow(refs: PanelRefs, type: string, data: unknown, eventCount: number) {\n\t// Clear \"Waiting for events...\" placeholder on first event\n\tconst empty = refs.eventsList.querySelector(\".dt-events-empty\");\n\tif (empty) {\n\t\tempty.remove();\n\t}\n\n\tconst row = document.createElement(\"div\");\n\tObject.assign(row.style, {\n\t\tpadding: \"2px 4px\",\n\t\tborderBottom: `1px solid ${S.rowBorder}`,\n\t\tfontFamily: \"inherit\",\n\t});\n\tconst now = new Date();\n\tconst time = `${String(now.getHours()).padStart(2, \"0\")}:${String(now.getMinutes()).padStart(2, \"0\")}:${String(now.getSeconds()).padStart(2, \"0\")}.${String(now.getMilliseconds()).padStart(3, \"0\")}`;\n\n\tlet preview: string;\n\ttry {\n\t\tconst str = JSON.stringify(data);\n\t\tpreview = truncate(str, 60);\n\t} catch {\n\t\tpreview = \"{}\";\n\t}\n\n\tconst timeSpan = document.createElement(\"span\");\n\ttimeSpan.style.color = S.closeBtn;\n\ttimeSpan.textContent = time;\n\n\tconst typeSpan = document.createElement(\"span\");\n\ttypeSpan.style.color = S.accent;\n\ttypeSpan.textContent = ` ${type} `;\n\n\tconst previewSpan = document.createElement(\"span\");\n\tpreviewSpan.style.color = S.muted;\n\tpreviewSpan.textContent = preview;\n\n\trow.appendChild(timeSpan);\n\trow.appendChild(typeSpan);\n\trow.appendChild(previewSpan);\n\n\trefs.eventsList.prepend(row);\n\n\t// Cap visible events\n\twhile (refs.eventsList.childElementCount > MAX_PANEL_EVENTS) {\n\t\trefs.eventsList.lastElementChild?.remove();\n\t}\n\n\trefs.eventsCount.textContent = String(eventCount);\n}\n\nexport function updatePerfSection(refs: PanelRefs, perf: PerfMetrics) {\n\trefs.perfBody.replaceChildren();\n\n\tconst avgReconcile = perf.reconcileCount > 0 ? (perf.reconcileTotalMs / perf.reconcileCount).toFixed(1) : \"\\u2014\";\n\n\tconst lines: string[] = [\n\t\t`Reconciles: ${perf.reconcileCount} (avg ${avgReconcile}ms)`,\n\t\t`Effects: ${perf.effectRunCount} run, ${perf.effectErrorCount} errors`,\n\t];\n\n\tfor (const line of lines) {\n\t\tconst div = document.createElement(\"div\");\n\t\tdiv.style.marginBottom = \"2px\";\n\t\tdiv.textContent = line;\n\t\trefs.perfBody.appendChild(div);\n\t}\n\n\tif (perf.resolverStats.size > 0) {\n\t\tconst resolverHeader = document.createElement(\"div\");\n\t\tresolverHeader.style.marginTop = \"4px\";\n\t\tresolverHeader.style.marginBottom = \"2px\";\n\t\tresolverHeader.style.color = S.accent;\n\t\tresolverHeader.textContent = \"Resolvers:\";\n\t\trefs.perfBody.appendChild(resolverHeader);\n\n\t\tconst sorted = [...perf.resolverStats.entries()].sort((a, b) => b[1].totalMs - a[1].totalMs);\n\t\tfor (const [id, stats] of sorted) {\n\t\t\tconst avg = stats.count > 0 ? (stats.totalMs / stats.count).toFixed(1) : \"0\";\n\t\t\tconst div = document.createElement(\"div\");\n\t\t\tdiv.style.paddingLeft = \"8px\";\n\t\t\tdiv.textContent = `${id}: ${stats.count}x, avg ${avg}ms${stats.errors > 0 ? `, ${stats.errors} err` : \"\"}`;\n\t\t\tif (stats.errors > 0) {\n\t\t\t\tdiv.style.color = S.red;\n\t\t\t}\n\t\t\trefs.perfBody.appendChild(div);\n\t\t}\n\t}\n}\n\nexport function updateTimeTravelControls(refs: PanelRefs, system: System<ModuleSchema>) {\n\tconst tt = system.debug;\n\tif (!tt) {\n\t\trefs.timeTravelSection.style.display = \"none\";\n\n\t\treturn;\n\t}\n\trefs.timeTravelSection.style.display = \"flex\";\n\n\tconst current = tt.currentIndex;\n\tconst total = tt.snapshots.length;\n\trefs.timeTravelLabel.textContent = total > 0 ? `${current + 1} / ${total}` : \"0 snapshots\";\n\n\tconst canUndo = current > 0;\n\tconst canRedo = current < total - 1;\n\trefs.undoBtn.disabled = !canUndo;\n\trefs.undoBtn.style.opacity = canUndo ? \"1\" : \"0.4\";\n\trefs.redoBtn.disabled = !canRedo;\n\trefs.redoBtn.style.opacity = canRedo ? \"1\" : \"0.4\";\n}\n\nexport function setupTimeTravelButtons(refs: PanelRefs, system: System<ModuleSchema>) {\n\trefs.undoBtn.addEventListener(\"click\", () => {\n\t\tif (system.debug && system.debug.currentIndex > 0) {\n\t\t\tsystem.debug.goBack(1);\n\t\t}\n\t});\n\trefs.redoBtn.addEventListener(\"click\", () => {\n\t\tif (system.debug && system.debug.currentIndex < system.debug.snapshots.length - 1) {\n\t\t\tsystem.debug.goForward(1);\n\t\t}\n\t});\n}\n","/**\n * Devtools Plugin — Dependency graph and timeline SVG rendering\n *\n * Imported by devtools.ts; depends only on devtools-types.ts.\n */\n\nimport type { ModuleSchema, System } from \"../core/types.js\";\nimport {\n\ttype PanelRefs,\n\ttype DepGraph,\n\ttype TimelineState,\n\tS,\n\tFLOW,\n\tTIMELINE_SVG_W,\n\tTIMELINE_ROW_H,\n\tTIMELINE_LABEL_W,\n\tTIMELINE_BAR_MIN_W,\n\tTIMELINE_COLORS,\n\ttruncate,\n\tsafeInspect,\n} from \"./devtools-types.js\";\n\n// ============================================================================\n// Graph Node Cache — avoids full SVG teardown/rebuild when topology is stable\n// ============================================================================\n\ninterface CachedNode {\n\tg: SVGGElement;\n\trect: SVGRectElement;\n\ttext: SVGTextElement;\n}\n\ninterface GraphCache {\n\tfingerprint: string;\n\tnodes: Map<string, CachedNode>;\n}\n\nconst graphCaches = new WeakMap<SVGSVGElement, GraphCache>();\n\n/** Compute a topology fingerprint (excludes animation state, which changes every reconcile). */\nfunction computeFingerprint(\n\tfactKeys: string[],\n\tderivKeys: string[],\n\tconstraints: Array<{ id: string; active: boolean }>,\n\treqMap: Map<string, { type: string; status: string }>,\n\tresolverIds: string[],\n\tactiveResolverIds: string[],\n): string {\n\treturn [\n\t\tfactKeys.join(\",\"),\n\t\tderivKeys.join(\",\"),\n\t\tconstraints.map(c => `${c.id}:${c.active}`).join(\",\"),\n\t\t[...reqMap.entries()].map(([id, r]) => `${id}:${r.status}:${r.type}`).join(\",\"),\n\t\tresolverIds.join(\",\"),\n\t\tactiveResolverIds.join(\",\"),\n\t].join(\"|\");\n}\n\n/** Update only animation attributes (pulsing) on cached node elements. */\nfunction updateAnimationAttrs(\n\tcache: GraphCache,\n\tdepGraph: DepGraph,\n\tfactKeys: string[],\n\tderivKeys: string[],\n\tconstraintIds: string[],\n) {\n\tfor (const key of factKeys) {\n\t\tconst node = cache.nodes.get(`0:${key}`);\n\t\tif (!node) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst pulsing = depGraph.recentlyChangedFacts.has(key);\n\t\tnode.rect.setAttribute(\"fill\", pulsing ? S.text + \"33\" : \"none\");\n\t\tnode.rect.setAttribute(\"stroke-width\", pulsing ? \"2\" : \"1\");\n\t}\n\tfor (const key of derivKeys) {\n\t\tconst node = cache.nodes.get(`1:${key}`);\n\t\tif (!node) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst pulsing = depGraph.recentlyComputedDerivations.has(key);\n\t\tnode.rect.setAttribute(\"fill\", pulsing ? S.accent + \"33\" : \"none\");\n\t\tnode.rect.setAttribute(\"stroke-width\", pulsing ? \"2\" : \"1\");\n\t}\n\tfor (const id of constraintIds) {\n\t\tconst node = cache.nodes.get(`2:${id}`);\n\t\tif (!node) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst pulsing = depGraph.recentlyActiveConstraints.has(id);\n\t\t// Active constraints use S.yellow, inactive use S.muted — these are part of the fingerprint,\n\t\t// so the color is already correct. Only update pulsing fill and stroke-width.\n\t\tconst color = node.rect.getAttribute(\"stroke\") ?? S.muted;\n\t\tnode.rect.setAttribute(\"fill\", pulsing ? color + \"33\" : \"none\");\n\t\tnode.rect.setAttribute(\"stroke-width\", pulsing ? \"2\" : \"1\");\n\t}\n}\n\n// ============================================================================\n// Full Dependency Graph (facts→derivations→constraints→reqs→resolvers)\n// ============================================================================\n\nexport function updateDependencyGraph(\n\trefs: PanelRefs,\n\tsystem: System<ModuleSchema>,\n\tdepGraph: DepGraph,\n) {\n\tconst inspection = safeInspect(system);\n\tif (!inspection) {\n\t\treturn;\n\t}\n\n\t// Collect all nodes\n\tlet factKeys: string[];\n\ttry {\n\t\tfactKeys = Object.keys(system.facts.$store.toObject());\n\t} catch {\n\t\tfactKeys = [];\n\t}\n\tconst derivKeys = Object.keys(system.derive);\n\tconst allConstraints = inspection.constraints;\n\tconst unmetReqs = inspection.unmet;\n\tconst inflightReqs = inspection.inflight;\n\tconst resolverIds = Object.keys(inspection.resolvers);\n\n\t// Build requirement map\n\tconst reqMap = new Map<string, { type: string; fromConstraint: string; status: string }>();\n\tfor (const u of unmetReqs) {\n\t\treqMap.set(u.id, { type: u.requirement.type, fromConstraint: u.fromConstraint, status: \"unmet\" });\n\t}\n\tfor (const f of inflightReqs) {\n\t\treqMap.set(f.id, { type: f.resolverId, fromConstraint: \"\", status: \"inflight\" });\n\t}\n\n\t// If nothing to show at all\n\tif (factKeys.length === 0 && derivKeys.length === 0 && allConstraints.length === 0 && resolverIds.length === 0) {\n\t\tgraphCaches.delete(refs.flowSvg);\n\t\trefs.flowSvg.replaceChildren();\n\t\trefs.flowSvg.setAttribute(\"viewBox\", \"0 0 460 40\");\n\t\tconst text = document.createElementNS(\"http://www.w3.org/2000/svg\", \"text\");\n\t\ttext.setAttribute(\"x\", \"230\");\n\t\ttext.setAttribute(\"y\", \"24\");\n\t\ttext.setAttribute(\"text-anchor\", \"middle\");\n\t\ttext.setAttribute(\"fill\", S.muted);\n\t\ttext.setAttribute(\"font-size\", \"10\");\n\t\ttext.setAttribute(\"font-family\", S.font);\n\t\ttext.textContent = \"No system topology\";\n\t\trefs.flowSvg.appendChild(text);\n\n\t\treturn;\n\t}\n\n\t// Check fingerprint — skip full rebuild if topology unchanged\n\tconst activeResolverIds = inflightReqs.map(f => f.resolverId).sort();\n\tconst fingerprint = computeFingerprint(\n\t\tfactKeys, derivKeys, allConstraints, reqMap, resolverIds, activeResolverIds,\n\t);\n\n\tconst existingCache = graphCaches.get(refs.flowSvg);\n\tif (existingCache && existingCache.fingerprint === fingerprint) {\n\t\t// Topology unchanged — only update pulsing animation attributes\n\t\tupdateAnimationAttrs(\n\t\t\texistingCache, depGraph, factKeys, derivKeys,\n\t\t\tallConstraints.map(c => c.id),\n\t\t);\n\n\t\treturn;\n\t}\n\n\t// Full rebuild — topology changed\n\tconst colW = FLOW.nodeW + FLOW.colGap;\n\tconst colX: [number, number, number, number, number] = [\n\t\t5,\n\t\t5 + colW,\n\t\t5 + colW * 2,\n\t\t5 + colW * 3,\n\t\t5 + colW * 4,\n\t];\n\tconst totalW = colX[4] + FLOW.nodeW + 5;\n\n\tfunction layoutColumn<T>(items: T[]): Array<T & { y: number }> {\n\t\tlet y = FLOW.startY + 12;\n\n\t\treturn items.map(item => {\n\t\t\tconst node = { ...item, y };\n\t\t\ty += FLOW.nodeH + FLOW.nodeGap;\n\n\t\t\treturn node;\n\t\t});\n\t}\n\n\tconst factNodes = layoutColumn(factKeys.map(k => ({ id: k, label: truncate(k, FLOW.labelMaxChars) })));\n\tconst derivNodes = layoutColumn(derivKeys.map(k => ({ id: k, label: truncate(k, FLOW.labelMaxChars) })));\n\tconst constraintNodes = layoutColumn(allConstraints.map(c => ({\n\t\tid: c.id, label: truncate(c.id, FLOW.labelMaxChars), active: c.active, priority: c.priority,\n\t})));\n\tconst reqNodeArr = layoutColumn([...reqMap.entries()].map(([id, r]) => ({\n\t\tid, type: r.type, fromConstraint: r.fromConstraint, status: r.status,\n\t})));\n\tconst resolverNodeArr = layoutColumn(resolverIds.map(id => ({ id, label: truncate(id, FLOW.labelMaxChars) })));\n\n\tconst maxRows = Math.max(\n\t\tfactNodes.length, derivNodes.length, constraintNodes.length,\n\t\treqNodeArr.length, resolverNodeArr.length, 1,\n\t);\n\tconst totalH = FLOW.startY + 12 + maxRows * (FLOW.nodeH + FLOW.nodeGap) + 8;\n\n\trefs.flowSvg.replaceChildren();\n\trefs.flowSvg.setAttribute(\"viewBox\", `0 0 ${totalW} ${totalH}`);\n\n\trefs.flowSvg.setAttribute(\"aria-label\",\n\t\t`Dependency graph: ${factKeys.length} facts, ${derivKeys.length} derivations, ` +\n\t\t`${allConstraints.length} constraints, ${reqMap.size} requirements, ${resolverIds.length} resolvers`,\n\t);\n\n\t// Draw column headers\n\tconst headers = [\"Facts\", \"Derivations\", \"Constraints\", \"Reqs\", \"Resolvers\"];\n\tfor (const [i, label] of headers.entries()) {\n\t\tconst text = document.createElementNS(\"http://www.w3.org/2000/svg\", \"text\");\n\t\ttext.setAttribute(\"x\", String(colX[i] ?? 0));\n\t\ttext.setAttribute(\"y\", \"10\");\n\t\ttext.setAttribute(\"fill\", S.accent);\n\t\ttext.setAttribute(\"font-size\", String(FLOW.fontSize));\n\t\ttext.setAttribute(\"font-family\", S.font);\n\t\ttext.textContent = label;\n\t\trefs.flowSvg.appendChild(text);\n\t}\n\n\t// Cache for diff-based updates on subsequent calls\n\tconst newCache: GraphCache = { fingerprint, nodes: new Map() };\n\n\t// SVG helpers\n\tfunction drawNode(col: number, x: number, cy: number, nodeId: string, label: string, color: string, dimmed: boolean, pulsing: boolean) {\n\t\tconst g = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n\t\tconst rect = document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\n\t\trect.setAttribute(\"x\", String(x));\n\t\trect.setAttribute(\"y\", String(cy - 6));\n\t\trect.setAttribute(\"width\", String(FLOW.nodeW));\n\t\trect.setAttribute(\"height\", String(FLOW.nodeH));\n\t\trect.setAttribute(\"rx\", \"3\");\n\t\trect.setAttribute(\"fill\", pulsing ? color + \"33\" : \"none\");\n\t\trect.setAttribute(\"stroke\", color);\n\t\trect.setAttribute(\"stroke-width\", pulsing ? \"2\" : \"1\");\n\t\trect.setAttribute(\"opacity\", dimmed ? \"0.35\" : \"1\");\n\t\tg.appendChild(rect);\n\n\t\tconst text = document.createElementNS(\"http://www.w3.org/2000/svg\", \"text\");\n\t\ttext.setAttribute(\"x\", String(x + 4));\n\t\ttext.setAttribute(\"y\", String(cy + 4));\n\t\ttext.setAttribute(\"fill\", color);\n\t\ttext.setAttribute(\"font-size\", String(FLOW.fontSize));\n\t\ttext.setAttribute(\"font-family\", S.font);\n\t\ttext.setAttribute(\"opacity\", dimmed ? \"0.35\" : \"1\");\n\t\ttext.textContent = label;\n\t\tg.appendChild(text);\n\n\t\trefs.flowSvg.appendChild(g);\n\n\t\t// Cache node for animation-only updates\n\t\tnewCache.nodes.set(`${col}:${nodeId}`, { g, rect, text });\n\n\t\treturn { midX: x + FLOW.nodeW / 2, midY: cy };\n\t}\n\n\tfunction drawEdge(x1: number, y1: number, x2: number, y2: number, color: string, dimmed: boolean) {\n\t\tconst line = document.createElementNS(\"http://www.w3.org/2000/svg\", \"line\");\n\t\tline.setAttribute(\"x1\", String(x1));\n\t\tline.setAttribute(\"y1\", String(y1));\n\t\tline.setAttribute(\"x2\", String(x2));\n\t\tline.setAttribute(\"y2\", String(y2));\n\t\tline.setAttribute(\"stroke\", color);\n\t\tline.setAttribute(\"stroke-width\", \"1\");\n\t\tline.setAttribute(\"stroke-dasharray\", \"3,2\");\n\t\tline.setAttribute(\"opacity\", dimmed ? \"0.2\" : \"0.7\");\n\t\trefs.flowSvg.appendChild(line);\n\t}\n\n\t// Position maps\n\tconst factPositions = new Map<string, { midX: number; midY: number }>();\n\tconst derivPositions = new Map<string, { midX: number; midY: number }>();\n\tconst constraintPositions = new Map<string, { midX: number; midY: number }>();\n\tconst reqPositions = new Map<string, { midX: number; midY: number }>();\n\n\t// Draw fact nodes\n\tfor (const f of factNodes) {\n\t\tconst pulsing = depGraph.recentlyChangedFacts.has(f.id);\n\t\tconst pos = drawNode(0, colX[0], f.y, f.id, f.label, S.text, false, pulsing);\n\t\tfactPositions.set(f.id, pos);\n\t}\n\n\t// Draw derivation nodes\n\tfor (const d of derivNodes) {\n\t\tconst pulsing = depGraph.recentlyComputedDerivations.has(d.id);\n\t\tconst pos = drawNode(1, colX[1], d.y, d.id, d.label, S.accent, false, pulsing);\n\t\tderivPositions.set(d.id, pos);\n\t}\n\n\t// Draw constraint nodes (show ALL, dim inactive)\n\tfor (const c of constraintNodes) {\n\t\tconst pulsing = depGraph.recentlyActiveConstraints.has(c.id);\n\t\tconst pos = drawNode(2, colX[2], c.y, c.id, c.label, c.active ? S.yellow : S.muted, !c.active, pulsing);\n\t\tconstraintPositions.set(c.id, pos);\n\t}\n\n\t// Draw requirement nodes\n\tfor (const r of reqNodeArr) {\n\t\tconst color = r.status === \"unmet\" ? S.red : S.yellow;\n\t\tconst pos = drawNode(3, colX[3], r.y, r.id, truncate(r.type, FLOW.labelMaxChars), color, false, false);\n\t\treqPositions.set(r.id, pos);\n\t}\n\n\t// Draw resolver nodes (show ALL, dim idle)\n\tfor (const r of resolverNodeArr) {\n\t\tconst isActive = inflightReqs.some(f => f.resolverId === r.id);\n\t\tdrawNode(4, colX[4], r.y, r.id, r.label, isActive ? S.green : S.muted, !isActive, false);\n\t}\n\n\t// Edges: fact → derivation (from tracked deps)\n\tfor (const d of derivNodes) {\n\t\tconst deps = depGraph.derivationDeps.get(d.id);\n\t\tconst dPos = derivPositions.get(d.id);\n\t\tif (deps && dPos) {\n\t\t\tfor (const dep of deps) {\n\t\t\t\tconst fPos = factPositions.get(dep);\n\t\t\t\tif (fPos) {\n\t\t\t\t\tdrawEdge(fPos.midX + FLOW.nodeW / 2, fPos.midY, dPos.midX - FLOW.nodeW / 2, dPos.midY, S.accent, false);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Edges: constraint → requirement\n\tfor (const r of reqNodeArr) {\n\t\tconst cPos = constraintPositions.get(r.fromConstraint);\n\t\tconst rPos = reqPositions.get(r.id);\n\t\tif (cPos && rPos) {\n\t\t\tdrawEdge(cPos.midX + FLOW.nodeW / 2, cPos.midY, rPos.midX - FLOW.nodeW / 2, rPos.midY, S.muted, false);\n\t\t}\n\t}\n\n\t// Edges: requirement → resolver (for inflight)\n\tfor (const f of inflightReqs) {\n\t\tconst rPos = reqPositions.get(f.id);\n\t\tif (rPos) {\n\t\t\tconst rn = resolverNodeArr.find(n => n.id === f.resolverId);\n\t\t\tif (rn) {\n\t\t\t\tdrawEdge(rPos.midX + FLOW.nodeW / 2, rPos.midY, colX[4], rn.y, S.green, false);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Store cache for next call\n\tgraphCaches.set(refs.flowSvg, newCache);\n}\n\n/** Clear animation highlights after a brief delay */\nexport function scheduleAnimationClear(depGraph: DepGraph) {\n\tif (depGraph.animationTimer) {\n\t\tclearTimeout(depGraph.animationTimer);\n\t}\n\tdepGraph.animationTimer = setTimeout(() => {\n\t\tdepGraph.recentlyChangedFacts.clear();\n\t\tdepGraph.recentlyComputedDerivations.clear();\n\t\tdepGraph.recentlyActiveConstraints.clear();\n\t\tdepGraph.animationTimer = null;\n\t}, 600);\n}\n\n// ============================================================================\n// Timeline/Flamechart Rendering\n// ============================================================================\n\nexport function updateTimeline(\n\trefs: PanelRefs,\n\ttimeline: TimelineState,\n) {\n\tconst entries = timeline.entries.toArray();\n\tif (entries.length === 0) {\n\t\treturn;\n\t}\n\n\trefs.timelineSvg.replaceChildren();\n\n\t// Compute time range from visible entries\n\tlet minMs = Infinity;\n\tlet maxMs = -Infinity;\n\tfor (const e of entries) {\n\t\tif (e.startMs < minMs) {\n\t\t\tminMs = e.startMs;\n\t\t}\n\t\tif (e.endMs > maxMs) {\n\t\t\tmaxMs = e.endMs;\n\t\t}\n\t}\n\t// Also include inflight resolvers\n\tconst now = performance.now();\n\tfor (const startMs of timeline.inflight.values()) {\n\t\tif (startMs < minMs) {\n\t\t\tminMs = startMs;\n\t\t}\n\t\tif (now > maxMs) {\n\t\t\tmaxMs = now;\n\t\t}\n\t}\n\n\tconst range = maxMs - minMs || 1;\n\tconst barAreaW = TIMELINE_SVG_W - TIMELINE_LABEL_W - 10;\n\n\t// Group entries by resolver for swim lanes\n\tconst resolverOrder: string[] = [];\n\tconst seen = new Set<string>();\n\tfor (const e of entries) {\n\t\tif (!seen.has(e.resolver)) {\n\t\t\tseen.add(e.resolver);\n\t\t\tresolverOrder.push(e.resolver);\n\t\t}\n\t}\n\t// Also add inflight resolvers not yet completed\n\tfor (const resolver of timeline.inflight.keys()) {\n\t\tif (!seen.has(resolver)) {\n\t\t\tseen.add(resolver);\n\t\t\tresolverOrder.push(resolver);\n\t\t}\n\t}\n\n\t// Cap visible rows\n\tconst maxRows = 12;\n\tconst visibleResolvers = resolverOrder.slice(-maxRows);\n\tconst totalH = TIMELINE_ROW_H * visibleResolvers.length + 20;\n\trefs.timelineSvg.setAttribute(\"viewBox\", `0 0 ${TIMELINE_SVG_W} ${totalH}`);\n\trefs.timelineSvg.setAttribute(\"height\", String(Math.min(totalH, 200)));\n\n\t// Column header: time axis markers\n\tconst markers = 5;\n\tfor (let i = 0; i <= markers; i++) {\n\t\tconst x = TIMELINE_LABEL_W + (barAreaW * i) / markers;\n\t\tconst ms = (range * i) / markers;\n\t\tconst text = document.createElementNS(\"http://www.w3.org/2000/svg\", \"text\");\n\t\ttext.setAttribute(\"x\", String(x));\n\t\ttext.setAttribute(\"y\", \"8\");\n\t\ttext.setAttribute(\"fill\", S.muted);\n\t\ttext.setAttribute(\"font-size\", \"6\");\n\t\ttext.setAttribute(\"font-family\", S.font);\n\t\ttext.setAttribute(\"text-anchor\", \"middle\");\n\t\ttext.textContent = ms < 1000 ? `${ms.toFixed(0)}ms` : `${(ms / 1000).toFixed(1)}s`;\n\t\trefs.timelineSvg.appendChild(text);\n\n\t\t// Gridline\n\t\tconst line = document.createElementNS(\"http://www.w3.org/2000/svg\", \"line\");\n\t\tline.setAttribute(\"x1\", String(x));\n\t\tline.setAttribute(\"y1\", \"10\");\n\t\tline.setAttribute(\"x2\", String(x));\n\t\tline.setAttribute(\"y2\", String(totalH));\n\t\tline.setAttribute(\"stroke\", S.border);\n\t\tline.setAttribute(\"stroke-width\", \"0.5\");\n\t\trefs.timelineSvg.appendChild(line);\n\t}\n\n\t// Draw swim lanes\n\tfor (let row = 0; row < visibleResolvers.length; row++) {\n\t\tconst resolver = visibleResolvers[row]!;\n\t\tconst y = 12 + row * TIMELINE_ROW_H;\n\t\tconst colorIdx = row % TIMELINE_COLORS.length;\n\t\tconst color = TIMELINE_COLORS[colorIdx]!;\n\n\t\t// Label\n\t\tconst label = document.createElementNS(\"http://www.w3.org/2000/svg\", \"text\");\n\t\tlabel.setAttribute(\"x\", String(TIMELINE_LABEL_W - 4));\n\t\tlabel.setAttribute(\"y\", String(y + TIMELINE_ROW_H / 2 + 3));\n\t\tlabel.setAttribute(\"fill\", S.muted);\n\t\tlabel.setAttribute(\"font-size\", \"7\");\n\t\tlabel.setAttribute(\"font-family\", S.font);\n\t\tlabel.setAttribute(\"text-anchor\", \"end\");\n\t\tlabel.textContent = truncate(resolver, 12);\n\t\trefs.timelineSvg.appendChild(label);\n\n\t\t// Draw bars for this resolver\n\t\tconst resolverEntries = entries.filter(e => e.resolver === resolver);\n\t\tfor (const entry of resolverEntries) {\n\t\t\tconst x = TIMELINE_LABEL_W + ((entry.startMs - minMs) / range) * barAreaW;\n\t\t\tconst w = Math.max(((entry.endMs - entry.startMs) / range) * barAreaW, TIMELINE_BAR_MIN_W);\n\n\t\t\tconst rect = document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\n\t\t\trect.setAttribute(\"x\", String(x));\n\t\t\trect.setAttribute(\"y\", String(y + 2));\n\t\t\trect.setAttribute(\"width\", String(w));\n\t\t\trect.setAttribute(\"height\", String(TIMELINE_ROW_H - 4));\n\t\t\trect.setAttribute(\"rx\", \"2\");\n\t\t\trect.setAttribute(\"fill\", entry.error ? S.red : color);\n\t\t\trect.setAttribute(\"opacity\", \"0.8\");\n\n\t\t\t// Tooltip: duration\n\t\t\tconst title = document.createElementNS(\"http://www.w3.org/2000/svg\", \"title\");\n\t\t\tconst durationMs = entry.endMs - entry.startMs;\n\t\t\ttitle.textContent = `${resolver}: ${durationMs.toFixed(1)}ms${entry.error ? \" (error)\" : \"\"}`;\n\t\t\trect.appendChild(title);\n\n\t\t\trefs.timelineSvg.appendChild(rect);\n\t\t}\n\n\t\t// Draw inflight bar (animated, extending to \"now\")\n\t\tconst inflightStart = timeline.inflight.get(resolver);\n\t\tif (inflightStart !== undefined) {\n\t\t\tconst x = TIMELINE_LABEL_W + ((inflightStart - minMs) / range) * barAreaW;\n\t\t\tconst w = Math.max(((now - inflightStart) / range) * barAreaW, TIMELINE_BAR_MIN_W);\n\n\t\t\tconst rect = document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\n\t\t\trect.setAttribute(\"x\", String(x));\n\t\t\trect.setAttribute(\"y\", String(y + 2));\n\t\t\trect.setAttribute(\"width\", String(w));\n\t\t\trect.setAttribute(\"height\", String(TIMELINE_ROW_H - 4));\n\t\t\trect.setAttribute(\"rx\", \"2\");\n\t\t\trect.setAttribute(\"fill\", color);\n\t\t\trect.setAttribute(\"opacity\", \"0.4\");\n\t\t\trect.setAttribute(\"stroke\", color);\n\t\t\trect.setAttribute(\"stroke-width\", \"1\");\n\t\t\trect.setAttribute(\"stroke-dasharray\", \"3,2\");\n\n\t\t\tconst title = document.createElementNS(\"http://www.w3.org/2000/svg\", \"title\");\n\t\t\ttitle.textContent = `${resolver}: inflight ${(now - inflightStart).toFixed(0)}ms`;\n\t\t\trect.appendChild(title);\n\n\t\t\trefs.timelineSvg.appendChild(rect);\n\t\t}\n\t}\n\n\t// Update aria-label\n\trefs.timelineSvg.setAttribute(\"aria-label\",\n\t\t`Timeline: ${entries.length} resolver executions across ${visibleResolvers.length} resolvers`,\n\t);\n}\n","/**\n * Devtools Plugin - Browser devtools integration\n *\n * Exposes the system to browser devtools via window.__DIRECTIVE__\n * and optionally renders a floating debug panel with:\n * - Facts & derivations tables (live updates with flash animation)\n * - Inflight/unmet requirements\n * - Performance metrics (reconcile time, resolver latency)\n * - Time-travel controls (undo/redo/snapshot index)\n * - Full dependency graph (facts→derivations→constraints→requirements→resolvers)\n * - Timeline/flamechart waterfall of resolver execution\n * - Event log (when trace: true)\n * - Record & replay sessions (export/import JSON)\n *\n * Split into submodules:\n * - devtools-types.ts — types, constants, pure helpers\n * - devtools-panel.ts — floating panel DOM creation and update helpers\n * - devtools-graph.ts — dependency graph and timeline SVG rendering\n */\n\nimport type { Plugin, ModuleSchema, System, ReconcileResult, FactChange } from \"../core/types.js\";\n\n// Re-export public types\nexport type { DevtoolsPluginOptions, TraceEvent } from \"./devtools-types.js\";\n\nimport {\n\ttype DevtoolsPluginOptions,\n\ttype DevtoolsState,\n\ttype DevtoolsSubscriber,\n\ttype TraceEvent,\n\tCircularBuffer,\n\tisDevMode,\n\tsafeInspect,\n\tcloneViaJSON,\n\tvalidateMaxEvents,\n\tcreatePerfMetrics,\n\tcreateDepGraph,\n\tcreateRecordingState,\n\tcreateTimelineState,\n\tMAX_RECORDED_EVENTS,\n\tMAX_RECORDED_SNAPSHOTS,\n\tMAX_RESOLVER_STATS,\n\tS,\n} from \"./devtools-types.js\";\n\nimport {\n\tcreatePanel,\n\tupsertTableRow,\n\tremoveTableRow,\n\trenderRequirements,\n\trenderStatus,\n\tupdateDerivations,\n\taddEventRow,\n\tupdatePerfSection,\n\tupdateTimeTravelControls,\n\tsetupTimeTravelButtons,\n} from \"./devtools-panel.js\";\n\nimport {\n\tupdateDependencyGraph,\n\tscheduleAnimationClear,\n\tupdateTimeline,\n} from \"./devtools-graph.js\";\n\n// ============================================================================\n// Global Devtools Object\n// ============================================================================\n\nfunction initDevtools(): NonNullable<Window[\"__DIRECTIVE__\"]> {\n\tif (typeof window === \"undefined\") {\n\t\treturn {\n\t\t\tsystems: new Map(),\n\t\t\tgetSystem: () => null,\n\t\t\tgetSystems: () => [],\n\t\t\tinspect: () => null,\n\t\t\tgetEvents: () => [],\n\t\t\texplain: () => null,\n\t\t\texportSession: () => null,\n\t\t\timportSession: () => false,\n\t\t\tclearEvents: () => {},\n\t\t\tsubscribe: () => () => {},\n\t\t};\n\t}\n\n\tif (!window.__DIRECTIVE__) {\n\t\tconst systems = new Map<string, DevtoolsState>();\n\n\t\tconst api: NonNullable<Window[\"__DIRECTIVE__\"]> = {\n\t\t\tsystems,\n\t\t\tgetSystem(name) {\n\t\t\t\tif (name) {\n\t\t\t\t\treturn systems.get(name)?.system ?? null;\n\t\t\t\t}\n\t\t\t\tconst first = systems.values().next().value;\n\n\t\t\t\treturn first?.system ?? null;\n\t\t\t},\n\t\t\tgetSystems() {\n\t\t\t\treturn [...systems.keys()];\n\t\t\t},\n\t\t\tinspect(name) {\n\t\t\t\tconst system = this.getSystem(name);\n\t\t\t\tconst s = name ? systems.get(name) : systems.values().next().value;\n\t\t\t\tconst inspection = system?.inspect() ?? null;\n\t\t\t\tif (inspection && s) {\n\t\t\t\t\t(inspection as unknown as Record<string, unknown>).resolverStats = s.resolverStats\n\t\t\t\t\t\t? Object.fromEntries(s.resolverStats)\n\t\t\t\t\t\t: {};\n\t\t\t\t}\n\n\t\t\t\treturn inspection;\n\t\t\t},\n\t\t\tgetEvents(name) {\n\t\t\t\tif (name) {\n\t\t\t\t\treturn systems.get(name)?.events.toArray() ?? [];\n\t\t\t\t}\n\t\t\t\tconst first = systems.values().next().value;\n\n\t\t\t\treturn first?.events.toArray() ?? [];\n\t\t\t},\n\t\t\texplain(requirementId, name) {\n\t\t\t\tconst system = this.getSystem(name);\n\n\t\t\t\treturn system?.explain(requirementId) ?? null;\n\t\t\t},\n\t\t\tsubscribe(callback: DevtoolsSubscriber, systemName?: string) {\n\t\t\t\tconst target = systemName ? systems.get(systemName) : systems.values().next().value;\n\t\t\t\tif (!target) {\n\t\t\t\t\t// System not registered yet — register a global subscriber\n\t\t\t\t\t// that attaches to the first system that appears\n\t\t\t\t\tlet attached = false;\n\t\t\t\t\tconst check = () => {\n\t\t\t\t\t\tconst t = systemName ? systems.get(systemName) : systems.values().next().value;\n\t\t\t\t\t\tif (t && !attached) {\n\t\t\t\t\t\t\tattached = true;\n\t\t\t\t\t\t\tt.subscribers.add(callback);\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t// Poll briefly for system registration\n\t\t\t\t\tconst timer = setInterval(check, 100);\n\t\t\t\t\tconst stop = setTimeout(() => clearInterval(timer), 10_000);\n\n\t\t\t\t\treturn () => {\n\t\t\t\t\t\tclearInterval(timer);\n\t\t\t\t\t\tclearTimeout(stop);\n\t\t\t\t\t\t// Remove from any system that may have been attached\n\t\t\t\t\t\tfor (const s of systems.values()) {\n\t\t\t\t\t\t\ts.subscribers.delete(callback);\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\ttarget.subscribers.add(callback);\n\n\t\t\t\treturn () => {\n\t\t\t\t\ttarget.subscribers.delete(callback);\n\t\t\t\t};\n\t\t\t},\n\t\t\texportSession(name) {\n\t\t\t\tconst target = name ? systems.get(name) : systems.values().next().value;\n\t\t\t\tif (!target) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\treturn JSON.stringify({\n\t\t\t\t\tversion: 1,\n\t\t\t\t\tname: name ?? (systems.keys().next().value as string | undefined) ?? \"default\",\n\t\t\t\t\texportedAt: Date.now(),\n\t\t\t\t\tevents: target.events.toArray(),\n\t\t\t\t});\n\t\t\t},\n\t\t\timportSession(json, name) {\n\t\t\t\ttry {\n\t\t\t\t\t// C1: Size cap — reject payloads over 10MB\n\t\t\t\t\tif (json.length > 10 * 1024 * 1024) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tconst data = JSON.parse(json);\n\t\t\t\t\tif (!data || typeof data !== \"object\" || Array.isArray(data)) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tif (!Array.isArray(data.events)) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\t// C1: Cap imported events at target's maxEvents\n\t\t\t\t\tconst target = name ? systems.get(name) : systems.values().next().value;\n\t\t\t\t\tif (!target) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tconst maxImport = target.maxEvents;\n\t\t\t\t\tconst events = data.events as unknown[];\n\t\t\t\t\t// Only import the last maxImport events\n\t\t\t\t\tconst start = events.length > maxImport ? events.length - maxImport : 0;\n\t\t\t\t\ttarget.events.clear();\n\t\t\t\t\tfor (let i = start; i < events.length; i++) {\n\t\t\t\t\t\tconst evt = events[i];\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tevt &&\n\t\t\t\t\t\t\ttypeof evt === \"object\" &&\n\t\t\t\t\t\t\t!Array.isArray(evt) &&\n\t\t\t\t\t\t\ttypeof (evt as Record<string, unknown>).timestamp === \"number\" &&\n\t\t\t\t\t\t\ttypeof (evt as Record<string, unknown>).type === \"string\" &&\n\t\t\t\t\t\t\t(evt as Record<string, unknown>).type !== \"__proto__\" &&\n\t\t\t\t\t\t\t(evt as Record<string, unknown>).type !== \"constructor\" &&\n\t\t\t\t\t\t\t(evt as Record<string, unknown>).type !== \"prototype\"\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t// C1: Sanitize — only copy known fields\n\t\t\t\t\t\t\ttarget.events.push({\n\t\t\t\t\t\t\t\ttimestamp: (evt as Record<string, unknown>).timestamp as number,\n\t\t\t\t\t\t\t\ttype: (evt as Record<string, unknown>).type as string,\n\t\t\t\t\t\t\t\tdata: (evt as Record<string, unknown>).data ?? null,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn true;\n\t\t\t\t} catch {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tclearEvents(name) {\n\t\t\t\tconst target = name ? systems.get(name) : systems.values().next().value;\n\t\t\t\tif (!target) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\ttarget.events.clear();\n\t\t\t},\n\t\t};\n\n\t\t// C2: Non-writable global — prevent casual script overwriting\n\t\t// configurable in dev mode for test cleanup and plugin re-initialization\n\t\tObject.defineProperty(window, \"__DIRECTIVE__\", {\n\t\t\tvalue: api,\n\t\t\twritable: false,\n\t\t\tconfigurable: isDevMode(),\n\t\t\tenumerable: true,\n\t\t});\n\n\t\treturn api;\n\t}\n\n\treturn window.__DIRECTIVE__!;\n}\n\n// ============================================================================\n// Plugin Factory\n// ============================================================================\n\n/**\n * Create a devtools plugin.\n *\n * @example\n * ```ts\n * const system = createSystem({\n * module: myModule,\n * plugins: [devtoolsPlugin({ name: \"my-app\", panel: true, trace: true })],\n * });\n *\n * // In browser console:\n * // __DIRECTIVE__.inspect()\n * // __DIRECTIVE__.getEvents()\n * // __DIRECTIVE__.exportSession()\n * ```\n */\nexport function devtoolsPlugin<M extends ModuleSchema = ModuleSchema>(\n\toptions: DevtoolsPluginOptions = {},\n): Plugin<M> {\n\tconst {\n\t\tname = \"default\",\n\t\ttrace = false,\n\t\tmaxEvents: maxEventsRaw,\n\t\tpanel: panelEnabled = false,\n\t\tposition = \"bottom-right\",\n\t\tdefaultOpen = false,\n\t} = options;\n\n\tconst maxEventsOpt = validateMaxEvents(maxEventsRaw);\n\tconst devtools = initDevtools();\n\tconst state: DevtoolsState = {\n\t\tsystem: null,\n\t\tevents: new CircularBuffer<TraceEvent>(maxEventsOpt),\n\t\tmaxEvents: maxEventsOpt,\n\t\tsubscribers: new Set(),\n\t\tresolverStats: new Map(),\n\t};\n\n\tdevtools.systems.set(name, state);\n\n\tconst addEvent = (type: string, data: unknown) => {\n\t\tconst event: TraceEvent = { timestamp: Date.now(), type, data };\n\t\tif (trace) {\n\t\t\tstate.events.push(event);\n\t\t}\n\t\t// Always notify subscribers (even when trace is off — subscribers want all events)\n\t\tfor (const sub of state.subscribers) {\n\t\t\ttry {\n\t\t\t\tsub(event);\n\t\t\t} catch {\n\t\t\t\t// subscriber errors must not crash the plugin\n\t\t\t}\n\t\t}\n\t};\n\n\t// Panel state — initialized lazily in onInit\n\tlet panel: ReturnType<typeof createPanel> | null = null;\n\tconst factsRowMap = new Map<string, HTMLTableRowElement>();\n\tconst derivRowMap = new Map<string, HTMLTableRowElement>();\n\tconst perf = createPerfMetrics();\n\tconst depGraph = createDepGraph();\n\tconst recording = createRecordingState();\n\tconst timeline = createTimelineState();\n\n\tconst shouldCreatePanel =\n\t\tpanelEnabled &&\n\t\ttypeof window !== \"undefined\" &&\n\t\ttypeof document !== \"undefined\" &&\n\t\tisDevMode();\n\n\t// requestAnimationFrame coalescing for all DOM updates\n\tlet rafId: number | null = null;\n\tlet dirty = 0;\n\tconst D_FACTS = 1;\n\tconst D_DERIV = 2;\n\tconst D_REQS = 4;\n\tconst D_STATUS = 8;\n\tconst D_PERF = 16;\n\tconst D_FLOW = 32;\n\tconst D_TT = 64;\n\tconst D_TIMELINE = 128;\n\n\t// Pending fact changes for batched rAF rendering\n\tconst pendingFactUpdates = new Map<string, { value: unknown; flash: boolean }>();\n\tconst pendingFactDeletes = new Set<string>();\n\n\t// Cache last reconcile result for deferred rendering\n\tlet lastResult: ReconcileResult | null = null;\n\n\tfunction schedulePanelUpdate(bits: number) {\n\t\tdirty |= bits;\n\t\tif (rafId === null && typeof requestAnimationFrame !== \"undefined\") {\n\t\t\trafId = requestAnimationFrame(flushPanelUpdates);\n\t\t}\n\t}\n\n\tfunction flushPanelUpdates() {\n\t\trafId = null;\n\t\tif (!panel || !state.system) {\n\t\t\tdirty = 0;\n\n\t\t\treturn;\n\t\t}\n\t\tconst refs = panel.refs;\n\t\tconst sys = state.system;\n\t\tconst flags = dirty;\n\t\tdirty = 0;\n\n\t\t// Flush batched fact updates\n\t\tif (flags & D_FACTS) {\n\t\t\tfor (const key of pendingFactDeletes) {\n\t\t\t\tremoveTableRow(factsRowMap, key);\n\t\t\t}\n\t\t\tpendingFactDeletes.clear();\n\t\t\tfor (const [key, { value, flash }] of pendingFactUpdates) {\n\t\t\t\tupsertTableRow(factsRowMap, refs.factsBody, key, value, flash, panel.flashTimers);\n\t\t\t}\n\t\t\tpendingFactUpdates.clear();\n\t\t\trefs.factsCount.textContent = String(factsRowMap.size);\n\t\t}\n\t\tif (flags & D_DERIV) {\n\t\t\tupdateDerivations(refs, derivRowMap, sys, panel.flashTimers);\n\t\t}\n\t\tif (flags & D_STATUS) {\n\t\t\tif (lastResult) {\n\t\t\t\trenderStatus(refs, lastResult.inflight.length, lastResult.unmet.length);\n\t\t\t} else {\n\t\t\t\tconst inspection = safeInspect(sys);\n\t\t\t\tif (inspection) {\n\t\t\t\t\trenderStatus(refs, inspection.inflight.length, inspection.unmet.length);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (flags & D_REQS) {\n\t\t\tif (lastResult) {\n\t\t\t\trenderRequirements(refs, lastResult.inflight, lastResult.unmet as Array<{ id: string; requirement: { type: string }; fromConstraint: string }>);\n\t\t\t} else {\n\t\t\t\tconst inspection = safeInspect(sys);\n\t\t\t\tif (inspection) {\n\t\t\t\t\trenderRequirements(refs, inspection.inflight, inspection.unmet as Array<{ id: string; requirement: { type: string }; fromConstraint: string }>);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (flags & D_PERF) {\n\t\t\tupdatePerfSection(refs, perf);\n\t\t}\n\t\tif (flags & D_FLOW) {\n\t\t\tupdateDependencyGraph(refs, sys, depGraph);\n\t\t}\n\t\tif (flags & D_TT) {\n\t\t\tupdateTimeTravelControls(refs, sys);\n\t\t}\n\t\tif (flags & D_TIMELINE) {\n\t\t\tupdateTimeline(refs, timeline);\n\t\t}\n\t}\n\n\t// Helper: emit panel event only if trace is on and panel exists\n\tfunction panelEvent(type: string, data: unknown) {\n\t\tif (panel && trace) {\n\t\t\taddEventRow(panel.refs, type, data, state.events.size);\n\t\t}\n\t}\n\n\t// Record event if recording (C3: capped)\n\tfunction recordEvent(type: string, data: unknown) {\n\t\tif (recording.isRecording && recording.recordedEvents.length < MAX_RECORDED_EVENTS) {\n\t\t\trecording.recordedEvents.push({ timestamp: Date.now(), type, data: cloneViaJSON(data) });\n\t\t}\n\t}\n\n\treturn {\n\t\tname: \"devtools\",\n\n\t\tonInit: (system) => {\n\t\t\tstate.system = system as unknown as System<ModuleSchema>;\n\t\t\taddEvent(\"init\", {});\n\n\t\t\tif (typeof window !== \"undefined\") {\n\t\t\t\tconsole.log(\n\t\t\t\t\t`%c[Directive Devtools]%c System \"${name}\" initialized. Access via window.__DIRECTIVE__`,\n\t\t\t\t\t\"color: #7c3aed; font-weight: bold\",\n\t\t\t\t\t\"color: inherit\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (shouldCreatePanel) {\n\t\t\t\tconst sys = state.system;\n\t\t\t\tpanel = createPanel(name, position, defaultOpen, trace);\n\t\t\t\tconst refs = panel.refs;\n\n\t\t\t\t// Initial render of facts\n\t\t\t\ttry {\n\t\t\t\t\tconst facts = sys.facts.$store.toObject();\n\t\t\t\t\tfor (const [key, value] of Object.entries(facts)) {\n\t\t\t\t\t\tupsertTableRow(factsRowMap, refs.factsBody, key, value, false);\n\t\t\t\t\t}\n\t\t\t\t\trefs.factsCount.textContent = String(Object.keys(facts).length);\n\t\t\t\t} catch {\n\t\t\t\t\t// System not ready yet\n\t\t\t\t}\n\n\t\t\t\t// Initial render of other sections\n\t\t\t\tupdateDerivations(refs, derivRowMap, sys);\n\t\t\t\tconst inspection = safeInspect(sys);\n\t\t\t\tif (inspection) {\n\t\t\t\t\trenderStatus(refs, inspection.inflight.length, inspection.unmet.length);\n\t\t\t\t\trenderRequirements(refs, inspection.inflight, inspection.unmet as Array<{ id: string; requirement: { type: string }; fromConstraint: string }>);\n\t\t\t\t}\n\t\t\t\tupdateTimeTravelControls(refs, sys);\n\t\t\t\tsetupTimeTravelButtons(refs, sys);\n\t\t\t\tupdateDependencyGraph(refs, sys, depGraph);\n\n\t\t\t\t// Wire record & export buttons\n\t\t\t\trefs.recordBtn.addEventListener(\"click\", () => {\n\t\t\t\t\trecording.isRecording = !recording.isRecording;\n\t\t\t\t\trefs.recordBtn.textContent = recording.isRecording ? \"\\u23F9 Stop\" : \"\\u23FA Record\";\n\t\t\t\t\trefs.recordBtn.style.color = recording.isRecording ? S.red : S.text;\n\t\t\t\t\tif (recording.isRecording) {\n\t\t\t\t\t\trecording.recordedEvents = [];\n\t\t\t\t\t\trecording.snapshots = [];\n\t\t\t\t\t\t// Capture initial snapshot\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\trecording.snapshots.push({\n\t\t\t\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\t\t\t\tfacts: sys.facts.$store.toObject(),\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// ignore\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\trefs.exportBtn.addEventListener(\"click\", () => {\n\t\t\t\t\tconst events = recording.recordedEvents.length > 0\n\t\t\t\t\t\t? recording.recordedEvents\n\t\t\t\t\t\t: state.events.toArray();\n\n\t\t\t\t\tconst payload = JSON.stringify({\n\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\texportedAt: Date.now(),\n\t\t\t\t\t\tevents,\n\t\t\t\t\t\tsnapshots: recording.snapshots,\n\t\t\t\t\t}, null, 2);\n\n\t\t\t\t\t// Download as file\n\t\t\t\t\tconst blob = new Blob([payload], { type: \"application/json\" });\n\t\t\t\t\tconst url = URL.createObjectURL(blob);\n\t\t\t\t\tconst a = document.createElement(\"a\");\n\t\t\t\t\ta.href = url;\n\t\t\t\t\ta.download = `directive-session-${name}-${Date.now()}.json`;\n\t\t\t\t\ta.click();\n\t\t\t\t\tURL.revokeObjectURL(url);\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\n\t\tonStart: (_system) => {\n\t\t\taddEvent(\"start\", {});\n\t\t\tpanelEvent(\"start\", {});\n\t\t\trecordEvent(\"start\", {});\n\t\t},\n\n\t\tonStop: (_system) => {\n\t\t\taddEvent(\"stop\", {});\n\t\t\tpanelEvent(\"stop\", {});\n\t\t\trecordEvent(\"stop\", {});\n\t\t},\n\n\t\tonDestroy: (_system) => {\n\t\t\taddEvent(\"destroy\", {});\n\t\t\tdevtools.systems.delete(name);\n\t\t\tif (rafId !== null && typeof cancelAnimationFrame !== \"undefined\") {\n\t\t\t\tcancelAnimationFrame(rafId);\n\t\t\t\trafId = null;\n\t\t\t}\n\t\t\tif (depGraph.animationTimer) {\n\t\t\t\tclearTimeout(depGraph.animationTimer);\n\t\t\t}\n\t\t\tif (panel) {\n\t\t\t\tpanel.destroy();\n\t\t\t\tpanel = null;\n\t\t\t\tfactsRowMap.clear();\n\t\t\t\tderivRowMap.clear();\n\t\t\t}\n\t\t},\n\n\t\tonFactSet: (key, value, prev) => {\n\t\t\taddEvent(\"fact.set\", { key, value, prev });\n\t\t\trecordEvent(\"fact.set\", { key, value, prev });\n\t\t\tdepGraph.recentlyChangedFacts.add(key as string);\n\t\t\tif (panel && state.system) {\n\t\t\t\t// Defer DOM update to rAF\n\t\t\t\tpendingFactUpdates.set(key as string, { value, flash: true });\n\t\t\t\tpendingFactDeletes.delete(key as string);\n\t\t\t\tschedulePanelUpdate(D_FACTS);\n\t\t\t\tpanelEvent(\"fact.set\", { key, value });\n\t\t\t}\n\t\t},\n\n\t\tonFactDelete: (key, prev) => {\n\t\t\taddEvent(\"fact.delete\", { key, prev });\n\t\t\trecordEvent(\"fact.delete\", { key, prev });\n\t\t\tif (panel) {\n\t\t\t\t// Defer DOM update to rAF\n\t\t\t\tpendingFactDeletes.add(key as string);\n\t\t\t\tpendingFactUpdates.delete(key as string);\n\t\t\t\tschedulePanelUpdate(D_FACTS);\n\t\t\t\tpanelEvent(\"fact.delete\", { key });\n\t\t\t}\n\t\t},\n\n\t\tonFactsBatch: (changes: FactChange[]) => {\n\t\t\taddEvent(\"facts.batch\", { changes });\n\t\t\trecordEvent(\"facts.batch\", { count: changes.length });\n\t\t\tif (panel && state.system) {\n\t\t\t\t// Defer all DOM updates to rAF\n\t\t\t\tfor (const change of changes) {\n\t\t\t\t\tif (change.type === \"delete\") {\n\t\t\t\t\t\tpendingFactDeletes.add(change.key);\n\t\t\t\t\t\tpendingFactUpdates.delete(change.key);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdepGraph.recentlyChangedFacts.add(change.key);\n\t\t\t\t\t\tpendingFactUpdates.set(change.key, { value: change.value, flash: true });\n\t\t\t\t\t\tpendingFactDeletes.delete(change.key);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tschedulePanelUpdate(D_FACTS);\n\t\t\t\tpanelEvent(\"facts.batch\", { count: changes.length });\n\t\t\t}\n\t\t},\n\n\t\tonDerivationCompute: (id, value, deps) => {\n\t\t\taddEvent(\"derivation.compute\", { id, value, deps });\n\t\t\trecordEvent(\"derivation.compute\", { id, deps });\n\t\t\tdepGraph.derivationDeps.set(id, deps);\n\t\t\tdepGraph.recentlyComputedDerivations.add(id);\n\t\t\tpanelEvent(\"derivation.compute\", { id, deps });\n\t\t},\n\n\t\tonDerivationInvalidate: (id) => {\n\t\t\taddEvent(\"derivation.invalidate\", { id });\n\t\t\tpanelEvent(\"derivation.invalidate\", { id });\n\t\t},\n\n\t\tonReconcileStart: (_snapshot) => {\n\t\t\taddEvent(\"reconcile.start\", {});\n\t\t\tperf.lastReconcileStartMs = performance.now();\n\t\t\tpanelEvent(\"reconcile.start\", {});\n\t\t\trecordEvent(\"reconcile.start\", {});\n\t\t},\n\n\t\tonReconcileEnd: (result: ReconcileResult) => {\n\t\t\taddEvent(\"reconcile.end\", result);\n\t\t\trecordEvent(\"reconcile.end\", {\n\t\t\t\tunmet: result.unmet.length,\n\t\t\t\tinflight: result.inflight.length,\n\t\t\t\tcompleted: result.completed.length,\n\t\t\t});\n\n\t\t\t// Track reconcile performance\n\t\t\tif (perf.lastReconcileStartMs > 0) {\n\t\t\t\tconst duration = performance.now() - perf.lastReconcileStartMs;\n\t\t\t\tperf.reconcileCount++;\n\t\t\t\tperf.reconcileTotalMs += duration;\n\t\t\t\tperf.lastReconcileStartMs = 0;\n\t\t\t}\n\n\t\t\t// Capture snapshot during recording (C3: capped)\n\t\t\tif (recording.isRecording && state.system && recording.snapshots.length < MAX_RECORDED_SNAPSHOTS) {\n\t\t\t\ttry {\n\t\t\t\t\trecording.snapshots.push({\n\t\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\t\tfacts: state.system.facts.$store.toObject(),\n\t\t\t\t\t});\n\t\t\t\t} catch {\n\t\t\t\t\t// ignore\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (panel && state.system) {\n\t\t\t\tlastResult = result;\n\t\t\t\tscheduleAnimationClear(depGraph);\n\t\t\t\tschedulePanelUpdate(D_DERIV | D_STATUS | D_REQS | D_PERF | D_FLOW | D_TT);\n\t\t\t\tpanelEvent(\"reconcile.end\", {\n\t\t\t\t\tunmet: result.unmet.length,\n\t\t\t\t\tinflight: result.inflight.length,\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\n\t\tonConstraintEvaluate: (id, active) => {\n\t\t\taddEvent(\"constraint.evaluate\", { id, active });\n\t\t\trecordEvent(\"constraint.evaluate\", { id, active });\n\t\t\tif (active) {\n\t\t\t\tdepGraph.activeConstraints.add(id);\n\t\t\t\tdepGraph.recentlyActiveConstraints.add(id);\n\t\t\t} else {\n\t\t\t\tdepGraph.activeConstraints.delete(id);\n\t\t\t}\n\t\t\tpanelEvent(\"constraint.evaluate\", { id, active });\n\t\t},\n\n\t\tonConstraintError: (id, error) => {\n\t\t\taddEvent(\"constraint.error\", { id, error: String(error) });\n\t\t\tpanelEvent(\"constraint.error\", { id, error: String(error) });\n\t\t},\n\n\t\tonRequirementCreated: (req) => {\n\t\t\taddEvent(\"requirement.created\", { id: req.id, type: req.requirement.type });\n\t\t\trecordEvent(\"requirement.created\", { id: req.id, type: req.requirement.type });\n\t\t\tpanelEvent(\"requirement.created\", { id: req.id, type: req.requirement.type });\n\t\t},\n\n\t\tonRequirementMet: (req, byResolver) => {\n\t\t\taddEvent(\"requirement.met\", { id: req.id, byResolver });\n\t\t\trecordEvent(\"requirement.met\", { id: req.id, byResolver });\n\t\t\tpanelEvent(\"requirement.met\", { id: req.id, byResolver });\n\t\t},\n\n\t\tonRequirementCanceled: (req) => {\n\t\t\taddEvent(\"requirement.canceled\", { id: req.id });\n\t\t\trecordEvent(\"requirement.canceled\", { id: req.id });\n\t\t\tpanelEvent(\"requirement.canceled\", { id: req.id });\n\t\t},\n\n\t\tonResolverStart: (resolver, req) => {\n\t\t\taddEvent(\"resolver.start\", { resolver, requirementId: req.id });\n\t\t\trecordEvent(\"resolver.start\", { resolver, requirementId: req.id });\n\t\t\t// Track timeline\n\t\t\ttimeline.inflight.set(resolver, performance.now());\n\t\t\tif (panel && state.system) {\n\t\t\t\tschedulePanelUpdate(D_REQS | D_STATUS | D_TIMELINE);\n\t\t\t\tpanelEvent(\"resolver.start\", { resolver, requirementId: req.id });\n\t\t\t}\n\t\t},\n\n\t\tonResolverComplete: (resolver, req, duration) => {\n\t\t\taddEvent(\"resolver.complete\", { resolver, requirementId: req.id, duration });\n\t\t\trecordEvent(\"resolver.complete\", { resolver, requirementId: req.id, duration });\n\n\t\t\tconst stats = state.resolverStats.get(resolver) ?? { count: 0, totalMs: 0, errors: 0 };\n\t\t\tstats.count++;\n\t\t\tstats.totalMs += duration;\n\t\t\tstate.resolverStats.set(resolver, stats);\n\t\t\tif (state.resolverStats.size > MAX_RESOLVER_STATS) {\n\t\t\t\tconst oldest = state.resolverStats.keys().next().value;\n\t\t\t\tif (oldest !== undefined) state.resolverStats.delete(oldest);\n\t\t\t}\n\t\t\t// Mirror to perf for floating panel\n\t\t\tperf.resolverStats.set(resolver, { ...stats });\n\n\t\t\t// Complete timeline entry\n\t\t\tconst startMs = timeline.inflight.get(resolver);\n\t\t\ttimeline.inflight.delete(resolver);\n\t\t\tif (startMs !== undefined) {\n\t\t\t\ttimeline.entries.push({ resolver, startMs, endMs: performance.now(), error: false });\n\t\t\t}\n\n\t\t\tif (panel && state.system) {\n\t\t\t\tschedulePanelUpdate(D_REQS | D_STATUS | D_PERF | D_TIMELINE);\n\t\t\t\tpanelEvent(\"resolver.complete\", { resolver, duration });\n\t\t\t}\n\t\t},\n\n\t\tonResolverError: (resolver, req, error) => {\n\t\t\taddEvent(\"resolver.error\", { resolver, requirementId: req.id, error: String(error) });\n\t\t\trecordEvent(\"resolver.error\", { resolver, requirementId: req.id, error: String(error) });\n\n\t\t\tconst stats = state.resolverStats.get(resolver) ?? { count: 0, totalMs: 0, errors: 0 };\n\t\t\tstats.errors++;\n\t\t\tstate.resolverStats.set(resolver, stats);\n\t\t\tif (state.resolverStats.size > MAX_RESOLVER_STATS) {\n\t\t\t\tconst oldest = state.resolverStats.keys().next().value;\n\t\t\t\tif (oldest !== undefined) state.resolverStats.delete(oldest);\n\t\t\t}\n\t\t\t// Mirror to perf for floating panel\n\t\t\tperf.resolverStats.set(resolver, { ...stats });\n\n\t\t\t// Complete timeline entry as error\n\t\t\tconst startMs = timeline.inflight.get(resolver);\n\t\t\ttimeline.inflight.delete(resolver);\n\t\t\tif (startMs !== undefined) {\n\t\t\t\ttimeline.entries.push({ resolver, startMs, endMs: performance.now(), error: true });\n\t\t\t}\n\n\t\t\tif (panel && state.system) {\n\t\t\t\tschedulePanelUpdate(D_REQS | D_STATUS | D_PERF | D_TIMELINE);\n\t\t\t\tpanelEvent(\"resolver.error\", { resolver, error: String(error) });\n\t\t\t}\n\t\t},\n\n\t\tonResolverRetry: (resolver, req, attempt) => {\n\t\t\taddEvent(\"resolver.retry\", { resolver, requirementId: req.id, attempt });\n\t\t\trecordEvent(\"resolver.retry\", { resolver, requirementId: req.id, attempt });\n\t\t\tpanelEvent(\"resolver.retry\", { resolver, attempt });\n\t\t},\n\n\t\tonResolverCancel: (resolver, req) => {\n\t\t\taddEvent(\"resolver.cancel\", { resolver, requirementId: req.id });\n\t\t\trecordEvent(\"resolver.cancel\", { resolver, requirementId: req.id });\n\t\t\t// Remove from inflight\n\t\t\ttimeline.inflight.delete(resolver);\n\t\t\tpanelEvent(\"resolver.cancel\", { resolver });\n\t\t},\n\n\t\tonEffectRun: (id) => {\n\t\t\taddEvent(\"effect.run\", { id });\n\t\t\trecordEvent(\"effect.run\", { id });\n\t\t\tperf.effectRunCount++;\n\t\t\tpanelEvent(\"effect.run\", { id });\n\t\t},\n\n\t\tonEffectError: (id, error) => {\n\t\t\taddEvent(\"effect.error\", { id, error: String(error) });\n\t\t\tperf.effectErrorCount++;\n\t\t\tpanelEvent(\"effect.error\", { id, error: String(error) });\n\t\t},\n\n\t\tonSnapshot: (snapshot) => {\n\t\t\taddEvent(\"timetravel.snapshot\", { id: snapshot.id, trigger: snapshot.trigger });\n\t\t\tif (panel && state.system) {\n\t\t\t\tschedulePanelUpdate(D_TT);\n\t\t\t}\n\t\t\tpanelEvent(\"timetravel.snapshot\", { id: snapshot.id, trigger: snapshot.trigger });\n\t\t},\n\n\t\tonTimeTravel: (from, to) => {\n\t\t\taddEvent(\"timetravel.jump\", { from, to });\n\t\t\trecordEvent(\"timetravel.jump\", { from, to });\n\t\t\tif (panel && state.system) {\n\t\t\t\tconst sys = state.system;\n\t\t\t\t// After time-travel, full refresh\n\t\t\t\ttry {\n\t\t\t\t\tconst facts = sys.facts.$store.toObject();\n\t\t\t\t\tfactsRowMap.clear();\n\t\t\t\t\tpanel.refs.factsBody.replaceChildren();\n\t\t\t\t\tfor (const [key, value] of Object.entries(facts)) {\n\t\t\t\t\t\tupsertTableRow(factsRowMap, panel.refs.factsBody, key, value, false);\n\t\t\t\t\t}\n\t\t\t\t\tpanel.refs.factsCount.textContent = String(Object.keys(facts).length);\n\t\t\t\t} catch {\n\t\t\t\t\t// ignore\n\t\t\t\t}\n\t\t\t\tderivRowMap.clear();\n\t\t\t\tdepGraph.derivationDeps.clear();\n\t\t\t\tpanel.refs.derivBody.replaceChildren();\n\t\t\t\tlastResult = null;\n\t\t\t\tschedulePanelUpdate(D_DERIV | D_STATUS | D_REQS | D_FLOW | D_TT);\n\t\t\t\tpanelEvent(\"timetravel.jump\", { from, to });\n\t\t\t}\n\t\t},\n\n\t\tonError: (error) => {\n\t\t\taddEvent(\"error\", { source: error.source, sourceId: error.sourceId, message: error.message });\n\t\t\trecordEvent(\"error\", { source: error.source, message: error.message });\n\t\t\tpanelEvent(\"error\", { source: error.source, message: error.message });\n\t\t},\n\n\t\tonErrorRecovery: (error, strategy) => {\n\t\t\taddEvent(\"error.recovery\", { source: error.source, sourceId: error.sourceId, strategy });\n\t\t\tpanelEvent(\"error.recovery\", { source: error.source, strategy });\n\t\t},\n\n\t\tonRunComplete: (run) => {\n\t\t\taddEvent(\"run.complete\", {\n\t\t\t\tid: run.id,\n\t\t\t\tstatus: run.status,\n\t\t\t\tfacts: run.factChanges.length,\n\t\t\t\tconstraints: run.constraintsHit.length,\n\t\t\t\trequirements: run.requirementsAdded.length,\n\t\t\t\tresolvers: run.resolversStarted.length,\n\t\t\t\teffects: run.effectsRun.length,\n\t\t\t});\n\t\t\tpanelEvent(\"run.complete\", { id: run.id });\n\t\t},\n\t};\n}\n","/**\n * Client-Side AI Event Bridge for DevTools\n *\n * Dispatches AI debug events (guardrail checks, agent lifecycle, etc.) via\n * CustomEvent so that DevTools AI tabs populate without requiring a server-side\n * SSE stream.\n *\n * Usage:\n * ```ts\n * import { emitDevToolsEvent } from '@directive-run/core/plugins'\n *\n * const result = detectPII(text)\n * emitDevToolsEvent({\n * type: 'guardrail_check',\n * guardrailName: 'pii-detection',\n * guardrailType: 'input',\n * passed: !result.detected,\n * })\n * ```\n */\n\n/** The CustomEvent name that DevTools listens for. */\nexport const DEVTOOLS_EVENT_NAME = \"directive-devtools-event\";\n\n/** Keys that must never propagate into event objects. */\nconst BLOCKED_KEYS = new Set([\"__proto__\", \"constructor\", \"prototype\"]);\n\n/**\n * Session nonce — random prefix to avoid ID collisions across HMR reloads.\n * Each module evaluation gets a unique nonce, so even if the counter on\n * `window` resets, IDs from different sessions won't collide.\n */\nconst SESSION_NONCE = Math.random().toString(36).slice(2, 8);\n\n/**\n * Get the next event ID. Stored on `window` to survive HMR reloads\n * (module re-evaluation resets module-level variables, but `window` persists).\n * Returns a unique numeric ID by combining a session nonce hash with a counter.\n */\nfunction getNextId(): number {\n\tif (typeof window !== \"undefined\") {\n\t\tconst key = `__DIRECTIVE_BRIDGE_ID_${SESSION_NONCE}__`;\n\t\tconst w = window as unknown as Record<string, unknown>;\n\t\tconst current = (w[key] as number | undefined) ?? 0;\n\t\tw[key] = current + 1;\n\n\t\treturn current + 1;\n\t}\n\n\treturn 1;\n}\n\n/**\n * Strip prototype-pollution keys from an event object.\n */\nfunction sanitizeEvent(\n\tevent: Record<string, unknown>,\n): Record<string, unknown> {\n\tlet needsSanitize = false;\n\tfor (const key of BLOCKED_KEYS) {\n\t\tif (key in event) {\n\t\t\tneedsSanitize = true;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (!needsSanitize) {\n\t\treturn event;\n\t}\n\n\tconst clean: Record<string, unknown> = Object.create(null);\n\tfor (const [key, value] of Object.entries(event)) {\n\t\tif (!BLOCKED_KEYS.has(key)) {\n\t\t\tclean[key] = value;\n\t\t}\n\t}\n\n\treturn clean;\n}\n\n/**\n * Emit a single AI debug event into DevTools via the client-side bridge.\n *\n * The event is dispatched as a CustomEvent on `window`. The DevTools\n * `useDevToolsStream` hook listens for these and pushes them into the\n * connection module's event array — the same path as SSE events.\n *\n * Fields `id`, `timestamp`, and `snapshotId` are auto-assigned if not provided.\n */\nexport function emitDevToolsEvent(\n\tevent: Record<string, unknown> & { type: string },\n): void {\n\tif (typeof window === \"undefined\") {\n\t\treturn;\n\t}\n\n\ttry {\n\t\tconst safe = sanitizeEvent(event);\n\t\tconst full = {\n\t\t\tid: getNextId(),\n\t\t\ttimestamp: Date.now(),\n\t\t\tsnapshotId: null,\n\t\t\t...safe,\n\t\t};\n\n\t\twindow.dispatchEvent(\n\t\t\tnew CustomEvent(DEVTOOLS_EVENT_NAME, { detail: full }),\n\t\t);\n\t} catch {\n\t\t// DevTools bridge must never crash the host application\n\t}\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\tpromise: Promise<T>,\n\tms: number,\n\terrorMessage: string,\n): Promise<T> {\n\tlet timeoutId: ReturnType<typeof setTimeout>;\n\n\tconst timeoutPromise = new Promise<never>((_, reject) => {\n\t\ttimeoutId = setTimeout(() => reject(new Error(errorMessage)), ms);\n\t});\n\n\ttry {\n\t\treturn await Promise.race([promise, timeoutPromise]);\n\t} finally {\n\t\tclearTimeout(timeoutId!);\n\t}\n}\n\n/**\n * Normalize an error to an Error instance.\n * Ensures consistent error handling throughout the library.\n *\n * @param error - The error to normalize (can be anything)\n * @returns An Error instance\n */\nexport function normalizeError(error: unknown): Error {\n\tif (error instanceof Error) {\n\t\treturn error;\n\t}\n\treturn new Error(String(error));\n}\n\n/**\n * Create a stable JSON string with sorted keys.\n * Handles circular references and deeply nested objects safely.\n *\n * @param value - The value to stringify\n * @param maxDepth - Maximum nesting depth (default: 50)\n * @returns A stable JSON string\n */\nexport function stableStringify(value: unknown, maxDepth = 50): string {\n\tconst seen = new WeakSet();\n\n\tfunction stringify(val: unknown, depth: number): string {\n\t\tif (depth > maxDepth) {\n\t\t\treturn '\"[max depth exceeded]\"';\n\t\t}\n\n\t\tif (val === null) return \"null\";\n\t\tif (val === undefined) return \"undefined\";\n\n\t\tconst type = typeof val;\n\n\t\tif (type === \"string\") return JSON.stringify(val);\n\t\tif (type === \"number\" || type === \"boolean\") return String(val);\n\t\tif (type === \"function\") return '\"[function]\"';\n\t\tif (type === \"symbol\") return '\"[symbol]\"';\n\n\t\tif (Array.isArray(val)) {\n\t\t\t// Check for circular reference\n\t\t\tif (seen.has(val)) {\n\t\t\t\treturn '\"[circular]\"';\n\t\t\t}\n\t\t\tseen.add(val);\n\t\t\tconst result = `[${val.map((v) => stringify(v, depth + 1)).join(\",\")}]`;\n\t\t\tseen.delete(val);\n\t\t\treturn result;\n\t\t}\n\n\t\tif (type === \"object\") {\n\t\t\tconst obj = val as Record<string, unknown>;\n\t\t\t// Check for circular reference\n\t\t\tif (seen.has(obj)) {\n\t\t\t\treturn '\"[circular]\"';\n\t\t\t}\n\t\t\tseen.add(obj);\n\t\t\tconst keys = Object.keys(obj).sort();\n\t\t\tconst pairs = keys.map((k) => `${JSON.stringify(k)}:${stringify(obj[k], depth + 1)}`);\n\t\t\tconst result = `{${pairs.join(\",\")}}`;\n\t\t\tseen.delete(obj);\n\t\t\treturn result;\n\t\t}\n\n\t\treturn '\"[unknown]\"';\n\t}\n\n\treturn stringify(value, 0);\n}\n\n/**\n * Check for prototype pollution in an object, including nested objects.\n * Returns true if the object is safe, false if dangerous keys are found.\n *\n * @param obj - The object to check\n * @param maxDepth - Maximum nesting depth to check (default: 50)\n * @returns True if safe, false if dangerous keys found\n */\nexport function isPrototypeSafe(obj: unknown, maxDepth = 50): boolean {\n\tconst dangerousKeys = new Set([\"__proto__\", \"constructor\", \"prototype\"]);\n\tconst seen = new WeakSet();\n\n\tfunction check(val: unknown, depth: number): boolean {\n\t\tif (depth > maxDepth) return false; // Fail safe at max depth - don't assume safety\n\t\tif (val === null || val === undefined) return true;\n\t\tif (typeof val !== \"object\") return true;\n\n\t\tconst objVal = val as Record<string, unknown>;\n\n\t\t// Check for circular reference\n\t\tif (seen.has(objVal)) return true;\n\t\tseen.add(objVal);\n\n\t\t// Check array elements\n\t\tif (Array.isArray(objVal)) {\n\t\t\tfor (const item of objVal) {\n\t\t\t\tif (!check(item, depth + 1)) {\n\t\t\t\t\tseen.delete(objVal);\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tseen.delete(objVal);\n\t\t\treturn true;\n\t\t}\n\n\t\t// Check object keys and values\n\t\tfor (const key of Object.keys(objVal)) {\n\t\t\tif (dangerousKeys.has(key)) {\n\t\t\t\tseen.delete(objVal);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (!check(objVal[key], depth + 1)) {\n\t\t\t\tseen.delete(objVal);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tseen.delete(objVal);\n\t\treturn true;\n\t}\n\n\treturn check(obj, 0);\n}\n\n/**\n * Shallow equality comparison for objects.\n * Used by React hooks to avoid unnecessary re-renders.\n *\n * @param a - First object\n * @param b - Second object\n * @returns True if objects are shallowly equal\n */\nexport function shallowEqual<T extends Record<string, unknown>>(a: T, b: T): boolean {\n\tif (a === b) return true;\n\tif (!a || !b) return false;\n\n\tconst keysA = Object.keys(a);\n\tconst keysB = Object.keys(b);\n\n\tif (keysA.length !== keysB.length) return false;\n\n\tfor (const key of keysA) {\n\t\tif (a[key] !== b[key]) return false;\n\t}\n\n\treturn true;\n}\n\n/**\n * Generate a simple hash string from an object.\n * Uses djb2 algorithm on the stable stringified value.\n *\n * **Limitations:**\n * - 32-bit hash output means collision probability increases with data set size\n * (birthday paradox: ~50% collision chance at ~77,000 distinct values)\n * - Suitable for: cache invalidation, change detection, deduplication of small sets\n * - NOT suitable for: cryptographic use, security-sensitive operations, large-scale deduplication\n *\n * For security-sensitive use cases requiring stronger collision resistance,\n * consider using a cryptographic hash like SHA-256.\n *\n * @param value - The value to hash\n * @returns A hex hash string (8 characters, 32 bits)\n */\nexport function hashObject(value: unknown): string {\n\tconst str = stableStringify(value);\n\tlet hash = 5381;\n\tfor (let i = 0; i < str.length; i++) {\n\t\thash = ((hash << 5) + hash) ^ str.charCodeAt(i);\n\t}\n\t// Convert to unsigned 32-bit and then to hex\n\treturn (hash >>> 0).toString(16);\n}\n\n// ============================================================================\n// Distributable Snapshot Utilities\n// ============================================================================\n\n/**\n * Distributable snapshot type for type-safe helper functions.\n */\nexport interface DistributableSnapshotLike<T = Record<string, unknown>> {\n\tdata: T;\n\tcreatedAt: number;\n\texpiresAt?: number;\n\tversion?: string;\n\tmetadata?: Record<string, unknown>;\n}\n\n/**\n * Check if a distributable snapshot has expired.\n * Returns false if the snapshot has no expiresAt field.\n *\n * @example\n * ```typescript\n * const snapshot = system.getDistributableSnapshot({ ttlSeconds: 3600 });\n * // ... later ...\n * if (isSnapshotExpired(snapshot)) {\n * // Refresh the snapshot\n * }\n * ```\n *\n * @param snapshot - The snapshot to check\n * @param now - Optional current timestamp (defaults to Date.now())\n * @returns True if the snapshot has expired, false otherwise\n */\nexport function isSnapshotExpired<T>(\n\tsnapshot: DistributableSnapshotLike<T>,\n\tnow: number = Date.now(),\n): boolean {\n\treturn snapshot.expiresAt !== undefined && now > snapshot.expiresAt;\n}\n\n/**\n * Validate a distributable snapshot and return its data.\n * Throws if the snapshot is malformed or has expired.\n *\n * @example\n * ```typescript\n * const cached = JSON.parse(await redis.get(`entitlements:${userId}`));\n * try {\n * const data = validateSnapshot(cached);\n * // Use data.canUseFeature, etc.\n * } catch (e) {\n * // Snapshot invalid or expired, refresh it\n * }\n * ```\n *\n * @example Using custom timestamp for testing\n * ```typescript\n * const snapshot = { data: { test: true }, createdAt: 1000, expiresAt: 2000 };\n * validateSnapshot(snapshot, 1500); // Returns { test: true }\n * validateSnapshot(snapshot, 2500); // Throws: Snapshot expired\n * ```\n *\n * @param snapshot - The snapshot to validate\n * @param now - Optional current timestamp (defaults to Date.now())\n * @returns The snapshot data if valid\n * @throws Error if the snapshot is malformed or has expired\n */\nexport function validateSnapshot<T>(\n\tsnapshot: DistributableSnapshotLike<T>,\n\tnow: number = Date.now(),\n): T {\n\t// Structural validation\n\tif (!snapshot || typeof snapshot !== \"object\") {\n\t\tthrow new Error(\n\t\t\t\"[Directive] Invalid snapshot: expected an object with 'data' and 'createdAt' properties.\",\n\t\t);\n\t}\n\tif (!(\"data\" in snapshot)) {\n\t\tthrow new Error(\n\t\t\t\"[Directive] Invalid snapshot: missing required 'data' property.\",\n\t\t);\n\t}\n\tif (!(\"createdAt\" in snapshot) || typeof snapshot.createdAt !== \"number\") {\n\t\tthrow new Error(\n\t\t\t\"[Directive] Invalid snapshot: missing or invalid 'createdAt' property (expected number).\",\n\t\t);\n\t}\n\n\t// Expiration validation\n\tif (isSnapshotExpired(snapshot, now)) {\n\t\tconst expiredAt = new Date(snapshot.expiresAt!).toISOString();\n\t\tthrow new Error(\n\t\t\t`[Directive] Snapshot expired at ${expiredAt}. Obtain a fresh snapshot from the source.`,\n\t\t);\n\t}\n\treturn snapshot.data;\n}\n\n/**\n * Diff result for a single changed value.\n */\nexport interface SnapshotDiffEntry {\n\t/** The key path that changed (e.g., \"canUseApi\" or \"limits.apiCalls\") */\n\tpath: string;\n\t/** The value in the old snapshot */\n\toldValue: unknown;\n\t/** The value in the new snapshot */\n\tnewValue: unknown;\n\t/** Type of change: \"added\", \"removed\", or \"changed\" */\n\ttype: \"added\" | \"removed\" | \"changed\";\n}\n\n/**\n * Result of diffing two snapshots.\n */\nexport interface SnapshotDiff {\n\t/** Whether the snapshots are identical */\n\tidentical: boolean;\n\t/** List of changes between snapshots */\n\tchanges: SnapshotDiffEntry[];\n\t/** Whether the version changed (if both have versions) */\n\tversionChanged: boolean;\n\t/** Old version (if available) */\n\toldVersion?: string;\n\t/** New version (if available) */\n\tnewVersion?: string;\n}\n\n/**\n * Compare two distributable snapshots and return the differences.\n * Useful for debugging, audit logs, and webhook payloads.\n *\n * @example\n * ```typescript\n * const oldSnapshot = system.getDistributableSnapshot({ includeVersion: true });\n * system.dispatch({ type: \"upgradePlan\", plan: \"pro\" });\n * const newSnapshot = system.getDistributableSnapshot({ includeVersion: true });\n *\n * const diff = diffSnapshots(oldSnapshot, newSnapshot);\n * if (!diff.identical) {\n * console.log(\"Changes:\", diff.changes);\n * // [{ path: \"canUseApi\", oldValue: false, newValue: true, type: \"changed\" }]\n * }\n * ```\n *\n * @param oldSnapshot - The previous snapshot\n * @param newSnapshot - The new snapshot\n * @returns A diff result with all changes\n */\nexport function diffSnapshots<T = Record<string, unknown>>(\n\toldSnapshot: DistributableSnapshotLike<T>,\n\tnewSnapshot: DistributableSnapshotLike<T>,\n): SnapshotDiff {\n\tconst changes: SnapshotDiffEntry[] = [];\n\n\t// Deep compare function\n\tfunction compare(\n\t\toldObj: unknown,\n\t\tnewObj: unknown,\n\t\tpath: string,\n\t): void {\n\t\t// Handle null/undefined\n\t\tif (oldObj === null || oldObj === undefined) {\n\t\t\tif (newObj !== null && newObj !== undefined) {\n\t\t\t\tchanges.push({ path, oldValue: oldObj, newValue: newObj, type: \"added\" });\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (newObj === null || newObj === undefined) {\n\t\t\tchanges.push({ path, oldValue: oldObj, newValue: newObj, type: \"removed\" });\n\t\t\treturn;\n\t\t}\n\n\t\t// Handle primitives\n\t\tif (typeof oldObj !== \"object\" || typeof newObj !== \"object\") {\n\t\t\tif (!Object.is(oldObj, newObj)) {\n\t\t\t\tchanges.push({ path, oldValue: oldObj, newValue: newObj, type: \"changed\" });\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Handle arrays\n\t\tif (Array.isArray(oldObj) && Array.isArray(newObj)) {\n\t\t\tif (oldObj.length !== newObj.length) {\n\t\t\t\tchanges.push({ path, oldValue: oldObj, newValue: newObj, type: \"changed\" });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfor (let i = 0; i < oldObj.length; i++) {\n\t\t\t\tcompare(oldObj[i], newObj[i], `${path}[${i}]`);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Handle objects\n\t\tconst oldRecord = oldObj as Record<string, unknown>;\n\t\tconst newRecord = newObj as Record<string, unknown>;\n\t\tconst allKeys = new Set([...Object.keys(oldRecord), ...Object.keys(newRecord)]);\n\n\t\tfor (const key of allKeys) {\n\t\t\tconst childPath = path ? `${path}.${key}` : key;\n\t\t\tif (!(key in oldRecord)) {\n\t\t\t\tchanges.push({ path: childPath, oldValue: undefined, newValue: newRecord[key], type: \"added\" });\n\t\t\t} else if (!(key in newRecord)) {\n\t\t\t\tchanges.push({ path: childPath, oldValue: oldRecord[key], newValue: undefined, type: \"removed\" });\n\t\t\t} else {\n\t\t\t\tcompare(oldRecord[key], newRecord[key], childPath);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compare data\n\tcompare(oldSnapshot.data, newSnapshot.data, \"\");\n\n\t// Check version change\n\tconst versionChanged = oldSnapshot.version !== newSnapshot.version &&\n\t\t(oldSnapshot.version !== undefined || newSnapshot.version !== undefined);\n\n\treturn {\n\t\tidentical: changes.length === 0,\n\t\tchanges,\n\t\tversionChanged,\n\t\toldVersion: oldSnapshot.version,\n\t\tnewVersion: newSnapshot.version,\n\t};\n}\n\n// ============================================================================\n// Snapshot Signing (HMAC)\n// ============================================================================\n\n/**\n * A signed distributable snapshot.\n * Contains the original snapshot plus a cryptographic signature.\n */\nexport interface SignedSnapshot<T = Record<string, unknown>>\n\textends DistributableSnapshotLike<T> {\n\t/** HMAC-SHA256 signature in hex format */\n\tsignature: string;\n\t/** Signing algorithm used */\n\talgorithm: \"hmac-sha256\";\n}\n\n/**\n * Check if a snapshot is signed.\n *\n * @param snapshot - The snapshot to check\n * @returns True if the snapshot has a signature\n */\nexport function isSignedSnapshot<T>(\n\tsnapshot: DistributableSnapshotLike<T> | SignedSnapshot<T>,\n): snapshot is SignedSnapshot<T> {\n\treturn \"signature\" in snapshot && typeof snapshot.signature === \"string\";\n}\n\n/**\n * Sign a distributable snapshot using HMAC-SHA256.\n * Creates a tamper-proof signature that can be verified later.\n *\n * **Security Notes:**\n * - Use a cryptographically random secret of at least 32 bytes\n * - Store the secret securely (environment variable, secrets manager)\n * - Never expose the secret to clients\n * - The signature covers all snapshot fields for integrity\n *\n * @example\n * ```typescript\n * const snapshot = system.getDistributableSnapshot({\n * includeDerivations: ['canUseFeature', 'limits'],\n * ttlSeconds: 3600,\n * });\n *\n * // Sign the snapshot (server-side only)\n * const signed = await signSnapshot(snapshot, process.env.SNAPSHOT_SECRET);\n *\n * // Store in JWT, Redis, or send to client\n * const jwt = createJWT({ snapshot: signed });\n *\n * // Later, verify the signature\n * const isValid = await verifySnapshotSignature(signed, process.env.SNAPSHOT_SECRET);\n * if (!isValid) {\n * throw new Error('Snapshot has been tampered with');\n * }\n * ```\n *\n * @param snapshot - The snapshot to sign\n * @param secret - The HMAC secret (string or Uint8Array)\n * @returns A signed snapshot with the signature attached\n */\nexport async function signSnapshot<T>(\n\tsnapshot: DistributableSnapshotLike<T>,\n\tsecret: string | Uint8Array,\n): Promise<SignedSnapshot<T>> {\n\t// Create a canonical representation for signing\n\tconst payload = stableStringify({\n\t\tdata: snapshot.data,\n\t\tcreatedAt: snapshot.createdAt,\n\t\texpiresAt: snapshot.expiresAt,\n\t\tversion: snapshot.version,\n\t\tmetadata: snapshot.metadata,\n\t});\n\n\tconst signature = await hmacSha256(payload, secret);\n\n\treturn {\n\t\t...snapshot,\n\t\tsignature,\n\t\talgorithm: \"hmac-sha256\",\n\t};\n}\n\n/**\n * Verify the signature of a signed snapshot.\n * Returns true if the signature is valid, false otherwise.\n *\n * **Important:** Always verify signatures before trusting snapshot data,\n * especially if the snapshot was received from an untrusted source (client, cache).\n *\n * @example\n * ```typescript\n * // Receive signed snapshot from client or cache\n * const snapshot = JSON.parse(cachedData);\n *\n * // Verify before using\n * const isValid = await verifySnapshotSignature(snapshot, process.env.SNAPSHOT_SECRET);\n * if (!isValid) {\n * throw new Error('Invalid snapshot signature - possible tampering');\n * }\n *\n * // Now safe to use snapshot.data\n * if (snapshot.data.canUseFeature.api) {\n * // Grant access\n * }\n * ```\n *\n * @param signedSnapshot - The signed snapshot to verify\n * @param secret - The HMAC secret (must match the signing secret)\n * @returns True if signature is valid, false otherwise\n */\nexport async function verifySnapshotSignature<T>(\n\tsignedSnapshot: SignedSnapshot<T>,\n\tsecret: string | Uint8Array,\n): Promise<boolean> {\n\tif (!signedSnapshot.signature || signedSnapshot.algorithm !== \"hmac-sha256\") {\n\t\treturn false;\n\t}\n\n\t// Recreate the canonical payload (same as signing)\n\tconst payload = stableStringify({\n\t\tdata: signedSnapshot.data,\n\t\tcreatedAt: signedSnapshot.createdAt,\n\t\texpiresAt: signedSnapshot.expiresAt,\n\t\tversion: signedSnapshot.version,\n\t\tmetadata: signedSnapshot.metadata,\n\t});\n\n\tconst expectedSignature = await hmacSha256(payload, secret);\n\n\t// Use timing-safe comparison\n\treturn timingSafeEqual(signedSnapshot.signature, expectedSignature);\n}\n\n/**\n * Create HMAC-SHA256 signature of a message.\n * Uses Web Crypto API for cross-platform support (Node.js, browsers, Deno, Bun).\n */\nasync function hmacSha256(\n\tmessage: string,\n\tsecret: string | Uint8Array,\n): Promise<string> {\n\t// Convert secret to Uint8Array if string\n\tconst secretBytes: Uint8Array =\n\t\ttypeof secret === \"string\" ? new TextEncoder().encode(secret) : secret;\n\n\t// Import key for HMAC\n\tconst algorithm: HmacImportParams = { name: \"HMAC\", hash: { name: \"SHA-256\" } };\n\tconst key = await crypto.subtle.importKey(\n\t\t\"raw\",\n\t\tsecretBytes as unknown as ArrayBuffer,\n\t\talgorithm,\n\t\tfalse,\n\t\t[\"sign\"],\n\t);\n\n\t// Sign the message\n\tconst messageBytes = new TextEncoder().encode(message);\n\tconst signature = await crypto.subtle.sign(\"HMAC\", key, messageBytes);\n\n\t// Convert to hex string\n\treturn Array.from(new Uint8Array(signature))\n\t\t.map((b) => b.toString(16).padStart(2, \"0\"))\n\t\t.join(\"\");\n}\n\n/**\n * Timing-safe string comparison to prevent timing attacks.\n * Both strings should be the same length (hex signatures from same algorithm).\n */\nfunction timingSafeEqual(a: string, b: string): boolean {\n\tif (a.length !== b.length) {\n\t\treturn false;\n\t}\n\n\tlet result = 0;\n\tfor (let i = 0; i < a.length; i++) {\n\t\tresult |= a.charCodeAt(i) ^ b.charCodeAt(i);\n\t}\n\treturn result === 0;\n}\n","/**\n * Persistence Plugin - Save/restore facts to storage\n */\n\nimport type { Plugin, ModuleSchema, System } from \"../core/types.js\";\nimport { isPrototypeSafe } from \"../utils/utils.js\";\n\nexport interface PersistencePluginOptions {\n\t/** Storage backend (localStorage, sessionStorage, or custom) */\n\tstorage: Storage;\n\t/** Key to use in storage */\n\tkey: string;\n\t/** Only persist these fact keys (default: all) */\n\tinclude?: string[];\n\t/** Exclude these fact keys from persistence */\n\texclude?: string[];\n\t/** Debounce saves by this many ms (default: 100) */\n\tdebounce?: number;\n\t/** Called when state is restored */\n\tonRestore?: (data: Record<string, unknown>) => void;\n\t/** Called when state is saved */\n\tonSave?: (data: Record<string, unknown>) => void;\n\t/** Called on error */\n\tonError?: (error: Error) => void;\n}\n\n/**\n * Create a persistence plugin.\n *\n * @example\n * ```ts\n * const system = createSystem({\n * modules: [myModule],\n * plugins: [\n * persistencePlugin({\n * storage: localStorage,\n * key: \"my-app-state\",\n * include: [\"user\", \"preferences\"],\n * }),\n * ],\n * });\n * ```\n */\nexport function persistencePlugin<M extends ModuleSchema = ModuleSchema>(\n\toptions: PersistencePluginOptions,\n): Plugin<M> {\n\tconst {\n\t\tstorage,\n\t\tkey,\n\t\tinclude,\n\t\texclude = [],\n\t\tdebounce = 100,\n\t\tonRestore,\n\t\tonSave,\n\t\tonError,\n\t} = options;\n\n\tlet saveTimeout: ReturnType<typeof setTimeout> | null = null;\n\tlet system: System<M> | null = null;\n\tconst trackedKeys = new Set<string>();\n\n\t/** Check if a key should be persisted */\n\tconst shouldPersist = (factKey: string): boolean => {\n\t\tif (exclude.includes(factKey)) return false;\n\t\tif (include) return include.includes(factKey);\n\t\treturn true;\n\t};\n\n\t/** Load state from storage */\n\tconst load = (): Record<string, unknown> | null => {\n\t\ttry {\n\t\t\tconst json = storage.getItem(key);\n\t\t\tif (!json) return null;\n\n\t\t\tconst data = JSON.parse(json);\n\t\t\tif (typeof data !== \"object\" || data === null) return null;\n\n\t\t\t// Security: Check for prototype pollution\n\t\t\tif (!isPrototypeSafe(data)) {\n\t\t\t\tonError?.(new Error(\"Potential prototype pollution detected in stored data\"));\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn data as Record<string, unknown>;\n\t\t} catch (error) {\n\t\t\tonError?.(error instanceof Error ? error : new Error(String(error)));\n\t\t\treturn null;\n\t\t}\n\t};\n\n\t/** Save state to storage */\n\tconst save = () => {\n\t\tif (!system) return;\n\n\t\ttry {\n\t\t\tconst data: Record<string, unknown> = {};\n\n\t\t\tfor (const factKey of trackedKeys) {\n\t\t\t\tif (shouldPersist(factKey)) {\n\t\t\t\t\tdata[factKey] = (system.facts as Record<string, unknown>)[factKey];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tstorage.setItem(key, JSON.stringify(data));\n\t\t\tonSave?.(data);\n\t\t} catch (error) {\n\t\t\tonError?.(error instanceof Error ? error : new Error(String(error)));\n\t\t}\n\t};\n\n\t/** Schedule a debounced save */\n\tconst scheduleSave = () => {\n\t\tif (saveTimeout) {\n\t\t\tclearTimeout(saveTimeout);\n\t\t}\n\t\tsaveTimeout = setTimeout(save, debounce);\n\t};\n\n\treturn {\n\t\tname: \"persistence\",\n\n\t\tonInit: (sys) => {\n\t\t\tsystem = sys;\n\n\t\t\t// Restore state from storage\n\t\t\tconst data = load();\n\t\t\tif (data) {\n\t\t\t\tsystem.facts.$store.batch(() => {\n\t\t\t\t\tfor (const [factKey, value] of Object.entries(data)) {\n\t\t\t\t\t\tif (shouldPersist(factKey)) {\n\t\t\t\t\t\t\t(system!.facts as Record<string, unknown>)[factKey] = value;\n\t\t\t\t\t\t\ttrackedKeys.add(factKey);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tonRestore?.(data);\n\t\t\t}\n\t\t},\n\n\t\tonDestroy: () => {\n\t\t\t// Final save before destroy\n\t\t\tif (saveTimeout) {\n\t\t\t\tclearTimeout(saveTimeout);\n\t\t\t}\n\t\t\tsave();\n\t\t},\n\n\t\tonFactSet: (factKey) => {\n\t\t\ttrackedKeys.add(factKey);\n\t\t\tif (shouldPersist(factKey)) {\n\t\t\t\tscheduleSave();\n\t\t\t}\n\t\t},\n\n\t\tonFactDelete: (factKey) => {\n\t\t\ttrackedKeys.delete(factKey);\n\t\t\tif (shouldPersist(factKey)) {\n\t\t\t\tscheduleSave();\n\t\t\t}\n\t\t},\n\n\t\tonFactsBatch: (changes) => {\n\t\t\tlet shouldSave = false;\n\t\t\tfor (const change of changes) {\n\t\t\t\tif (change.type === \"set\") {\n\t\t\t\t\ttrackedKeys.add(change.key);\n\t\t\t\t} else {\n\t\t\t\t\ttrackedKeys.delete(change.key);\n\t\t\t\t}\n\t\t\t\tif (shouldPersist(change.key)) {\n\t\t\t\t\tshouldSave = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (shouldSave) {\n\t\t\t\tscheduleSave();\n\t\t\t}\n\t\t},\n\t};\n}\n","/**\n * Performance Plugin - Track constraint, resolver, and reconciliation metrics\n *\n * Uses existing plugin hooks to measure performance without modifying core runtime.\n */\n\nimport type { Plugin, ModuleSchema } from \"../core/types.js\";\n\n/** Metrics for a single constraint */\nexport interface ConstraintMetrics {\n\tevaluations: number;\n\ttotalDurationMs: number;\n\tavgDurationMs: number;\n\tmaxDurationMs: number;\n\tlastEvaluatedAt: number;\n}\n\n/** Metrics for a single resolver */\nexport interface ResolverMetrics {\n\tstarts: number;\n\tcompletions: number;\n\terrors: number;\n\tretries: number;\n\tcancellations: number;\n\ttotalDurationMs: number;\n\tavgDurationMs: number;\n\tmaxDurationMs: number;\n\tlastCompletedAt: number;\n}\n\n/** Metrics for the reconciliation loop */\nexport interface ReconcileMetrics {\n\truns: number;\n\ttotalDurationMs: number;\n\tavgDurationMs: number;\n\tmaxDurationMs: number;\n}\n\n/** Metrics for effects */\nexport interface EffectMetrics {\n\truns: number;\n\terrors: number;\n\tlastRunAt: number;\n}\n\n/** Full performance snapshot */\nexport interface PerformanceSnapshot {\n\tconstraints: Record<string, ConstraintMetrics>;\n\tresolvers: Record<string, ResolverMetrics>;\n\teffects: Record<string, EffectMetrics>;\n\treconcile: ReconcileMetrics;\n\tuptime: number;\n}\n\n/** Options for the performance plugin */\nexport interface PerformancePluginOptions {\n\t/** Callback when a slow constraint is detected (default threshold: 16ms) */\n\tonSlowConstraint?: (id: string, durationMs: number) => void;\n\t/** Callback when a slow resolver is detected (default threshold: 1000ms) */\n\tonSlowResolver?: (id: string, durationMs: number) => void;\n\t/** Threshold in ms for slow constraint warning (default: 16) */\n\tslowConstraintThresholdMs?: number;\n\t/** Threshold in ms for slow resolver warning (default: 1000) */\n\tslowResolverThresholdMs?: number;\n}\n\n/**\n * Create a performance monitoring plugin.\n *\n * Tracks constraint evaluation time, resolver latency, reconciliation cost,\n * and effect runs using existing plugin hooks.\n *\n * @example\n * ```typescript\n * const perf = performancePlugin({\n * onSlowResolver: (id, ms) => console.warn(`Slow resolver ${id}: ${ms}ms`),\n * });\n *\n * const system = createSystem({\n * module: myModule,\n * plugins: [perf],\n * });\n *\n * // Later: get a performance snapshot\n * const snapshot = perf.getSnapshot();\n * console.log(snapshot.resolvers);\n * ```\n */\nexport function performancePlugin<M extends ModuleSchema = ModuleSchema>(\n\toptions: PerformancePluginOptions = {},\n): Plugin<M> & { getSnapshot(): PerformanceSnapshot; reset(): void } {\n\tconst {\n\t\tonSlowConstraint,\n\t\tonSlowResolver,\n\t\tslowConstraintThresholdMs = 16,\n\t\tslowResolverThresholdMs = 1000,\n\t} = options;\n\n\tconst constraints = new Map<string, ConstraintMetrics>();\n\tconst resolvers = new Map<string, ResolverMetrics>();\n\tconst effects = new Map<string, EffectMetrics>();\n\tconst reconcile: ReconcileMetrics = { runs: 0, totalDurationMs: 0, avgDurationMs: 0, maxDurationMs: 0 };\n\n\tlet startedAt = 0;\n\tlet reconcileStartTime = 0;\n\n\t// Track constraint evaluation timing within a reconcile cycle.\n\t// Since constraints are evaluated sequentially, the time between consecutive\n\t// onConstraintEvaluate calls approximates each constraint's evaluation time.\n\t// The first constraint in each cycle cannot be timed (no baseline), so only\n\t// subsequent constraints get duration metrics.\n\tlet lastConstraintEvalEndTime = 0;\n\n\tfunction getConstraintMetrics(id: string): ConstraintMetrics {\n\t\tlet m = constraints.get(id);\n\t\tif (!m) {\n\t\t\tm = { evaluations: 0, totalDurationMs: 0, avgDurationMs: 0, maxDurationMs: 0, lastEvaluatedAt: 0 };\n\t\t\tconstraints.set(id, m);\n\t\t}\n\t\treturn m;\n\t}\n\n\tfunction getResolverMetrics(id: string): ResolverMetrics {\n\t\tlet m = resolvers.get(id);\n\t\tif (!m) {\n\t\t\tm = { starts: 0, completions: 0, errors: 0, retries: 0, cancellations: 0, totalDurationMs: 0, avgDurationMs: 0, maxDurationMs: 0, lastCompletedAt: 0 };\n\t\t\tresolvers.set(id, m);\n\t\t}\n\t\treturn m;\n\t}\n\n\tfunction getEffectMetrics(id: string): EffectMetrics {\n\t\tlet m = effects.get(id);\n\t\tif (!m) {\n\t\t\tm = { runs: 0, errors: 0, lastRunAt: 0 };\n\t\t\teffects.set(id, m);\n\t\t}\n\t\treturn m;\n\t}\n\n\tconst plugin: Plugin<M> & { getSnapshot(): PerformanceSnapshot; reset(): void } = {\n\t\tname: \"performance\",\n\n\t\tonStart() {\n\t\t\tstartedAt = Date.now();\n\t\t},\n\n\t\tonConstraintEvaluate(id, _active) {\n\t\t\tconst now = performance.now();\n\t\t\tconst m = getConstraintMetrics(id);\n\t\t\tm.evaluations++;\n\t\t\tm.lastEvaluatedAt = Date.now();\n\n\t\t\t// Constraints evaluate sequentially within a reconcile cycle.\n\t\t\t// Measure duration as time since the previous constraint finished evaluating\n\t\t\t// (or since reconcileStart for the first constraint in the cycle).\n\t\t\t// The first constraint per cycle has no baseline and is not timed.\n\t\t\tif (lastConstraintEvalEndTime > 0) {\n\t\t\t\tconst duration = now - lastConstraintEvalEndTime;\n\t\t\t\tm.totalDurationMs += duration;\n\t\t\t\tconst timedEvals = m.evaluations; // approximation — some evals may be untimed\n\t\t\t\tm.avgDurationMs = m.totalDurationMs / timedEvals;\n\t\t\t\tif (duration > m.maxDurationMs) m.maxDurationMs = duration;\n\t\t\t\tif (duration > slowConstraintThresholdMs) {\n\t\t\t\t\tonSlowConstraint?.(id, duration);\n\t\t\t\t}\n\t\t\t}\n\t\t\tlastConstraintEvalEndTime = now;\n\t\t},\n\n\t\tonResolverStart(resolver, _req) {\n\t\t\tconst m = getResolverMetrics(resolver);\n\t\t\tm.starts++;\n\t\t},\n\n\t\tonResolverComplete(resolver, _req, duration) {\n\t\t\tconst m = getResolverMetrics(resolver);\n\t\t\tm.completions++;\n\t\t\tm.totalDurationMs += duration;\n\t\t\tm.avgDurationMs = m.totalDurationMs / m.completions;\n\t\t\tif (duration > m.maxDurationMs) m.maxDurationMs = duration;\n\t\t\tm.lastCompletedAt = Date.now();\n\t\t\tif (duration > slowResolverThresholdMs) {\n\t\t\t\tonSlowResolver?.(resolver, duration);\n\t\t\t}\n\t\t},\n\n\t\tonResolverError(resolver, _req, _error) {\n\t\t\tgetResolverMetrics(resolver).errors++;\n\t\t},\n\n\t\tonResolverRetry(resolver, _req, _attempt) {\n\t\t\tgetResolverMetrics(resolver).retries++;\n\t\t},\n\n\t\tonResolverCancel(resolver, _req) {\n\t\t\tgetResolverMetrics(resolver).cancellations++;\n\t\t},\n\n\t\tonEffectRun(id) {\n\t\t\tconst m = getEffectMetrics(id);\n\t\t\tm.runs++;\n\t\t\tm.lastRunAt = Date.now();\n\t\t},\n\n\t\tonEffectError(id, _error) {\n\t\t\tgetEffectMetrics(id).errors++;\n\t\t},\n\n\t\tonReconcileStart() {\n\t\t\treconcileStartTime = performance.now();\n\t\t\t// Reset constraint timing baseline — first constraint in this cycle won't be timed\n\t\t\tlastConstraintEvalEndTime = 0;\n\t\t},\n\n\t\tonReconcileEnd() {\n\t\t\tconst duration = performance.now() - reconcileStartTime;\n\t\t\treconcile.runs++;\n\t\t\treconcile.totalDurationMs += duration;\n\t\t\treconcile.avgDurationMs = reconcile.totalDurationMs / reconcile.runs;\n\t\t\tif (duration > reconcile.maxDurationMs) reconcile.maxDurationMs = duration;\n\t\t},\n\n\t\tgetSnapshot(): PerformanceSnapshot {\n\t\t\tconst constraintsObj: Record<string, ConstraintMetrics> = {};\n\t\t\tfor (const [id, m] of constraints) constraintsObj[id] = { ...m };\n\n\t\t\tconst resolversObj: Record<string, ResolverMetrics> = {};\n\t\t\tfor (const [id, m] of resolvers) resolversObj[id] = { ...m };\n\n\t\t\tconst effectsObj: Record<string, EffectMetrics> = {};\n\t\t\tfor (const [id, m] of effects) effectsObj[id] = { ...m };\n\n\t\t\treturn {\n\t\t\t\tconstraints: constraintsObj,\n\t\t\t\tresolvers: resolversObj,\n\t\t\t\teffects: effectsObj,\n\t\t\t\treconcile: { ...reconcile },\n\t\t\t\tuptime: startedAt ? Date.now() - startedAt : 0,\n\t\t\t};\n\t\t},\n\n\t\treset(): void {\n\t\t\tconstraints.clear();\n\t\t\tresolvers.clear();\n\t\t\teffects.clear();\n\t\t\treconcile.runs = 0;\n\t\t\treconcile.totalDurationMs = 0;\n\t\t\treconcile.avgDurationMs = 0;\n\t\t\treconcile.maxDurationMs = 0;\n\t\t\tlastConstraintEvalEndTime = 0;\n\t\t},\n\t};\n\n\treturn plugin;\n}\n","/**\n * Observability Dashboard Plugin\n *\n * Provides comprehensive monitoring, metrics collection, and dashboard integration\n * for AI agent operations.\n *\n * @example\n * ```typescript\n * import { createObservability, createAgentMetrics } from '@directive-run/ai';\n *\n * const observability = createObservability({\n * metrics: {\n * enabled: true,\n * exportInterval: 10000, // Export every 10 seconds\n * },\n * tracing: {\n * enabled: true,\n * sampleRate: 1.0, // 100% sampling for dev\n * },\n * alerts: [\n * { metric: 'agent.errors', threshold: 10, action: 'warn' },\n * { metric: 'agent.latency', threshold: 5000, action: 'alert' },\n * ],\n * });\n *\n * // Use createAgentMetrics for standard metric names (required for getDashboard() summary)\n * const agentMetrics = createAgentMetrics(observability);\n *\n * // Access dashboard data\n * const dashboard = observability.getDashboard();\n *\n * // Clean up when done\n * await observability.dispose();\n * ```\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Metric types that can be collected */\nexport type MetricType =\n\t| \"counter\"\n\t| \"gauge\"\n\t| \"histogram\"\n\t| \"summary\";\n\n/** A single metric data point */\nexport interface MetricDataPoint {\n\tname: string;\n\ttype: MetricType;\n\tvalue: number;\n\tlabels: Record<string, string>;\n\ttimestamp: number;\n}\n\n/** Histogram bucket for latency/size distributions */\nexport interface HistogramBucket {\n\tle: number; // less than or equal\n\tcount: number;\n}\n\n/** Aggregated metric for dashboard display */\nexport interface AggregatedMetric {\n\tname: string;\n\ttype: MetricType;\n\tcount: number;\n\tsum: number;\n\tmin: number;\n\tmax: number;\n\tavg: number;\n\tp50?: number;\n\tp90?: number;\n\tp99?: number;\n\tlastValue: number;\n\tlastUpdated: number;\n}\n\n/** Trace span for distributed tracing */\nexport interface TraceSpan {\n\ttraceId: string;\n\tspanId: string;\n\tparentSpanId?: string;\n\toperationName: string;\n\tserviceName: string;\n\tstartTime: number;\n\tendTime?: number;\n\tduration?: number;\n\tstatus: \"ok\" | \"error\" | \"timeout\";\n\ttags: Record<string, string | number | boolean>;\n\tlogs: Array<{\n\t\ttimestamp: number;\n\t\tmessage: string;\n\t\tlevel: \"debug\" | \"info\" | \"warn\" | \"error\";\n\t}>;\n}\n\n/** Alert configuration */\nexport interface AlertConfig {\n\tmetric: string;\n\tthreshold: number;\n\toperator?: \">\" | \"<\" | \">=\" | \"<=\" | \"==\";\n\taction: \"log\" | \"warn\" | \"alert\" | \"callback\";\n\tcallback?: (metric: AggregatedMetric, threshold: number) => void;\n\tcooldownMs?: number;\n}\n\n/** Alert event when threshold is crossed */\nexport interface AlertEvent {\n\talertId: string;\n\tmetric: string;\n\tcurrentValue: number;\n\tthreshold: number;\n\toperator: string;\n\taction: string;\n\ttimestamp: number;\n\tmessage: string;\n}\n\n/** Observability configuration */\nexport interface ObservabilityConfig {\n\t/** Service name for tracing */\n\tserviceName?: string;\n\t/** Metrics configuration */\n\tmetrics?: {\n\t\tenabled?: boolean;\n\t\t/** Export interval in milliseconds */\n\t\texportInterval?: number;\n\t\t/** Custom exporter function */\n\t\texporter?: (metrics: AggregatedMetric[]) => Promise<void>;\n\t\t/** Maximum data points to retain per metric */\n\t\tmaxDataPoints?: number;\n\t};\n\t/** Tracing configuration */\n\ttracing?: {\n\t\tenabled?: boolean;\n\t\t/** Sample rate (0.0 to 1.0) */\n\t\tsampleRate?: number;\n\t\t/** Maximum spans to retain */\n\t\tmaxSpans?: number;\n\t\t/** Custom trace exporter */\n\t\texporter?: (spans: TraceSpan[]) => Promise<void>;\n\t};\n\t/** Alert configurations */\n\talerts?: AlertConfig[];\n\t/**\n\t * Metric names used by `getDashboard().summary` and `getHealthStatus()`.\n\t * Defaults to `agent.requests`, `agent.errors`, `agent.latency`, `agent.tokens`, `agent.cost`.\n\t * Must match the metric names you record via `incrementCounter` / `observeHistogram`,\n\t * or use `createAgentMetrics()` which records with these default names.\n\t */\n\tsummaryMetrics?: {\n\t\trequests?: string;\n\t\terrors?: string;\n\t\tlatency?: string;\n\t\ttokens?: string;\n\t\tcost?: string;\n\t};\n\t/** Event callbacks */\n\tevents?: {\n\t\tonMetricRecorded?: (metric: MetricDataPoint) => void;\n\t\tonSpanStart?: (span: TraceSpan) => void;\n\t\tonSpanEnd?: (span: TraceSpan) => void;\n\t\tonAlert?: (alert: AlertEvent) => void;\n\t};\n}\n\n/** Dashboard data for UI display */\nexport interface DashboardData {\n\t/** Service info */\n\tservice: {\n\t\tname: string;\n\t\tuptime: number;\n\t\tstartTime: number;\n\t};\n\t/** Aggregated metrics */\n\tmetrics: Record<string, AggregatedMetric>;\n\t/** Recent traces */\n\ttraces: TraceSpan[];\n\t/** Active alerts */\n\talerts: AlertEvent[];\n\t/** Summary stats */\n\tsummary: {\n\t\ttotalRequests: number;\n\t\ttotalErrors: number;\n\t\terrorRate: number;\n\t\tavgLatency: number;\n\t\tp99Latency: number;\n\t\tactiveSpans: number;\n\t\ttotalTokens: number;\n\t\ttotalCost: number;\n\t};\n}\n\n/** Observability instance */\nexport interface ObservabilityInstance {\n\t/** Record a counter metric */\n\tincrementCounter(name: string, labels?: Record<string, string>, value?: number): void;\n\t/** Record a gauge metric */\n\tsetGauge(name: string, value: number, labels?: Record<string, string>): void;\n\t/** Record a histogram observation */\n\tobserveHistogram(name: string, value: number, labels?: Record<string, string>): void;\n\t/** Start a trace span */\n\tstartSpan(operationName: string, parentSpanId?: string): TraceSpan;\n\t/** End a trace span */\n\tendSpan(spanId: string, status?: \"ok\" | \"error\" | \"timeout\"): void;\n\t/** Add log to a span */\n\taddSpanLog(spanId: string, message: string, level?: \"debug\" | \"info\" | \"warn\" | \"error\"): void;\n\t/** Add tag to a span */\n\taddSpanTag(spanId: string, key: string, value: string | number | boolean): void;\n\t/** Get dashboard data */\n\tgetDashboard(): DashboardData;\n\t/** Get a specific metric */\n\tgetMetric(name: string): AggregatedMetric | undefined;\n\t/** Get recent traces */\n\tgetTraces(limit?: number): TraceSpan[];\n\t/** Get active alerts */\n\tgetAlerts(): AlertEvent[];\n\t/** Export all data */\n\texport(): { metrics: AggregatedMetric[]; traces: TraceSpan[]; alerts: AlertEvent[] };\n\t/** Clear all data and reset statistics */\n\tclear(): void;\n\t/** Dispose of the instance, clearing timers and flushing data */\n\tdispose(): Promise<void>;\n\t/** Get health status for status pages */\n\tgetHealthStatus(): {\n\t\thealthy: boolean;\n\t\tuptime: number;\n\t\terrorRate: number;\n\t\tactiveAlerts: number;\n\t};\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\nfunction generateId(): string {\n\treturn globalThis.crypto?.randomUUID?.() ?? `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 11)}`;\n}\n\nfunction calculatePercentile(values: number[], percentile: number): number {\n\tif (values.length === 0) return 0;\n\tconst sorted = [...values].sort((a, b) => a - b);\n\tconst index = Math.ceil((percentile / 100) * sorted.length) - 1;\n\treturn sorted[Math.max(0, index)] ?? 0;\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\n/**\n * Create an observability instance for monitoring AI agents.\n *\n * @example\n * ```typescript\n * const obs = createObservability({\n * serviceName: 'my-agent-service',\n * metrics: { enabled: true },\n * tracing: { enabled: true, sampleRate: 0.1 },\n * alerts: [\n * { metric: 'agent.errors', threshold: 10, action: 'alert' },\n * ],\n * });\n *\n * // Track agent operations\n * const span = obs.startSpan('agent.run');\n * obs.incrementCounter('agent.requests', { agent: 'support' });\n *\n * try {\n * await runAgent();\n * obs.observeHistogram('agent.latency', Date.now() - start);\n * obs.endSpan(span.spanId, 'ok');\n * } catch (e) {\n * obs.incrementCounter('agent.errors');\n * obs.endSpan(span.spanId, 'error');\n * }\n * ```\n */\nexport function createObservability(config: ObservabilityConfig = {}): ObservabilityInstance {\n\tconst {\n\t\tserviceName = \"directive-agents\",\n\t\tmetrics: metricsConfig = {},\n\t\ttracing: tracingConfig = {},\n\t\talerts: alertConfigs = [],\n\t\tsummaryMetrics: summaryMetricsConfig = {},\n\t\tevents = {},\n\t} = config;\n\n\tconst summaryMetricNames = {\n\t\trequests: summaryMetricsConfig.requests ?? \"agent.requests\",\n\t\terrors: summaryMetricsConfig.errors ?? \"agent.errors\",\n\t\tlatency: summaryMetricsConfig.latency ?? \"agent.latency\",\n\t\ttokens: summaryMetricsConfig.tokens ?? \"agent.tokens\",\n\t\tcost: summaryMetricsConfig.cost ?? \"agent.cost\",\n\t};\n\n\tconst {\n\t\tenabled: metricsEnabled = true,\n\t\texportInterval,\n\t\texporter: metricsExporter,\n\t\tmaxDataPoints = 1000,\n\t} = metricsConfig;\n\n\tconst {\n\t\tenabled: tracingEnabled = true,\n\t\tsampleRate = 1.0,\n\t\tmaxSpans = 1000,\n\t\texporter: tracingExporter,\n\t} = tracingConfig;\n\n\t// State\n\tconst startTime = Date.now();\n\tconst metricDataPoints = new Map<string, MetricDataPoint[]>();\n\tconst activeSpans = new Map<string, TraceSpan>();\n\tconst completedSpans: TraceSpan[] = [];\n\tconst alertEvents: AlertEvent[] = [];\n\tconst alertCooldowns = new Map<string, number>();\n\n\t// Aggregated metrics cache\n\tconst aggregatedMetrics = new Map<string, AggregatedMetric>();\n\n\t// Export timer\n\tlet exportTimer: ReturnType<typeof setInterval> | undefined;\n\tif (exportInterval && (metricsExporter || tracingExporter)) {\n\t\texportTimer = setInterval(async () => {\n\t\t\ttry {\n\t\t\t\tif (metricsExporter && metricsEnabled) {\n\t\t\t\t\tawait metricsExporter(Array.from(aggregatedMetrics.values()));\n\t\t\t\t}\n\t\t\t\tif (tracingExporter && tracingEnabled) {\n\t\t\t\t\tconst spansToExport = completedSpans.splice(0, 100);\n\t\t\t\t\tif (spansToExport.length > 0) {\n\t\t\t\t\t\tawait tracingExporter(spansToExport);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(\"[Directive Observability] Export error:\", error);\n\t\t\t}\n\t\t}, exportInterval);\n\t}\n\n\tfunction recordMetric(dataPoint: MetricDataPoint): void {\n\t\tif (!metricsEnabled) return;\n\n\t\tconst key = `${dataPoint.name}:${JSON.stringify(Object.fromEntries(Object.entries(dataPoint.labels).sort()))}`;\n\t\tlet points = metricDataPoints.get(key);\n\t\tif (!points) {\n\t\t\tpoints = [];\n\t\t\tmetricDataPoints.set(key, points);\n\t\t}\n\n\t\tpoints.push(dataPoint);\n\n\t\t// Trim old data points\n\t\tif (points.length > maxDataPoints) {\n\t\t\tpoints.shift();\n\t\t}\n\n\t\t// Update aggregation\n\t\tupdateAggregation(dataPoint.name, points);\n\n\t\tevents.onMetricRecorded?.(dataPoint);\n\n\t\t// Check alerts\n\t\tcheckAlerts(dataPoint.name);\n\t}\n\n\tfunction updateAggregation(name: string, points: MetricDataPoint[]): void {\n\t\tif (points.length === 0) return;\n\n\t\tconst values = points.map((p) => p.value);\n\t\tconst sum = values.reduce((a, b) => a + b, 0);\n\n\t\t// We've already checked points.length === 0 above, so these are safe\n\t\tconst firstPoint = points[0]!;\n\t\tconst lastValue = values[values.length - 1]!;\n\n\t\tconst aggregated: AggregatedMetric = {\n\t\t\tname,\n\t\t\ttype: firstPoint.type,\n\t\t\tcount: points.length,\n\t\t\tsum,\n\t\t\tmin: Math.min(...values),\n\t\t\tmax: Math.max(...values),\n\t\t\tavg: sum / points.length,\n\t\t\tlastValue,\n\t\t\tlastUpdated: Date.now(),\n\t\t};\n\n\t\taggregatedMetrics.set(name, aggregated);\n\t}\n\n\tfunction checkAlerts(metricName: string): void {\n\t\tfor (const alertConfig of alertConfigs) {\n\t\t\tif (alertConfig.metric !== metricName) continue;\n\n\t\t\tconst metric = aggregatedMetrics.get(metricName);\n\t\t\tif (!metric) continue;\n\n\t\t\tconst cooldownKey = `${alertConfig.metric}:${alertConfig.threshold}`;\n\t\t\tconst lastAlert = alertCooldowns.get(cooldownKey);\n\t\t\tconst cooldown = alertConfig.cooldownMs ?? 60000;\n\n\t\t\tif (lastAlert && Date.now() - lastAlert < cooldown) continue;\n\n\t\t\tconst operator = alertConfig.operator ?? \">\";\n\t\t\tconst value = metric.lastValue;\n\t\t\tconst threshold = alertConfig.threshold;\n\n\t\t\tlet triggered = false;\n\t\t\tswitch (operator) {\n\t\t\t\tcase \">\":\n\t\t\t\t\ttriggered = value > threshold;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"<\":\n\t\t\t\t\ttriggered = value < threshold;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \">=\":\n\t\t\t\t\ttriggered = value >= threshold;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"<=\":\n\t\t\t\t\ttriggered = value <= threshold;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"==\":\n\t\t\t\t\ttriggered = value === threshold;\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (triggered) {\n\t\t\t\tconst alertEvent: AlertEvent = {\n\t\t\t\t\talertId: generateId(),\n\t\t\t\t\tmetric: metricName,\n\t\t\t\t\tcurrentValue: value,\n\t\t\t\t\tthreshold,\n\t\t\t\t\toperator,\n\t\t\t\t\taction: alertConfig.action,\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\tmessage: `Alert: ${metricName} ${operator} ${threshold} (current: ${value})`,\n\t\t\t\t};\n\n\t\t\t\talertEvents.push(alertEvent);\n\t\t\t\tif (alertEvents.length > 1000) alertEvents.splice(0, alertEvents.length - 1000);\n\t\t\t\talertCooldowns.set(cooldownKey, Date.now());\n\n\t\t\t\tevents.onAlert?.(alertEvent);\n\n\t\t\t\tswitch (alertConfig.action) {\n\t\t\t\t\tcase \"log\":\n\t\t\t\t\t\tconsole.log(`[Observability] ${alertEvent.message}`);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"warn\":\n\t\t\t\t\t\tconsole.warn(`[Observability] ${alertEvent.message}`);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"alert\":\n\t\t\t\t\t\tconsole.error(`[Observability ALERT] ${alertEvent.message}`);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"callback\":\n\t\t\t\t\t\talertConfig.callback?.(metric, threshold);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction getPercentiles(name: string): { p50?: number; p90?: number; p99?: number } {\n\t\t// Collect all data points for this metric name across all label combinations\n\t\tconst allValues: number[] = [];\n\t\tfor (const [key, points] of metricDataPoints) {\n\t\t\tif (key.startsWith(`${name}:`)) {\n\t\t\t\tfor (const p of points) {\n\t\t\t\t\tallValues.push(p.value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (allValues.length === 0) return {};\n\t\treturn {\n\t\t\tp50: calculatePercentile(allValues, 50),\n\t\t\tp90: calculatePercentile(allValues, 90),\n\t\t\tp99: calculatePercentile(allValues, 99),\n\t\t};\n\t}\n\n\treturn {\n\t\tincrementCounter(name: string, labels: Record<string, string> = {}, value = 1): void {\n\t\t\trecordMetric({\n\t\t\t\tname,\n\t\t\t\ttype: \"counter\",\n\t\t\t\tvalue,\n\t\t\t\tlabels,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t});\n\t\t},\n\n\t\tsetGauge(name: string, value: number, labels: Record<string, string> = {}): void {\n\t\t\trecordMetric({\n\t\t\t\tname,\n\t\t\t\ttype: \"gauge\",\n\t\t\t\tvalue,\n\t\t\t\tlabels,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t});\n\t\t},\n\n\t\tobserveHistogram(name: string, value: number, labels: Record<string, string> = {}): void {\n\t\t\trecordMetric({\n\t\t\t\tname,\n\t\t\t\ttype: \"histogram\",\n\t\t\t\tvalue,\n\t\t\t\tlabels,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t});\n\t\t},\n\n\t\tstartSpan(operationName: string, parentSpanId?: string): TraceSpan {\n\t\t\t// Apply sampling\n\t\t\tif (Math.random() > sampleRate) {\n\t\t\t\t// Return a no-op span that won't be tracked\n\t\t\t\treturn {\n\t\t\t\t\ttraceId: \"sampled-out\",\n\t\t\t\t\tspanId: \"sampled-out\",\n\t\t\t\t\toperationName,\n\t\t\t\t\tserviceName,\n\t\t\t\t\tstartTime: Date.now(),\n\t\t\t\t\tstatus: \"ok\",\n\t\t\t\t\ttags: {},\n\t\t\t\t\tlogs: [],\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst span: TraceSpan = {\n\t\t\t\ttraceId: parentSpanId\n\t\t\t\t\t? activeSpans.get(parentSpanId)?.traceId ?? generateId()\n\t\t\t\t\t: generateId(),\n\t\t\t\tspanId: generateId(),\n\t\t\t\tparentSpanId,\n\t\t\t\toperationName,\n\t\t\t\tserviceName,\n\t\t\t\tstartTime: Date.now(),\n\t\t\t\tstatus: \"ok\",\n\t\t\t\ttags: {},\n\t\t\t\tlogs: [],\n\t\t\t};\n\n\t\t\tif (tracingEnabled) {\n\t\t\t\tactiveSpans.set(span.spanId, span);\n\t\t\t\tevents.onSpanStart?.(span);\n\t\t\t}\n\n\t\t\treturn span;\n\t\t},\n\n\t\tendSpan(spanId: string, status: \"ok\" | \"error\" | \"timeout\" = \"ok\"): void {\n\t\t\tif (spanId === \"sampled-out\") return;\n\n\t\t\tconst span = activeSpans.get(spanId);\n\t\t\tif (!span) return;\n\n\t\t\tspan.endTime = Date.now();\n\t\t\tspan.duration = span.endTime - span.startTime;\n\t\t\tspan.status = status;\n\n\t\t\tactiveSpans.delete(spanId);\n\t\t\tcompletedSpans.push(span);\n\n\t\t\t// Trim old spans\n\t\t\twhile (completedSpans.length > maxSpans) {\n\t\t\t\tcompletedSpans.shift();\n\t\t\t}\n\n\t\t\t// Record latency metric (use recordMetric directly to avoid `this` binding issues)\n\t\t\trecordMetric({\n\t\t\t\tname: `${span.operationName}.latency`,\n\t\t\t\ttype: \"histogram\",\n\t\t\t\tvalue: span.duration,\n\t\t\t\tlabels: {},\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t});\n\n\t\t\tif (status === \"error\") {\n\t\t\t\trecordMetric({\n\t\t\t\t\tname: `${span.operationName}.errors`,\n\t\t\t\t\ttype: \"counter\",\n\t\t\t\t\tvalue: 1,\n\t\t\t\t\tlabels: {},\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tevents.onSpanEnd?.(span);\n\t\t},\n\n\t\taddSpanLog(spanId: string, message: string, level: \"debug\" | \"info\" | \"warn\" | \"error\" = \"info\"): void {\n\t\t\tif (spanId === \"sampled-out\") return;\n\n\t\t\tconst span = activeSpans.get(spanId);\n\t\t\tif (!span) return;\n\n\t\t\tspan.logs.push({\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\tmessage,\n\t\t\t\tlevel,\n\t\t\t});\n\t\t},\n\n\t\taddSpanTag(spanId: string, key: string, value: string | number | boolean): void {\n\t\t\tif (spanId === \"sampled-out\") return;\n\n\t\t\tconst span = activeSpans.get(spanId);\n\t\t\tif (!span) return;\n\n\t\t\tspan.tags[key] = value;\n\t\t},\n\n\t\tgetDashboard(): DashboardData {\n\t\t\t// Calculate summary stats using configurable metric names\n\t\t\tconst requestsMetric = aggregatedMetrics.get(summaryMetricNames.requests);\n\t\t\tconst errorsMetric = aggregatedMetrics.get(summaryMetricNames.errors);\n\t\t\tconst latencyMetric = aggregatedMetrics.get(summaryMetricNames.latency);\n\t\t\tconst tokensMetric = aggregatedMetrics.get(summaryMetricNames.tokens);\n\t\t\tconst costMetric = aggregatedMetrics.get(summaryMetricNames.cost);\n\n\t\t\tconst totalRequests = requestsMetric?.sum ?? 0;\n\t\t\tconst totalErrors = errorsMetric?.sum ?? 0;\n\t\t\tconst errorRate = totalRequests > 0 ? totalErrors / totalRequests : 0;\n\n\t\t\t// Calculate percentiles on demand for latency\n\t\t\tconst latencyPercentiles = latencyMetric ? getPercentiles(summaryMetricNames.latency) : {};\n\n\t\t\treturn {\n\t\t\t\tservice: {\n\t\t\t\t\tname: serviceName,\n\t\t\t\t\tuptime: Date.now() - startTime,\n\t\t\t\t\tstartTime,\n\t\t\t\t},\n\t\t\t\tmetrics: Object.fromEntries(aggregatedMetrics),\n\t\t\t\ttraces: [...completedSpans].slice(-100),\n\t\t\t\talerts: [...alertEvents].slice(-50),\n\t\t\t\tsummary: {\n\t\t\t\t\ttotalRequests,\n\t\t\t\t\ttotalErrors,\n\t\t\t\t\terrorRate,\n\t\t\t\t\tavgLatency: latencyMetric?.avg ?? 0,\n\t\t\t\t\tp99Latency: latencyPercentiles.p99 ?? 0,\n\t\t\t\t\tactiveSpans: activeSpans.size,\n\t\t\t\t\ttotalTokens: tokensMetric?.sum ?? 0,\n\t\t\t\t\ttotalCost: costMetric?.sum ?? 0,\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\n\t\tgetMetric(name: string): AggregatedMetric | undefined {\n\t\t\tconst metric = aggregatedMetrics.get(name);\n\t\t\tif (!metric) return undefined;\n\t\t\t// Calculate percentiles on demand\n\t\t\tconst percentiles = getPercentiles(name);\n\t\t\treturn { ...metric, ...percentiles };\n\t\t},\n\n\t\tgetTraces(limit = 100): TraceSpan[] {\n\t\t\treturn [...completedSpans].slice(-limit);\n\t\t},\n\n\t\tgetAlerts(): AlertEvent[] {\n\t\t\treturn [...alertEvents];\n\t\t},\n\n\t\texport() {\n\t\t\treturn {\n\t\t\t\tmetrics: Array.from(aggregatedMetrics.values()),\n\t\t\t\ttraces: [...completedSpans],\n\t\t\t\talerts: [...alertEvents],\n\t\t\t};\n\t\t},\n\n\t\tclear() {\n\t\t\tmetricDataPoints.clear();\n\t\t\taggregatedMetrics.clear();\n\t\t\tactiveSpans.clear();\n\t\t\tcompletedSpans.length = 0;\n\t\t\talertEvents.length = 0;\n\t\t\talertCooldowns.clear();\n\t\t},\n\n\t\tasync dispose() {\n\t\t\t// Clear the export timer\n\t\t\tif (exportTimer) {\n\t\t\t\tclearInterval(exportTimer);\n\t\t\t\texportTimer = undefined;\n\t\t\t}\n\n\t\t\t// Flush any remaining data to exporters\n\t\t\ttry {\n\t\t\t\tif (metricsExporter && metricsEnabled && aggregatedMetrics.size > 0) {\n\t\t\t\t\tawait metricsExporter(Array.from(aggregatedMetrics.values()));\n\t\t\t\t}\n\t\t\t\tif (tracingExporter && tracingEnabled && completedSpans.length > 0) {\n\t\t\t\t\tawait tracingExporter([...completedSpans]);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(\"[Directive Observability] Error flushing data during dispose:\", error);\n\t\t\t}\n\n\t\t\t// Clear all data\n\t\t\tmetricDataPoints.clear();\n\t\t\taggregatedMetrics.clear();\n\t\t\tactiveSpans.clear();\n\t\t\tcompletedSpans.length = 0;\n\t\t\talertEvents.length = 0;\n\t\t\talertCooldowns.clear();\n\t\t},\n\n\t\tgetHealthStatus() {\n\t\t\tconst requestsMetric = aggregatedMetrics.get(summaryMetricNames.requests);\n\t\t\tconst errorsMetric = aggregatedMetrics.get(summaryMetricNames.errors);\n\n\t\t\tconst totalRequests = requestsMetric?.sum ?? 0;\n\t\t\tconst totalErrors = errorsMetric?.sum ?? 0;\n\t\t\tconst errorRate = totalRequests > 0 ? totalErrors / totalRequests : 0;\n\n\t\t\t// Consider unhealthy if error rate > 10% or there are active alerts\n\t\t\tconst activeAlertCount = alertEvents.filter(\n\t\t\t\t(a) => Date.now() - a.timestamp < 300000 // Last 5 minutes\n\t\t\t).length;\n\n\t\t\treturn {\n\t\t\t\thealthy: errorRate < 0.1 && activeAlertCount === 0,\n\t\t\t\tuptime: Date.now() - startTime,\n\t\t\t\terrorRate,\n\t\t\t\tactiveAlerts: activeAlertCount,\n\t\t\t};\n\t\t},\n\t};\n}\n\n// ============================================================================\n// Pre-built Metric Helpers\n// ============================================================================\n\n/**\n * Create standard agent metrics for an observability instance.\n *\n * @example\n * ```typescript\n * const obs = createObservability({ serviceName: 'my-service' });\n * const agentMetrics = createAgentMetrics(obs);\n *\n * // Track an agent run\n * agentMetrics.trackRun('support-agent', {\n * success: true,\n * latencyMs: 1500,\n * inputTokens: 100,\n * outputTokens: 500,\n * cost: 0.05,\n * });\n * ```\n */\nexport function createAgentMetrics(obs: ObservabilityInstance) {\n\treturn {\n\t\ttrackRun(\n\t\t\tagentName: string,\n\t\t\tresult: {\n\t\t\t\tsuccess: boolean;\n\t\t\t\tlatencyMs: number;\n\t\t\t\tinputTokens?: number;\n\t\t\t\toutputTokens?: number;\n\t\t\t\tcost?: number;\n\t\t\t\ttoolCalls?: number;\n\t\t\t}\n\t\t): void {\n\t\t\tconst labels = { agent: agentName };\n\n\t\t\tobs.incrementCounter(\"agent.requests\", labels);\n\n\t\t\tif (!result.success) {\n\t\t\t\tobs.incrementCounter(\"agent.errors\", labels);\n\t\t\t}\n\n\t\t\tobs.observeHistogram(\"agent.latency\", result.latencyMs, labels);\n\n\t\t\tif (result.inputTokens !== undefined) {\n\t\t\t\tobs.incrementCounter(\"agent.tokens.input\", labels, result.inputTokens);\n\t\t\t\tobs.incrementCounter(\"agent.tokens\", labels, result.inputTokens);\n\t\t\t}\n\n\t\t\tif (result.outputTokens !== undefined) {\n\t\t\t\tobs.incrementCounter(\"agent.tokens.output\", labels, result.outputTokens);\n\t\t\t\tobs.incrementCounter(\"agent.tokens\", labels, result.outputTokens);\n\t\t\t}\n\n\t\t\tif (result.cost !== undefined) {\n\t\t\t\tobs.incrementCounter(\"agent.cost\", labels, result.cost);\n\t\t\t}\n\n\t\t\tif (result.toolCalls !== undefined) {\n\t\t\t\tobs.incrementCounter(\"agent.tool_calls\", labels, result.toolCalls);\n\t\t\t}\n\t\t},\n\n\t\ttrackGuardrail(\n\t\t\tguardrailName: string,\n\t\t\tresult: {\n\t\t\t\tpassed: boolean;\n\t\t\t\tlatencyMs: number;\n\t\t\t\tblocked?: boolean;\n\t\t\t}\n\t\t): void {\n\t\t\tconst labels = { guardrail: guardrailName };\n\n\t\t\tobs.incrementCounter(\"guardrail.checks\", labels);\n\n\t\t\tif (!result.passed) {\n\t\t\t\tobs.incrementCounter(\"guardrail.failures\", labels);\n\t\t\t}\n\n\t\t\tif (result.blocked) {\n\t\t\t\tobs.incrementCounter(\"guardrail.blocks\", labels);\n\t\t\t}\n\n\t\t\tobs.observeHistogram(\"guardrail.latency\", result.latencyMs, labels);\n\t\t},\n\n\t\ttrackApproval(\n\t\t\ttoolName: string,\n\t\t\tresult: {\n\t\t\t\tapproved: boolean;\n\t\t\t\twaitTimeMs: number;\n\t\t\t\ttimedOut?: boolean;\n\t\t\t}\n\t\t): void {\n\t\t\tconst labels = { tool: toolName };\n\n\t\t\tobs.incrementCounter(\"approval.requests\", labels);\n\n\t\t\tif (result.approved) {\n\t\t\t\tobs.incrementCounter(\"approval.approved\", labels);\n\t\t\t} else {\n\t\t\t\tobs.incrementCounter(\"approval.rejected\", labels);\n\t\t\t}\n\n\t\t\tif (result.timedOut) {\n\t\t\t\tobs.incrementCounter(\"approval.timeouts\", labels);\n\t\t\t}\n\n\t\t\tobs.observeHistogram(\"approval.wait_time\", result.waitTimeMs, labels);\n\t\t},\n\n\t\ttrackHandoff(\n\t\t\tfromAgent: string,\n\t\t\ttoAgent: string,\n\t\t\tlatencyMs: number\n\t\t): void {\n\t\t\tobs.incrementCounter(\"handoff.count\", { from: fromAgent, to: toAgent });\n\t\t\tobs.observeHistogram(\"handoff.latency\", latencyMs);\n\t\t},\n\t};\n}\n","/**\n * OTLP (OpenTelemetry Protocol) Exporter\n *\n * Converts Directive observability data to OTLP JSON format for export to\n * Grafana, Datadog, Jaeger, and other OpenTelemetry-compatible backends.\n *\n * @example\n * ```typescript\n * import { createObservability } from '@directive-run/ai';\n * import { createOTLPExporter } from '@directive-run/ai';\n *\n * const exporter = createOTLPExporter({\n * endpoint: 'http://localhost:4318',\n * headers: { 'Authorization': 'Bearer token' },\n * serviceName: 'my-agent-service',\n * });\n *\n * const obs = createObservability({\n * metrics: { exporter: exporter.exportMetrics, exportInterval: 10000 },\n * tracing: { exporter: exporter.exportTraces },\n * });\n * ```\n */\n\nimport type { AggregatedMetric, TraceSpan } from \"./observability.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** OTLP exporter configuration */\nexport interface OTLPExporterConfig {\n\t/** OTLP endpoint base URL (e.g., http://localhost:4318) */\n\tendpoint: string;\n\t/** Optional headers (e.g., auth tokens) */\n\theaders?: Record<string, string>;\n\t/** Service name for resource identification */\n\tserviceName?: string;\n\t/** Service version */\n\tserviceVersion?: string;\n\t/** Custom resource attributes */\n\tresourceAttributes?: Record<string, string>;\n\t/** Instrumentation scope version (default: \"0.1.0\") */\n\tscopeVersion?: string;\n\t/** Request timeout in ms (default: 10000) */\n\ttimeoutMs?: number;\n\t/** Custom fetch function (for testing or custom HTTP clients) */\n\tfetch?: typeof globalThis.fetch;\n\t/** Callback on export error */\n\tonError?: (error: Error, type: \"metrics\" | \"traces\") => void;\n}\n\n/** OTLP exporter instance */\nexport interface OTLPExporter {\n\t/** Export metrics in OTLP format (compatible with ObservabilityConfig.metrics.exporter) */\n\texportMetrics: (metrics: AggregatedMetric[]) => Promise<void>;\n\t/** Export traces in OTLP format (compatible with ObservabilityConfig.tracing.exporter) */\n\texportTraces: (traces: TraceSpan[]) => Promise<void>;\n}\n\n// ============================================================================\n// OTLP JSON Conversion\n// ============================================================================\n\ninterface OTLPResource {\n\tattributes: Array<{ key: string; value: { stringValue: string } }>;\n}\n\nfunction buildResource(config: OTLPExporterConfig): OTLPResource {\n\tconst attrs: Array<{ key: string; value: { stringValue: string } }> = [\n\t\t{ key: \"service.name\", value: { stringValue: config.serviceName ?? \"directive-agents\" } },\n\t];\n\n\tif (config.serviceVersion) {\n\t\tattrs.push({ key: \"service.version\", value: { stringValue: config.serviceVersion } });\n\t}\n\n\tif (config.resourceAttributes) {\n\t\tfor (const [key, val] of Object.entries(config.resourceAttributes)) {\n\t\t\tattrs.push({ key, value: { stringValue: val } });\n\t\t}\n\t}\n\n\treturn { attributes: attrs };\n}\n\nfunction toNanos(timestampMs: number): string {\n\treturn `${BigInt(timestampMs) * BigInt(1_000_000)}`;\n}\n\nfunction metricTypeToOTLP(type: string): string {\n\tswitch (type) {\n\t\tcase \"counter\":\n\t\t\treturn \"sum\";\n\t\tcase \"gauge\":\n\t\t\treturn \"gauge\";\n\t\tcase \"histogram\":\n\t\t\treturn \"histogram\";\n\t\tdefault:\n\t\t\treturn \"gauge\";\n\t}\n}\n\nfunction convertMetrics(\n\tmetrics: AggregatedMetric[],\n\tresource: OTLPResource,\n\tscopeVersion: string,\n): Record<string, unknown> {\n\tconst scopeMetrics = metrics.map((metric) => {\n\t\t// Known limitation: startTimeUnixNano is approximated as lastUpdated minus 60s.\n\t\t// A more accurate value would require tracking the actual collection start time\n\t\t// per metric, which is not available in the current AggregatedMetric type.\n\t\tconst startTimeMs = metric.lastUpdated - 60000;\n\n\t\tconst dataPoints = [\n\t\t\t{\n\t\t\t\tasInt: metric.type === \"counter\" ? metric.sum : undefined,\n\t\t\t\tasDouble: metric.type !== \"counter\" ? metric.lastValue : undefined,\n\t\t\t\ttimeUnixNano: toNanos(metric.lastUpdated),\n\t\t\t\tstartTimeUnixNano: toNanos(startTimeMs),\n\t\t\t\tattributes: [],\n\t\t\t},\n\t\t];\n\n\t\tconst otlpType = metricTypeToOTLP(metric.type);\n\t\tconst metricData: Record<string, unknown> = {\n\t\t\tname: metric.name,\n\t\t\tunit: \"\",\n\t\t};\n\n\t\tif (otlpType === \"sum\") {\n\t\t\tmetricData.sum = {\n\t\t\t\tdataPoints,\n\t\t\t\taggregationTemporality: 2, // CUMULATIVE\n\t\t\t\tisMonotonic: true,\n\t\t\t};\n\t\t} else if (otlpType === \"histogram\") {\n\t\t\tmetricData.histogram = {\n\t\t\t\tdataPoints: [\n\t\t\t\t\t{\n\t\t\t\t\t\tcount: metric.count,\n\t\t\t\t\t\tsum: metric.sum,\n\t\t\t\t\t\tmin: metric.min,\n\t\t\t\t\t\tmax: metric.max,\n\t\t\t\t\t\ttimeUnixNano: toNanos(metric.lastUpdated),\n\t\t\t\t\t\tstartTimeUnixNano: toNanos(startTimeMs),\n\t\t\t\t\t\tattributes: [],\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\taggregationTemporality: 2,\n\t\t\t};\n\t\t} else {\n\t\t\tmetricData.gauge = { dataPoints };\n\t\t}\n\n\t\treturn metricData;\n\t});\n\n\treturn {\n\t\tresourceMetrics: [\n\t\t\t{\n\t\t\t\tresource,\n\t\t\t\tscopeMetrics: [\n\t\t\t\t\t{\n\t\t\t\t\t\tscope: { name: \"directive\", version: scopeVersion },\n\t\t\t\t\t\tmetrics: scopeMetrics,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t};\n}\n\nfunction convertTraces(\n\ttraces: TraceSpan[],\n\tresource: OTLPResource,\n\tscopeVersion: string,\n): Record<string, unknown> {\n\tconst spans = traces.map((span) => {\n\t\tconst events = span.logs.map((log) => ({\n\t\t\ttimeUnixNano: toNanos(log.timestamp),\n\t\t\tname: log.level,\n\t\t\tattributes: [\n\t\t\t\t{ key: \"message\", value: { stringValue: log.message } },\n\t\t\t\t{ key: \"level\", value: { stringValue: log.level } },\n\t\t\t],\n\t\t}));\n\n\t\tconst attributes = Object.entries(span.tags).map(([key, val]) => ({\n\t\t\tkey,\n\t\t\tvalue:\n\t\t\t\ttypeof val === \"string\"\n\t\t\t\t\t? { stringValue: val }\n\t\t\t\t\t: typeof val === \"number\"\n\t\t\t\t\t\t? { intValue: `${val}` }\n\t\t\t\t\t\t: { boolValue: val },\n\t\t}));\n\n\t\tconst statusCode =\n\t\t\tspan.status === \"ok\" ? 1 : span.status === \"error\" ? 2 : 0;\n\n\t\treturn {\n\t\t\ttraceId: span.traceId.replace(/-/g, \"\").padEnd(32, \"0\").slice(0, 32),\n\t\t\tspanId: span.spanId.replace(/-/g, \"\").padEnd(16, \"0\").slice(0, 16),\n\t\t\tparentSpanId: span.parentSpanId\n\t\t\t\t? span.parentSpanId.replace(/-/g, \"\").padEnd(16, \"0\").slice(0, 16)\n\t\t\t\t: undefined,\n\t\t\tname: span.operationName,\n\t\t\tkind: 1, // INTERNAL\n\t\t\tstartTimeUnixNano: toNanos(span.startTime),\n\t\t\tendTimeUnixNano: span.endTime ? toNanos(span.endTime) : toNanos(span.startTime),\n\t\t\tattributes,\n\t\t\tevents,\n\t\t\tstatus: { code: statusCode },\n\t\t};\n\t});\n\n\treturn {\n\t\tresourceSpans: [\n\t\t\t{\n\t\t\t\tresource,\n\t\t\t\tscopeSpans: [\n\t\t\t\t\t{\n\t\t\t\t\t\tscope: { name: \"directive\", version: scopeVersion },\n\t\t\t\t\t\tspans,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t};\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\n/**\n * Create an OTLP exporter for sending metrics and traces to OpenTelemetry-compatible backends.\n *\n * Supports:\n * - Grafana (via OTLP endpoint)\n * - Datadog (via OTLP ingest)\n * - Jaeger (via OTLP collector)\n * - Any OpenTelemetry Collector\n *\n * @example\n * ```typescript\n * const exporter = createOTLPExporter({\n * endpoint: 'http://localhost:4318',\n * serviceName: 'my-agent-service',\n * });\n *\n * // Wire into observability\n * const obs = createObservability({\n * metrics: { exporter: exporter.exportMetrics, exportInterval: 10000 },\n * tracing: { exporter: exporter.exportTraces },\n * });\n * ```\n */\nexport function createOTLPExporter(config: OTLPExporterConfig): OTLPExporter {\n\tconst {\n\t\tendpoint,\n\t\theaders = {},\n\t\tscopeVersion = \"0.1.0\",\n\t\ttimeoutMs = 10000,\n\t\tfetch: fetchFn = globalThis.fetch,\n\t\tonError,\n\t} = config;\n\n\t// Validate endpoint URL\n\ttry {\n\t\tconst url = new URL(endpoint);\n\t\tif (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n\t\t\tthrow new Error(\"Only http: and https: protocols are supported\");\n\t\t}\n\t} catch (error) {\n\t\tthrow new Error(\n\t\t\t`[Directive OTLP] Invalid endpoint URL \"${endpoint}\": ${error instanceof Error ? error.message : String(error)}`\n\t\t);\n\t}\n\n\t// Warn if endpoint already contains a path like /v1/metrics or /v1/traces\n\tif (/\\/v1\\/(metrics|traces)/.test(endpoint)) {\n\t\tconsole.warn(\n\t\t\t`[Directive OTLP] Endpoint \"${endpoint}\" already contains a /v1/metrics or /v1/traces path. ` +\n\t\t\t`The exporter will append /v1/metrics or /v1/traces automatically. ` +\n\t\t\t`Use the base URL (e.g., \"http://localhost:4318\") instead.`\n\t\t);\n\t}\n\n\t// Validate timeoutMs\n\tif (timeoutMs <= 0 || !Number.isFinite(timeoutMs)) {\n\t\tthrow new Error(`[Directive OTLP] timeoutMs must be > 0, got ${timeoutMs}`);\n\t}\n\n\tconst resource = buildResource(config);\n\n\tasync function send(path: string, body: Record<string, unknown>, type: \"metrics\" | \"traces\"): Promise<void> {\n\t\tconst url = `${endpoint.replace(/\\/$/, \"\")}${path}`;\n\t\tconst controller = new AbortController();\n\t\tconst timer = setTimeout(() => controller.abort(), timeoutMs);\n\n\t\ttry {\n\t\t\tconst response = await fetchFn(url, {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\t...headers,\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify(body),\n\t\t\t\tsignal: controller.signal,\n\t\t\t});\n\n\t\t\tif (!response.ok) {\n\t\t\t\tthrow new Error(`OTLP export failed: ${response.status} ${response.statusText}`);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconst err = error instanceof Error ? error : new Error(String(error));\n\t\t\tif (onError) {\n\t\t\t\tonError(err, type);\n\t\t\t} else {\n\t\t\t\tconsole.error(`[Directive OTLP] Export ${type} error:`, err.message);\n\t\t\t}\n\t\t} finally {\n\t\t\tclearTimeout(timer);\n\t\t}\n\t}\n\n\treturn {\n\t\tasync exportMetrics(metrics: AggregatedMetric[]): Promise<void> {\n\t\t\tif (metrics.length === 0) return;\n\t\t\tconst body = convertMetrics(metrics, resource, scopeVersion);\n\t\t\tawait send(\"/v1/metrics\", body, \"metrics\");\n\t\t},\n\n\t\tasync exportTraces(traces: TraceSpan[]): Promise<void> {\n\t\t\tif (traces.length === 0) return;\n\t\t\tconst body = convertTraces(traces, resource, scopeVersion);\n\t\t\tawait send(\"/v1/traces\", body, \"traces\");\n\t\t},\n\t};\n}\n","/**\n * Circuit Breaker for AI Agent Operations\n *\n * Implements the circuit breaker pattern to prevent cascading failures when\n * downstream services (MCP servers, LLM APIs) are degraded. Integrates with\n * the observability plugin to wire error rates into constraint decisions.\n *\n * States:\n * - CLOSED: Normal operation, requests pass through\n * - OPEN: Failures exceeded threshold, requests are rejected immediately\n * - HALF_OPEN: After recovery timeout, a limited number of requests are allowed through\n *\n * @example\n * ```typescript\n * import { createCircuitBreaker } from '@directive-run/ai';\n *\n * const breaker = createCircuitBreaker({\n * failureThreshold: 5,\n * recoveryTimeMs: 30000,\n * halfOpenMaxRequests: 3,\n * });\n *\n * // Use with MCP or any async operation\n * const result = await breaker.execute(async () => {\n * return await callExternalAPI();\n * });\n *\n * // Wire into Directive constraints\n * constraints: {\n * apiDown: {\n * when: () => breaker.getState() === 'OPEN',\n * require: { type: 'FALLBACK_RESPONSE' },\n * },\n * }\n * ```\n */\n\nimport type { ObservabilityInstance } from \"./observability.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Circuit breaker states */\nexport type CircuitState = \"CLOSED\" | \"OPEN\" | \"HALF_OPEN\";\n\n/** Circuit breaker configuration */\nexport interface CircuitBreakerConfig {\n\t/** Number of failures before opening the circuit (default: 5) */\n\tfailureThreshold?: number;\n\t/** Time in ms before transitioning from OPEN to HALF_OPEN (default: 30000) */\n\trecoveryTimeMs?: number;\n\t/** Number of requests allowed in HALF_OPEN state (default: 3) */\n\thalfOpenMaxRequests?: number;\n\t/** Time window in ms for counting failures (default: 60000). Failures outside this window are forgotten. */\n\tfailureWindowMs?: number;\n\t/** Optional observability instance for automatic metric tracking */\n\tobservability?: ObservabilityInstance;\n\t/** Metric name prefix for observability (default: \"circuit_breaker\") */\n\tmetricPrefix?: string;\n\t/** Name for this circuit breaker (used in metrics and errors) */\n\tname?: string;\n\t/** Custom error classifier. Return true if the error should count as a failure. Default: all errors count. */\n\tisFailure?: (error: Error) => boolean;\n\t/** Callback when state changes */\n\tonStateChange?: (from: CircuitState, to: CircuitState) => void;\n}\n\n/** Circuit breaker statistics */\nexport interface CircuitBreakerStats {\n\tstate: CircuitState;\n\ttotalRequests: number;\n\ttotalFailures: number;\n\ttotalSuccesses: number;\n\ttotalRejected: number;\n\trecentFailures: number;\n\tlastFailureTime: number | null;\n\tlastSuccessTime: number | null;\n\tlastStateChange: number;\n}\n\n/** Circuit breaker instance */\nexport interface CircuitBreaker {\n\t/** Execute an operation through the circuit breaker */\n\texecute<T>(fn: () => Promise<T>): Promise<T>;\n\t/** Get the current state */\n\tgetState(): CircuitState;\n\t/** Get statistics */\n\tgetStats(): CircuitBreakerStats;\n\t/** Force the circuit to a specific state (useful for testing) */\n\tforceState(state: CircuitState): void;\n\t/** Reset the circuit breaker to CLOSED with cleared stats */\n\treset(): void;\n\t/** Check if a request would be allowed (without executing) */\n\tisAllowed(): boolean;\n}\n\n// ============================================================================\n// Errors\n// ============================================================================\n\n/** Error thrown when a request is rejected because the circuit is open */\nexport class CircuitBreakerOpenError extends Error {\n\treadonly code = \"CIRCUIT_OPEN\" as const;\n\treadonly retryAfterMs: number;\n\treadonly state: \"OPEN\" | \"HALF_OPEN\";\n\n\tconstructor(name: string, retryAfterMs: number, state: \"OPEN\" | \"HALF_OPEN\" = \"OPEN\", detail?: string) {\n\t\tconst msg = detail\n\t\t\t? `[Directive CircuitBreaker] Circuit \"${name}\" is ${state}. ${detail}`\n\t\t\t: `[Directive CircuitBreaker] Circuit \"${name}\" is ${state}. Request rejected. Try again in ${Math.ceil(retryAfterMs / 1000)}s.`;\n\t\tsuper(msg);\n\t\tthis.name = \"CircuitBreakerOpenError\";\n\t\tthis.retryAfterMs = retryAfterMs;\n\t\tthis.state = state;\n\t}\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\n/**\n * Create a circuit breaker for protecting against cascading failures.\n *\n * @example\n * ```typescript\n * const breaker = createCircuitBreaker({\n * name: 'openai-api',\n * failureThreshold: 5,\n * recoveryTimeMs: 30000,\n * observability: obs, // Optional: auto-track metrics\n * });\n *\n * try {\n * const result = await breaker.execute(async () => {\n * return await openai.chat.completions.create({ ... });\n * });\n * } catch (error) {\n * if (error.message.includes('Circuit breaker')) {\n * // Circuit is open, use fallback\n * }\n * }\n * ```\n *\n * @throws {Error} If failureThreshold is less than 1 or not a finite number\n * @throws {Error} If recoveryTimeMs is not positive or not a finite number\n * @throws {Error} If halfOpenMaxRequests is less than 1 or not a finite number\n * @throws {Error} If failureWindowMs is not positive or not a finite number\n */\nexport function createCircuitBreaker(config: CircuitBreakerConfig = {}): CircuitBreaker {\n\tconst {\n\t\tfailureThreshold = 5,\n\t\trecoveryTimeMs = 30000,\n\t\thalfOpenMaxRequests = 3,\n\t\tfailureWindowMs = 60000,\n\t\tobservability,\n\t\tmetricPrefix = \"circuit_breaker\",\n\t\tname = \"default\",\n\t\tisFailure = () => true,\n\t\tonStateChange,\n\t} = config;\n\n\t// Validate config\n\tif (failureThreshold < 1 || !Number.isFinite(failureThreshold)) {\n\t\tthrow new Error(`[Directive CircuitBreaker] failureThreshold must be >= 1, got ${failureThreshold}`);\n\t}\n\tif (recoveryTimeMs <= 0 || !Number.isFinite(recoveryTimeMs)) {\n\t\tthrow new Error(`[Directive CircuitBreaker] recoveryTimeMs must be > 0, got ${recoveryTimeMs}`);\n\t}\n\tif (halfOpenMaxRequests < 1 || !Number.isFinite(halfOpenMaxRequests)) {\n\t\tthrow new Error(`[Directive CircuitBreaker] halfOpenMaxRequests must be >= 1, got ${halfOpenMaxRequests}`);\n\t}\n\tif (failureWindowMs <= 0 || !Number.isFinite(failureWindowMs)) {\n\t\tthrow new Error(`[Directive CircuitBreaker] failureWindowMs must be > 0, got ${failureWindowMs}`);\n\t}\n\n\tlet state: CircuitState = \"CLOSED\";\n\tlet failureTimestamps: number[] = [];\n\tlet halfOpenRequests = 0;\n\tlet halfOpenSuccesses = 0;\n\tlet lastStateChange = Date.now();\n\tlet openedAt = 0;\n\n\t// Stats\n\tlet totalRequests = 0;\n\tlet totalFailures = 0;\n\tlet totalSuccesses = 0;\n\tlet totalRejected = 0;\n\tlet lastFailureTime: number | null = null;\n\tlet lastSuccessTime: number | null = null;\n\n\tfunction transition(newState: CircuitState): void {\n\t\tif (state === newState) return;\n\t\tconst oldState = state;\n\t\tstate = newState;\n\t\tlastStateChange = Date.now();\n\n\t\tif (newState === \"OPEN\") {\n\t\t\topenedAt = Date.now();\n\t\t}\n\t\tif (newState === \"HALF_OPEN\") {\n\t\t\thalfOpenRequests = 0;\n\t\t\thalfOpenSuccesses = 0;\n\t\t}\n\n\t\tonStateChange?.(oldState, newState);\n\n\t\tif (observability) {\n\t\t\tobservability.incrementCounter(`${metricPrefix}.state_change`, {\n\t\t\t\tname,\n\t\t\t\tfrom: oldState,\n\t\t\t\tto: newState,\n\t\t\t});\n\t\t}\n\t}\n\n\tfunction getRecentFailures(): number {\n\t\tconst cutoff = Date.now() - failureWindowMs;\n\t\tfailureTimestamps = failureTimestamps.filter((t) => t > cutoff);\n\t\treturn failureTimestamps.length;\n\t}\n\n\tfunction recordSuccess(): void {\n\t\ttotalSuccesses++;\n\t\tlastSuccessTime = Date.now();\n\n\t\tif (observability) {\n\t\t\tobservability.incrementCounter(`${metricPrefix}.success`, { name });\n\t\t}\n\n\t\tif (state === \"HALF_OPEN\") {\n\t\t\thalfOpenSuccesses++;\n\t\t\tif (halfOpenSuccesses >= halfOpenMaxRequests) {\n\t\t\t\ttransition(\"CLOSED\");\n\t\t\t\tfailureTimestamps = [];\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction recordFailure(error: Error): void {\n\t\tif (!isFailure(error)) {\n\t\t\trecordSuccess();\n\t\t\treturn;\n\t\t}\n\n\t\ttotalFailures++;\n\t\tlastFailureTime = Date.now();\n\t\tfailureTimestamps.push(Date.now());\n\n\t\t// Cap array to prevent unbounded growth (keep 2x threshold as headroom)\n\t\tconst maxTimestamps = failureThreshold * 2;\n\t\tif (failureTimestamps.length > maxTimestamps) {\n\t\t\tfailureTimestamps = failureTimestamps.slice(-maxTimestamps);\n\t\t}\n\n\t\tif (observability) {\n\t\t\tobservability.incrementCounter(`${metricPrefix}.failure`, { name });\n\t\t}\n\n\t\tif (state === \"HALF_OPEN\") {\n\t\t\ttransition(\"OPEN\");\n\t\t\treturn;\n\t\t}\n\n\t\tif (state === \"CLOSED\" && getRecentFailures() >= failureThreshold) {\n\t\t\ttransition(\"OPEN\");\n\t\t}\n\t}\n\n\treturn {\n\t\tasync execute<T>(fn: () => Promise<T>): Promise<T> {\n\t\t\ttotalRequests++;\n\n\t\t\tif (observability) {\n\t\t\t\tobservability.incrementCounter(`${metricPrefix}.requests`, { name });\n\t\t\t}\n\n\t\t\t// Check if request should be allowed\n\t\t\tif (state === \"OPEN\") {\n\t\t\t\t// Check if recovery time has elapsed\n\t\t\t\tif (Date.now() - openedAt >= recoveryTimeMs) {\n\t\t\t\t\ttransition(\"HALF_OPEN\");\n\t\t\t\t} else {\n\t\t\t\t\ttotalRejected++;\n\t\t\t\t\tif (observability) {\n\t\t\t\t\t\tobservability.incrementCounter(`${metricPrefix}.rejected`, { name });\n\t\t\t\t\t}\n\t\t\t\t\tthrow new CircuitBreakerOpenError(name, recoveryTimeMs - (Date.now() - openedAt));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (state === \"HALF_OPEN\") {\n\t\t\t\tif (halfOpenRequests >= halfOpenMaxRequests) {\n\t\t\t\t\ttotalRejected++;\n\t\t\t\t\tthrow new CircuitBreakerOpenError(name, recoveryTimeMs, \"HALF_OPEN\", `Max trial requests (${halfOpenMaxRequests}) reached.`);\n\t\t\t\t}\n\t\t\t\thalfOpenRequests++;\n\t\t\t}\n\n\t\t\t// Execute the operation\n\t\t\tconst start = Date.now();\n\t\t\ttry {\n\t\t\t\tconst result = await fn();\n\t\t\t\trecordSuccess();\n\n\t\t\t\tif (observability) {\n\t\t\t\t\tobservability.observeHistogram(`${metricPrefix}.latency`, Date.now() - start, { name });\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\t\t\t} catch (error) {\n\t\t\t\tconst err = error instanceof Error ? error : new Error(String(error));\n\t\t\t\trecordFailure(err);\n\n\t\t\t\tif (observability) {\n\t\t\t\t\tobservability.observeHistogram(`${metricPrefix}.latency`, Date.now() - start, { name });\n\t\t\t\t}\n\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t},\n\n\t\tgetState(): CircuitState {\n\t\t\t// Auto-transition from OPEN to HALF_OPEN when recovery time has passed\n\t\t\tif (state === \"OPEN\" && Date.now() - openedAt >= recoveryTimeMs) {\n\t\t\t\ttransition(\"HALF_OPEN\");\n\t\t\t}\n\t\t\treturn state;\n\t\t},\n\n\t\tgetStats(): CircuitBreakerStats {\n\t\t\t// Ensure state freshness (auto-transition OPEN → HALF_OPEN)\n\t\t\tconst currentState = this.getState();\n\t\t\treturn {\n\t\t\t\tstate: currentState,\n\t\t\t\ttotalRequests,\n\t\t\t\ttotalFailures,\n\t\t\t\ttotalSuccesses,\n\t\t\t\ttotalRejected,\n\t\t\t\trecentFailures: getRecentFailures(),\n\t\t\t\tlastFailureTime,\n\t\t\t\tlastSuccessTime,\n\t\t\t\tlastStateChange,\n\t\t\t};\n\t\t},\n\n\t\tforceState(newState: CircuitState): void {\n\t\t\ttransition(newState);\n\t\t},\n\n\t\treset(): void {\n\t\t\tconst oldState = state;\n\t\t\tstate = \"CLOSED\";\n\t\t\tfailureTimestamps = [];\n\t\t\thalfOpenRequests = 0;\n\t\t\thalfOpenSuccesses = 0;\n\t\t\tlastStateChange = Date.now();\n\t\t\topenedAt = 0;\n\t\t\ttotalRequests = 0;\n\t\t\ttotalFailures = 0;\n\t\t\ttotalSuccesses = 0;\n\t\t\ttotalRejected = 0;\n\t\t\tlastFailureTime = null;\n\t\t\tlastSuccessTime = null;\n\t\t\tif (oldState !== \"CLOSED\") {\n\t\t\t\tonStateChange?.(oldState, \"CLOSED\");\n\t\t\t}\n\t\t},\n\n\t\tisAllowed(): boolean {\n\t\t\tif (state === \"CLOSED\") return true;\n\t\t\tif (state === \"OPEN\") {\n\t\t\t\treturn Date.now() - openedAt >= recoveryTimeMs;\n\t\t\t}\n\t\t\t// HALF_OPEN\n\t\t\treturn halfOpenRequests < halfOpenMaxRequests;\n\t\t},\n\t};\n}\n"]}