@directive-run/core 0.8.5 → 0.8.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -0
- package/dist/adapter-utils.cjs +1 -1
- package/dist/adapter-utils.cjs.map +1 -1
- package/dist/adapter-utils.d.cts +14 -2
- package/dist/adapter-utils.d.ts +14 -2
- package/dist/adapter-utils.js +1 -1
- package/dist/adapter-utils.js.map +1 -1
- package/dist/chunk-4CMO5OVZ.js +3 -0
- package/dist/chunk-4CMO5OVZ.js.map +1 -0
- package/dist/chunk-BEJ6ICA7.cjs +3 -0
- package/dist/chunk-BEJ6ICA7.cjs.map +1 -0
- package/dist/chunk-FVPJU5F3.js +3 -0
- package/dist/chunk-FVPJU5F3.js.map +1 -0
- package/dist/{chunk-MAARYRI4.js → chunk-KXIHB2EB.js} +3 -3
- package/dist/{chunk-MAARYRI4.js.map → chunk-KXIHB2EB.js.map} +1 -1
- package/dist/chunk-SGMWAVHO.cjs +3 -0
- package/dist/chunk-SGMWAVHO.cjs.map +1 -0
- package/dist/{chunk-LAH2FMON.cjs → chunk-W4VP6SVP.cjs} +3 -3
- package/dist/{chunk-LAH2FMON.cjs.map → chunk-W4VP6SVP.cjs.map} +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/internals.cjs +1 -1
- package/dist/internals.d.cts +23 -2
- package/dist/internals.d.ts +23 -2
- package/dist/internals.js +1 -1
- package/dist/plugins/index.cjs +2 -2
- package/dist/plugins/index.cjs.map +1 -1
- package/dist/plugins/index.d.cts +71 -3
- package/dist/plugins/index.d.ts +71 -3
- package/dist/plugins/index.js +2 -2
- package/dist/plugins/index.js.map +1 -1
- package/dist/system-HQCNSUY5.cjs +2 -0
- package/dist/{system-L45Z2N4U.cjs.map → system-HQCNSUY5.cjs.map} +1 -1
- package/dist/system-QNIJLXKW.js +2 -0
- package/dist/{system-L2FVVUSN.js.map → system-QNIJLXKW.js.map} +1 -1
- package/dist/testing.cjs +1 -1
- package/dist/testing.js +1 -1
- package/dist/{utils-4JrY5fk9.d.cts → utils-BnQajqPu.d.cts} +9 -1
- package/dist/{utils-4JrY5fk9.d.ts → utils-BnQajqPu.d.ts} +9 -1
- package/dist/worker.cjs +1 -1
- package/dist/worker.js +1 -1
- package/package.json +2 -2
- package/dist/chunk-6WG7FPH7.cjs +0 -3
- package/dist/chunk-6WG7FPH7.cjs.map +0 -1
- package/dist/chunk-DIK3SZBM.js +0 -3
- package/dist/chunk-DIK3SZBM.js.map +0 -1
- package/dist/chunk-GO63IIN5.js +0 -2
- package/dist/chunk-GO63IIN5.js.map +0 -1
- package/dist/chunk-KQKNE23L.cjs +0 -2
- package/dist/chunk-KQKNE23L.cjs.map +0 -1
- package/dist/system-L2FVVUSN.js +0 -2
- package/dist/system-L45Z2N4U.cjs +0 -2
|
@@ -1 +1 @@
|
|
|
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/plugins/persistence.ts","../../src/plugins/performance.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","type","props","entry","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","historySection","undoBtn","redoBtn","historyLabel","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","r","li","renderStatus","inflightCount","unmetCount","isSettled","updateDerivations","derivRowMap","derivationKeys","keySet","addEventRow","eventCount","empty","now","time","preview","timeSpan","typeSpan","previewSpan","updatePerfSection","perf","avgReconcile","lines","line","div","resolverHeader","sorted","a","b","stats","avg","updateHistoryControls","tt","current","total","canUndo","canRedo","setupHistoryButtons","graphCaches","computeFingerprint","factKeys","derivKeys","constraints","reqMap","resolverIds","activeResolverIds","c","updateAnimationAttrs","cache","depGraph","constraintIds","node","pulsing","updateDependencyGraph","inspection","allConstraints","unmetReqs","inflightReqs","u","f","text","fingerprint","existingCache","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","w","title","durationMs","inflightStart","initDevtools","systems","api","name","requirementId","callback","target","attached","timer","t","stop","s","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","DEVTOOLS_EVENT_NAME","BLOCKED_KEYS","SESSION_NONCE","getNextId","sanitizeEvent","needsSanitize","clean","emitDevToolsEvent","safe","full","persistencePlugin","storage","include","exclude","debounce","onRestore","onSave","onError","saveTimeout","trackedKeys","shouldPersist","factKey","load","isPrototypeSafe","save","scheduleSave","shouldSave","performancePlugin","onSlowConstraint","onSlowResolver","slowConstraintThresholdMs","slowResolverThresholdMs","resolvers","effects","reconcile","startedAt","reconcileStartTime","lastConstraintEvalEndTime","getConstraintMetrics","m","getResolverMetrics","getEffectMetrics","plugin","_active","timedEvals","_req","_error","_attempt","constraintsObj","resolversObj","effectsObj","buildResource","config","attrs","val","toNanos","timestampMs","metricTypeToOTLP","convertMetrics","metrics","resource","scopeVersion","scopeMetrics","metric","startTimeMs","dataPoints","otlpType","metricData","convertTraces","traces","spans","span","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","totalRequests","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 { ModuleSchema, Plugin } from \"../core/types.js\";\n\n/**\n * Configuration for the {@link loggingPlugin}.\n *\n * @remarks\n * All fields are optional. The defaults produce `[Directive]`-prefixed\n * `console.info`-level output for every lifecycle event.\n *\n * | Field | Default | Description |\n * |----------|-----------------|-------------|\n * | `level` | `\"info\"` | Minimum severity to emit. |\n * | `filter` | `() => true` | Predicate that receives the event name (e.g., `\"fact.set\"`) and returns whether to log it. |\n * | `logger` | `console` | Any object implementing `debug`, `info`, `warn`, `error`, `group`, and `groupEnd`. |\n * | `prefix` | `\"[Directive]\"` | String prepended to every log line. |\n *\n * @public\n */\nexport interface LoggingPluginOptions {\n /** Minimum log level; events below this severity are silenced. */\n level?: \"debug\" | \"info\" | \"warn\" | \"error\";\n /** Predicate that receives the event name and returns whether to log it. */\n filter?: (event: string) => boolean;\n /** Custom logger object (defaults to `console`). */\n logger?: Pick<\n Console,\n \"debug\" | \"info\" | \"warn\" | \"error\" | \"group\" | \"groupEnd\"\n >;\n /** String prepended to every log message. */\n prefix?: string;\n}\n\nconst LOG_LEVELS = { debug: 0, info: 1, warn: 2, error: 3 };\n\n/**\n * Create a plugin that logs Directive lifecycle events to a configurable logger.\n *\n * @remarks\n * Every plugin hook is mapped to a log call at an appropriate severity:\n * - `debug` -- init, destroy, fact changes, derivation compute/invalidate, reconcile, constraint evaluate, resolver start/cancel, effect run, snapshot\n * - `info` -- start, stop, requirement met, resolver complete, time-travel jump\n * - `warn` -- resolver retry, error recovery\n * - `error` -- constraint error, resolver error, effect error, system error\n *\n * @param options - Optional {@link LoggingPluginOptions} to control level, filtering, logger backend, and prefix.\n * @returns A {@link Plugin} that can be passed to `createSystem`'s `plugins` array.\n *\n * @example\n * ```ts\n * const system = createSystem({\n * modules: [myModule],\n * plugins: [loggingPlugin({ level: \"debug\" })],\n * });\n * ```\n *\n * @public\n */\nexport function loggingPlugin<M extends ModuleSchema = ModuleSchema>(\n options: LoggingPluginOptions = {},\n): Plugin<M> {\n const {\n level = \"info\",\n filter = () => true,\n logger = console,\n prefix = \"[Directive]\",\n } = options;\n\n const minLevel = LOG_LEVELS[level];\n\n const log = (\n eventLevel: keyof typeof LOG_LEVELS,\n event: string,\n ...args: unknown[]\n ) => {\n if (LOG_LEVELS[eventLevel] < minLevel) return;\n if (!filter(event)) return;\n logger[eventLevel](`${prefix} ${event}`, ...args);\n };\n\n return {\n name: \"logging\",\n\n onInit: () => log(\"debug\", \"init\"),\n onStart: () => log(\"info\", \"start\"),\n onStop: () => log(\"info\", \"stop\"),\n onDestroy: () => log(\"debug\", \"destroy\"),\n\n onFactSet: (key, value, prev) => {\n log(\"debug\", \"fact.set\", { key, value, prev });\n },\n\n onFactDelete: (key, prev) => {\n log(\"debug\", \"fact.delete\", { key, prev });\n },\n\n onFactsBatch: (changes) => {\n log(\"debug\", \"facts.batch\", { count: changes.length, changes });\n },\n\n onDerivationCompute: (id, value, deps) => {\n log(\"debug\", \"derivation.compute\", { id, value, deps });\n },\n\n onDerivationInvalidate: (id) => {\n log(\"debug\", \"derivation.invalidate\", { id });\n },\n\n onReconcileStart: () => {\n log(\"debug\", \"reconcile.start\");\n },\n\n onReconcileEnd: (result) => {\n log(\"debug\", \"reconcile.end\", {\n unmet: result.unmet.length,\n inflight: result.inflight.length,\n completed: result.completed.length,\n canceled: result.canceled.length,\n });\n },\n\n onConstraintEvaluate: (id, active) => {\n log(\"debug\", \"constraint.evaluate\", { id, active });\n },\n\n onConstraintError: (id, error) => {\n log(\"error\", \"constraint.error\", { id, error });\n },\n\n onRequirementCreated: (req) => {\n log(\"debug\", \"requirement.created\", {\n id: req.id,\n type: req.requirement.type,\n });\n },\n\n onRequirementMet: (req, byResolver) => {\n log(\"info\", \"requirement.met\", { id: req.id, byResolver });\n },\n\n onRequirementCanceled: (req) => {\n log(\"debug\", \"requirement.canceled\", { id: req.id });\n },\n\n onResolverStart: (resolver, req) => {\n log(\"debug\", \"resolver.start\", { resolver, requirementId: req.id });\n },\n\n onResolverComplete: (resolver, req, duration) => {\n log(\"info\", \"resolver.complete\", {\n resolver,\n requirementId: req.id,\n duration,\n });\n },\n\n onResolverError: (resolver, req, error) => {\n log(\"error\", \"resolver.error\", {\n resolver,\n requirementId: req.id,\n error,\n });\n },\n\n onResolverRetry: (resolver, req, attempt) => {\n log(\"warn\", \"resolver.retry\", {\n resolver,\n requirementId: req.id,\n attempt,\n });\n },\n\n onResolverCancel: (resolver, req) => {\n log(\"debug\", \"resolver.cancel\", { resolver, requirementId: req.id });\n },\n\n onEffectRun: (id) => {\n log(\"debug\", \"effect.run\", { id });\n },\n\n onEffectError: (id, error) => {\n log(\"error\", \"effect.error\", { id, error });\n },\n\n onSnapshot: (snapshot) => {\n log(\"debug\", \"timetravel.snapshot\", {\n id: snapshot.id,\n trigger: snapshot.trigger,\n });\n },\n\n onHistoryNavigate: (from, to) => {\n log(\"info\", \"timetravel.jump\", { from, to });\n },\n\n onError: (error) => {\n log(\"error\", \"error\", {\n source: error.source,\n sourceId: error.sourceId,\n message: error.message,\n });\n },\n\n onErrorRecovery: (error, strategy) => {\n log(\"warn\", \"error.recovery\", {\n source: error.source,\n sourceId: error.sourceId,\n strategy,\n });\n },\n\n onDefinitionRegister: (type, id) => {\n log(\"info\", \"definition.register\", { type, id });\n },\n\n onDefinitionAssign: (type, id) => {\n log(\"info\", \"definition.assign\", { type, id });\n },\n\n onDefinitionUnregister: (type, id) => {\n log(\"info\", \"definition.unregister\", { type, id });\n },\n\n onDefinitionCall: (type, id, props) => {\n log(\"debug\", \"definition.call\", { type, id, props });\n },\n\n onTraceComplete: (entry) => {\n log(\"debug\", \"trace.complete\", {\n id: entry.id,\n status: entry.status,\n duration: entry.duration,\n factChanges: entry.factChanges.length,\n derivationsRecomputed: entry.derivationsRecomputed.length,\n constraintsHit: entry.constraintsHit.length,\n resolversStarted: entry.resolversStarted.length,\n effectsRun: entry.effectsRun.length,\n });\n },\n };\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 /** Name for this system in devtools */\n name?: string;\n /** Enable trace logging */\n trace?: boolean;\n /** Maximum number of trace events to retain (default: 1000) */\n maxEvents?: number;\n /** Show floating debug panel (dev mode only, requires browser) */\n panel?: boolean;\n /** Panel position */\n position?: \"bottom-right\" | \"bottom-left\" | \"top-right\" | \"top-left\";\n /** Start panel open */\n defaultOpen?: boolean;\n}\n\n// ============================================================================\n// Circular Buffer — O(1) push with bounded capacity\n// ============================================================================\n\nexport interface TraceEvent {\n timestamp: number;\n type: string;\n data: unknown;\n}\n\nexport class CircularBuffer<T> {\n private buf: (T | undefined)[];\n private head = 0;\n private _size = 0;\n\n constructor(private capacity: number) {\n this.buf = new Array(capacity);\n }\n\n get size() {\n return this._size;\n }\n\n push(item: T) {\n this.buf[this.head] = item;\n this.head = (this.head + 1) % this.capacity;\n if (this._size < this.capacity) {\n this._size++;\n }\n }\n\n toArray(): T[] {\n if (this._size === 0) {\n return [];\n }\n if (this._size < this.capacity) {\n return this.buf.slice(0, this._size) as T[];\n }\n\n return [\n ...(this.buf.slice(this.head) as T[]),\n ...(this.buf.slice(0, this.head) as T[]),\n ];\n }\n\n clear() {\n this.buf = new Array(this.capacity);\n this.head = 0;\n this._size = 0;\n }\n}\n\n// ============================================================================\n// Subscriber\n// ============================================================================\n\nexport type DevtoolsSubscriber = (event: TraceEvent) => void;\n\n// ============================================================================\n// Devtools State\n// ============================================================================\n\nexport interface DevtoolsState {\n system: System<ModuleSchema> | null;\n events: CircularBuffer<TraceEvent>;\n maxEvents: number;\n subscribers: Set<DevtoolsSubscriber>;\n resolverStats: Map<\n string,\n { count: number; totalMs: number; errors: number }\n >;\n}\n\ndeclare global {\n interface Window {\n __DIRECTIVE__?: {\n systems: Map<string, DevtoolsState>;\n getSystem(name?: string): System<ModuleSchema> | null;\n getSystems(): string[];\n inspect(name?: string): unknown;\n getEvents(name?: string): TraceEvent[];\n explain(requirementId: string, name?: string): string | null;\n exportSession(name?: string): string | null;\n importSession(json: string, name?: string): boolean;\n clearEvents(name?: string): void;\n /** Subscribe to trace events. Returns unsubscribe function. */\n subscribe(callback: DevtoolsSubscriber, systemName?: string): () => void;\n };\n }\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 try {\n if (\n typeof process !== \"undefined\" &&\n process.env?.NODE_ENV === \"production\"\n ) {\n return false;\n }\n } catch {\n // process not available\n }\n try {\n if (\n typeof import.meta !== \"undefined\" &&\n // @ts-expect-error — import.meta.env is Vite-specific\n import.meta.env?.MODE === \"production\"\n ) {\n return false;\n }\n } catch {\n // import.meta.env not available\n }\n return true;\n}\n\n/** @internal Format a value for display in the devtools panel. */\nexport function formatValue(value: unknown): string {\n try {\n if (value === undefined) {\n return \"undefined\";\n }\n if (value === null) {\n return \"null\";\n }\n if (typeof value === \"bigint\") {\n return String(value) + \"n\";\n }\n if (typeof value === \"symbol\") {\n return String(value);\n }\n if (typeof value === \"object\") {\n const str = JSON.stringify(value, (_k, v) => {\n if (typeof v === \"bigint\") {\n return String(v) + \"n\";\n }\n if (typeof v === \"symbol\") {\n return String(v);\n }\n\n return v;\n });\n\n return str.length > 120 ? str.slice(0, 117) + \"...\" : str;\n }\n\n return String(value);\n } catch {\n return \"<error>\";\n }\n}\n\n/** @internal Truncate a string to a maximum length with ellipsis. */\nexport function truncate(str: string, max: number): string {\n if (str.length <= max) {\n return str;\n }\n\n return str.slice(0, max - 3) + \"...\";\n}\n\n/** @internal Safely call system.inspect(), returning null on error. */\nexport function safeInspect(system: System<ModuleSchema>) {\n try {\n return system.inspect();\n } catch {\n return null;\n }\n}\n\n/** E15: Deep-clone event data via JSON round-trip to prevent reference sharing */\nexport function cloneViaJSON(data: unknown): unknown {\n try {\n if (data === null || data === undefined || typeof data !== \"object\") {\n return data;\n }\n\n return JSON.parse(JSON.stringify(data));\n } catch {\n return null;\n }\n}\n\n/** M7: Validate maxEvents — floor at 1, default 1000 */\nexport function validateMaxEvents(value: number | undefined): number {\n if (value === undefined) {\n return 1000;\n }\n if (!Number.isFinite(value) || value < 1) {\n if (isDevMode()) {\n console.warn(\n `[directive:devtools] Invalid maxEvents value (${value}), using default 1000`,\n );\n }\n\n return 1000;\n }\n\n return Math.floor(value);\n}\n\n// ============================================================================\n// Performance Metrics\n// ============================================================================\n\nexport interface PerfMetrics {\n reconcileCount: number;\n reconcileTotalMs: number;\n resolverStats: Map<\n string,\n { count: number; totalMs: number; errors: number }\n >;\n effectRunCount: number;\n effectErrorCount: number;\n lastReconcileStartMs: number;\n}\n\n/** @internal Create initial performance metrics state. */\nexport function createPerfMetrics(): PerfMetrics {\n return {\n reconcileCount: 0,\n reconcileTotalMs: 0,\n resolverStats: new Map(),\n effectRunCount: 0,\n effectErrorCount: 0,\n lastReconcileStartMs: 0,\n };\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 = [\n \"#8b9aff\",\n \"#4ade80\",\n \"#fbbf24\",\n \"#c084fc\",\n \"#f472b6\",\n \"#22d3ee\",\n] as const;\n\nexport interface TimelineEntry {\n resolver: string;\n startMs: number;\n endMs: number;\n error: boolean;\n}\n\nexport interface TimelineState {\n entries: CircularBuffer<TimelineEntry>;\n /** Map of resolver → startMs for inflight resolvers */\n inflight: Map<string, number>;\n}\n\n/** @internal Create initial timeline state for resolver flamechart. */\nexport function createTimelineState(): TimelineState {\n return {\n entries: new CircularBuffer<TimelineEntry>(MAX_TIMELINE_ENTRIES),\n inflight: new Map(),\n };\n}\n\n// ============================================================================\n// Dependency Graph Tracking\n// ============================================================================\n\nexport interface DepGraph {\n /** derivation ID → fact keys it depends on */\n derivationDeps: Map<string, string[]>;\n /** currently active constraint IDs */\n activeConstraints: Set<string>;\n /** set of fact keys that recently changed (for animation) */\n recentlyChangedFacts: Set<string>;\n /** set of derivation IDs that recently recomputed */\n recentlyComputedDerivations: Set<string>;\n /** set of constraint IDs that recently evaluated to active */\n recentlyActiveConstraints: Set<string>;\n /** animation clear timer */\n animationTimer: ReturnType<typeof setTimeout> | null;\n}\n\n/** @internal Create initial dependency graph tracking state. */\nexport function createDepGraph(): DepGraph {\n return {\n derivationDeps: new Map(),\n activeConstraints: new Set(),\n recentlyChangedFacts: new Set(),\n recentlyComputedDerivations: new Set(),\n recentlyActiveConstraints: new Set(),\n animationTimer: null,\n };\n}\n\n// ============================================================================\n// Record & Replay\n// ============================================================================\n\n// Recording caps to prevent unbounded growth\nexport const MAX_RECORDED_EVENTS = 10_000;\nexport const MAX_RECORDED_SNAPSHOTS = 100;\n\nexport interface RecordingState {\n isRecording: boolean;\n recordedEvents: TraceEvent[];\n snapshots: Array<{ timestamp: number; facts: Record<string, unknown> }>;\n}\n\n/** @internal Create initial recording state for event capture. */\nexport function createRecordingState(): RecordingState {\n return {\n isRecording: false,\n recordedEvents: [],\n snapshots: [],\n };\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 bg: \"#1a1a2e\",\n text: \"#e0e0e0\",\n accent: \"#8b9aff\", // 6.63:1 contrast ratio\n muted: \"#b0b0d0\", // 8.10:1 contrast ratio\n border: \"#333\",\n rowBorder: \"#2a2a4a\",\n green: \"#4ade80\",\n yellow: \"#fbbf24\",\n red: \"#f87171\",\n closeBtn: \"#aaa\", // 7.34:1 contrast ratio\n font: \"ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace\",\n} as const;\n\n// Flow diagram layout constants\nexport const FLOW = {\n nodeW: 90,\n nodeH: 16,\n nodeGap: 6,\n startY: 16,\n columns: 5, // facts, derivations, constraints, requirements, resolvers\n colGap: 20,\n fontSize: 10,\n labelMaxChars: 11,\n} as const;\n\nexport interface PanelRefs {\n container: HTMLDivElement;\n toggleBtn: HTMLButtonElement;\n titleEl: HTMLElement;\n statusEl: HTMLSpanElement;\n factsBody: HTMLTableSectionElement;\n factsCount: HTMLSpanElement;\n derivBody: HTMLTableSectionElement;\n derivCount: HTMLSpanElement;\n derivSection: HTMLDetailsElement;\n inflightList: HTMLUListElement;\n inflightSection: HTMLDetailsElement;\n inflightCount: HTMLSpanElement;\n unmetList: HTMLUListElement;\n unmetSection: HTMLDetailsElement;\n unmetCount: HTMLSpanElement;\n perfSection: HTMLDetailsElement;\n perfBody: HTMLDivElement;\n historySection: HTMLDivElement;\n historyLabel: HTMLSpanElement;\n undoBtn: HTMLButtonElement;\n redoBtn: HTMLButtonElement;\n flowSection: HTMLDetailsElement;\n flowSvg: SVGSVGElement;\n timelineSection: HTMLDetailsElement;\n timelineSvg: SVGSVGElement;\n eventsSection: HTMLDetailsElement;\n eventsList: HTMLDivElement;\n eventsCount: HTMLSpanElement;\n traceHint: HTMLDivElement;\n recordBtn: HTMLButtonElement;\n exportBtn: 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 type DevtoolsPluginOptions,\n MAX_PANEL_EVENTS,\n type PanelRefs,\n type PerfMetrics,\n S,\n TIMELINE_SVG_W,\n formatValue,\n truncate,\n} from \"./devtools-types.js\";\n\n// ============================================================================\n// Panel Creation\n// ============================================================================\n\n/** @internal Create the floating devtools panel DOM structure. */\nexport function createPanel(\n systemName: string,\n position: NonNullable<DevtoolsPluginOptions[\"position\"]>,\n defaultOpen: boolean,\n showEvents: boolean,\n): {\n refs: PanelRefs;\n destroy: () => void;\n isOpen: () => boolean;\n flashTimers: Set<ReturnType<typeof setTimeout>>;\n} {\n let destroyed = false;\n const posStyles: Record<string, string> = {\n position: \"fixed\",\n zIndex: \"99999\",\n ...(position.includes(\"bottom\") ? { bottom: \"12px\" } : { top: \"12px\" }),\n ...(position.includes(\"right\") ? { right: \"12px\" } : { left: \"12px\" }),\n };\n\n // Inject focus-visible styles (E3)\n const styleEl = document.createElement(\"style\");\n styleEl.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 document.head.appendChild(styleEl);\n\n // Toggle button — 44x44px minimum touch target\n const toggleBtn = document.createElement(\"button\");\n toggleBtn.setAttribute(\"aria-label\", \"Open Directive DevTools\");\n toggleBtn.setAttribute(\"aria-expanded\", String(defaultOpen));\n toggleBtn.title = \"Ctrl+Shift+D to toggle\";\n Object.assign(toggleBtn.style, {\n ...posStyles,\n background: S.bg,\n color: S.text,\n border: `1px solid ${S.border}`,\n borderRadius: \"6px\",\n padding: \"10px 14px\",\n minWidth: \"44px\",\n minHeight: \"44px\",\n cursor: \"pointer\",\n fontFamily: S.font,\n fontSize: \"12px\",\n display: defaultOpen ? \"none\" : \"block\",\n });\n toggleBtn.textContent = \"Directive\";\n\n // Container — responsive sizing\n const container = document.createElement(\"div\");\n container.setAttribute(\"role\", \"region\");\n container.setAttribute(\"aria-label\", \"Directive DevTools\");\n container.setAttribute(\"data-directive-devtools\", \"\");\n container.tabIndex = -1;\n Object.assign(container.style, {\n ...posStyles,\n background: S.bg,\n color: S.text,\n border: `1px solid ${S.border}`,\n borderRadius: \"8px\",\n padding: \"12px\",\n fontFamily: S.font,\n fontSize: \"11px\",\n maxWidth: \"min(380px, calc(100vw - 24px))\",\n maxHeight: \"min(500px, calc(100vh - 24px))\",\n overflow: \"auto\",\n boxShadow: \"0 4px 20px rgba(0,0,0,0.5)\",\n display: defaultOpen ? \"block\" : \"none\",\n });\n\n // Header\n const header = document.createElement(\"div\");\n Object.assign(header.style, {\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n marginBottom: \"8px\",\n });\n const titleEl = document.createElement(\"strong\");\n titleEl.style.color = S.accent;\n titleEl.textContent =\n systemName === \"default\"\n ? \"Directive DevTools\"\n : `DevTools (${systemName})`;\n const closeBtn = document.createElement(\"button\");\n closeBtn.setAttribute(\"aria-label\", \"Close DevTools\");\n Object.assign(closeBtn.style, {\n background: \"none\",\n border: \"none\",\n color: S.closeBtn,\n cursor: \"pointer\",\n fontSize: \"16px\",\n padding: \"8px 12px\",\n minWidth: \"44px\",\n minHeight: \"44px\",\n lineHeight: \"1\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n });\n closeBtn.textContent = \"\\u00D7\";\n header.appendChild(titleEl);\n header.appendChild(closeBtn);\n container.appendChild(header);\n\n // Status\n const statusRow = document.createElement(\"div\");\n statusRow.style.marginBottom = \"6px\";\n statusRow.setAttribute(\"aria-live\", \"polite\");\n const statusEl = document.createElement(\"span\");\n statusEl.style.color = S.green;\n statusEl.textContent = \"Settled\";\n statusRow.appendChild(statusEl);\n container.appendChild(statusRow);\n\n // Time-travel controls — 44px touch targets (M6)\n const historySection = document.createElement(\"div\");\n Object.assign(historySection.style, {\n display: \"none\",\n marginBottom: \"8px\",\n padding: \"4px 8px\",\n background: \"#252545\",\n borderRadius: \"4px\",\n alignItems: \"center\",\n gap: \"6px\",\n });\n const undoBtn = document.createElement(\"button\");\n Object.assign(undoBtn.style, {\n background: \"none\",\n border: `1px solid ${S.border}`,\n color: S.text,\n cursor: \"pointer\",\n padding: \"4px 10px\",\n borderRadius: \"3px\",\n fontFamily: S.font,\n fontSize: \"11px\",\n minWidth: \"44px\",\n minHeight: \"44px\",\n });\n undoBtn.textContent = \"\\u25C0 Undo\";\n undoBtn.disabled = true;\n const redoBtn = document.createElement(\"button\");\n Object.assign(redoBtn.style, {\n background: \"none\",\n border: `1px solid ${S.border}`,\n color: S.text,\n cursor: \"pointer\",\n padding: \"4px 10px\",\n borderRadius: \"3px\",\n fontFamily: S.font,\n fontSize: \"11px\",\n minWidth: \"44px\",\n minHeight: \"44px\",\n });\n redoBtn.textContent = \"Redo \\u25B6\";\n redoBtn.disabled = true;\n const historyLabel = document.createElement(\"span\");\n historyLabel.style.color = S.muted;\n historyLabel.style.fontSize = \"10px\";\n historySection.appendChild(undoBtn);\n historySection.appendChild(redoBtn);\n historySection.appendChild(historyLabel);\n container.appendChild(historySection);\n\n // Helper: create table section\n function createTableSection(label: string, open: boolean) {\n const details = document.createElement(\"details\");\n if (open) {\n details.open = true;\n }\n details.style.marginBottom = \"4px\";\n const summary = document.createElement(\"summary\");\n Object.assign(summary.style, {\n cursor: \"pointer\",\n color: S.accent,\n marginBottom: \"4px\",\n });\n const countSpan = document.createElement(\"span\");\n summary.textContent = `${label} (`;\n summary.appendChild(countSpan);\n summary.appendChild(document.createTextNode(\")\"));\n countSpan.textContent = \"0\";\n details.appendChild(summary);\n\n const table = document.createElement(\"table\");\n Object.assign(table.style, {\n width: \"100%\",\n borderCollapse: \"collapse\",\n fontSize: \"11px\",\n });\n const thead = document.createElement(\"thead\");\n const headRow = document.createElement(\"tr\");\n for (const col of [\"Key\", \"Value\"]) {\n const th = document.createElement(\"th\");\n th.scope = \"col\";\n Object.assign(th.style, {\n textAlign: \"left\",\n padding: \"2px 4px\",\n color: S.accent,\n });\n th.textContent = col;\n headRow.appendChild(th);\n }\n thead.appendChild(headRow);\n table.appendChild(thead);\n const tbody = document.createElement(\"tbody\");\n table.appendChild(tbody);\n details.appendChild(table);\n\n return { details, tbody, countSpan };\n }\n\n // Helper: create list section with empty state\n function createListSection(label: string, color: string) {\n const details = document.createElement(\"details\");\n details.style.marginBottom = \"4px\";\n const summary = document.createElement(\"summary\");\n Object.assign(summary.style, {\n cursor: \"pointer\",\n color,\n marginBottom: \"4px\",\n });\n const countSpan = document.createElement(\"span\");\n summary.textContent = `${label} (`;\n summary.appendChild(countSpan);\n summary.appendChild(document.createTextNode(\")\"));\n countSpan.textContent = \"0\";\n details.appendChild(summary);\n const list = document.createElement(\"ul\");\n Object.assign(list.style, { margin: \"0\", paddingLeft: \"16px\" });\n details.appendChild(list);\n\n return { details, list, countSpan };\n }\n\n // Facts section\n const factsSection = createTableSection(\"Facts\", true);\n container.appendChild(factsSection.details);\n\n // Derivations section (always visible, shows empty state E1)\n const derivSection = createTableSection(\"Derivations\", false);\n container.appendChild(derivSection.details);\n\n // Inflight section\n const inflightSection = createListSection(\"Inflight\", S.yellow);\n container.appendChild(inflightSection.details);\n\n // Unmet section\n const unmetSection = createListSection(\"Unmet\", S.red);\n container.appendChild(unmetSection.details);\n\n // Performance section\n const perfDetails = document.createElement(\"details\");\n perfDetails.style.marginBottom = \"4px\";\n const perfSummary = document.createElement(\"summary\");\n Object.assign(perfSummary.style, {\n cursor: \"pointer\",\n color: S.accent,\n marginBottom: \"4px\",\n });\n perfSummary.textContent = \"Performance\";\n perfDetails.appendChild(perfSummary);\n const perfBody = document.createElement(\"div\");\n perfBody.style.fontSize = \"10px\";\n perfBody.style.color = S.muted;\n perfBody.textContent = \"No data yet\";\n perfDetails.appendChild(perfBody);\n container.appendChild(perfDetails);\n\n // Flow diagram section (I2: full dependency graph)\n const flowDetails = document.createElement(\"details\");\n flowDetails.style.marginBottom = \"4px\";\n const flowSummary = document.createElement(\"summary\");\n Object.assign(flowSummary.style, {\n cursor: \"pointer\",\n color: S.accent,\n marginBottom: \"4px\",\n });\n flowSummary.textContent = \"Dependency Graph\";\n flowDetails.appendChild(flowSummary);\n const flowSvg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n flowSvg.setAttribute(\"width\", \"100%\");\n flowSvg.setAttribute(\"height\", \"120\");\n flowSvg.setAttribute(\"role\", \"img\");\n flowSvg.setAttribute(\"aria-label\", \"System dependency graph\");\n flowSvg.style.display = \"block\";\n // E7: Responsive — use viewBox so SVG scales\n flowSvg.setAttribute(\"viewBox\", \"0 0 460 120\");\n flowSvg.setAttribute(\"preserveAspectRatio\", \"xMinYMin meet\");\n flowDetails.appendChild(flowSvg);\n container.appendChild(flowDetails);\n\n // I1: Timeline/Flamechart section\n const timelineDetails = document.createElement(\"details\");\n timelineDetails.style.marginBottom = \"4px\";\n const timelineSummary = document.createElement(\"summary\");\n Object.assign(timelineSummary.style, {\n cursor: \"pointer\",\n color: S.accent,\n marginBottom: \"4px\",\n });\n timelineSummary.textContent = \"Timeline\";\n timelineDetails.appendChild(timelineSummary);\n const timelineSvg = document.createElementNS(\n \"http://www.w3.org/2000/svg\",\n \"svg\",\n );\n timelineSvg.setAttribute(\"width\", \"100%\");\n timelineSvg.setAttribute(\"height\", \"60\");\n timelineSvg.setAttribute(\"role\", \"img\");\n timelineSvg.setAttribute(\"aria-label\", \"Resolver execution timeline\");\n timelineSvg.style.display = \"block\";\n timelineSvg.setAttribute(\"viewBox\", `0 0 ${TIMELINE_SVG_W} 60`);\n timelineSvg.setAttribute(\"preserveAspectRatio\", \"xMinYMin meet\");\n const timelineEmpty = document.createElementNS(\n \"http://www.w3.org/2000/svg\",\n \"text\",\n );\n timelineEmpty.setAttribute(\"x\", String(TIMELINE_SVG_W / 2));\n timelineEmpty.setAttribute(\"y\", \"30\");\n timelineEmpty.setAttribute(\"text-anchor\", \"middle\");\n timelineEmpty.setAttribute(\"fill\", S.muted);\n timelineEmpty.setAttribute(\"font-size\", \"10\");\n timelineEmpty.setAttribute(\"font-family\", S.font);\n timelineEmpty.textContent = \"No resolver activity yet\";\n timelineSvg.appendChild(timelineEmpty);\n timelineDetails.appendChild(timelineSvg);\n container.appendChild(timelineDetails);\n\n // Events section\n let eventsSection: HTMLDetailsElement;\n let eventsList: HTMLDivElement;\n let eventsCount: HTMLSpanElement;\n let traceHint: HTMLDivElement;\n\n if (showEvents) {\n const evDetails = document.createElement(\"details\");\n evDetails.style.marginBottom = \"4px\";\n const evSummary = document.createElement(\"summary\");\n Object.assign(evSummary.style, {\n cursor: \"pointer\",\n color: S.accent,\n marginBottom: \"4px\",\n });\n eventsCount = document.createElement(\"span\");\n eventsCount.textContent = \"0\";\n evSummary.textContent = \"Events (\";\n evSummary.appendChild(eventsCount);\n evSummary.appendChild(document.createTextNode(\")\"));\n evDetails.appendChild(evSummary);\n eventsList = document.createElement(\"div\");\n Object.assign(eventsList.style, {\n maxHeight: \"150px\",\n overflow: \"auto\",\n fontSize: \"10px\",\n });\n eventsList.setAttribute(\"role\", \"log\");\n eventsList.setAttribute(\"aria-live\", \"polite\");\n eventsList.tabIndex = 0;\n // E2: Empty state for events\n const waitingMsg = document.createElement(\"div\");\n waitingMsg.style.color = S.muted;\n waitingMsg.style.padding = \"4px\";\n waitingMsg.textContent = \"Waiting for events...\";\n waitingMsg.className = \"dt-events-empty\";\n eventsList.appendChild(waitingMsg);\n evDetails.appendChild(eventsList);\n container.appendChild(evDetails);\n eventsSection = evDetails;\n traceHint = document.createElement(\"div\");\n } else {\n eventsSection = document.createElement(\"details\");\n eventsList = document.createElement(\"div\");\n eventsCount = document.createElement(\"span\");\n // E13: Trace hint when trace is off\n traceHint = document.createElement(\"div\");\n traceHint.style.fontSize = \"10px\";\n traceHint.style.color = S.muted;\n traceHint.style.marginTop = \"4px\";\n traceHint.style.fontStyle = \"italic\";\n traceHint.textContent = \"Enable trace: true for event log\";\n container.appendChild(traceHint);\n }\n\n // Record & export buttons (I3)\n const recordRow = document.createElement(\"div\");\n Object.assign(recordRow.style, {\n display: \"flex\",\n gap: \"6px\",\n marginTop: \"6px\",\n });\n const recordBtn = document.createElement(\"button\");\n Object.assign(recordBtn.style, {\n background: \"none\",\n border: `1px solid ${S.border}`,\n color: S.text,\n cursor: \"pointer\",\n padding: \"8px 12px\",\n borderRadius: \"3px\",\n fontFamily: S.font,\n fontSize: \"10px\",\n minWidth: \"44px\",\n minHeight: \"44px\",\n });\n recordBtn.textContent = \"\\u23FA Record\";\n const exportBtn = document.createElement(\"button\");\n Object.assign(exportBtn.style, {\n background: \"none\",\n border: `1px solid ${S.border}`,\n color: S.text,\n cursor: \"pointer\",\n padding: \"8px 12px\",\n borderRadius: \"3px\",\n fontFamily: S.font,\n fontSize: \"10px\",\n minWidth: \"44px\",\n minHeight: \"44px\",\n });\n exportBtn.textContent = \"\\u2913 Export\";\n recordRow.appendChild(recordBtn);\n recordRow.appendChild(exportBtn);\n container.appendChild(recordRow);\n\n // E4: Scroll isolation — prevent page scroll when scrolling within panel\n container.addEventListener(\n \"wheel\",\n (e: WheelEvent) => {\n const el = container;\n const atTop = el.scrollTop === 0 && e.deltaY < 0;\n const atBottom =\n el.scrollTop + el.clientHeight >= el.scrollHeight && e.deltaY > 0;\n if (atTop || atBottom) {\n e.preventDefault();\n }\n },\n { passive: false },\n );\n\n // Open/close logic\n let panelOpen = defaultOpen;\n const flashTimers = new Set<ReturnType<typeof setTimeout>>();\n\n function open() {\n panelOpen = true;\n container.style.display = \"block\";\n toggleBtn.style.display = \"none\";\n toggleBtn.setAttribute(\"aria-expanded\", \"true\");\n closeBtn.focus();\n }\n\n function close() {\n panelOpen = false;\n container.style.display = \"none\";\n toggleBtn.style.display = \"block\";\n toggleBtn.setAttribute(\"aria-expanded\", \"false\");\n toggleBtn.focus();\n }\n\n toggleBtn.addEventListener(\"click\", open);\n closeBtn.addEventListener(\"click\", close);\n\n function onKeyDown(e: KeyboardEvent) {\n if (e.key === \"Escape\" && panelOpen) {\n close();\n }\n }\n container.addEventListener(\"keydown\", onKeyDown);\n\n // Global keyboard shortcut Ctrl+Shift+D / Cmd+Shift+D\n function onGlobalKeyDown(e: KeyboardEvent) {\n if (e.key === \"d\" && e.shiftKey && (e.ctrlKey || e.metaKey)) {\n e.preventDefault();\n if (panelOpen) {\n close();\n } else {\n open();\n }\n }\n }\n document.addEventListener(\"keydown\", onGlobalKeyDown);\n\n // Mount — guard document.body (M1)\n function mount() {\n if (destroyed) {\n return;\n }\n document.body.appendChild(toggleBtn);\n document.body.appendChild(container);\n }\n\n if (document.body) {\n mount();\n } else {\n // Store reference for cleanup\n document.addEventListener(\"DOMContentLoaded\", mount, { once: true });\n }\n\n function destroy() {\n destroyed = true;\n toggleBtn.removeEventListener(\"click\", open);\n closeBtn.removeEventListener(\"click\", close);\n container.removeEventListener(\"keydown\", onKeyDown);\n document.removeEventListener(\"keydown\", onGlobalKeyDown);\n // Clean up DOMContentLoaded listener in case body wasn't ready\n document.removeEventListener(\"DOMContentLoaded\", mount);\n for (const id of flashTimers) {\n clearTimeout(id);\n }\n flashTimers.clear();\n toggleBtn.remove();\n container.remove();\n styleEl.remove();\n }\n\n return {\n refs: {\n container,\n toggleBtn,\n titleEl,\n statusEl,\n factsBody: factsSection.tbody,\n factsCount: factsSection.countSpan,\n derivBody: derivSection.tbody,\n derivCount: derivSection.countSpan,\n derivSection: derivSection.details,\n inflightList: inflightSection.list,\n inflightSection: inflightSection.details,\n inflightCount: inflightSection.countSpan,\n unmetList: unmetSection.list,\n unmetSection: unmetSection.details,\n unmetCount: unmetSection.countSpan,\n perfSection: perfDetails,\n perfBody,\n historySection,\n historyLabel,\n undoBtn,\n redoBtn,\n flowSection: flowDetails,\n flowSvg,\n timelineSection: timelineDetails,\n timelineSvg,\n eventsSection,\n eventsList,\n eventsCount,\n traceHint,\n recordBtn,\n exportBtn,\n },\n destroy,\n isOpen: () => panelOpen,\n flashTimers,\n };\n}\n\n// ============================================================================\n// Panel Update Helpers\n// ============================================================================\n\n/** @internal Upsert a key/value row in a panel table. */\nexport function upsertTableRow(\n rowMap: Map<string, HTMLTableRowElement>,\n tbody: HTMLTableSectionElement,\n key: string,\n value: unknown,\n flash: boolean,\n flashTimers?: Set<ReturnType<typeof setTimeout>>,\n) {\n const display = formatValue(value);\n let row = rowMap.get(key);\n\n if (row) {\n const cells = row.cells;\n if (cells[1]) {\n cells[1].textContent = display;\n if (flash && flashTimers) {\n const cell = cells[1];\n cell.style.background = \"rgba(139, 154, 255, 0.25)\";\n const tid = setTimeout(() => {\n cell.style.background = \"\";\n flashTimers.delete(tid);\n }, 300);\n flashTimers.add(tid);\n }\n }\n } else {\n row = document.createElement(\"tr\");\n row.style.borderBottom = `1px solid ${S.rowBorder}`;\n const keyCell = document.createElement(\"td\");\n Object.assign(keyCell.style, { padding: \"2px 4px\", color: S.muted });\n keyCell.textContent = key;\n const valCell = document.createElement(\"td\");\n valCell.style.padding = \"2px 4px\";\n valCell.textContent = display;\n row.appendChild(keyCell);\n row.appendChild(valCell);\n tbody.appendChild(row);\n rowMap.set(key, row);\n }\n}\n\n/** @internal Remove a key/value row from a panel table. */\nexport function removeTableRow(\n rowMap: Map<string, HTMLTableRowElement>,\n key: string,\n) {\n const row = rowMap.get(key);\n if (row) {\n row.remove();\n rowMap.delete(key);\n }\n}\n\n/** @internal Render inflight and unmet requirement lists. */\nexport function renderRequirements(\n refs: PanelRefs,\n inflight: Array<{ id: string; resolverId: string; startedAt: number }>,\n unmet: Array<{\n id: string;\n requirement: { type: string };\n fromConstraint: string;\n }>,\n) {\n refs.inflightList.replaceChildren();\n refs.inflightCount.textContent = String(inflight.length);\n if (inflight.length > 0) {\n for (const r of inflight) {\n const li = document.createElement(\"li\");\n li.style.fontSize = \"11px\";\n li.textContent = `${r.resolverId} (${r.id})`;\n refs.inflightList.appendChild(li);\n }\n } else {\n const li = document.createElement(\"li\");\n li.style.fontSize = \"10px\";\n li.style.color = S.muted;\n li.textContent = \"None\";\n refs.inflightList.appendChild(li);\n }\n\n refs.unmetList.replaceChildren();\n refs.unmetCount.textContent = String(unmet.length);\n if (unmet.length > 0) {\n for (const r of unmet) {\n const li = document.createElement(\"li\");\n li.style.fontSize = \"11px\";\n li.textContent = `${r.requirement.type} from ${r.fromConstraint}`;\n refs.unmetList.appendChild(li);\n }\n } else {\n const li = document.createElement(\"li\");\n li.style.fontSize = \"10px\";\n li.style.color = S.muted;\n li.textContent = \"None\";\n refs.unmetList.appendChild(li);\n }\n}\n\n/** @internal Render the settled/working status indicator. */\nexport function renderStatus(\n refs: PanelRefs,\n inflightCount: number,\n unmetCount: number,\n) {\n const isSettled = inflightCount === 0 && unmetCount === 0;\n refs.statusEl.style.color = isSettled ? S.green : S.yellow;\n refs.statusEl.textContent = isSettled ? \"Settled\" : \"Working...\";\n refs.toggleBtn.textContent = isSettled ? \"Directive\" : \"Directive...\";\n refs.toggleBtn.setAttribute(\n \"aria-label\",\n `Open Directive DevTools${isSettled ? \"\" : \" (system working)\"}`,\n );\n}\n\n/** @internal Refresh derivation rows in the devtools panel. */\nexport function updateDerivations(\n refs: PanelRefs,\n derivRowMap: Map<string, HTMLTableRowElement>,\n system: System<ModuleSchema>,\n flashTimers?: Set<ReturnType<typeof setTimeout>>,\n) {\n const derivationKeys = Object.keys(system.derive);\n refs.derivCount.textContent = String(derivationKeys.length);\n\n // E1: Show empty state instead of hiding\n if (derivationKeys.length === 0) {\n derivRowMap.clear();\n refs.derivBody.replaceChildren();\n const row = document.createElement(\"tr\");\n const cell = document.createElement(\"td\");\n cell.colSpan = 2;\n cell.style.color = S.muted;\n cell.style.fontSize = \"10px\";\n cell.textContent = \"No derivations defined\";\n row.appendChild(cell);\n refs.derivBody.appendChild(row);\n\n return;\n }\n\n // Remove stale rows (E6: use Set for O(1) lookup)\n const keySet = new Set(derivationKeys);\n for (const [key, row] of derivRowMap) {\n if (!keySet.has(key)) {\n row.remove();\n derivRowMap.delete(key);\n }\n }\n\n // Update/add rows (E5: flash on derivation change)\n for (const key of derivationKeys) {\n let display: string;\n try {\n display = formatValue(system.read(key));\n } catch {\n display = \"<error>\";\n }\n upsertTableRow(\n derivRowMap,\n refs.derivBody,\n key,\n display,\n true,\n flashTimers,\n );\n }\n}\n\n/** @internal Append an event entry to the devtools event log. */\nexport function addEventRow(\n refs: PanelRefs,\n type: string,\n data: unknown,\n eventCount: number,\n) {\n // Clear \"Waiting for events...\" placeholder on first event\n const empty = refs.eventsList.querySelector(\".dt-events-empty\");\n if (empty) {\n empty.remove();\n }\n\n const row = document.createElement(\"div\");\n Object.assign(row.style, {\n padding: \"2px 4px\",\n borderBottom: `1px solid ${S.rowBorder}`,\n fontFamily: \"inherit\",\n });\n const now = new Date();\n const 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 let preview: string;\n try {\n const str = JSON.stringify(data);\n preview = truncate(str, 60);\n } catch {\n preview = \"{}\";\n }\n\n const timeSpan = document.createElement(\"span\");\n timeSpan.style.color = S.closeBtn;\n timeSpan.textContent = time;\n\n const typeSpan = document.createElement(\"span\");\n typeSpan.style.color = S.accent;\n typeSpan.textContent = ` ${type} `;\n\n const previewSpan = document.createElement(\"span\");\n previewSpan.style.color = S.muted;\n previewSpan.textContent = preview;\n\n row.appendChild(timeSpan);\n row.appendChild(typeSpan);\n row.appendChild(previewSpan);\n\n refs.eventsList.prepend(row);\n\n // Cap visible events\n while (refs.eventsList.childElementCount > MAX_PANEL_EVENTS) {\n refs.eventsList.lastElementChild?.remove();\n }\n\n refs.eventsCount.textContent = String(eventCount);\n}\n\n/** @internal Render performance metrics in the devtools panel. */\nexport function updatePerfSection(refs: PanelRefs, perf: PerfMetrics) {\n refs.perfBody.replaceChildren();\n\n const avgReconcile =\n perf.reconcileCount > 0\n ? (perf.reconcileTotalMs / perf.reconcileCount).toFixed(1)\n : \"\\u2014\";\n\n const lines: string[] = [\n `Reconciles: ${perf.reconcileCount} (avg ${avgReconcile}ms)`,\n `Effects: ${perf.effectRunCount} run, ${perf.effectErrorCount} errors`,\n ];\n\n for (const line of lines) {\n const div = document.createElement(\"div\");\n div.style.marginBottom = \"2px\";\n div.textContent = line;\n refs.perfBody.appendChild(div);\n }\n\n if (perf.resolverStats.size > 0) {\n const resolverHeader = document.createElement(\"div\");\n resolverHeader.style.marginTop = \"4px\";\n resolverHeader.style.marginBottom = \"2px\";\n resolverHeader.style.color = S.accent;\n resolverHeader.textContent = \"Resolvers:\";\n refs.perfBody.appendChild(resolverHeader);\n\n const sorted = [...perf.resolverStats.entries()].sort(\n (a, b) => b[1].totalMs - a[1].totalMs,\n );\n for (const [id, stats] of sorted) {\n const avg =\n stats.count > 0 ? (stats.totalMs / stats.count).toFixed(1) : \"0\";\n const div = document.createElement(\"div\");\n div.style.paddingLeft = \"8px\";\n div.textContent = `${id}: ${stats.count}x, avg ${avg}ms${stats.errors > 0 ? `, ${stats.errors} err` : \"\"}`;\n if (stats.errors > 0) {\n div.style.color = S.red;\n }\n refs.perfBody.appendChild(div);\n }\n }\n}\n\n/** @internal Update time-travel button states and snapshot label. */\nexport function updateHistoryControls(\n refs: PanelRefs,\n system: System<ModuleSchema>,\n) {\n const tt = system.history;\n if (!tt) {\n refs.historySection.style.display = \"none\";\n\n return;\n }\n refs.historySection.style.display = \"flex\";\n\n const current = tt.currentIndex;\n const total = tt.snapshots.length;\n refs.historyLabel.textContent =\n total > 0 ? `${current + 1} / ${total}` : \"0 snapshots\";\n\n const canUndo = current > 0;\n const canRedo = current < total - 1;\n refs.undoBtn.disabled = !canUndo;\n refs.undoBtn.style.opacity = canUndo ? \"1\" : \"0.4\";\n refs.redoBtn.disabled = !canRedo;\n refs.redoBtn.style.opacity = canRedo ? \"1\" : \"0.4\";\n}\n\n/** @internal Wire click handlers for undo/redo time-travel buttons. */\nexport function setupHistoryButtons(\n refs: PanelRefs,\n system: System<ModuleSchema>,\n) {\n refs.undoBtn.addEventListener(\"click\", () => {\n if (system.history && system.history.currentIndex > 0) {\n system.history.goBack(1);\n }\n });\n refs.redoBtn.addEventListener(\"click\", () => {\n if (\n system.history &&\n system.history.currentIndex < system.history.snapshots.length - 1\n ) {\n system.history.goForward(1);\n }\n });\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 type DepGraph,\n FLOW,\n type PanelRefs,\n S,\n TIMELINE_BAR_MIN_W,\n TIMELINE_COLORS,\n TIMELINE_LABEL_W,\n TIMELINE_ROW_H,\n TIMELINE_SVG_W,\n type TimelineState,\n safeInspect,\n truncate,\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 g: SVGGElement;\n rect: SVGRectElement;\n text: SVGTextElement;\n}\n\ninterface GraphCache {\n fingerprint: string;\n nodes: 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 factKeys: string[],\n derivKeys: string[],\n constraints: Array<{ id: string; active: boolean }>,\n reqMap: Map<string, { type: string; status: string }>,\n resolverIds: string[],\n activeResolverIds: string[],\n): string {\n return [\n factKeys.join(\",\"),\n derivKeys.join(\",\"),\n constraints.map((c) => `${c.id}:${c.active}`).join(\",\"),\n [...reqMap.entries()]\n .map(([id, r]) => `${id}:${r.status}:${r.type}`)\n .join(\",\"),\n resolverIds.join(\",\"),\n activeResolverIds.join(\",\"),\n ].join(\"|\");\n}\n\n/** Update only animation attributes (pulsing) on cached node elements. */\nfunction updateAnimationAttrs(\n cache: GraphCache,\n depGraph: DepGraph,\n factKeys: string[],\n derivKeys: string[],\n constraintIds: string[],\n) {\n for (const key of factKeys) {\n const node = cache.nodes.get(`0:${key}`);\n if (!node) {\n continue;\n }\n const pulsing = depGraph.recentlyChangedFacts.has(key);\n node.rect.setAttribute(\"fill\", pulsing ? S.text + \"33\" : \"none\");\n node.rect.setAttribute(\"stroke-width\", pulsing ? \"2\" : \"1\");\n }\n for (const key of derivKeys) {\n const node = cache.nodes.get(`1:${key}`);\n if (!node) {\n continue;\n }\n const pulsing = depGraph.recentlyComputedDerivations.has(key);\n node.rect.setAttribute(\"fill\", pulsing ? S.accent + \"33\" : \"none\");\n node.rect.setAttribute(\"stroke-width\", pulsing ? \"2\" : \"1\");\n }\n for (const id of constraintIds) {\n const node = cache.nodes.get(`2:${id}`);\n if (!node) {\n continue;\n }\n const pulsing = depGraph.recentlyActiveConstraints.has(id);\n // Active constraints use S.yellow, inactive use S.muted — these are part of the fingerprint,\n // so the color is already correct. Only update pulsing fill and stroke-width.\n const color = node.rect.getAttribute(\"stroke\") ?? S.muted;\n node.rect.setAttribute(\"fill\", pulsing ? color + \"33\" : \"none\");\n node.rect.setAttribute(\"stroke-width\", pulsing ? \"2\" : \"1\");\n }\n}\n\n// ============================================================================\n// Full Dependency Graph (facts→derivations→constraints→reqs→resolvers)\n// ============================================================================\n\n/** @internal Rebuild the full dependency graph SVG from current system state. */\nexport function updateDependencyGraph(\n refs: PanelRefs,\n system: System<ModuleSchema>,\n depGraph: DepGraph,\n) {\n const inspection = safeInspect(system);\n if (!inspection) {\n return;\n }\n\n // Collect all nodes\n let factKeys: string[];\n try {\n factKeys = Object.keys(system.facts.$store.toObject());\n } catch {\n factKeys = [];\n }\n const derivKeys = Object.keys(system.derive);\n const allConstraints = inspection.constraints;\n const unmetReqs = inspection.unmet;\n const inflightReqs = inspection.inflight;\n const resolverIds = Object.keys(inspection.resolvers);\n\n // Build requirement map\n const reqMap = new Map<\n string,\n { type: string; fromConstraint: string; status: string }\n >();\n for (const u of unmetReqs) {\n reqMap.set(u.id, {\n type: u.requirement.type,\n fromConstraint: u.fromConstraint,\n status: \"unmet\",\n });\n }\n for (const f of inflightReqs) {\n reqMap.set(f.id, {\n type: f.resolverId,\n fromConstraint: \"\",\n status: \"inflight\",\n });\n }\n\n // If nothing to show at all\n if (\n factKeys.length === 0 &&\n derivKeys.length === 0 &&\n allConstraints.length === 0 &&\n resolverIds.length === 0\n ) {\n graphCaches.delete(refs.flowSvg);\n refs.flowSvg.replaceChildren();\n refs.flowSvg.setAttribute(\"viewBox\", \"0 0 460 40\");\n const text = document.createElementNS(\"http://www.w3.org/2000/svg\", \"text\");\n text.setAttribute(\"x\", \"230\");\n text.setAttribute(\"y\", \"24\");\n text.setAttribute(\"text-anchor\", \"middle\");\n text.setAttribute(\"fill\", S.muted);\n text.setAttribute(\"font-size\", \"10\");\n text.setAttribute(\"font-family\", S.font);\n text.textContent = \"No system topology\";\n refs.flowSvg.appendChild(text);\n\n return;\n }\n\n // Check fingerprint — skip full rebuild if topology unchanged\n const activeResolverIds = inflightReqs.map((f) => f.resolverId).sort();\n const fingerprint = computeFingerprint(\n factKeys,\n derivKeys,\n allConstraints,\n reqMap,\n resolverIds,\n activeResolverIds,\n );\n\n const existingCache = graphCaches.get(refs.flowSvg);\n if (existingCache && existingCache.fingerprint === fingerprint) {\n // Topology unchanged — only update pulsing animation attributes\n updateAnimationAttrs(\n existingCache,\n depGraph,\n factKeys,\n derivKeys,\n allConstraints.map((c) => c.id),\n );\n\n return;\n }\n\n // Full rebuild — topology changed\n const colW = FLOW.nodeW + FLOW.colGap;\n const colX: [number, number, number, number, number] = [\n 5,\n 5 + colW,\n 5 + colW * 2,\n 5 + colW * 3,\n 5 + colW * 4,\n ];\n const totalW = colX[4] + FLOW.nodeW + 5;\n\n function layoutColumn<T>(items: T[]): Array<T & { y: number }> {\n let y = FLOW.startY + 12;\n\n return items.map((item) => {\n const node = { ...item, y };\n y += FLOW.nodeH + FLOW.nodeGap;\n\n return node;\n });\n }\n\n const factNodes = layoutColumn(\n factKeys.map((k) => ({ id: k, label: truncate(k, FLOW.labelMaxChars) })),\n );\n const derivNodes = layoutColumn(\n derivKeys.map((k) => ({ id: k, label: truncate(k, FLOW.labelMaxChars) })),\n );\n const constraintNodes = layoutColumn(\n allConstraints.map((c) => ({\n id: c.id,\n label: truncate(c.id, FLOW.labelMaxChars),\n active: c.active,\n priority: c.priority,\n })),\n );\n const reqNodeArr = layoutColumn(\n [...reqMap.entries()].map(([id, r]) => ({\n id,\n type: r.type,\n fromConstraint: r.fromConstraint,\n status: r.status,\n })),\n );\n const resolverNodeArr = layoutColumn(\n resolverIds.map((id) => ({ id, label: truncate(id, FLOW.labelMaxChars) })),\n );\n\n const maxRows = Math.max(\n factNodes.length,\n derivNodes.length,\n constraintNodes.length,\n reqNodeArr.length,\n resolverNodeArr.length,\n 1,\n );\n const totalH = FLOW.startY + 12 + maxRows * (FLOW.nodeH + FLOW.nodeGap) + 8;\n\n refs.flowSvg.replaceChildren();\n refs.flowSvg.setAttribute(\"viewBox\", `0 0 ${totalW} ${totalH}`);\n\n refs.flowSvg.setAttribute(\n \"aria-label\",\n `Dependency graph: ${factKeys.length} facts, ${derivKeys.length} derivations, ` +\n `${allConstraints.length} constraints, ${reqMap.size} requirements, ${resolverIds.length} resolvers`,\n );\n\n // Draw column headers\n const headers = [\"Facts\", \"Derivations\", \"Constraints\", \"Reqs\", \"Resolvers\"];\n for (const [i, label] of headers.entries()) {\n const text = document.createElementNS(\"http://www.w3.org/2000/svg\", \"text\");\n text.setAttribute(\"x\", String(colX[i] ?? 0));\n text.setAttribute(\"y\", \"10\");\n text.setAttribute(\"fill\", S.accent);\n text.setAttribute(\"font-size\", String(FLOW.fontSize));\n text.setAttribute(\"font-family\", S.font);\n text.textContent = label;\n refs.flowSvg.appendChild(text);\n }\n\n // Cache for diff-based updates on subsequent calls\n const newCache: GraphCache = { fingerprint, nodes: new Map() };\n\n // SVG helpers\n function drawNode(\n col: number,\n x: number,\n cy: number,\n nodeId: string,\n label: string,\n color: string,\n dimmed: boolean,\n pulsing: boolean,\n ) {\n const g = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n const rect = document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\n rect.setAttribute(\"x\", String(x));\n rect.setAttribute(\"y\", String(cy - 6));\n rect.setAttribute(\"width\", String(FLOW.nodeW));\n rect.setAttribute(\"height\", String(FLOW.nodeH));\n rect.setAttribute(\"rx\", \"3\");\n rect.setAttribute(\"fill\", pulsing ? color + \"33\" : \"none\");\n rect.setAttribute(\"stroke\", color);\n rect.setAttribute(\"stroke-width\", pulsing ? \"2\" : \"1\");\n rect.setAttribute(\"opacity\", dimmed ? \"0.35\" : \"1\");\n g.appendChild(rect);\n\n const text = document.createElementNS(\"http://www.w3.org/2000/svg\", \"text\");\n text.setAttribute(\"x\", String(x + 4));\n text.setAttribute(\"y\", String(cy + 4));\n text.setAttribute(\"fill\", color);\n text.setAttribute(\"font-size\", String(FLOW.fontSize));\n text.setAttribute(\"font-family\", S.font);\n text.setAttribute(\"opacity\", dimmed ? \"0.35\" : \"1\");\n text.textContent = label;\n g.appendChild(text);\n\n refs.flowSvg.appendChild(g);\n\n // Cache node for animation-only updates\n newCache.nodes.set(`${col}:${nodeId}`, { g, rect, text });\n\n return { midX: x + FLOW.nodeW / 2, midY: cy };\n }\n\n function drawEdge(\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n color: string,\n dimmed: boolean,\n ) {\n const line = document.createElementNS(\"http://www.w3.org/2000/svg\", \"line\");\n line.setAttribute(\"x1\", String(x1));\n line.setAttribute(\"y1\", String(y1));\n line.setAttribute(\"x2\", String(x2));\n line.setAttribute(\"y2\", String(y2));\n line.setAttribute(\"stroke\", color);\n line.setAttribute(\"stroke-width\", \"1\");\n line.setAttribute(\"stroke-dasharray\", \"3,2\");\n line.setAttribute(\"opacity\", dimmed ? \"0.2\" : \"0.7\");\n refs.flowSvg.appendChild(line);\n }\n\n // Position maps\n const factPositions = new Map<string, { midX: number; midY: number }>();\n const derivPositions = new Map<string, { midX: number; midY: number }>();\n const constraintPositions = new Map<string, { midX: number; midY: number }>();\n const reqPositions = new Map<string, { midX: number; midY: number }>();\n\n // Draw fact nodes\n for (const f of factNodes) {\n const pulsing = depGraph.recentlyChangedFacts.has(f.id);\n const pos = drawNode(\n 0,\n colX[0],\n f.y,\n f.id,\n f.label,\n S.text,\n false,\n pulsing,\n );\n factPositions.set(f.id, pos);\n }\n\n // Draw derivation nodes\n for (const d of derivNodes) {\n const pulsing = depGraph.recentlyComputedDerivations.has(d.id);\n const pos = drawNode(\n 1,\n colX[1],\n d.y,\n d.id,\n d.label,\n S.accent,\n false,\n pulsing,\n );\n derivPositions.set(d.id, pos);\n }\n\n // Draw constraint nodes (show ALL, dim inactive)\n for (const c of constraintNodes) {\n const pulsing = depGraph.recentlyActiveConstraints.has(c.id);\n const pos = drawNode(\n 2,\n colX[2],\n c.y,\n c.id,\n c.label,\n c.active ? S.yellow : S.muted,\n !c.active,\n pulsing,\n );\n constraintPositions.set(c.id, pos);\n }\n\n // Draw requirement nodes\n for (const r of reqNodeArr) {\n const color = r.status === \"unmet\" ? S.red : S.yellow;\n const pos = drawNode(\n 3,\n colX[3],\n r.y,\n r.id,\n truncate(r.type, FLOW.labelMaxChars),\n color,\n false,\n false,\n );\n reqPositions.set(r.id, pos);\n }\n\n // Draw resolver nodes (show ALL, dim idle)\n for (const r of resolverNodeArr) {\n const isActive = inflightReqs.some((f) => f.resolverId === r.id);\n drawNode(\n 4,\n colX[4],\n r.y,\n r.id,\n r.label,\n isActive ? S.green : S.muted,\n !isActive,\n false,\n );\n }\n\n // Edges: fact → derivation (from tracked deps)\n for (const d of derivNodes) {\n const deps = depGraph.derivationDeps.get(d.id);\n const dPos = derivPositions.get(d.id);\n if (deps && dPos) {\n for (const dep of deps) {\n const fPos = factPositions.get(dep);\n if (fPos) {\n drawEdge(\n fPos.midX + FLOW.nodeW / 2,\n fPos.midY,\n dPos.midX - FLOW.nodeW / 2,\n dPos.midY,\n S.accent,\n false,\n );\n }\n }\n }\n }\n\n // Edges: constraint → requirement\n for (const r of reqNodeArr) {\n const cPos = constraintPositions.get(r.fromConstraint);\n const rPos = reqPositions.get(r.id);\n if (cPos && rPos) {\n drawEdge(\n cPos.midX + FLOW.nodeW / 2,\n cPos.midY,\n rPos.midX - FLOW.nodeW / 2,\n rPos.midY,\n S.muted,\n false,\n );\n }\n }\n\n // Edges: requirement → resolver (for inflight)\n for (const f of inflightReqs) {\n const rPos = reqPositions.get(f.id);\n if (rPos) {\n const rn = resolverNodeArr.find((n) => n.id === f.resolverId);\n if (rn) {\n drawEdge(\n rPos.midX + FLOW.nodeW / 2,\n rPos.midY,\n colX[4],\n rn.y,\n S.green,\n false,\n );\n }\n }\n }\n\n // Store cache for next call\n graphCaches.set(refs.flowSvg, newCache);\n}\n\n/** Clear animation highlights after a brief delay */\nexport function scheduleAnimationClear(depGraph: DepGraph) {\n if (depGraph.animationTimer) {\n clearTimeout(depGraph.animationTimer);\n }\n depGraph.animationTimer = setTimeout(() => {\n depGraph.recentlyChangedFacts.clear();\n depGraph.recentlyComputedDerivations.clear();\n depGraph.recentlyActiveConstraints.clear();\n depGraph.animationTimer = null;\n }, 600);\n}\n\n// ============================================================================\n// Timeline/Flamechart Rendering\n// ============================================================================\n\n/** @internal Render the resolver execution timeline SVG. */\nexport function updateTimeline(refs: PanelRefs, timeline: TimelineState) {\n const entries = timeline.entries.toArray();\n if (entries.length === 0) {\n return;\n }\n\n refs.timelineSvg.replaceChildren();\n\n // Compute time range from visible entries\n let minMs = Number.POSITIVE_INFINITY;\n let maxMs = Number.NEGATIVE_INFINITY;\n for (const e of entries) {\n if (e.startMs < minMs) {\n minMs = e.startMs;\n }\n if (e.endMs > maxMs) {\n maxMs = e.endMs;\n }\n }\n // Also include inflight resolvers\n const now = performance.now();\n for (const startMs of timeline.inflight.values()) {\n if (startMs < minMs) {\n minMs = startMs;\n }\n if (now > maxMs) {\n maxMs = now;\n }\n }\n\n const range = maxMs - minMs || 1;\n const barAreaW = TIMELINE_SVG_W - TIMELINE_LABEL_W - 10;\n\n // Group entries by resolver for swim lanes\n const resolverOrder: string[] = [];\n const seen = new Set<string>();\n for (const e of entries) {\n if (!seen.has(e.resolver)) {\n seen.add(e.resolver);\n resolverOrder.push(e.resolver);\n }\n }\n // Also add inflight resolvers not yet completed\n for (const resolver of timeline.inflight.keys()) {\n if (!seen.has(resolver)) {\n seen.add(resolver);\n resolverOrder.push(resolver);\n }\n }\n\n // Cap visible rows\n const maxRows = 12;\n const visibleResolvers = resolverOrder.slice(-maxRows);\n const totalH = TIMELINE_ROW_H * visibleResolvers.length + 20;\n refs.timelineSvg.setAttribute(\"viewBox\", `0 0 ${TIMELINE_SVG_W} ${totalH}`);\n refs.timelineSvg.setAttribute(\"height\", String(Math.min(totalH, 200)));\n\n // Column header: time axis markers\n const markers = 5;\n for (let i = 0; i <= markers; i++) {\n const x = TIMELINE_LABEL_W + (barAreaW * i) / markers;\n const ms = (range * i) / markers;\n const text = document.createElementNS(\"http://www.w3.org/2000/svg\", \"text\");\n text.setAttribute(\"x\", String(x));\n text.setAttribute(\"y\", \"8\");\n text.setAttribute(\"fill\", S.muted);\n text.setAttribute(\"font-size\", \"6\");\n text.setAttribute(\"font-family\", S.font);\n text.setAttribute(\"text-anchor\", \"middle\");\n text.textContent =\n ms < 1000 ? `${ms.toFixed(0)}ms` : `${(ms / 1000).toFixed(1)}s`;\n refs.timelineSvg.appendChild(text);\n\n // Gridline\n const line = document.createElementNS(\"http://www.w3.org/2000/svg\", \"line\");\n line.setAttribute(\"x1\", String(x));\n line.setAttribute(\"y1\", \"10\");\n line.setAttribute(\"x2\", String(x));\n line.setAttribute(\"y2\", String(totalH));\n line.setAttribute(\"stroke\", S.border);\n line.setAttribute(\"stroke-width\", \"0.5\");\n refs.timelineSvg.appendChild(line);\n }\n\n // Draw swim lanes\n for (let row = 0; row < visibleResolvers.length; row++) {\n const resolver = visibleResolvers[row]!;\n const y = 12 + row * TIMELINE_ROW_H;\n const colorIdx = row % TIMELINE_COLORS.length;\n const color = TIMELINE_COLORS[colorIdx]!;\n\n // Label\n const label = document.createElementNS(\n \"http://www.w3.org/2000/svg\",\n \"text\",\n );\n label.setAttribute(\"x\", String(TIMELINE_LABEL_W - 4));\n label.setAttribute(\"y\", String(y + TIMELINE_ROW_H / 2 + 3));\n label.setAttribute(\"fill\", S.muted);\n label.setAttribute(\"font-size\", \"7\");\n label.setAttribute(\"font-family\", S.font);\n label.setAttribute(\"text-anchor\", \"end\");\n label.textContent = truncate(resolver, 12);\n refs.timelineSvg.appendChild(label);\n\n // Draw bars for this resolver\n const resolverEntries = entries.filter((e) => e.resolver === resolver);\n for (const entry of resolverEntries) {\n const x = TIMELINE_LABEL_W + ((entry.startMs - minMs) / range) * barAreaW;\n const w = Math.max(\n ((entry.endMs - entry.startMs) / range) * barAreaW,\n TIMELINE_BAR_MIN_W,\n );\n\n const rect = document.createElementNS(\n \"http://www.w3.org/2000/svg\",\n \"rect\",\n );\n rect.setAttribute(\"x\", String(x));\n rect.setAttribute(\"y\", String(y + 2));\n rect.setAttribute(\"width\", String(w));\n rect.setAttribute(\"height\", String(TIMELINE_ROW_H - 4));\n rect.setAttribute(\"rx\", \"2\");\n rect.setAttribute(\"fill\", entry.error ? S.red : color);\n rect.setAttribute(\"opacity\", \"0.8\");\n\n // Tooltip: duration\n const title = document.createElementNS(\n \"http://www.w3.org/2000/svg\",\n \"title\",\n );\n const durationMs = entry.endMs - entry.startMs;\n title.textContent = `${resolver}: ${durationMs.toFixed(1)}ms${entry.error ? \" (error)\" : \"\"}`;\n rect.appendChild(title);\n\n refs.timelineSvg.appendChild(rect);\n }\n\n // Draw inflight bar (animated, extending to \"now\")\n const inflightStart = timeline.inflight.get(resolver);\n if (inflightStart !== undefined) {\n const x = TIMELINE_LABEL_W + ((inflightStart - minMs) / range) * barAreaW;\n const w = Math.max(\n ((now - inflightStart) / range) * barAreaW,\n TIMELINE_BAR_MIN_W,\n );\n\n const rect = document.createElementNS(\n \"http://www.w3.org/2000/svg\",\n \"rect\",\n );\n rect.setAttribute(\"x\", String(x));\n rect.setAttribute(\"y\", String(y + 2));\n rect.setAttribute(\"width\", String(w));\n rect.setAttribute(\"height\", String(TIMELINE_ROW_H - 4));\n rect.setAttribute(\"rx\", \"2\");\n rect.setAttribute(\"fill\", color);\n rect.setAttribute(\"opacity\", \"0.4\");\n rect.setAttribute(\"stroke\", color);\n rect.setAttribute(\"stroke-width\", \"1\");\n rect.setAttribute(\"stroke-dasharray\", \"3,2\");\n\n const title = document.createElementNS(\n \"http://www.w3.org/2000/svg\",\n \"title\",\n );\n title.textContent = `${resolver}: inflight ${(now - inflightStart).toFixed(0)}ms`;\n rect.appendChild(title);\n\n refs.timelineSvg.appendChild(rect);\n }\n }\n\n // Update aria-label\n refs.timelineSvg.setAttribute(\n \"aria-label\",\n `Timeline: ${entries.length} resolver executions across ${visibleResolvers.length} resolvers`,\n );\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 {\n FactChange,\n ModuleSchema,\n Plugin,\n ReconcileResult,\n System,\n} from \"../core/types.js\";\n\n// Re-export public types\nexport type { DevtoolsPluginOptions, TraceEvent } from \"./devtools-types.js\";\n\nimport {\n CircularBuffer,\n type DevtoolsPluginOptions,\n type DevtoolsState,\n type DevtoolsSubscriber,\n MAX_RECORDED_EVENTS,\n MAX_RECORDED_SNAPSHOTS,\n MAX_RESOLVER_STATS,\n S,\n type TraceEvent,\n cloneViaJSON,\n createDepGraph,\n createPerfMetrics,\n createRecordingState,\n createTimelineState,\n isDevMode,\n safeInspect,\n validateMaxEvents,\n} from \"./devtools-types.js\";\n\nimport {\n addEventRow,\n createPanel,\n removeTableRow,\n renderRequirements,\n renderStatus,\n setupHistoryButtons,\n updateDerivations,\n updateHistoryControls,\n updatePerfSection,\n upsertTableRow,\n} from \"./devtools-panel.js\";\n\nimport {\n scheduleAnimationClear,\n updateDependencyGraph,\n updateTimeline,\n} from \"./devtools-graph.js\";\n\n// ============================================================================\n// Global Devtools Object\n// ============================================================================\n\nfunction initDevtools(): NonNullable<Window[\"__DIRECTIVE__\"]> {\n if (typeof window === \"undefined\") {\n return {\n systems: new Map(),\n getSystem: () => null,\n getSystems: () => [],\n inspect: () => null,\n getEvents: () => [],\n explain: () => null,\n exportSession: () => null,\n importSession: () => false,\n clearEvents: () => {},\n subscribe: () => () => {},\n };\n }\n\n if (!window.__DIRECTIVE__) {\n const systems = new Map<string, DevtoolsState>();\n\n const api: NonNullable<Window[\"__DIRECTIVE__\"]> = {\n systems,\n getSystem(name) {\n if (name) {\n return systems.get(name)?.system ?? null;\n }\n const first = systems.values().next().value;\n\n return first?.system ?? null;\n },\n getSystems() {\n return [...systems.keys()];\n },\n inspect(name) {\n const system = this.getSystem(name);\n const s = name ? systems.get(name) : systems.values().next().value;\n const inspection = system?.inspect() ?? null;\n if (inspection && s) {\n (inspection as unknown as Record<string, unknown>).resolverStats =\n s.resolverStats ? Object.fromEntries(s.resolverStats) : {};\n }\n\n return inspection;\n },\n getEvents(name) {\n if (name) {\n return systems.get(name)?.events.toArray() ?? [];\n }\n const first = systems.values().next().value;\n\n return first?.events.toArray() ?? [];\n },\n explain(requirementId, name) {\n const system = this.getSystem(name);\n\n return system?.explain(requirementId) ?? null;\n },\n subscribe(callback: DevtoolsSubscriber, systemName?: string) {\n const target = systemName\n ? systems.get(systemName)\n : systems.values().next().value;\n if (!target) {\n // System not registered yet — register a global subscriber\n // that attaches to the first system that appears\n let attached = false;\n const check = () => {\n const t = systemName\n ? systems.get(systemName)\n : systems.values().next().value;\n if (t && !attached) {\n attached = true;\n t.subscribers.add(callback);\n }\n };\n // Poll briefly for system registration\n const timer = setInterval(check, 100);\n const stop = setTimeout(() => clearInterval(timer), 10_000);\n\n return () => {\n clearInterval(timer);\n clearTimeout(stop);\n // Remove from any system that may have been attached\n for (const s of systems.values()) {\n s.subscribers.delete(callback);\n }\n };\n }\n target.subscribers.add(callback);\n\n return () => {\n target.subscribers.delete(callback);\n };\n },\n exportSession(name) {\n const target = name ? systems.get(name) : systems.values().next().value;\n if (!target) {\n return null;\n }\n\n return JSON.stringify({\n version: 1,\n name:\n name ??\n (systems.keys().next().value as string | undefined) ??\n \"default\",\n exportedAt: Date.now(),\n events: target.events.toArray(),\n });\n },\n importSession(json, name) {\n try {\n // Size cap — reject payloads over 10MB\n if (json.length > 10 * 1024 * 1024) {\n return false;\n }\n const data = JSON.parse(json);\n if (!data || typeof data !== \"object\" || Array.isArray(data)) {\n return false;\n }\n if (!Array.isArray(data.events)) {\n return false;\n }\n // Cap imported events at target's maxEvents\n const target = name\n ? systems.get(name)\n : systems.values().next().value;\n if (!target) {\n return false;\n }\n const maxImport = target.maxEvents;\n const events = data.events as unknown[];\n // Only import the last maxImport events\n const start =\n events.length > maxImport ? events.length - maxImport : 0;\n target.events.clear();\n for (let i = start; i < events.length; i++) {\n const evt = events[i];\n if (\n evt &&\n typeof evt === \"object\" &&\n !Array.isArray(evt) &&\n typeof (evt as Record<string, unknown>).timestamp === \"number\" &&\n typeof (evt as Record<string, unknown>).type === \"string\" &&\n (evt as Record<string, unknown>).type !== \"__proto__\" &&\n (evt as Record<string, unknown>).type !== \"constructor\" &&\n (evt as Record<string, unknown>).type !== \"prototype\"\n ) {\n // Sanitize — only copy known fields\n target.events.push({\n timestamp: (evt as Record<string, unknown>).timestamp as number,\n type: (evt as Record<string, unknown>).type as string,\n data: (evt as Record<string, unknown>).data ?? null,\n });\n }\n }\n\n return true;\n } catch {\n return false;\n }\n },\n clearEvents(name) {\n const target = name ? systems.get(name) : systems.values().next().value;\n if (!target) {\n return;\n }\n target.events.clear();\n },\n };\n\n // Non-writable global — prevent casual script overwriting\n // configurable in dev mode for test cleanup and plugin re-initialization\n Object.defineProperty(window, \"__DIRECTIVE__\", {\n value: api,\n writable: false,\n configurable: isDevMode(),\n enumerable: true,\n });\n\n return api;\n }\n\n return 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 options: DevtoolsPluginOptions = {},\n): Plugin<M> {\n const {\n name = \"default\",\n trace = false,\n maxEvents: maxEventsRaw,\n panel: panelEnabled = false,\n position = \"bottom-right\",\n defaultOpen = false,\n } = options;\n\n const maxEventsOpt = validateMaxEvents(maxEventsRaw);\n const devtools = initDevtools();\n const state: DevtoolsState = {\n system: null,\n events: new CircularBuffer<TraceEvent>(maxEventsOpt),\n maxEvents: maxEventsOpt,\n subscribers: new Set(),\n resolverStats: new Map(),\n };\n\n devtools.systems.set(name, state);\n\n const addEvent = (type: string, data: unknown) => {\n const event: TraceEvent = { timestamp: Date.now(), type, data };\n if (trace) {\n state.events.push(event);\n }\n // Always notify subscribers (even when trace is off — subscribers want all events)\n for (const sub of state.subscribers) {\n try {\n sub(event);\n } catch {\n // subscriber errors must not crash the plugin\n }\n }\n };\n\n // Panel state — initialized lazily in onInit\n let panel: ReturnType<typeof createPanel> | null = null;\n const factsRowMap = new Map<string, HTMLTableRowElement>();\n const derivRowMap = new Map<string, HTMLTableRowElement>();\n const perf = createPerfMetrics();\n const depGraph = createDepGraph();\n const recording = createRecordingState();\n const timeline = createTimelineState();\n\n const shouldCreatePanel =\n panelEnabled &&\n typeof window !== \"undefined\" &&\n typeof document !== \"undefined\" &&\n isDevMode();\n\n // requestAnimationFrame coalescing for all DOM updates\n let rafId: number | null = null;\n let dirty = 0;\n const D_FACTS = 1;\n const D_DERIV = 2;\n const D_REQS = 4;\n const D_STATUS = 8;\n const D_PERF = 16;\n const D_FLOW = 32;\n const D_TT = 64;\n const D_TIMELINE = 128;\n\n // Pending fact changes for batched rAF rendering\n const pendingFactUpdates = new Map<\n string,\n { value: unknown; flash: boolean }\n >();\n const pendingFactDeletes = new Set<string>();\n\n // Cache last reconcile result for deferred rendering\n let lastResult: ReconcileResult | null = null;\n\n function schedulePanelUpdate(bits: number) {\n dirty |= bits;\n if (rafId === null && typeof requestAnimationFrame !== \"undefined\") {\n rafId = requestAnimationFrame(flushPanelUpdates);\n }\n }\n\n function flushPanelUpdates() {\n rafId = null;\n if (!panel || !state.system) {\n dirty = 0;\n\n return;\n }\n const refs = panel.refs;\n const sys = state.system;\n const flags = dirty;\n dirty = 0;\n\n // Flush batched fact updates\n if (flags & D_FACTS) {\n for (const key of pendingFactDeletes) {\n removeTableRow(factsRowMap, key);\n }\n pendingFactDeletes.clear();\n for (const [key, { value, flash }] of pendingFactUpdates) {\n upsertTableRow(\n factsRowMap,\n refs.factsBody,\n key,\n value,\n flash,\n panel.flashTimers,\n );\n }\n pendingFactUpdates.clear();\n refs.factsCount.textContent = String(factsRowMap.size);\n }\n if (flags & D_DERIV) {\n updateDerivations(refs, derivRowMap, sys, panel.flashTimers);\n }\n if (flags & D_STATUS) {\n if (lastResult) {\n renderStatus(refs, lastResult.inflight.length, lastResult.unmet.length);\n } else {\n const inspection = safeInspect(sys);\n if (inspection) {\n renderStatus(\n refs,\n inspection.inflight.length,\n inspection.unmet.length,\n );\n }\n }\n }\n if (flags & D_REQS) {\n if (lastResult) {\n renderRequirements(\n refs,\n lastResult.inflight,\n lastResult.unmet as Array<{\n id: string;\n requirement: { type: string };\n fromConstraint: string;\n }>,\n );\n } else {\n const inspection = safeInspect(sys);\n if (inspection) {\n renderRequirements(\n refs,\n inspection.inflight,\n inspection.unmet as Array<{\n id: string;\n requirement: { type: string };\n fromConstraint: string;\n }>,\n );\n }\n }\n }\n if (flags & D_PERF) {\n updatePerfSection(refs, perf);\n }\n if (flags & D_FLOW) {\n updateDependencyGraph(refs, sys, depGraph);\n }\n if (flags & D_TT) {\n updateHistoryControls(refs, sys);\n }\n if (flags & D_TIMELINE) {\n updateTimeline(refs, timeline);\n }\n }\n\n // Helper: emit panel event only if trace is on and panel exists\n function panelEvent(type: string, data: unknown) {\n if (panel && trace) {\n addEventRow(panel.refs, type, data, state.events.size);\n }\n }\n\n // Record event if recording (C3: capped)\n function recordEvent(type: string, data: unknown) {\n if (\n recording.isRecording &&\n recording.recordedEvents.length < MAX_RECORDED_EVENTS\n ) {\n recording.recordedEvents.push({\n timestamp: Date.now(),\n type,\n data: cloneViaJSON(data),\n });\n }\n }\n\n return {\n name: \"devtools\",\n\n onInit: (system) => {\n state.system = system as unknown as System<ModuleSchema>;\n addEvent(\"init\", {});\n\n if (typeof window !== \"undefined\") {\n console.log(\n `%c[Directive Devtools]%c System \"${name}\" initialized. Access via window.__DIRECTIVE__`,\n \"color: #7c3aed; font-weight: bold\",\n \"color: inherit\",\n );\n }\n\n if (shouldCreatePanel) {\n const sys = state.system;\n panel = createPanel(name, position, defaultOpen, trace);\n const refs = panel.refs;\n\n // Initial render of facts\n try {\n const facts = sys.facts.$store.toObject();\n for (const [key, value] of Object.entries(facts)) {\n upsertTableRow(factsRowMap, refs.factsBody, key, value, false);\n }\n refs.factsCount.textContent = String(Object.keys(facts).length);\n } catch {\n // System not ready yet\n }\n\n // Initial render of other sections\n updateDerivations(refs, derivRowMap, sys);\n const inspection = safeInspect(sys);\n if (inspection) {\n renderStatus(\n refs,\n inspection.inflight.length,\n inspection.unmet.length,\n );\n renderRequirements(\n refs,\n inspection.inflight,\n inspection.unmet as Array<{\n id: string;\n requirement: { type: string };\n fromConstraint: string;\n }>,\n );\n }\n updateHistoryControls(refs, sys);\n setupHistoryButtons(refs, sys);\n updateDependencyGraph(refs, sys, depGraph);\n\n // Wire record & export buttons\n refs.recordBtn.addEventListener(\"click\", () => {\n recording.isRecording = !recording.isRecording;\n refs.recordBtn.textContent = recording.isRecording\n ? \"\\u23F9 Stop\"\n : \"\\u23FA Record\";\n refs.recordBtn.style.color = recording.isRecording ? S.red : S.text;\n if (recording.isRecording) {\n recording.recordedEvents = [];\n recording.snapshots = [];\n // Capture initial snapshot\n try {\n recording.snapshots.push({\n timestamp: Date.now(),\n facts: sys.facts.$store.toObject(),\n });\n } catch {\n // ignore\n }\n }\n });\n\n refs.exportBtn.addEventListener(\"click\", () => {\n const events =\n recording.recordedEvents.length > 0\n ? recording.recordedEvents\n : state.events.toArray();\n\n const payload = JSON.stringify(\n {\n version: 1,\n name,\n exportedAt: Date.now(),\n events,\n snapshots: recording.snapshots,\n },\n null,\n 2,\n );\n\n // Download as file\n const blob = new Blob([payload], { type: \"application/json\" });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = `directive-session-${name}-${Date.now()}.json`;\n a.click();\n URL.revokeObjectURL(url);\n });\n }\n },\n\n onStart: (_system) => {\n addEvent(\"start\", {});\n panelEvent(\"start\", {});\n recordEvent(\"start\", {});\n },\n\n onStop: (_system) => {\n addEvent(\"stop\", {});\n panelEvent(\"stop\", {});\n recordEvent(\"stop\", {});\n },\n\n onDestroy: (_system) => {\n addEvent(\"destroy\", {});\n devtools.systems.delete(name);\n if (rafId !== null && typeof cancelAnimationFrame !== \"undefined\") {\n cancelAnimationFrame(rafId);\n rafId = null;\n }\n if (depGraph.animationTimer) {\n clearTimeout(depGraph.animationTimer);\n }\n if (panel) {\n panel.destroy();\n panel = null;\n factsRowMap.clear();\n derivRowMap.clear();\n }\n },\n\n onFactSet: (key, value, prev) => {\n addEvent(\"fact.set\", { key, value, prev });\n recordEvent(\"fact.set\", { key, value, prev });\n depGraph.recentlyChangedFacts.add(key as string);\n if (panel && state.system) {\n // Defer DOM update to rAF\n pendingFactUpdates.set(key as string, { value, flash: true });\n pendingFactDeletes.delete(key as string);\n schedulePanelUpdate(D_FACTS);\n panelEvent(\"fact.set\", { key, value });\n }\n },\n\n onFactDelete: (key, prev) => {\n addEvent(\"fact.delete\", { key, prev });\n recordEvent(\"fact.delete\", { key, prev });\n if (panel) {\n // Defer DOM update to rAF\n pendingFactDeletes.add(key as string);\n pendingFactUpdates.delete(key as string);\n schedulePanelUpdate(D_FACTS);\n panelEvent(\"fact.delete\", { key });\n }\n },\n\n onFactsBatch: (changes: FactChange[]) => {\n addEvent(\"facts.batch\", { changes });\n recordEvent(\"facts.batch\", { count: changes.length });\n if (panel && state.system) {\n // Defer all DOM updates to rAF\n for (const change of changes) {\n if (change.type === \"delete\") {\n pendingFactDeletes.add(change.key);\n pendingFactUpdates.delete(change.key);\n } else {\n depGraph.recentlyChangedFacts.add(change.key);\n pendingFactUpdates.set(change.key, {\n value: change.value,\n flash: true,\n });\n pendingFactDeletes.delete(change.key);\n }\n }\n schedulePanelUpdate(D_FACTS);\n panelEvent(\"facts.batch\", { count: changes.length });\n }\n },\n\n onDerivationCompute: (id, value, deps) => {\n addEvent(\"derivation.compute\", { id, value, deps });\n recordEvent(\"derivation.compute\", { id, deps });\n depGraph.derivationDeps.set(id, deps);\n depGraph.recentlyComputedDerivations.add(id);\n panelEvent(\"derivation.compute\", { id, deps });\n },\n\n onDerivationInvalidate: (id) => {\n addEvent(\"derivation.invalidate\", { id });\n panelEvent(\"derivation.invalidate\", { id });\n },\n\n onReconcileStart: (_snapshot) => {\n addEvent(\"reconcile.start\", {});\n perf.lastReconcileStartMs = performance.now();\n panelEvent(\"reconcile.start\", {});\n recordEvent(\"reconcile.start\", {});\n },\n\n onReconcileEnd: (result: ReconcileResult) => {\n addEvent(\"reconcile.end\", result);\n recordEvent(\"reconcile.end\", {\n unmet: result.unmet.length,\n inflight: result.inflight.length,\n completed: result.completed.length,\n });\n\n // Track reconcile performance\n if (perf.lastReconcileStartMs > 0) {\n const duration = performance.now() - perf.lastReconcileStartMs;\n perf.reconcileCount++;\n perf.reconcileTotalMs += duration;\n perf.lastReconcileStartMs = 0;\n }\n\n // Capture snapshot during recording (C3: capped)\n if (\n recording.isRecording &&\n state.system &&\n recording.snapshots.length < MAX_RECORDED_SNAPSHOTS\n ) {\n try {\n recording.snapshots.push({\n timestamp: Date.now(),\n facts: state.system.facts.$store.toObject(),\n });\n } catch {\n // ignore\n }\n }\n\n if (panel && state.system) {\n lastResult = result;\n scheduleAnimationClear(depGraph);\n schedulePanelUpdate(\n D_DERIV | D_STATUS | D_REQS | D_PERF | D_FLOW | D_TT,\n );\n panelEvent(\"reconcile.end\", {\n unmet: result.unmet.length,\n inflight: result.inflight.length,\n });\n }\n },\n\n onConstraintEvaluate: (id, active) => {\n addEvent(\"constraint.evaluate\", { id, active });\n recordEvent(\"constraint.evaluate\", { id, active });\n if (active) {\n depGraph.activeConstraints.add(id);\n depGraph.recentlyActiveConstraints.add(id);\n } else {\n depGraph.activeConstraints.delete(id);\n }\n panelEvent(\"constraint.evaluate\", { id, active });\n },\n\n onConstraintError: (id, error) => {\n addEvent(\"constraint.error\", { id, error: String(error) });\n panelEvent(\"constraint.error\", { id, error: String(error) });\n },\n\n onRequirementCreated: (req) => {\n addEvent(\"requirement.created\", {\n id: req.id,\n type: req.requirement.type,\n });\n recordEvent(\"requirement.created\", {\n id: req.id,\n type: req.requirement.type,\n });\n panelEvent(\"requirement.created\", {\n id: req.id,\n type: req.requirement.type,\n });\n },\n\n onRequirementMet: (req, byResolver) => {\n addEvent(\"requirement.met\", { id: req.id, byResolver });\n recordEvent(\"requirement.met\", { id: req.id, byResolver });\n panelEvent(\"requirement.met\", { id: req.id, byResolver });\n },\n\n onRequirementCanceled: (req) => {\n addEvent(\"requirement.canceled\", { id: req.id });\n recordEvent(\"requirement.canceled\", { id: req.id });\n panelEvent(\"requirement.canceled\", { id: req.id });\n },\n\n onResolverStart: (resolver, req) => {\n addEvent(\"resolver.start\", { resolver, requirementId: req.id });\n recordEvent(\"resolver.start\", { resolver, requirementId: req.id });\n // Track timeline\n timeline.inflight.set(resolver, performance.now());\n if (panel && state.system) {\n schedulePanelUpdate(D_REQS | D_STATUS | D_TIMELINE);\n panelEvent(\"resolver.start\", { resolver, requirementId: req.id });\n }\n },\n\n onResolverComplete: (resolver, req, duration) => {\n addEvent(\"resolver.complete\", {\n resolver,\n requirementId: req.id,\n duration,\n });\n recordEvent(\"resolver.complete\", {\n resolver,\n requirementId: req.id,\n duration,\n });\n\n const stats = state.resolverStats.get(resolver) ?? {\n count: 0,\n totalMs: 0,\n errors: 0,\n };\n stats.count++;\n stats.totalMs += duration;\n state.resolverStats.set(resolver, stats);\n if (state.resolverStats.size > MAX_RESOLVER_STATS) {\n const oldest = state.resolverStats.keys().next().value;\n if (oldest !== undefined) state.resolverStats.delete(oldest);\n }\n // Mirror to perf for floating panel\n perf.resolverStats.set(resolver, { ...stats });\n\n // Complete timeline entry\n const startMs = timeline.inflight.get(resolver);\n timeline.inflight.delete(resolver);\n if (startMs !== undefined) {\n timeline.entries.push({\n resolver,\n startMs,\n endMs: performance.now(),\n error: false,\n });\n }\n\n if (panel && state.system) {\n schedulePanelUpdate(D_REQS | D_STATUS | D_PERF | D_TIMELINE);\n panelEvent(\"resolver.complete\", { resolver, duration });\n }\n },\n\n onResolverError: (resolver, req, error) => {\n addEvent(\"resolver.error\", {\n resolver,\n requirementId: req.id,\n error: String(error),\n });\n recordEvent(\"resolver.error\", {\n resolver,\n requirementId: req.id,\n error: String(error),\n });\n\n const stats = state.resolverStats.get(resolver) ?? {\n count: 0,\n totalMs: 0,\n errors: 0,\n };\n stats.errors++;\n state.resolverStats.set(resolver, stats);\n if (state.resolverStats.size > MAX_RESOLVER_STATS) {\n const oldest = state.resolverStats.keys().next().value;\n if (oldest !== undefined) state.resolverStats.delete(oldest);\n }\n // Mirror to perf for floating panel\n perf.resolverStats.set(resolver, { ...stats });\n\n // Complete timeline entry as error\n const startMs = timeline.inflight.get(resolver);\n timeline.inflight.delete(resolver);\n if (startMs !== undefined) {\n timeline.entries.push({\n resolver,\n startMs,\n endMs: performance.now(),\n error: true,\n });\n }\n\n if (panel && state.system) {\n schedulePanelUpdate(D_REQS | D_STATUS | D_PERF | D_TIMELINE);\n panelEvent(\"resolver.error\", { resolver, error: String(error) });\n }\n },\n\n onResolverRetry: (resolver, req, attempt) => {\n addEvent(\"resolver.retry\", { resolver, requirementId: req.id, attempt });\n recordEvent(\"resolver.retry\", {\n resolver,\n requirementId: req.id,\n attempt,\n });\n panelEvent(\"resolver.retry\", { resolver, attempt });\n },\n\n onResolverCancel: (resolver, req) => {\n addEvent(\"resolver.cancel\", { resolver, requirementId: req.id });\n recordEvent(\"resolver.cancel\", { resolver, requirementId: req.id });\n // Remove from inflight\n timeline.inflight.delete(resolver);\n panelEvent(\"resolver.cancel\", { resolver });\n },\n\n onEffectRun: (id) => {\n addEvent(\"effect.run\", { id });\n recordEvent(\"effect.run\", { id });\n perf.effectRunCount++;\n panelEvent(\"effect.run\", { id });\n },\n\n onEffectError: (id, error) => {\n addEvent(\"effect.error\", { id, error: String(error) });\n perf.effectErrorCount++;\n panelEvent(\"effect.error\", { id, error: String(error) });\n },\n\n onSnapshot: (snapshot) => {\n addEvent(\"timetravel.snapshot\", {\n id: snapshot.id,\n trigger: snapshot.trigger,\n });\n if (panel && state.system) {\n schedulePanelUpdate(D_TT);\n }\n panelEvent(\"timetravel.snapshot\", {\n id: snapshot.id,\n trigger: snapshot.trigger,\n });\n },\n\n onHistoryNavigate: (from, to) => {\n addEvent(\"timetravel.jump\", { from, to });\n recordEvent(\"timetravel.jump\", { from, to });\n if (panel && state.system) {\n const sys = state.system;\n // After time-travel, full refresh\n try {\n const facts = sys.facts.$store.toObject();\n factsRowMap.clear();\n panel.refs.factsBody.replaceChildren();\n for (const [key, value] of Object.entries(facts)) {\n upsertTableRow(\n factsRowMap,\n panel.refs.factsBody,\n key,\n value,\n false,\n );\n }\n panel.refs.factsCount.textContent = String(Object.keys(facts).length);\n } catch {\n // ignore\n }\n derivRowMap.clear();\n depGraph.derivationDeps.clear();\n panel.refs.derivBody.replaceChildren();\n lastResult = null;\n schedulePanelUpdate(D_DERIV | D_STATUS | D_REQS | D_FLOW | D_TT);\n panelEvent(\"timetravel.jump\", { from, to });\n }\n },\n\n onError: (error) => {\n addEvent(\"error\", {\n source: error.source,\n sourceId: error.sourceId,\n message: error.message,\n });\n recordEvent(\"error\", { source: error.source, message: error.message });\n panelEvent(\"error\", { source: error.source, message: error.message });\n },\n\n onErrorRecovery: (error, strategy) => {\n addEvent(\"error.recovery\", {\n source: error.source,\n sourceId: error.sourceId,\n strategy,\n });\n panelEvent(\"error.recovery\", { source: error.source, strategy });\n },\n\n onTraceComplete: (entry) => {\n addEvent(\"trace.complete\", {\n id: entry.id,\n status: entry.status,\n facts: entry.factChanges.length,\n constraints: entry.constraintsHit.length,\n requirements: entry.requirementsAdded.length,\n resolvers: entry.resolversStarted.length,\n effects: entry.effectsRun.length,\n });\n panelEvent(\"trace.complete\", { id: entry.id });\n },\n\n onDefinitionRegister: (type, id) => {\n addEvent(\"definition.register\", { type, id });\n recordEvent(\"definition.register\", { type, id });\n panelEvent(\"definition.register\", { type, id });\n },\n\n onDefinitionAssign: (type, id) => {\n addEvent(\"definition.assign\", { type, id });\n recordEvent(\"definition.assign\", { type, id });\n panelEvent(\"definition.assign\", { type, id });\n },\n\n onDefinitionUnregister: (type, id) => {\n addEvent(\"definition.unregister\", { type, id });\n recordEvent(\"definition.unregister\", { type, id });\n panelEvent(\"definition.unregister\", { type, id });\n },\n\n onDefinitionCall: (type, id, props) => {\n addEvent(\"definition.call\", { type, id, props });\n recordEvent(\"definition.call\", { type, id, props });\n panelEvent(\"definition.call\", { type, id, props });\n },\n };\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 if (typeof window !== \"undefined\") {\n const key = `__DIRECTIVE_BRIDGE_ID_${SESSION_NONCE}__`;\n const w = window as unknown as Record<string, unknown>;\n const current = (w[key] as number | undefined) ?? 0;\n w[key] = current + 1;\n\n return current + 1;\n }\n\n return 1;\n}\n\n/**\n * Strip prototype-pollution keys from an event object.\n */\nfunction sanitizeEvent(\n event: Record<string, unknown>,\n): Record<string, unknown> {\n let needsSanitize = false;\n for (const key of BLOCKED_KEYS) {\n if (key in event) {\n needsSanitize = true;\n break;\n }\n }\n\n if (!needsSanitize) {\n return event;\n }\n\n const clean: Record<string, unknown> = Object.create(null);\n for (const [key, value] of Object.entries(event)) {\n if (!BLOCKED_KEYS.has(key)) {\n clean[key] = value;\n }\n }\n\n return 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 event: Record<string, unknown> & { type: string },\n): void {\n if (typeof window === \"undefined\") {\n return;\n }\n\n try {\n const safe = sanitizeEvent(event);\n const full = {\n id: getNextId(),\n timestamp: Date.now(),\n snapshotId: null,\n ...safe,\n };\n\n window.dispatchEvent(\n new CustomEvent(DEVTOOLS_EVENT_NAME, { detail: full }),\n );\n } catch {\n // DevTools bridge must never crash the host application\n }\n}\n","/**\n * Persistence Plugin - Save/restore facts to storage\n */\n\nimport type { ModuleSchema, Plugin, System } from \"../core/types.js\";\nimport { isPrototypeSafe } from \"../utils/utils.js\";\n\n/**\n * Configuration for the {@link persistencePlugin}.\n *\n * @remarks\n * At minimum, provide a `storage` backend and a `key`. Use `include` or\n * `exclude` to control which fact keys are persisted. Saves are debounced\n * by default (100 ms) to avoid excessive writes during rapid updates.\n *\n * | Field | Default | Description |\n * |-------------|---------|-------------|\n * | `storage` | *(required)* | A `Storage`-compatible backend (`localStorage`, `sessionStorage`, or custom). |\n * | `key` | *(required)* | The key used to read/write from storage. |\n * | `include` | all keys | Whitelist of fact keys to persist. |\n * | `exclude` | `[]` | Blacklist of fact keys to skip. |\n * | `debounce` | `100` | Milliseconds to debounce saves. |\n * | `onRestore` | -- | Callback fired after state is restored from storage. |\n * | `onSave` | -- | Callback fired after state is written to storage. |\n * | `onError` | -- | Callback fired when a load or save error occurs. |\n *\n * @public\n */\nexport interface PersistencePluginOptions {\n /** A `Storage`-compatible backend (`localStorage`, `sessionStorage`, or custom). */\n storage: Storage;\n /** The key used to read/write from the storage backend. */\n key: string;\n /** Whitelist of fact keys to persist (default: all keys). */\n include?: string[];\n /** Fact keys to exclude from persistence. */\n exclude?: string[];\n /** Milliseconds to debounce saves (default: 100). */\n debounce?: number;\n /** Callback fired after state is restored from storage on init. */\n onRestore?: (data: Record<string, unknown>) => void;\n /** Callback fired after state is written to storage. */\n onSave?: (data: Record<string, unknown>) => void;\n /** Callback fired when a load or save error occurs. */\n onError?: (error: Error) => void;\n}\n\n/**\n * Create a plugin that persists selected facts to a `Storage` backend and\n * restores them on system init.\n *\n * @remarks\n * On `onInit`, the plugin reads the storage key and batch-sets any persisted\n * facts into the store. On every `onFactSet` / `onFactDelete` / `onFactsBatch`,\n * a debounced save is scheduled. A final synchronous save runs on `onDestroy`\n * to capture any pending changes.\n *\n * Stored data is validated against prototype pollution before restoration\n * via {@link isPrototypeSafe}.\n *\n * @param options - Required {@link PersistencePluginOptions} specifying storage backend, key, and optional filters/callbacks.\n * @returns A {@link Plugin} that can be passed to `createSystem`'s `plugins` array.\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 *\n * @public\n */\nexport function persistencePlugin<M extends ModuleSchema = ModuleSchema>(\n options: PersistencePluginOptions,\n): Plugin<M> {\n const {\n storage,\n key,\n include,\n exclude = [],\n debounce = 100,\n onRestore,\n onSave,\n onError,\n } = options;\n\n let saveTimeout: ReturnType<typeof setTimeout> | null = null;\n let system: System<M> | null = null;\n const trackedKeys = new Set<string>();\n\n /** Check if a key should be persisted */\n const shouldPersist = (factKey: string): boolean => {\n if (exclude.includes(factKey)) return false;\n if (include) return include.includes(factKey);\n return true;\n };\n\n /** Load state from storage */\n const load = (): Record<string, unknown> | null => {\n try {\n const json = storage.getItem(key);\n if (!json) return null;\n\n const data = JSON.parse(json);\n if (typeof data !== \"object\" || data === null) return null;\n\n // Security: Check for prototype pollution\n if (!isPrototypeSafe(data)) {\n onError?.(\n new Error(\"Potential prototype pollution detected in stored data\"),\n );\n return null;\n }\n\n return data as Record<string, unknown>;\n } catch (error) {\n onError?.(error instanceof Error ? error : new Error(String(error)));\n return null;\n }\n };\n\n /** Save state to storage */\n const save = () => {\n if (!system) return;\n\n try {\n const data: Record<string, unknown> = {};\n\n for (const factKey of trackedKeys) {\n if (shouldPersist(factKey)) {\n data[factKey] = (system.facts as Record<string, unknown>)[factKey];\n }\n }\n\n storage.setItem(key, JSON.stringify(data));\n onSave?.(data);\n } catch (error) {\n onError?.(error instanceof Error ? error : new Error(String(error)));\n }\n };\n\n /** Schedule a debounced save */\n const scheduleSave = () => {\n if (saveTimeout) {\n clearTimeout(saveTimeout);\n }\n saveTimeout = setTimeout(save, debounce);\n };\n\n return {\n name: \"persistence\",\n\n onInit: (sys) => {\n system = sys;\n\n // Restore state from storage\n const data = load();\n if (data) {\n system.facts.$store.batch(() => {\n for (const [factKey, value] of Object.entries(data)) {\n if (shouldPersist(factKey)) {\n (system!.facts as Record<string, unknown>)[factKey] = value;\n trackedKeys.add(factKey);\n }\n }\n });\n onRestore?.(data);\n }\n },\n\n onDestroy: () => {\n // Final save before destroy\n if (saveTimeout) {\n clearTimeout(saveTimeout);\n }\n save();\n },\n\n onFactSet: (factKey) => {\n trackedKeys.add(factKey);\n if (shouldPersist(factKey)) {\n scheduleSave();\n }\n },\n\n onFactDelete: (factKey) => {\n trackedKeys.delete(factKey);\n if (shouldPersist(factKey)) {\n scheduleSave();\n }\n },\n\n onFactsBatch: (changes) => {\n let shouldSave = false;\n for (const change of changes) {\n if (change.type === \"set\") {\n trackedKeys.add(change.key);\n } else {\n trackedKeys.delete(change.key);\n }\n if (shouldPersist(change.key)) {\n shouldSave = true;\n }\n }\n if (shouldSave) {\n scheduleSave();\n }\n },\n };\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 { ModuleSchema, Plugin } from \"../core/types.js\";\n\n/** Metrics for a single constraint */\nexport interface ConstraintMetrics {\n evaluations: number;\n totalDurationMs: number;\n avgDurationMs: number;\n maxDurationMs: number;\n lastEvaluatedAt: number;\n}\n\n/** Metrics for a single resolver */\nexport interface ResolverMetrics {\n starts: number;\n completions: number;\n errors: number;\n retries: number;\n cancellations: number;\n totalDurationMs: number;\n avgDurationMs: number;\n maxDurationMs: number;\n lastCompletedAt: number;\n}\n\n/** Metrics for the reconciliation loop */\nexport interface ReconcileMetrics {\n runs: number;\n totalDurationMs: number;\n avgDurationMs: number;\n maxDurationMs: number;\n}\n\n/** Metrics for effects */\nexport interface EffectMetrics {\n runs: number;\n errors: number;\n lastRunAt: number;\n}\n\n/** Full performance snapshot */\nexport interface PerformanceSnapshot {\n constraints: Record<string, ConstraintMetrics>;\n resolvers: Record<string, ResolverMetrics>;\n effects: Record<string, EffectMetrics>;\n reconcile: ReconcileMetrics;\n uptime: number;\n}\n\n/** Options for the performance plugin */\nexport interface PerformancePluginOptions {\n /** Callback when a slow constraint is detected (default threshold: 16ms) */\n onSlowConstraint?: (id: string, durationMs: number) => void;\n /** Callback when a slow resolver is detected (default threshold: 1000ms) */\n onSlowResolver?: (id: string, durationMs: number) => void;\n /** Threshold in ms for slow constraint warning (default: 16) */\n slowConstraintThresholdMs?: number;\n /** Threshold in ms for slow resolver warning (default: 1000) */\n slowResolverThresholdMs?: 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 options: PerformancePluginOptions = {},\n): Plugin<M> & { getSnapshot(): PerformanceSnapshot; reset(): void } {\n const {\n onSlowConstraint,\n onSlowResolver,\n slowConstraintThresholdMs = 16,\n slowResolverThresholdMs = 1000,\n } = options;\n\n const constraints = new Map<string, ConstraintMetrics>();\n const resolvers = new Map<string, ResolverMetrics>();\n const effects = new Map<string, EffectMetrics>();\n const reconcile: ReconcileMetrics = {\n runs: 0,\n totalDurationMs: 0,\n avgDurationMs: 0,\n maxDurationMs: 0,\n };\n\n let startedAt = 0;\n let reconcileStartTime = 0;\n\n // Track constraint evaluation timing within a reconcile cycle.\n // Since constraints are evaluated sequentially, the time between consecutive\n // onConstraintEvaluate calls approximates each constraint's evaluation time.\n // The first constraint in each cycle cannot be timed (no baseline), so only\n // subsequent constraints get duration metrics.\n let lastConstraintEvalEndTime = 0;\n\n function getConstraintMetrics(id: string): ConstraintMetrics {\n let m = constraints.get(id);\n if (!m) {\n m = {\n evaluations: 0,\n totalDurationMs: 0,\n avgDurationMs: 0,\n maxDurationMs: 0,\n lastEvaluatedAt: 0,\n };\n constraints.set(id, m);\n }\n return m;\n }\n\n function getResolverMetrics(id: string): ResolverMetrics {\n let m = resolvers.get(id);\n if (!m) {\n m = {\n starts: 0,\n completions: 0,\n errors: 0,\n retries: 0,\n cancellations: 0,\n totalDurationMs: 0,\n avgDurationMs: 0,\n maxDurationMs: 0,\n lastCompletedAt: 0,\n };\n resolvers.set(id, m);\n }\n return m;\n }\n\n function getEffectMetrics(id: string): EffectMetrics {\n let m = effects.get(id);\n if (!m) {\n m = { runs: 0, errors: 0, lastRunAt: 0 };\n effects.set(id, m);\n }\n return m;\n }\n\n const plugin: Plugin<M> & {\n getSnapshot(): PerformanceSnapshot;\n reset(): void;\n } = {\n name: \"performance\",\n\n onStart() {\n startedAt = Date.now();\n },\n\n onConstraintEvaluate(id, _active) {\n const now = performance.now();\n const m = getConstraintMetrics(id);\n m.evaluations++;\n m.lastEvaluatedAt = Date.now();\n\n // Constraints evaluate sequentially within a reconcile cycle.\n // Measure duration as time since the previous constraint finished evaluating\n // (or since reconcileStart for the first constraint in the cycle).\n // The first constraint per cycle has no baseline and is not timed.\n if (lastConstraintEvalEndTime > 0) {\n const duration = now - lastConstraintEvalEndTime;\n m.totalDurationMs += duration;\n const timedEvals = m.evaluations; // approximation — some evals may be untimed\n m.avgDurationMs = m.totalDurationMs / timedEvals;\n if (duration > m.maxDurationMs) m.maxDurationMs = duration;\n if (duration > slowConstraintThresholdMs) {\n onSlowConstraint?.(id, duration);\n }\n }\n lastConstraintEvalEndTime = now;\n },\n\n onResolverStart(resolver, _req) {\n const m = getResolverMetrics(resolver);\n m.starts++;\n },\n\n onResolverComplete(resolver, _req, duration) {\n const m = getResolverMetrics(resolver);\n m.completions++;\n m.totalDurationMs += duration;\n m.avgDurationMs = m.totalDurationMs / m.completions;\n if (duration > m.maxDurationMs) m.maxDurationMs = duration;\n m.lastCompletedAt = Date.now();\n if (duration > slowResolverThresholdMs) {\n onSlowResolver?.(resolver, duration);\n }\n },\n\n onResolverError(resolver, _req, _error) {\n getResolverMetrics(resolver).errors++;\n },\n\n onResolverRetry(resolver, _req, _attempt) {\n getResolverMetrics(resolver).retries++;\n },\n\n onResolverCancel(resolver, _req) {\n getResolverMetrics(resolver).cancellations++;\n },\n\n onEffectRun(id) {\n const m = getEffectMetrics(id);\n m.runs++;\n m.lastRunAt = Date.now();\n },\n\n onEffectError(id, _error) {\n getEffectMetrics(id).errors++;\n },\n\n onReconcileStart() {\n reconcileStartTime = performance.now();\n // Reset constraint timing baseline — first constraint in this cycle won't be timed\n lastConstraintEvalEndTime = 0;\n },\n\n onReconcileEnd() {\n const duration = performance.now() - reconcileStartTime;\n reconcile.runs++;\n reconcile.totalDurationMs += duration;\n reconcile.avgDurationMs = reconcile.totalDurationMs / reconcile.runs;\n if (duration > reconcile.maxDurationMs)\n reconcile.maxDurationMs = duration;\n },\n\n onDestroy() {\n plugin.reset();\n },\n\n getSnapshot(): PerformanceSnapshot {\n const constraintsObj: Record<string, ConstraintMetrics> = {};\n for (const [id, m] of constraints) constraintsObj[id] = { ...m };\n\n const resolversObj: Record<string, ResolverMetrics> = {};\n for (const [id, m] of resolvers) resolversObj[id] = { ...m };\n\n const effectsObj: Record<string, EffectMetrics> = {};\n for (const [id, m] of effects) effectsObj[id] = { ...m };\n\n return {\n constraints: constraintsObj,\n resolvers: resolversObj,\n effects: effectsObj,\n reconcile: { ...reconcile },\n uptime: startedAt ? Date.now() - startedAt : 0,\n };\n },\n\n reset(): void {\n constraints.clear();\n resolvers.clear();\n effects.clear();\n reconcile.runs = 0;\n reconcile.totalDurationMs = 0;\n reconcile.avgDurationMs = 0;\n reconcile.maxDurationMs = 0;\n lastConstraintEvalEndTime = 0;\n },\n };\n\n return plugin;\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.lab.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** OTLP exporter configuration */\nexport interface OTLPExporterConfig {\n /** OTLP endpoint base URL (e.g., http://localhost:4318) */\n endpoint: string;\n /** Optional headers (e.g., auth tokens) */\n headers?: Record<string, string>;\n /** Service name for resource identification */\n serviceName?: string;\n /** Service version */\n serviceVersion?: string;\n /** Custom resource attributes */\n resourceAttributes?: Record<string, string>;\n /** Instrumentation scope version (default: \"0.1.0\") */\n scopeVersion?: string;\n /** Request timeout in ms (default: 10000) */\n timeoutMs?: number;\n /** Custom fetch function (for testing or custom HTTP clients) */\n fetch?: typeof globalThis.fetch;\n /** Callback on export error */\n onError?: (error: Error, type: \"metrics\" | \"traces\") => void;\n}\n\n/** OTLP exporter instance */\nexport interface OTLPExporter {\n /** Export metrics in OTLP format (compatible with ObservabilityConfig.metrics.exporter) */\n exportMetrics: (metrics: AggregatedMetric[]) => Promise<void>;\n /** Export traces in OTLP format (compatible with ObservabilityConfig.tracing.exporter) */\n exportTraces: (traces: TraceSpan[]) => Promise<void>;\n}\n\n// ============================================================================\n// OTLP JSON Conversion\n// ============================================================================\n\ninterface OTLPResource {\n attributes: Array<{ key: string; value: { stringValue: string } }>;\n}\n\nfunction buildResource(config: OTLPExporterConfig): OTLPResource {\n const attrs: Array<{ key: string; value: { stringValue: string } }> = [\n {\n key: \"service.name\",\n value: { stringValue: config.serviceName ?? \"directive-agents\" },\n },\n ];\n\n if (config.serviceVersion) {\n attrs.push({\n key: \"service.version\",\n value: { stringValue: config.serviceVersion },\n });\n }\n\n if (config.resourceAttributes) {\n for (const [key, val] of Object.entries(config.resourceAttributes)) {\n attrs.push({ key, value: { stringValue: val } });\n }\n }\n\n return { attributes: attrs };\n}\n\nfunction toNanos(timestampMs: number): string {\n return `${BigInt(timestampMs) * BigInt(1_000_000)}`;\n}\n\nfunction metricTypeToOTLP(type: string): string {\n switch (type) {\n case \"counter\":\n return \"sum\";\n case \"gauge\":\n return \"gauge\";\n case \"histogram\":\n return \"histogram\";\n default:\n return \"gauge\";\n }\n}\n\nfunction convertMetrics(\n metrics: AggregatedMetric[],\n resource: OTLPResource,\n scopeVersion: string,\n): Record<string, unknown> {\n const scopeMetrics = metrics.map((metric) => {\n // Known limitation: startTimeUnixNano is approximated as lastUpdated minus 60s.\n // A more accurate value would require tracking the actual collection start time\n // per metric, which is not available in the current AggregatedMetric type.\n const startTimeMs = metric.lastUpdated - 60000;\n\n const dataPoints = [\n {\n asInt: metric.type === \"counter\" ? metric.sum : undefined,\n asDouble: metric.type !== \"counter\" ? metric.lastValue : undefined,\n timeUnixNano: toNanos(metric.lastUpdated),\n startTimeUnixNano: toNanos(startTimeMs),\n attributes: [],\n },\n ];\n\n const otlpType = metricTypeToOTLP(metric.type);\n const metricData: Record<string, unknown> = {\n name: metric.name,\n unit: \"\",\n };\n\n if (otlpType === \"sum\") {\n metricData.sum = {\n dataPoints,\n aggregationTemporality: 2, // CUMULATIVE\n isMonotonic: true,\n };\n } else if (otlpType === \"histogram\") {\n metricData.histogram = {\n dataPoints: [\n {\n count: metric.count,\n sum: metric.sum,\n min: metric.min,\n max: metric.max,\n timeUnixNano: toNanos(metric.lastUpdated),\n startTimeUnixNano: toNanos(startTimeMs),\n attributes: [],\n },\n ],\n aggregationTemporality: 2,\n };\n } else {\n metricData.gauge = { dataPoints };\n }\n\n return metricData;\n });\n\n return {\n resourceMetrics: [\n {\n resource,\n scopeMetrics: [\n {\n scope: { name: \"directive\", version: scopeVersion },\n metrics: scopeMetrics,\n },\n ],\n },\n ],\n };\n}\n\nfunction convertTraces(\n traces: TraceSpan[],\n resource: OTLPResource,\n scopeVersion: string,\n): Record<string, unknown> {\n const spans = traces.map((span) => {\n const events = span.logs.map((log) => ({\n timeUnixNano: toNanos(log.timestamp),\n name: log.level,\n attributes: [\n { key: \"message\", value: { stringValue: log.message } },\n { key: \"level\", value: { stringValue: log.level } },\n ],\n }));\n\n const attributes = Object.entries(span.tags).map(([key, val]) => ({\n key,\n value:\n typeof val === \"string\"\n ? { stringValue: val }\n : typeof val === \"number\"\n ? { intValue: `${val}` }\n : { boolValue: val },\n }));\n\n const statusCode =\n span.status === \"ok\" ? 1 : span.status === \"error\" ? 2 : 0;\n\n return {\n traceId: span.traceId.replace(/-/g, \"\").padEnd(32, \"0\").slice(0, 32),\n spanId: span.spanId.replace(/-/g, \"\").padEnd(16, \"0\").slice(0, 16),\n parentSpanId: span.parentSpanId\n ? span.parentSpanId.replace(/-/g, \"\").padEnd(16, \"0\").slice(0, 16)\n : undefined,\n name: span.operationName,\n kind: 1, // INTERNAL\n startTimeUnixNano: toNanos(span.startTime),\n endTimeUnixNano: span.endTime\n ? toNanos(span.endTime)\n : toNanos(span.startTime),\n attributes,\n events,\n status: { code: statusCode },\n };\n });\n\n return {\n resourceSpans: [\n {\n resource,\n scopeSpans: [\n {\n scope: { name: \"directive\", version: scopeVersion },\n spans,\n },\n ],\n },\n ],\n };\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 const {\n endpoint,\n headers = {},\n scopeVersion = \"0.1.0\",\n timeoutMs = 10000,\n fetch: fetchFn = globalThis.fetch,\n onError,\n } = config;\n\n // Validate endpoint URL\n try {\n const url = new URL(endpoint);\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n throw new Error(\"[Directive] Only http: and https: protocols are supported\");\n }\n } catch (error) {\n throw new Error(\n `[Directive OTLP] Invalid endpoint URL \"${endpoint}\": ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n\n // Warn if endpoint already contains a path like /v1/metrics or /v1/traces\n if (/\\/v1\\/(metrics|traces)/.test(endpoint)) {\n console.warn(\n `[Directive OTLP] Endpoint \"${endpoint}\" already contains a /v1/metrics or /v1/traces path. ` +\n \"The exporter will append /v1/metrics or /v1/traces automatically. \" +\n `Use the base URL (e.g., \"http://localhost:4318\") instead.`,\n );\n }\n\n // Validate timeoutMs\n if (timeoutMs <= 0 || !Number.isFinite(timeoutMs)) {\n throw new Error(`[Directive OTLP] timeoutMs must be > 0, got ${timeoutMs}`);\n }\n\n const resource = buildResource(config);\n\n async function send(\n path: string,\n body: Record<string, unknown>,\n type: \"metrics\" | \"traces\",\n ): Promise<void> {\n const url = `${endpoint.replace(/\\/$/, \"\")}${path}`;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const response = await fetchFn(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers,\n },\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n throw new Error(\n `[Directive] OTLP export failed: ${response.status} ${response.statusText}`,\n );\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n if (onError) {\n onError(err, type);\n } else {\n console.error(`[Directive OTLP] Export ${type} error:`, err.message);\n }\n } finally {\n clearTimeout(timer);\n }\n }\n\n return {\n async exportMetrics(metrics: AggregatedMetric[]): Promise<void> {\n if (metrics.length === 0) return;\n const body = convertMetrics(metrics, resource, scopeVersion);\n await send(\"/v1/metrics\", body, \"metrics\");\n },\n\n async exportTraces(traces: TraceSpan[]): Promise<void> {\n if (traces.length === 0) return;\n const body = convertTraces(traces, resource, scopeVersion);\n await send(\"/v1/traces\", body, \"traces\");\n },\n };\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.lab.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 /** Number of failures before opening the circuit (default: 5) */\n failureThreshold?: number;\n /** Time in ms before transitioning from OPEN to HALF_OPEN (default: 30000) */\n recoveryTimeMs?: number;\n /** Number of requests allowed in HALF_OPEN state (default: 3) */\n halfOpenMaxRequests?: number;\n /** Time window in ms for counting failures (default: 60000). Failures outside this window are forgotten. */\n failureWindowMs?: number;\n /** Optional observability instance for automatic metric tracking */\n observability?: ObservabilityInstance;\n /** Metric name prefix for observability (default: \"circuit_breaker\") */\n metricPrefix?: string;\n /** Name for this circuit breaker (used in metrics and errors) */\n name?: string;\n /** Custom error classifier. Return true if the error should count as a failure. Default: all errors count. */\n isFailure?: (error: Error) => boolean;\n /** Callback when state changes */\n onStateChange?: (from: CircuitState, to: CircuitState) => void;\n}\n\n/** Circuit breaker statistics */\nexport interface CircuitBreakerStats {\n state: CircuitState;\n totalRequests: number;\n totalFailures: number;\n totalSuccesses: number;\n totalRejected: number;\n recentFailures: number;\n lastFailureTime: number | null;\n lastSuccessTime: number | null;\n lastStateChange: number;\n}\n\n/** Circuit breaker instance */\nexport interface CircuitBreaker {\n /** Execute an operation through the circuit breaker */\n execute<T>(fn: () => Promise<T>): Promise<T>;\n /** Get the current state */\n getState(): CircuitState;\n /** Get statistics */\n getStats(): CircuitBreakerStats;\n /** Force the circuit to a specific state (useful for testing) */\n forceState(state: CircuitState): void;\n /** Reset the circuit breaker to CLOSED with cleared stats */\n reset(): void;\n /** Check if a request would be allowed (without executing) */\n isAllowed(): 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 readonly code = \"CIRCUIT_OPEN\" as const;\n readonly retryAfterMs: number;\n readonly state: \"OPEN\" | \"HALF_OPEN\";\n\n constructor(\n name: string,\n retryAfterMs: number,\n state: \"OPEN\" | \"HALF_OPEN\" = \"OPEN\",\n detail?: string,\n ) {\n const msg = detail\n ? `[Directive CircuitBreaker] Circuit \"${name}\" is ${state}. ${detail}`\n : `[Directive CircuitBreaker] Circuit \"${name}\" is ${state}. Request rejected. Try again in ${Math.ceil(retryAfterMs / 1000)}s.`;\n super(msg);\n this.name = \"CircuitBreakerOpenError\";\n this.retryAfterMs = retryAfterMs;\n this.state = state;\n }\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\n/**\n * Create a circuit breaker for protecting against cascading failures.\n *\n * @param config - Circuit breaker configuration (thresholds, recovery time, observability)\n * @returns A circuit breaker instance with `execute`, `getState`, and `reset` methods\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 If failureThreshold is less than 1 or not a finite number\n * @throws If recoveryTimeMs is not positive or not a finite number\n * @throws If halfOpenMaxRequests is less than 1 or not a finite number\n * @throws If failureWindowMs is not positive or not a finite number\n */\nexport function createCircuitBreaker(\n config: CircuitBreakerConfig = {},\n): CircuitBreaker {\n const {\n failureThreshold = 5,\n recoveryTimeMs = 30000,\n halfOpenMaxRequests = 3,\n failureWindowMs = 60000,\n observability,\n metricPrefix = \"circuit_breaker\",\n name = \"default\",\n isFailure = () => true,\n onStateChange,\n } = config;\n\n // Validate config\n if (failureThreshold < 1 || !Number.isFinite(failureThreshold)) {\n throw new Error(\n `[Directive CircuitBreaker] failureThreshold must be >= 1, got ${failureThreshold}`,\n );\n }\n if (recoveryTimeMs <= 0 || !Number.isFinite(recoveryTimeMs)) {\n throw new Error(\n `[Directive CircuitBreaker] recoveryTimeMs must be > 0, got ${recoveryTimeMs}`,\n );\n }\n if (halfOpenMaxRequests < 1 || !Number.isFinite(halfOpenMaxRequests)) {\n throw new Error(\n `[Directive CircuitBreaker] halfOpenMaxRequests must be >= 1, got ${halfOpenMaxRequests}`,\n );\n }\n if (failureWindowMs <= 0 || !Number.isFinite(failureWindowMs)) {\n throw new Error(\n `[Directive CircuitBreaker] failureWindowMs must be > 0, got ${failureWindowMs}`,\n );\n }\n\n let state: CircuitState = \"CLOSED\";\n let failureTimestamps: number[] = [];\n let halfOpenRequests = 0;\n let halfOpenSuccesses = 0;\n let lastStateChange = Date.now();\n let openedAt = 0;\n\n // Stats\n let totalRequests = 0;\n let totalFailures = 0;\n let totalSuccesses = 0;\n let totalRejected = 0;\n let lastFailureTime: number | null = null;\n let lastSuccessTime: number | null = null;\n\n function transition(newState: CircuitState): void {\n if (state === newState) return;\n const oldState = state;\n state = newState;\n lastStateChange = Date.now();\n\n if (newState === \"OPEN\") {\n openedAt = Date.now();\n }\n if (newState === \"HALF_OPEN\") {\n halfOpenRequests = 0;\n halfOpenSuccesses = 0;\n }\n\n onStateChange?.(oldState, newState);\n\n if (observability) {\n observability.incrementCounter(`${metricPrefix}.state_change`, {\n name,\n from: oldState,\n to: newState,\n });\n }\n }\n\n function getRecentFailures(): number {\n const cutoff = Date.now() - failureWindowMs;\n failureTimestamps = failureTimestamps.filter((t) => t > cutoff);\n return failureTimestamps.length;\n }\n\n function recordSuccess(): void {\n totalSuccesses++;\n lastSuccessTime = Date.now();\n\n if (observability) {\n observability.incrementCounter(`${metricPrefix}.success`, { name });\n }\n\n if (state === \"HALF_OPEN\") {\n halfOpenSuccesses++;\n if (halfOpenSuccesses >= halfOpenMaxRequests) {\n transition(\"CLOSED\");\n failureTimestamps = [];\n }\n }\n }\n\n function recordFailure(error: Error): void {\n if (!isFailure(error)) {\n recordSuccess();\n return;\n }\n\n totalFailures++;\n lastFailureTime = Date.now();\n failureTimestamps.push(Date.now());\n\n // Cap array to prevent unbounded growth (keep 2x threshold as headroom)\n const maxTimestamps = failureThreshold * 2;\n if (failureTimestamps.length > maxTimestamps) {\n failureTimestamps = failureTimestamps.slice(-maxTimestamps);\n }\n\n if (observability) {\n observability.incrementCounter(`${metricPrefix}.failure`, { name });\n }\n\n if (state === \"HALF_OPEN\") {\n transition(\"OPEN\");\n return;\n }\n\n if (state === \"CLOSED\" && getRecentFailures() >= failureThreshold) {\n transition(\"OPEN\");\n }\n }\n\n return {\n async execute<T>(fn: () => Promise<T>): Promise<T> {\n totalRequests++;\n\n if (observability) {\n observability.incrementCounter(`${metricPrefix}.requests`, { name });\n }\n\n // Check if request should be allowed\n if (state === \"OPEN\") {\n // Check if recovery time has elapsed\n if (Date.now() - openedAt >= recoveryTimeMs) {\n transition(\"HALF_OPEN\");\n } else {\n totalRejected++;\n if (observability) {\n observability.incrementCounter(`${metricPrefix}.rejected`, {\n name,\n });\n }\n throw new CircuitBreakerOpenError(\n name,\n recoveryTimeMs - (Date.now() - openedAt),\n );\n }\n }\n\n if (state === \"HALF_OPEN\") {\n if (halfOpenRequests >= halfOpenMaxRequests) {\n totalRejected++;\n throw new CircuitBreakerOpenError(\n name,\n recoveryTimeMs,\n \"HALF_OPEN\",\n `Max trial requests (${halfOpenMaxRequests}) reached.`,\n );\n }\n halfOpenRequests++;\n }\n\n // Execute the operation\n const start = Date.now();\n try {\n const result = await fn();\n recordSuccess();\n\n if (observability) {\n observability.observeHistogram(\n `${metricPrefix}.latency`,\n Date.now() - start,\n { name },\n );\n }\n\n return result;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n recordFailure(err);\n\n if (observability) {\n observability.observeHistogram(\n `${metricPrefix}.latency`,\n Date.now() - start,\n { name },\n );\n }\n\n throw error;\n }\n },\n\n getState(): CircuitState {\n // Auto-transition from OPEN to HALF_OPEN when recovery time has passed\n if (state === \"OPEN\" && Date.now() - openedAt >= recoveryTimeMs) {\n transition(\"HALF_OPEN\");\n }\n return state;\n },\n\n getStats(): CircuitBreakerStats {\n // Ensure state freshness (auto-transition OPEN → HALF_OPEN)\n const currentState = this.getState();\n return {\n state: currentState,\n totalRequests,\n totalFailures,\n totalSuccesses,\n totalRejected,\n recentFailures: getRecentFailures(),\n lastFailureTime,\n lastSuccessTime,\n lastStateChange,\n };\n },\n\n forceState(newState: CircuitState): void {\n transition(newState);\n },\n\n reset(): void {\n const oldState = state;\n state = \"CLOSED\";\n failureTimestamps = [];\n halfOpenRequests = 0;\n halfOpenSuccesses = 0;\n lastStateChange = Date.now();\n openedAt = 0;\n totalRequests = 0;\n totalFailures = 0;\n totalSuccesses = 0;\n totalRejected = 0;\n lastFailureTime = null;\n lastSuccessTime = null;\n if (oldState !== \"CLOSED\") {\n onStateChange?.(oldState, \"CLOSED\");\n }\n },\n\n isAllowed(): boolean {\n if (state === \"CLOSED\") return true;\n if (state === \"OPEN\") {\n return Date.now() - openedAt >= recoveryTimeMs;\n }\n // HALF_OPEN\n return halfOpenRequests < halfOpenMaxRequests;\n },\n };\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/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","type","props","entry","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","historySection","undoBtn","redoBtn","historyLabel","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","eventCount","empty","now","time","preview","timeSpan","typeSpan","previewSpan","updatePerfSection","perf","avgReconcile","lines","line","div","resolverHeader","sorted","b","stats","avg","updateHistoryControls","tt","current","total","canUndo","canRedo","setupHistoryButtons","graphCaches","computeFingerprint","factKeys","derivKeys","constraints","reqMap","resolverIds","activeResolverIds","c","r","updateAnimationAttrs","cache","depGraph","constraintIds","node","pulsing","updateDependencyGraph","inspection","allConstraints","unmetReqs","inflightReqs","u","f","text","fingerprint","existingCache","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","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","a","_system","change","_snapshot","oldest","DEVTOOLS_EVENT_NAME","BLOCKED_KEYS","SESSION_NONCE","getNextId","sanitizeEvent","needsSanitize","clean","emitDevToolsEvent","safe","full","persistencePlugin","storage","include","exclude","debounce","onRestore","onSave","onError","saveTimeout","trackedKeys","shouldPersist","factKey","load","isPrototypeSafe","save","scheduleSave","shouldSave","performancePlugin","onSlowConstraint","onSlowResolver","slowConstraintThresholdMs","slowResolverThresholdMs","resolvers","effects","reconcile","startedAt","reconcileStartTime","lastConstraintEvalEndTime","getConstraintMetrics","m","getResolverMetrics","getEffectMetrics","plugin","_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","val","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 { ModuleSchema, Plugin } from \"../core/types.js\";\n\n/**\n * Configuration for the {@link loggingPlugin}.\n *\n * @remarks\n * All fields are optional. The defaults produce `[Directive]`-prefixed\n * `console.info`-level output for every lifecycle event.\n *\n * | Field | Default | Description |\n * |----------|-----------------|-------------|\n * | `level` | `\"info\"` | Minimum severity to emit. |\n * | `filter` | `() => true` | Predicate that receives the event name (e.g., `\"fact.set\"`) and returns whether to log it. |\n * | `logger` | `console` | Any object implementing `debug`, `info`, `warn`, `error`, `group`, and `groupEnd`. |\n * | `prefix` | `\"[Directive]\"` | String prepended to every log line. |\n *\n * @public\n */\nexport interface LoggingPluginOptions {\n /** Minimum log level; events below this severity are silenced. */\n level?: \"debug\" | \"info\" | \"warn\" | \"error\";\n /** Predicate that receives the event name and returns whether to log it. */\n filter?: (event: string) => boolean;\n /** Custom logger object (defaults to `console`). */\n logger?: Pick<\n Console,\n \"debug\" | \"info\" | \"warn\" | \"error\" | \"group\" | \"groupEnd\"\n >;\n /** String prepended to every log message. */\n prefix?: string;\n}\n\nconst LOG_LEVELS = { debug: 0, info: 1, warn: 2, error: 3 };\n\n/**\n * Create a plugin that logs Directive lifecycle events to a configurable logger.\n *\n * @remarks\n * Every plugin hook is mapped to a log call at an appropriate severity:\n * - `debug` -- init, destroy, fact changes, derivation compute/invalidate, reconcile, constraint evaluate, resolver start/cancel, effect run, snapshot\n * - `info` -- start, stop, requirement met, resolver complete, time-travel jump\n * - `warn` -- resolver retry, error recovery\n * - `error` -- constraint error, resolver error, effect error, system error\n *\n * @param options - Optional {@link LoggingPluginOptions} to control level, filtering, logger backend, and prefix.\n * @returns A {@link Plugin} that can be passed to `createSystem`'s `plugins` array.\n *\n * @example\n * ```ts\n * const system = createSystem({\n * modules: [myModule],\n * plugins: [loggingPlugin({ level: \"debug\" })],\n * });\n * ```\n *\n * @public\n */\nexport function loggingPlugin<M extends ModuleSchema = ModuleSchema>(\n options: LoggingPluginOptions = {},\n): Plugin<M> {\n const {\n level = \"info\",\n filter = () => true,\n logger = console,\n prefix = \"[Directive]\",\n } = options;\n\n const minLevel = LOG_LEVELS[level];\n\n const log = (\n eventLevel: keyof typeof LOG_LEVELS,\n event: string,\n ...args: unknown[]\n ) => {\n if (LOG_LEVELS[eventLevel] < minLevel) return;\n if (!filter(event)) return;\n logger[eventLevel](`${prefix} ${event}`, ...args);\n };\n\n return {\n name: \"logging\",\n\n onInit: () => log(\"debug\", \"init\"),\n onStart: () => log(\"info\", \"start\"),\n onStop: () => log(\"info\", \"stop\"),\n onDestroy: () => log(\"debug\", \"destroy\"),\n\n onFactSet: (key, value, prev) => {\n log(\"debug\", \"fact.set\", { key, value, prev });\n },\n\n onFactDelete: (key, prev) => {\n log(\"debug\", \"fact.delete\", { key, prev });\n },\n\n onFactsBatch: (changes) => {\n log(\"debug\", \"facts.batch\", { count: changes.length, changes });\n },\n\n onDerivationCompute: (id, value, deps) => {\n log(\"debug\", \"derivation.compute\", { id, value, deps });\n },\n\n onDerivationInvalidate: (id) => {\n log(\"debug\", \"derivation.invalidate\", { id });\n },\n\n onReconcileStart: () => {\n log(\"debug\", \"reconcile.start\");\n },\n\n onReconcileEnd: (result) => {\n log(\"debug\", \"reconcile.end\", {\n unmet: result.unmet.length,\n inflight: result.inflight.length,\n completed: result.completed.length,\n canceled: result.canceled.length,\n });\n },\n\n onConstraintEvaluate: (id, active) => {\n log(\"debug\", \"constraint.evaluate\", { id, active });\n },\n\n onConstraintError: (id, error) => {\n log(\"error\", \"constraint.error\", { id, error });\n },\n\n onRequirementCreated: (req) => {\n log(\"debug\", \"requirement.created\", {\n id: req.id,\n type: req.requirement.type,\n });\n },\n\n onRequirementMet: (req, byResolver) => {\n log(\"info\", \"requirement.met\", { id: req.id, byResolver });\n },\n\n onRequirementCanceled: (req) => {\n log(\"debug\", \"requirement.canceled\", { id: req.id });\n },\n\n onResolverStart: (resolver, req) => {\n log(\"debug\", \"resolver.start\", { resolver, requirementId: req.id });\n },\n\n onResolverComplete: (resolver, req, duration) => {\n log(\"info\", \"resolver.complete\", {\n resolver,\n requirementId: req.id,\n duration,\n });\n },\n\n onResolverError: (resolver, req, error) => {\n log(\"error\", \"resolver.error\", {\n resolver,\n requirementId: req.id,\n error,\n });\n },\n\n onResolverRetry: (resolver, req, attempt) => {\n log(\"warn\", \"resolver.retry\", {\n resolver,\n requirementId: req.id,\n attempt,\n });\n },\n\n onResolverCancel: (resolver, req) => {\n log(\"debug\", \"resolver.cancel\", { resolver, requirementId: req.id });\n },\n\n onEffectRun: (id) => {\n log(\"debug\", \"effect.run\", { id });\n },\n\n onEffectError: (id, error) => {\n log(\"error\", \"effect.error\", { id, error });\n },\n\n onSnapshot: (snapshot) => {\n log(\"debug\", \"timetravel.snapshot\", {\n id: snapshot.id,\n trigger: snapshot.trigger,\n });\n },\n\n onHistoryNavigate: (from, to) => {\n log(\"info\", \"timetravel.jump\", { from, to });\n },\n\n onError: (error) => {\n log(\"error\", \"error\", {\n source: error.source,\n sourceId: error.sourceId,\n message: error.message,\n });\n },\n\n onErrorRecovery: (error, strategy) => {\n log(\"warn\", \"error.recovery\", {\n source: error.source,\n sourceId: error.sourceId,\n strategy,\n });\n },\n\n onDefinitionRegister: (type, id) => {\n log(\"info\", \"definition.register\", { type, id });\n },\n\n onDefinitionAssign: (type, id) => {\n log(\"info\", \"definition.assign\", { type, id });\n },\n\n onDefinitionUnregister: (type, id) => {\n log(\"info\", \"definition.unregister\", { type, id });\n },\n\n onDefinitionCall: (type, id, props) => {\n log(\"debug\", \"definition.call\", { type, id, props });\n },\n\n onTraceComplete: (entry) => {\n log(\"debug\", \"trace.complete\", {\n id: entry.id,\n status: entry.status,\n duration: entry.duration,\n factChanges: entry.factChanges.length,\n derivationsRecomputed: entry.derivationsRecomputed.length,\n constraintsHit: entry.constraintsHit.length,\n resolversStarted: entry.resolversStarted.length,\n effectsRun: entry.effectsRun.length,\n });\n },\n };\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 /** Name for this system in devtools */\n name?: string;\n /** Enable trace logging */\n trace?: boolean;\n /** Maximum number of trace events to retain (default: 1000) */\n maxEvents?: number;\n /** Show floating debug panel (dev mode only, requires browser) */\n panel?: boolean;\n /** Panel position */\n position?: \"bottom-right\" | \"bottom-left\" | \"top-right\" | \"top-left\";\n /** Start panel open */\n defaultOpen?: boolean;\n}\n\n// ============================================================================\n// Circular Buffer — O(1) push with bounded capacity\n// ============================================================================\n\nexport interface TraceEvent {\n timestamp: number;\n type: string;\n data: unknown;\n}\n\nexport class CircularBuffer<T> {\n private buf: (T | undefined)[];\n private head = 0;\n private _size = 0;\n\n constructor(private capacity: number) {\n this.buf = new Array(capacity);\n }\n\n get size() {\n return this._size;\n }\n\n push(item: T) {\n this.buf[this.head] = item;\n this.head = (this.head + 1) % this.capacity;\n if (this._size < this.capacity) {\n this._size++;\n }\n }\n\n toArray(): T[] {\n if (this._size === 0) {\n return [];\n }\n if (this._size < this.capacity) {\n return this.buf.slice(0, this._size) as T[];\n }\n\n return [\n ...(this.buf.slice(this.head) as T[]),\n ...(this.buf.slice(0, this.head) as T[]),\n ];\n }\n\n clear() {\n this.buf = new Array(this.capacity);\n this.head = 0;\n this._size = 0;\n }\n}\n\n// ============================================================================\n// Subscriber\n// ============================================================================\n\nexport type DevtoolsSubscriber = (event: TraceEvent) => void;\n\n// ============================================================================\n// Devtools State\n// ============================================================================\n\nexport interface DevtoolsState {\n system: System<ModuleSchema> | null;\n events: CircularBuffer<TraceEvent>;\n maxEvents: number;\n subscribers: Set<DevtoolsSubscriber>;\n resolverStats: Map<\n string,\n { count: number; totalMs: number; errors: number }\n >;\n}\n\ndeclare global {\n interface Window {\n __DIRECTIVE__?: {\n systems: Map<string, DevtoolsState>;\n getSystem(name?: string): System<ModuleSchema> | null;\n getSystems(): string[];\n inspect(name?: string): unknown;\n getEvents(name?: string): TraceEvent[];\n explain(requirementId: string, name?: string): string | null;\n exportSession(name?: string): string | null;\n importSession(json: string, name?: string): boolean;\n clearEvents(name?: string): void;\n /** Subscribe to trace events. Returns unsubscribe function. */\n subscribe(callback: DevtoolsSubscriber, systemName?: string): () => void;\n };\n }\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 try {\n if (\n typeof process !== \"undefined\" &&\n process.env?.NODE_ENV === \"production\"\n ) {\n return false;\n }\n } catch {\n // process not available\n }\n try {\n if (\n typeof import.meta !== \"undefined\" &&\n // @ts-expect-error — import.meta.env is Vite-specific\n import.meta.env?.MODE === \"production\"\n ) {\n return false;\n }\n } catch {\n // import.meta.env not available\n }\n return true;\n}\n\n/** @internal Format a value for display in the devtools panel. */\nexport function formatValue(value: unknown): string {\n try {\n if (value === undefined) {\n return \"undefined\";\n }\n if (value === null) {\n return \"null\";\n }\n if (typeof value === \"bigint\") {\n return String(value) + \"n\";\n }\n if (typeof value === \"symbol\") {\n return String(value);\n }\n if (typeof value === \"object\") {\n const str = JSON.stringify(value, (_k, v) => {\n if (typeof v === \"bigint\") {\n return String(v) + \"n\";\n }\n if (typeof v === \"symbol\") {\n return String(v);\n }\n\n return v;\n });\n\n return str.length > 120 ? str.slice(0, 117) + \"...\" : str;\n }\n\n return String(value);\n } catch {\n return \"<error>\";\n }\n}\n\n/** @internal Truncate a string to a maximum length with ellipsis. */\nexport function truncate(str: string, max: number): string {\n if (str.length <= max) {\n return str;\n }\n\n return str.slice(0, max - 3) + \"...\";\n}\n\n/** @internal Safely call system.inspect(), returning null on error. */\nexport function safeInspect(system: System<ModuleSchema>) {\n try {\n return system.inspect();\n } catch {\n return null;\n }\n}\n\n/** E15: Deep-clone event data via JSON round-trip to prevent reference sharing */\nexport function cloneViaJSON(data: unknown): unknown {\n try {\n if (data === null || data === undefined || typeof data !== \"object\") {\n return data;\n }\n\n return JSON.parse(JSON.stringify(data));\n } catch {\n return null;\n }\n}\n\n/** M7: Validate maxEvents — floor at 1, default 1000 */\nexport function validateMaxEvents(value: number | undefined): number {\n if (value === undefined) {\n return 1000;\n }\n if (!Number.isFinite(value) || value < 1) {\n if (isDevMode()) {\n console.warn(\n `[directive:devtools] Invalid maxEvents value (${value}), using default 1000`,\n );\n }\n\n return 1000;\n }\n\n return Math.floor(value);\n}\n\n// ============================================================================\n// Performance Metrics\n// ============================================================================\n\nexport interface PerfMetrics {\n reconcileCount: number;\n reconcileTotalMs: number;\n resolverStats: Map<\n string,\n { count: number; totalMs: number; errors: number }\n >;\n effectRunCount: number;\n effectErrorCount: number;\n lastReconcileStartMs: number;\n}\n\n/** @internal Create initial performance metrics state. */\nexport function createPerfMetrics(): PerfMetrics {\n return {\n reconcileCount: 0,\n reconcileTotalMs: 0,\n resolverStats: new Map(),\n effectRunCount: 0,\n effectErrorCount: 0,\n lastReconcileStartMs: 0,\n };\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 = [\n \"#8b9aff\",\n \"#4ade80\",\n \"#fbbf24\",\n \"#c084fc\",\n \"#f472b6\",\n \"#22d3ee\",\n] as const;\n\nexport interface TimelineEntry {\n resolver: string;\n startMs: number;\n endMs: number;\n error: boolean;\n}\n\nexport interface TimelineState {\n entries: CircularBuffer<TimelineEntry>;\n /** Map of resolver → startMs for inflight resolvers */\n inflight: Map<string, number>;\n}\n\n/** @internal Create initial timeline state for resolver flamechart. */\nexport function createTimelineState(): TimelineState {\n return {\n entries: new CircularBuffer<TimelineEntry>(MAX_TIMELINE_ENTRIES),\n inflight: new Map(),\n };\n}\n\n// ============================================================================\n// Dependency Graph Tracking\n// ============================================================================\n\nexport interface DepGraph {\n /** derivation ID → fact keys it depends on */\n derivationDeps: Map<string, string[]>;\n /** currently active constraint IDs */\n activeConstraints: Set<string>;\n /** set of fact keys that recently changed (for animation) */\n recentlyChangedFacts: Set<string>;\n /** set of derivation IDs that recently recomputed */\n recentlyComputedDerivations: Set<string>;\n /** set of constraint IDs that recently evaluated to active */\n recentlyActiveConstraints: Set<string>;\n /** animation clear timer */\n animationTimer: ReturnType<typeof setTimeout> | null;\n}\n\n/** @internal Create initial dependency graph tracking state. */\nexport function createDepGraph(): DepGraph {\n return {\n derivationDeps: new Map(),\n activeConstraints: new Set(),\n recentlyChangedFacts: new Set(),\n recentlyComputedDerivations: new Set(),\n recentlyActiveConstraints: new Set(),\n animationTimer: null,\n };\n}\n\n// ============================================================================\n// Record & Replay\n// ============================================================================\n\n// Recording caps to prevent unbounded growth\nexport const MAX_RECORDED_EVENTS = 10_000;\nexport const MAX_RECORDED_SNAPSHOTS = 100;\n\nexport interface RecordingState {\n isRecording: boolean;\n recordedEvents: TraceEvent[];\n snapshots: Array<{ timestamp: number; facts: Record<string, unknown> }>;\n}\n\n/** @internal Create initial recording state for event capture. */\nexport function createRecordingState(): RecordingState {\n return {\n isRecording: false,\n recordedEvents: [],\n snapshots: [],\n };\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 bg: \"#1a1a2e\",\n text: \"#e0e0e0\",\n accent: \"#8b9aff\", // 6.63:1 contrast ratio\n muted: \"#b0b0d0\", // 8.10:1 contrast ratio\n border: \"#333\",\n rowBorder: \"#2a2a4a\",\n green: \"#4ade80\",\n yellow: \"#fbbf24\",\n red: \"#f87171\",\n closeBtn: \"#aaa\", // 7.34:1 contrast ratio\n font: \"ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace\",\n} as const;\n\n// Flow diagram layout constants\nexport const FLOW = {\n nodeW: 90,\n nodeH: 16,\n nodeGap: 6,\n startY: 16,\n columns: 5, // facts, derivations, constraints, requirements, resolvers\n colGap: 20,\n fontSize: 10,\n labelMaxChars: 11,\n} as const;\n\nexport interface PanelRefs {\n container: HTMLDivElement;\n toggleBtn: HTMLButtonElement;\n titleEl: HTMLElement;\n statusEl: HTMLSpanElement;\n factsBody: HTMLTableSectionElement;\n factsCount: HTMLSpanElement;\n derivBody: HTMLTableSectionElement;\n derivCount: HTMLSpanElement;\n derivSection: HTMLDetailsElement;\n inflightList: HTMLUListElement;\n inflightSection: HTMLDetailsElement;\n inflightCount: HTMLSpanElement;\n unmetList: HTMLUListElement;\n unmetSection: HTMLDetailsElement;\n unmetCount: HTMLSpanElement;\n perfSection: HTMLDetailsElement;\n perfBody: HTMLDivElement;\n historySection: HTMLDivElement;\n historyLabel: HTMLSpanElement;\n undoBtn: HTMLButtonElement;\n redoBtn: HTMLButtonElement;\n flowSection: HTMLDetailsElement;\n flowSvg: SVGSVGElement;\n timelineSection: HTMLDetailsElement;\n timelineSvg: SVGSVGElement;\n eventsSection: HTMLDetailsElement;\n eventsList: HTMLDivElement;\n eventsCount: HTMLSpanElement;\n traceHint: HTMLDivElement;\n recordBtn: HTMLButtonElement;\n exportBtn: 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 type DevtoolsPluginOptions,\n MAX_PANEL_EVENTS,\n type PanelRefs,\n type PerfMetrics,\n S,\n TIMELINE_SVG_W,\n formatValue,\n truncate,\n} from \"./devtools-types.js\";\n\n// ============================================================================\n// Panel Creation\n// ============================================================================\n\n/** @internal Create the floating devtools panel DOM structure. */\nexport function createPanel(\n systemName: string,\n position: NonNullable<DevtoolsPluginOptions[\"position\"]>,\n defaultOpen: boolean,\n showEvents: boolean,\n): {\n refs: PanelRefs;\n destroy: () => void;\n isOpen: () => boolean;\n flashTimers: Set<ReturnType<typeof setTimeout>>;\n} {\n let destroyed = false;\n const posStyles: Record<string, string> = {\n position: \"fixed\",\n zIndex: \"99999\",\n ...(position.includes(\"bottom\") ? { bottom: \"12px\" } : { top: \"12px\" }),\n ...(position.includes(\"right\") ? { right: \"12px\" } : { left: \"12px\" }),\n };\n\n // Inject focus-visible styles (E3)\n const styleEl = document.createElement(\"style\");\n styleEl.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 document.head.appendChild(styleEl);\n\n // Toggle button — 44x44px minimum touch target\n const toggleBtn = document.createElement(\"button\");\n toggleBtn.setAttribute(\"aria-label\", \"Open Directive DevTools\");\n toggleBtn.setAttribute(\"aria-expanded\", String(defaultOpen));\n toggleBtn.title = \"Ctrl+Shift+D to toggle\";\n Object.assign(toggleBtn.style, {\n ...posStyles,\n background: S.bg,\n color: S.text,\n border: `1px solid ${S.border}`,\n borderRadius: \"6px\",\n padding: \"10px 14px\",\n minWidth: \"44px\",\n minHeight: \"44px\",\n cursor: \"pointer\",\n fontFamily: S.font,\n fontSize: \"12px\",\n display: defaultOpen ? \"none\" : \"block\",\n });\n toggleBtn.textContent = \"Directive\";\n\n // Container — responsive sizing\n const container = document.createElement(\"div\");\n container.setAttribute(\"role\", \"region\");\n container.setAttribute(\"aria-label\", \"Directive DevTools\");\n container.setAttribute(\"data-directive-devtools\", \"\");\n container.tabIndex = -1;\n Object.assign(container.style, {\n ...posStyles,\n background: S.bg,\n color: S.text,\n border: `1px solid ${S.border}`,\n borderRadius: \"8px\",\n padding: \"12px\",\n fontFamily: S.font,\n fontSize: \"11px\",\n maxWidth: \"min(380px, calc(100vw - 24px))\",\n maxHeight: \"min(500px, calc(100vh - 24px))\",\n overflow: \"auto\",\n boxShadow: \"0 4px 20px rgba(0,0,0,0.5)\",\n display: defaultOpen ? \"block\" : \"none\",\n });\n\n // Header\n const header = document.createElement(\"div\");\n Object.assign(header.style, {\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n marginBottom: \"8px\",\n });\n const titleEl = document.createElement(\"strong\");\n titleEl.style.color = S.accent;\n titleEl.textContent =\n systemName === \"default\"\n ? \"Directive DevTools\"\n : `DevTools (${systemName})`;\n const closeBtn = document.createElement(\"button\");\n closeBtn.setAttribute(\"aria-label\", \"Close DevTools\");\n Object.assign(closeBtn.style, {\n background: \"none\",\n border: \"none\",\n color: S.closeBtn,\n cursor: \"pointer\",\n fontSize: \"16px\",\n padding: \"8px 12px\",\n minWidth: \"44px\",\n minHeight: \"44px\",\n lineHeight: \"1\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n });\n closeBtn.textContent = \"\\u00D7\";\n header.appendChild(titleEl);\n header.appendChild(closeBtn);\n container.appendChild(header);\n\n // Status\n const statusRow = document.createElement(\"div\");\n statusRow.style.marginBottom = \"6px\";\n statusRow.setAttribute(\"aria-live\", \"polite\");\n const statusEl = document.createElement(\"span\");\n statusEl.style.color = S.green;\n statusEl.textContent = \"Settled\";\n statusRow.appendChild(statusEl);\n container.appendChild(statusRow);\n\n // Time-travel controls — 44px touch targets (M6)\n const historySection = document.createElement(\"div\");\n Object.assign(historySection.style, {\n display: \"none\",\n marginBottom: \"8px\",\n padding: \"4px 8px\",\n background: \"#252545\",\n borderRadius: \"4px\",\n alignItems: \"center\",\n gap: \"6px\",\n });\n const undoBtn = document.createElement(\"button\");\n Object.assign(undoBtn.style, {\n background: \"none\",\n border: `1px solid ${S.border}`,\n color: S.text,\n cursor: \"pointer\",\n padding: \"4px 10px\",\n borderRadius: \"3px\",\n fontFamily: S.font,\n fontSize: \"11px\",\n minWidth: \"44px\",\n minHeight: \"44px\",\n });\n undoBtn.textContent = \"\\u25C0 Undo\";\n undoBtn.disabled = true;\n const redoBtn = document.createElement(\"button\");\n Object.assign(redoBtn.style, {\n background: \"none\",\n border: `1px solid ${S.border}`,\n color: S.text,\n cursor: \"pointer\",\n padding: \"4px 10px\",\n borderRadius: \"3px\",\n fontFamily: S.font,\n fontSize: \"11px\",\n minWidth: \"44px\",\n minHeight: \"44px\",\n });\n redoBtn.textContent = \"Redo \\u25B6\";\n redoBtn.disabled = true;\n const historyLabel = document.createElement(\"span\");\n historyLabel.style.color = S.muted;\n historyLabel.style.fontSize = \"10px\";\n historySection.appendChild(undoBtn);\n historySection.appendChild(redoBtn);\n historySection.appendChild(historyLabel);\n container.appendChild(historySection);\n\n // Helper: create table section\n function createTableSection(label: string, open: boolean) {\n const details = document.createElement(\"details\");\n if (open) {\n details.open = true;\n }\n details.style.marginBottom = \"4px\";\n const summary = document.createElement(\"summary\");\n Object.assign(summary.style, {\n cursor: \"pointer\",\n color: S.accent,\n marginBottom: \"4px\",\n });\n const countSpan = document.createElement(\"span\");\n summary.textContent = `${label} (`;\n summary.appendChild(countSpan);\n summary.appendChild(document.createTextNode(\")\"));\n countSpan.textContent = \"0\";\n details.appendChild(summary);\n\n const table = document.createElement(\"table\");\n Object.assign(table.style, {\n width: \"100%\",\n borderCollapse: \"collapse\",\n fontSize: \"11px\",\n });\n const thead = document.createElement(\"thead\");\n const headRow = document.createElement(\"tr\");\n for (const col of [\"Key\", \"Value\"]) {\n const th = document.createElement(\"th\");\n th.scope = \"col\";\n Object.assign(th.style, {\n textAlign: \"left\",\n padding: \"2px 4px\",\n color: S.accent,\n });\n th.textContent = col;\n headRow.appendChild(th);\n }\n thead.appendChild(headRow);\n table.appendChild(thead);\n const tbody = document.createElement(\"tbody\");\n table.appendChild(tbody);\n details.appendChild(table);\n\n return { details, tbody, countSpan };\n }\n\n // Helper: create list section with empty state\n function createListSection(label: string, color: string) {\n const details = document.createElement(\"details\");\n details.style.marginBottom = \"4px\";\n const summary = document.createElement(\"summary\");\n Object.assign(summary.style, {\n cursor: \"pointer\",\n color,\n marginBottom: \"4px\",\n });\n const countSpan = document.createElement(\"span\");\n summary.textContent = `${label} (`;\n summary.appendChild(countSpan);\n summary.appendChild(document.createTextNode(\")\"));\n countSpan.textContent = \"0\";\n details.appendChild(summary);\n const list = document.createElement(\"ul\");\n Object.assign(list.style, { margin: \"0\", paddingLeft: \"16px\" });\n details.appendChild(list);\n\n return { details, list, countSpan };\n }\n\n // Facts section\n const factsSection = createTableSection(\"Facts\", true);\n container.appendChild(factsSection.details);\n\n // Derivations section (always visible, shows empty state E1)\n const derivSection = createTableSection(\"Derivations\", false);\n container.appendChild(derivSection.details);\n\n // Inflight section\n const inflightSection = createListSection(\"Inflight\", S.yellow);\n container.appendChild(inflightSection.details);\n\n // Unmet section\n const unmetSection = createListSection(\"Unmet\", S.red);\n container.appendChild(unmetSection.details);\n\n // Performance section\n const perfDetails = document.createElement(\"details\");\n perfDetails.style.marginBottom = \"4px\";\n const perfSummary = document.createElement(\"summary\");\n Object.assign(perfSummary.style, {\n cursor: \"pointer\",\n color: S.accent,\n marginBottom: \"4px\",\n });\n perfSummary.textContent = \"Performance\";\n perfDetails.appendChild(perfSummary);\n const perfBody = document.createElement(\"div\");\n perfBody.style.fontSize = \"10px\";\n perfBody.style.color = S.muted;\n perfBody.textContent = \"No data yet\";\n perfDetails.appendChild(perfBody);\n container.appendChild(perfDetails);\n\n // Flow diagram section (I2: full dependency graph)\n const flowDetails = document.createElement(\"details\");\n flowDetails.style.marginBottom = \"4px\";\n const flowSummary = document.createElement(\"summary\");\n Object.assign(flowSummary.style, {\n cursor: \"pointer\",\n color: S.accent,\n marginBottom: \"4px\",\n });\n flowSummary.textContent = \"Dependency Graph\";\n flowDetails.appendChild(flowSummary);\n const flowSvg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n flowSvg.setAttribute(\"width\", \"100%\");\n flowSvg.setAttribute(\"height\", \"120\");\n flowSvg.setAttribute(\"role\", \"img\");\n flowSvg.setAttribute(\"aria-label\", \"System dependency graph\");\n flowSvg.style.display = \"block\";\n // E7: Responsive — use viewBox so SVG scales\n flowSvg.setAttribute(\"viewBox\", \"0 0 460 120\");\n flowSvg.setAttribute(\"preserveAspectRatio\", \"xMinYMin meet\");\n flowDetails.appendChild(flowSvg);\n container.appendChild(flowDetails);\n\n // I1: Timeline/Flamechart section\n const timelineDetails = document.createElement(\"details\");\n timelineDetails.style.marginBottom = \"4px\";\n const timelineSummary = document.createElement(\"summary\");\n Object.assign(timelineSummary.style, {\n cursor: \"pointer\",\n color: S.accent,\n marginBottom: \"4px\",\n });\n timelineSummary.textContent = \"Timeline\";\n timelineDetails.appendChild(timelineSummary);\n const timelineSvg = document.createElementNS(\n \"http://www.w3.org/2000/svg\",\n \"svg\",\n );\n timelineSvg.setAttribute(\"width\", \"100%\");\n timelineSvg.setAttribute(\"height\", \"60\");\n timelineSvg.setAttribute(\"role\", \"img\");\n timelineSvg.setAttribute(\"aria-label\", \"Resolver execution timeline\");\n timelineSvg.style.display = \"block\";\n timelineSvg.setAttribute(\"viewBox\", `0 0 ${TIMELINE_SVG_W} 60`);\n timelineSvg.setAttribute(\"preserveAspectRatio\", \"xMinYMin meet\");\n const timelineEmpty = document.createElementNS(\n \"http://www.w3.org/2000/svg\",\n \"text\",\n );\n timelineEmpty.setAttribute(\"x\", String(TIMELINE_SVG_W / 2));\n timelineEmpty.setAttribute(\"y\", \"30\");\n timelineEmpty.setAttribute(\"text-anchor\", \"middle\");\n timelineEmpty.setAttribute(\"fill\", S.muted);\n timelineEmpty.setAttribute(\"font-size\", \"10\");\n timelineEmpty.setAttribute(\"font-family\", S.font);\n timelineEmpty.textContent = \"No resolver activity yet\";\n timelineSvg.appendChild(timelineEmpty);\n timelineDetails.appendChild(timelineSvg);\n container.appendChild(timelineDetails);\n\n // Events section\n let eventsSection: HTMLDetailsElement;\n let eventsList: HTMLDivElement;\n let eventsCount: HTMLSpanElement;\n let traceHint: HTMLDivElement;\n\n if (showEvents) {\n const evDetails = document.createElement(\"details\");\n evDetails.style.marginBottom = \"4px\";\n const evSummary = document.createElement(\"summary\");\n Object.assign(evSummary.style, {\n cursor: \"pointer\",\n color: S.accent,\n marginBottom: \"4px\",\n });\n eventsCount = document.createElement(\"span\");\n eventsCount.textContent = \"0\";\n evSummary.textContent = \"Events (\";\n evSummary.appendChild(eventsCount);\n evSummary.appendChild(document.createTextNode(\")\"));\n evDetails.appendChild(evSummary);\n eventsList = document.createElement(\"div\");\n Object.assign(eventsList.style, {\n maxHeight: \"150px\",\n overflow: \"auto\",\n fontSize: \"10px\",\n });\n eventsList.setAttribute(\"role\", \"log\");\n eventsList.setAttribute(\"aria-live\", \"polite\");\n eventsList.tabIndex = 0;\n // E2: Empty state for events\n const waitingMsg = document.createElement(\"div\");\n waitingMsg.style.color = S.muted;\n waitingMsg.style.padding = \"4px\";\n waitingMsg.textContent = \"Waiting for events...\";\n waitingMsg.className = \"dt-events-empty\";\n eventsList.appendChild(waitingMsg);\n evDetails.appendChild(eventsList);\n container.appendChild(evDetails);\n eventsSection = evDetails;\n traceHint = document.createElement(\"div\");\n } else {\n eventsSection = document.createElement(\"details\");\n eventsList = document.createElement(\"div\");\n eventsCount = document.createElement(\"span\");\n // E13: Trace hint when trace is off\n traceHint = document.createElement(\"div\");\n traceHint.style.fontSize = \"10px\";\n traceHint.style.color = S.muted;\n traceHint.style.marginTop = \"4px\";\n traceHint.style.fontStyle = \"italic\";\n traceHint.textContent = \"Enable trace: true for event log\";\n container.appendChild(traceHint);\n }\n\n // Record & export buttons (I3)\n const recordRow = document.createElement(\"div\");\n Object.assign(recordRow.style, {\n display: \"flex\",\n gap: \"6px\",\n marginTop: \"6px\",\n });\n const recordBtn = document.createElement(\"button\");\n Object.assign(recordBtn.style, {\n background: \"none\",\n border: `1px solid ${S.border}`,\n color: S.text,\n cursor: \"pointer\",\n padding: \"8px 12px\",\n borderRadius: \"3px\",\n fontFamily: S.font,\n fontSize: \"10px\",\n minWidth: \"44px\",\n minHeight: \"44px\",\n });\n recordBtn.textContent = \"\\u23FA Record\";\n const exportBtn = document.createElement(\"button\");\n Object.assign(exportBtn.style, {\n background: \"none\",\n border: `1px solid ${S.border}`,\n color: S.text,\n cursor: \"pointer\",\n padding: \"8px 12px\",\n borderRadius: \"3px\",\n fontFamily: S.font,\n fontSize: \"10px\",\n minWidth: \"44px\",\n minHeight: \"44px\",\n });\n exportBtn.textContent = \"\\u2913 Export\";\n recordRow.appendChild(recordBtn);\n recordRow.appendChild(exportBtn);\n container.appendChild(recordRow);\n\n // E4: Scroll isolation — prevent page scroll when scrolling within panel\n container.addEventListener(\n \"wheel\",\n (e: WheelEvent) => {\n const el = container;\n const atTop = el.scrollTop === 0 && e.deltaY < 0;\n const atBottom =\n el.scrollTop + el.clientHeight >= el.scrollHeight && e.deltaY > 0;\n if (atTop || atBottom) {\n e.preventDefault();\n }\n },\n { passive: false },\n );\n\n // Open/close logic\n let panelOpen = defaultOpen;\n const flashTimers = new Set<ReturnType<typeof setTimeout>>();\n\n function open() {\n panelOpen = true;\n container.style.display = \"block\";\n toggleBtn.style.display = \"none\";\n toggleBtn.setAttribute(\"aria-expanded\", \"true\");\n closeBtn.focus();\n }\n\n function close() {\n panelOpen = false;\n container.style.display = \"none\";\n toggleBtn.style.display = \"block\";\n toggleBtn.setAttribute(\"aria-expanded\", \"false\");\n toggleBtn.focus();\n }\n\n toggleBtn.addEventListener(\"click\", open);\n closeBtn.addEventListener(\"click\", close);\n\n function onKeyDown(e: KeyboardEvent) {\n if (e.key === \"Escape\" && panelOpen) {\n close();\n }\n }\n container.addEventListener(\"keydown\", onKeyDown);\n\n // Global keyboard shortcut Ctrl+Shift+D / Cmd+Shift+D\n function onGlobalKeyDown(e: KeyboardEvent) {\n if (e.key === \"d\" && e.shiftKey && (e.ctrlKey || e.metaKey)) {\n e.preventDefault();\n if (panelOpen) {\n close();\n } else {\n open();\n }\n }\n }\n document.addEventListener(\"keydown\", onGlobalKeyDown);\n\n // Mount — guard document.body (M1)\n function mount() {\n if (destroyed) {\n return;\n }\n document.body.appendChild(toggleBtn);\n document.body.appendChild(container);\n }\n\n if (document.body) {\n mount();\n } else {\n // Store reference for cleanup\n document.addEventListener(\"DOMContentLoaded\", mount, { once: true });\n }\n\n function destroy() {\n destroyed = true;\n toggleBtn.removeEventListener(\"click\", open);\n closeBtn.removeEventListener(\"click\", close);\n container.removeEventListener(\"keydown\", onKeyDown);\n document.removeEventListener(\"keydown\", onGlobalKeyDown);\n // Clean up DOMContentLoaded listener in case body wasn't ready\n document.removeEventListener(\"DOMContentLoaded\", mount);\n for (const id of flashTimers) {\n clearTimeout(id);\n }\n flashTimers.clear();\n toggleBtn.remove();\n container.remove();\n styleEl.remove();\n }\n\n return {\n refs: {\n container,\n toggleBtn,\n titleEl,\n statusEl,\n factsBody: factsSection.tbody,\n factsCount: factsSection.countSpan,\n derivBody: derivSection.tbody,\n derivCount: derivSection.countSpan,\n derivSection: derivSection.details,\n inflightList: inflightSection.list,\n inflightSection: inflightSection.details,\n inflightCount: inflightSection.countSpan,\n unmetList: unmetSection.list,\n unmetSection: unmetSection.details,\n unmetCount: unmetSection.countSpan,\n perfSection: perfDetails,\n perfBody,\n historySection,\n historyLabel,\n undoBtn,\n redoBtn,\n flowSection: flowDetails,\n flowSvg,\n timelineSection: timelineDetails,\n timelineSvg,\n eventsSection,\n eventsList,\n eventsCount,\n traceHint,\n recordBtn,\n exportBtn,\n },\n destroy,\n isOpen: () => panelOpen,\n flashTimers,\n };\n}\n\n// ============================================================================\n// Panel Update Helpers\n// ============================================================================\n\n/** @internal Upsert a key/value row in a panel table. */\nexport function upsertTableRow(\n rowMap: Map<string, HTMLTableRowElement>,\n tbody: HTMLTableSectionElement,\n key: string,\n value: unknown,\n flash: boolean,\n flashTimers?: Set<ReturnType<typeof setTimeout>>,\n) {\n const display = formatValue(value);\n let row = rowMap.get(key);\n\n if (row) {\n const cells = row.cells;\n if (cells[1]) {\n cells[1].textContent = display;\n if (flash && flashTimers) {\n const cell = cells[1];\n cell.style.background = \"rgba(139, 154, 255, 0.25)\";\n const tid = setTimeout(() => {\n cell.style.background = \"\";\n flashTimers.delete(tid);\n }, 300);\n flashTimers.add(tid);\n }\n }\n } else {\n row = document.createElement(\"tr\");\n row.style.borderBottom = `1px solid ${S.rowBorder}`;\n const keyCell = document.createElement(\"td\");\n Object.assign(keyCell.style, { padding: \"2px 4px\", color: S.muted });\n keyCell.textContent = key;\n const valCell = document.createElement(\"td\");\n valCell.style.padding = \"2px 4px\";\n valCell.textContent = display;\n row.appendChild(keyCell);\n row.appendChild(valCell);\n tbody.appendChild(row);\n rowMap.set(key, row);\n }\n}\n\n/** @internal Remove a key/value row from a panel table. */\nexport function removeTableRow(\n rowMap: Map<string, HTMLTableRowElement>,\n key: string,\n) {\n const row = rowMap.get(key);\n if (row) {\n row.remove();\n rowMap.delete(key);\n }\n}\n\n/** @internal Render inflight and unmet requirement lists. */\nexport function renderRequirements(\n refs: PanelRefs,\n inflight: Array<{ id: string; resolverId: string; startedAt: number }>,\n unmet: Array<{\n id: string;\n requirement: { type: string };\n fromConstraint: string;\n }>,\n) {\n refs.inflightList.replaceChildren();\n refs.inflightCount.textContent = String(inflight.length);\n if (inflight.length > 0) {\n for (const r of inflight) {\n const li = document.createElement(\"li\");\n li.style.fontSize = \"11px\";\n li.textContent = `${r.resolverId} (${r.id})`;\n refs.inflightList.appendChild(li);\n }\n } else {\n const li = document.createElement(\"li\");\n li.style.fontSize = \"10px\";\n li.style.color = S.muted;\n li.textContent = \"None\";\n refs.inflightList.appendChild(li);\n }\n\n refs.unmetList.replaceChildren();\n refs.unmetCount.textContent = String(unmet.length);\n if (unmet.length > 0) {\n for (const r of unmet) {\n const li = document.createElement(\"li\");\n li.style.fontSize = \"11px\";\n li.textContent = `${r.requirement.type} from ${r.fromConstraint}`;\n refs.unmetList.appendChild(li);\n }\n } else {\n const li = document.createElement(\"li\");\n li.style.fontSize = \"10px\";\n li.style.color = S.muted;\n li.textContent = \"None\";\n refs.unmetList.appendChild(li);\n }\n}\n\n/** @internal Render the settled/working status indicator. */\nexport function renderStatus(\n refs: PanelRefs,\n inflightCount: number,\n unmetCount: number,\n) {\n const isSettled = inflightCount === 0 && unmetCount === 0;\n refs.statusEl.style.color = isSettled ? S.green : S.yellow;\n refs.statusEl.textContent = isSettled ? \"Settled\" : \"Working...\";\n refs.toggleBtn.textContent = isSettled ? \"Directive\" : \"Directive...\";\n refs.toggleBtn.setAttribute(\n \"aria-label\",\n `Open Directive DevTools${isSettled ? \"\" : \" (system working)\"}`,\n );\n}\n\n/** @internal Refresh derivation rows in the devtools panel. */\nexport function updateDerivations(\n refs: PanelRefs,\n derivRowMap: Map<string, HTMLTableRowElement>,\n system: System<ModuleSchema>,\n flashTimers?: Set<ReturnType<typeof setTimeout>>,\n) {\n const derivationKeys = Object.keys(system.derive);\n refs.derivCount.textContent = String(derivationKeys.length);\n\n // E1: Show empty state instead of hiding\n if (derivationKeys.length === 0) {\n derivRowMap.clear();\n refs.derivBody.replaceChildren();\n const row = document.createElement(\"tr\");\n const cell = document.createElement(\"td\");\n cell.colSpan = 2;\n cell.style.color = S.muted;\n cell.style.fontSize = \"10px\";\n cell.textContent = \"No derivations defined\";\n row.appendChild(cell);\n refs.derivBody.appendChild(row);\n\n return;\n }\n\n // Remove stale rows (E6: use Set for O(1) lookup)\n const keySet = new Set(derivationKeys);\n for (const [key, row] of derivRowMap) {\n if (!keySet.has(key)) {\n row.remove();\n derivRowMap.delete(key);\n }\n }\n\n // Update/add rows (E5: flash on derivation change)\n for (const key of derivationKeys) {\n let display: string;\n try {\n display = formatValue(system.read(key));\n } catch {\n display = \"<error>\";\n }\n upsertTableRow(\n derivRowMap,\n refs.derivBody,\n key,\n display,\n true,\n flashTimers,\n );\n }\n}\n\n/** @internal Append an event entry to the devtools event log. */\nexport function addEventRow(\n refs: PanelRefs,\n type: string,\n data: unknown,\n eventCount: number,\n) {\n // Clear \"Waiting for events...\" placeholder on first event\n const empty = refs.eventsList.querySelector(\".dt-events-empty\");\n if (empty) {\n empty.remove();\n }\n\n const row = document.createElement(\"div\");\n Object.assign(row.style, {\n padding: \"2px 4px\",\n borderBottom: `1px solid ${S.rowBorder}`,\n fontFamily: \"inherit\",\n });\n const now = new Date();\n const 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 let preview: string;\n try {\n const str = JSON.stringify(data);\n preview = truncate(str, 60);\n } catch {\n preview = \"{}\";\n }\n\n const timeSpan = document.createElement(\"span\");\n timeSpan.style.color = S.closeBtn;\n timeSpan.textContent = time;\n\n const typeSpan = document.createElement(\"span\");\n typeSpan.style.color = S.accent;\n typeSpan.textContent = ` ${type} `;\n\n const previewSpan = document.createElement(\"span\");\n previewSpan.style.color = S.muted;\n previewSpan.textContent = preview;\n\n row.appendChild(timeSpan);\n row.appendChild(typeSpan);\n row.appendChild(previewSpan);\n\n refs.eventsList.prepend(row);\n\n // Cap visible events\n while (refs.eventsList.childElementCount > MAX_PANEL_EVENTS) {\n refs.eventsList.lastElementChild?.remove();\n }\n\n refs.eventsCount.textContent = String(eventCount);\n}\n\n/** @internal Render performance metrics in the devtools panel. */\nexport function updatePerfSection(refs: PanelRefs, perf: PerfMetrics) {\n refs.perfBody.replaceChildren();\n\n const avgReconcile =\n perf.reconcileCount > 0\n ? (perf.reconcileTotalMs / perf.reconcileCount).toFixed(1)\n : \"\\u2014\";\n\n const lines: string[] = [\n `Reconciles: ${perf.reconcileCount} (avg ${avgReconcile}ms)`,\n `Effects: ${perf.effectRunCount} run, ${perf.effectErrorCount} errors`,\n ];\n\n for (const line of lines) {\n const div = document.createElement(\"div\");\n div.style.marginBottom = \"2px\";\n div.textContent = line;\n refs.perfBody.appendChild(div);\n }\n\n if (perf.resolverStats.size > 0) {\n const resolverHeader = document.createElement(\"div\");\n resolverHeader.style.marginTop = \"4px\";\n resolverHeader.style.marginBottom = \"2px\";\n resolverHeader.style.color = S.accent;\n resolverHeader.textContent = \"Resolvers:\";\n refs.perfBody.appendChild(resolverHeader);\n\n const sorted = [...perf.resolverStats.entries()].sort(\n (a, b) => b[1].totalMs - a[1].totalMs,\n );\n for (const [id, stats] of sorted) {\n const avg =\n stats.count > 0 ? (stats.totalMs / stats.count).toFixed(1) : \"0\";\n const div = document.createElement(\"div\");\n div.style.paddingLeft = \"8px\";\n div.textContent = `${id}: ${stats.count}x, avg ${avg}ms${stats.errors > 0 ? `, ${stats.errors} err` : \"\"}`;\n if (stats.errors > 0) {\n div.style.color = S.red;\n }\n refs.perfBody.appendChild(div);\n }\n }\n}\n\n/** @internal Update time-travel button states and snapshot label. */\nexport function updateHistoryControls(\n refs: PanelRefs,\n system: System<ModuleSchema>,\n) {\n const tt = system.history;\n if (!tt) {\n refs.historySection.style.display = \"none\";\n\n return;\n }\n refs.historySection.style.display = \"flex\";\n\n const current = tt.currentIndex;\n const total = tt.snapshots.length;\n refs.historyLabel.textContent =\n total > 0 ? `${current + 1} / ${total}` : \"0 snapshots\";\n\n const canUndo = current > 0;\n const canRedo = current < total - 1;\n refs.undoBtn.disabled = !canUndo;\n refs.undoBtn.style.opacity = canUndo ? \"1\" : \"0.4\";\n refs.redoBtn.disabled = !canRedo;\n refs.redoBtn.style.opacity = canRedo ? \"1\" : \"0.4\";\n}\n\n/** @internal Wire click handlers for undo/redo time-travel buttons. */\nexport function setupHistoryButtons(\n refs: PanelRefs,\n system: System<ModuleSchema>,\n) {\n refs.undoBtn.addEventListener(\"click\", () => {\n if (system.history && system.history.currentIndex > 0) {\n system.history.goBack(1);\n }\n });\n refs.redoBtn.addEventListener(\"click\", () => {\n if (\n system.history &&\n system.history.currentIndex < system.history.snapshots.length - 1\n ) {\n system.history.goForward(1);\n }\n });\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 type DepGraph,\n FLOW,\n type PanelRefs,\n S,\n TIMELINE_BAR_MIN_W,\n TIMELINE_COLORS,\n TIMELINE_LABEL_W,\n TIMELINE_ROW_H,\n TIMELINE_SVG_W,\n type TimelineState,\n safeInspect,\n truncate,\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 g: SVGGElement;\n rect: SVGRectElement;\n text: SVGTextElement;\n}\n\ninterface GraphCache {\n fingerprint: string;\n nodes: 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 factKeys: string[],\n derivKeys: string[],\n constraints: Array<{ id: string; active: boolean }>,\n reqMap: Map<string, { type: string; status: string }>,\n resolverIds: string[],\n activeResolverIds: string[],\n): string {\n return [\n factKeys.join(\",\"),\n derivKeys.join(\",\"),\n constraints.map((c) => `${c.id}:${c.active}`).join(\",\"),\n [...reqMap.entries()]\n .map(([id, r]) => `${id}:${r.status}:${r.type}`)\n .join(\",\"),\n resolverIds.join(\",\"),\n activeResolverIds.join(\",\"),\n ].join(\"|\");\n}\n\n/** Update only animation attributes (pulsing) on cached node elements. */\nfunction updateAnimationAttrs(\n cache: GraphCache,\n depGraph: DepGraph,\n factKeys: string[],\n derivKeys: string[],\n constraintIds: string[],\n) {\n for (const key of factKeys) {\n const node = cache.nodes.get(`0:${key}`);\n if (!node) {\n continue;\n }\n const pulsing = depGraph.recentlyChangedFacts.has(key);\n node.rect.setAttribute(\"fill\", pulsing ? S.text + \"33\" : \"none\");\n node.rect.setAttribute(\"stroke-width\", pulsing ? \"2\" : \"1\");\n }\n for (const key of derivKeys) {\n const node = cache.nodes.get(`1:${key}`);\n if (!node) {\n continue;\n }\n const pulsing = depGraph.recentlyComputedDerivations.has(key);\n node.rect.setAttribute(\"fill\", pulsing ? S.accent + \"33\" : \"none\");\n node.rect.setAttribute(\"stroke-width\", pulsing ? \"2\" : \"1\");\n }\n for (const id of constraintIds) {\n const node = cache.nodes.get(`2:${id}`);\n if (!node) {\n continue;\n }\n const pulsing = depGraph.recentlyActiveConstraints.has(id);\n // Active constraints use S.yellow, inactive use S.muted — these are part of the fingerprint,\n // so the color is already correct. Only update pulsing fill and stroke-width.\n const color = node.rect.getAttribute(\"stroke\") ?? S.muted;\n node.rect.setAttribute(\"fill\", pulsing ? color + \"33\" : \"none\");\n node.rect.setAttribute(\"stroke-width\", pulsing ? \"2\" : \"1\");\n }\n}\n\n// ============================================================================\n// Full Dependency Graph (facts→derivations→constraints→reqs→resolvers)\n// ============================================================================\n\n/** @internal Rebuild the full dependency graph SVG from current system state. */\nexport function updateDependencyGraph(\n refs: PanelRefs,\n system: System<ModuleSchema>,\n depGraph: DepGraph,\n) {\n const inspection = safeInspect(system);\n if (!inspection) {\n return;\n }\n\n // Collect all nodes\n let factKeys: string[];\n try {\n factKeys = Object.keys(system.facts.$store.toObject());\n } catch {\n factKeys = [];\n }\n const derivKeys = Object.keys(system.derive);\n const allConstraints = inspection.constraints;\n const unmetReqs = inspection.unmet;\n const inflightReqs = inspection.inflight;\n const resolverIds = Object.keys(inspection.resolvers);\n\n // Build requirement map\n const reqMap = new Map<\n string,\n { type: string; fromConstraint: string; status: string }\n >();\n for (const u of unmetReqs) {\n reqMap.set(u.id, {\n type: u.requirement.type,\n fromConstraint: u.fromConstraint,\n status: \"unmet\",\n });\n }\n for (const f of inflightReqs) {\n reqMap.set(f.id, {\n type: f.resolverId,\n fromConstraint: \"\",\n status: \"inflight\",\n });\n }\n\n // If nothing to show at all\n if (\n factKeys.length === 0 &&\n derivKeys.length === 0 &&\n allConstraints.length === 0 &&\n resolverIds.length === 0\n ) {\n graphCaches.delete(refs.flowSvg);\n refs.flowSvg.replaceChildren();\n refs.flowSvg.setAttribute(\"viewBox\", \"0 0 460 40\");\n const text = document.createElementNS(\"http://www.w3.org/2000/svg\", \"text\");\n text.setAttribute(\"x\", \"230\");\n text.setAttribute(\"y\", \"24\");\n text.setAttribute(\"text-anchor\", \"middle\");\n text.setAttribute(\"fill\", S.muted);\n text.setAttribute(\"font-size\", \"10\");\n text.setAttribute(\"font-family\", S.font);\n text.textContent = \"No system topology\";\n refs.flowSvg.appendChild(text);\n\n return;\n }\n\n // Check fingerprint — skip full rebuild if topology unchanged\n const activeResolverIds = inflightReqs.map((f) => f.resolverId).sort();\n const fingerprint = computeFingerprint(\n factKeys,\n derivKeys,\n allConstraints,\n reqMap,\n resolverIds,\n activeResolverIds,\n );\n\n const existingCache = graphCaches.get(refs.flowSvg);\n if (existingCache && existingCache.fingerprint === fingerprint) {\n // Topology unchanged — only update pulsing animation attributes\n updateAnimationAttrs(\n existingCache,\n depGraph,\n factKeys,\n derivKeys,\n allConstraints.map((c) => c.id),\n );\n\n return;\n }\n\n // Full rebuild — topology changed\n const colW = FLOW.nodeW + FLOW.colGap;\n const colX: [number, number, number, number, number] = [\n 5,\n 5 + colW,\n 5 + colW * 2,\n 5 + colW * 3,\n 5 + colW * 4,\n ];\n const totalW = colX[4] + FLOW.nodeW + 5;\n\n function layoutColumn<T>(items: T[]): Array<T & { y: number }> {\n let y = FLOW.startY + 12;\n\n return items.map((item) => {\n const node = { ...item, y };\n y += FLOW.nodeH + FLOW.nodeGap;\n\n return node;\n });\n }\n\n const factNodes = layoutColumn(\n factKeys.map((k) => ({ id: k, label: truncate(k, FLOW.labelMaxChars) })),\n );\n const derivNodes = layoutColumn(\n derivKeys.map((k) => ({ id: k, label: truncate(k, FLOW.labelMaxChars) })),\n );\n const constraintNodes = layoutColumn(\n allConstraints.map((c) => ({\n id: c.id,\n label: truncate(c.id, FLOW.labelMaxChars),\n active: c.active,\n priority: c.priority,\n })),\n );\n const reqNodeArr = layoutColumn(\n [...reqMap.entries()].map(([id, r]) => ({\n id,\n type: r.type,\n fromConstraint: r.fromConstraint,\n status: r.status,\n })),\n );\n const resolverNodeArr = layoutColumn(\n resolverIds.map((id) => ({ id, label: truncate(id, FLOW.labelMaxChars) })),\n );\n\n const maxRows = Math.max(\n factNodes.length,\n derivNodes.length,\n constraintNodes.length,\n reqNodeArr.length,\n resolverNodeArr.length,\n 1,\n );\n const totalH = FLOW.startY + 12 + maxRows * (FLOW.nodeH + FLOW.nodeGap) + 8;\n\n refs.flowSvg.replaceChildren();\n refs.flowSvg.setAttribute(\"viewBox\", `0 0 ${totalW} ${totalH}`);\n\n refs.flowSvg.setAttribute(\n \"aria-label\",\n `Dependency graph: ${factKeys.length} facts, ${derivKeys.length} derivations, ` +\n `${allConstraints.length} constraints, ${reqMap.size} requirements, ${resolverIds.length} resolvers`,\n );\n\n // Draw column headers\n const headers = [\"Facts\", \"Derivations\", \"Constraints\", \"Reqs\", \"Resolvers\"];\n for (const [i, label] of headers.entries()) {\n const text = document.createElementNS(\"http://www.w3.org/2000/svg\", \"text\");\n text.setAttribute(\"x\", String(colX[i] ?? 0));\n text.setAttribute(\"y\", \"10\");\n text.setAttribute(\"fill\", S.accent);\n text.setAttribute(\"font-size\", String(FLOW.fontSize));\n text.setAttribute(\"font-family\", S.font);\n text.textContent = label;\n refs.flowSvg.appendChild(text);\n }\n\n // Cache for diff-based updates on subsequent calls\n const newCache: GraphCache = { fingerprint, nodes: new Map() };\n\n // SVG helpers\n function drawNode(\n col: number,\n x: number,\n cy: number,\n nodeId: string,\n label: string,\n color: string,\n dimmed: boolean,\n pulsing: boolean,\n ) {\n const g = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n const rect = document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\n rect.setAttribute(\"x\", String(x));\n rect.setAttribute(\"y\", String(cy - 6));\n rect.setAttribute(\"width\", String(FLOW.nodeW));\n rect.setAttribute(\"height\", String(FLOW.nodeH));\n rect.setAttribute(\"rx\", \"3\");\n rect.setAttribute(\"fill\", pulsing ? color + \"33\" : \"none\");\n rect.setAttribute(\"stroke\", color);\n rect.setAttribute(\"stroke-width\", pulsing ? \"2\" : \"1\");\n rect.setAttribute(\"opacity\", dimmed ? \"0.35\" : \"1\");\n g.appendChild(rect);\n\n const text = document.createElementNS(\"http://www.w3.org/2000/svg\", \"text\");\n text.setAttribute(\"x\", String(x + 4));\n text.setAttribute(\"y\", String(cy + 4));\n text.setAttribute(\"fill\", color);\n text.setAttribute(\"font-size\", String(FLOW.fontSize));\n text.setAttribute(\"font-family\", S.font);\n text.setAttribute(\"opacity\", dimmed ? \"0.35\" : \"1\");\n text.textContent = label;\n g.appendChild(text);\n\n refs.flowSvg.appendChild(g);\n\n // Cache node for animation-only updates\n newCache.nodes.set(`${col}:${nodeId}`, { g, rect, text });\n\n return { midX: x + FLOW.nodeW / 2, midY: cy };\n }\n\n function drawEdge(\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n color: string,\n dimmed: boolean,\n ) {\n const line = document.createElementNS(\"http://www.w3.org/2000/svg\", \"line\");\n line.setAttribute(\"x1\", String(x1));\n line.setAttribute(\"y1\", String(y1));\n line.setAttribute(\"x2\", String(x2));\n line.setAttribute(\"y2\", String(y2));\n line.setAttribute(\"stroke\", color);\n line.setAttribute(\"stroke-width\", \"1\");\n line.setAttribute(\"stroke-dasharray\", \"3,2\");\n line.setAttribute(\"opacity\", dimmed ? \"0.2\" : \"0.7\");\n refs.flowSvg.appendChild(line);\n }\n\n // Position maps\n const factPositions = new Map<string, { midX: number; midY: number }>();\n const derivPositions = new Map<string, { midX: number; midY: number }>();\n const constraintPositions = new Map<string, { midX: number; midY: number }>();\n const reqPositions = new Map<string, { midX: number; midY: number }>();\n\n // Draw fact nodes\n for (const f of factNodes) {\n const pulsing = depGraph.recentlyChangedFacts.has(f.id);\n const pos = drawNode(\n 0,\n colX[0],\n f.y,\n f.id,\n f.label,\n S.text,\n false,\n pulsing,\n );\n factPositions.set(f.id, pos);\n }\n\n // Draw derivation nodes\n for (const d of derivNodes) {\n const pulsing = depGraph.recentlyComputedDerivations.has(d.id);\n const pos = drawNode(\n 1,\n colX[1],\n d.y,\n d.id,\n d.label,\n S.accent,\n false,\n pulsing,\n );\n derivPositions.set(d.id, pos);\n }\n\n // Draw constraint nodes (show ALL, dim inactive)\n for (const c of constraintNodes) {\n const pulsing = depGraph.recentlyActiveConstraints.has(c.id);\n const pos = drawNode(\n 2,\n colX[2],\n c.y,\n c.id,\n c.label,\n c.active ? S.yellow : S.muted,\n !c.active,\n pulsing,\n );\n constraintPositions.set(c.id, pos);\n }\n\n // Draw requirement nodes\n for (const r of reqNodeArr) {\n const color = r.status === \"unmet\" ? S.red : S.yellow;\n const pos = drawNode(\n 3,\n colX[3],\n r.y,\n r.id,\n truncate(r.type, FLOW.labelMaxChars),\n color,\n false,\n false,\n );\n reqPositions.set(r.id, pos);\n }\n\n // Draw resolver nodes (show ALL, dim idle)\n for (const r of resolverNodeArr) {\n const isActive = inflightReqs.some((f) => f.resolverId === r.id);\n drawNode(\n 4,\n colX[4],\n r.y,\n r.id,\n r.label,\n isActive ? S.green : S.muted,\n !isActive,\n false,\n );\n }\n\n // Edges: fact → derivation (from tracked deps)\n for (const d of derivNodes) {\n const deps = depGraph.derivationDeps.get(d.id);\n const dPos = derivPositions.get(d.id);\n if (deps && dPos) {\n for (const dep of deps) {\n const fPos = factPositions.get(dep);\n if (fPos) {\n drawEdge(\n fPos.midX + FLOW.nodeW / 2,\n fPos.midY,\n dPos.midX - FLOW.nodeW / 2,\n dPos.midY,\n S.accent,\n false,\n );\n }\n }\n }\n }\n\n // Edges: constraint → requirement\n for (const r of reqNodeArr) {\n const cPos = constraintPositions.get(r.fromConstraint);\n const rPos = reqPositions.get(r.id);\n if (cPos && rPos) {\n drawEdge(\n cPos.midX + FLOW.nodeW / 2,\n cPos.midY,\n rPos.midX - FLOW.nodeW / 2,\n rPos.midY,\n S.muted,\n false,\n );\n }\n }\n\n // Edges: requirement → resolver (for inflight)\n for (const f of inflightReqs) {\n const rPos = reqPositions.get(f.id);\n if (rPos) {\n const rn = resolverNodeArr.find((n) => n.id === f.resolverId);\n if (rn) {\n drawEdge(\n rPos.midX + FLOW.nodeW / 2,\n rPos.midY,\n colX[4],\n rn.y,\n S.green,\n false,\n );\n }\n }\n }\n\n // Store cache for next call\n graphCaches.set(refs.flowSvg, newCache);\n}\n\n/** Clear animation highlights after a brief delay */\nexport function scheduleAnimationClear(depGraph: DepGraph) {\n if (depGraph.animationTimer) {\n clearTimeout(depGraph.animationTimer);\n }\n depGraph.animationTimer = setTimeout(() => {\n depGraph.recentlyChangedFacts.clear();\n depGraph.recentlyComputedDerivations.clear();\n depGraph.recentlyActiveConstraints.clear();\n depGraph.animationTimer = null;\n }, 600);\n}\n\n// ============================================================================\n// Timeline/Flamechart Rendering\n// ============================================================================\n\n/** @internal Render the resolver execution timeline SVG. */\nexport function updateTimeline(refs: PanelRefs, timeline: TimelineState) {\n const entries = timeline.entries.toArray();\n if (entries.length === 0) {\n return;\n }\n\n refs.timelineSvg.replaceChildren();\n\n // Compute time range from visible entries\n let minMs = Number.POSITIVE_INFINITY;\n let maxMs = Number.NEGATIVE_INFINITY;\n for (const e of entries) {\n if (e.startMs < minMs) {\n minMs = e.startMs;\n }\n if (e.endMs > maxMs) {\n maxMs = e.endMs;\n }\n }\n // Also include inflight resolvers\n const now = performance.now();\n for (const startMs of timeline.inflight.values()) {\n if (startMs < minMs) {\n minMs = startMs;\n }\n if (now > maxMs) {\n maxMs = now;\n }\n }\n\n const range = maxMs - minMs || 1;\n const barAreaW = TIMELINE_SVG_W - TIMELINE_LABEL_W - 10;\n\n // Group entries by resolver for swim lanes\n const resolverOrder: string[] = [];\n const seen = new Set<string>();\n for (const e of entries) {\n if (!seen.has(e.resolver)) {\n seen.add(e.resolver);\n resolverOrder.push(e.resolver);\n }\n }\n // Also add inflight resolvers not yet completed\n for (const resolver of timeline.inflight.keys()) {\n if (!seen.has(resolver)) {\n seen.add(resolver);\n resolverOrder.push(resolver);\n }\n }\n\n // Cap visible rows\n const maxRows = 12;\n const visibleResolvers = resolverOrder.slice(-maxRows);\n const totalH = TIMELINE_ROW_H * visibleResolvers.length + 20;\n refs.timelineSvg.setAttribute(\"viewBox\", `0 0 ${TIMELINE_SVG_W} ${totalH}`);\n refs.timelineSvg.setAttribute(\"height\", String(Math.min(totalH, 200)));\n\n // Column header: time axis markers\n const markers = 5;\n for (let i = 0; i <= markers; i++) {\n const x = TIMELINE_LABEL_W + (barAreaW * i) / markers;\n const ms = (range * i) / markers;\n const text = document.createElementNS(\"http://www.w3.org/2000/svg\", \"text\");\n text.setAttribute(\"x\", String(x));\n text.setAttribute(\"y\", \"8\");\n text.setAttribute(\"fill\", S.muted);\n text.setAttribute(\"font-size\", \"6\");\n text.setAttribute(\"font-family\", S.font);\n text.setAttribute(\"text-anchor\", \"middle\");\n text.textContent =\n ms < 1000 ? `${ms.toFixed(0)}ms` : `${(ms / 1000).toFixed(1)}s`;\n refs.timelineSvg.appendChild(text);\n\n // Gridline\n const line = document.createElementNS(\"http://www.w3.org/2000/svg\", \"line\");\n line.setAttribute(\"x1\", String(x));\n line.setAttribute(\"y1\", \"10\");\n line.setAttribute(\"x2\", String(x));\n line.setAttribute(\"y2\", String(totalH));\n line.setAttribute(\"stroke\", S.border);\n line.setAttribute(\"stroke-width\", \"0.5\");\n refs.timelineSvg.appendChild(line);\n }\n\n // Draw swim lanes\n for (let row = 0; row < visibleResolvers.length; row++) {\n const resolver = visibleResolvers[row]!;\n const y = 12 + row * TIMELINE_ROW_H;\n const colorIdx = row % TIMELINE_COLORS.length;\n const color = TIMELINE_COLORS[colorIdx]!;\n\n // Label\n const label = document.createElementNS(\n \"http://www.w3.org/2000/svg\",\n \"text\",\n );\n label.setAttribute(\"x\", String(TIMELINE_LABEL_W - 4));\n label.setAttribute(\"y\", String(y + TIMELINE_ROW_H / 2 + 3));\n label.setAttribute(\"fill\", S.muted);\n label.setAttribute(\"font-size\", \"7\");\n label.setAttribute(\"font-family\", S.font);\n label.setAttribute(\"text-anchor\", \"end\");\n label.textContent = truncate(resolver, 12);\n refs.timelineSvg.appendChild(label);\n\n // Draw bars for this resolver\n const resolverEntries = entries.filter((e) => e.resolver === resolver);\n for (const entry of resolverEntries) {\n const x = TIMELINE_LABEL_W + ((entry.startMs - minMs) / range) * barAreaW;\n const w = Math.max(\n ((entry.endMs - entry.startMs) / range) * barAreaW,\n TIMELINE_BAR_MIN_W,\n );\n\n const rect = document.createElementNS(\n \"http://www.w3.org/2000/svg\",\n \"rect\",\n );\n rect.setAttribute(\"x\", String(x));\n rect.setAttribute(\"y\", String(y + 2));\n rect.setAttribute(\"width\", String(w));\n rect.setAttribute(\"height\", String(TIMELINE_ROW_H - 4));\n rect.setAttribute(\"rx\", \"2\");\n rect.setAttribute(\"fill\", entry.error ? S.red : color);\n rect.setAttribute(\"opacity\", \"0.8\");\n\n // Tooltip: duration\n const title = document.createElementNS(\n \"http://www.w3.org/2000/svg\",\n \"title\",\n );\n const durationMs = entry.endMs - entry.startMs;\n title.textContent = `${resolver}: ${durationMs.toFixed(1)}ms${entry.error ? \" (error)\" : \"\"}`;\n rect.appendChild(title);\n\n refs.timelineSvg.appendChild(rect);\n }\n\n // Draw inflight bar (animated, extending to \"now\")\n const inflightStart = timeline.inflight.get(resolver);\n if (inflightStart !== undefined) {\n const x = TIMELINE_LABEL_W + ((inflightStart - minMs) / range) * barAreaW;\n const w = Math.max(\n ((now - inflightStart) / range) * barAreaW,\n TIMELINE_BAR_MIN_W,\n );\n\n const rect = document.createElementNS(\n \"http://www.w3.org/2000/svg\",\n \"rect\",\n );\n rect.setAttribute(\"x\", String(x));\n rect.setAttribute(\"y\", String(y + 2));\n rect.setAttribute(\"width\", String(w));\n rect.setAttribute(\"height\", String(TIMELINE_ROW_H - 4));\n rect.setAttribute(\"rx\", \"2\");\n rect.setAttribute(\"fill\", color);\n rect.setAttribute(\"opacity\", \"0.4\");\n rect.setAttribute(\"stroke\", color);\n rect.setAttribute(\"stroke-width\", \"1\");\n rect.setAttribute(\"stroke-dasharray\", \"3,2\");\n\n const title = document.createElementNS(\n \"http://www.w3.org/2000/svg\",\n \"title\",\n );\n title.textContent = `${resolver}: inflight ${(now - inflightStart).toFixed(0)}ms`;\n rect.appendChild(title);\n\n refs.timelineSvg.appendChild(rect);\n }\n }\n\n // Update aria-label\n refs.timelineSvg.setAttribute(\n \"aria-label\",\n `Timeline: ${entries.length} resolver executions across ${visibleResolvers.length} resolvers`,\n );\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 {\n FactChange,\n ModuleSchema,\n Plugin,\n ReconcileResult,\n System,\n} from \"../core/types.js\";\n\n// Re-export public types\nexport type { DevtoolsPluginOptions, TraceEvent } from \"./devtools-types.js\";\n\nimport {\n CircularBuffer,\n type DevtoolsPluginOptions,\n type DevtoolsState,\n type DevtoolsSubscriber,\n MAX_RECORDED_EVENTS,\n MAX_RECORDED_SNAPSHOTS,\n MAX_RESOLVER_STATS,\n S,\n type TraceEvent,\n cloneViaJSON,\n createDepGraph,\n createPerfMetrics,\n createRecordingState,\n createTimelineState,\n isDevMode,\n safeInspect,\n validateMaxEvents,\n} from \"./devtools-types.js\";\n\nimport {\n addEventRow,\n createPanel,\n removeTableRow,\n renderRequirements,\n renderStatus,\n setupHistoryButtons,\n updateDerivations,\n updateHistoryControls,\n updatePerfSection,\n upsertTableRow,\n} from \"./devtools-panel.js\";\n\nimport {\n scheduleAnimationClear,\n updateDependencyGraph,\n updateTimeline,\n} from \"./devtools-graph.js\";\n\n// ============================================================================\n// Global Devtools Object\n// ============================================================================\n\nfunction initDevtools(): NonNullable<Window[\"__DIRECTIVE__\"]> {\n if (typeof window === \"undefined\") {\n return {\n systems: new Map(),\n getSystem: () => null,\n getSystems: () => [],\n inspect: () => null,\n getEvents: () => [],\n explain: () => null,\n exportSession: () => null,\n importSession: () => false,\n clearEvents: () => {},\n subscribe: () => () => {},\n };\n }\n\n if (!window.__DIRECTIVE__) {\n const systems = new Map<string, DevtoolsState>();\n\n const api: NonNullable<Window[\"__DIRECTIVE__\"]> = {\n systems,\n getSystem(name) {\n if (name) {\n return systems.get(name)?.system ?? null;\n }\n const first = systems.values().next().value;\n\n return first?.system ?? null;\n },\n getSystems() {\n return [...systems.keys()];\n },\n inspect(name) {\n const system = this.getSystem(name);\n const s = name ? systems.get(name) : systems.values().next().value;\n const inspection = system?.inspect() ?? null;\n if (inspection && s) {\n (inspection as unknown as Record<string, unknown>).resolverStats =\n s.resolverStats ? Object.fromEntries(s.resolverStats) : {};\n }\n\n return inspection;\n },\n getEvents(name) {\n if (name) {\n return systems.get(name)?.events.toArray() ?? [];\n }\n const first = systems.values().next().value;\n\n return first?.events.toArray() ?? [];\n },\n explain(requirementId, name) {\n const system = this.getSystem(name);\n\n return system?.explain(requirementId) ?? null;\n },\n subscribe(callback: DevtoolsSubscriber, systemName?: string) {\n const target = systemName\n ? systems.get(systemName)\n : systems.values().next().value;\n if (!target) {\n // System not registered yet — register a global subscriber\n // that attaches to the first system that appears\n let attached = false;\n const check = () => {\n const t = systemName\n ? systems.get(systemName)\n : systems.values().next().value;\n if (t && !attached) {\n attached = true;\n t.subscribers.add(callback);\n }\n };\n // Poll briefly for system registration\n const timer = setInterval(check, 100);\n const stop = setTimeout(() => clearInterval(timer), 10_000);\n\n return () => {\n clearInterval(timer);\n clearTimeout(stop);\n // Remove from any system that may have been attached\n for (const s of systems.values()) {\n s.subscribers.delete(callback);\n }\n };\n }\n target.subscribers.add(callback);\n\n return () => {\n target.subscribers.delete(callback);\n };\n },\n exportSession(name) {\n const target = name ? systems.get(name) : systems.values().next().value;\n if (!target) {\n return null;\n }\n\n return JSON.stringify({\n version: 1,\n name:\n name ??\n (systems.keys().next().value as string | undefined) ??\n \"default\",\n exportedAt: Date.now(),\n events: target.events.toArray(),\n });\n },\n importSession(json, name) {\n try {\n // Size cap — reject payloads over 10MB\n if (json.length > 10 * 1024 * 1024) {\n return false;\n }\n const data = JSON.parse(json);\n if (!data || typeof data !== \"object\" || Array.isArray(data)) {\n return false;\n }\n if (!Array.isArray(data.events)) {\n return false;\n }\n // Cap imported events at target's maxEvents\n const target = name\n ? systems.get(name)\n : systems.values().next().value;\n if (!target) {\n return false;\n }\n const maxImport = target.maxEvents;\n const events = data.events as unknown[];\n // Only import the last maxImport events\n const start =\n events.length > maxImport ? events.length - maxImport : 0;\n target.events.clear();\n for (let i = start; i < events.length; i++) {\n const evt = events[i];\n if (\n evt &&\n typeof evt === \"object\" &&\n !Array.isArray(evt) &&\n typeof (evt as Record<string, unknown>).timestamp === \"number\" &&\n typeof (evt as Record<string, unknown>).type === \"string\" &&\n (evt as Record<string, unknown>).type !== \"__proto__\" &&\n (evt as Record<string, unknown>).type !== \"constructor\" &&\n (evt as Record<string, unknown>).type !== \"prototype\"\n ) {\n // Sanitize — only copy known fields\n target.events.push({\n timestamp: (evt as Record<string, unknown>).timestamp as number,\n type: (evt as Record<string, unknown>).type as string,\n data: (evt as Record<string, unknown>).data ?? null,\n });\n }\n }\n\n return true;\n } catch {\n return false;\n }\n },\n clearEvents(name) {\n const target = name ? systems.get(name) : systems.values().next().value;\n if (!target) {\n return;\n }\n target.events.clear();\n },\n };\n\n // Non-writable global — prevent casual script overwriting\n // configurable in dev mode for test cleanup and plugin re-initialization\n Object.defineProperty(window, \"__DIRECTIVE__\", {\n value: api,\n writable: false,\n configurable: isDevMode(),\n enumerable: true,\n });\n\n return api;\n }\n\n return 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 options: DevtoolsPluginOptions = {},\n): Plugin<M> {\n const {\n name = \"default\",\n trace = false,\n maxEvents: maxEventsRaw,\n panel: panelEnabled = false,\n position = \"bottom-right\",\n defaultOpen = false,\n } = options;\n\n const maxEventsOpt = validateMaxEvents(maxEventsRaw);\n const devtools = initDevtools();\n const state: DevtoolsState = {\n system: null,\n events: new CircularBuffer<TraceEvent>(maxEventsOpt),\n maxEvents: maxEventsOpt,\n subscribers: new Set(),\n resolverStats: new Map(),\n };\n\n devtools.systems.set(name, state);\n\n const addEvent = (type: string, data: unknown) => {\n const event: TraceEvent = { timestamp: Date.now(), type, data };\n if (trace) {\n state.events.push(event);\n }\n // Always notify subscribers (even when trace is off — subscribers want all events)\n for (const sub of state.subscribers) {\n try {\n sub(event);\n } catch {\n // subscriber errors must not crash the plugin\n }\n }\n };\n\n // Panel state — initialized lazily in onInit\n let panel: ReturnType<typeof createPanel> | null = null;\n const factsRowMap = new Map<string, HTMLTableRowElement>();\n const derivRowMap = new Map<string, HTMLTableRowElement>();\n const perf = createPerfMetrics();\n const depGraph = createDepGraph();\n const recording = createRecordingState();\n const timeline = createTimelineState();\n\n const shouldCreatePanel =\n panelEnabled &&\n typeof window !== \"undefined\" &&\n typeof document !== \"undefined\" &&\n isDevMode();\n\n // requestAnimationFrame coalescing for all DOM updates\n let rafId: number | null = null;\n let dirty = 0;\n const D_FACTS = 1;\n const D_DERIV = 2;\n const D_REQS = 4;\n const D_STATUS = 8;\n const D_PERF = 16;\n const D_FLOW = 32;\n const D_TT = 64;\n const D_TIMELINE = 128;\n\n // Pending fact changes for batched rAF rendering\n const pendingFactUpdates = new Map<\n string,\n { value: unknown; flash: boolean }\n >();\n const pendingFactDeletes = new Set<string>();\n\n // Cache last reconcile result for deferred rendering\n let lastResult: ReconcileResult | null = null;\n\n function schedulePanelUpdate(bits: number) {\n dirty |= bits;\n if (rafId === null && typeof requestAnimationFrame !== \"undefined\") {\n rafId = requestAnimationFrame(flushPanelUpdates);\n }\n }\n\n function flushPanelUpdates() {\n rafId = null;\n if (!panel || !state.system) {\n dirty = 0;\n\n return;\n }\n const refs = panel.refs;\n const sys = state.system;\n const flags = dirty;\n dirty = 0;\n\n // Flush batched fact updates\n if (flags & D_FACTS) {\n for (const key of pendingFactDeletes) {\n removeTableRow(factsRowMap, key);\n }\n pendingFactDeletes.clear();\n for (const [key, { value, flash }] of pendingFactUpdates) {\n upsertTableRow(\n factsRowMap,\n refs.factsBody,\n key,\n value,\n flash,\n panel.flashTimers,\n );\n }\n pendingFactUpdates.clear();\n refs.factsCount.textContent = String(factsRowMap.size);\n }\n if (flags & D_DERIV) {\n updateDerivations(refs, derivRowMap, sys, panel.flashTimers);\n }\n if (flags & D_STATUS) {\n if (lastResult) {\n renderStatus(refs, lastResult.inflight.length, lastResult.unmet.length);\n } else {\n const inspection = safeInspect(sys);\n if (inspection) {\n renderStatus(\n refs,\n inspection.inflight.length,\n inspection.unmet.length,\n );\n }\n }\n }\n if (flags & D_REQS) {\n if (lastResult) {\n renderRequirements(\n refs,\n lastResult.inflight,\n lastResult.unmet as Array<{\n id: string;\n requirement: { type: string };\n fromConstraint: string;\n }>,\n );\n } else {\n const inspection = safeInspect(sys);\n if (inspection) {\n renderRequirements(\n refs,\n inspection.inflight,\n inspection.unmet as Array<{\n id: string;\n requirement: { type: string };\n fromConstraint: string;\n }>,\n );\n }\n }\n }\n if (flags & D_PERF) {\n updatePerfSection(refs, perf);\n }\n if (flags & D_FLOW) {\n updateDependencyGraph(refs, sys, depGraph);\n }\n if (flags & D_TT) {\n updateHistoryControls(refs, sys);\n }\n if (flags & D_TIMELINE) {\n updateTimeline(refs, timeline);\n }\n }\n\n // Helper: emit panel event only if trace is on and panel exists\n function panelEvent(type: string, data: unknown) {\n if (panel && trace) {\n addEventRow(panel.refs, type, data, state.events.size);\n }\n }\n\n // Record event if recording (C3: capped)\n function recordEvent(type: string, data: unknown) {\n if (\n recording.isRecording &&\n recording.recordedEvents.length < MAX_RECORDED_EVENTS\n ) {\n recording.recordedEvents.push({\n timestamp: Date.now(),\n type,\n data: cloneViaJSON(data),\n });\n }\n }\n\n return {\n name: \"devtools\",\n\n onInit: (system) => {\n state.system = system as unknown as System<ModuleSchema>;\n addEvent(\"init\", {});\n\n if (typeof window !== \"undefined\") {\n console.log(\n `%c[Directive Devtools]%c System \"${name}\" initialized. Access via window.__DIRECTIVE__`,\n \"color: #7c3aed; font-weight: bold\",\n \"color: inherit\",\n );\n }\n\n if (shouldCreatePanel) {\n const sys = state.system;\n panel = createPanel(name, position, defaultOpen, trace);\n const refs = panel.refs;\n\n // Initial render of facts\n try {\n const facts = sys.facts.$store.toObject();\n for (const [key, value] of Object.entries(facts)) {\n upsertTableRow(factsRowMap, refs.factsBody, key, value, false);\n }\n refs.factsCount.textContent = String(Object.keys(facts).length);\n } catch {\n // System not ready yet\n }\n\n // Initial render of other sections\n updateDerivations(refs, derivRowMap, sys);\n const inspection = safeInspect(sys);\n if (inspection) {\n renderStatus(\n refs,\n inspection.inflight.length,\n inspection.unmet.length,\n );\n renderRequirements(\n refs,\n inspection.inflight,\n inspection.unmet as Array<{\n id: string;\n requirement: { type: string };\n fromConstraint: string;\n }>,\n );\n }\n updateHistoryControls(refs, sys);\n setupHistoryButtons(refs, sys);\n updateDependencyGraph(refs, sys, depGraph);\n\n // Wire record & export buttons\n refs.recordBtn.addEventListener(\"click\", () => {\n recording.isRecording = !recording.isRecording;\n refs.recordBtn.textContent = recording.isRecording\n ? \"\\u23F9 Stop\"\n : \"\\u23FA Record\";\n refs.recordBtn.style.color = recording.isRecording ? S.red : S.text;\n if (recording.isRecording) {\n recording.recordedEvents = [];\n recording.snapshots = [];\n // Capture initial snapshot\n try {\n recording.snapshots.push({\n timestamp: Date.now(),\n facts: sys.facts.$store.toObject(),\n });\n } catch {\n // ignore\n }\n }\n });\n\n refs.exportBtn.addEventListener(\"click\", () => {\n const events =\n recording.recordedEvents.length > 0\n ? recording.recordedEvents\n : state.events.toArray();\n\n const payload = JSON.stringify(\n {\n version: 1,\n name,\n exportedAt: Date.now(),\n events,\n snapshots: recording.snapshots,\n },\n null,\n 2,\n );\n\n // Download as file\n const blob = new Blob([payload], { type: \"application/json\" });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = `directive-session-${name}-${Date.now()}.json`;\n a.click();\n URL.revokeObjectURL(url);\n });\n }\n },\n\n onStart: (_system) => {\n addEvent(\"start\", {});\n panelEvent(\"start\", {});\n recordEvent(\"start\", {});\n },\n\n onStop: (_system) => {\n addEvent(\"stop\", {});\n panelEvent(\"stop\", {});\n recordEvent(\"stop\", {});\n },\n\n onDestroy: (_system) => {\n addEvent(\"destroy\", {});\n devtools.systems.delete(name);\n if (rafId !== null && typeof cancelAnimationFrame !== \"undefined\") {\n cancelAnimationFrame(rafId);\n rafId = null;\n }\n if (depGraph.animationTimer) {\n clearTimeout(depGraph.animationTimer);\n }\n if (panel) {\n panel.destroy();\n panel = null;\n factsRowMap.clear();\n derivRowMap.clear();\n }\n },\n\n onFactSet: (key, value, prev) => {\n addEvent(\"fact.set\", { key, value, prev });\n recordEvent(\"fact.set\", { key, value, prev });\n depGraph.recentlyChangedFacts.add(key as string);\n if (panel && state.system) {\n // Defer DOM update to rAF\n pendingFactUpdates.set(key as string, { value, flash: true });\n pendingFactDeletes.delete(key as string);\n schedulePanelUpdate(D_FACTS);\n panelEvent(\"fact.set\", { key, value });\n }\n },\n\n onFactDelete: (key, prev) => {\n addEvent(\"fact.delete\", { key, prev });\n recordEvent(\"fact.delete\", { key, prev });\n if (panel) {\n // Defer DOM update to rAF\n pendingFactDeletes.add(key as string);\n pendingFactUpdates.delete(key as string);\n schedulePanelUpdate(D_FACTS);\n panelEvent(\"fact.delete\", { key });\n }\n },\n\n onFactsBatch: (changes: FactChange[]) => {\n addEvent(\"facts.batch\", { changes });\n recordEvent(\"facts.batch\", { count: changes.length });\n if (panel && state.system) {\n // Defer all DOM updates to rAF\n for (const change of changes) {\n if (change.type === \"delete\") {\n pendingFactDeletes.add(change.key);\n pendingFactUpdates.delete(change.key);\n } else {\n depGraph.recentlyChangedFacts.add(change.key);\n pendingFactUpdates.set(change.key, {\n value: change.value,\n flash: true,\n });\n pendingFactDeletes.delete(change.key);\n }\n }\n schedulePanelUpdate(D_FACTS);\n panelEvent(\"facts.batch\", { count: changes.length });\n }\n },\n\n onDerivationCompute: (id, value, deps) => {\n addEvent(\"derivation.compute\", { id, value, deps });\n recordEvent(\"derivation.compute\", { id, deps });\n depGraph.derivationDeps.set(id, deps);\n depGraph.recentlyComputedDerivations.add(id);\n panelEvent(\"derivation.compute\", { id, deps });\n },\n\n onDerivationInvalidate: (id) => {\n addEvent(\"derivation.invalidate\", { id });\n panelEvent(\"derivation.invalidate\", { id });\n },\n\n onReconcileStart: (_snapshot) => {\n addEvent(\"reconcile.start\", {});\n perf.lastReconcileStartMs = performance.now();\n panelEvent(\"reconcile.start\", {});\n recordEvent(\"reconcile.start\", {});\n },\n\n onReconcileEnd: (result: ReconcileResult) => {\n addEvent(\"reconcile.end\", result);\n recordEvent(\"reconcile.end\", {\n unmet: result.unmet.length,\n inflight: result.inflight.length,\n completed: result.completed.length,\n });\n\n // Track reconcile performance\n if (perf.lastReconcileStartMs > 0) {\n const duration = performance.now() - perf.lastReconcileStartMs;\n perf.reconcileCount++;\n perf.reconcileTotalMs += duration;\n perf.lastReconcileStartMs = 0;\n }\n\n // Capture snapshot during recording (C3: capped)\n if (\n recording.isRecording &&\n state.system &&\n recording.snapshots.length < MAX_RECORDED_SNAPSHOTS\n ) {\n try {\n recording.snapshots.push({\n timestamp: Date.now(),\n facts: state.system.facts.$store.toObject(),\n });\n } catch {\n // ignore\n }\n }\n\n if (panel && state.system) {\n lastResult = result;\n scheduleAnimationClear(depGraph);\n schedulePanelUpdate(\n D_DERIV | D_STATUS | D_REQS | D_PERF | D_FLOW | D_TT,\n );\n panelEvent(\"reconcile.end\", {\n unmet: result.unmet.length,\n inflight: result.inflight.length,\n });\n }\n },\n\n onConstraintEvaluate: (id, active) => {\n addEvent(\"constraint.evaluate\", { id, active });\n recordEvent(\"constraint.evaluate\", { id, active });\n if (active) {\n depGraph.activeConstraints.add(id);\n depGraph.recentlyActiveConstraints.add(id);\n } else {\n depGraph.activeConstraints.delete(id);\n }\n panelEvent(\"constraint.evaluate\", { id, active });\n },\n\n onConstraintError: (id, error) => {\n addEvent(\"constraint.error\", { id, error: String(error) });\n panelEvent(\"constraint.error\", { id, error: String(error) });\n },\n\n onRequirementCreated: (req) => {\n addEvent(\"requirement.created\", {\n id: req.id,\n type: req.requirement.type,\n });\n recordEvent(\"requirement.created\", {\n id: req.id,\n type: req.requirement.type,\n });\n panelEvent(\"requirement.created\", {\n id: req.id,\n type: req.requirement.type,\n });\n },\n\n onRequirementMet: (req, byResolver) => {\n addEvent(\"requirement.met\", { id: req.id, byResolver });\n recordEvent(\"requirement.met\", { id: req.id, byResolver });\n panelEvent(\"requirement.met\", { id: req.id, byResolver });\n },\n\n onRequirementCanceled: (req) => {\n addEvent(\"requirement.canceled\", { id: req.id });\n recordEvent(\"requirement.canceled\", { id: req.id });\n panelEvent(\"requirement.canceled\", { id: req.id });\n },\n\n onResolverStart: (resolver, req) => {\n addEvent(\"resolver.start\", { resolver, requirementId: req.id });\n recordEvent(\"resolver.start\", { resolver, requirementId: req.id });\n // Track timeline\n timeline.inflight.set(resolver, performance.now());\n if (panel && state.system) {\n schedulePanelUpdate(D_REQS | D_STATUS | D_TIMELINE);\n panelEvent(\"resolver.start\", { resolver, requirementId: req.id });\n }\n },\n\n onResolverComplete: (resolver, req, duration) => {\n addEvent(\"resolver.complete\", {\n resolver,\n requirementId: req.id,\n duration,\n });\n recordEvent(\"resolver.complete\", {\n resolver,\n requirementId: req.id,\n duration,\n });\n\n const stats = state.resolverStats.get(resolver) ?? {\n count: 0,\n totalMs: 0,\n errors: 0,\n };\n stats.count++;\n stats.totalMs += duration;\n state.resolverStats.set(resolver, stats);\n if (state.resolverStats.size > MAX_RESOLVER_STATS) {\n const oldest = state.resolverStats.keys().next().value;\n if (oldest !== undefined) state.resolverStats.delete(oldest);\n }\n // Mirror to perf for floating panel\n perf.resolverStats.set(resolver, { ...stats });\n\n // Complete timeline entry\n const startMs = timeline.inflight.get(resolver);\n timeline.inflight.delete(resolver);\n if (startMs !== undefined) {\n timeline.entries.push({\n resolver,\n startMs,\n endMs: performance.now(),\n error: false,\n });\n }\n\n if (panel && state.system) {\n schedulePanelUpdate(D_REQS | D_STATUS | D_PERF | D_TIMELINE);\n panelEvent(\"resolver.complete\", { resolver, duration });\n }\n },\n\n onResolverError: (resolver, req, error) => {\n addEvent(\"resolver.error\", {\n resolver,\n requirementId: req.id,\n error: String(error),\n });\n recordEvent(\"resolver.error\", {\n resolver,\n requirementId: req.id,\n error: String(error),\n });\n\n const stats = state.resolverStats.get(resolver) ?? {\n count: 0,\n totalMs: 0,\n errors: 0,\n };\n stats.errors++;\n state.resolverStats.set(resolver, stats);\n if (state.resolverStats.size > MAX_RESOLVER_STATS) {\n const oldest = state.resolverStats.keys().next().value;\n if (oldest !== undefined) state.resolverStats.delete(oldest);\n }\n // Mirror to perf for floating panel\n perf.resolverStats.set(resolver, { ...stats });\n\n // Complete timeline entry as error\n const startMs = timeline.inflight.get(resolver);\n timeline.inflight.delete(resolver);\n if (startMs !== undefined) {\n timeline.entries.push({\n resolver,\n startMs,\n endMs: performance.now(),\n error: true,\n });\n }\n\n if (panel && state.system) {\n schedulePanelUpdate(D_REQS | D_STATUS | D_PERF | D_TIMELINE);\n panelEvent(\"resolver.error\", { resolver, error: String(error) });\n }\n },\n\n onResolverRetry: (resolver, req, attempt) => {\n addEvent(\"resolver.retry\", { resolver, requirementId: req.id, attempt });\n recordEvent(\"resolver.retry\", {\n resolver,\n requirementId: req.id,\n attempt,\n });\n panelEvent(\"resolver.retry\", { resolver, attempt });\n },\n\n onResolverCancel: (resolver, req) => {\n addEvent(\"resolver.cancel\", { resolver, requirementId: req.id });\n recordEvent(\"resolver.cancel\", { resolver, requirementId: req.id });\n // Remove from inflight\n timeline.inflight.delete(resolver);\n panelEvent(\"resolver.cancel\", { resolver });\n },\n\n onEffectRun: (id) => {\n addEvent(\"effect.run\", { id });\n recordEvent(\"effect.run\", { id });\n perf.effectRunCount++;\n panelEvent(\"effect.run\", { id });\n },\n\n onEffectError: (id, error) => {\n addEvent(\"effect.error\", { id, error: String(error) });\n perf.effectErrorCount++;\n panelEvent(\"effect.error\", { id, error: String(error) });\n },\n\n onSnapshot: (snapshot) => {\n addEvent(\"timetravel.snapshot\", {\n id: snapshot.id,\n trigger: snapshot.trigger,\n });\n if (panel && state.system) {\n schedulePanelUpdate(D_TT);\n }\n panelEvent(\"timetravel.snapshot\", {\n id: snapshot.id,\n trigger: snapshot.trigger,\n });\n },\n\n onHistoryNavigate: (from, to) => {\n addEvent(\"timetravel.jump\", { from, to });\n recordEvent(\"timetravel.jump\", { from, to });\n if (panel && state.system) {\n const sys = state.system;\n // After time-travel, full refresh\n try {\n const facts = sys.facts.$store.toObject();\n factsRowMap.clear();\n panel.refs.factsBody.replaceChildren();\n for (const [key, value] of Object.entries(facts)) {\n upsertTableRow(\n factsRowMap,\n panel.refs.factsBody,\n key,\n value,\n false,\n );\n }\n panel.refs.factsCount.textContent = String(Object.keys(facts).length);\n } catch {\n // ignore\n }\n derivRowMap.clear();\n depGraph.derivationDeps.clear();\n panel.refs.derivBody.replaceChildren();\n lastResult = null;\n schedulePanelUpdate(D_DERIV | D_STATUS | D_REQS | D_FLOW | D_TT);\n panelEvent(\"timetravel.jump\", { from, to });\n }\n },\n\n onError: (error) => {\n addEvent(\"error\", {\n source: error.source,\n sourceId: error.sourceId,\n message: error.message,\n });\n recordEvent(\"error\", { source: error.source, message: error.message });\n panelEvent(\"error\", { source: error.source, message: error.message });\n },\n\n onErrorRecovery: (error, strategy) => {\n addEvent(\"error.recovery\", {\n source: error.source,\n sourceId: error.sourceId,\n strategy,\n });\n panelEvent(\"error.recovery\", { source: error.source, strategy });\n },\n\n onTraceComplete: (entry) => {\n addEvent(\"trace.complete\", {\n id: entry.id,\n status: entry.status,\n facts: entry.factChanges.length,\n constraints: entry.constraintsHit.length,\n requirements: entry.requirementsAdded.length,\n resolvers: entry.resolversStarted.length,\n effects: entry.effectsRun.length,\n });\n panelEvent(\"trace.complete\", { id: entry.id });\n },\n\n onDefinitionRegister: (type, id) => {\n addEvent(\"definition.register\", { type, id });\n recordEvent(\"definition.register\", { type, id });\n panelEvent(\"definition.register\", { type, id });\n },\n\n onDefinitionAssign: (type, id) => {\n addEvent(\"definition.assign\", { type, id });\n recordEvent(\"definition.assign\", { type, id });\n panelEvent(\"definition.assign\", { type, id });\n },\n\n onDefinitionUnregister: (type, id) => {\n addEvent(\"definition.unregister\", { type, id });\n recordEvent(\"definition.unregister\", { type, id });\n panelEvent(\"definition.unregister\", { type, id });\n },\n\n onDefinitionCall: (type, id, props) => {\n addEvent(\"definition.call\", { type, id, props });\n recordEvent(\"definition.call\", { type, id, props });\n panelEvent(\"definition.call\", { type, id, props });\n },\n };\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 if (typeof window !== \"undefined\") {\n const key = `__DIRECTIVE_BRIDGE_ID_${SESSION_NONCE}__`;\n const w = window as unknown as Record<string, unknown>;\n const current = (w[key] as number | undefined) ?? 0;\n w[key] = current + 1;\n\n return current + 1;\n }\n\n return 1;\n}\n\n/**\n * Strip prototype-pollution keys from an event object.\n */\nfunction sanitizeEvent(\n event: Record<string, unknown>,\n): Record<string, unknown> {\n let needsSanitize = false;\n for (const key of BLOCKED_KEYS) {\n if (key in event) {\n needsSanitize = true;\n break;\n }\n }\n\n if (!needsSanitize) {\n return event;\n }\n\n const clean: Record<string, unknown> = Object.create(null);\n for (const [key, value] of Object.entries(event)) {\n if (!BLOCKED_KEYS.has(key)) {\n clean[key] = value;\n }\n }\n\n return 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 event: Record<string, unknown> & { type: string },\n): void {\n if (typeof window === \"undefined\") {\n return;\n }\n\n try {\n const safe = sanitizeEvent(event);\n const full = {\n id: getNextId(),\n timestamp: Date.now(),\n snapshotId: null,\n ...safe,\n };\n\n window.dispatchEvent(\n new CustomEvent(DEVTOOLS_EVENT_NAME, { detail: full }),\n );\n } catch {\n // DevTools bridge must never crash the host application\n }\n}\n","/**\n * Persistence Plugin - Save/restore facts to storage\n */\n\nimport type { ModuleSchema, Plugin, System } from \"../core/types.js\";\nimport { isPrototypeSafe } from \"../utils/utils.js\";\n\n/**\n * Configuration for the {@link persistencePlugin}.\n *\n * @remarks\n * At minimum, provide a `storage` backend and a `key`. Use `include` or\n * `exclude` to control which fact keys are persisted. Saves are debounced\n * by default (100 ms) to avoid excessive writes during rapid updates.\n *\n * | Field | Default | Description |\n * |-------------|---------|-------------|\n * | `storage` | *(required)* | A `Storage`-compatible backend (`localStorage`, `sessionStorage`, or custom). |\n * | `key` | *(required)* | The key used to read/write from storage. |\n * | `include` | all keys | Whitelist of fact keys to persist. |\n * | `exclude` | `[]` | Blacklist of fact keys to skip. |\n * | `debounce` | `100` | Milliseconds to debounce saves. |\n * | `onRestore` | -- | Callback fired after state is restored from storage. |\n * | `onSave` | -- | Callback fired after state is written to storage. |\n * | `onError` | -- | Callback fired when a load or save error occurs. |\n *\n * @public\n */\nexport interface PersistencePluginOptions {\n /** A `Storage`-compatible backend (`localStorage`, `sessionStorage`, or custom). */\n storage: Storage;\n /** The key used to read/write from the storage backend. */\n key: string;\n /** Whitelist of fact keys to persist (default: all keys). */\n include?: string[];\n /** Fact keys to exclude from persistence. */\n exclude?: string[];\n /** Milliseconds to debounce saves (default: 100). */\n debounce?: number;\n /** Callback fired after state is restored from storage on init. */\n onRestore?: (data: Record<string, unknown>) => void;\n /** Callback fired after state is written to storage. */\n onSave?: (data: Record<string, unknown>) => void;\n /** Callback fired when a load or save error occurs. */\n onError?: (error: Error) => void;\n}\n\n/**\n * Create a plugin that persists selected facts to a `Storage` backend and\n * restores them on system init.\n *\n * @remarks\n * On `onInit`, the plugin reads the storage key and batch-sets any persisted\n * facts into the store. On every `onFactSet` / `onFactDelete` / `onFactsBatch`,\n * a debounced save is scheduled. A final synchronous save runs on `onDestroy`\n * to capture any pending changes.\n *\n * Stored data is validated against prototype pollution before restoration\n * via {@link isPrototypeSafe}.\n *\n * @param options - Required {@link PersistencePluginOptions} specifying storage backend, key, and optional filters/callbacks.\n * @returns A {@link Plugin} that can be passed to `createSystem`'s `plugins` array.\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 *\n * @public\n */\nexport function persistencePlugin<M extends ModuleSchema = ModuleSchema>(\n options: PersistencePluginOptions,\n): Plugin<M> {\n const {\n storage,\n key,\n include,\n exclude = [],\n debounce = 100,\n onRestore,\n onSave,\n onError,\n } = options;\n\n let saveTimeout: ReturnType<typeof setTimeout> | null = null;\n let system: System<M> | null = null;\n const trackedKeys = new Set<string>();\n\n /** Check if a key should be persisted */\n const shouldPersist = (factKey: string): boolean => {\n if (exclude.includes(factKey)) return false;\n if (include) return include.includes(factKey);\n return true;\n };\n\n /** Load state from storage */\n const load = (): Record<string, unknown> | null => {\n try {\n const json = storage.getItem(key);\n if (!json) return null;\n\n const data = JSON.parse(json);\n if (typeof data !== \"object\" || data === null) return null;\n\n // Security: Check for prototype pollution\n if (!isPrototypeSafe(data)) {\n onError?.(\n new Error(\"Potential prototype pollution detected in stored data\"),\n );\n return null;\n }\n\n return data as Record<string, unknown>;\n } catch (error) {\n onError?.(error instanceof Error ? error : new Error(String(error)));\n return null;\n }\n };\n\n /** Save state to storage */\n const save = () => {\n if (!system) return;\n\n try {\n const data: Record<string, unknown> = {};\n\n for (const factKey of trackedKeys) {\n if (shouldPersist(factKey)) {\n data[factKey] = (system.facts as Record<string, unknown>)[factKey];\n }\n }\n\n storage.setItem(key, JSON.stringify(data));\n onSave?.(data);\n } catch (error) {\n onError?.(error instanceof Error ? error : new Error(String(error)));\n }\n };\n\n /** Schedule a debounced save */\n const scheduleSave = () => {\n if (saveTimeout) {\n clearTimeout(saveTimeout);\n }\n saveTimeout = setTimeout(save, debounce);\n };\n\n return {\n name: \"persistence\",\n\n onInit: (sys) => {\n system = sys;\n\n // Restore state from storage\n const data = load();\n if (data) {\n system.facts.$store.batch(() => {\n for (const [factKey, value] of Object.entries(data)) {\n if (shouldPersist(factKey)) {\n (system!.facts as Record<string, unknown>)[factKey] = value;\n trackedKeys.add(factKey);\n }\n }\n });\n onRestore?.(data);\n }\n },\n\n onDestroy: () => {\n // Final save before destroy\n if (saveTimeout) {\n clearTimeout(saveTimeout);\n }\n save();\n },\n\n onFactSet: (factKey) => {\n trackedKeys.add(factKey);\n if (shouldPersist(factKey)) {\n scheduleSave();\n }\n },\n\n onFactDelete: (factKey) => {\n trackedKeys.delete(factKey);\n if (shouldPersist(factKey)) {\n scheduleSave();\n }\n },\n\n onFactsBatch: (changes) => {\n let shouldSave = false;\n for (const change of changes) {\n if (change.type === \"set\") {\n trackedKeys.add(change.key);\n } else {\n trackedKeys.delete(change.key);\n }\n if (shouldPersist(change.key)) {\n shouldSave = true;\n }\n }\n if (shouldSave) {\n scheduleSave();\n }\n },\n };\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 { ModuleSchema, Plugin } from \"../core/types.js\";\n\n/** Metrics for a single constraint */\nexport interface ConstraintMetrics {\n evaluations: number;\n totalDurationMs: number;\n avgDurationMs: number;\n maxDurationMs: number;\n lastEvaluatedAt: number;\n}\n\n/** Metrics for a single resolver */\nexport interface ResolverMetrics {\n starts: number;\n completions: number;\n errors: number;\n retries: number;\n cancellations: number;\n totalDurationMs: number;\n avgDurationMs: number;\n maxDurationMs: number;\n lastCompletedAt: number;\n}\n\n/** Metrics for the reconciliation loop */\nexport interface ReconcileMetrics {\n runs: number;\n totalDurationMs: number;\n avgDurationMs: number;\n maxDurationMs: number;\n}\n\n/** Metrics for effects */\nexport interface EffectMetrics {\n runs: number;\n errors: number;\n lastRunAt: number;\n}\n\n/** Full performance snapshot */\nexport interface PerformanceSnapshot {\n constraints: Record<string, ConstraintMetrics>;\n resolvers: Record<string, ResolverMetrics>;\n effects: Record<string, EffectMetrics>;\n reconcile: ReconcileMetrics;\n uptime: number;\n}\n\n/** Options for the performance plugin */\nexport interface PerformancePluginOptions {\n /** Callback when a slow constraint is detected (default threshold: 16ms) */\n onSlowConstraint?: (id: string, durationMs: number) => void;\n /** Callback when a slow resolver is detected (default threshold: 1000ms) */\n onSlowResolver?: (id: string, durationMs: number) => void;\n /** Threshold in ms for slow constraint warning (default: 16) */\n slowConstraintThresholdMs?: number;\n /** Threshold in ms for slow resolver warning (default: 1000) */\n slowResolverThresholdMs?: 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 options: PerformancePluginOptions = {},\n): Plugin<M> & { getSnapshot(): PerformanceSnapshot; reset(): void } {\n const {\n onSlowConstraint,\n onSlowResolver,\n slowConstraintThresholdMs = 16,\n slowResolverThresholdMs = 1000,\n } = options;\n\n const constraints = new Map<string, ConstraintMetrics>();\n const resolvers = new Map<string, ResolverMetrics>();\n const effects = new Map<string, EffectMetrics>();\n const reconcile: ReconcileMetrics = {\n runs: 0,\n totalDurationMs: 0,\n avgDurationMs: 0,\n maxDurationMs: 0,\n };\n\n let startedAt = 0;\n let reconcileStartTime = 0;\n\n // Track constraint evaluation timing within a reconcile cycle.\n // Since constraints are evaluated sequentially, the time between consecutive\n // onConstraintEvaluate calls approximates each constraint's evaluation time.\n // The first constraint in each cycle cannot be timed (no baseline), so only\n // subsequent constraints get duration metrics.\n let lastConstraintEvalEndTime = 0;\n\n function getConstraintMetrics(id: string): ConstraintMetrics {\n let m = constraints.get(id);\n if (!m) {\n m = {\n evaluations: 0,\n totalDurationMs: 0,\n avgDurationMs: 0,\n maxDurationMs: 0,\n lastEvaluatedAt: 0,\n };\n constraints.set(id, m);\n }\n return m;\n }\n\n function getResolverMetrics(id: string): ResolverMetrics {\n let m = resolvers.get(id);\n if (!m) {\n m = {\n starts: 0,\n completions: 0,\n errors: 0,\n retries: 0,\n cancellations: 0,\n totalDurationMs: 0,\n avgDurationMs: 0,\n maxDurationMs: 0,\n lastCompletedAt: 0,\n };\n resolvers.set(id, m);\n }\n return m;\n }\n\n function getEffectMetrics(id: string): EffectMetrics {\n let m = effects.get(id);\n if (!m) {\n m = { runs: 0, errors: 0, lastRunAt: 0 };\n effects.set(id, m);\n }\n return m;\n }\n\n const plugin: Plugin<M> & {\n getSnapshot(): PerformanceSnapshot;\n reset(): void;\n } = {\n name: \"performance\",\n\n onStart() {\n startedAt = Date.now();\n },\n\n onConstraintEvaluate(id, _active) {\n const now = performance.now();\n const m = getConstraintMetrics(id);\n m.evaluations++;\n m.lastEvaluatedAt = Date.now();\n\n // Constraints evaluate sequentially within a reconcile cycle.\n // Measure duration as time since the previous constraint finished evaluating\n // (or since reconcileStart for the first constraint in the cycle).\n // The first constraint per cycle has no baseline and is not timed.\n if (lastConstraintEvalEndTime > 0) {\n const duration = now - lastConstraintEvalEndTime;\n m.totalDurationMs += duration;\n const timedEvals = m.evaluations; // approximation — some evals may be untimed\n m.avgDurationMs = m.totalDurationMs / timedEvals;\n if (duration > m.maxDurationMs) m.maxDurationMs = duration;\n if (duration > slowConstraintThresholdMs) {\n onSlowConstraint?.(id, duration);\n }\n }\n lastConstraintEvalEndTime = now;\n },\n\n onResolverStart(resolver, _req) {\n const m = getResolverMetrics(resolver);\n m.starts++;\n },\n\n onResolverComplete(resolver, _req, duration) {\n const m = getResolverMetrics(resolver);\n m.completions++;\n m.totalDurationMs += duration;\n m.avgDurationMs = m.totalDurationMs / m.completions;\n if (duration > m.maxDurationMs) m.maxDurationMs = duration;\n m.lastCompletedAt = Date.now();\n if (duration > slowResolverThresholdMs) {\n onSlowResolver?.(resolver, duration);\n }\n },\n\n onResolverError(resolver, _req, _error) {\n getResolverMetrics(resolver).errors++;\n },\n\n onResolverRetry(resolver, _req, _attempt) {\n getResolverMetrics(resolver).retries++;\n },\n\n onResolverCancel(resolver, _req) {\n getResolverMetrics(resolver).cancellations++;\n },\n\n onEffectRun(id) {\n const m = getEffectMetrics(id);\n m.runs++;\n m.lastRunAt = Date.now();\n },\n\n onEffectError(id, _error) {\n getEffectMetrics(id).errors++;\n },\n\n onReconcileStart() {\n reconcileStartTime = performance.now();\n // Reset constraint timing baseline — first constraint in this cycle won't be timed\n lastConstraintEvalEndTime = 0;\n },\n\n onReconcileEnd() {\n const duration = performance.now() - reconcileStartTime;\n reconcile.runs++;\n reconcile.totalDurationMs += duration;\n reconcile.avgDurationMs = reconcile.totalDurationMs / reconcile.runs;\n if (duration > reconcile.maxDurationMs)\n reconcile.maxDurationMs = duration;\n },\n\n onDestroy() {\n plugin.reset();\n },\n\n getSnapshot(): PerformanceSnapshot {\n const constraintsObj: Record<string, ConstraintMetrics> = {};\n for (const [id, m] of constraints) constraintsObj[id] = { ...m };\n\n const resolversObj: Record<string, ResolverMetrics> = {};\n for (const [id, m] of resolvers) resolversObj[id] = { ...m };\n\n const effectsObj: Record<string, EffectMetrics> = {};\n for (const [id, m] of effects) effectsObj[id] = { ...m };\n\n return {\n constraints: constraintsObj,\n resolvers: resolversObj,\n effects: effectsObj,\n reconcile: { ...reconcile },\n uptime: startedAt ? Date.now() - startedAt : 0,\n };\n },\n\n reset(): void {\n constraints.clear();\n resolvers.clear();\n effects.clear();\n reconcile.runs = 0;\n reconcile.totalDurationMs = 0;\n reconcile.avgDurationMs = 0;\n reconcile.maxDurationMs = 0;\n lastConstraintEvalEndTime = 0;\n },\n };\n\n return 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.destroy();\n * ```\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Metric types that can be collected */\nexport type MetricType = \"counter\" | \"gauge\" | \"histogram\" | \"summary\";\n\n/** A single metric data point */\nexport interface MetricDataPoint {\n name: string;\n type: MetricType;\n value: number;\n labels: Record<string, string>;\n timestamp: number;\n}\n\n/** Histogram bucket for latency/size distributions */\nexport interface HistogramBucket {\n le: number; // less than or equal\n count: number;\n}\n\n/** Aggregated metric for dashboard display */\nexport interface AggregatedMetric {\n name: string;\n type: MetricType;\n count: number;\n sum: number;\n min: number;\n max: number;\n avg: number;\n p50?: number;\n p90?: number;\n p99?: number;\n lastValue: number;\n lastUpdated: number;\n}\n\n/** Trace span for distributed tracing */\nexport interface TraceSpan {\n traceId: string;\n spanId: string;\n parentSpanId?: string;\n operationName: string;\n serviceName: string;\n startTime: number;\n endTime?: number;\n duration?: number;\n status: \"ok\" | \"error\" | \"timeout\";\n tags: Record<string, string | number | boolean>;\n logs: Array<{\n timestamp: number;\n message: string;\n level: \"debug\" | \"info\" | \"warn\" | \"error\";\n }>;\n}\n\n/** Alert configuration */\nexport interface AlertConfig {\n metric: string;\n threshold: number;\n operator?: \">\" | \"<\" | \">=\" | \"<=\" | \"==\";\n action: \"log\" | \"warn\" | \"alert\" | \"callback\";\n callback?: (metric: AggregatedMetric, threshold: number) => void;\n cooldownMs?: number;\n}\n\n/** Alert event when threshold is crossed */\nexport interface AlertEvent {\n alertId: string;\n metric: string;\n currentValue: number;\n threshold: number;\n operator: string;\n action: string;\n timestamp: number;\n message: string;\n}\n\n/** Observability configuration */\nexport interface ObservabilityConfig {\n /** Service name for tracing */\n serviceName?: string;\n /** Metrics configuration */\n metrics?: {\n enabled?: boolean;\n /** Export interval in milliseconds */\n exportInterval?: number;\n /** Custom exporter function */\n exporter?: (metrics: AggregatedMetric[]) => Promise<void>;\n /** Maximum data points to retain per metric */\n maxDataPoints?: number;\n };\n /** Tracing configuration */\n tracing?: {\n enabled?: boolean;\n /** Sample rate (0.0 to 1.0) */\n sampleRate?: number;\n /** Maximum spans to retain */\n maxSpans?: number;\n /** Custom trace exporter */\n exporter?: (spans: TraceSpan[]) => Promise<void>;\n };\n /** Alert configurations */\n alerts?: AlertConfig[];\n /**\n * Metric names used by `getDashboard().summary` and `getHealthStatus()`.\n * Defaults to `agent.requests`, `agent.errors`, `agent.latency`, `agent.tokens`, `agent.cost`.\n * Must match the metric names you record via `incrementCounter` / `observeHistogram`,\n * or use `createAgentMetrics()` which records with these default names.\n */\n summaryMetrics?: {\n requests?: string;\n errors?: string;\n latency?: string;\n tokens?: string;\n cost?: string;\n };\n /** Event callbacks */\n events?: {\n onMetricRecorded?: (metric: MetricDataPoint) => void;\n onSpanStart?: (span: TraceSpan) => void;\n onSpanEnd?: (span: TraceSpan) => void;\n onAlert?: (alert: AlertEvent) => void;\n };\n}\n\n/** Dashboard data for UI display */\nexport interface DashboardData {\n /** Service info */\n service: {\n name: string;\n uptime: number;\n startTime: number;\n };\n /** Aggregated metrics */\n metrics: Record<string, AggregatedMetric>;\n /** Recent traces */\n traces: TraceSpan[];\n /** Active alerts */\n alerts: AlertEvent[];\n /** Summary stats */\n summary: {\n totalRequests: number;\n totalErrors: number;\n errorRate: number;\n avgLatency: number;\n p99Latency: number;\n activeSpans: number;\n totalTokens: number;\n totalCost: number;\n };\n}\n\n/** Observability instance */\nexport interface ObservabilityInstance {\n /** Record a counter metric */\n incrementCounter(\n name: string,\n labels?: Record<string, string>,\n value?: number,\n ): void;\n /** Record a gauge metric */\n setGauge(name: string, value: number, labels?: Record<string, string>): void;\n /** Record a histogram observation */\n observeHistogram(\n name: string,\n value: number,\n labels?: Record<string, string>,\n ): void;\n /** Start a trace span */\n startSpan(operationName: string, parentSpanId?: string): TraceSpan;\n /** End a trace span */\n endSpan(spanId: string, status?: \"ok\" | \"error\" | \"timeout\"): void;\n /** Add log to a span */\n addSpanLog(\n spanId: string,\n message: string,\n level?: \"debug\" | \"info\" | \"warn\" | \"error\",\n ): void;\n /** Add tag to a span */\n addSpanTag(\n spanId: string,\n key: string,\n value: string | number | boolean,\n ): void;\n /** Get dashboard data */\n getDashboard(): DashboardData;\n /** Get a specific metric */\n getMetric(name: string): AggregatedMetric | undefined;\n /** Get recent traces */\n getTraces(limit?: number): TraceSpan[];\n /** Get active alerts */\n getAlerts(): AlertEvent[];\n /** Export all data */\n export(): {\n metrics: AggregatedMetric[];\n traces: TraceSpan[];\n alerts: AlertEvent[];\n };\n /** Clear all data and reset statistics */\n clear(): void;\n /** Dispose of the instance, clearing timers and flushing data */\n destroy(): Promise<void>;\n /** Get health status for status pages */\n getHealthStatus(): {\n healthy: boolean;\n uptime: number;\n errorRate: number;\n activeAlerts: number;\n };\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\nfunction generateId(): string {\n return (\n globalThis.crypto?.randomUUID?.() ??\n `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 11)}`\n );\n}\n\nfunction calculatePercentile(values: number[], percentile: number): number {\n if (values.length === 0) return 0;\n const sorted = [...values].sort((a, b) => a - b);\n const index = Math.ceil((percentile / 100) * sorted.length) - 1;\n return 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(\n config: ObservabilityConfig = {},\n): ObservabilityInstance {\n const {\n serviceName = \"directive-agents\",\n metrics: metricsConfig = {},\n tracing: tracingConfig = {},\n alerts: alertConfigs = [],\n summaryMetrics: summaryMetricsConfig = {},\n events = {},\n } = config;\n\n const summaryMetricNames = {\n requests: summaryMetricsConfig.requests ?? \"agent.requests\",\n errors: summaryMetricsConfig.errors ?? \"agent.errors\",\n latency: summaryMetricsConfig.latency ?? \"agent.latency\",\n tokens: summaryMetricsConfig.tokens ?? \"agent.tokens\",\n cost: summaryMetricsConfig.cost ?? \"agent.cost\",\n };\n\n const {\n enabled: metricsEnabled = true,\n exportInterval,\n exporter: metricsExporter,\n maxDataPoints = 1000,\n } = metricsConfig;\n\n const {\n enabled: tracingEnabled = true,\n sampleRate = 1.0,\n maxSpans = 1000,\n exporter: tracingExporter,\n } = tracingConfig;\n\n // State\n const startTime = Date.now();\n const metricDataPoints = new Map<string, MetricDataPoint[]>();\n const activeSpans = new Map<string, TraceSpan>();\n const completedSpans: TraceSpan[] = [];\n const alertEvents: AlertEvent[] = [];\n const alertCooldowns = new Map<string, number>();\n\n // Aggregated metrics cache\n const aggregatedMetrics = new Map<string, AggregatedMetric>();\n\n // Export timer\n let exportTimer: ReturnType<typeof setInterval> | undefined;\n if (exportInterval && (metricsExporter || tracingExporter)) {\n exportTimer = setInterval(async () => {\n try {\n if (metricsExporter && metricsEnabled) {\n await metricsExporter(Array.from(aggregatedMetrics.values()));\n }\n if (tracingExporter && tracingEnabled) {\n const spansToExport = completedSpans.splice(0, 100);\n if (spansToExport.length > 0) {\n await tracingExporter(spansToExport);\n }\n }\n } catch (error) {\n console.error(\"[Directive Observability] Export error:\", error);\n }\n }, exportInterval);\n }\n\n function recordMetric(dataPoint: MetricDataPoint): void {\n if (!metricsEnabled) return;\n\n const key = `${dataPoint.name}:${JSON.stringify(Object.fromEntries(Object.entries(dataPoint.labels).sort()))}`;\n let points = metricDataPoints.get(key);\n if (!points) {\n points = [];\n metricDataPoints.set(key, points);\n }\n\n points.push(dataPoint);\n\n // Trim old data points\n if (points.length > maxDataPoints) {\n points.shift();\n }\n\n // Update aggregation\n updateAggregation(dataPoint.name, points);\n\n events.onMetricRecorded?.(dataPoint);\n\n // Check alerts\n checkAlerts(dataPoint.name);\n }\n\n function updateAggregation(name: string, points: MetricDataPoint[]): void {\n if (points.length === 0) return;\n\n const values = points.map((p) => p.value);\n const sum = values.reduce((a, b) => a + b, 0);\n\n // We've already checked points.length === 0 above, so these are safe\n const firstPoint = points[0]!;\n const lastValue = values[values.length - 1]!;\n\n const aggregated: AggregatedMetric = {\n name,\n type: firstPoint.type,\n count: points.length,\n sum,\n min: Math.min(...values),\n max: Math.max(...values),\n avg: sum / points.length,\n lastValue,\n lastUpdated: Date.now(),\n };\n\n aggregatedMetrics.set(name, aggregated);\n }\n\n function checkAlerts(metricName: string): void {\n for (const alertConfig of alertConfigs) {\n if (alertConfig.metric !== metricName) continue;\n\n const metric = aggregatedMetrics.get(metricName);\n if (!metric) continue;\n\n const cooldownKey = `${alertConfig.metric}:${alertConfig.threshold}`;\n const lastAlert = alertCooldowns.get(cooldownKey);\n const cooldown = alertConfig.cooldownMs ?? 60000;\n\n if (lastAlert && Date.now() - lastAlert < cooldown) continue;\n\n const operator = alertConfig.operator ?? \">\";\n const value = metric.lastValue;\n const threshold = alertConfig.threshold;\n\n let triggered = false;\n switch (operator) {\n case \">\":\n triggered = value > threshold;\n break;\n case \"<\":\n triggered = value < threshold;\n break;\n case \">=\":\n triggered = value >= threshold;\n break;\n case \"<=\":\n triggered = value <= threshold;\n break;\n case \"==\":\n triggered = value === threshold;\n break;\n }\n\n if (triggered) {\n const alertEvent: AlertEvent = {\n alertId: generateId(),\n metric: metricName,\n currentValue: value,\n threshold,\n operator,\n action: alertConfig.action,\n timestamp: Date.now(),\n message: `Alert: ${metricName} ${operator} ${threshold} (current: ${value})`,\n };\n\n alertEvents.push(alertEvent);\n if (alertEvents.length > 1000)\n alertEvents.splice(0, alertEvents.length - 1000);\n alertCooldowns.set(cooldownKey, Date.now());\n\n events.onAlert?.(alertEvent);\n\n switch (alertConfig.action) {\n case \"log\":\n console.log(`[Observability] ${alertEvent.message}`);\n break;\n case \"warn\":\n console.warn(`[Observability] ${alertEvent.message}`);\n break;\n case \"alert\":\n console.error(`[Observability ALERT] ${alertEvent.message}`);\n break;\n case \"callback\":\n alertConfig.callback?.(metric, threshold);\n break;\n }\n }\n }\n }\n\n function getPercentiles(name: string): {\n p50?: number;\n p90?: number;\n p99?: number;\n } {\n // Collect all data points for this metric name across all label combinations\n const allValues: number[] = [];\n for (const [key, points] of metricDataPoints) {\n if (key.startsWith(`${name}:`)) {\n for (const p of points) {\n allValues.push(p.value);\n }\n }\n }\n if (allValues.length === 0) return {};\n return {\n p50: calculatePercentile(allValues, 50),\n p90: calculatePercentile(allValues, 90),\n p99: calculatePercentile(allValues, 99),\n };\n }\n\n return {\n incrementCounter(\n name: string,\n labels: Record<string, string> = {},\n value = 1,\n ): void {\n recordMetric({\n name,\n type: \"counter\",\n value,\n labels,\n timestamp: Date.now(),\n });\n },\n\n setGauge(\n name: string,\n value: number,\n labels: Record<string, string> = {},\n ): void {\n recordMetric({\n name,\n type: \"gauge\",\n value,\n labels,\n timestamp: Date.now(),\n });\n },\n\n observeHistogram(\n name: string,\n value: number,\n labels: Record<string, string> = {},\n ): void {\n recordMetric({\n name,\n type: \"histogram\",\n value,\n labels,\n timestamp: Date.now(),\n });\n },\n\n startSpan(operationName: string, parentSpanId?: string): TraceSpan {\n // Apply sampling\n if (Math.random() > sampleRate) {\n // Return a no-op span that won't be tracked\n return {\n traceId: \"sampled-out\",\n spanId: \"sampled-out\",\n operationName,\n serviceName,\n startTime: Date.now(),\n status: \"ok\",\n tags: {},\n logs: [],\n };\n }\n\n const span: TraceSpan = {\n traceId: parentSpanId\n ? (activeSpans.get(parentSpanId)?.traceId ?? generateId())\n : generateId(),\n spanId: generateId(),\n parentSpanId,\n operationName,\n serviceName,\n startTime: Date.now(),\n status: \"ok\",\n tags: {},\n logs: [],\n };\n\n if (tracingEnabled) {\n activeSpans.set(span.spanId, span);\n events.onSpanStart?.(span);\n }\n\n return span;\n },\n\n endSpan(spanId: string, status: \"ok\" | \"error\" | \"timeout\" = \"ok\"): void {\n if (spanId === \"sampled-out\") return;\n\n const span = activeSpans.get(spanId);\n if (!span) return;\n\n span.endTime = Date.now();\n span.duration = span.endTime - span.startTime;\n span.status = status;\n\n activeSpans.delete(spanId);\n completedSpans.push(span);\n\n // Trim old spans\n while (completedSpans.length > maxSpans) {\n completedSpans.shift();\n }\n\n // Record latency metric (use recordMetric directly to avoid `this` binding issues)\n recordMetric({\n name: `${span.operationName}.latency`,\n type: \"histogram\",\n value: span.duration,\n labels: {},\n timestamp: Date.now(),\n });\n\n if (status === \"error\") {\n recordMetric({\n name: `${span.operationName}.errors`,\n type: \"counter\",\n value: 1,\n labels: {},\n timestamp: Date.now(),\n });\n }\n\n events.onSpanEnd?.(span);\n },\n\n addSpanLog(\n spanId: string,\n message: string,\n level: \"debug\" | \"info\" | \"warn\" | \"error\" = \"info\",\n ): void {\n if (spanId === \"sampled-out\") return;\n\n const span = activeSpans.get(spanId);\n if (!span) return;\n\n span.logs.push({\n timestamp: Date.now(),\n message,\n level,\n });\n },\n\n addSpanTag(\n spanId: string,\n key: string,\n value: string | number | boolean,\n ): void {\n if (spanId === \"sampled-out\") return;\n\n const span = activeSpans.get(spanId);\n if (!span) return;\n\n span.tags[key] = value;\n },\n\n getDashboard(): DashboardData {\n // Calculate summary stats using configurable metric names\n const requestsMetric = aggregatedMetrics.get(summaryMetricNames.requests);\n const errorsMetric = aggregatedMetrics.get(summaryMetricNames.errors);\n const latencyMetric = aggregatedMetrics.get(summaryMetricNames.latency);\n const tokensMetric = aggregatedMetrics.get(summaryMetricNames.tokens);\n const costMetric = aggregatedMetrics.get(summaryMetricNames.cost);\n\n const totalRequests = requestsMetric?.sum ?? 0;\n const totalErrors = errorsMetric?.sum ?? 0;\n const errorRate = totalRequests > 0 ? totalErrors / totalRequests : 0;\n\n // Calculate percentiles on demand for latency\n const latencyPercentiles = latencyMetric\n ? getPercentiles(summaryMetricNames.latency)\n : {};\n\n return {\n service: {\n name: serviceName,\n uptime: Date.now() - startTime,\n startTime,\n },\n metrics: Object.fromEntries(aggregatedMetrics),\n traces: [...completedSpans].slice(-100),\n alerts: [...alertEvents].slice(-50),\n summary: {\n totalRequests,\n totalErrors,\n errorRate,\n avgLatency: latencyMetric?.avg ?? 0,\n p99Latency: latencyPercentiles.p99 ?? 0,\n activeSpans: activeSpans.size,\n totalTokens: tokensMetric?.sum ?? 0,\n totalCost: costMetric?.sum ?? 0,\n },\n };\n },\n\n getMetric(name: string): AggregatedMetric | undefined {\n const metric = aggregatedMetrics.get(name);\n if (!metric) return undefined;\n // Calculate percentiles on demand\n const percentiles = getPercentiles(name);\n return { ...metric, ...percentiles };\n },\n\n getTraces(limit = 100): TraceSpan[] {\n return [...completedSpans].slice(-limit);\n },\n\n getAlerts(): AlertEvent[] {\n return [...alertEvents];\n },\n\n export() {\n return {\n metrics: Array.from(aggregatedMetrics.values()),\n traces: [...completedSpans],\n alerts: [...alertEvents],\n };\n },\n\n clear() {\n metricDataPoints.clear();\n aggregatedMetrics.clear();\n activeSpans.clear();\n completedSpans.length = 0;\n alertEvents.length = 0;\n alertCooldowns.clear();\n },\n\n async destroy() {\n // Clear the export timer\n if (exportTimer) {\n clearInterval(exportTimer);\n exportTimer = undefined;\n }\n\n // Flush any remaining data to exporters\n try {\n if (metricsExporter && metricsEnabled && aggregatedMetrics.size > 0) {\n await metricsExporter(Array.from(aggregatedMetrics.values()));\n }\n if (tracingExporter && tracingEnabled && completedSpans.length > 0) {\n await tracingExporter([...completedSpans]);\n }\n } catch (error) {\n console.error(\n \"[Directive Observability] Error flushing data during destroy:\",\n error,\n );\n }\n\n // Clear all data\n metricDataPoints.clear();\n aggregatedMetrics.clear();\n activeSpans.clear();\n completedSpans.length = 0;\n alertEvents.length = 0;\n alertCooldowns.clear();\n },\n\n getHealthStatus() {\n const requestsMetric = aggregatedMetrics.get(summaryMetricNames.requests);\n const errorsMetric = aggregatedMetrics.get(summaryMetricNames.errors);\n\n const totalRequests = requestsMetric?.sum ?? 0;\n const totalErrors = errorsMetric?.sum ?? 0;\n const errorRate = totalRequests > 0 ? totalErrors / totalRequests : 0;\n\n // Consider unhealthy if error rate > 10% or there are active alerts\n const activeAlertCount = alertEvents.filter(\n (a) => Date.now() - a.timestamp < 300000, // Last 5 minutes\n ).length;\n\n return {\n healthy: errorRate < 0.1 && activeAlertCount === 0,\n uptime: Date.now() - startTime,\n errorRate,\n activeAlerts: activeAlertCount,\n };\n },\n };\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 return {\n trackRun(\n agentName: string,\n result: {\n success: boolean;\n latencyMs: number;\n inputTokens?: number;\n outputTokens?: number;\n cost?: number;\n toolCalls?: number;\n },\n ): void {\n const labels = { agent: agentName };\n\n obs.incrementCounter(\"agent.requests\", labels);\n\n if (!result.success) {\n obs.incrementCounter(\"agent.errors\", labels);\n }\n\n obs.observeHistogram(\"agent.latency\", result.latencyMs, labels);\n\n if (result.inputTokens !== undefined) {\n obs.incrementCounter(\"agent.tokens.input\", labels, result.inputTokens);\n obs.incrementCounter(\"agent.tokens\", labels, result.inputTokens);\n }\n\n if (result.outputTokens !== undefined) {\n obs.incrementCounter(\n \"agent.tokens.output\",\n labels,\n result.outputTokens,\n );\n obs.incrementCounter(\"agent.tokens\", labels, result.outputTokens);\n }\n\n if (result.cost !== undefined) {\n obs.incrementCounter(\"agent.cost\", labels, result.cost);\n }\n\n if (result.toolCalls !== undefined) {\n obs.incrementCounter(\"agent.tool_calls\", labels, result.toolCalls);\n }\n },\n\n trackGuardrail(\n guardrailName: string,\n result: {\n passed: boolean;\n latencyMs: number;\n blocked?: boolean;\n },\n ): void {\n const labels = { guardrail: guardrailName };\n\n obs.incrementCounter(\"guardrail.checks\", labels);\n\n if (!result.passed) {\n obs.incrementCounter(\"guardrail.failures\", labels);\n }\n\n if (result.blocked) {\n obs.incrementCounter(\"guardrail.blocks\", labels);\n }\n\n obs.observeHistogram(\"guardrail.latency\", result.latencyMs, labels);\n },\n\n trackApproval(\n toolName: string,\n result: {\n approved: boolean;\n waitTimeMs: number;\n timedOut?: boolean;\n },\n ): void {\n const labels = { tool: toolName };\n\n obs.incrementCounter(\"approval.requests\", labels);\n\n if (result.approved) {\n obs.incrementCounter(\"approval.approved\", labels);\n } else {\n obs.incrementCounter(\"approval.rejected\", labels);\n }\n\n if (result.timedOut) {\n obs.incrementCounter(\"approval.timeouts\", labels);\n }\n\n obs.observeHistogram(\"approval.wait_time\", result.waitTimeMs, labels);\n },\n\n trackHandoff(fromAgent: string, toAgent: string, latencyMs: number): void {\n obs.incrementCounter(\"handoff.count\", { from: fromAgent, to: toAgent });\n obs.observeHistogram(\"handoff.latency\", latencyMs);\n },\n };\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 /** OTLP endpoint base URL (e.g., http://localhost:4318) */\n endpoint: string;\n /** Optional headers (e.g., auth tokens) */\n headers?: Record<string, string>;\n /** Service name for resource identification */\n serviceName?: string;\n /** Service version */\n serviceVersion?: string;\n /** Custom resource attributes */\n resourceAttributes?: Record<string, string>;\n /** Instrumentation scope version (default: \"0.1.0\") */\n scopeVersion?: string;\n /** Request timeout in ms (default: 10000) */\n timeoutMs?: number;\n /** Custom fetch function (for testing or custom HTTP clients) */\n fetch?: typeof globalThis.fetch;\n /** Callback on export error */\n onError?: (error: Error, type: \"metrics\" | \"traces\") => void;\n}\n\n/** OTLP exporter instance */\nexport interface OTLPExporter {\n /** Export metrics in OTLP format (compatible with ObservabilityConfig.metrics.exporter) */\n exportMetrics: (metrics: AggregatedMetric[]) => Promise<void>;\n /** Export traces in OTLP format (compatible with ObservabilityConfig.tracing.exporter) */\n exportTraces: (traces: TraceSpan[]) => Promise<void>;\n}\n\n// ============================================================================\n// OTLP JSON Conversion\n// ============================================================================\n\ninterface OTLPResource {\n attributes: Array<{ key: string; value: { stringValue: string } }>;\n}\n\nfunction buildResource(config: OTLPExporterConfig): OTLPResource {\n const attrs: Array<{ key: string; value: { stringValue: string } }> = [\n {\n key: \"service.name\",\n value: { stringValue: config.serviceName ?? \"directive-agents\" },\n },\n ];\n\n if (config.serviceVersion) {\n attrs.push({\n key: \"service.version\",\n value: { stringValue: config.serviceVersion },\n });\n }\n\n if (config.resourceAttributes) {\n for (const [key, val] of Object.entries(config.resourceAttributes)) {\n attrs.push({ key, value: { stringValue: val } });\n }\n }\n\n return { attributes: attrs };\n}\n\nfunction toNanos(timestampMs: number): string {\n return `${BigInt(timestampMs) * BigInt(1_000_000)}`;\n}\n\nfunction metricTypeToOTLP(type: string): string {\n switch (type) {\n case \"counter\":\n return \"sum\";\n case \"gauge\":\n return \"gauge\";\n case \"histogram\":\n return \"histogram\";\n default:\n return \"gauge\";\n }\n}\n\nfunction convertMetrics(\n metrics: AggregatedMetric[],\n resource: OTLPResource,\n scopeVersion: string,\n): Record<string, unknown> {\n const scopeMetrics = metrics.map((metric) => {\n // Known limitation: startTimeUnixNano is approximated as lastUpdated minus 60s.\n // A more accurate value would require tracking the actual collection start time\n // per metric, which is not available in the current AggregatedMetric type.\n const startTimeMs = metric.lastUpdated - 60000;\n\n const dataPoints = [\n {\n asInt: metric.type === \"counter\" ? metric.sum : undefined,\n asDouble: metric.type !== \"counter\" ? metric.lastValue : undefined,\n timeUnixNano: toNanos(metric.lastUpdated),\n startTimeUnixNano: toNanos(startTimeMs),\n attributes: [],\n },\n ];\n\n const otlpType = metricTypeToOTLP(metric.type);\n const metricData: Record<string, unknown> = {\n name: metric.name,\n unit: \"\",\n };\n\n if (otlpType === \"sum\") {\n metricData.sum = {\n dataPoints,\n aggregationTemporality: 2, // CUMULATIVE\n isMonotonic: true,\n };\n } else if (otlpType === \"histogram\") {\n metricData.histogram = {\n dataPoints: [\n {\n count: metric.count,\n sum: metric.sum,\n min: metric.min,\n max: metric.max,\n timeUnixNano: toNanos(metric.lastUpdated),\n startTimeUnixNano: toNanos(startTimeMs),\n attributes: [],\n },\n ],\n aggregationTemporality: 2,\n };\n } else {\n metricData.gauge = { dataPoints };\n }\n\n return metricData;\n });\n\n return {\n resourceMetrics: [\n {\n resource,\n scopeMetrics: [\n {\n scope: { name: \"directive\", version: scopeVersion },\n metrics: scopeMetrics,\n },\n ],\n },\n ],\n };\n}\n\nfunction convertTraces(\n traces: TraceSpan[],\n resource: OTLPResource,\n scopeVersion: string,\n): Record<string, unknown> {\n const spans = traces.map((span) => {\n const events = span.logs.map((log) => ({\n timeUnixNano: toNanos(log.timestamp),\n name: log.level,\n attributes: [\n { key: \"message\", value: { stringValue: log.message } },\n { key: \"level\", value: { stringValue: log.level } },\n ],\n }));\n\n const attributes = Object.entries(span.tags).map(([key, val]) => ({\n key,\n value:\n typeof val === \"string\"\n ? { stringValue: val }\n : typeof val === \"number\"\n ? { intValue: `${val}` }\n : { boolValue: val },\n }));\n\n const statusCode =\n span.status === \"ok\" ? 1 : span.status === \"error\" ? 2 : 0;\n\n return {\n traceId: span.traceId.replace(/-/g, \"\").padEnd(32, \"0\").slice(0, 32),\n spanId: span.spanId.replace(/-/g, \"\").padEnd(16, \"0\").slice(0, 16),\n parentSpanId: span.parentSpanId\n ? span.parentSpanId.replace(/-/g, \"\").padEnd(16, \"0\").slice(0, 16)\n : undefined,\n name: span.operationName,\n kind: 1, // INTERNAL\n startTimeUnixNano: toNanos(span.startTime),\n endTimeUnixNano: span.endTime\n ? toNanos(span.endTime)\n : toNanos(span.startTime),\n attributes,\n events,\n status: { code: statusCode },\n };\n });\n\n return {\n resourceSpans: [\n {\n resource,\n scopeSpans: [\n {\n scope: { name: \"directive\", version: scopeVersion },\n spans,\n },\n ],\n },\n ],\n };\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 const {\n endpoint,\n headers = {},\n scopeVersion = \"0.1.0\",\n timeoutMs = 10000,\n fetch: fetchFn = globalThis.fetch,\n onError,\n } = config;\n\n // Validate endpoint URL\n try {\n const url = new URL(endpoint);\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n throw new Error(\"[Directive] Only http: and https: protocols are supported\");\n }\n } catch (error) {\n throw new Error(\n `[Directive OTLP] Invalid endpoint URL \"${endpoint}\": ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n\n // Warn if endpoint already contains a path like /v1/metrics or /v1/traces\n if (/\\/v1\\/(metrics|traces)/.test(endpoint)) {\n console.warn(\n `[Directive OTLP] Endpoint \"${endpoint}\" already contains a /v1/metrics or /v1/traces path. ` +\n \"The exporter will append /v1/metrics or /v1/traces automatically. \" +\n `Use the base URL (e.g., \"http://localhost:4318\") instead.`,\n );\n }\n\n // Validate timeoutMs\n if (timeoutMs <= 0 || !Number.isFinite(timeoutMs)) {\n throw new Error(`[Directive OTLP] timeoutMs must be > 0, got ${timeoutMs}`);\n }\n\n const resource = buildResource(config);\n\n async function send(\n path: string,\n body: Record<string, unknown>,\n type: \"metrics\" | \"traces\",\n ): Promise<void> {\n const url = `${endpoint.replace(/\\/$/, \"\")}${path}`;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const response = await fetchFn(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers,\n },\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n throw new Error(\n `[Directive] OTLP export failed: ${response.status} ${response.statusText}`,\n );\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n if (onError) {\n onError(err, type);\n } else {\n console.error(`[Directive OTLP] Export ${type} error:`, err.message);\n }\n } finally {\n clearTimeout(timer);\n }\n }\n\n return {\n async exportMetrics(metrics: AggregatedMetric[]): Promise<void> {\n if (metrics.length === 0) return;\n const body = convertMetrics(metrics, resource, scopeVersion);\n await send(\"/v1/metrics\", body, \"metrics\");\n },\n\n async exportTraces(traces: TraceSpan[]): Promise<void> {\n if (traces.length === 0) return;\n const body = convertTraces(traces, resource, scopeVersion);\n await send(\"/v1/traces\", body, \"traces\");\n },\n };\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 /** Number of failures before opening the circuit (default: 5) */\n failureThreshold?: number;\n /** Time in ms before transitioning from OPEN to HALF_OPEN (default: 30000) */\n recoveryTimeMs?: number;\n /** Number of requests allowed in HALF_OPEN state (default: 3) */\n halfOpenMaxRequests?: number;\n /** Time window in ms for counting failures (default: 60000). Failures outside this window are forgotten. */\n failureWindowMs?: number;\n /** Optional observability instance for automatic metric tracking */\n observability?: ObservabilityInstance;\n /** Metric name prefix for observability (default: \"circuit_breaker\") */\n metricPrefix?: string;\n /** Name for this circuit breaker (used in metrics and errors) */\n name?: string;\n /** Custom error classifier. Return true if the error should count as a failure. Default: all errors count. */\n isFailure?: (error: Error) => boolean;\n /** Callback when state changes */\n onStateChange?: (from: CircuitState, to: CircuitState) => void;\n}\n\n/** Circuit breaker statistics */\nexport interface CircuitBreakerStats {\n state: CircuitState;\n totalRequests: number;\n totalFailures: number;\n totalSuccesses: number;\n totalRejected: number;\n recentFailures: number;\n lastFailureTime: number | null;\n lastSuccessTime: number | null;\n lastStateChange: number;\n}\n\n/** Circuit breaker instance */\nexport interface CircuitBreaker {\n /** Execute an operation through the circuit breaker */\n execute<T>(fn: () => Promise<T>): Promise<T>;\n /** Get the current state */\n getState(): CircuitState;\n /** Get statistics */\n getStats(): CircuitBreakerStats;\n /** Force the circuit to a specific state (useful for testing) */\n forceState(state: CircuitState): void;\n /** Reset the circuit breaker to CLOSED with cleared stats */\n reset(): void;\n /** Check if a request would be allowed (without executing) */\n isAllowed(): 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 readonly code = \"CIRCUIT_OPEN\" as const;\n readonly retryAfterMs: number;\n readonly state: \"OPEN\" | \"HALF_OPEN\";\n\n constructor(\n name: string,\n retryAfterMs: number,\n state: \"OPEN\" | \"HALF_OPEN\" = \"OPEN\",\n detail?: string,\n ) {\n const msg = detail\n ? `[Directive CircuitBreaker] Circuit \"${name}\" is ${state}. ${detail}`\n : `[Directive CircuitBreaker] Circuit \"${name}\" is ${state}. Request rejected. Try again in ${Math.ceil(retryAfterMs / 1000)}s.`;\n super(msg);\n this.name = \"CircuitBreakerOpenError\";\n this.retryAfterMs = retryAfterMs;\n this.state = state;\n }\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\n/**\n * Create a circuit breaker for protecting against cascading failures.\n *\n * @param config - Circuit breaker configuration (thresholds, recovery time, observability)\n * @returns A circuit breaker instance with `execute`, `getState`, and `reset` methods\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 If failureThreshold is less than 1 or not a finite number\n * @throws If recoveryTimeMs is not positive or not a finite number\n * @throws If halfOpenMaxRequests is less than 1 or not a finite number\n * @throws If failureWindowMs is not positive or not a finite number\n */\nexport function createCircuitBreaker(\n config: CircuitBreakerConfig = {},\n): CircuitBreaker {\n const {\n failureThreshold = 5,\n recoveryTimeMs = 30000,\n halfOpenMaxRequests = 3,\n failureWindowMs = 60000,\n observability,\n metricPrefix = \"circuit_breaker\",\n name = \"default\",\n isFailure = () => true,\n onStateChange,\n } = config;\n\n // Validate config\n if (failureThreshold < 1 || !Number.isFinite(failureThreshold)) {\n throw new Error(\n `[Directive CircuitBreaker] failureThreshold must be >= 1, got ${failureThreshold}`,\n );\n }\n if (recoveryTimeMs <= 0 || !Number.isFinite(recoveryTimeMs)) {\n throw new Error(\n `[Directive CircuitBreaker] recoveryTimeMs must be > 0, got ${recoveryTimeMs}`,\n );\n }\n if (halfOpenMaxRequests < 1 || !Number.isFinite(halfOpenMaxRequests)) {\n throw new Error(\n `[Directive CircuitBreaker] halfOpenMaxRequests must be >= 1, got ${halfOpenMaxRequests}`,\n );\n }\n if (failureWindowMs <= 0 || !Number.isFinite(failureWindowMs)) {\n throw new Error(\n `[Directive CircuitBreaker] failureWindowMs must be > 0, got ${failureWindowMs}`,\n );\n }\n\n let state: CircuitState = \"CLOSED\";\n let failureTimestamps: number[] = [];\n let halfOpenRequests = 0;\n let halfOpenSuccesses = 0;\n let lastStateChange = Date.now();\n let openedAt = 0;\n\n // Stats\n let totalRequests = 0;\n let totalFailures = 0;\n let totalSuccesses = 0;\n let totalRejected = 0;\n let lastFailureTime: number | null = null;\n let lastSuccessTime: number | null = null;\n\n function transition(newState: CircuitState): void {\n if (state === newState) return;\n const oldState = state;\n state = newState;\n lastStateChange = Date.now();\n\n if (newState === \"OPEN\") {\n openedAt = Date.now();\n }\n if (newState === \"HALF_OPEN\") {\n halfOpenRequests = 0;\n halfOpenSuccesses = 0;\n }\n\n onStateChange?.(oldState, newState);\n\n if (observability) {\n observability.incrementCounter(`${metricPrefix}.state_change`, {\n name,\n from: oldState,\n to: newState,\n });\n }\n }\n\n function getRecentFailures(): number {\n const cutoff = Date.now() - failureWindowMs;\n failureTimestamps = failureTimestamps.filter((t) => t > cutoff);\n return failureTimestamps.length;\n }\n\n function recordSuccess(): void {\n totalSuccesses++;\n lastSuccessTime = Date.now();\n\n if (observability) {\n observability.incrementCounter(`${metricPrefix}.success`, { name });\n }\n\n if (state === \"HALF_OPEN\") {\n halfOpenSuccesses++;\n if (halfOpenSuccesses >= halfOpenMaxRequests) {\n transition(\"CLOSED\");\n failureTimestamps = [];\n }\n }\n }\n\n function recordFailure(error: Error): void {\n if (!isFailure(error)) {\n recordSuccess();\n return;\n }\n\n totalFailures++;\n lastFailureTime = Date.now();\n failureTimestamps.push(Date.now());\n\n // Cap array to prevent unbounded growth (keep 2x threshold as headroom)\n const maxTimestamps = failureThreshold * 2;\n if (failureTimestamps.length > maxTimestamps) {\n failureTimestamps = failureTimestamps.slice(-maxTimestamps);\n }\n\n if (observability) {\n observability.incrementCounter(`${metricPrefix}.failure`, { name });\n }\n\n if (state === \"HALF_OPEN\") {\n transition(\"OPEN\");\n return;\n }\n\n if (state === \"CLOSED\" && getRecentFailures() >= failureThreshold) {\n transition(\"OPEN\");\n }\n }\n\n return {\n async execute<T>(fn: () => Promise<T>): Promise<T> {\n totalRequests++;\n\n if (observability) {\n observability.incrementCounter(`${metricPrefix}.requests`, { name });\n }\n\n // Check if request should be allowed\n if (state === \"OPEN\") {\n // Check if recovery time has elapsed\n if (Date.now() - openedAt >= recoveryTimeMs) {\n transition(\"HALF_OPEN\");\n } else {\n totalRejected++;\n if (observability) {\n observability.incrementCounter(`${metricPrefix}.rejected`, {\n name,\n });\n }\n throw new CircuitBreakerOpenError(\n name,\n recoveryTimeMs - (Date.now() - openedAt),\n );\n }\n }\n\n if (state === \"HALF_OPEN\") {\n if (halfOpenRequests >= halfOpenMaxRequests) {\n totalRejected++;\n throw new CircuitBreakerOpenError(\n name,\n recoveryTimeMs,\n \"HALF_OPEN\",\n `Max trial requests (${halfOpenMaxRequests}) reached.`,\n );\n }\n halfOpenRequests++;\n }\n\n // Execute the operation\n const start = Date.now();\n try {\n const result = await fn();\n recordSuccess();\n\n if (observability) {\n observability.observeHistogram(\n `${metricPrefix}.latency`,\n Date.now() - start,\n { name },\n );\n }\n\n return result;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n recordFailure(err);\n\n if (observability) {\n observability.observeHistogram(\n `${metricPrefix}.latency`,\n Date.now() - start,\n { name },\n );\n }\n\n throw error;\n }\n },\n\n getState(): CircuitState {\n // Auto-transition from OPEN to HALF_OPEN when recovery time has passed\n if (state === \"OPEN\" && Date.now() - openedAt >= recoveryTimeMs) {\n transition(\"HALF_OPEN\");\n }\n return state;\n },\n\n getStats(): CircuitBreakerStats {\n // Ensure state freshness (auto-transition OPEN → HALF_OPEN)\n const currentState = this.getState();\n return {\n state: currentState,\n totalRequests,\n totalFailures,\n totalSuccesses,\n totalRejected,\n recentFailures: getRecentFailures(),\n lastFailureTime,\n lastSuccessTime,\n lastStateChange,\n };\n },\n\n forceState(newState: CircuitState): void {\n transition(newState);\n },\n\n reset(): void {\n const oldState = state;\n state = \"CLOSED\";\n failureTimestamps = [];\n halfOpenRequests = 0;\n halfOpenSuccesses = 0;\n lastStateChange = Date.now();\n openedAt = 0;\n totalRequests = 0;\n totalFailures = 0;\n totalSuccesses = 0;\n totalRejected = 0;\n lastFailureTime = null;\n lastSuccessTime = null;\n if (oldState !== \"CLOSED\") {\n onStateChange?.(oldState, \"CLOSED\");\n }\n },\n\n isAllowed(): boolean {\n if (state === \"CLOSED\") return true;\n if (state === \"OPEN\") {\n return Date.now() - openedAt >= recoveryTimeMs;\n }\n // HALF_OPEN\n return halfOpenRequests < halfOpenMaxRequests;\n },\n };\n}\n"]}
|