@directive-run/core 1.21.0 → 1.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/README.md +2 -2
  2. package/dist/adapter-utils.cjs +1 -1
  3. package/dist/adapter-utils.d.cts +1 -1
  4. package/dist/adapter-utils.d.ts +1 -1
  5. package/dist/adapter-utils.js +1 -1
  6. package/dist/chunk-AFPLATPV.js +16 -0
  7. package/dist/chunk-AFPLATPV.js.map +1 -0
  8. package/dist/{chunk-4OXCKDKS.cjs → chunk-FCCJUQB2.cjs} +3 -3
  9. package/dist/chunk-FCCJUQB2.cjs.map +1 -0
  10. package/dist/chunk-IZNOPHPL.js +3 -0
  11. package/dist/chunk-IZNOPHPL.js.map +1 -0
  12. package/dist/chunk-LN5H74CU.js +2 -0
  13. package/dist/{chunk-RBF653NR.js.map → chunk-LN5H74CU.js.map} +1 -1
  14. package/dist/chunk-PJIIBQTK.js +2 -0
  15. package/dist/chunk-PJIIBQTK.js.map +1 -0
  16. package/dist/chunk-PTT4MWNL.cjs +3 -0
  17. package/dist/chunk-PTT4MWNL.cjs.map +1 -0
  18. package/dist/{chunk-GKMJ7NMP.cjs → chunk-RD2HO5NZ.cjs} +2 -2
  19. package/dist/{chunk-GKMJ7NMP.cjs.map → chunk-RD2HO5NZ.cjs.map} +1 -1
  20. package/dist/{chunk-GACC2DMS.cjs → chunk-S6W6Y44G.cjs} +2 -2
  21. package/dist/{chunk-GACC2DMS.cjs.map → chunk-S6W6Y44G.cjs.map} +1 -1
  22. package/dist/{chunk-6PF2FRBG.js → chunk-WD47DB52.js} +2 -2
  23. package/dist/{chunk-6PF2FRBG.js.map → chunk-WD47DB52.js.map} +1 -1
  24. package/dist/chunk-WKGNK4QK.cjs +2 -0
  25. package/dist/chunk-WKGNK4QK.cjs.map +1 -0
  26. package/dist/chunk-WVP3GOY2.js +3 -0
  27. package/dist/chunk-WVP3GOY2.js.map +1 -0
  28. package/dist/chunk-XKXTRVJF.cjs +3 -0
  29. package/dist/chunk-XKXTRVJF.cjs.map +1 -0
  30. package/dist/{index-CvQuu0tu.d.cts → index-DpvgHVHR.d.cts} +29 -2
  31. package/dist/{index-DUbpbGw8.d.ts → index-n8oQmdOZ.d.ts} +29 -2
  32. package/dist/index.cjs +2 -2
  33. package/dist/index.cjs.map +1 -1
  34. package/dist/index.d.cts +46 -164
  35. package/dist/index.d.ts +46 -164
  36. package/dist/index.js +2 -2
  37. package/dist/index.js.map +1 -1
  38. package/dist/internals.cjs +1 -1
  39. package/dist/internals.d.cts +45 -25
  40. package/dist/internals.d.ts +45 -25
  41. package/dist/internals.js +1 -1
  42. package/dist/plugins/index.cjs +2 -2
  43. package/dist/plugins/index.cjs.map +1 -1
  44. package/dist/plugins/index.d.cts +358 -3
  45. package/dist/plugins/index.d.ts +358 -3
  46. package/dist/plugins/index.js +2 -2
  47. package/dist/plugins/index.js.map +1 -1
  48. package/dist/{plugins-4IfhJV32.d.cts → plugins-CaPMTICa.d.cts} +400 -31
  49. package/dist/{plugins-4IfhJV32.d.ts → plugins-CaPMTICa.d.ts} +400 -31
  50. package/dist/{predicate-DBTPnlg6.d.cts → predicate-CU0YC1i6.d.cts} +1 -1
  51. package/dist/{predicate-BW05x5el.d.ts → predicate-CgpwJqf4.d.ts} +1 -1
  52. package/dist/system-HOP37Z4V.js +2 -0
  53. package/dist/{system-SJBP4TO5.js.map → system-HOP37Z4V.js.map} +1 -1
  54. package/dist/system-VZUHL56W.cjs +2 -0
  55. package/dist/{system-SB7JYMRB.cjs.map → system-VZUHL56W.cjs.map} +1 -1
  56. package/dist/testing.cjs +1 -1
  57. package/dist/testing.cjs.map +1 -1
  58. package/dist/testing.d.cts +1 -1
  59. package/dist/testing.d.ts +1 -1
  60. package/dist/testing.js +1 -1
  61. package/dist/testing.js.map +1 -1
  62. package/dist/worker.cjs +1 -1
  63. package/dist/worker.cjs.map +1 -1
  64. package/dist/worker.d.cts +1 -1
  65. package/dist/worker.d.ts +1 -1
  66. package/dist/worker.js +1 -1
  67. package/dist/worker.js.map +1 -1
  68. package/package.json +1 -1
  69. package/dist/chunk-4OXCKDKS.cjs.map +0 -1
  70. package/dist/chunk-6QAUJFQH.js +0 -3
  71. package/dist/chunk-6QAUJFQH.js.map +0 -1
  72. package/dist/chunk-E53A4NHM.js +0 -16
  73. package/dist/chunk-E53A4NHM.js.map +0 -1
  74. package/dist/chunk-GBCWXTXW.cjs +0 -3
  75. package/dist/chunk-GBCWXTXW.cjs.map +0 -1
  76. package/dist/chunk-KGTBTGOY.js +0 -2
  77. package/dist/chunk-KGTBTGOY.js.map +0 -1
  78. package/dist/chunk-M5PEB553.cjs +0 -3
  79. package/dist/chunk-M5PEB553.cjs.map +0 -1
  80. package/dist/chunk-MARZI3EY.cjs +0 -2
  81. package/dist/chunk-MARZI3EY.cjs.map +0 -1
  82. package/dist/chunk-RBF653NR.js +0 -2
  83. package/dist/chunk-SFUVPP4L.js +0 -3
  84. package/dist/chunk-SFUVPP4L.js.map +0 -1
  85. package/dist/system-SB7JYMRB.cjs +0 -2
  86. package/dist/system-SJBP4TO5.js +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/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","whenExplain","passed","c","error","req","byResolver","resolver","duration","attempt","moduleId","eventName","phase","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","constraintsSectionRefs","body","empty","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","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","OP_SYMBOL","opSymbol","op","formatClauseValue","COMBINATOR_OPS","renderClauseLi","clause","mark","path","sub","symbol","expected","actual","removeConstraintRow","setConstraintsEmptyState","hasAnyConstraints","renderConstraintRow","tree","note","graphCaches","computeFingerprint","factKeys","derivKeys","constraints","reqMap","resolverIds","activeResolverIds","r","updateAnimationAttrs","cache","depGraph","constraintIds","node","pulsing","updateDependencyGraph","inspection","allConstraints","unmetReqs","inflightReqs","f","text","fingerprint","existingCache","colW","colX","totalW","layoutColumn","items","y","factNodes","k","fMeta","derivNodes","dMeta","d","constraintNodes","reqNodeArr","resolverNodeArr","rDef","maxRows","totalH","headers","i","newCache","drawNode","x","cy","nodeId","dimmed","tooltip","g","title","rect","drawEdge","x1","y1","x2","y2","factPositions","derivPositions","constraintPositions","reqPositions","ff","pos","dd","cMeta","cc","isActive","rMeta","rd","dPos","dep","fPos","cPos","rPos","rn","n","scheduleAnimationClear","updateTimeline","timeline","entries","minMs","maxMs","startMs","range","barAreaW","resolverOrder","seen","visibleResolvers","markers","ms","colorIdx","resolverEntries","w","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","panel","factsRowMap","constraintRowMap","recording","shouldCreatePanel","rafId","dirty","D_FACTS","D_DERIV","D_REQS","D_STATUS","D_PERF","D_FLOW","D_TT","D_TIMELINE","D_CONSTRAINTS","pendingFactUpdates","pendingFactDeletes","pendingConstraintUpdates","pendingConstraintDeletes","lastResult","schedulePanelUpdate","bits","flushPanelUpdates","sys","flags","panelEvent","recordEvent","facts","hasConstraints","payload","blob","url","_system","change","_snapshot","basePayload","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","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":"iPAoCA,IAAMA,EAAAA,CAAa,CAAE,KAAA,CAAO,CAAA,CAAG,KAAM,CAAA,CAAG,IAAA,CAAM,EAAG,KAAA,CAAO,CAAE,EAyBnD,SAASC,EAAAA,CACdC,EAAgC,EAAC,CACtB,CACX,GAAM,CACJ,KAAA,CAAAC,CAAAA,CAAQ,MAAA,CACR,MAAA,CAAAC,EAAS,IAAM,IAAA,CACf,OAAAC,CAAAA,CAAS,OAAA,CACT,OAAAC,CAAAA,CAAS,aACX,CAAA,CAAIJ,CAAAA,CAEEK,CAAAA,CAAWP,EAAAA,CAAWG,CAAK,CAAA,CAE3BK,CAAAA,CAAM,CACVC,CAAAA,CACAC,CAAAA,CAAAA,GACGC,IACA,CACCX,EAAAA,CAAWS,CAAU,CAAA,CAAIF,CAAAA,EACxBH,CAAAA,CAAOM,CAAK,CAAA,EACjBL,CAAAA,CAAOI,CAAU,CAAA,CAAE,CAAA,EAAGH,CAAM,CAAA,CAAA,EAAII,CAAK,GAAI,GAAGC,CAAI,EAClD,CAAA,CAEA,OAAO,CACL,IAAA,CAAM,SAAA,CAEN,OAAQ,IAAMH,CAAAA,CAAI,OAAA,CAAS,MAAM,CAAA,CACjC,OAAA,CAAS,IAAMA,CAAAA,CAAI,MAAA,CAAQ,OAAO,CAAA,CAClC,MAAA,CAAQ,IAAMA,CAAAA,CAAI,MAAA,CAAQ,MAAM,CAAA,CAChC,SAAA,CAAW,IAAMA,EAAI,OAAA,CAAS,SAAS,EAEvC,SAAA,CAAW,CAACI,EAAKC,CAAAA,CAAOC,CAAAA,GAAS,CAC/BN,CAAAA,CAAI,OAAA,CAAS,UAAA,CAAY,CAAE,GAAA,CAAAI,CAAAA,CAAK,MAAAC,CAAAA,CAAO,IAAA,CAAAC,CAAK,CAAC,EAC/C,EAEA,YAAA,CAAc,CAACF,EAAKE,CAAAA,GAAS,CAC3BN,EAAI,OAAA,CAAS,aAAA,CAAe,CAAE,GAAA,CAAAI,CAAAA,CAAK,IAAA,CAAAE,CAAK,CAAC,EAC3C,EAEA,YAAA,CAAeC,CAAAA,EAAY,CACzBP,CAAAA,CAAI,OAAA,CAAS,cAAe,CAAE,KAAA,CAAOO,CAAAA,CAAQ,MAAA,CAAQ,OAAA,CAAAA,CAAQ,CAAC,EAChE,CAAA,CAEA,oBAAqB,CAACC,CAAAA,CAAIH,EAAOI,CAAAA,GAAS,CACxCT,CAAAA,CAAI,OAAA,CAAS,oBAAA,CAAsB,CAAE,GAAAQ,CAAAA,CAAI,KAAA,CAAAH,EAAO,IAAA,CAAAI,CAAK,CAAC,EACxD,CAAA,CAEA,sBAAA,CAAyBD,CAAAA,EAAO,CAC9BR,CAAAA,CAAI,QAAS,uBAAA,CAAyB,CAAE,GAAAQ,CAAG,CAAC,EAC9C,CAAA,CAEA,gBAAA,CAAkB,IAAM,CACtBR,CAAAA,CAAI,OAAA,CAAS,iBAAiB,EAChC,CAAA,CAEA,eAAiBU,CAAAA,EAAW,CAC1BV,EAAI,OAAA,CAAS,eAAA,CAAiB,CAC5B,KAAA,CAAOU,CAAAA,CAAO,KAAA,CAAM,OACpB,QAAA,CAAUA,CAAAA,CAAO,SAAS,MAAA,CAC1B,SAAA,CAAWA,EAAO,SAAA,CAAU,MAAA,CAC5B,QAAA,CAAUA,CAAAA,CAAO,QAAA,CAAS,MAC5B,CAAC,EACH,CAAA,CAEA,qBAAsB,CAACF,CAAAA,CAAIG,EAAQC,CAAAA,GAAgB,CAKjD,GAAIA,CAAAA,CAAa,CACf,IAAMC,CAAAA,CAASD,CAAAA,CAAY,OAAQE,CAAAA,EAAMA,CAAAA,CAAE,IAAI,CAAA,CAAE,MAAA,CACjDd,CAAAA,CAAI,OAAA,CAAS,qBAAA,CAAuB,CAClC,GAAAQ,CAAAA,CACA,MAAA,CAAAG,EACA,OAAA,CAAS,CAAE,MAAOC,CAAAA,CAAY,MAAA,CAAQ,MAAA,CAAAC,CAAO,CAC/C,CAAC,EAED,MACF,CACAb,EAAI,OAAA,CAAS,qBAAA,CAAuB,CAAE,EAAA,CAAAQ,CAAAA,CAAI,MAAA,CAAAG,CAAO,CAAC,EACpD,EAEA,iBAAA,CAAmB,CAACH,EAAIO,CAAAA,GAAU,CAChCf,EAAI,OAAA,CAAS,kBAAA,CAAoB,CAAE,EAAA,CAAAQ,CAAAA,CAAI,KAAA,CAAAO,CAAM,CAAC,EAChD,EAEA,oBAAA,CAAuBC,CAAAA,EAAQ,CAC7BhB,CAAAA,CAAI,OAAA,CAAS,qBAAA,CAAuB,CAClC,EAAA,CAAIgB,CAAAA,CAAI,GACR,IAAA,CAAMA,CAAAA,CAAI,YAAY,IACxB,CAAC,EACH,CAAA,CAEA,gBAAA,CAAkB,CAACA,CAAAA,CAAKC,CAAAA,GAAe,CACrCjB,EAAI,MAAA,CAAQ,iBAAA,CAAmB,CAAE,EAAA,CAAIgB,CAAAA,CAAI,GAAI,UAAA,CAAAC,CAAW,CAAC,EAC3D,CAAA,CAEA,qBAAA,CAAwBD,GAAQ,CAC9BhB,CAAAA,CAAI,QAAS,sBAAA,CAAwB,CAAE,GAAIgB,CAAAA,CAAI,EAAG,CAAC,EACrD,CAAA,CAEA,gBAAiB,CAACE,CAAAA,CAAUF,IAAQ,CAClChB,CAAAA,CAAI,QAAS,gBAAA,CAAkB,CAAE,QAAA,CAAAkB,CAAAA,CAAU,aAAA,CAAeF,CAAAA,CAAI,EAAG,CAAC,EACpE,EAEA,kBAAA,CAAoB,CAACE,EAAUF,CAAAA,CAAKG,CAAAA,GAAa,CAC/CnB,CAAAA,CAAI,MAAA,CAAQ,mBAAA,CAAqB,CAC/B,QAAA,CAAAkB,CAAAA,CACA,cAAeF,CAAAA,CAAI,EAAA,CACnB,SAAAG,CACF,CAAC,EACH,CAAA,CAEA,eAAA,CAAiB,CAACD,EAAUF,CAAAA,CAAKD,CAAAA,GAAU,CACzCf,CAAAA,CAAI,OAAA,CAAS,iBAAkB,CAC7B,QAAA,CAAAkB,CAAAA,CACA,aAAA,CAAeF,CAAAA,CAAI,EAAA,CACnB,MAAAD,CACF,CAAC,EACH,CAAA,CAEA,eAAA,CAAiB,CAACG,CAAAA,CAAUF,CAAAA,CAAKI,CAAAA,GAAY,CAC3CpB,CAAAA,CAAI,MAAA,CAAQ,iBAAkB,CAC5B,QAAA,CAAAkB,EACA,aAAA,CAAeF,CAAAA,CAAI,GACnB,OAAA,CAAAI,CACF,CAAC,EACH,CAAA,CAEA,gBAAA,CAAkB,CAACF,CAAAA,CAAUF,CAAAA,GAAQ,CACnChB,CAAAA,CAAI,OAAA,CAAS,kBAAmB,CAAE,QAAA,CAAAkB,CAAAA,CAAU,aAAA,CAAeF,CAAAA,CAAI,EAAG,CAAC,EACrE,CAAA,CAEA,wBAA0Bd,CAAAA,EAAU,CAClCF,EACE,MAAA,CACA,yBAAA,CACAE,EAAM,IAAA,GAAS,SAAA,CACX,CACE,IAAA,CAAMA,CAAAA,CAAM,KACZ,QAAA,CAAUA,CAAAA,CAAM,SAChB,aAAA,CAAeA,CAAAA,CAAM,GAAA,CAAI,EAAA,CACzB,MAAA,CAAQA,CAAAA,CAAM,OACd,OAAA,CAASA,CAAAA,CAAM,OACjB,CAAA,CACA,CACE,KAAMA,CAAAA,CAAM,IAAA,CACZ,QAAA,CAAUA,CAAAA,CAAM,QAAA,CAChB,aAAA,CAAeA,EAAM,GAAA,CAAI,EAAA,CACzB,OAAQA,CAAAA,CAAM,MAAA,CACd,KAAMA,CAAAA,CAAM,IAAA,CACZ,QAAA,CAAUA,CAAAA,CAAM,QAAA,CAChB,MAAA,CAAQA,EAAM,MAChB,CACN,EACF,CAAA,CAEA,WAAA,CAAcM,GAAO,CACnBR,CAAAA,CAAI,OAAA,CAAS,YAAA,CAAc,CAAE,EAAA,CAAAQ,CAAG,CAAC,EACnC,EAEA,aAAA,CAAe,CAACA,EAAIO,CAAAA,GAAU,CAC5Bf,CAAAA,CAAI,OAAA,CAAS,cAAA,CAAgB,CAAE,GAAAQ,CAAAA,CAAI,KAAA,CAAAO,CAAM,CAAC,EAC5C,EAEA,cAAA,CAAgB,CAACP,CAAAA,CAAIa,CAAAA,GAAa,CAChCrB,CAAAA,CAAI,QAAS,eAAA,CAAiB,CAAE,GAAAQ,CAAAA,CAAI,QAAA,CAAAa,CAAS,CAAC,EAChD,CAAA,CAKA,eAAA,CAAiB,CAACb,CAAAA,CAAIa,EAAUC,CAAAA,GAAc,CAC5CtB,EAAI,OAAA,CAAS,gBAAA,CAAkB,CAAE,EAAA,CAAAQ,CAAAA,CAAI,SAAAa,CAAAA,CAAU,SAAA,CAAAC,CAAU,CAAC,EAC5D,EAEA,cAAA,CAAgB,CAACd,EAAIa,CAAAA,GAAa,CAChCrB,CAAAA,CAAI,OAAA,CAAS,eAAA,CAAiB,CAAE,GAAAQ,CAAAA,CAAI,QAAA,CAAAa,CAAS,CAAC,EAChD,EAEA,aAAA,CAAe,CAACb,CAAAA,CAAIa,CAAAA,CAAUE,CAAAA,CAAOR,CAAAA,GAAU,CAC7Cf,CAAAA,CAAI,OAAA,CAAS,eAAgB,CAAE,EAAA,CAAAQ,EAAI,QAAA,CAAAa,CAAAA,CAAU,KAAA,CAAAE,CAAAA,CAAO,KAAA,CAAAR,CAAM,CAAC,EAC7D,CAAA,CAEA,WAAaS,CAAAA,EAAa,CACxBxB,EAAI,OAAA,CAAS,qBAAA,CAAuB,CAClC,EAAA,CAAIwB,CAAAA,CAAS,EAAA,CACb,QAASA,CAAAA,CAAS,OACpB,CAAC,EACH,CAAA,CAEA,kBAAmB,CAACC,CAAAA,CAAMC,CAAAA,GAAO,CAC/B1B,CAAAA,CAAI,MAAA,CAAQ,kBAAmB,CAAE,IAAA,CAAAyB,EAAM,EAAA,CAAAC,CAAG,CAAC,EAC7C,CAAA,CAEA,OAAA,CAAUX,CAAAA,EAAU,CAClBf,CAAAA,CAAI,QAAS,OAAA,CAAS,CACpB,OAAQe,CAAAA,CAAM,MAAA,CACd,SAAUA,CAAAA,CAAM,QAAA,CAChB,OAAA,CAASA,CAAAA,CAAM,OACjB,CAAC,EACH,CAAA,CAEA,eAAA,CAAiB,CAACA,CAAAA,CAAOY,CAAAA,GAAa,CACpC3B,CAAAA,CAAI,MAAA,CAAQ,iBAAkB,CAC5B,MAAA,CAAQe,EAAM,MAAA,CACd,QAAA,CAAUA,EAAM,QAAA,CAChB,QAAA,CAAAY,CACF,CAAC,EACH,CAAA,CAEA,oBAAA,CAAsB,CAACC,CAAAA,CAAMpB,IAAO,CAClCR,CAAAA,CAAI,OAAQ,qBAAA,CAAuB,CAAE,KAAA4B,CAAAA,CAAM,EAAA,CAAApB,CAAG,CAAC,EACjD,CAAA,CAEA,mBAAoB,CAACoB,CAAAA,CAAMpB,IAAO,CAChCR,CAAAA,CAAI,OAAQ,mBAAA,CAAqB,CAAE,IAAA,CAAA4B,CAAAA,CAAM,EAAA,CAAApB,CAAG,CAAC,EAC/C,CAAA,CAEA,uBAAwB,CAACoB,CAAAA,CAAMpB,IAAO,CACpCR,CAAAA,CAAI,MAAA,CAAQ,uBAAA,CAAyB,CAAE,IAAA,CAAA4B,EAAM,EAAA,CAAApB,CAAG,CAAC,EACnD,CAAA,CAEA,iBAAkB,CAACoB,CAAAA,CAAMpB,CAAAA,CAAIqB,CAAAA,GAAU,CACrC7B,CAAAA,CAAI,QAAS,iBAAA,CAAmB,CAAE,KAAA4B,CAAAA,CAAM,EAAA,CAAApB,EAAI,KAAA,CAAAqB,CAAM,CAAC,EACrD,CAAA,CAEA,eAAA,CAAkBC,GAAU,CAC1B9B,CAAAA,CAAI,QAAS,gBAAA,CAAkB,CAC7B,GAAI8B,CAAAA,CAAM,EAAA,CACV,MAAA,CAAQA,CAAAA,CAAM,MAAA,CACd,QAAA,CAAUA,EAAM,QAAA,CAChB,WAAA,CAAaA,EAAM,WAAA,CAAY,MAAA,CAC/B,sBAAuBA,CAAAA,CAAM,qBAAA,CAAsB,OACnD,cAAA,CAAgBA,CAAAA,CAAM,eAAe,MAAA,CACrC,gBAAA,CAAkBA,EAAM,gBAAA,CAAiB,MAAA,CACzC,WAAYA,CAAAA,CAAM,UAAA,CAAW,MAC/B,CAAC,EACH,CACF,CACF,CCtQO,IAAMC,GAAN,KAAwB,CAK7B,YAAoBC,CAAAA,CAAkB,CAAlB,IAAA,CAAA,QAAA,CAAAA,CAAAA,CAClB,IAAA,CAAK,GAAA,CAAM,IAAI,KAAA,CAAMA,CAAQ,EAC/B,CANQ,GAAA,CACA,KAAO,CAAA,CACP,KAAA,CAAQ,CAAA,CAMhB,IAAI,IAAA,EAAO,CACT,OAAO,IAAA,CAAK,KACd,CAEA,IAAA,CAAKC,CAAAA,CAAS,CACZ,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,CAAIA,CAAAA,CACtB,KAAK,IAAA,CAAA,CAAQ,IAAA,CAAK,KAAO,CAAA,EAAK,IAAA,CAAK,SAC/B,IAAA,CAAK,KAAA,CAAQ,IAAA,CAAK,QAAA,EACpB,IAAA,CAAK,KAAA,GAET,CAEA,OAAA,EAAe,CACb,OAAI,IAAA,CAAK,KAAA,GAAU,EACV,EAAC,CAEN,IAAA,CAAK,KAAA,CAAQ,IAAA,CAAK,QAAA,CACb,KAAK,GAAA,CAAI,KAAA,CAAM,EAAG,IAAA,CAAK,KAAK,EAG9B,CACL,GAAI,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,CAC5B,GAAI,KAAK,GAAA,CAAI,KAAA,CAAM,EAAG,IAAA,CAAK,IAAI,CACjC,CACF,CAEA,OAAQ,CACN,IAAA,CAAK,IAAM,IAAI,KAAA,CAAM,KAAK,QAAQ,CAAA,CAClC,IAAA,CAAK,IAAA,CAAO,CAAA,CACZ,IAAA,CAAK,MAAQ,EACf,CACF,EA8CO,SAASC,EAAAA,EAAqB,CACnC,GAAI,CACF,GACE,OAAO,OAAA,CAAY,GAAA,EACnB,QAAQ,GAAA,EAAK,QAAA,GAAa,aAE1B,OAAO,CAAA,CAEX,MAAQ,CAER,CACA,GAAI,CACF,GACE,OAAO,uQAAgB,GAAA,EAEvB,WAAiB,IAAA,GAAS,YAAA,CAE1B,OAAO,CAAA,CAEX,CAAA,KAAQ,CAER,CACA,OAAO,KACT,CAGO,SAASC,EAAAA,CAAY9B,EAAwB,CAClD,GAAI,CACF,GAAIA,CAAAA,GAAU,KAAA,CAAA,CACZ,OAAO,WAAA,CAET,GAAIA,IAAU,IAAA,CACZ,OAAO,OAET,GAAI,OAAOA,GAAU,QAAA,CACnB,OAAO,CAAA,EAAG,MAAA,CAAOA,CAAK,CAAC,IAEzB,GAAI,OAAOA,GAAU,QAAA,CACnB,OAAO,OAAOA,CAAK,CAAA,CAErB,GAAI,OAAOA,CAAAA,EAAU,QAAA,CAAU,CAC7B,IAAM+B,CAAAA,CAAM,KAAK,SAAA,CAAU/B,CAAAA,CAAO,CAACgC,CAAAA,CAAIC,CAAAA,GACjC,OAAOA,CAAAA,EAAM,QAAA,CACR,GAAG,MAAA,CAAOA,CAAC,CAAC,CAAA,CAAA,CAAA,CAEjB,OAAOA,GAAM,QAAA,CACR,MAAA,CAAOA,CAAC,CAAA,CAGVA,CACR,CAAA,CAED,OAAOF,CAAAA,CAAI,MAAA,CAAS,IAAM,CAAA,EAAGA,CAAAA,CAAI,MAAM,CAAA,CAAG,GAAG,CAAC,CAAA,GAAA,CAAA,CAAQA,CACxD,CAEA,OAAO,MAAA,CAAO/B,CAAK,CACrB,CAAA,KAAQ,CACN,OAAO,SACT,CACF,CAGO,SAASkC,EAAAA,CAASH,CAAAA,CAAaI,EAAqB,CACzD,OAAIJ,EAAI,MAAA,EAAUI,CAAAA,CACTJ,EAGF,CAAA,EAAGA,CAAAA,CAAI,KAAA,CAAM,CAAA,CAAGI,CAAAA,CAAM,CAAC,CAAC,CAAA,GAAA,CACjC,CAGO,SAASC,EAAAA,CAAYC,CAAAA,CAA8B,CACxD,GAAI,CACF,OAAOA,CAAAA,CAAO,OAAA,EAChB,MAAQ,CACN,OAAO,IACT,CACF,CAGO,SAASC,EAAAA,CAAaC,CAAAA,CAAwB,CACnD,GAAI,CACF,OAAIA,GAAS,IAAA,EAA8B,OAAOA,GAAS,QAAA,CAClDA,CAAAA,CAGF,KAAK,KAAA,CAAM,IAAA,CAAK,SAAA,CAAUA,CAAI,CAAC,CACxC,MAAQ,CACN,OAAO,IACT,CACF,CAGO,SAASC,EAAAA,CAAkBxC,CAAAA,CAAmC,CACnE,OAAIA,CAAAA,GAAU,OACL,GAAA,CAEL,CAAC,OAAO,QAAA,CAASA,CAAK,GAAKA,CAAAA,CAAQ,CAAA,EACjC6B,EAAAA,EAAU,EACZ,OAAA,CAAQ,IAAA,CACN,iDAAiD7B,CAAK,CAAA,qBAAA,CACxD,EAGK,GAAA,EAGF,IAAA,CAAK,MAAMA,CAAK,CACzB,CAmBO,SAASyC,EAAAA,EAAiC,CAC/C,OAAO,CACL,cAAA,CAAgB,EAChB,gBAAA,CAAkB,CAAA,CAClB,cAAe,IAAI,GAAA,CACnB,cAAA,CAAgB,CAAA,CAChB,gBAAA,CAAkB,CAAA,CAClB,qBAAsB,CACxB,CACF,CAMO,IAAMC,EAAAA,CAAuB,IACvBC,EAAAA,CAAiB,GAAA,CACjBC,EAAAA,CAAiB,EAAA,CACjBC,EAAAA,CAAmB,EAAA,CACnBC,GAAqB,CAAA,CACrBC,EAAAA,CAAkB,CAC7B,SAAA,CACA,SAAA,CACA,UACA,SAAA,CACA,SAAA,CACA,SACF,CAAA,CAgBO,SAASC,EAAAA,EAAqC,CACnD,OAAO,CACL,QAAS,IAAItB,EAAAA,CAA8BgB,EAAoB,CAAA,CAC/D,QAAA,CAAU,IAAI,GAChB,CACF,CAsBO,SAASO,EAAAA,EAA2B,CACzC,OAAO,CACL,cAAA,CAAgB,IAAI,GAAA,CACpB,iBAAA,CAAmB,IAAI,GAAA,CACvB,oBAAA,CAAsB,IAAI,IAC1B,2BAAA,CAA6B,IAAI,IACjC,yBAAA,CAA2B,IAAI,IAC/B,cAAA,CAAgB,IAClB,CACF,CAOO,IAAMC,GAAsB,GAAA,CACtBC,EAAAA,CAAyB,IAS/B,SAASC,EAAAA,EAAuC,CACrD,OAAO,CACL,WAAA,CAAa,KAAA,CACb,cAAA,CAAgB,GAChB,SAAA,CAAW,EACb,CACF,CAMO,IAAMC,EAAAA,CAAmB,EAAA,CACnBC,EAAAA,CAAqB,GAAA,CAGrBC,CAAAA,CAAI,CACf,GAAI,SAAA,CACJ,IAAA,CAAM,UACN,MAAA,CAAQ,SAAA,CACR,MAAO,SAAA,CACP,MAAA,CAAQ,MAAA,CACR,SAAA,CAAW,SAAA,CACX,KAAA,CAAO,UACP,MAAA,CAAQ,SAAA,CACR,IAAK,SAAA,CACL,QAAA,CAAU,OACV,IAAA,CAAM,kEACR,CAAA,CAGaC,CAAAA,CAAO,CAClB,KAAA,CAAO,GACP,KAAA,CAAO,EAAA,CACP,QAAS,CAAA,CACT,MAAA,CAAQ,GAER,MAAA,CAAQ,EAAA,CACR,QAAA,CAAU,EAAA,CACV,cAAe,EACjB,CAAA,CC1WO,SAASC,EAAAA,CACdC,CAAAA,CACAC,EACAC,CAAAA,CACAC,CAAAA,CAMA,CACA,IAAIC,CAAAA,CAAY,KAAA,CACVC,EAAoC,CACxC,QAAA,CAAU,QACV,MAAA,CAAQ,OAAA,CACR,GAAIJ,CAAAA,CAAS,QAAA,CAAS,QAAQ,CAAA,CAAI,CAAE,MAAA,CAAQ,MAAO,CAAA,CAAI,CAAE,IAAK,MAAO,CAAA,CACrE,GAAIA,CAAAA,CAAS,QAAA,CAAS,OAAO,CAAA,CAAI,CAAE,MAAO,MAAO,CAAA,CAAI,CAAE,IAAA,CAAM,MAAO,CACtE,CAAA,CAGMK,CAAAA,CAAU,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA,CAC9CA,EAAQ,WAAA,CAAc,CAAA,kEAAA,EAAqET,EAAE,MAAM,CAAA,uGAAA,EAA0GA,EAAE,MAAM,CAAA,oBAAA,CAAA,CACrN,QAAA,CAAS,IAAA,CAAK,WAAA,CAAYS,CAAO,EAGjC,IAAMC,CAAAA,CAAY,SAAS,aAAA,CAAc,QAAQ,EACjDA,CAAAA,CAAU,YAAA,CAAa,YAAA,CAAc,yBAAyB,CAAA,CAC9DA,CAAAA,CAAU,aAAa,eAAA,CAAiB,MAAA,CAAOL,CAAW,CAAC,CAAA,CAC3DK,EAAU,KAAA,CAAQ,wBAAA,CAClB,MAAA,CAAO,MAAA,CAAOA,CAAAA,CAAU,KAAA,CAAO,CAC7B,GAAGF,CAAAA,CACH,WAAYR,CAAAA,CAAE,EAAA,CACd,MAAOA,CAAAA,CAAE,IAAA,CACT,MAAA,CAAQ,CAAA,UAAA,EAAaA,CAAAA,CAAE,MAAM,GAC7B,YAAA,CAAc,KAAA,CACd,QAAS,WAAA,CACT,QAAA,CAAU,OACV,SAAA,CAAW,MAAA,CACX,MAAA,CAAQ,SAAA,CACR,UAAA,CAAYA,CAAAA,CAAE,KACd,QAAA,CAAU,MAAA,CACV,QAASK,CAAAA,CAAc,MAAA,CAAS,OAClC,CAAC,CAAA,CACDK,CAAAA,CAAU,WAAA,CAAc,WAAA,CAGxB,IAAMC,EAAY,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA,CAC9CA,CAAAA,CAAU,aAAa,MAAA,CAAQ,QAAQ,EACvCA,CAAAA,CAAU,YAAA,CAAa,aAAc,oBAAoB,CAAA,CACzDA,EAAU,YAAA,CAAa,yBAAA,CAA2B,EAAE,CAAA,CACpDA,CAAAA,CAAU,QAAA,CAAW,EAAA,CACrB,MAAA,CAAO,MAAA,CAAOA,EAAU,KAAA,CAAO,CAC7B,GAAGH,CAAAA,CACH,UAAA,CAAYR,EAAE,EAAA,CACd,KAAA,CAAOA,CAAAA,CAAE,IAAA,CACT,MAAA,CAAQ,CAAA,UAAA,EAAaA,EAAE,MAAM,CAAA,CAAA,CAC7B,aAAc,KAAA,CACd,OAAA,CAAS,OACT,UAAA,CAAYA,CAAAA,CAAE,IAAA,CACd,QAAA,CAAU,MAAA,CACV,QAAA,CAAU,iCACV,SAAA,CAAW,gCAAA,CACX,SAAU,MAAA,CACV,SAAA,CAAW,6BACX,OAAA,CAASK,CAAAA,CAAc,OAAA,CAAU,MACnC,CAAC,CAAA,CAGD,IAAMO,CAAAA,CAAS,QAAA,CAAS,cAAc,KAAK,CAAA,CAC3C,OAAO,MAAA,CAAOA,CAAAA,CAAO,KAAA,CAAO,CAC1B,OAAA,CAAS,MAAA,CACT,eAAgB,eAAA,CAChB,UAAA,CAAY,SACZ,YAAA,CAAc,KAChB,CAAC,CAAA,CACD,IAAMC,CAAAA,CAAU,QAAA,CAAS,aAAA,CAAc,QAAQ,EAC/CA,CAAAA,CAAQ,KAAA,CAAM,MAAQb,CAAAA,CAAE,MAAA,CACxBa,EAAQ,WAAA,CACNV,CAAAA,GAAe,SAAA,CACX,oBAAA,CACA,CAAA,UAAA,EAAaA,CAAU,IAC7B,IAAMW,CAAAA,CAAW,SAAS,aAAA,CAAc,QAAQ,EAChDA,CAAAA,CAAS,YAAA,CAAa,aAAc,gBAAgB,CAAA,CACpD,OAAO,MAAA,CAAOA,CAAAA,CAAS,MAAO,CAC5B,UAAA,CAAY,OACZ,MAAA,CAAQ,MAAA,CACR,KAAA,CAAOd,CAAAA,CAAE,QAAA,CACT,MAAA,CAAQ,UACR,QAAA,CAAU,MAAA,CACV,QAAS,UAAA,CACT,QAAA,CAAU,OACV,SAAA,CAAW,MAAA,CACX,UAAA,CAAY,GAAA,CACZ,OAAA,CAAS,MAAA,CACT,WAAY,QAAA,CACZ,cAAA,CAAgB,QAClB,CAAC,CAAA,CACDc,EAAS,WAAA,CAAc,MAAA,CACvBF,CAAAA,CAAO,WAAA,CAAYC,CAAO,CAAA,CAC1BD,EAAO,WAAA,CAAYE,CAAQ,EAC3BH,CAAAA,CAAU,WAAA,CAAYC,CAAM,CAAA,CAG5B,IAAMG,CAAAA,CAAY,QAAA,CAAS,aAAA,CAAc,KAAK,EAC9CA,CAAAA,CAAU,KAAA,CAAM,aAAe,KAAA,CAC/BA,CAAAA,CAAU,aAAa,WAAA,CAAa,QAAQ,CAAA,CAC5C,IAAMC,CAAAA,CAAW,QAAA,CAAS,cAAc,MAAM,CAAA,CAC9CA,EAAS,KAAA,CAAM,KAAA,CAAQhB,EAAE,KAAA,CACzBgB,CAAAA,CAAS,WAAA,CAAc,SAAA,CACvBD,CAAAA,CAAU,WAAA,CAAYC,CAAQ,CAAA,CAC9BL,CAAAA,CAAU,YAAYI,CAAS,CAAA,CAG/B,IAAME,CAAAA,CAAiB,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA,CACnD,MAAA,CAAO,OAAOA,CAAAA,CAAe,KAAA,CAAO,CAClC,OAAA,CAAS,MAAA,CACT,aAAc,KAAA,CACd,OAAA,CAAS,UACT,UAAA,CAAY,SAAA,CACZ,aAAc,KAAA,CACd,UAAA,CAAY,SACZ,GAAA,CAAK,KACP,CAAC,CAAA,CACD,IAAMC,CAAAA,CAAU,QAAA,CAAS,aAAA,CAAc,QAAQ,EAC/C,MAAA,CAAO,MAAA,CAAOA,EAAQ,KAAA,CAAO,CAC3B,WAAY,MAAA,CACZ,MAAA,CAAQ,CAAA,UAAA,EAAalB,CAAAA,CAAE,MAAM,CAAA,CAAA,CAC7B,MAAOA,CAAAA,CAAE,IAAA,CACT,OAAQ,SAAA,CACR,OAAA,CAAS,WACT,YAAA,CAAc,KAAA,CACd,UAAA,CAAYA,CAAAA,CAAE,IAAA,CACd,QAAA,CAAU,OACV,QAAA,CAAU,MAAA,CACV,UAAW,MACb,CAAC,EACDkB,CAAAA,CAAQ,WAAA,CAAc,aAAA,CACtBA,CAAAA,CAAQ,QAAA,CAAW,IAAA,CACnB,IAAMC,CAAAA,CAAU,QAAA,CAAS,cAAc,QAAQ,CAAA,CAC/C,OAAO,MAAA,CAAOA,CAAAA,CAAQ,KAAA,CAAO,CAC3B,UAAA,CAAY,MAAA,CACZ,OAAQ,CAAA,UAAA,EAAanB,CAAAA,CAAE,MAAM,CAAA,CAAA,CAC7B,KAAA,CAAOA,EAAE,IAAA,CACT,MAAA,CAAQ,SAAA,CACR,OAAA,CAAS,UAAA,CACT,YAAA,CAAc,MACd,UAAA,CAAYA,CAAAA,CAAE,KACd,QAAA,CAAU,MAAA,CACV,SAAU,MAAA,CACV,SAAA,CAAW,MACb,CAAC,CAAA,CACDmB,CAAAA,CAAQ,YAAc,aAAA,CACtBA,CAAAA,CAAQ,SAAW,IAAA,CACnB,IAAMC,EAAe,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA,CAClDA,CAAAA,CAAa,MAAM,KAAA,CAAQpB,CAAAA,CAAE,MAC7BoB,CAAAA,CAAa,KAAA,CAAM,SAAW,MAAA,CAC9BH,CAAAA,CAAe,WAAA,CAAYC,CAAO,CAAA,CAClCD,CAAAA,CAAe,YAAYE,CAAO,CAAA,CAClCF,EAAe,WAAA,CAAYG,CAAY,EACvCT,CAAAA,CAAU,WAAA,CAAYM,CAAc,CAAA,CAGpC,SAASI,CAAAA,CAAmBC,EAAeC,CAAAA,CAAe,CACxD,IAAMC,CAAAA,CAAU,QAAA,CAAS,cAAc,SAAS,CAAA,CAC5CD,CAAAA,GACFC,CAAAA,CAAQ,IAAA,CAAO,IAAA,CAAA,CAEjBA,EAAQ,KAAA,CAAM,YAAA,CAAe,MAC7B,IAAMC,CAAAA,CAAU,SAAS,aAAA,CAAc,SAAS,CAAA,CAChD,MAAA,CAAO,MAAA,CAAOA,CAAAA,CAAQ,MAAO,CAC3B,MAAA,CAAQ,UACR,KAAA,CAAOzB,CAAAA,CAAE,OACT,YAAA,CAAc,KAChB,CAAC,CAAA,CACD,IAAM0B,CAAAA,CAAY,SAAS,aAAA,CAAc,MAAM,EAC/CD,CAAAA,CAAQ,WAAA,CAAc,GAAGH,CAAK,CAAA,EAAA,CAAA,CAC9BG,CAAAA,CAAQ,WAAA,CAAYC,CAAS,CAAA,CAC7BD,EAAQ,WAAA,CAAY,QAAA,CAAS,eAAe,GAAG,CAAC,EAChDC,CAAAA,CAAU,WAAA,CAAc,GAAA,CACxBF,CAAAA,CAAQ,WAAA,CAAYC,CAAO,EAE3B,IAAME,EAAAA,CAAQ,SAAS,aAAA,CAAc,OAAO,EAC5C,MAAA,CAAO,MAAA,CAAOA,GAAM,KAAA,CAAO,CACzB,MAAO,MAAA,CACP,cAAA,CAAgB,WAChB,QAAA,CAAU,MACZ,CAAC,CAAA,CACD,IAAMC,EAAAA,CAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,EACtCC,EAAAA,CAAU,QAAA,CAAS,cAAc,IAAI,CAAA,CAC3C,QAAWC,EAAAA,IAAO,CAAC,KAAA,CAAO,OAAO,CAAA,CAAG,CAClC,IAAMC,EAAAA,CAAK,QAAA,CAAS,cAAc,IAAI,CAAA,CACtCA,GAAG,KAAA,CAAQ,KAAA,CACX,MAAA,CAAO,MAAA,CAAOA,EAAAA,CAAG,KAAA,CAAO,CACtB,SAAA,CAAW,MAAA,CACX,QAAS,SAAA,CACT,KAAA,CAAO/B,EAAE,MACX,CAAC,CAAA,CACD+B,EAAAA,CAAG,WAAA,CAAcD,EAAAA,CACjBD,GAAQ,WAAA,CAAYE,EAAE,EACxB,CACAH,EAAAA,CAAM,YAAYC,EAAO,CAAA,CACzBF,EAAAA,CAAM,WAAA,CAAYC,EAAK,CAAA,CACvB,IAAMI,EAAAA,CAAQ,QAAA,CAAS,cAAc,OAAO,CAAA,CAC5C,OAAAL,EAAAA,CAAM,WAAA,CAAYK,EAAK,CAAA,CACvBR,CAAAA,CAAQ,WAAA,CAAYG,EAAK,CAAA,CAElB,CAAE,QAAAH,CAAAA,CAAS,KAAA,CAAAQ,GAAO,SAAA,CAAAN,CAAU,CACrC,CAGA,SAASO,CAAAA,CAAkBX,EAAeY,CAAAA,CAAe,CACvD,IAAMV,CAAAA,CAAU,QAAA,CAAS,cAAc,SAAS,CAAA,CAChDA,EAAQ,KAAA,CAAM,YAAA,CAAe,MAC7B,IAAMC,CAAAA,CAAU,SAAS,aAAA,CAAc,SAAS,EAChD,MAAA,CAAO,MAAA,CAAOA,CAAAA,CAAQ,KAAA,CAAO,CAC3B,MAAA,CAAQ,UACR,KAAA,CAAAS,CAAAA,CACA,aAAc,KAChB,CAAC,EACD,IAAMR,CAAAA,CAAY,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA,CAC/CD,EAAQ,WAAA,CAAc,CAAA,EAAGH,CAAK,CAAA,EAAA,CAAA,CAC9BG,CAAAA,CAAQ,YAAYC,CAAS,CAAA,CAC7BD,CAAAA,CAAQ,WAAA,CAAY,QAAA,CAAS,cAAA,CAAe,GAAG,CAAC,CAAA,CAChDC,EAAU,WAAA,CAAc,GAAA,CACxBF,EAAQ,WAAA,CAAYC,CAAO,CAAA,CAC3B,IAAMU,EAAAA,CAAO,QAAA,CAAS,cAAc,IAAI,CAAA,CACxC,cAAO,MAAA,CAAOA,EAAAA,CAAK,MAAO,CAAE,MAAA,CAAQ,GAAA,CAAK,WAAA,CAAa,MAAO,CAAC,EAC9DX,CAAAA,CAAQ,WAAA,CAAYW,EAAI,CAAA,CAEjB,CAAE,QAAAX,CAAAA,CAAS,IAAA,CAAAW,EAAAA,CAAM,SAAA,CAAAT,CAAU,CACpC,CAGA,IAAMU,CAAAA,CAAef,EAAmB,OAAA,CAAS,IAAI,EACrDV,CAAAA,CAAU,WAAA,CAAYyB,CAAAA,CAAa,OAAO,CAAA,CAG1C,IAAMC,EAAehB,CAAAA,CAAmB,aAAA,CAAe,KAAK,CAAA,CAC5DV,CAAAA,CAAU,YAAY0B,CAAAA,CAAa,OAAO,EAG1C,IAAMC,CAAAA,CAAkBL,EAAkB,UAAA,CAAYjC,CAAAA,CAAE,MAAM,CAAA,CAC9DW,CAAAA,CAAU,YAAY2B,CAAAA,CAAgB,OAAO,CAAA,CAG7C,IAAMC,CAAAA,CAAeN,CAAAA,CAAkB,QAASjC,CAAAA,CAAE,GAAG,EACrDW,CAAAA,CAAU,WAAA,CAAY4B,EAAa,OAAO,CAAA,CAG1C,IAAMC,CAAAA,CAAc,QAAA,CAAS,aAAA,CAAc,SAAS,CAAA,CACpDA,CAAAA,CAAY,MAAM,YAAA,CAAe,KAAA,CACjC,IAAMC,CAAAA,CAAc,QAAA,CAAS,aAAA,CAAc,SAAS,CAAA,CACpD,MAAA,CAAO,OAAOA,CAAAA,CAAY,KAAA,CAAO,CAC/B,MAAA,CAAQ,SAAA,CACR,MAAOzC,CAAAA,CAAE,MAAA,CACT,YAAA,CAAc,KAChB,CAAC,CAAA,CACDyC,EAAY,WAAA,CAAc,aAAA,CAC1BD,EAAY,WAAA,CAAYC,CAAW,EACnC,IAAMC,CAAAA,CAAW,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA,CAC7CA,EAAS,KAAA,CAAM,QAAA,CAAW,OAC1BA,CAAAA,CAAS,KAAA,CAAM,MAAQ1C,CAAAA,CAAE,KAAA,CACzB0C,CAAAA,CAAS,WAAA,CAAc,aAAA,CACvBF,CAAAA,CAAY,YAAYE,CAAQ,CAAA,CAChC/B,EAAU,WAAA,CAAY6B,CAAW,EAGjC,IAAMG,CAAAA,CAAc,QAAA,CAAS,aAAA,CAAc,SAAS,CAAA,CACpDA,EAAY,KAAA,CAAM,YAAA,CAAe,MACjC,IAAMC,CAAAA,CAAc,SAAS,aAAA,CAAc,SAAS,EACpD,MAAA,CAAO,MAAA,CAAOA,EAAY,KAAA,CAAO,CAC/B,OAAQ,SAAA,CACR,KAAA,CAAO5C,EAAE,MAAA,CACT,YAAA,CAAc,KAChB,CAAC,CAAA,CACD4C,CAAAA,CAAY,YAAc,kBAAA,CAC1BD,CAAAA,CAAY,YAAYC,CAAW,CAAA,CACnC,IAAMC,CAAAA,CAAU,QAAA,CAAS,eAAA,CAAgB,4BAAA,CAA8B,KAAK,CAAA,CAC5EA,EAAQ,YAAA,CAAa,OAAA,CAAS,MAAM,CAAA,CACpCA,CAAAA,CAAQ,aAAa,QAAA,CAAU,KAAK,CAAA,CACpCA,CAAAA,CAAQ,YAAA,CAAa,MAAA,CAAQ,KAAK,CAAA,CAClCA,CAAAA,CAAQ,aAAa,YAAA,CAAc,yBAAyB,EAC5DA,CAAAA,CAAQ,KAAA,CAAM,OAAA,CAAU,OAAA,CAExBA,CAAAA,CAAQ,YAAA,CAAa,UAAW,aAAa,CAAA,CAC7CA,EAAQ,YAAA,CAAa,qBAAA,CAAuB,eAAe,CAAA,CAC3DF,CAAAA,CAAY,WAAA,CAAYE,CAAO,CAAA,CAC/BlC,CAAAA,CAAU,YAAYgC,CAAW,CAAA,CAGjC,IAAMG,CAAAA,CAAkB,QAAA,CAAS,cAAc,SAAS,CAAA,CACxDA,CAAAA,CAAgB,KAAA,CAAM,YAAA,CAAe,KAAA,CACrC,IAAMC,CAAAA,CAAkB,QAAA,CAAS,cAAc,SAAS,CAAA,CACxD,OAAO,MAAA,CAAOA,CAAAA,CAAgB,KAAA,CAAO,CACnC,MAAA,CAAQ,SAAA,CACR,MAAO/C,CAAAA,CAAE,MAAA,CACT,aAAc,KAChB,CAAC,EACD+C,CAAAA,CAAgB,WAAA,CAAc,WAC9BD,CAAAA,CAAgB,WAAA,CAAYC,CAAe,CAAA,CAC3C,IAAMC,EAAc,QAAA,CAAS,eAAA,CAC3B,6BACA,KACF,CAAA,CACAA,CAAAA,CAAY,YAAA,CAAa,OAAA,CAAS,MAAM,EACxCA,CAAAA,CAAY,YAAA,CAAa,SAAU,IAAI,CAAA,CACvCA,EAAY,YAAA,CAAa,MAAA,CAAQ,KAAK,CAAA,CACtCA,CAAAA,CAAY,YAAA,CAAa,aAAc,6BAA6B,CAAA,CACpEA,EAAY,KAAA,CAAM,OAAA,CAAU,QAC5BA,CAAAA,CAAY,YAAA,CAAa,SAAA,CAAW,CAAA,IAAA,EAAO5D,EAAc,CAAA,GAAA,CAAK,EAC9D4D,CAAAA,CAAY,YAAA,CAAa,sBAAuB,eAAe,CAAA,CAC/D,IAAMC,CAAAA,CAAgB,QAAA,CAAS,eAAA,CAC7B,4BAAA,CACA,MACF,CAAA,CACAA,EAAc,YAAA,CAAa,GAAA,CAAK,OAAO7D,EAAAA,CAAiB,CAAC,CAAC,CAAA,CAC1D6D,CAAAA,CAAc,YAAA,CAAa,GAAA,CAAK,IAAI,CAAA,CACpCA,EAAc,YAAA,CAAa,aAAA,CAAe,QAAQ,CAAA,CAClDA,CAAAA,CAAc,aAAa,MAAA,CAAQjD,CAAAA,CAAE,KAAK,CAAA,CAC1CiD,CAAAA,CAAc,YAAA,CAAa,YAAa,IAAI,CAAA,CAC5CA,EAAc,YAAA,CAAa,aAAA,CAAejD,EAAE,IAAI,CAAA,CAChDiD,CAAAA,CAAc,WAAA,CAAc,0BAAA,CAC5BD,CAAAA,CAAY,YAAYC,CAAa,CAAA,CACrCH,EAAgB,WAAA,CAAYE,CAAW,EACvCrC,CAAAA,CAAU,WAAA,CAAYmC,CAAe,CAAA,CAGrC,IAAMI,GAA0B,IAAM,CACpC,IAAM1B,CAAAA,CAAU,QAAA,CAAS,cAAc,SAAS,CAAA,CAChDA,CAAAA,CAAQ,KAAA,CAAM,YAAA,CAAe,KAAA,CAC7B,IAAMC,CAAAA,CAAU,QAAA,CAAS,cAAc,SAAS,CAAA,CAChD,OAAO,MAAA,CAAOA,CAAAA,CAAQ,KAAA,CAAO,CAC3B,MAAA,CAAQ,SAAA,CACR,MAAOzB,CAAAA,CAAE,MAAA,CACT,aAAc,KAChB,CAAC,EACD,IAAM0B,CAAAA,CAAY,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA,CAC/CA,EAAU,WAAA,CAAc,GAAA,CACxBD,EAAQ,WAAA,CAAc,eAAA,CACtBA,EAAQ,WAAA,CAAYC,CAAS,CAAA,CAC7BD,CAAAA,CAAQ,WAAA,CAAY,QAAA,CAAS,eAAe,GAAG,CAAC,EAChDD,CAAAA,CAAQ,WAAA,CAAYC,CAAO,CAAA,CAC3B,IAAM0B,CAAAA,CAAO,QAAA,CAAS,aAAA,CAAc,KAAK,EACzC,MAAA,CAAO,MAAA,CAAOA,EAAK,KAAA,CAAO,CAAE,SAAU,MAAO,CAAC,CAAA,CAE9C,IAAMC,CAAAA,CAAQ,QAAA,CAAS,cAAc,KAAK,CAAA,CAC1C,OAAAA,CAAAA,CAAM,KAAA,CAAM,MAAQpD,CAAAA,CAAE,KAAA,CACtBoD,CAAAA,CAAM,KAAA,CAAM,OAAA,CAAU,KAAA,CACtBA,EAAM,KAAA,CAAM,SAAA,CAAY,SACxBA,CAAAA,CAAM,WAAA,CAAc,qCACpBA,CAAAA,CAAM,SAAA,CAAY,uBAClBD,CAAAA,CAAK,WAAA,CAAYC,CAAK,CAAA,CACtB5B,CAAAA,CAAQ,YAAY2B,CAAI,CAAA,CACxBxC,EAAU,WAAA,CAAYa,CAAO,CAAA,CAEtB,CAAE,OAAA,CAAAA,CAAAA,CAAS,KAAA2B,CAAAA,CAAM,SAAA,CAAAzB,CAAU,CACpC,CAAA,IAGI2B,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CAEJ,GAAIlD,CAAAA,CAAY,CACd,IAAMmD,CAAAA,CAAY,SAAS,aAAA,CAAc,SAAS,EAClDA,CAAAA,CAAU,KAAA,CAAM,YAAA,CAAe,KAAA,CAC/B,IAAMC,CAAAA,CAAY,SAAS,aAAA,CAAc,SAAS,EAClD,MAAA,CAAO,MAAA,CAAOA,EAAU,KAAA,CAAO,CAC7B,MAAA,CAAQ,SAAA,CACR,KAAA,CAAO1D,CAAAA,CAAE,OACT,YAAA,CAAc,KAChB,CAAC,CAAA,CACDuD,CAAAA,CAAc,SAAS,aAAA,CAAc,MAAM,CAAA,CAC3CA,CAAAA,CAAY,WAAA,CAAc,GAAA,CAC1BG,EAAU,WAAA,CAAc,UAAA,CACxBA,EAAU,WAAA,CAAYH,CAAW,EACjCG,CAAAA,CAAU,WAAA,CAAY,QAAA,CAAS,cAAA,CAAe,GAAG,CAAC,EAClDD,CAAAA,CAAU,WAAA,CAAYC,CAAS,CAAA,CAC/BJ,CAAAA,CAAa,SAAS,aAAA,CAAc,KAAK,CAAA,CACzC,MAAA,CAAO,MAAA,CAAOA,CAAAA,CAAW,MAAO,CAC9B,SAAA,CAAW,QACX,QAAA,CAAU,MAAA,CACV,SAAU,MACZ,CAAC,EACDA,CAAAA,CAAW,YAAA,CAAa,OAAQ,KAAK,CAAA,CACrCA,EAAW,YAAA,CAAa,WAAA,CAAa,QAAQ,CAAA,CAC7CA,CAAAA,CAAW,QAAA,CAAW,CAAA,CAEtB,IAAMK,CAAAA,CAAa,SAAS,aAAA,CAAc,KAAK,EAC/CA,CAAAA,CAAW,KAAA,CAAM,MAAQ3D,CAAAA,CAAE,KAAA,CAC3B2D,CAAAA,CAAW,KAAA,CAAM,OAAA,CAAU,KAAA,CAC3BA,EAAW,WAAA,CAAc,uBAAA,CACzBA,EAAW,SAAA,CAAY,iBAAA,CACvBL,EAAW,WAAA,CAAYK,CAAU,CAAA,CACjCF,CAAAA,CAAU,WAAA,CAAYH,CAAU,EAChC3C,CAAAA,CAAU,WAAA,CAAY8C,CAAS,CAAA,CAC/BJ,CAAAA,CAAgBI,EAChBD,CAAAA,CAAY,QAAA,CAAS,aAAA,CAAc,KAAK,EAC1C,CAAA,KACEH,EAAgB,QAAA,CAAS,aAAA,CAAc,SAAS,CAAA,CAChDC,CAAAA,CAAa,SAAS,aAAA,CAAc,KAAK,CAAA,CACzCC,CAAAA,CAAc,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA,CAE3CC,CAAAA,CAAY,SAAS,aAAA,CAAc,KAAK,EACxCA,CAAAA,CAAU,KAAA,CAAM,QAAA,CAAW,MAAA,CAC3BA,CAAAA,CAAU,KAAA,CAAM,MAAQxD,CAAAA,CAAE,KAAA,CAC1BwD,EAAU,KAAA,CAAM,SAAA,CAAY,MAC5BA,CAAAA,CAAU,KAAA,CAAM,SAAA,CAAY,QAAA,CAC5BA,CAAAA,CAAU,WAAA,CAAc,mCACxB7C,CAAAA,CAAU,WAAA,CAAY6C,CAAS,CAAA,CAIjC,IAAMI,EAAY,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA,CAC9C,MAAA,CAAO,OAAOA,CAAAA,CAAU,KAAA,CAAO,CAC7B,OAAA,CAAS,MAAA,CACT,IAAK,KAAA,CACL,SAAA,CAAW,KACb,CAAC,CAAA,CACD,IAAMC,EAAY,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA,CACjD,MAAA,CAAO,OAAOA,CAAAA,CAAU,KAAA,CAAO,CAC7B,UAAA,CAAY,MAAA,CACZ,MAAA,CAAQ,aAAa7D,CAAAA,CAAE,MAAM,GAC7B,KAAA,CAAOA,CAAAA,CAAE,KACT,MAAA,CAAQ,SAAA,CACR,OAAA,CAAS,UAAA,CACT,YAAA,CAAc,KAAA,CACd,WAAYA,CAAAA,CAAE,IAAA,CACd,SAAU,MAAA,CACV,QAAA,CAAU,OACV,SAAA,CAAW,MACb,CAAC,CAAA,CACD6D,CAAAA,CAAU,WAAA,CAAc,gBACxB,IAAMC,CAAAA,CAAY,SAAS,aAAA,CAAc,QAAQ,EACjD,MAAA,CAAO,MAAA,CAAOA,CAAAA,CAAU,KAAA,CAAO,CAC7B,UAAA,CAAY,OACZ,MAAA,CAAQ,CAAA,UAAA,EAAa9D,EAAE,MAAM,CAAA,CAAA,CAC7B,MAAOA,CAAAA,CAAE,IAAA,CACT,MAAA,CAAQ,SAAA,CACR,OAAA,CAAS,UAAA,CACT,aAAc,KAAA,CACd,UAAA,CAAYA,EAAE,IAAA,CACd,QAAA,CAAU,OACV,QAAA,CAAU,MAAA,CACV,SAAA,CAAW,MACb,CAAC,CAAA,CACD8D,EAAU,WAAA,CAAc,eAAA,CACxBF,EAAU,WAAA,CAAYC,CAAS,EAC/BD,CAAAA,CAAU,WAAA,CAAYE,CAAS,CAAA,CAC/BnD,CAAAA,CAAU,YAAYiD,CAAS,CAAA,CAG/BjD,EAAU,gBAAA,CACR,OAAA,CACCoD,GAAkB,CACjB,IAAMC,CAAAA,CAAKrD,CAAAA,CACLsD,CAAAA,CAAQD,CAAAA,CAAG,YAAc,CAAA,EAAKD,CAAAA,CAAE,OAAS,CAAA,CACzCG,CAAAA,CACJF,EAAG,SAAA,CAAYA,CAAAA,CAAG,YAAA,EAAgBA,CAAAA,CAAG,YAAA,EAAgBD,CAAAA,CAAE,OAAS,CAAA,CAAA,CAC9DE,CAAAA,EAASC,IACXH,CAAAA,CAAE,cAAA,GAEN,CAAA,CACA,CAAE,OAAA,CAAS,KAAM,CACnB,CAAA,CAGA,IAAII,CAAAA,CAAY9D,CAAAA,CACV+D,EAAc,IAAI,GAAA,CAExB,SAAS7C,CAAAA,EAAO,CACd4C,CAAAA,CAAY,IAAA,CACZxD,CAAAA,CAAU,KAAA,CAAM,QAAU,OAAA,CAC1BD,CAAAA,CAAU,MAAM,OAAA,CAAU,MAAA,CAC1BA,EAAU,YAAA,CAAa,eAAA,CAAiB,MAAM,CAAA,CAC9CI,CAAAA,CAAS,KAAA,GACX,CAEA,SAASuD,GAAQ,CACfF,CAAAA,CAAY,MACZxD,CAAAA,CAAU,KAAA,CAAM,OAAA,CAAU,MAAA,CAC1BD,CAAAA,CAAU,KAAA,CAAM,QAAU,OAAA,CAC1BA,CAAAA,CAAU,aAAa,eAAA,CAAiB,OAAO,EAC/CA,CAAAA,CAAU,KAAA,GACZ,CAEAA,CAAAA,CAAU,gBAAA,CAAiB,QAASa,CAAI,CAAA,CACxCT,EAAS,gBAAA,CAAiB,OAAA,CAASuD,CAAK,CAAA,CAExC,SAASC,EAAUP,CAAAA,CAAkB,CAC/BA,EAAE,GAAA,GAAQ,QAAA,EAAYI,GACxBE,CAAAA,GAEJ,CACA1D,CAAAA,CAAU,gBAAA,CAAiB,SAAA,CAAW2D,CAAS,CAAA,CAG/C,SAASC,GAAgBR,CAAAA,CAAkB,CACrCA,EAAE,GAAA,GAAQ,GAAA,EAAOA,EAAE,QAAA,GAAaA,CAAAA,CAAE,OAAA,EAAWA,CAAAA,CAAE,OAAA,CAAA,GACjDA,CAAAA,CAAE,gBAAe,CACbI,CAAAA,CACFE,GAAM,CAEN9C,CAAAA,IAGN,CACA,QAAA,CAAS,gBAAA,CAAiB,SAAA,CAAWgD,EAAe,CAAA,CAGpD,SAASC,EAAAA,EAAQ,CACXjE,IAGJ,QAAA,CAAS,IAAA,CAAK,YAAYG,CAAS,CAAA,CACnC,QAAA,CAAS,IAAA,CAAK,WAAA,CAAYC,CAAS,GACrC,CAEI,QAAA,CAAS,KACX6D,EAAAA,EAAM,CAGN,SAAS,gBAAA,CAAiB,kBAAA,CAAoBA,EAAAA,CAAO,CAAE,IAAA,CAAM,IAAK,CAAC,CAAA,CAGrE,SAASC,IAAU,CACjBlE,CAAAA,CAAY,KACZG,CAAAA,CAAU,mBAAA,CAAoB,OAAA,CAASa,CAAI,CAAA,CAC3CT,CAAAA,CAAS,oBAAoB,OAAA,CAASuD,CAAK,EAC3C1D,CAAAA,CAAU,mBAAA,CAAoB,UAAW2D,CAAS,CAAA,CAClD,QAAA,CAAS,mBAAA,CAAoB,SAAA,CAAWC,EAAe,EAEvD,QAAA,CAAS,mBAAA,CAAoB,mBAAoBC,EAAK,CAAA,CACtD,QAAW5H,CAAAA,IAAMwH,CAAAA,CACf,aAAaxH,CAAE,CAAA,CAEjBwH,EAAY,KAAA,EAAM,CAClB1D,EAAU,MAAA,EAAO,CACjBC,EAAU,MAAA,EAAO,CACjBF,CAAAA,CAAQ,MAAA,GACV,CAEA,OAAO,CACL,IAAA,CAAM,CACJ,SAAA,CAAAE,CAAAA,CACA,UAAAD,CAAAA,CACA,OAAA,CAAAG,CAAAA,CACA,QAAA,CAAAG,CAAAA,CACA,SAAA,CAAWoB,EAAa,KAAA,CACxB,UAAA,CAAYA,EAAa,SAAA,CACzB,SAAA,CAAWC,EAAa,KAAA,CACxB,UAAA,CAAYA,CAAAA,CAAa,SAAA,CACzB,YAAA,CAAcA,CAAAA,CAAa,QAC3B,YAAA,CAAcC,CAAAA,CAAgB,KAC9B,eAAA,CAAiBA,CAAAA,CAAgB,QACjC,aAAA,CAAeA,CAAAA,CAAgB,SAAA,CAC/B,SAAA,CAAWC,CAAAA,CAAa,IAAA,CACxB,aAAcA,CAAAA,CAAa,OAAA,CAC3B,WAAYA,CAAAA,CAAa,SAAA,CACzB,YAAaC,CAAAA,CACb,QAAA,CAAAE,CAAAA,CACA,cAAA,CAAAzB,CAAAA,CACA,YAAA,CAAAG,EACA,OAAA,CAAAF,CAAAA,CACA,QAAAC,CAAAA,CACA,WAAA,CAAawB,EACb,OAAA,CAAAE,CAAAA,CACA,eAAA,CAAiBC,CAAAA,CACjB,WAAA,CAAAE,CAAAA,CACA,cAAAK,CAAAA,CACA,UAAA,CAAAC,EACA,WAAA,CAAAC,CAAAA,CACA,UAAAC,CAAAA,CACA,SAAA,CAAAK,CAAAA,CACA,SAAA,CAAAC,CAAAA,CACA,kBAAA,CAAoBZ,EAAuB,OAAA,CAC3C,eAAA,CAAiBA,EAAuB,IAAA,CACxC,gBAAA,CAAkBA,EAAuB,SAC3C,CAAA,CACA,QAAAuB,EAAAA,CACA,MAAA,CAAQ,IAAMN,CAAAA,CACd,WAAA,CAAAC,CACF,CACF,CAOO,SAASM,EAAAA,CACdC,CAAAA,CACA3C,CAAAA,CACAxF,CAAAA,CACAC,CAAAA,CACAmI,CAAAA,CACAR,EACA,CACA,IAAMS,EAAUtG,EAAAA,CAAY9B,CAAK,EAC7BqI,CAAAA,CAAMH,CAAAA,CAAO,GAAA,CAAInI,CAAG,CAAA,CAExB,GAAIsI,EAAK,CACP,IAAMC,EAAQD,CAAAA,CAAI,KAAA,CAClB,GAAIC,CAAAA,CAAM,CAAC,CAAA,GACTA,CAAAA,CAAM,CAAC,CAAA,CAAE,YAAcF,CAAAA,CACnBD,CAAAA,EAASR,GAAa,CACxB,IAAMY,EAAOD,CAAAA,CAAM,CAAC,CAAA,CACpBC,CAAAA,CAAK,KAAA,CAAM,UAAA,CAAa,4BACxB,IAAMC,CAAAA,CAAM,WAAW,IAAM,CAC3BD,EAAK,KAAA,CAAM,UAAA,CAAa,EAAA,CACxBZ,CAAAA,CAAY,MAAA,CAAOa,CAAG,EACxB,CAAA,CAAG,GAAG,EACNb,CAAAA,CAAY,GAAA,CAAIa,CAAG,EACrB,CAEJ,CAAA,KAAO,CACLH,CAAAA,CAAM,QAAA,CAAS,cAAc,IAAI,CAAA,CACjCA,EAAI,KAAA,CAAM,YAAA,CAAe,aAAa9E,CAAAA,CAAE,SAAS,CAAA,CAAA,CACjD,IAAMkF,CAAAA,CAAU,QAAA,CAAS,cAAc,IAAI,CAAA,CAC3C,OAAO,MAAA,CAAOA,CAAAA,CAAQ,MAAO,CAAE,OAAA,CAAS,UAAW,KAAA,CAAOlF,CAAAA,CAAE,KAAM,CAAC,CAAA,CACnEkF,EAAQ,WAAA,CAAc1I,CAAAA,CACtB,IAAM2I,CAAAA,CAAU,QAAA,CAAS,aAAA,CAAc,IAAI,CAAA,CAC3CA,CAAAA,CAAQ,MAAM,OAAA,CAAU,SAAA,CACxBA,EAAQ,WAAA,CAAcN,CAAAA,CACtBC,EAAI,WAAA,CAAYI,CAAO,CAAA,CACvBJ,CAAAA,CAAI,WAAA,CAAYK,CAAO,EACvBnD,CAAAA,CAAM,WAAA,CAAY8C,CAAG,CAAA,CACrBH,CAAAA,CAAO,IAAInI,CAAAA,CAAKsI,CAAG,EACrB,CACF,CAGO,SAASM,GACdT,CAAAA,CACAnI,CAAAA,CACA,CACA,IAAMsI,CAAAA,CAAMH,EAAO,GAAA,CAAInI,CAAG,CAAA,CACtBsI,CAAAA,GACFA,CAAAA,CAAI,MAAA,GACJH,CAAAA,CAAO,MAAA,CAAOnI,CAAG,CAAA,EAErB,CAGO,SAAS6I,EAAAA,CACdC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CAKA,CAGA,GAFAF,EAAK,YAAA,CAAa,eAAA,GAClBA,CAAAA,CAAK,aAAA,CAAc,YAAc,MAAA,CAAOC,CAAAA,CAAS,MAAM,CAAA,CACnDA,CAAAA,CAAS,MAAA,CAAS,EACpB,IAAA,IAAW,CAAA,IAAKA,EAAU,CACxB,IAAME,EAAK,QAAA,CAAS,aAAA,CAAc,IAAI,CAAA,CACtCA,CAAAA,CAAG,KAAA,CAAM,SAAW,MAAA,CACpBA,CAAAA,CAAG,YAAc,CAAA,EAAG,CAAA,CAAE,UAAU,CAAA,EAAA,EAAK,CAAA,CAAE,EAAE,CAAA,CAAA,CAAA,CACzCH,CAAAA,CAAK,aAAa,WAAA,CAAYG,CAAE,EAClC,CAAA,KACK,CACL,IAAMA,CAAAA,CAAK,QAAA,CAAS,aAAA,CAAc,IAAI,CAAA,CACtCA,CAAAA,CAAG,MAAM,QAAA,CAAW,MAAA,CACpBA,EAAG,KAAA,CAAM,KAAA,CAAQzF,EAAE,KAAA,CACnByF,CAAAA,CAAG,WAAA,CAAc,MAAA,CACjBH,CAAAA,CAAK,YAAA,CAAa,YAAYG,CAAE,EAClC,CAIA,GAFAH,CAAAA,CAAK,UAAU,eAAA,EAAgB,CAC/BA,CAAAA,CAAK,UAAA,CAAW,WAAA,CAAc,MAAA,CAAOE,EAAM,MAAM,CAAA,CAC7CA,EAAM,MAAA,CAAS,CAAA,CACjB,QAAW,CAAA,IAAKA,CAAAA,CAAO,CACrB,IAAMC,CAAAA,CAAK,QAAA,CAAS,cAAc,IAAI,CAAA,CACtCA,EAAG,KAAA,CAAM,QAAA,CAAW,OACpBA,CAAAA,CAAG,WAAA,CAAc,CAAA,EAAG,CAAA,CAAE,WAAA,CAAY,IAAI,SAAS,CAAA,CAAE,cAAc,GAC/DH,CAAAA,CAAK,SAAA,CAAU,YAAYG,CAAE,EAC/B,CAAA,KACK,CACL,IAAMA,CAAAA,CAAK,SAAS,aAAA,CAAc,IAAI,EACtCA,CAAAA,CAAG,KAAA,CAAM,SAAW,MAAA,CACpBA,CAAAA,CAAG,KAAA,CAAM,KAAA,CAAQzF,CAAAA,CAAE,KAAA,CACnByF,EAAG,WAAA,CAAc,MAAA,CACjBH,EAAK,SAAA,CAAU,WAAA,CAAYG,CAAE,EAC/B,CACF,CAGO,SAASC,EAAAA,CACdJ,EACAK,CAAAA,CACAC,CAAAA,CACA,CACA,IAAMC,CAAAA,CAAYF,IAAkB,CAAA,EAAKC,CAAAA,GAAe,CAAA,CACxDN,CAAAA,CAAK,QAAA,CAAS,KAAA,CAAM,MAAQO,CAAAA,CAAY7F,CAAAA,CAAE,MAAQA,CAAAA,CAAE,MAAA,CACpDsF,EAAK,QAAA,CAAS,WAAA,CAAcO,CAAAA,CAAY,SAAA,CAAY,YAAA,CACpDP,CAAAA,CAAK,UAAU,WAAA,CAAcO,CAAAA,CAAY,YAAc,cAAA,CACvDP,CAAAA,CAAK,UAAU,YAAA,CACb,YAAA,CACA,CAAA,uBAAA,EAA0BO,CAAAA,CAAY,EAAA,CAAK,mBAAmB,EAChE,EACF,CAGO,SAASC,EAAAA,CACdR,CAAAA,CACAS,EACAjH,CAAAA,CACAsF,CAAAA,CACA,CACA,IAAM4B,CAAAA,CAAiB,MAAA,CAAO,KAAKlH,CAAAA,CAAO,MAAM,EAIhD,GAHAwG,CAAAA,CAAK,WAAW,WAAA,CAAc,MAAA,CAAOU,CAAAA,CAAe,MAAM,CAAA,CAGtDA,CAAAA,CAAe,SAAW,CAAA,CAAG,CAC/BD,EAAY,KAAA,EAAM,CAClBT,EAAK,SAAA,CAAU,eAAA,EAAgB,CAC/B,IAAMR,CAAAA,CAAM,QAAA,CAAS,cAAc,IAAI,CAAA,CACjCE,EAAO,QAAA,CAAS,aAAA,CAAc,IAAI,CAAA,CACxCA,CAAAA,CAAK,OAAA,CAAU,CAAA,CACfA,CAAAA,CAAK,KAAA,CAAM,MAAQhF,CAAAA,CAAE,KAAA,CACrBgF,EAAK,KAAA,CAAM,QAAA,CAAW,OACtBA,CAAAA,CAAK,WAAA,CAAc,yBACnBF,CAAAA,CAAI,WAAA,CAAYE,CAAI,CAAA,CACpBM,CAAAA,CAAK,UAAU,WAAA,CAAYR,CAAG,EAE9B,MACF,CAGA,IAAMmB,CAAAA,CAAS,IAAI,GAAA,CAAID,CAAc,CAAA,CACrC,IAAA,GAAW,CAACxJ,CAAAA,CAAKsI,CAAG,IAAKiB,CAAAA,CAClBE,CAAAA,CAAO,GAAA,CAAIzJ,CAAG,CAAA,GACjBsI,CAAAA,CAAI,QAAO,CACXiB,CAAAA,CAAY,OAAOvJ,CAAG,CAAA,CAAA,CAK1B,QAAWA,CAAAA,IAAOwJ,CAAAA,CAAgB,CAChC,IAAInB,CAAAA,CACJ,GAAI,CACFA,CAAAA,CAAUtG,EAAAA,CAAYO,EAAO,IAAA,CAAKtC,CAAG,CAAC,EACxC,CAAA,KAAQ,CACNqI,CAAAA,CAAU,UACZ,CACAH,GACEqB,CAAAA,CACAT,CAAAA,CAAK,UACL9I,CAAAA,CACAqI,CAAAA,CACA,KACAT,CACF,EACF,CACF,CAGO,SAAS8B,EAAAA,CACdZ,EACAtH,CAAAA,CACAgB,CAAAA,CACAmH,EACA,CAEA,IAAM/C,EAAQkC,CAAAA,CAAK,UAAA,CAAW,aAAA,CAAc,kBAAkB,CAAA,CAC1DlC,CAAAA,EACFA,EAAM,MAAA,EAAO,CAGf,IAAM0B,CAAAA,CAAM,QAAA,CAAS,cAAc,KAAK,CAAA,CACxC,MAAA,CAAO,MAAA,CAAOA,CAAAA,CAAI,KAAA,CAAO,CACvB,OAAA,CAAS,SAAA,CACT,aAAc,CAAA,UAAA,EAAa9E,CAAAA,CAAE,SAAS,CAAA,CAAA,CACtC,UAAA,CAAY,SACd,CAAC,CAAA,CACD,IAAMoG,CAAAA,CAAM,IAAI,KACVC,CAAAA,CAAO,CAAA,EAAG,OAAOD,CAAAA,CAAI,QAAA,EAAU,CAAA,CAAE,QAAA,CAAS,CAAA,CAAG,GAAG,CAAC,CAAA,CAAA,EAAI,OAAOA,CAAAA,CAAI,UAAA,EAAY,CAAA,CAAE,QAAA,CAAS,CAAA,CAAG,GAAG,CAAC,CAAA,CAAA,EAAI,OAAOA,CAAAA,CAAI,UAAA,EAAY,CAAA,CAAE,QAAA,CAAS,EAAG,GAAG,CAAC,CAAA,CAAA,EAAI,MAAA,CAAOA,CAAAA,CAAI,eAAA,EAAiB,CAAA,CAAE,QAAA,CAAS,EAAG,GAAG,CAAC,GAE/LE,CAAAA,CACJ,GAAI,CACF,IAAM9H,CAAAA,CAAM,IAAA,CAAK,UAAUQ,CAAI,CAAA,CAC/BsH,EAAU3H,EAAAA,CAASH,CAAAA,CAAK,EAAE,EAC5B,CAAA,KAAQ,CACN8H,CAAAA,CAAU,KACZ,CAEA,IAAMC,CAAAA,CAAW,QAAA,CAAS,cAAc,MAAM,CAAA,CAC9CA,EAAS,KAAA,CAAM,KAAA,CAAQvG,CAAAA,CAAE,QAAA,CACzBuG,CAAAA,CAAS,WAAA,CAAcF,EAEvB,IAAMG,CAAAA,CAAW,SAAS,aAAA,CAAc,MAAM,EAC9CA,CAAAA,CAAS,KAAA,CAAM,KAAA,CAAQxG,CAAAA,CAAE,MAAA,CACzBwG,CAAAA,CAAS,YAAc,CAAA,CAAA,EAAIxI,CAAI,IAE/B,IAAMyI,CAAAA,CAAc,SAAS,aAAA,CAAc,MAAM,EAWjD,IAVAA,CAAAA,CAAY,MAAM,KAAA,CAAQzG,CAAAA,CAAE,MAC5ByG,CAAAA,CAAY,WAAA,CAAcH,EAE1BxB,CAAAA,CAAI,WAAA,CAAYyB,CAAQ,CAAA,CACxBzB,CAAAA,CAAI,WAAA,CAAY0B,CAAQ,CAAA,CACxB1B,CAAAA,CAAI,YAAY2B,CAAW,CAAA,CAE3BnB,EAAK,UAAA,CAAW,OAAA,CAAQR,CAAG,CAAA,CAGpBQ,CAAAA,CAAK,UAAA,CAAW,kBAAoBxF,EAAAA,EACzCwF,CAAAA,CAAK,WAAW,gBAAA,EAAkB,MAAA,GAGpCA,CAAAA,CAAK,WAAA,CAAY,WAAA,CAAc,MAAA,CAAOa,CAAU,EAClD,CAGO,SAASO,EAAAA,CAAkBpB,EAAiBqB,CAAAA,CAAmB,CACpErB,EAAK,QAAA,CAAS,eAAA,EAAgB,CAE9B,IAAMsB,CAAAA,CACJD,CAAAA,CAAK,eAAiB,CAAA,CAAA,CACjBA,CAAAA,CAAK,iBAAmBA,CAAAA,CAAK,cAAA,EAAgB,QAAQ,CAAC,CAAA,CACvD,QAAA,CAEAE,CAAAA,CAAkB,CACtB,CAAA,YAAA,EAAeF,EAAK,cAAc,CAAA,OAAA,EAAUC,CAAY,CAAA,GAAA,CAAA,CACxD,CAAA,SAAA,EAAYD,EAAK,cAAc,CAAA,MAAA,EAASA,CAAAA,CAAK,gBAAgB,CAAA,OAAA,CAC/D,CAAA,CAEA,QAAWG,CAAAA,IAAQD,CAAAA,CAAO,CACxB,IAAME,CAAAA,CAAM,SAAS,aAAA,CAAc,KAAK,CAAA,CACxCA,CAAAA,CAAI,KAAA,CAAM,YAAA,CAAe,MACzBA,CAAAA,CAAI,WAAA,CAAcD,EAClBxB,CAAAA,CAAK,QAAA,CAAS,YAAYyB,CAAG,EAC/B,CAEA,GAAIJ,CAAAA,CAAK,cAAc,IAAA,CAAO,CAAA,CAAG,CAC/B,IAAMK,CAAAA,CAAiB,SAAS,aAAA,CAAc,KAAK,CAAA,CACnDA,CAAAA,CAAe,KAAA,CAAM,SAAA,CAAY,MACjCA,CAAAA,CAAe,KAAA,CAAM,aAAe,KAAA,CACpCA,CAAAA,CAAe,MAAM,KAAA,CAAQhH,CAAAA,CAAE,MAAA,CAC/BgH,CAAAA,CAAe,WAAA,CAAc,YAAA,CAC7B1B,EAAK,QAAA,CAAS,WAAA,CAAY0B,CAAc,CAAA,CAExC,IAAMC,EAAS,CAAC,GAAGN,CAAAA,CAAK,aAAA,CAAc,OAAA,EAAS,EAAE,IAAA,CAC/C,CAACO,EAAGC,CAAAA,GAAMA,CAAAA,CAAE,CAAC,CAAA,CAAE,OAAA,CAAUD,CAAAA,CAAE,CAAC,CAAA,CAAE,OAChC,EACA,IAAA,GAAW,CAACtK,EAAIwK,CAAK,CAAA,GAAKH,EAAQ,CAChC,IAAMI,CAAAA,CACJD,CAAAA,CAAM,KAAA,CAAQ,CAAA,CAAA,CAAKA,EAAM,OAAA,CAAUA,CAAAA,CAAM,OAAO,OAAA,CAAQ,CAAC,EAAI,GAAA,CACzDL,CAAAA,CAAM,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA,CACxCA,EAAI,KAAA,CAAM,WAAA,CAAc,MACxBA,CAAAA,CAAI,WAAA,CAAc,GAAGnK,CAAE,CAAA,EAAA,EAAKwK,CAAAA,CAAM,KAAK,CAAA,OAAA,EAAUC,CAAG,KAAKD,CAAAA,CAAM,MAAA,CAAS,EAAI,CAAA,EAAA,EAAKA,CAAAA,CAAM,MAAM,CAAA,IAAA,CAAA,CAAS,EAAE,GACpGA,CAAAA,CAAM,MAAA,CAAS,IACjBL,CAAAA,CAAI,KAAA,CAAM,MAAQ/G,CAAAA,CAAE,GAAA,CAAA,CAEtBsF,EAAK,QAAA,CAAS,WAAA,CAAYyB,CAAG,EAC/B,CACF,CACF,CAGO,SAASO,EAAAA,CACdhC,EACAxG,CAAAA,CACA,CACA,IAAMyI,CAAAA,CAAKzI,CAAAA,CAAO,OAAA,CAClB,GAAI,CAACyI,CAAAA,CAAI,CACPjC,CAAAA,CAAK,cAAA,CAAe,MAAM,OAAA,CAAU,MAAA,CAEpC,MACF,CACAA,CAAAA,CAAK,cAAA,CAAe,KAAA,CAAM,OAAA,CAAU,MAAA,CAEpC,IAAMkC,CAAAA,CAAUD,CAAAA,CAAG,aACbE,CAAAA,CAAQF,CAAAA,CAAG,UAAU,MAAA,CAC3BjC,CAAAA,CAAK,YAAA,CAAa,WAAA,CAChBmC,CAAAA,CAAQ,CAAA,CAAI,GAAGD,CAAAA,CAAU,CAAC,MAAMC,CAAK,CAAA,CAAA,CAAK,cAE5C,IAAMC,CAAAA,CAAUF,CAAAA,CAAU,CAAA,CACpBG,CAAAA,CAAUH,CAAAA,CAAUC,EAAQ,CAAA,CAClCnC,CAAAA,CAAK,QAAQ,QAAA,CAAW,CAACoC,EACzBpC,CAAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,OAAA,CAAUoC,CAAAA,CAAU,GAAA,CAAM,MAC7CpC,CAAAA,CAAK,OAAA,CAAQ,SAAW,CAACqC,CAAAA,CACzBrC,EAAK,OAAA,CAAQ,KAAA,CAAM,OAAA,CAAUqC,CAAAA,CAAU,GAAA,CAAM,MAC/C,CAGO,SAASC,EAAAA,CACdtC,EACAxG,CAAAA,CACA,CACAwG,EAAK,OAAA,CAAQ,gBAAA,CAAiB,QAAS,IAAM,CACvCxG,EAAO,OAAA,EAAWA,CAAAA,CAAO,QAAQ,YAAA,CAAe,CAAA,EAClDA,EAAO,OAAA,CAAQ,MAAA,CAAO,CAAC,EAE3B,CAAC,CAAA,CACDwG,EAAK,OAAA,CAAQ,gBAAA,CAAiB,QAAS,IAAM,CAEzCxG,EAAO,OAAA,EACPA,CAAAA,CAAO,OAAA,CAAQ,YAAA,CAAeA,CAAAA,CAAO,OAAA,CAAQ,UAAU,MAAA,CAAS,CAAA,EAEhEA,EAAO,OAAA,CAAQ,SAAA,CAAU,CAAC,EAE9B,CAAC,EACH,CAWA,IAAM+I,EAAAA,CAAoC,OAAO,MAAA,CAAO,MAAA,CAAO,OAAO,IAAI,CAAA,CAAG,CAC3E,GAAA,CAAK,GAAA,CACL,GAAA,CAAK,QAAA,CACL,GAAA,CAAK,GAAA,CACL,KAAM,QAAA,CACN,GAAA,CAAK,IACL,IAAA,CAAM,QAAA,CACN,IAAK,QAAA,CACL,IAAA,CAAM,QAAA,CACN,OAAA,CAAS,QAAA,CACT,QAAA,CAAU,KACV,WAAA,CAAa,aAAA,CACb,UAAW,WAAA,CACX,SAAA,CAAW,WACX,QAAA,CAAU,SAAA,CACV,QAAA,CAAU,SACZ,CAAC,CAAA,CAED,SAASC,EAAAA,CAASC,CAAAA,CAAoB,CACpC,OAAO,MAAA,CAAO,OAAOF,EAAAA,CAAWE,CAAE,CAAA,CAAIF,EAAAA,CAAUE,CAAE,CAAA,CAAKA,CACzD,CAQA,SAASC,GAAkBtJ,CAAAA,CAAoB,CAC7C,OAAIA,CAAAA,YAAa,MAAA,CACRC,GAAS,MAAA,CAAOD,CAAC,EAAG,EAAE,CAAA,CAGxBH,GAAYG,CAAC,CACtB,CAEA,IAAMuJ,EAAAA,CAAiB,IAAI,GAAA,CAAI,CAAC,MAAA,CAAQ,OAAQ,MAAM,CAAC,EAMvD,SAASC,EAAAA,CAAeC,EAAqC,CAC3D,IAAM1C,CAAAA,CAAK,QAAA,CAAS,aAAA,CAAc,IAAI,EAChC2C,CAAAA,CAAOD,CAAAA,CAAO,KAAO,QAAA,CAAM,QAAA,CAIjC,GAHA1C,CAAAA,CAAG,KAAA,CAAM,KAAA,CAAQ0C,CAAAA,CAAO,IAAA,CAAOnI,CAAAA,CAAE,MAAQA,CAAAA,CAAE,GAAA,CAC3CyF,EAAG,KAAA,CAAM,SAAA,CAAY,OAEjBwC,EAAAA,CAAe,GAAA,CAAIE,CAAAA,CAAO,EAAE,CAAA,CAAG,CACjC,IAAME,CAAAA,CAAOF,CAAAA,CAAO,KAAO,CAAA,GAAA,EAAMA,CAAAA,CAAO,IAAI,CAAA,CAAA,CAAK,EAAA,CAEjD,GADA1C,CAAAA,CAAG,WAAA,CAAc,CAAA,EAAG2C,CAAI,CAAA,CAAA,EAAID,CAAAA,CAAO,EAAE,CAAA,EAAGE,CAAI,GACxCF,CAAAA,CAAO,QAAA,EAAYA,CAAAA,CAAO,QAAA,CAAS,MAAA,CAAS,CAAA,CAAG,CACjD,IAAMG,CAAAA,CAAM,SAAS,aAAA,CAAc,IAAI,EACvC,MAAA,CAAO,MAAA,CAAOA,CAAAA,CAAI,KAAA,CAAO,CACvB,MAAA,CAAQ,IACR,WAAA,CAAa,MAAA,CACb,UAAW,MACb,CAAC,EACD,IAAA,IAAWpL,CAAAA,IAAKiL,EAAO,QAAA,CACrBG,CAAAA,CAAI,YAAYJ,EAAAA,CAAehL,CAAC,CAAC,CAAA,CAEnCuI,CAAAA,CAAG,YAAY6C,CAAG,EACpB,CACF,CAAA,KAAO,CACL,IAAMC,EAAST,EAAAA,CAASK,CAAAA,CAAO,EAAE,CAAA,CAC3BK,CAAAA,CAAWR,GAAkBG,CAAAA,CAAO,QAAQ,CAAA,CAClD,GAAIA,CAAAA,CAAO,IAAA,CACT1C,EAAG,WAAA,CAAc,CAAA,EAAG2C,CAAI,CAAA,CAAA,EAAID,CAAAA,CAAO,IAAI,CAAA,CAAA,EAAII,CAAM,CAAA,CAAA,EAAIC,CAAQ,CAAA,CAAA,CAAA,KACxD,CACL,IAAMC,CAAAA,CAAST,EAAAA,CAAkBG,EAAO,MAAM,CAAA,CAC9C1C,EAAG,WAAA,CAAc,CAAA,EAAG2C,CAAI,CAAA,CAAA,EAAID,CAAAA,CAAO,IAAI,IAAII,CAAM,CAAA,CAAA,EAAIC,CAAQ,CAAA,WAAA,EAAcC,CAAM,IACnF,CACF,CAEA,OAAOhD,CACT,CASO,SAASiD,GACdpD,CAAAA,CACAX,CAAAA,CACA/H,EACM,CACN,IAAMkI,EAAMH,CAAAA,CAAO,GAAA,CAAI/H,CAAE,CAAA,CAOzB,GANIkI,CAAAA,GACFA,EAAI,MAAA,EAAO,CACXH,EAAO,MAAA,CAAO/H,CAAE,EAChB0I,CAAAA,CAAK,gBAAA,CAAiB,WAAA,CAAc,MAAA,CAAOX,CAAAA,CAAO,IAAI,GAItDA,CAAAA,CAAO,IAAA,GAAS,GAChB,CAACW,CAAAA,CAAK,gBAAgB,aAAA,CAAc,uBAAuB,EAC3D,CACA,IAAMlC,EAAQ,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA,CAC1CA,CAAAA,CAAM,MAAM,KAAA,CAAQpD,CAAAA,CAAE,KAAA,CACtBoD,CAAAA,CAAM,KAAA,CAAM,OAAA,CAAU,MACtBA,CAAAA,CAAM,KAAA,CAAM,UAAY,QAAA,CACxBA,CAAAA,CAAM,YAAc,oCAAA,CACpBA,CAAAA,CAAM,SAAA,CAAY,sBAAA,CAClBkC,CAAAA,CAAK,eAAA,CAAgB,YAAYlC,CAAK,EACxC,CACF,CASO,SAASuF,GACdrD,CAAAA,CACAsD,CAAAA,CACM,CACN,IAAMxF,CAAAA,CAAQkC,CAAAA,CAAK,gBAAgB,aAAA,CAAc,uBAAuB,EACnElC,CAAAA,GACLA,CAAAA,CAAM,YAAcwF,CAAAA,CAChB,oCAAA,CACA,gCAAA,EACN,CAaO,SAASC,EAAAA,CACdvD,EACAX,CAAAA,CACA/H,CAAAA,CACAG,EACAC,CAAAA,CACAsE,CAAAA,CACM,CAEN,IAAM8B,CAAAA,CAAQkC,CAAAA,CAAK,eAAA,CAAgB,aAAA,CAAc,uBAAuB,EACpElC,CAAAA,EACFA,CAAAA,CAAM,QAAO,CAGf,IAAI0B,EAAMH,CAAAA,CAAO,GAAA,CAAI/H,CAAE,CAAA,CAClBkI,CAAAA,GACHA,CAAAA,CAAM,SAAS,aAAA,CAAc,KAAK,EAClC,MAAA,CAAO,MAAA,CAAOA,EAAI,KAAA,CAAO,CACvB,YAAA,CAAc,KAAA,CACd,aAAA,CAAe,KAAA,CACf,aAAc,CAAA,UAAA,EAAa9E,CAAAA,CAAE,SAAS,CAAA,CACxC,CAAC,EACD2E,CAAAA,CAAO,GAAA,CAAI/H,EAAIkI,CAAG,CAAA,CAClBQ,EAAK,eAAA,CAAgB,WAAA,CAAYR,CAAG,CAAA,CACpCQ,CAAAA,CAAK,iBAAiB,WAAA,CAAc,MAAA,CAAOX,CAAAA,CAAO,IAAI,CAAA,CAAA,CAIxDG,CAAAA,CAAI,iBAAgB,CAEpB,IAAMlE,EAAS,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA,CAC3C,MAAA,CAAO,MAAA,CAAOA,CAAAA,CAAO,KAAA,CAAO,CAC1B,WAAY,MAAA,CACZ,KAAA,CAAO7D,EAASiD,CAAAA,CAAE,KAAA,CAAQA,EAAE,KAC9B,CAAC,CAAA,CACD,IAAMoI,CAAAA,CAAOrL,CAAAA,CAAS,SAAM,QAAA,CAI5B,GAHA6D,EAAO,WAAA,CAAcU,CAAAA,CAAQ,GAAG8G,CAAI,CAAA,CAAA,EAAIxL,CAAE,CAAA,GAAA,EAAM0E,CAAK,CAAA,CAAA,CAAA,CAAM,GAAG8G,CAAI,CAAA,CAAA,EAAIxL,CAAE,CAAA,CAAA,CACxEkI,CAAAA,CAAI,YAAYlE,CAAM,CAAA,CAElB5D,CAAAA,EAAeA,CAAAA,CAAY,MAAA,CAAS,CAAA,CAAG,CACzC,IAAM8L,CAAAA,CAAO,SAAS,aAAA,CAAc,IAAI,EACxC,MAAA,CAAO,MAAA,CAAOA,CAAAA,CAAK,KAAA,CAAO,CACxB,MAAA,CAAQ,YACR,WAAA,CAAa,MAAA,CACb,UAAW,MACb,CAAC,EACD,IAAA,IAAWX,CAAAA,IAAUnL,CAAAA,CACnB8L,CAAAA,CAAK,WAAA,CAAYZ,EAAAA,CAAeC,CAAM,CAAC,CAAA,CAEzCrD,EAAI,WAAA,CAAYgE,CAAI,EACtB,CAAA,KAAA,GAAW,CAAC9L,EAAa,CACvB,IAAM+L,EAAO,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA,CACzC,MAAA,CAAO,OAAOA,CAAAA,CAAK,KAAA,CAAO,CACxB,KAAA,CAAO/I,CAAAA,CAAE,KAAA,CACT,SAAU,MAAA,CACV,SAAA,CAAW,SACX,WAAA,CAAa,MACf,CAAC,CAAA,CACD+I,CAAAA,CAAK,WAAA,CAAc,qCAAA,CACnBjE,CAAAA,CAAI,WAAA,CAAYiE,CAAI,EACtB,CACF,CChlCA,IAAMC,EAAAA,CAAc,IAAI,OAAA,CAGxB,SAASC,EAAAA,CACPC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACAC,EACAC,CAAAA,CACAC,CAAAA,CACQ,CACR,OAAO,CACLL,EAAS,IAAA,CAAK,GAAG,CAAA,CACjBC,CAAAA,CAAU,IAAA,CAAK,GAAG,EAClBC,CAAAA,CAAY,GAAA,CAAKlM,GAAM,CAAA,EAAGA,CAAAA,CAAE,EAAE,CAAA,CAAA,EAAIA,CAAAA,CAAE,MAAM,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,CACtD,CAAC,GAAGmM,CAAAA,CAAO,OAAA,EAAS,CAAA,CACjB,GAAA,CAAI,CAAC,CAACzM,CAAAA,CAAI4M,CAAC,IAAM,CAAA,EAAG5M,CAAE,IAAI4M,CAAAA,CAAE,MAAM,IAAIA,CAAAA,CAAE,IAAI,CAAA,CAAE,CAAA,CAC9C,IAAA,CAAK,GAAG,EACXF,CAAAA,CAAY,IAAA,CAAK,GAAG,CAAA,CACpBC,CAAAA,CAAkB,KAAK,GAAG,CAC5B,EAAE,IAAA,CAAK,GAAG,CACZ,CAGA,SAASE,GACPC,CAAAA,CACAC,CAAAA,CACAT,EACAC,CAAAA,CACAS,CAAAA,CACA,CACA,IAAA,IAAWpN,CAAAA,IAAO0M,CAAAA,CAAU,CAC1B,IAAMW,CAAAA,CAAOH,EAAM,KAAA,CAAM,GAAA,CAAI,KAAKlN,CAAG,CAAA,CAAE,CAAA,CACvC,GAAI,CAACqN,CAAAA,CACH,SAEF,IAAMC,CAAAA,CAAUH,EAAS,oBAAA,CAAqB,GAAA,CAAInN,CAAG,CAAA,CACrDqN,CAAAA,CAAK,IAAA,CAAK,YAAA,CAAa,MAAA,CAAQC,CAAAA,CAAU,GAAG9J,CAAAA,CAAE,IAAI,KAAO,MAAM,CAAA,CAC/D6J,EAAK,IAAA,CAAK,YAAA,CAAa,cAAA,CAAgBC,CAAAA,CAAU,GAAA,CAAM,GAAG,EAC5D,CACA,IAAA,IAAWtN,KAAO2M,CAAAA,CAAW,CAC3B,IAAMU,CAAAA,CAAOH,CAAAA,CAAM,KAAA,CAAM,GAAA,CAAI,CAAA,EAAA,EAAKlN,CAAG,EAAE,CAAA,CACvC,GAAI,CAACqN,CAAAA,CACH,SAEF,IAAMC,CAAAA,CAAUH,CAAAA,CAAS,2BAAA,CAA4B,GAAA,CAAInN,CAAG,CAAA,CAC5DqN,EAAK,IAAA,CAAK,YAAA,CAAa,OAAQC,CAAAA,CAAU,CAAA,EAAG9J,EAAE,MAAM,CAAA,EAAA,CAAA,CAAO,MAAM,CAAA,CACjE6J,CAAAA,CAAK,IAAA,CAAK,aAAa,cAAA,CAAgBC,CAAAA,CAAU,IAAM,GAAG,EAC5D,CACA,IAAA,IAAWlN,CAAAA,IAAMgN,EAAe,CAC9B,IAAMC,EAAOH,CAAAA,CAAM,KAAA,CAAM,IAAI,CAAA,EAAA,EAAK9M,CAAE,EAAE,CAAA,CACtC,GAAI,CAACiN,CAAAA,CACH,SAEF,IAAMC,EAAUH,CAAAA,CAAS,yBAAA,CAA0B,IAAI/M,CAAE,CAAA,CAGnDsF,EAAQ2H,CAAAA,CAAK,IAAA,CAAK,YAAA,CAAa,QAAQ,CAAA,EAAK7J,CAAAA,CAAE,MACpD6J,CAAAA,CAAK,IAAA,CAAK,aAAa,MAAA,CAAQC,CAAAA,CAAU,GAAG5H,CAAK,CAAA,EAAA,CAAA,CAAO,MAAM,CAAA,CAC9D2H,CAAAA,CAAK,IAAA,CAAK,aAAa,cAAA,CAAgBC,CAAAA,CAAU,IAAM,GAAG,EAC5D,CACF,CAOO,SAASC,EAAAA,CACdzE,CAAAA,CACAxG,CAAAA,CACA6K,CAAAA,CACA,CACA,IAAMK,CAAAA,CAAanL,GAAYC,CAAM,CAAA,CACrC,GAAI,CAACkL,CAAAA,CACH,OAIF,IAAId,CAAAA,CACJ,GAAI,CACFA,CAAAA,CAAW,MAAA,CAAO,KAAKpK,CAAAA,CAAO,KAAA,CAAM,OAAO,QAAA,EAAU,EACvD,CAAA,KAAQ,CACNoK,CAAAA,CAAW,GACb,CACA,IAAMC,CAAAA,CAAY,MAAA,CAAO,KAAKrK,CAAAA,CAAO,MAAM,CAAA,CACrCmL,CAAAA,CAAiBD,CAAAA,CAAW,WAAA,CAC5BE,EAAYF,CAAAA,CAAW,KAAA,CACvBG,EAAeH,CAAAA,CAAW,QAAA,CAC1BV,EAAc,MAAA,CAAO,IAAA,CAAKU,EAAW,SAAS,CAAA,CAG9CX,EAAS,IAAI,GAAA,CAInB,QAAW,CAAA,IAAKa,CAAAA,CACdb,EAAO,GAAA,CAAI,CAAA,CAAE,EAAA,CAAI,CACf,IAAA,CAAM,CAAA,CAAE,YAAY,IAAA,CACpB,cAAA,CAAgB,EAAE,cAAA,CAClB,MAAA,CAAQ,OACV,CAAC,CAAA,CAEH,IAAA,IAAWe,CAAAA,IAAKD,CAAAA,CACdd,CAAAA,CAAO,IAAIe,CAAAA,CAAE,EAAA,CAAI,CACf,IAAA,CAAMA,CAAAA,CAAE,WACR,cAAA,CAAgB,EAAA,CAChB,MAAA,CAAQ,UACV,CAAC,CAAA,CAIH,GACElB,CAAAA,CAAS,MAAA,GAAW,GACpBC,CAAAA,CAAU,MAAA,GAAW,GACrBc,CAAAA,CAAe,MAAA,GAAW,CAAA,EAC1BX,CAAAA,CAAY,MAAA,GAAW,CAAA,CACvB,CACAN,EAAAA,CAAY,MAAA,CAAO1D,EAAK,OAAO,CAAA,CAC/BA,EAAK,OAAA,CAAQ,eAAA,EAAgB,CAC7BA,CAAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,UAAW,YAAY,CAAA,CACjD,IAAM+E,CAAAA,CAAO,QAAA,CAAS,gBAAgB,4BAAA,CAA8B,MAAM,CAAA,CAC1EA,CAAAA,CAAK,YAAA,CAAa,GAAA,CAAK,KAAK,CAAA,CAC5BA,CAAAA,CAAK,aAAa,GAAA,CAAK,IAAI,EAC3BA,CAAAA,CAAK,YAAA,CAAa,aAAA,CAAe,QAAQ,CAAA,CACzCA,CAAAA,CAAK,aAAa,MAAA,CAAQrK,CAAAA,CAAE,KAAK,CAAA,CACjCqK,CAAAA,CAAK,aAAa,WAAA,CAAa,IAAI,EACnCA,CAAAA,CAAK,YAAA,CAAa,cAAerK,CAAAA,CAAE,IAAI,EACvCqK,CAAAA,CAAK,WAAA,CAAc,qBACnB/E,CAAAA,CAAK,OAAA,CAAQ,WAAA,CAAY+E,CAAI,CAAA,CAE7B,MACF,CAGA,IAAMd,CAAAA,CAAoBY,EAAa,GAAA,CAAKC,CAAAA,EAAMA,EAAE,UAAU,CAAA,CAAE,IAAA,EAAK,CAC/DE,CAAAA,CAAcrB,EAAAA,CAClBC,EACAC,CAAAA,CACAc,CAAAA,CACAZ,EACAC,CAAAA,CACAC,CACF,EAEMgB,CAAAA,CAAgBvB,EAAAA,CAAY,GAAA,CAAI1D,CAAAA,CAAK,OAAO,CAAA,CAClD,GAAIiF,CAAAA,EAAiBA,CAAAA,CAAc,cAAgBD,CAAAA,CAAa,CAE9Db,GACEc,CAAAA,CACAZ,CAAAA,CACAT,CAAAA,CACAC,CAAAA,CACAc,CAAAA,CAAe,GAAA,CAAK/M,GAAMA,CAAAA,CAAE,EAAE,CAChC,CAAA,CAEA,MACF,CAGA,IAAMsN,CAAAA,CAAOvK,CAAAA,CAAK,KAAA,CAAQA,CAAAA,CAAK,MAAA,CACzBwK,EAAiD,CACrD,CAAA,CACA,EAAID,CAAAA,CACJ,CAAA,CAAIA,EAAO,CAAA,CACX,CAAA,CAAIA,CAAAA,CAAO,CAAA,CACX,CAAA,CAAIA,CAAAA,CAAO,CACb,CAAA,CACME,CAAAA,CAASD,EAAK,CAAC,CAAA,CAAIxK,EAAK,KAAA,CAAQ,CAAA,CAEtC,SAAS0K,CAAAA,CAAgBC,CAAAA,CAAsC,CAC7D,IAAIC,CAAAA,CAAI5K,CAAAA,CAAK,OAAS,EAAA,CAEtB,OAAO2K,EAAM,GAAA,CAAKvM,CAAAA,EAAS,CACzB,IAAMwL,CAAAA,CAAO,CAAE,GAAGxL,CAAAA,CAAM,EAAAwM,CAAE,CAAA,CAC1B,OAAAA,CAAAA,EAAK5K,CAAAA,CAAK,KAAA,CAAQA,CAAAA,CAAK,OAAA,CAEhB4J,CACT,CAAC,CACH,CAEA,IAAMiB,CAAAA,CAAYH,CAAAA,CAChBzB,EAAS,GAAA,CAAK6B,CAAAA,EAAM,CAClB,IAAMC,CAAAA,CAAQhB,CAAAA,CAAW,MAAM,IAAA,CAAMI,CAAAA,EAAMA,EAAE,GAAA,GAAQW,CAAC,EACtD,OAAO,CACL,EAAA,CAAIA,CAAAA,CACJ,KAAA,CAAOpM,EAAAA,CAASqM,GAAO,IAAA,EAAM,KAAA,EAASD,EAAG9K,CAAAA,CAAK,aAAa,CAC7D,CACF,CAAC,CACH,CAAA,CACMgL,CAAAA,CAAaN,CAAAA,CACjBxB,EAAU,GAAA,CAAK4B,CAAAA,EAAM,CACnB,IAAMG,CAAAA,CAAQlB,EAAW,WAAA,CAAY,IAAA,CAAMmB,CAAAA,EAAMA,CAAAA,CAAE,EAAA,GAAOJ,CAAC,EAC3D,OAAO,CACL,GAAIA,CAAAA,CACJ,KAAA,CAAOpM,GAASuM,CAAAA,EAAO,IAAA,EAAM,KAAA,EAASH,CAAAA,CAAG9K,CAAAA,CAAK,aAAa,CAC7D,CACF,CAAC,CACH,CAAA,CACMmL,CAAAA,CAAkBT,EACtBV,CAAAA,CAAe,GAAA,CAAK/M,CAAAA,GAAO,CACzB,EAAA,CAAIA,CAAAA,CAAE,GACN,KAAA,CAAOyB,EAAAA,CAASzB,EAAE,IAAA,EAAM,KAAA,EAASA,EAAE,EAAA,CAAI+C,CAAAA,CAAK,aAAa,CAAA,CACzD,MAAA,CAAQ/C,EAAE,MAAA,CACV,QAAA,CAAUA,EAAE,QACd,CAAA,CAAE,CACJ,CAAA,CACMmO,CAAAA,CAAaV,CAAAA,CACjB,CAAC,GAAGtB,CAAAA,CAAO,SAAS,CAAA,CAAE,IAAI,CAAC,CAACzM,EAAI4M,CAAC,CAAA,IAAO,CACtC,EAAA,CAAA5M,CAAAA,CACA,IAAA,CAAM4M,EAAE,IAAA,CACR,cAAA,CAAgBA,EAAE,cAAA,CAClB,MAAA,CAAQA,EAAE,MACZ,CAAA,CAAE,CACJ,CAAA,CACM8B,CAAAA,CAAkBX,CAAAA,CACtBrB,EAAY,GAAA,CAAK1M,CAAAA,EAAO,CACtB,IAAM2O,CAAAA,CAAOvB,EAAW,YAAA,CAAa,IAAA,CAAMR,CAAAA,EAAMA,CAAAA,CAAE,EAAA,GAAO5M,CAAE,EAC5D,OAAO,CACL,GAAAA,CAAAA,CACA,KAAA,CAAO+B,GAAS4M,CAAAA,EAAM,IAAA,EAAM,KAAA,EAAS3O,CAAAA,CAAIqD,CAAAA,CAAK,aAAa,CAC7D,CACF,CAAC,CACH,CAAA,CAEMuL,CAAAA,CAAU,KAAK,GAAA,CACnBV,CAAAA,CAAU,MAAA,CACVG,CAAAA,CAAW,MAAA,CACXG,CAAAA,CAAgB,OAChBC,CAAAA,CAAW,MAAA,CACXC,EAAgB,MAAA,CAChB,CACF,EACMG,CAAAA,CAASxL,CAAAA,CAAK,MAAA,CAAS,EAAA,CAAKuL,CAAAA,EAAWvL,CAAAA,CAAK,MAAQA,CAAAA,CAAK,OAAA,CAAA,CAAW,EAE1EqF,CAAAA,CAAK,OAAA,CAAQ,iBAAgB,CAC7BA,CAAAA,CAAK,QAAQ,YAAA,CAAa,SAAA,CAAW,OAAOoF,CAAM,CAAA,CAAA,EAAIe,CAAM,CAAA,CAAE,CAAA,CAE9DnG,EAAK,OAAA,CAAQ,YAAA,CACX,YAAA,CACA,CAAA,kBAAA,EAAqB4D,CAAAA,CAAS,MAAM,WAAWC,CAAAA,CAAU,MAAM,iBAC1Dc,CAAAA,CAAe,MAAM,iBAAiBZ,CAAAA,CAAO,IAAI,CAAA,eAAA,EAAkBC,CAAAA,CAAY,MAAM,CAAA,UAAA,CAC5F,EAGA,IAAMoC,CAAAA,CAAU,CAAC,OAAA,CAAS,aAAA,CAAe,cAAe,MAAA,CAAQ,WAAW,CAAA,CAC3E,IAAA,GAAW,CAACC,CAAAA,CAAGrK,CAAK,CAAA,GAAKoK,CAAAA,CAAQ,SAAQ,CAAG,CAC1C,IAAMrB,CAAAA,CAAO,QAAA,CAAS,eAAA,CAAgB,4BAAA,CAA8B,MAAM,CAAA,CAC1EA,EAAK,YAAA,CAAa,GAAA,CAAK,OAAOI,CAAAA,CAAKkB,CAAC,GAAK,CAAC,CAAC,CAAA,CAC3CtB,CAAAA,CAAK,YAAA,CAAa,GAAA,CAAK,IAAI,CAAA,CAC3BA,CAAAA,CAAK,aAAa,MAAA,CAAQrK,CAAAA,CAAE,MAAM,CAAA,CAClCqK,CAAAA,CAAK,YAAA,CAAa,WAAA,CAAa,MAAA,CAAOpK,CAAAA,CAAK,QAAQ,CAAC,CAAA,CACpDoK,EAAK,YAAA,CAAa,aAAA,CAAerK,EAAE,IAAI,CAAA,CACvCqK,CAAAA,CAAK,WAAA,CAAc/I,CAAAA,CACnBgE,CAAAA,CAAK,QAAQ,WAAA,CAAY+E,CAAI,EAC/B,CAGA,IAAMuB,EAAuB,CAAE,WAAA,CAAAtB,EAAa,KAAA,CAAO,IAAI,GAAM,CAAA,CAG7D,SAASuB,EACP/J,CAAAA,CACAgK,CAAAA,CACAC,EACAC,CAAAA,CACA1K,CAAAA,CACAY,CAAAA,CACA+J,CAAAA,CACAnC,CAAAA,CACAoC,CAAAA,CACA,CACA,IAAMC,CAAAA,CAAI,SAAS,eAAA,CAAgB,4BAAA,CAA8B,GAAG,CAAA,CACpE,GAAID,CAAAA,CAAS,CACX,IAAME,CAAAA,CAAQ,SAAS,eAAA,CACrB,4BAAA,CACA,OACF,CAAA,CACAA,CAAAA,CAAM,YAAcF,CAAAA,CACpBC,CAAAA,CAAE,WAAA,CAAYC,CAAK,EACrB,CACA,IAAMC,CAAAA,CAAO,QAAA,CAAS,gBAAgB,4BAAA,CAA8B,MAAM,EAC1EA,CAAAA,CAAK,YAAA,CAAa,GAAA,CAAK,MAAA,CAAOP,CAAC,CAAC,EAChCO,CAAAA,CAAK,YAAA,CAAa,IAAK,MAAA,CAAON,CAAAA,CAAK,CAAC,CAAC,CAAA,CACrCM,CAAAA,CAAK,YAAA,CAAa,OAAA,CAAS,MAAA,CAAOpM,EAAK,KAAK,CAAC,EAC7CoM,CAAAA,CAAK,YAAA,CAAa,SAAU,MAAA,CAAOpM,CAAAA,CAAK,KAAK,CAAC,CAAA,CAC9CoM,CAAAA,CAAK,aAAa,IAAA,CAAM,GAAG,EAC3BA,CAAAA,CAAK,YAAA,CAAa,OAAQvC,CAAAA,CAAU,CAAA,EAAG5H,CAAK,CAAA,EAAA,CAAA,CAAO,MAAM,CAAA,CACzDmK,EAAK,YAAA,CAAa,QAAA,CAAUnK,CAAK,CAAA,CACjCmK,CAAAA,CAAK,aAAa,cAAA,CAAgBvC,CAAAA,CAAU,IAAM,GAAG,CAAA,CACrDuC,EAAK,YAAA,CAAa,SAAA,CAAWJ,EAAS,MAAA,CAAS,GAAG,EAClDE,CAAAA,CAAE,WAAA,CAAYE,CAAI,CAAA,CAElB,IAAMhC,CAAAA,CAAO,SAAS,eAAA,CAAgB,4BAAA,CAA8B,MAAM,CAAA,CAC1E,OAAAA,EAAK,YAAA,CAAa,GAAA,CAAK,MAAA,CAAOyB,CAAAA,CAAI,CAAC,CAAC,EACpCzB,CAAAA,CAAK,YAAA,CAAa,IAAK,MAAA,CAAO0B,CAAAA,CAAK,CAAC,CAAC,CAAA,CACrC1B,CAAAA,CAAK,YAAA,CAAa,MAAA,CAAQnI,CAAK,EAC/BmI,CAAAA,CAAK,YAAA,CAAa,YAAa,MAAA,CAAOpK,CAAAA,CAAK,QAAQ,CAAC,CAAA,CACpDoK,CAAAA,CAAK,YAAA,CAAa,aAAA,CAAerK,CAAAA,CAAE,IAAI,CAAA,CACvCqK,CAAAA,CAAK,aAAa,SAAA,CAAW4B,CAAAA,CAAS,OAAS,GAAG,CAAA,CAClD5B,CAAAA,CAAK,WAAA,CAAc/I,CAAAA,CACnB6K,CAAAA,CAAE,YAAY9B,CAAI,CAAA,CAElB/E,EAAK,OAAA,CAAQ,WAAA,CAAY6G,CAAC,CAAA,CAG1BP,CAAAA,CAAS,KAAA,CAAM,GAAA,CAAI,CAAA,EAAG9J,CAAG,IAAIkK,CAAM,CAAA,CAAA,CAAI,CAAE,CAAA,CAAAG,CAAAA,CAAG,KAAAE,CAAAA,CAAM,IAAA,CAAAhC,CAAK,CAAC,CAAA,CAEjD,CAAE,KAAMyB,CAAAA,CAAI7L,CAAAA,CAAK,MAAQ,CAAA,CAAG,IAAA,CAAM8L,CAAG,CAC9C,CAEA,SAASO,CAAAA,CACPC,CAAAA,CACAC,EACAC,CAAAA,CACAC,CAAAA,CACAxK,EACA+J,CAAAA,CACA,CACA,IAAMnF,CAAAA,CAAO,QAAA,CAAS,eAAA,CAAgB,4BAAA,CAA8B,MAAM,CAAA,CAC1EA,EAAK,YAAA,CAAa,IAAA,CAAM,OAAOyF,CAAE,CAAC,EAClCzF,CAAAA,CAAK,YAAA,CAAa,IAAA,CAAM,MAAA,CAAO0F,CAAE,CAAC,EAClC1F,CAAAA,CAAK,YAAA,CAAa,KAAM,MAAA,CAAO2F,CAAE,CAAC,CAAA,CAClC3F,CAAAA,CAAK,YAAA,CAAa,IAAA,CAAM,MAAA,CAAO4F,CAAE,CAAC,CAAA,CAClC5F,CAAAA,CAAK,aAAa,QAAA,CAAU5E,CAAK,EACjC4E,CAAAA,CAAK,YAAA,CAAa,cAAA,CAAgB,GAAG,CAAA,CACrCA,CAAAA,CAAK,aAAa,kBAAA,CAAoB,KAAK,EAC3CA,CAAAA,CAAK,YAAA,CAAa,UAA4B,KAAK,CAAA,CACnDxB,CAAAA,CAAK,OAAA,CAAQ,YAAYwB,CAAI,EAC/B,CAGA,IAAM6F,CAAAA,CAAgB,IAAI,GAAA,CACpBC,CAAAA,CAAiB,IAAI,GAAA,CACrBC,CAAAA,CAAsB,IAAI,IAC1BC,CAAAA,CAAe,IAAI,IAGzB,IAAA,IAAW1C,CAAAA,IAAKU,EAAW,CACzB,IAAMhB,CAAAA,CAAUH,CAAAA,CAAS,oBAAA,CAAqB,GAAA,CAAIS,EAAE,EAAE,CAAA,CAChDY,EAAQhB,CAAAA,CAAW,KAAA,CAAM,KAAM+C,CAAAA,EAAOA,CAAAA,CAAG,MAAQ3C,CAAAA,CAAE,EAAE,GAAG,IAAA,CACxD4C,CAAAA,CAAMnB,EACV,CAAA,CACApB,CAAAA,CAAK,CAAC,CAAA,CACNL,CAAAA,CAAE,CAAA,CACFA,CAAAA,CAAE,EAAA,CACFA,CAAAA,CAAE,MACFpK,CAAAA,CAAE,IAAA,CACF,MACA8J,CAAAA,CACAkB,CAAAA,EAAO,WACT,CAAA,CACA2B,CAAAA,CAAc,GAAA,CAAIvC,CAAAA,CAAE,EAAA,CAAI4C,CAAG,EAC7B,CAGA,IAAA,IAAW7B,KAAKF,CAAAA,CAAY,CAC1B,IAAMnB,CAAAA,CAAUH,CAAAA,CAAS,2BAAA,CAA4B,GAAA,CAAIwB,CAAAA,CAAE,EAAE,EACvDD,CAAAA,CAAQlB,CAAAA,CAAW,YAAY,IAAA,CAAMiD,CAAAA,EAAOA,EAAG,EAAA,GAAO9B,CAAAA,CAAE,EAAE,CAAA,EAAG,IAAA,CAC7D6B,CAAAA,CAAMnB,EACV,CAAA,CACApB,CAAAA,CAAK,CAAC,CAAA,CACNU,CAAAA,CAAE,EACFA,CAAAA,CAAE,EAAA,CACFA,CAAAA,CAAE,KAAA,CACFnL,CAAAA,CAAE,MAAA,CACF,MACA8J,CAAAA,CACAoB,CAAAA,EAAO,WACT,CAAA,CACA0B,CAAAA,CAAe,IAAIzB,CAAAA,CAAE,EAAA,CAAI6B,CAAG,EAC9B,CAGA,IAAA,IAAW9P,KAAKkO,CAAAA,CAAiB,CAC/B,IAAMtB,CAAAA,CAAUH,CAAAA,CAAS,0BAA0B,GAAA,CAAIzM,CAAAA,CAAE,EAAE,CAAA,CACrDgQ,CAAAA,CAAQjD,CAAAA,CAAe,KAAMkD,CAAAA,EAAOA,CAAAA,CAAG,KAAOjQ,CAAAA,CAAE,EAAE,GAAG,IAAA,CACrD8P,CAAAA,CAAMnB,EACV,CAAA,CACApB,CAAAA,CAAK,CAAC,CAAA,CACNvN,CAAAA,CAAE,EACFA,CAAAA,CAAE,EAAA,CACFA,EAAE,KAAA,CACFgQ,CAAAA,EAAO,KAAA,GAAUhQ,CAAAA,CAAE,MAAA,CAAS8C,CAAAA,CAAE,OAASA,CAAAA,CAAE,KAAA,CAAA,CACzC,CAAC9C,CAAAA,CAAE,MAAA,CACH4M,EACAoD,CAAAA,EAAO,WACT,CAAA,CACAL,CAAAA,CAAoB,GAAA,CAAI3P,CAAAA,CAAE,GAAI8P,CAAG,EACnC,CAGA,IAAA,IAAWxD,CAAAA,IAAK6B,EAAY,CAC1B,IAAMnJ,CAAAA,CAAQsH,CAAAA,CAAE,MAAA,GAAW,OAAA,CAAUxJ,EAAE,GAAA,CAAMA,CAAAA,CAAE,OACzCgN,CAAAA,CAAMnB,CAAAA,CACV,EACApB,CAAAA,CAAK,CAAC,CAAA,CACNjB,CAAAA,CAAE,CAAA,CACFA,CAAAA,CAAE,GACF7K,EAAAA,CAAS6K,CAAAA,CAAE,KAAMvJ,CAAAA,CAAK,aAAa,EACnCiC,CAAAA,CACA,KAAA,CACA,KACF,CAAA,CACA4K,CAAAA,CAAa,GAAA,CAAItD,EAAE,EAAA,CAAIwD,CAAG,EAC5B,CAGA,IAAA,IAAWxD,KAAK8B,CAAAA,CAAiB,CAC/B,IAAM8B,CAAAA,CAAWjD,CAAAA,CAAa,IAAA,CAAMC,GAAMA,CAAAA,CAAE,UAAA,GAAeZ,EAAE,EAAE,CAAA,CACzD6D,EAAQrD,CAAAA,CAAW,YAAA,CAAa,IAAA,CAAMsD,CAAAA,EAAOA,CAAAA,CAAG,EAAA,GAAO9D,EAAE,EAAE,CAAA,EAAG,KACpEqC,CAAAA,CACE,CAAA,CACApB,EAAK,CAAC,CAAA,CACNjB,EAAE,CAAA,CACFA,CAAAA,CAAE,GACFA,CAAAA,CAAE,KAAA,CACF6D,GAAO,KAAA,GAAUD,CAAAA,CAAWpN,EAAE,KAAA,CAAQA,CAAAA,CAAE,KAAA,CAAA,CACxC,CAACoN,CAAAA,CACD,KAAA,CACAC,GAAO,WACT,EACF,CAGA,IAAA,IAAWlC,CAAAA,IAAKF,EAAY,CAC1B,IAAMpO,CAAAA,CAAO8M,CAAAA,CAAS,cAAA,CAAe,GAAA,CAAIwB,EAAE,EAAE,CAAA,CACvCoC,EAAOX,CAAAA,CAAe,GAAA,CAAIzB,EAAE,EAAE,CAAA,CACpC,GAAItO,CAAAA,EAAQ0Q,CAAAA,CACV,IAAA,IAAWC,KAAO3Q,CAAAA,CAAM,CACtB,IAAM4Q,CAAAA,CAAOd,CAAAA,CAAc,IAAIa,CAAG,CAAA,CAC9BC,CAAAA,EACFnB,CAAAA,CACEmB,CAAAA,CAAK,IAAA,CAAOxN,EAAK,KAAA,CAAQ,CAAA,CACzBwN,EAAK,IAAA,CACLF,CAAAA,CAAK,KAAOtN,CAAAA,CAAK,KAAA,CAAQ,CAAA,CACzBsN,CAAAA,CAAK,IAAA,CACLvN,CAAAA,CAAE,MAEJ,EAEJ,CAEJ,CAGA,IAAA,IAAWwJ,KAAK6B,CAAAA,CAAY,CAC1B,IAAMqC,CAAAA,CAAOb,CAAAA,CAAoB,GAAA,CAAIrD,EAAE,cAAc,CAAA,CAC/CmE,EAAOb,CAAAA,CAAa,GAAA,CAAItD,EAAE,EAAE,CAAA,CAC9BkE,CAAAA,EAAQC,CAAAA,EACVrB,CAAAA,CACEoB,CAAAA,CAAK,KAAOzN,CAAAA,CAAK,KAAA,CAAQ,EACzByN,CAAAA,CAAK,IAAA,CACLC,EAAK,IAAA,CAAO1N,CAAAA,CAAK,MAAQ,CAAA,CACzB0N,CAAAA,CAAK,KACL3N,CAAAA,CAAE,KAEJ,EAEJ,CAGA,QAAWoK,CAAAA,IAAKD,CAAAA,CAAc,CAC5B,IAAMwD,CAAAA,CAAOb,CAAAA,CAAa,IAAI1C,CAAAA,CAAE,EAAE,EAClC,GAAIuD,CAAAA,CAAM,CACR,IAAMC,CAAAA,CAAKtC,CAAAA,CAAgB,IAAA,CAAMuC,CAAAA,EAAMA,CAAAA,CAAE,KAAOzD,CAAAA,CAAE,UAAU,EACxDwD,CAAAA,EACFtB,CAAAA,CACEqB,EAAK,IAAA,CAAO1N,CAAAA,CAAK,KAAA,CAAQ,CAAA,CACzB0N,CAAAA,CAAK,IAAA,CACLlD,EAAK,CAAC,CAAA,CACNmD,EAAG,CAAA,CACH5N,CAAAA,CAAE,KAEJ,EAEJ,CACF,CAGAgJ,EAAAA,CAAY,GAAA,CAAI1D,EAAK,OAAA,CAASsG,CAAQ,EACxC,CAGO,SAASkC,GAAuBnE,CAAAA,CAAoB,CACrDA,CAAAA,CAAS,cAAA,EACX,YAAA,CAAaA,CAAAA,CAAS,cAAc,CAAA,CAEtCA,CAAAA,CAAS,eAAiB,UAAA,CAAW,IAAM,CACzCA,CAAAA,CAAS,oBAAA,CAAqB,KAAA,EAAM,CACpCA,CAAAA,CAAS,2BAAA,CAA4B,OAAM,CAC3CA,CAAAA,CAAS,0BAA0B,KAAA,EAAM,CACzCA,EAAS,cAAA,CAAiB,KAC5B,CAAA,CAAG,GAAG,EACR,CAOO,SAASoE,EAAAA,CAAezI,CAAAA,CAAiB0I,EAAyB,CACvE,IAAMC,EAAUD,CAAAA,CAAS,OAAA,CAAQ,SAAQ,CACzC,GAAIC,EAAQ,MAAA,GAAW,CAAA,CACrB,OAGF3I,CAAAA,CAAK,WAAA,CAAY,iBAAgB,CAGjC,IAAI4I,CAAAA,CAAQ,MAAA,CAAO,iBAAA,CACfC,CAAAA,CAAQ,OAAO,iBAAA,CACnB,IAAA,IAAWpK,KAAKkK,CAAAA,CACVlK,CAAAA,CAAE,QAAUmK,CAAAA,GACdA,CAAAA,CAAQnK,CAAAA,CAAE,OAAA,CAAA,CAERA,CAAAA,CAAE,KAAA,CAAQoK,IACZA,CAAAA,CAAQpK,CAAAA,CAAE,OAId,IAAMqC,CAAAA,CAAM,YAAY,GAAA,EAAI,CAC5B,IAAA,IAAWgI,CAAAA,IAAWJ,CAAAA,CAAS,QAAA,CAAS,QAAO,CACzCI,CAAAA,CAAUF,IACZA,CAAAA,CAAQE,CAAAA,CAAAA,CAENhI,EAAM+H,CAAAA,GACRA,CAAAA,CAAQ/H,CAAAA,CAAAA,CAIZ,IAAMiI,CAAAA,CAAQF,CAAAA,CAAQD,GAAS,CAAA,CACzBI,CAAAA,CAAWlP,GAAiBE,EAAAA,CAAmB,EAAA,CAG/CiP,EAA0B,EAAC,CAC3BC,CAAAA,CAAO,IAAI,GAAA,CACjB,IAAA,IAAWzK,KAAKkK,CAAAA,CACTO,CAAAA,CAAK,IAAIzK,CAAAA,CAAE,QAAQ,IACtByK,CAAAA,CAAK,GAAA,CAAIzK,CAAAA,CAAE,QAAQ,CAAA,CACnBwK,CAAAA,CAAc,KAAKxK,CAAAA,CAAE,QAAQ,GAIjC,IAAA,IAAWzG,CAAAA,IAAY0Q,EAAS,QAAA,CAAS,IAAA,EAAK,CACvCQ,CAAAA,CAAK,GAAA,CAAIlR,CAAQ,IACpBkR,CAAAA,CAAK,GAAA,CAAIlR,CAAQ,CAAA,CACjBiR,CAAAA,CAAc,KAAKjR,CAAQ,CAAA,CAAA,CAM/B,IAAMmR,CAAAA,CAAmBF,CAAAA,CAAc,MAAM,GAAQ,EAC/C9C,CAAAA,CAASpM,EAAAA,CAAiBoP,EAAiB,MAAA,CAAS,EAAA,CAC1DnJ,CAAAA,CAAK,WAAA,CAAY,YAAA,CAAa,SAAA,CAAW,OAAOlG,EAAc,CAAA,CAAA,EAAIqM,CAAM,CAAA,CAAE,CAAA,CAC1EnG,EAAK,WAAA,CAAY,YAAA,CAAa,QAAA,CAAU,MAAA,CAAO,IAAA,CAAK,GAAA,CAAImG,EAAQ,GAAG,CAAC,CAAC,CAAA,CAGrE,IAAMiD,EAAU,CAAA,CAChB,IAAA,IAAS/C,CAAAA,CAAI,CAAA,CAAGA,CAAAA,EAAK+C,CAAAA,CAAS/C,IAAK,CACjC,IAAMG,EAAIxM,EAAAA,CAAoBgP,CAAAA,CAAW3C,EAAK+C,CAAAA,CACxCC,CAAAA,CAAMN,CAAAA,CAAQ1C,CAAAA,CAAK+C,CAAAA,CACnBrE,CAAAA,CAAO,SAAS,eAAA,CAAgB,4BAAA,CAA8B,MAAM,CAAA,CAC1EA,CAAAA,CAAK,aAAa,GAAA,CAAK,MAAA,CAAOyB,CAAC,CAAC,CAAA,CAChCzB,CAAAA,CAAK,aAAa,GAAA,CAAK,GAAG,EAC1BA,CAAAA,CAAK,YAAA,CAAa,OAAQrK,CAAAA,CAAE,KAAK,CAAA,CACjCqK,CAAAA,CAAK,YAAA,CAAa,WAAA,CAAa,GAAG,CAAA,CAClCA,CAAAA,CAAK,aAAa,aAAA,CAAerK,CAAAA,CAAE,IAAI,CAAA,CACvCqK,CAAAA,CAAK,YAAA,CAAa,aAAA,CAAe,QAAQ,CAAA,CACzCA,EAAK,WAAA,CACHsE,CAAAA,CAAK,IAAO,CAAA,EAAGA,CAAAA,CAAG,QAAQ,CAAC,CAAC,KAAO,CAAA,EAAA,CAAIA,CAAAA,CAAK,KAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA,CAC9DrJ,CAAAA,CAAK,YAAY,WAAA,CAAY+E,CAAI,CAAA,CAGjC,IAAMvD,CAAAA,CAAO,QAAA,CAAS,gBAAgB,4BAAA,CAA8B,MAAM,EAC1EA,CAAAA,CAAK,YAAA,CAAa,KAAM,MAAA,CAAOgF,CAAC,CAAC,CAAA,CACjChF,CAAAA,CAAK,YAAA,CAAa,KAAM,IAAI,CAAA,CAC5BA,EAAK,YAAA,CAAa,IAAA,CAAM,OAAOgF,CAAC,CAAC,CAAA,CACjChF,CAAAA,CAAK,YAAA,CAAa,IAAA,CAAM,OAAO2E,CAAM,CAAC,EACtC3E,CAAAA,CAAK,YAAA,CAAa,SAAU9G,CAAAA,CAAE,MAAM,CAAA,CACpC8G,CAAAA,CAAK,YAAA,CAAa,cAAA,CAAgB,KAAK,CAAA,CACvCxB,CAAAA,CAAK,YAAY,WAAA,CAAYwB,CAAI,EACnC,CAGA,IAAA,IAAShC,CAAAA,CAAM,CAAA,CAAGA,CAAAA,CAAM2J,CAAAA,CAAiB,OAAQ3J,CAAAA,EAAAA,CAAO,CACtD,IAAMxH,CAAAA,CAAWmR,CAAAA,CAAiB3J,CAAG,CAAA,CAC/B+F,CAAAA,CAAI,EAAA,CAAK/F,CAAAA,CAAMzF,EAAAA,CACfuP,CAAAA,CAAW9J,EAAMtF,EAAAA,CAAgB,MAAA,CACjC0C,EAAQ1C,EAAAA,CAAgBoP,CAAQ,EAGhCtN,CAAAA,CAAQ,QAAA,CAAS,eAAA,CACrB,4BAAA,CACA,MACF,CAAA,CACAA,EAAM,YAAA,CAAa,GAAA,CAAK,OAAOhC,EAAAA,CAAmB,CAAC,CAAC,CAAA,CACpDgC,CAAAA,CAAM,aAAa,GAAA,CAAK,MAAA,CAAOuJ,EAAIxL,EAAAA,CAAiB,CAAA,CAAI,CAAC,CAAC,CAAA,CAC1DiC,EAAM,YAAA,CAAa,MAAA,CAAQtB,CAAAA,CAAE,KAAK,CAAA,CAClCsB,CAAAA,CAAM,aAAa,WAAA,CAAa,GAAG,EACnCA,CAAAA,CAAM,YAAA,CAAa,cAAetB,CAAAA,CAAE,IAAI,CAAA,CACxCsB,CAAAA,CAAM,YAAA,CAAa,aAAA,CAAe,KAAK,CAAA,CACvCA,CAAAA,CAAM,YAAc3C,EAAAA,CAASrB,CAAAA,CAAU,EAAE,CAAA,CACzCgI,CAAAA,CAAK,WAAA,CAAY,WAAA,CAAYhE,CAAK,CAAA,CAGlC,IAAMuN,CAAAA,CAAkBZ,CAAAA,CAAQ,OAAQlK,CAAAA,EAAMA,CAAAA,CAAE,WAAazG,CAAQ,CAAA,CACrE,IAAA,IAAWY,CAAAA,IAAS2Q,CAAAA,CAAiB,CACnC,IAAM/C,CAAAA,CAAIxM,EAAAA,CAAAA,CAAqBpB,EAAM,OAAA,CAAUgQ,CAAAA,EAASG,EAASC,CAAAA,CAC3DQ,CAAAA,CAAI,IAAA,CAAK,GAAA,CAAA,CACX5Q,CAAAA,CAAM,KAAA,CAAQA,EAAM,OAAA,EAAWmQ,CAAAA,CAASC,EAC1C/O,EACF,CAAA,CAEM8M,EAAO,QAAA,CAAS,eAAA,CACpB,4BAAA,CACA,MACF,CAAA,CACAA,CAAAA,CAAK,aAAa,GAAA,CAAK,MAAA,CAAOP,CAAC,CAAC,CAAA,CAChCO,EAAK,YAAA,CAAa,GAAA,CAAK,MAAA,CAAOxB,CAAAA,CAAI,CAAC,CAAC,EACpCwB,CAAAA,CAAK,YAAA,CAAa,QAAS,MAAA,CAAOyC,CAAC,CAAC,CAAA,CACpCzC,CAAAA,CAAK,aAAa,QAAA,CAAU,MAAA,CAAOhN,GAAiB,CAAC,CAAC,EACtDgN,CAAAA,CAAK,YAAA,CAAa,KAAM,GAAG,CAAA,CAC3BA,CAAAA,CAAK,YAAA,CAAa,MAAA,CAAQnO,CAAAA,CAAM,MAAQ8B,CAAAA,CAAE,GAAA,CAAMkC,CAAK,CAAA,CACrDmK,CAAAA,CAAK,aAAa,SAAA,CAAW,KAAK,CAAA,CAGlC,IAAMD,CAAAA,CAAQ,QAAA,CAAS,gBACrB,4BAAA,CACA,OACF,EACM2C,CAAAA,CAAa7Q,CAAAA,CAAM,MAAQA,CAAAA,CAAM,OAAA,CACvCkO,CAAAA,CAAM,WAAA,CAAc,CAAA,EAAG9O,CAAQ,KAAKyR,CAAAA,CAAW,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,EAAK7Q,EAAM,KAAA,CAAQ,UAAA,CAAa,EAAE,CAAA,CAAA,CAC3FmO,CAAAA,CAAK,WAAA,CAAYD,CAAK,CAAA,CAEtB9G,CAAAA,CAAK,YAAY,WAAA,CAAY+G,CAAI,EACnC,CAGA,IAAM2C,CAAAA,CAAgBhB,CAAAA,CAAS,QAAA,CAAS,GAAA,CAAI1Q,CAAQ,CAAA,CACpD,GAAI0R,IAAkB,MAAA,CAAW,CAC/B,IAAMlD,CAAAA,CAAIxM,EAAAA,CAAAA,CAAqB0P,CAAAA,CAAgBd,CAAAA,EAASG,CAAAA,CAASC,CAAAA,CAC3DQ,EAAI,IAAA,CAAK,GAAA,CAAA,CACX1I,EAAM4I,CAAAA,EAAiBX,CAAAA,CAASC,EAClC/O,EACF,CAAA,CAEM8M,CAAAA,CAAO,QAAA,CAAS,eAAA,CACpB,4BAAA,CACA,MACF,CAAA,CACAA,CAAAA,CAAK,aAAa,GAAA,CAAK,MAAA,CAAOP,CAAC,CAAC,CAAA,CAChCO,EAAK,YAAA,CAAa,GAAA,CAAK,OAAOxB,CAAAA,CAAI,CAAC,CAAC,CAAA,CACpCwB,CAAAA,CAAK,aAAa,OAAA,CAAS,MAAA,CAAOyC,CAAC,CAAC,CAAA,CACpCzC,CAAAA,CAAK,aAAa,QAAA,CAAU,MAAA,CAAOhN,GAAiB,CAAC,CAAC,EACtDgN,CAAAA,CAAK,YAAA,CAAa,IAAA,CAAM,GAAG,CAAA,CAC3BA,CAAAA,CAAK,aAAa,MAAA,CAAQnK,CAAK,EAC/BmK,CAAAA,CAAK,YAAA,CAAa,UAAW,KAAK,CAAA,CAClCA,CAAAA,CAAK,YAAA,CAAa,QAAA,CAAUnK,CAAK,EACjCmK,CAAAA,CAAK,YAAA,CAAa,eAAgB,GAAG,CAAA,CACrCA,EAAK,YAAA,CAAa,kBAAA,CAAoB,KAAK,CAAA,CAE3C,IAAMD,CAAAA,CAAQ,SAAS,eAAA,CACrB,4BAAA,CACA,OACF,CAAA,CACAA,CAAAA,CAAM,YAAc,CAAA,EAAG9O,CAAQ,CAAA,WAAA,EAAA,CAAe8I,CAAAA,CAAM4I,CAAAA,EAAe,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,CAAA,CAC7E3C,EAAK,WAAA,CAAYD,CAAK,EAEtB9G,CAAAA,CAAK,WAAA,CAAY,WAAA,CAAY+G,CAAI,EACnC,CACF,CAGA/G,CAAAA,CAAK,WAAA,CAAY,aACf,YAAA,CACA,CAAA,UAAA,EAAa2I,EAAQ,MAAM,CAAA,4BAAA,EAA+BQ,CAAAA,CAAiB,MAAM,CAAA,UAAA,CACnF,EACF,CC/nBA,SAASQ,EAAAA,EAAqD,CAC5D,GAAI,OAAO,OAAW,GAAA,CACpB,OAAO,CACL,OAAA,CAAS,IAAI,IACb,SAAA,CAAW,IAAM,KACjB,UAAA,CAAY,IAAM,EAAC,CACnB,OAAA,CAAS,IAAM,IAAA,CACf,SAAA,CAAW,IAAM,EAAC,CAClB,OAAA,CAAS,IAAM,IAAA,CACf,aAAA,CAAe,IAAM,IAAA,CACrB,aAAA,CAAe,IAAM,KAAA,CACrB,WAAA,CAAa,IAAM,CAAC,CAAA,CACpB,SAAA,CAAW,IAAM,IAAM,CAAC,CAC1B,CAAA,CAGF,GAAI,CAAC,MAAA,CAAO,aAAA,CAAe,CACzB,IAAMC,CAAAA,CAAU,IAAI,IAEdC,CAAAA,CAA4C,CAChD,QAAAD,CAAAA,CACA,SAAA,CAAUE,CAAAA,CAAM,CACd,OAAIA,CAAAA,CACKF,EAAQ,GAAA,CAAIE,CAAI,GAAG,MAAA,EAAU,IAAA,CAExBF,EAAQ,MAAA,EAAO,CAAE,IAAA,EAAK,CAAE,KAAA,EAExB,MAAA,EAAU,IAC1B,CAAA,CACA,UAAA,EAAa,CACX,OAAO,CAAC,GAAGA,CAAAA,CAAQ,IAAA,EAAM,CAC3B,CAAA,CACA,OAAA,CAAQE,EAAM,CACZ,IAAMtQ,EAAS,IAAA,CAAK,SAAA,CAAUsQ,CAAI,CAAA,CAC5BC,CAAAA,CAAID,CAAAA,CAAOF,CAAAA,CAAQ,GAAA,CAAIE,CAAI,EAAIF,CAAAA,CAAQ,MAAA,GAAS,IAAA,EAAK,CAAE,MACvDlF,CAAAA,CAAalL,CAAAA,EAAQ,SAAQ,EAAK,IAAA,CACxC,OAAIkL,CAAAA,EAAcqF,CAAAA,GACfrF,EAAkD,aAAA,CACjDqF,CAAAA,CAAE,cAAgB,MAAA,CAAO,WAAA,CAAYA,CAAAA,CAAE,aAAa,CAAA,CAAI,IAGrDrF,CACT,CAAA,CACA,UAAUoF,CAAAA,CAAM,CACd,OAAIA,CAAAA,CACKF,CAAAA,CAAQ,GAAA,CAAIE,CAAI,CAAA,EAAG,MAAA,CAAO,SAAQ,EAAK,GAElCF,CAAAA,CAAQ,MAAA,GAAS,IAAA,EAAK,CAAE,KAAA,EAExB,MAAA,CAAO,OAAA,EAAQ,EAAK,EACpC,CAAA,CACA,QAAQI,CAAAA,CAAeF,CAAAA,CAAM,CAG3B,OAFe,IAAA,CAAK,SAAA,CAAUA,CAAI,CAAA,EAEnB,OAAA,CAAQE,CAAa,CAAA,EAAK,IAC3C,EACA,SAAA,CAAUC,CAAAA,CAA8BpP,EAAqB,CAC3D,IAAMqP,CAAAA,CAASrP,CAAAA,CACX+O,CAAAA,CAAQ,GAAA,CAAI/O,CAAU,CAAA,CACtB+O,CAAAA,CAAQ,QAAO,CAAE,IAAA,GAAO,KAAA,CAC5B,GAAI,CAACM,CAAAA,CAAQ,CAGX,IAAIC,EAAW,KAAA,CAWTC,CAAAA,CAAQ,YAVA,IAAM,CAClB,IAAMC,CAAAA,CAAIxP,CAAAA,CACN+O,CAAAA,CAAQ,GAAA,CAAI/O,CAAU,CAAA,CACtB+O,EAAQ,MAAA,EAAO,CAAE,MAAK,CAAE,KAAA,CACxBS,GAAK,CAACF,CAAAA,GACRA,EAAW,IAAA,CACXE,CAAAA,CAAE,YAAY,GAAA,CAAIJ,CAAQ,GAE9B,CAAA,CAEiC,GAAG,EAC9BK,CAAAA,CAAO,UAAA,CAAW,IAAM,aAAA,CAAcF,CAAK,CAAA,CAAG,GAAM,CAAA,CAE1D,OAAO,IAAM,CACX,aAAA,CAAcA,CAAK,CAAA,CACnB,YAAA,CAAaE,CAAI,CAAA,CAEjB,IAAA,IAAWP,CAAAA,IAAKH,EAAQ,MAAA,EAAO,CAC7BG,EAAE,WAAA,CAAY,MAAA,CAAOE,CAAQ,EAEjC,CACF,CACA,OAAAC,CAAAA,CAAO,WAAA,CAAY,IAAID,CAAQ,CAAA,CAExB,IAAM,CACXC,CAAAA,CAAO,YAAY,MAAA,CAAOD,CAAQ,EACpC,CACF,CAAA,CACA,aAAA,CAAcH,EAAM,CAClB,IAAMI,EAASJ,CAAAA,CAAOF,CAAAA,CAAQ,IAAIE,CAAI,CAAA,CAAIF,CAAAA,CAAQ,MAAA,EAAO,CAAE,IAAA,GAAO,KAAA,CAClE,OAAKM,EAIE,IAAA,CAAK,SAAA,CAAU,CACpB,OAAA,CAAS,CAAA,CACT,IAAA,CACEJ,CAAAA,EACCF,CAAAA,CAAQ,IAAA,GAAO,IAAA,EAAK,CAAE,OACvB,SAAA,CACF,UAAA,CAAY,KAAK,GAAA,EAAI,CACrB,MAAA,CAAQM,CAAAA,CAAO,MAAA,CAAO,OAAA,EACxB,CAAC,CAAA,CAXQ,IAYX,CAAA,CACA,aAAA,CAAcK,EAAMT,CAAAA,CAAM,CACxB,GAAI,CAEF,GAAIS,EAAK,MAAA,CAAS,EAAA,CAAK,KAAO,IAAA,CAC5B,OAAO,GAET,IAAM7Q,CAAAA,CAAO,IAAA,CAAK,KAAA,CAAM6Q,CAAI,CAAA,CAI5B,GAHI,CAAC7Q,CAAAA,EAAQ,OAAOA,CAAAA,EAAS,QAAA,EAAY,MAAM,OAAA,CAAQA,CAAI,CAAA,EAGvD,CAAC,KAAA,CAAM,OAAA,CAAQA,EAAK,MAAM,CAAA,CAC5B,OAAO,CAAA,CAAA,CAGT,IAAMwQ,EAASJ,CAAAA,CACXF,CAAAA,CAAQ,GAAA,CAAIE,CAAI,CAAA,CAChBF,CAAAA,CAAQ,QAAO,CAAE,IAAA,GAAO,KAAA,CAC5B,GAAI,CAACM,CAAAA,CACH,OAAO,CAAA,CAAA,CAET,IAAMM,CAAAA,CAAYN,CAAAA,CAAO,UACnBO,CAAAA,CAAS/Q,CAAAA,CAAK,OAEdgR,CAAAA,CACJD,CAAAA,CAAO,OAASD,CAAAA,CAAYC,CAAAA,CAAO,MAAA,CAASD,CAAAA,CAAY,CAAA,CAC1DN,CAAAA,CAAO,OAAO,KAAA,EAAM,CACpB,QAAS7D,CAAAA,CAAIqE,CAAAA,CAAOrE,EAAIoE,CAAAA,CAAO,MAAA,CAAQpE,CAAAA,EAAAA,CAAK,CAC1C,IAAMsE,CAAAA,CAAMF,EAAOpE,CAAC,CAAA,CAElBsE,GACA,OAAOA,CAAAA,EAAQ,UACf,CAAC,KAAA,CAAM,OAAA,CAAQA,CAAG,CAAA,EAClB,OAAQA,EAAgC,SAAA,EAAc,QAAA,EACtD,OAAQA,CAAAA,CAAgC,IAAA,EAAS,UAChDA,CAAAA,CAAgC,IAAA,GAAS,aACzCA,CAAAA,CAAgC,IAAA,GAAS,eACzCA,CAAAA,CAAgC,IAAA,GAAS,aAG1CT,CAAAA,CAAO,MAAA,CAAO,KAAK,CACjB,SAAA,CAAYS,CAAAA,CAAgC,SAAA,CAC5C,IAAA,CAAOA,CAAAA,CAAgC,KACvC,IAAA,CAAOA,CAAAA,CAAgC,MAAQ,IACjD,CAAC,EAEL,CAEA,OAAO,CAAA,CACT,CAAA,KAAQ,CACN,OAAO,MACT,CACF,CAAA,CACA,YAAYb,CAAAA,CAAM,CAChB,IAAMI,CAAAA,CAASJ,CAAAA,CAAOF,CAAAA,CAAQ,GAAA,CAAIE,CAAI,CAAA,CAAIF,EAAQ,MAAA,EAAO,CAAE,MAAK,CAAE,KAAA,CAC7DM,GAGLA,CAAAA,CAAO,MAAA,CAAO,KAAA,GAChB,CACF,CAAA,CAIA,cAAO,cAAA,CAAe,MAAA,CAAQ,gBAAiB,CAC7C,KAAA,CAAOL,EACP,QAAA,CAAU,KAAA,CACV,YAAA,CAAc7Q,EAAAA,EAAU,CACxB,UAAA,CAAY,IACd,CAAC,CAAA,CAEM6Q,CACT,CAEA,OAAO,OAAO,aAChB,CAsBO,SAASe,EAAAA,CACdpU,CAAAA,CAAiC,GACtB,CACX,GAAM,CACJ,IAAA,CAAAsT,CAAAA,CAAO,UACP,KAAA,CAAAe,CAAAA,CAAQ,KAAA,CACR,SAAA,CAAWC,CAAAA,CACX,KAAA,CAAOC,EAAe,KAAA,CACtB,QAAA,CAAAjQ,EAAW,cAAA,CACX,WAAA,CAAAC,EAAc,KAChB,CAAA,CAAIvE,EAEEwU,CAAAA,CAAerR,EAAAA,CAAkBmR,CAAY,CAAA,CAC7CG,CAAAA,CAAWtB,IAAa,CACxBuB,CAAAA,CAAuB,CAC3B,MAAA,CAAQ,IAAA,CACR,MAAA,CAAQ,IAAIrS,EAAAA,CAA2BmS,CAAY,EACnD,SAAA,CAAWA,CAAAA,CACX,YAAa,IAAI,GAAA,CACjB,cAAe,IAAI,GACrB,CAAA,CAEAC,CAAAA,CAAS,OAAA,CAAQ,GAAA,CAAInB,EAAMoB,CAAK,CAAA,CAEhC,IAAMC,CAAAA,CAAW,CAACzS,EAAcgB,CAAAA,GAAkB,CAChD,IAAM1C,CAAAA,CAAoB,CAAE,SAAA,CAAW,KAAK,GAAA,EAAI,CAAG,KAAA0B,CAAAA,CAAM,IAAA,CAAAgB,CAAK,CAAA,CAC1DmR,CAAAA,EACFK,CAAAA,CAAM,MAAA,CAAO,IAAA,CAAKlU,CAAK,EAGzB,IAAA,IAAWgM,CAAAA,IAAOkI,EAAM,WAAA,CACtB,GAAI,CACFlI,CAAAA,CAAIhM,CAAK,EACX,CAAA,KAAQ,CAER,CAEJ,EAGIoU,CAAAA,CAA+C,IAAA,CAC7CC,EAAc,IAAI,GAAA,CAClB5K,EAAc,IAAI,GAAA,CAClB6K,CAAAA,CAAmB,IAAI,GAAA,CACvBjK,CAAAA,CAAOzH,IAAkB,CACzByK,CAAAA,CAAWjK,IAAe,CAC1BmR,CAAAA,CAAYhR,IAAqB,CACjCmO,CAAAA,CAAWvO,EAAAA,EAAoB,CAE/BqR,CAAAA,CACJT,CAAAA,EACA,OAAO,MAAA,CAAW,GAAA,EAClB,OAAO,QAAA,CAAa,GAAA,EACpB/R,IAAU,CAGRyS,CAAAA,CAAuB,KACvBC,CAAAA,CAAQ,CAAA,CACNC,EAAU,CAAA,CACVC,CAAAA,CAAU,EACVC,CAAAA,CAAS,CAAA,CACTC,EAAW,CAAA,CACXC,CAAAA,CAAS,EAAA,CACTC,CAAAA,CAAS,EAAA,CACTC,CAAAA,CAAO,GACPC,CAAAA,CAAa,GAAA,CACbC,EAAgB,GAAA,CAGhBC,CAAAA,CAAqB,IAAI,GAAA,CAIzBC,CAAAA,CAAqB,IAAI,GAAA,CASzBC,CAAAA,CAA2B,IAAI,IAC/BC,CAAAA,CAA2B,IAAI,IAGjCC,CAAAA,CAAqC,IAAA,CAEzC,SAASC,CAAAA,CAAoBC,CAAAA,CAAc,CACzChB,CAAAA,EAASgB,CAAAA,CACLjB,CAAAA,GAAU,MAAQ,OAAO,qBAAA,CAA0B,MACrDA,CAAAA,CAAQ,qBAAA,CAAsBkB,CAAiB,CAAA,EAEnD,CAEA,SAASA,CAAAA,EAAoB,CAE3B,GADAlB,EAAQ,IAAA,CACJ,CAACL,GAAS,CAACF,CAAAA,CAAM,OAAQ,CAC3BQ,CAAAA,CAAQ,CAAA,CAER,MACF,CACA,IAAM1L,EAAOoL,CAAAA,CAAM,IAAA,CACbwB,EAAM1B,CAAAA,CAAM,MAAA,CACZ2B,EAAQnB,CAAAA,CAId,GAHAA,CAAAA,CAAQ,CAAA,CAGJmB,CAAAA,CAAQlB,CAAAA,CAAS,CACnB,IAAA,IAAWzU,CAAAA,IAAOmV,EAChBvM,EAAAA,CAAeuL,CAAAA,CAAanU,CAAG,CAAA,CAEjCmV,CAAAA,CAAmB,KAAA,EAAM,CACzB,IAAA,GAAW,CAACnV,EAAK,CAAE,KAAA,CAAAC,EAAO,KAAA,CAAAmI,CAAM,CAAC,CAAA,GAAK8M,CAAAA,CACpChN,GACEiM,CAAAA,CACArL,CAAAA,CAAK,UACL9I,CAAAA,CACAC,CAAAA,CACAmI,EACA8L,CAAAA,CAAM,WACR,EAEFgB,CAAAA,CAAmB,KAAA,EAAM,CACzBpM,CAAAA,CAAK,UAAA,CAAW,WAAA,CAAc,OAAOqL,CAAAA,CAAY,IAAI,EACvD,CAIA,GAHIwB,EAAQjB,CAAAA,EACVpL,EAAAA,CAAkBR,CAAAA,CAAMS,CAAAA,CAAamM,CAAAA,CAAKxB,CAAAA,CAAM,WAAW,CAAA,CAEzDyB,CAAAA,CAAQV,EAAe,CAGzB,IAAA,IAAW7U,KAAMiV,CAAAA,CACfnJ,EAAAA,CAAoBpD,CAAAA,CAAMsL,CAAAA,CAAkBhU,CAAE,CAAA,CAEhDiV,EAAyB,KAAA,EAAM,CAC/B,OAAW,CACTjV,CAAAA,CACA,CAAE,MAAA,CAAAG,CAAAA,CAAQ,WAAA,CAAAC,CAAAA,CAAa,KAAA,CAAAsE,CAAM,CAC/B,CAAA,GAAKsQ,CAAAA,CACH/I,GACEvD,CAAAA,CACAsL,CAAAA,CACAhU,EACAG,CAAAA,CACAC,CAAAA,CACAsE,CACF,CAAA,CAEFsQ,CAAAA,CAAyB,KAAA,GAC3B,CACA,GAAIO,EAAQf,CAAAA,CACV,GAAIU,EACFpM,EAAAA,CAAaJ,CAAAA,CAAMwM,CAAAA,CAAW,QAAA,CAAS,MAAA,CAAQA,CAAAA,CAAW,MAAM,MAAM,CAAA,CAAA,KACjE,CACL,IAAM9H,CAAAA,CAAanL,GAAYqT,CAAG,CAAA,CAC9BlI,CAAAA,EACFtE,EAAAA,CACEJ,CAAAA,CACA0E,CAAAA,CAAW,SAAS,MAAA,CACpBA,CAAAA,CAAW,MAAM,MACnB,EAEJ,CAEF,GAAImI,CAAAA,CAAQhB,EACV,GAAIW,CAAAA,CACFzM,GACEC,CAAAA,CACAwM,CAAAA,CAAW,SACXA,CAAAA,CAAW,KAKb,OACK,CACL,IAAM9H,CAAAA,CAAanL,EAAAA,CAAYqT,CAAG,CAAA,CAC9BlI,GACF3E,EAAAA,CACEC,CAAAA,CACA0E,EAAW,QAAA,CACXA,CAAAA,CAAW,KAKb,EAEJ,CAEEmI,CAAAA,CAAQd,CAAAA,EACV3K,EAAAA,CAAkBpB,CAAAA,CAAMqB,CAAI,CAAA,CAE1BwL,CAAAA,CAAQb,GACVvH,EAAAA,CAAsBzE,CAAAA,CAAM4M,EAAKvI,CAAQ,CAAA,CAEvCwI,CAAAA,CAAQZ,CAAAA,EACVjK,EAAAA,CAAsBhC,CAAAA,CAAM4M,CAAG,CAAA,CAE7BC,CAAAA,CAAQX,GACVzD,EAAAA,CAAezI,CAAAA,CAAM0I,CAAQ,EAEjC,CAGA,SAASoE,CAAAA,CAAWpU,CAAAA,CAAcgB,CAAAA,CAAe,CAC3C0R,CAAAA,EAASP,CAAAA,EACXjK,GAAYwK,CAAAA,CAAM,IAAA,CAAM1S,EAAMgB,CAAAA,CAAMwR,CAAAA,CAAM,MAAA,CAAO,IAAI,EAEzD,CAGA,SAAS6B,CAAAA,CAAYrU,CAAAA,CAAcgB,EAAe,CAE9C6R,CAAAA,CAAU,aACVA,CAAAA,CAAU,cAAA,CAAe,MAAA,CAASlR,EAAAA,EAElCkR,CAAAA,CAAU,cAAA,CAAe,KAAK,CAC5B,SAAA,CAAW,KAAK,GAAA,EAAI,CACpB,KAAA7S,CAAAA,CACA,IAAA,CAAMe,EAAAA,CAAaC,CAAI,CACzB,CAAC,EAEL,CAEA,OAAO,CACL,IAAA,CAAM,UAAA,CAEN,OAASF,CAAAA,EAAW,CAYlB,GAXA0R,CAAAA,CAAM,MAAA,CAAS1R,EACf2R,CAAAA,CAAS,MAAA,CAAQ,EAAE,CAAA,CAEf,OAAO,MAAA,CAAW,GAAA,EACpB,OAAA,CAAQ,GAAA,CACN,CAAA,iCAAA,EAAoCrB,CAAI,iDACxC,mCAAA,CACA,gBACF,EAGE0B,CAAAA,CAAmB,CACrB,IAAMoB,CAAAA,CAAM1B,CAAAA,CAAM,MAAA,CAClBE,CAAAA,CAAQxQ,EAAAA,CAAYkP,CAAAA,CAAMhP,EAAUC,CAAAA,CAAa8P,CAAK,EACtD,IAAM7K,CAAAA,CAAOoL,EAAM,IAAA,CAGnB,GAAI,CACF,IAAM4B,CAAAA,CAAQJ,CAAAA,CAAI,MAAM,MAAA,CAAO,QAAA,GAC/B,IAAA,GAAW,CAAC1V,EAAKC,EAAK,CAAA,GAAK,MAAA,CAAO,OAAA,CAAQ6V,CAAK,CAAA,CAC7C5N,GAAeiM,CAAAA,CAAarL,CAAAA,CAAK,UAAW9I,CAAAA,CAAKC,EAAAA,CAAO,EAAK,CAAA,CAE/D6I,CAAAA,CAAK,UAAA,CAAW,WAAA,CAAc,MAAA,CAAO,MAAA,CAAO,KAAKgN,CAAK,CAAA,CAAE,MAAM,EAChE,CAAA,KAAQ,CAER,CAGAxM,EAAAA,CAAkBR,CAAAA,CAAMS,CAAAA,CAAamM,CAAG,CAAA,CACxC,IAAMlI,CAAAA,CAAanL,EAAAA,CAAYqT,CAAG,CAAA,CAC9BlI,CAAAA,GACFtE,GACEJ,CAAAA,CACA0E,CAAAA,CAAW,QAAA,CAAS,MAAA,CACpBA,CAAAA,CAAW,KAAA,CAAM,MACnB,CAAA,CACA3E,EAAAA,CACEC,EACA0E,CAAAA,CAAW,QAAA,CACXA,EAAW,KAKb,CAAA,CAAA,CAEF1C,GAAsBhC,CAAAA,CAAM4M,CAAG,EAC/BtK,EAAAA,CAAoBtC,CAAAA,CAAM4M,CAAG,CAAA,CAC7BnI,EAAAA,CAAsBzE,EAAM4M,CAAAA,CAAKvI,CAAQ,CAAA,CAIzC,IAAM4I,CAAAA,CAAAA,CAAkBvI,CAAAA,EAAY,aAAa,MAAA,EAAU,CAAA,EAAK,EAChErB,EAAAA,CAAyBrD,CAAAA,CAAMiN,CAAc,CAAA,CAG7CjN,CAAAA,CAAK,SAAA,CAAU,gBAAA,CAAiB,OAAA,CAAS,IAAM,CAM7C,GALAuL,CAAAA,CAAU,YAAc,CAACA,CAAAA,CAAU,YACnCvL,CAAAA,CAAK,SAAA,CAAU,WAAA,CAAcuL,CAAAA,CAAU,WAAA,CACnC,aAAA,CACA,gBACJvL,CAAAA,CAAK,SAAA,CAAU,MAAM,KAAA,CAAQuL,CAAAA,CAAU,YAAc7Q,CAAAA,CAAE,GAAA,CAAMA,CAAAA,CAAE,IAAA,CAC3D6Q,CAAAA,CAAU,WAAA,CAAa,CACzBA,CAAAA,CAAU,cAAA,CAAiB,EAAC,CAC5BA,CAAAA,CAAU,UAAY,EAAC,CAEvB,GAAI,CACFA,CAAAA,CAAU,SAAA,CAAU,KAAK,CACvB,SAAA,CAAW,KAAK,GAAA,EAAI,CACpB,MAAOqB,CAAAA,CAAI,KAAA,CAAM,MAAA,CAAO,QAAA,EAC1B,CAAC,EACH,CAAA,KAAQ,CAER,CACF,CACF,CAAC,EAED5M,CAAAA,CAAK,SAAA,CAAU,gBAAA,CAAiB,OAAA,CAAS,IAAM,CAC7C,IAAMyK,CAAAA,CACJc,CAAAA,CAAU,eAAe,MAAA,CAAS,CAAA,CAC9BA,EAAU,cAAA,CACVL,CAAAA,CAAM,OAAO,OAAA,EAAQ,CAErBgC,EAAU,IAAA,CAAK,SAAA,CACnB,CACE,OAAA,CAAS,CAAA,CACT,KAAApD,CAAAA,CACA,UAAA,CAAY,IAAA,CAAK,GAAA,EAAI,CACrB,MAAA,CAAAW,EACA,SAAA,CAAWc,CAAAA,CAAU,SACvB,CAAA,CACA,IAAA,CACA,CACF,CAAA,CAGM4B,EAAAA,CAAO,IAAI,IAAA,CAAK,CAACD,CAAO,EAAG,CAAE,IAAA,CAAM,kBAAmB,CAAC,CAAA,CACvDE,GAAM,GAAA,CAAI,eAAA,CAAgBD,EAAI,CAAA,CAC9BvL,EAAAA,CAAI,QAAA,CAAS,cAAc,GAAG,CAAA,CACpCA,GAAE,IAAA,CAAOwL,EAAAA,CACTxL,GAAE,QAAA,CAAW,CAAA,kBAAA,EAAqBkI,CAAI,CAAA,CAAA,EAAI,IAAA,CAAK,GAAA,EAAK,CAAA,KAAA,CAAA,CACpDlI,EAAAA,CAAE,OAAM,CACR,GAAA,CAAI,gBAAgBwL,EAAG,EACzB,CAAC,EACH,CACF,CAAA,CAEA,QAAUC,CAAAA,EAAY,CACpBlC,EAAS,OAAA,CAAS,EAAE,CAAA,CACpB2B,CAAAA,CAAW,OAAA,CAAS,EAAE,CAAA,CACtBC,EAAY,OAAA,CAAS,EAAE,EACzB,CAAA,CAEA,OAASM,CAAAA,EAAY,CACnBlC,CAAAA,CAAS,MAAA,CAAQ,EAAE,EACnB2B,CAAAA,CAAW,MAAA,CAAQ,EAAE,CAAA,CACrBC,EAAY,MAAA,CAAQ,EAAE,EACxB,CAAA,CAEA,UAAYM,CAAAA,EAAY,CACtBlC,EAAS,SAAA,CAAW,EAAE,CAAA,CACtBF,CAAAA,CAAS,OAAA,CAAQ,MAAA,CAAOnB,CAAI,CAAA,CACxB2B,IAAU,IAAA,EAAQ,OAAO,qBAAyB,GAAA,GACpD,oBAAA,CAAqBA,CAAK,CAAA,CAC1BA,CAAAA,CAAQ,IAAA,CAAA,CAENpH,CAAAA,CAAS,cAAA,EACX,YAAA,CAAaA,EAAS,cAAc,CAAA,CAElC+G,IACFA,CAAAA,CAAM,OAAA,GACNA,CAAAA,CAAQ,IAAA,CACRC,CAAAA,CAAY,KAAA,EAAM,CAClB5K,CAAAA,CAAY,OAAM,CAClB6K,CAAAA,CAAiB,OAAM,EAE3B,CAAA,CAEA,UAAW,CAACpU,CAAAA,CAAKC,CAAAA,CAAOC,CAAAA,GAAS,CAC/B+T,CAAAA,CAAS,WAAY,CAAE,GAAA,CAAAjU,EAAK,KAAA,CAAAC,CAAAA,CAAO,KAAAC,CAAK,CAAC,CAAA,CACzC2V,CAAAA,CAAY,UAAA,CAAY,CAAE,IAAA7V,CAAAA,CAAK,KAAA,CAAAC,EAAO,IAAA,CAAAC,CAAK,CAAC,CAAA,CAC5CiN,CAAAA,CAAS,oBAAA,CAAqB,GAAA,CAAInN,CAAa,CAAA,CAC3CkU,GAASF,CAAAA,CAAM,MAAA,GAEjBkB,EAAmB,GAAA,CAAIlV,CAAAA,CAAe,CAAE,KAAA,CAAAC,CAAAA,CAAO,KAAA,CAAO,IAAK,CAAC,CAAA,CAC5DkV,EAAmB,MAAA,CAAOnV,CAAa,EACvCuV,CAAAA,CAAoBd,CAAO,EAC3BmB,CAAAA,CAAW,UAAA,CAAY,CAAE,GAAA,CAAA5V,CAAAA,CAAK,MAAAC,CAAM,CAAC,GAEzC,CAAA,CAEA,YAAA,CAAc,CAACD,CAAAA,CAAKE,CAAAA,GAAS,CAC3B+T,CAAAA,CAAS,aAAA,CAAe,CAAE,IAAAjU,CAAAA,CAAK,IAAA,CAAAE,CAAK,CAAC,CAAA,CACrC2V,EAAY,aAAA,CAAe,CAAE,GAAA,CAAA7V,CAAAA,CAAK,IAAA,CAAAE,CAAK,CAAC,CAAA,CACpCgU,CAAAA,GAEFiB,EAAmB,GAAA,CAAInV,CAAa,EACpCkV,CAAAA,CAAmB,MAAA,CAAOlV,CAAa,CAAA,CACvCuV,CAAAA,CAAoBd,CAAO,EAC3BmB,CAAAA,CAAW,aAAA,CAAe,CAAE,GAAA,CAAA5V,CAAI,CAAC,CAAA,EAErC,CAAA,CAEA,YAAA,CAAeG,CAAAA,EAA0B,CAGvC,GAFA8T,EAAS,aAAA,CAAe,CAAE,QAAA9T,CAAQ,CAAC,EACnC0V,CAAAA,CAAY,aAAA,CAAe,CAAE,KAAA,CAAO1V,CAAAA,CAAQ,MAAO,CAAC,CAAA,CAChD+T,CAAAA,EAASF,EAAM,MAAA,CAAQ,CAEzB,QAAWoC,CAAAA,IAAUjW,CAAAA,CACfiW,CAAAA,CAAO,IAAA,GAAS,QAAA,EAClBjB,CAAAA,CAAmB,IAAIiB,CAAAA,CAAO,GAAG,EACjClB,CAAAA,CAAmB,MAAA,CAAOkB,EAAO,GAAG,CAAA,GAEpCjJ,CAAAA,CAAS,oBAAA,CAAqB,GAAA,CAAIiJ,CAAAA,CAAO,GAAG,CAAA,CAC5ClB,CAAAA,CAAmB,IAAIkB,CAAAA,CAAO,GAAA,CAAK,CACjC,KAAA,CAAOA,CAAAA,CAAO,MACd,KAAA,CAAO,IACT,CAAC,CAAA,CACDjB,CAAAA,CAAmB,OAAOiB,CAAAA,CAAO,GAAG,GAGxCb,CAAAA,CAAoBd,CAAO,CAAA,CAC3BmB,CAAAA,CAAW,aAAA,CAAe,CAAE,MAAOzV,CAAAA,CAAQ,MAAO,CAAC,EACrD,CACF,EAEA,mBAAA,CAAqB,CAACC,CAAAA,CAAIH,CAAAA,CAAOI,CAAAA,GAAS,CACxC4T,EAAS,oBAAA,CAAsB,CAAE,GAAA7T,CAAAA,CAAI,KAAA,CAAAH,EAAO,IAAA,CAAAI,CAAK,CAAC,CAAA,CAClDwV,CAAAA,CAAY,oBAAA,CAAsB,CAAE,EAAA,CAAAzV,CAAAA,CAAI,KAAAC,CAAK,CAAC,EAC9C8M,CAAAA,CAAS,cAAA,CAAe,GAAA,CAAI/M,CAAAA,CAAIC,CAAI,CAAA,CACpC8M,EAAS,2BAAA,CAA4B,GAAA,CAAI/M,CAAE,CAAA,CAC3CwV,CAAAA,CAAW,qBAAsB,CAAE,EAAA,CAAAxV,CAAAA,CAAI,IAAA,CAAAC,CAAK,CAAC,EAC/C,CAAA,CAEA,sBAAA,CAAyBD,GAAO,CAC9B6T,CAAAA,CAAS,wBAAyB,CAAE,EAAA,CAAA7T,CAAG,CAAC,CAAA,CACxCwV,CAAAA,CAAW,wBAAyB,CAAE,EAAA,CAAAxV,CAAG,CAAC,EAC5C,EAEA,gBAAA,CAAmBiW,CAAAA,EAAc,CAC/BpC,CAAAA,CAAS,iBAAA,CAAmB,EAAE,CAAA,CAC9B9J,CAAAA,CAAK,qBAAuB,WAAA,CAAY,GAAA,GACxCyL,CAAAA,CAAW,iBAAA,CAAmB,EAAE,CAAA,CAChCC,EAAY,iBAAA,CAAmB,EAAE,EACnC,CAAA,CAEA,eAAiBvV,CAAAA,EAA4B,CAS3C,GARA2T,CAAAA,CAAS,eAAA,CAAiB3T,CAAM,EAChCuV,CAAAA,CAAY,eAAA,CAAiB,CAC3B,KAAA,CAAOvV,CAAAA,CAAO,MAAM,MAAA,CACpB,QAAA,CAAUA,CAAAA,CAAO,QAAA,CAAS,MAAA,CAC1B,SAAA,CAAWA,EAAO,SAAA,CAAU,MAC9B,CAAC,CAAA,CAGG6J,CAAAA,CAAK,qBAAuB,CAAA,CAAG,CACjC,IAAMpJ,CAAAA,CAAW,WAAA,CAAY,GAAA,GAAQoJ,CAAAA,CAAK,oBAAA,CAC1CA,EAAK,cAAA,EAAA,CACLA,CAAAA,CAAK,kBAAoBpJ,CAAAA,CACzBoJ,CAAAA,CAAK,oBAAA,CAAuB,EAC9B,CAGA,GACEkK,EAAU,WAAA,EACVL,CAAAA,CAAM,QACNK,CAAAA,CAAU,SAAA,CAAU,OAASjR,EAAAA,CAE7B,GAAI,CACFiR,CAAAA,CAAU,SAAA,CAAU,IAAA,CAAK,CACvB,SAAA,CAAW,IAAA,CAAK,KAAI,CACpB,KAAA,CAAOL,EAAM,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,QAAA,EACnC,CAAC,EACH,CAAA,KAAQ,CAER,CAGEE,CAAAA,EAASF,CAAAA,CAAM,SACjBsB,CAAAA,CAAahV,CAAAA,CACbgR,EAAAA,CAAuBnE,CAAQ,CAAA,CAC/BoI,CAAAA,CACEb,EAAUE,CAAAA,CAAWD,CAAAA,CAASE,EAASC,CAAAA,CAASC,CAClD,EACAa,CAAAA,CAAW,eAAA,CAAiB,CAC1B,KAAA,CAAOtV,CAAAA,CAAO,MAAM,MAAA,CACpB,QAAA,CAAUA,EAAO,QAAA,CAAS,MAC5B,CAAC,CAAA,EAEL,CAAA,CAEA,oBAAA,CAAsB,CAACF,CAAAA,CAAIG,CAAAA,CAAQC,IAAgB,CACjD,IAAMsE,EAAQkP,CAAAA,CAAM,MAAA,EAAQ,MAAM,UAAA,CAAW5T,CAAE,CAAA,EAAG,KAAA,CAK5CkW,CAAAA,CAAcxR,CAAAA,CAAQ,CAAE,EAAA,CAAA1E,CAAAA,CAAI,OAAAG,CAAAA,CAAQ,KAAA,CAAAuE,CAAM,CAAA,CAAI,CAAE,EAAA,CAAA1E,CAAAA,CAAI,MAAA,CAAAG,CAAO,EAC3DyV,CAAAA,CAAUxV,CAAAA,CACZ,CAAE,GAAG8V,CAAAA,CAAa,YAAA9V,CAAY,CAAA,CAC9B8V,CAAAA,CACJrC,CAAAA,CAAS,qBAAA,CAAuB+B,CAAO,EACvCH,CAAAA,CAAY,qBAAA,CAAuBG,CAAO,CAAA,CACtCzV,CAAAA,EACF4M,EAAS,iBAAA,CAAkB,GAAA,CAAI/M,CAAE,CAAA,CACjC+M,CAAAA,CAAS,yBAAA,CAA0B,IAAI/M,CAAE,CAAA,EAEzC+M,EAAS,iBAAA,CAAkB,MAAA,CAAO/M,CAAE,CAAA,CAMlC8T,CAAAA,GACFkB,CAAAA,CAAyB,GAAA,CAAIhV,CAAAA,CAAI,CAAE,OAAAG,CAAAA,CAAQ,WAAA,CAAAC,EAAa,KAAA,CAAAsE,CAAM,CAAC,CAAA,CAC/DuQ,CAAAA,CAAyB,MAAA,CAAOjV,CAAE,CAAA,CAClCmV,CAAAA,CAAoBN,CAAa,CAAA,CAAA,CAEnCW,CAAAA,CAAW,sBAAuB,CAAE,EAAA,CAAAxV,EAAI,MAAA,CAAAG,CAAO,CAAC,EAClD,CAAA,CAEA,kBAAmB,CAACH,CAAAA,CAAIO,IAAU,CAChCsT,CAAAA,CAAS,mBAAoB,CAAE,EAAA,CAAA7T,CAAAA,CAAI,KAAA,CAAO,MAAA,CAAOO,CAAK,CAAE,CAAC,CAAA,CACzDiV,EAAW,kBAAA,CAAoB,CAAE,GAAAxV,CAAAA,CAAI,KAAA,CAAO,MAAA,CAAOO,CAAK,CAAE,CAAC,EAC7D,CAAA,CAEA,oBAAA,CAAuBC,GAAQ,CAC7BqT,CAAAA,CAAS,sBAAuB,CAC9B,EAAA,CAAIrT,CAAAA,CAAI,EAAA,CACR,IAAA,CAAMA,CAAAA,CAAI,YAAY,IACxB,CAAC,EACDiV,CAAAA,CAAY,qBAAA,CAAuB,CACjC,EAAA,CAAIjV,CAAAA,CAAI,EAAA,CACR,IAAA,CAAMA,CAAAA,CAAI,WAAA,CAAY,IACxB,CAAC,CAAA,CACDgV,EAAW,qBAAA,CAAuB,CAChC,GAAIhV,CAAAA,CAAI,EAAA,CACR,IAAA,CAAMA,CAAAA,CAAI,WAAA,CAAY,IACxB,CAAC,EACH,CAAA,CAEA,iBAAkB,CAACA,CAAAA,CAAKC,IAAe,CACrCoT,CAAAA,CAAS,iBAAA,CAAmB,CAAE,EAAA,CAAIrT,CAAAA,CAAI,GAAI,UAAA,CAAAC,CAAW,CAAC,CAAA,CACtDgV,CAAAA,CAAY,kBAAmB,CAAE,EAAA,CAAIjV,CAAAA,CAAI,EAAA,CAAI,UAAA,CAAAC,CAAW,CAAC,CAAA,CACzD+U,CAAAA,CAAW,kBAAmB,CAAE,EAAA,CAAIhV,EAAI,EAAA,CAAI,UAAA,CAAAC,CAAW,CAAC,EAC1D,EAEA,qBAAA,CAAwBD,CAAAA,EAAQ,CAC9BqT,CAAAA,CAAS,sBAAA,CAAwB,CAAE,EAAA,CAAIrT,CAAAA,CAAI,EAAG,CAAC,CAAA,CAC/CiV,CAAAA,CAAY,uBAAwB,CAAE,EAAA,CAAIjV,EAAI,EAAG,CAAC,EAClDgV,CAAAA,CAAW,sBAAA,CAAwB,CAAE,EAAA,CAAIhV,CAAAA,CAAI,EAAG,CAAC,EACnD,CAAA,CAEA,gBAAiB,CAACE,CAAAA,CAAUF,IAAQ,CAClC,IAAMkE,CAAAA,CAAQkP,CAAAA,CAAM,MAAA,EAAQ,IAAA,EAAM,SAASlT,CAAQ,CAAA,EAAG,MAChDwV,CAAAA,CAAc,CAAE,SAAAxV,CAAAA,CAAU,aAAA,CAAeF,CAAAA,CAAI,EAAG,CAAA,CAChDoV,CAAAA,CAAUlR,EAAQ,CAAE,GAAGwR,EAAa,KAAA,CAAAxR,CAAM,EAAIwR,CAAAA,CACpDrC,CAAAA,CAAS,gBAAA,CAAkB+B,CAAO,CAAA,CAClCH,CAAAA,CAAY,iBAAkBG,CAAO,CAAA,CAErCxE,EAAS,QAAA,CAAS,GAAA,CAAI1Q,EAAU,WAAA,CAAY,GAAA,EAAK,CAAA,CAC7CoT,CAAAA,EAASF,CAAAA,CAAM,SACjBuB,CAAAA,CAAoBZ,CAAAA,CAASC,EAAWI,CAAU,CAAA,CAClDY,EAAW,gBAAA,CAAkB,CAAE,QAAA,CAAA9U,CAAAA,CAAU,aAAA,CAAeF,CAAAA,CAAI,EAAG,CAAC,CAAA,EAEpE,EAEA,kBAAA,CAAoB,CAACE,EAAUF,CAAAA,CAAKG,CAAAA,GAAa,CAC/C,IAAM+D,CAAAA,CAAQkP,EAAM,MAAA,EAAQ,IAAA,EAAM,SAASlT,CAAQ,CAAA,EAAG,MACtDmT,CAAAA,CAAS,mBAAA,CAAqB,CAC5B,QAAA,CAAAnT,CAAAA,CACA,aAAA,CAAeF,EAAI,EAAA,CACnB,QAAA,CAAAG,EACA,GAAI+D,CAAAA,CAAQ,CAAE,KAAA,CAAAA,CAAM,CAAA,CAAI,EAC1B,CAAC,EACD+Q,CAAAA,CAAY,mBAAA,CAAqB,CAC/B,QAAA,CAAA/U,CAAAA,CACA,cAAeF,CAAAA,CAAI,EAAA,CACnB,QAAA,CAAAG,CACF,CAAC,CAAA,CAED,IAAM6J,CAAAA,CAAQoJ,CAAAA,CAAM,cAAc,GAAA,CAAIlT,CAAQ,GAAK,CACjD,KAAA,CAAO,CAAA,CACP,OAAA,CAAS,CAAA,CACT,MAAA,CAAQ,CACV,CAAA,CAIA,GAHA8J,EAAM,KAAA,EAAA,CACNA,CAAAA,CAAM,SAAW7J,CAAAA,CACjBiT,CAAAA,CAAM,aAAA,CAAc,GAAA,CAAIlT,CAAAA,CAAU8J,CAAK,EACnCoJ,CAAAA,CAAM,aAAA,CAAc,KAAOzQ,EAAAA,CAAoB,CACjD,IAAMgT,CAAAA,CAASvC,CAAAA,CAAM,aAAA,CAAc,IAAA,EAAK,CAAE,IAAA,GAAO,KAAA,CAC7CuC,CAAAA,GAAW,QAAWvC,CAAAA,CAAM,aAAA,CAAc,OAAOuC,CAAM,EAC7D,CAEApM,CAAAA,CAAK,aAAA,CAAc,GAAA,CAAIrJ,EAAU,CAAE,GAAG8J,CAAM,CAAC,CAAA,CAG7C,IAAMgH,CAAAA,CAAUJ,CAAAA,CAAS,SAAS,GAAA,CAAI1Q,CAAQ,EAC9C0Q,CAAAA,CAAS,QAAA,CAAS,OAAO1Q,CAAQ,CAAA,CAC7B8Q,IAAY,MAAA,EACdJ,CAAAA,CAAS,OAAA,CAAQ,IAAA,CAAK,CACpB,QAAA,CAAA1Q,EACA,OAAA,CAAA8Q,CAAAA,CACA,MAAO,WAAA,CAAY,GAAA,GACnB,KAAA,CAAO,KACT,CAAC,CAAA,CAGCsC,CAAAA,EAASF,CAAAA,CAAM,SACjBuB,CAAAA,CAAoBZ,CAAAA,CAASC,EAAWC,CAAAA,CAASG,CAAU,EAC3DY,CAAAA,CAAW,mBAAA,CAAqB,CAAE,QAAA,CAAA9U,CAAAA,CAAU,QAAA,CAAAC,CAAS,CAAC,CAAA,EAE1D,EAEA,eAAA,CAAiB,CAACD,EAAUF,CAAAA,CAAKD,CAAAA,GAAU,CACzCsT,CAAAA,CAAS,gBAAA,CAAkB,CACzB,SAAAnT,CAAAA,CACA,aAAA,CAAeF,EAAI,EAAA,CACnB,KAAA,CAAO,OAAOD,CAAK,CACrB,CAAC,CAAA,CACDkV,CAAAA,CAAY,gBAAA,CAAkB,CAC5B,QAAA,CAAA/U,CAAAA,CACA,cAAeF,CAAAA,CAAI,EAAA,CACnB,MAAO,MAAA,CAAOD,CAAK,CACrB,CAAC,CAAA,CAED,IAAMiK,EAAQoJ,CAAAA,CAAM,aAAA,CAAc,IAAIlT,CAAQ,CAAA,EAAK,CACjD,KAAA,CAAO,CAAA,CACP,OAAA,CAAS,CAAA,CACT,MAAA,CAAQ,CACV,EAGA,GAFA8J,CAAAA,CAAM,SACNoJ,CAAAA,CAAM,aAAA,CAAc,IAAIlT,CAAAA,CAAU8J,CAAK,EACnCoJ,CAAAA,CAAM,aAAA,CAAc,KAAOzQ,EAAAA,CAAoB,CACjD,IAAMgT,CAAAA,CAASvC,CAAAA,CAAM,cAAc,IAAA,EAAK,CAAE,IAAA,EAAK,CAAE,KAAA,CAC7CuC,CAAAA,GAAW,QAAWvC,CAAAA,CAAM,aAAA,CAAc,OAAOuC,CAAM,EAC7D,CAEApM,CAAAA,CAAK,aAAA,CAAc,GAAA,CAAIrJ,CAAAA,CAAU,CAAE,GAAG8J,CAAM,CAAC,CAAA,CAG7C,IAAMgH,CAAAA,CAAUJ,CAAAA,CAAS,SAAS,GAAA,CAAI1Q,CAAQ,CAAA,CAC9C0Q,CAAAA,CAAS,QAAA,CAAS,MAAA,CAAO1Q,CAAQ,CAAA,CAC7B8Q,CAAAA,GAAY,QACdJ,CAAAA,CAAS,OAAA,CAAQ,KAAK,CACpB,QAAA,CAAA1Q,CAAAA,CACA,OAAA,CAAA8Q,CAAAA,CACA,KAAA,CAAO,YAAY,GAAA,EAAI,CACvB,MAAO,IACT,CAAC,EAGCsC,CAAAA,EAASF,CAAAA,CAAM,MAAA,GACjBuB,CAAAA,CAAoBZ,CAAAA,CAASC,CAAAA,CAAWC,EAASG,CAAU,CAAA,CAC3DY,EAAW,gBAAA,CAAkB,CAAE,SAAA9U,CAAAA,CAAU,KAAA,CAAO,MAAA,CAAOH,CAAK,CAAE,CAAC,GAEnE,CAAA,CAEA,eAAA,CAAiB,CAACG,CAAAA,CAAUF,CAAAA,CAAKI,IAAY,CAC3CiT,CAAAA,CAAS,gBAAA,CAAkB,CAAE,QAAA,CAAAnT,CAAAA,CAAU,cAAeF,CAAAA,CAAI,EAAA,CAAI,QAAAI,CAAQ,CAAC,EACvE6U,CAAAA,CAAY,gBAAA,CAAkB,CAC5B,QAAA,CAAA/U,CAAAA,CACA,cAAeF,CAAAA,CAAI,EAAA,CACnB,QAAAI,CACF,CAAC,EACD4U,CAAAA,CAAW,gBAAA,CAAkB,CAAE,QAAA,CAAA9U,CAAAA,CAAU,OAAA,CAAAE,CAAQ,CAAC,EACpD,EAEA,gBAAA,CAAkB,CAACF,EAAUF,CAAAA,GAAQ,CACnCqT,CAAAA,CAAS,iBAAA,CAAmB,CAAE,QAAA,CAAAnT,EAAU,aAAA,CAAeF,CAAAA,CAAI,EAAG,CAAC,CAAA,CAC/DiV,EAAY,iBAAA,CAAmB,CAAE,QAAA,CAAA/U,CAAAA,CAAU,aAAA,CAAeF,CAAAA,CAAI,EAAG,CAAC,CAAA,CAElE4Q,EAAS,QAAA,CAAS,MAAA,CAAO1Q,CAAQ,CAAA,CACjC8U,CAAAA,CAAW,iBAAA,CAAmB,CAAE,QAAA,CAAA9U,CAAS,CAAC,EAC5C,CAAA,CAEA,wBAA0BhB,CAAAA,EAAU,CAClC,IAAMkW,CAAAA,CACJlW,CAAAA,CAAM,IAAA,GAAS,SAAA,CACX,CACE,IAAA,CAAMA,EAAM,IAAA,CACZ,QAAA,CAAUA,EAAM,QAAA,CAChB,aAAA,CAAeA,EAAM,GAAA,CAAI,EAAA,CACzB,MAAA,CAAQA,CAAAA,CAAM,MAAA,CACd,OAAA,CAASA,EAAM,OACjB,CAAA,CACA,CACE,IAAA,CAAMA,CAAAA,CAAM,KACZ,QAAA,CAAUA,CAAAA,CAAM,QAAA,CAChB,aAAA,CAAeA,CAAAA,CAAM,GAAA,CAAI,GACzB,MAAA,CAAQA,CAAAA,CAAM,OACd,IAAA,CAAMA,CAAAA,CAAM,KACZ,QAAA,CAAUA,CAAAA,CAAM,SAChB,MAAA,CAAQA,CAAAA,CAAM,MAChB,CAAA,CACNmU,CAAAA,CAAS,0BAA2B+B,CAAO,CAAA,CAC3CH,EAAY,yBAAA,CAA2BG,CAAO,CAAA,CAC9CJ,CAAAA,CACE,yBAAA,CACA9V,CAAAA,CAAM,OAAS,SAAA,CACX,CAAE,SAAUA,CAAAA,CAAM,QAAA,CAAU,QAASA,CAAAA,CAAM,OAAQ,CAAA,CACnD,CAAE,QAAA,CAAUA,CAAAA,CAAM,SAAU,IAAA,CAAMA,CAAAA,CAAM,IAAK,CACnD,EACF,EAEA,WAAA,CAAcM,CAAAA,EAAO,CACnB,IAAM0E,CAAAA,CAAQkP,CAAAA,CAAM,QAAQ,IAAA,EAAM,MAAA,CAAO5T,CAAE,CAAA,EAAG,KAAA,CACxC4V,EAAUlR,CAAAA,CAAQ,CAAE,EAAA,CAAA1E,CAAAA,CAAI,KAAA,CAAA0E,CAAM,EAAI,CAAE,EAAA,CAAA1E,CAAG,CAAA,CAC7C6T,CAAAA,CAAS,aAAc+B,CAAO,CAAA,CAC9BH,CAAAA,CAAY,YAAA,CAAcG,CAAO,CAAA,CACjC7L,EAAK,cAAA,EAAA,CACLyL,CAAAA,CAAW,aAAc,CAAE,EAAA,CAAAxV,CAAG,CAAC,EACjC,CAAA,CAEA,aAAA,CAAe,CAACA,CAAAA,CAAIO,IAAU,CAC5BsT,CAAAA,CAAS,eAAgB,CAAE,EAAA,CAAA7T,EAAI,KAAA,CAAO,MAAA,CAAOO,CAAK,CAAE,CAAC,CAAA,CACrDwJ,EAAK,gBAAA,EAAA,CACLyL,CAAAA,CAAW,eAAgB,CAAE,EAAA,CAAAxV,EAAI,KAAA,CAAO,MAAA,CAAOO,CAAK,CAAE,CAAC,EACzD,CAAA,CAEA,UAAA,CAAaS,GAAa,CACxB6S,CAAAA,CAAS,sBAAuB,CAC9B,EAAA,CAAI7S,CAAAA,CAAS,EAAA,CACb,OAAA,CAASA,CAAAA,CAAS,OACpB,CAAC,CAAA,CACG8S,GAASF,CAAAA,CAAM,MAAA,EACjBuB,EAAoBR,CAAI,CAAA,CAE1Ba,CAAAA,CAAW,qBAAA,CAAuB,CAChC,EAAA,CAAIxU,EAAS,EAAA,CACb,OAAA,CAASA,EAAS,OACpB,CAAC,EACH,CAAA,CAEA,iBAAA,CAAmB,CAACC,CAAAA,CAAMC,CAAAA,GAAO,CAG/B,GAFA2S,CAAAA,CAAS,iBAAA,CAAmB,CAAE,IAAA,CAAA5S,CAAAA,CAAM,GAAAC,CAAG,CAAC,CAAA,CACxCuU,CAAAA,CAAY,iBAAA,CAAmB,CAAE,KAAAxU,CAAAA,CAAM,EAAA,CAAAC,CAAG,CAAC,CAAA,CACvC4S,GAASF,CAAAA,CAAM,MAAA,CAAQ,CACzB,IAAM0B,CAAAA,CAAM1B,CAAAA,CAAM,OAElB,GAAI,CACF,IAAM8B,CAAAA,CAAQJ,CAAAA,CAAI,MAAM,MAAA,CAAO,QAAA,EAAS,CACxCvB,CAAAA,CAAY,KAAA,EAAM,CAClBD,EAAM,IAAA,CAAK,SAAA,CAAU,iBAAgB,CACrC,IAAA,GAAW,CAAClU,CAAAA,CAAKC,CAAK,CAAA,GAAK,MAAA,CAAO,OAAA,CAAQ6V,CAAK,EAC7C5N,EAAAA,CACEiM,CAAAA,CACAD,EAAM,IAAA,CAAK,SAAA,CACXlU,EACAC,CAAAA,CACA,CAAA,CACF,EAEFiU,CAAAA,CAAM,IAAA,CAAK,WAAW,WAAA,CAAc,MAAA,CAAO,OAAO,IAAA,CAAK4B,CAAK,EAAE,MAAM,EACtE,CAAA,KAAQ,CAER,CACAvM,CAAAA,CAAY,OAAM,CAClB4D,CAAAA,CAAS,eAAe,KAAA,EAAM,CAC9B+G,EAAM,IAAA,CAAK,SAAA,CAAU,eAAA,EAAgB,CAGrCE,CAAAA,CAAiB,KAAA,GACjBF,CAAAA,CAAM,IAAA,CAAK,gBAAgB,eAAA,EAAgB,CAC3CA,EAAM,IAAA,CAAK,gBAAA,CAAiB,WAAA,CAAc,GAAA,CAC1CoB,CAAAA,CAAa,IAAA,CACbC,EAAoBb,CAAAA,CAAUE,CAAAA,CAAWD,EAASG,CAAAA,CAASC,CAAI,EAC/Da,CAAAA,CAAW,iBAAA,CAAmB,CAAE,IAAA,CAAAvU,CAAAA,CAAM,EAAA,CAAAC,CAAG,CAAC,EAC5C,CACF,CAAA,CAEA,OAAA,CAAUX,GAAU,CAClBsT,CAAAA,CAAS,OAAA,CAAS,CAChB,MAAA,CAAQtT,CAAAA,CAAM,OACd,QAAA,CAAUA,CAAAA,CAAM,SAChB,OAAA,CAASA,CAAAA,CAAM,OACjB,CAAC,CAAA,CACDkV,CAAAA,CAAY,OAAA,CAAS,CAAE,MAAA,CAAQlV,EAAM,MAAA,CAAQ,OAAA,CAASA,EAAM,OAAQ,CAAC,EACrEiV,CAAAA,CAAW,OAAA,CAAS,CAAE,MAAA,CAAQjV,CAAAA,CAAM,MAAA,CAAQ,QAASA,CAAAA,CAAM,OAAQ,CAAC,EACtE,CAAA,CAEA,gBAAiB,CAACA,CAAAA,CAAOY,IAAa,CACpC0S,CAAAA,CAAS,iBAAkB,CACzB,MAAA,CAAQtT,EAAM,MAAA,CACd,QAAA,CAAUA,EAAM,QAAA,CAChB,QAAA,CAAAY,CACF,CAAC,CAAA,CACDqU,CAAAA,CAAW,iBAAkB,CAAE,MAAA,CAAQjV,EAAM,MAAA,CAAQ,QAAA,CAAAY,CAAS,CAAC,EACjE,CAAA,CAEA,eAAA,CAAkBG,CAAAA,EAAU,CAC1BuS,EAAS,gBAAA,CAAkB,CACzB,GAAIvS,CAAAA,CAAM,EAAA,CACV,OAAQA,CAAAA,CAAM,MAAA,CACd,KAAA,CAAOA,CAAAA,CAAM,WAAA,CAAY,MAAA,CACzB,YAAaA,CAAAA,CAAM,cAAA,CAAe,OAClC,YAAA,CAAcA,CAAAA,CAAM,kBAAkB,MAAA,CACtC,SAAA,CAAWA,CAAAA,CAAM,gBAAA,CAAiB,MAAA,CAClC,OAAA,CAASA,EAAM,UAAA,CAAW,MAC5B,CAAC,CAAA,CACDkU,CAAAA,CAAW,iBAAkB,CAAE,EAAA,CAAIlU,CAAAA,CAAM,EAAG,CAAC,EAC/C,EAEA,oBAAA,CAAsB,CAACF,EAAMpB,CAAAA,GAAO,CAClC6T,EAAS,qBAAA,CAAuB,CAAE,IAAA,CAAAzS,CAAAA,CAAM,EAAA,CAAApB,CAAG,CAAC,CAAA,CAC5CyV,CAAAA,CAAY,sBAAuB,CAAE,IAAA,CAAArU,EAAM,EAAA,CAAApB,CAAG,CAAC,CAAA,CAC/CwV,CAAAA,CAAW,qBAAA,CAAuB,CAAE,IAAA,CAAApU,CAAAA,CAAM,GAAApB,CAAG,CAAC,EAChD,CAAA,CAEA,kBAAA,CAAoB,CAACoB,CAAAA,CAAMpB,CAAAA,GAAO,CAChC6T,CAAAA,CAAS,mBAAA,CAAqB,CAAE,IAAA,CAAAzS,CAAAA,CAAM,GAAApB,CAAG,CAAC,CAAA,CAC1CyV,CAAAA,CAAY,mBAAA,CAAqB,CAAE,KAAArU,CAAAA,CAAM,EAAA,CAAApB,CAAG,CAAC,CAAA,CAC7CwV,EAAW,mBAAA,CAAqB,CAAE,IAAA,CAAApU,CAAAA,CAAM,EAAA,CAAApB,CAAG,CAAC,EAC9C,CAAA,CAEA,uBAAwB,CAACoB,CAAAA,CAAMpB,IAAO,CACpC6T,CAAAA,CAAS,uBAAA,CAAyB,CAAE,IAAA,CAAAzS,CAAAA,CAAM,GAAApB,CAAG,CAAC,EAC9CyV,CAAAA,CAAY,uBAAA,CAAyB,CAAE,IAAA,CAAArU,CAAAA,CAAM,EAAA,CAAApB,CAAG,CAAC,CAAA,CACjDwV,EAAW,uBAAA,CAAyB,CAAE,KAAApU,CAAAA,CAAM,EAAA,CAAApB,CAAG,CAAC,CAAA,CAI5CoB,CAAAA,GAAS,YAAA,EAAgB0S,CAAAA,GAC3BmB,CAAAA,CAAyB,IAAIjV,CAAE,CAAA,CAC/BgV,EAAyB,MAAA,CAAOhV,CAAE,EAClCmV,CAAAA,CAAoBN,CAAa,CAAA,EAErC,CAAA,CAEA,gBAAA,CAAkB,CAACzT,EAAMpB,CAAAA,CAAIqB,CAAAA,GAAU,CACrCwS,CAAAA,CAAS,iBAAA,CAAmB,CAAE,IAAA,CAAAzS,CAAAA,CAAM,EAAA,CAAApB,CAAAA,CAAI,KAAA,CAAAqB,CAAM,CAAC,CAAA,CAC/CoU,CAAAA,CAAY,kBAAmB,CAAE,IAAA,CAAArU,EAAM,EAAA,CAAApB,CAAAA,CAAI,MAAAqB,CAAM,CAAC,EAClDmU,CAAAA,CAAW,iBAAA,CAAmB,CAAE,IAAA,CAAApU,CAAAA,CAAM,GAAApB,CAAAA,CAAI,KAAA,CAAAqB,CAAM,CAAC,EACnD,CACF,CACF,CCzjCO,IAAM+U,GAAsB,0BAAA,CAG7BC,EAAAA,CAAe,IAAI,GAAA,CAAI,CAAC,WAAA,CAAa,aAAA,CAAe,WAAW,CAAC,EAOhEC,EAAAA,CAAgB,IAAA,CAAK,QAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,CAAG,CAAC,EAO3D,SAASC,IAAoB,CAC3B,GAAI,OAAO,MAAA,CAAW,GAAA,CAAa,CACjC,IAAM3W,CAAAA,CAAM,CAAA,sBAAA,EAAyB0W,EAAa,CAAA,EAAA,CAAA,CAC5CpE,CAAAA,CAAI,OACJtH,CAAAA,CAAWsH,CAAAA,CAAEtS,CAAG,CAAA,EAA4B,CAAA,CAClD,OAAAsS,CAAAA,CAAEtS,CAAG,CAAA,CAAIgL,CAAAA,CAAU,CAAA,CAEZA,CAAAA,CAAU,CACnB,CAEA,QACF,CAKA,SAAS4L,GACP9W,CAAAA,CACyB,CACzB,IAAI+W,CAAAA,CAAgB,KAAA,CACpB,IAAA,IAAW7W,KAAOyW,EAAAA,CAChB,GAAIzW,KAAOF,CAAAA,CAAO,CAChB+W,EAAgB,IAAA,CAChB,KACF,CAGF,GAAI,CAACA,CAAAA,CACH,OAAO/W,CAAAA,CAGT,IAAMgX,EAAiC,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA,CACzD,IAAA,GAAW,CAAC9W,CAAAA,CAAKC,CAAK,IAAK,MAAA,CAAO,OAAA,CAAQH,CAAK,CAAA,CACxC2W,EAAAA,CAAa,IAAIzW,CAAG,CAAA,GACvB8W,CAAAA,CAAM9W,CAAG,CAAA,CAAIC,CAAAA,CAAAA,CAIjB,OAAO6W,CACT,CAWO,SAASC,EAAAA,CACdjX,CAAAA,CACM,CACN,GAAI,EAAA,OAAO,MAAA,CAAW,GAAA,CAAA,CAItB,GAAI,CACF,IAAMkX,CAAAA,CAAOJ,EAAAA,CAAc9W,CAAK,CAAA,CAC1BmX,CAAAA,CAAO,CACX,EAAA,CAAIN,EAAAA,EAAU,CACd,SAAA,CAAW,IAAA,CAAK,GAAA,GAChB,UAAA,CAAY,IAAA,CACZ,GAAGK,CACL,CAAA,CAEA,OAAO,aAAA,CACL,IAAI,WAAA,CAAYR,EAAAA,CAAqB,CAAE,MAAA,CAAQS,CAAK,CAAC,CACvD,EACF,CAAA,KAAQ,CAER,CACF,CCnCO,SAASC,EAAAA,CACd5X,CAAAA,CACW,CACX,GAAM,CACJ,OAAA,CAAA6X,CAAAA,CACA,IAAAnX,CAAAA,CACA,OAAA,CAAAoX,EACA,OAAA,CAAAC,CAAAA,CAAU,EAAC,CACX,QAAA,CAAAC,CAAAA,CAAW,IACX,SAAA,CAAAC,CAAAA,CACA,OAAAC,CAAAA,CACA,OAAA,CAAAC,CACF,CAAA,CAAInY,CAAAA,CAEAoY,CAAAA,CAAoD,IAAA,CACpDpV,CAAAA,CAA2B,IAAA,CACzBqV,EAAc,IAAI,GAAA,CAGlBC,EAAiBC,CAAAA,EACjBR,CAAAA,CAAQ,SAASQ,CAAO,CAAA,CAAU,MAClCT,CAAAA,CAAgBA,CAAAA,CAAQ,SAASS,CAAO,CAAA,CACrC,KAIHC,CAAAA,CAAO,IAAsC,CACjD,GAAI,CACF,IAAMzE,CAAAA,CAAO8D,CAAAA,CAAQ,OAAA,CAAQnX,CAAG,CAAA,CAChC,GAAI,CAACqT,CAAAA,CAAM,OAAO,KAElB,IAAM7Q,CAAAA,CAAO,IAAA,CAAK,KAAA,CAAM6Q,CAAI,CAAA,CAC5B,OAAI,OAAO7Q,CAAAA,EAAS,UAAYA,CAAAA,GAAS,IAAA,CAAa,KAGjDuV,mBAAAA,CAAgBvV,CAAI,CAAA,CAOlBA,CAAAA,EANLiV,CAAAA,GACE,IAAI,MAAM,uDAAuD,CACnE,EACO,IAAA,CAIX,CAAA,MAAS9W,EAAO,CACd,OAAA8W,CAAAA,GAAU9W,CAAAA,YAAiB,KAAA,CAAQA,CAAAA,CAAQ,IAAI,KAAA,CAAM,MAAA,CAAOA,CAAK,CAAC,CAAC,EAC5D,IACT,CACF,CAAA,CAGMqX,CAAAA,CAAO,IAAM,CACjB,GAAK1V,CAAAA,CAEL,GAAI,CACF,IAAME,CAAAA,CAAgC,EAAC,CAEvC,IAAA,IAAWqV,CAAAA,IAAWF,CAAAA,CAChBC,CAAAA,CAAcC,CAAO,IACvBrV,CAAAA,CAAKqV,CAAO,EAAKvV,CAAAA,CAAO,KAAA,CAAkCuV,CAAO,CAAA,CAAA,CAIrEV,CAAAA,CAAQ,OAAA,CAAQnX,CAAAA,CAAK,IAAA,CAAK,SAAA,CAAUwC,CAAI,CAAC,CAAA,CACzCgV,IAAShV,CAAI,EACf,OAAS7B,CAAAA,CAAO,CACd8W,IAAU9W,CAAAA,YAAiB,KAAA,CAAQA,EAAQ,IAAI,KAAA,CAAM,OAAOA,CAAK,CAAC,CAAC,EACrE,CACF,CAAA,CAGMsX,CAAAA,CAAe,IAAM,CACrBP,GACF,YAAA,CAAaA,CAAW,EAE1BA,CAAAA,CAAc,UAAA,CAAWM,EAAMV,CAAQ,EACzC,CAAA,CAEA,OAAO,CACL,IAAA,CAAM,cAEN,MAAA,CAAS5B,CAAAA,EAAQ,CACfpT,CAAAA,CAASoT,CAAAA,CAGT,IAAMlT,CAAAA,CAAOsV,CAAAA,EAAK,CACdtV,CAAAA,GACFF,CAAAA,CAAO,KAAA,CAAM,OAAO,KAAA,CAAM,IAAM,CAC9B,IAAA,GAAW,CAACuV,EAAS5X,CAAK,CAAA,GAAK,MAAA,CAAO,OAAA,CAAQuC,CAAI,CAAA,CAC5CoV,EAAcC,CAAO,CAAA,GACtBvV,EAAQ,KAAA,CAAkCuV,CAAO,EAAI5X,CAAAA,CACtD0X,CAAAA,CAAY,GAAA,CAAIE,CAAO,CAAA,EAG7B,CAAC,EACDN,CAAAA,GAAY/U,CAAI,GAEpB,CAAA,CAEA,SAAA,CAAW,IAAM,CAEXkV,CAAAA,EACF,YAAA,CAAaA,CAAW,CAAA,CAE1BM,CAAAA,GACF,CAAA,CAEA,SAAA,CAAYH,GAAY,CACtBF,CAAAA,CAAY,IAAIE,CAAO,CAAA,CACnBD,CAAAA,CAAcC,CAAO,CAAA,EACvBI,CAAAA,GAEJ,CAAA,CAEA,YAAA,CAAeJ,GAAY,CACzBF,CAAAA,CAAY,OAAOE,CAAO,CAAA,CACtBD,EAAcC,CAAO,CAAA,EACvBI,IAEJ,CAAA,CAEA,aAAe9X,CAAAA,EAAY,CACzB,IAAI+X,CAAAA,CAAa,KAAA,CACjB,IAAA,IAAW9B,CAAAA,IAAUjW,CAAAA,CACfiW,CAAAA,CAAO,OAAS,KAAA,CAClBuB,CAAAA,CAAY,IAAIvB,CAAAA,CAAO,GAAG,EAE1BuB,CAAAA,CAAY,MAAA,CAAOvB,CAAAA,CAAO,GAAG,CAAA,CAE3BwB,CAAAA,CAAcxB,EAAO,GAAG,CAAA,GAC1B8B,EAAa,IAAA,CAAA,CAGbA,CAAAA,EACFD,IAEJ,CACF,CACF,CChIO,SAASE,EAAAA,CACd7Y,EAAoC,EAAC,CAC8B,CACnE,GAAM,CACJ,iBAAA8Y,CAAAA,CACA,cAAA,CAAAC,CAAAA,CACA,yBAAA,CAAAC,CAAAA,CAA4B,EAAA,CAC5B,wBAAAC,CAAAA,CAA0B,GAC5B,EAAIjZ,CAAAA,CAEEsN,CAAAA,CAAc,IAAI,GAAA,CAClB4L,CAAAA,CAAY,IAAI,GAAA,CAChBC,CAAAA,CAAU,IAAI,IACdC,CAAAA,CAA8B,CAClC,KAAM,CAAA,CACN,eAAA,CAAiB,EACjB,aAAA,CAAe,CAAA,CACf,aAAA,CAAe,CACjB,CAAA,CAEIC,CAAAA,CAAY,EACZC,CAAAA,CAAqB,CAAA,CAOrBC,EAA4B,CAAA,CAEhC,SAASC,EAAqB1Y,CAAAA,CAA+B,CAC3D,IAAI2Y,CAAAA,CAAInM,CAAAA,CAAY,GAAA,CAAIxM,CAAE,CAAA,CAC1B,OAAK2Y,IACHA,CAAAA,CAAI,CACF,YAAa,CAAA,CACb,eAAA,CAAiB,EACjB,aAAA,CAAe,CAAA,CACf,cAAe,CAAA,CACf,eAAA,CAAiB,CACnB,CAAA,CACAnM,CAAAA,CAAY,IAAIxM,CAAAA,CAAI2Y,CAAC,CAAA,CAAA,CAEhBA,CACT,CAEA,SAASC,EAAmB5Y,CAAAA,CAA6B,CACvD,IAAI2Y,CAAAA,CAAIP,CAAAA,CAAU,IAAIpY,CAAE,CAAA,CACxB,OAAK2Y,CAAAA,GACHA,CAAAA,CAAI,CACF,OAAQ,CAAA,CACR,WAAA,CAAa,EACb,MAAA,CAAQ,CAAA,CACR,QAAS,CAAA,CACT,aAAA,CAAe,CAAA,CACf,eAAA,CAAiB,CAAA,CACjB,aAAA,CAAe,EACf,aAAA,CAAe,CAAA,CACf,gBAAiB,CACnB,CAAA,CACAP,EAAU,GAAA,CAAIpY,CAAAA,CAAI2Y,CAAC,CAAA,CAAA,CAEdA,CACT,CAEA,SAASE,CAAAA,CAAiB7Y,CAAAA,CAA2B,CACnD,IAAI2Y,CAAAA,CAAIN,EAAQ,GAAA,CAAIrY,CAAE,CAAA,CACtB,OAAK2Y,CAAAA,GACHA,CAAAA,CAAI,CAAE,IAAA,CAAM,CAAA,CAAG,OAAQ,CAAA,CAAG,SAAA,CAAW,CAAE,CAAA,CACvCN,CAAAA,CAAQ,GAAA,CAAIrY,CAAAA,CAAI2Y,CAAC,CAAA,CAAA,CAEZA,CACT,CAEA,IAAMG,EAGF,CACF,IAAA,CAAM,cAEN,OAAA,EAAU,CACRP,CAAAA,CAAY,IAAA,CAAK,GAAA,GACnB,EAEA,oBAAA,CAAqBvY,CAAAA,CAAI+Y,EAAS,CAChC,IAAMvP,EAAM,WAAA,CAAY,GAAA,GAClBmP,CAAAA,CAAID,CAAAA,CAAqB1Y,CAAE,CAAA,CAQjC,GAPA2Y,EAAE,WAAA,EAAA,CACFA,CAAAA,CAAE,gBAAkB,IAAA,CAAK,GAAA,EAAI,CAMzBF,CAAAA,CAA4B,CAAA,CAAG,CACjC,IAAM9X,CAAAA,CAAW6I,CAAAA,CAAMiP,EACvBE,CAAAA,CAAE,eAAA,EAAmBhY,EACrB,IAAMqY,CAAAA,CAAaL,CAAAA,CAAE,WAAA,CACrBA,CAAAA,CAAE,aAAA,CAAgBA,EAAE,eAAA,CAAkBK,CAAAA,CAClCrY,EAAWgY,CAAAA,CAAE,aAAA,GAAeA,EAAE,aAAA,CAAgBhY,CAAAA,CAAAA,CAC9CA,CAAAA,CAAWuX,CAAAA,EACbF,CAAAA,GAAmBhY,CAAAA,CAAIW,CAAQ,EAEnC,CACA8X,EAA4BjP,EAC9B,CAAA,CAEA,gBAAgB9I,CAAAA,CAAUuY,CAAAA,CAAM,CAC9B,IAAMN,CAAAA,CAAIC,CAAAA,CAAmBlY,CAAQ,CAAA,CACrCiY,CAAAA,CAAE,SACJ,CAAA,CAEA,kBAAA,CAAmBjY,EAAUuY,CAAAA,CAAMtY,CAAAA,CAAU,CAC3C,IAAMgY,CAAAA,CAAIC,CAAAA,CAAmBlY,CAAQ,CAAA,CACrCiY,CAAAA,CAAE,cACFA,CAAAA,CAAE,eAAA,EAAmBhY,EACrBgY,CAAAA,CAAE,aAAA,CAAgBA,CAAAA,CAAE,eAAA,CAAkBA,CAAAA,CAAE,WAAA,CACpChY,EAAWgY,CAAAA,CAAE,aAAA,GAAeA,EAAE,aAAA,CAAgBhY,CAAAA,CAAAA,CAClDgY,EAAE,eAAA,CAAkB,IAAA,CAAK,GAAA,EAAI,CACzBhY,CAAAA,CAAWwX,CAAAA,EACbF,IAAiBvX,CAAAA,CAAUC,CAAQ,EAEvC,CAAA,CAEA,eAAA,CAAgBD,EAAUuY,CAAAA,CAAMC,CAAAA,CAAQ,CACtCN,CAAAA,CAAmBlY,CAAQ,EAAE,MAAA,GAC/B,CAAA,CAEA,gBAAgBA,CAAAA,CAAUuY,CAAAA,CAAME,EAAU,CACxCP,CAAAA,CAAmBlY,CAAQ,CAAA,CAAE,OAAA,GAC/B,CAAA,CAEA,iBAAiBA,CAAAA,CAAUuY,CAAAA,CAAM,CAC/BL,CAAAA,CAAmBlY,CAAQ,EAAE,aAAA,GAC/B,CAAA,CAEA,WAAA,CAAYV,CAAAA,CAAI,CACd,IAAM2Y,EAAIE,CAAAA,CAAiB7Y,CAAE,EAC7B2Y,CAAAA,CAAE,IAAA,EAAA,CACFA,EAAE,SAAA,CAAY,IAAA,CAAK,GAAA,GACrB,CAAA,CAEA,aAAA,CAAc3Y,EAAIkZ,CAAAA,CAAQ,CACxBL,EAAiB7Y,CAAE,CAAA,CAAE,SACvB,CAAA,CAEA,gBAAA,EAAmB,CACjBwY,CAAAA,CAAqB,WAAA,CAAY,GAAA,GAEjCC,CAAAA,CAA4B,EAC9B,EAEA,cAAA,EAAiB,CACf,IAAM9X,CAAAA,CAAW,WAAA,CAAY,GAAA,EAAI,CAAI6X,CAAAA,CACrCF,CAAAA,CAAU,OACVA,CAAAA,CAAU,eAAA,EAAmB3X,EAC7B2X,CAAAA,CAAU,aAAA,CAAgBA,EAAU,eAAA,CAAkBA,CAAAA,CAAU,IAAA,CAC5D3X,CAAAA,CAAW2X,CAAAA,CAAU,aAAA,GACvBA,EAAU,aAAA,CAAgB3X,CAAAA,EAC9B,EAEA,SAAA,EAAY,CACVmY,EAAO,KAAA,GACT,CAAA,CAEA,WAAA,EAAmC,CACjC,IAAMM,EAAoD,EAAC,CAC3D,OAAW,CAACpZ,CAAAA,CAAI2Y,CAAC,CAAA,GAAKnM,CAAAA,CAAa4M,EAAepZ,CAAE,CAAA,CAAI,CAAE,GAAG2Y,CAAE,EAE/D,IAAMU,CAAAA,CAAgD,EAAC,CACvD,IAAA,GAAW,CAACrZ,CAAAA,CAAI2Y,CAAC,CAAA,GAAKP,EAAWiB,CAAAA,CAAarZ,CAAE,EAAI,CAAE,GAAG2Y,CAAE,CAAA,CAE3D,IAAMW,CAAAA,CAA4C,EAAC,CACnD,IAAA,GAAW,CAACtZ,CAAAA,CAAI2Y,CAAC,IAAKN,CAAAA,CAASiB,CAAAA,CAAWtZ,CAAE,CAAA,CAAI,CAAE,GAAG2Y,CAAE,CAAA,CAEvD,OAAO,CACL,WAAA,CAAaS,CAAAA,CACb,UAAWC,CAAAA,CACX,OAAA,CAASC,EACT,SAAA,CAAW,CAAE,GAAGhB,CAAU,CAAA,CAC1B,MAAA,CAAQC,EAAY,IAAA,CAAK,GAAA,GAAQA,CAAAA,CAAY,CAC/C,CACF,CAAA,CAEA,KAAA,EAAc,CACZ/L,CAAAA,CAAY,KAAA,EAAM,CAClB4L,EAAU,KAAA,EAAM,CAChBC,EAAQ,KAAA,EAAM,CACdC,EAAU,IAAA,CAAO,CAAA,CACjBA,CAAAA,CAAU,eAAA,CAAkB,CAAA,CAC5BA,CAAAA,CAAU,cAAgB,CAAA,CAC1BA,CAAAA,CAAU,cAAgB,CAAA,CAC1BG,CAAAA,CAA4B,EAC9B,CACF,CAAA,CAEA,OAAOK,CACT,CC/BA,SAASS,IAAqB,CAC5B,OACE,WAAW,MAAA,EAAQ,UAAA,MACnB,CAAA,EAAG,IAAA,CAAK,KAAI,CAAE,QAAA,CAAS,EAAE,CAAC,CAAA,CAAA,EAAI,KAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,CAAG,EAAE,CAAC,EAEzE,CAEA,SAASC,GAAoBC,CAAAA,CAAkBC,CAAAA,CAA4B,CACzE,GAAID,CAAAA,CAAO,MAAA,GAAW,CAAA,CAAG,OAAO,CAAA,CAChC,IAAMpP,CAAAA,CAAS,CAAC,GAAGoP,CAAM,CAAA,CAAE,KAAK,CAAC,CAAA,CAAGlP,CAAAA,GAAM,CAAA,CAAIA,CAAC,CAAA,CACzCoP,EAAQ,IAAA,CAAK,IAAA,CAAMD,EAAa,GAAA,CAAOrP,CAAAA,CAAO,MAAM,CAAA,CAAI,CAAA,CAC9D,OAAOA,CAAAA,CAAO,IAAA,CAAK,GAAA,CAAI,EAAGsP,CAAK,CAAC,GAAK,CACvC,CAkCO,SAASC,EAAAA,CACdC,CAAAA,CAA8B,EAAC,CACR,CACvB,GAAM,CACJ,WAAA,CAAAC,CAAAA,CAAc,mBACd,OAAA,CAASC,CAAAA,CAAgB,EAAC,CAC1B,OAAA,CAASC,CAAAA,CAAgB,EAAC,CAC1B,MAAA,CAAQC,EAAe,EAAC,CACxB,eAAgBC,CAAAA,CAAuB,GACvC,MAAA,CAAA/G,CAAAA,CAAS,EACX,CAAA,CAAI0G,CAAAA,CAEEM,EAAqB,CACzB,QAAA,CAAUD,EAAqB,QAAA,EAAY,gBAAA,CAC3C,OAAQA,CAAAA,CAAqB,MAAA,EAAU,eACvC,OAAA,CAASA,CAAAA,CAAqB,SAAW,eAAA,CACzC,MAAA,CAAQA,EAAqB,MAAA,EAAU,cAAA,CACvC,KAAMA,CAAAA,CAAqB,IAAA,EAAQ,YACrC,CAAA,CAEM,CACJ,OAAA,CAASE,EAAiB,IAAA,CAC1B,cAAA,CAAAC,EACA,QAAA,CAAUC,CAAAA,CACV,cAAAC,CAAAA,CAAgB,GAClB,CAAA,CAAIR,CAAAA,CAEE,CACJ,OAAA,CAASS,EAAiB,IAAA,CAC1B,UAAA,CAAAC,EAAa,CAAA,CACb,QAAA,CAAAC,EAAW,GAAA,CACX,QAAA,CAAUC,CACZ,CAAA,CAAIX,CAAAA,CAGEY,CAAAA,CAAY,KAAK,GAAA,EAAI,CACrBC,EAAmB,IAAI,GAAA,CACvBC,EAAc,IAAI,GAAA,CAClBC,CAAAA,CAA8B,EAAC,CAC/BC,CAAAA,CAA4B,EAAC,CAC7BC,CAAAA,CAAiB,IAAI,GAAA,CAGrBC,CAAAA,CAAoB,IAAI,GAAA,CAG1BC,CAAAA,CACAd,CAAAA,GAAmBC,CAAAA,EAAmBK,CAAAA,CAAAA,GACxCQ,CAAAA,CAAc,YAAY,SAAY,CACpC,GAAI,CAIF,GAHIb,GAAmBF,CAAAA,EACrB,MAAME,CAAAA,CAAgB,KAAA,CAAM,IAAA,CAAKY,CAAAA,CAAkB,QAAQ,CAAC,EAE1DP,CAAAA,EAAmBH,CAAAA,CAAgB,CACrC,IAAMY,CAAAA,CAAgBL,CAAAA,CAAe,MAAA,CAAO,CAAA,CAAG,GAAG,EAC9CK,CAAAA,CAAc,MAAA,CAAS,GACzB,MAAMT,CAAAA,CAAgBS,CAAa,EAEvC,CACF,OAAS7a,CAAAA,CAAO,CACd,QAAQ,KAAA,CAAM,yCAAA,CAA2CA,CAAK,EAChE,CACF,EAAG8Z,CAAc,CAAA,CAAA,CAGnB,SAASgB,CAAAA,CAAaC,CAAAA,CAAkC,CACtD,GAAI,CAAClB,CAAAA,CAAgB,OAErB,IAAMxa,CAAAA,CAAM,GAAG0b,CAAAA,CAAU,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,YAAY,MAAA,CAAO,OAAA,CAAQA,EAAU,MAAM,CAAA,CAAE,MAAM,CAAC,CAAC,CAAA,CAAA,CACxGC,CAAAA,CAASV,CAAAA,CAAiB,IAAIjb,CAAG,CAAA,CAChC2b,IACHA,CAAAA,CAAS,GACTV,CAAAA,CAAiB,GAAA,CAAIjb,CAAAA,CAAK2b,CAAM,CAAA,CAAA,CAGlCA,CAAAA,CAAO,KAAKD,CAAS,CAAA,CAGjBC,EAAO,MAAA,CAAShB,CAAAA,EAClBgB,EAAO,KAAA,EAAM,CAIfC,CAAAA,CAAkBF,CAAAA,CAAU,IAAA,CAAMC,CAAM,EAExCpI,CAAAA,CAAO,gBAAA,GAAmBmI,CAAS,CAAA,CAGnCG,CAAAA,CAAYH,EAAU,IAAI,EAC5B,CAEA,SAASE,CAAAA,CAAkBhJ,CAAAA,CAAc+I,EAAiC,CACxE,GAAIA,EAAO,MAAA,GAAW,CAAA,CAAG,OAEzB,IAAM9B,CAAAA,CAAS8B,CAAAA,CAAO,GAAA,CAAKG,CAAAA,EAAMA,CAAAA,CAAE,KAAK,CAAA,CAClCC,CAAAA,CAAMlC,EAAO,MAAA,CAAO,CAACnP,EAAGC,CAAAA,GAAMD,CAAAA,CAAIC,EAAG,CAAC,CAAA,CAGtCqR,EAAaL,CAAAA,CAAO,CAAC,EACrBM,CAAAA,CAAYpC,CAAAA,CAAOA,EAAO,MAAA,CAAS,CAAC,CAAA,CAEpCqC,CAAAA,CAA+B,CACnC,IAAA,CAAAtJ,EACA,IAAA,CAAMoJ,CAAAA,CAAW,KACjB,KAAA,CAAOL,CAAAA,CAAO,OACd,GAAA,CAAAI,CAAAA,CACA,GAAA,CAAK,IAAA,CAAK,GAAA,CAAI,GAAGlC,CAAM,CAAA,CACvB,GAAA,CAAK,KAAK,GAAA,CAAI,GAAGA,CAAM,CAAA,CACvB,GAAA,CAAKkC,CAAAA,CAAMJ,CAAAA,CAAO,MAAA,CAClB,SAAA,CAAAM,EACA,WAAA,CAAa,IAAA,CAAK,KACpB,CAAA,CAEAX,EAAkB,GAAA,CAAI1I,CAAAA,CAAMsJ,CAAU,EACxC,CAEA,SAASL,EAAYM,CAAAA,CAA0B,CAC7C,QAAWC,CAAAA,IAAe/B,CAAAA,CAAc,CACtC,GAAI+B,CAAAA,CAAY,MAAA,GAAWD,CAAAA,CAAY,SAEvC,IAAME,EAASf,CAAAA,CAAkB,GAAA,CAAIa,CAAU,CAAA,CAC/C,GAAI,CAACE,CAAAA,CAAQ,SAEb,IAAMC,CAAAA,CAAc,CAAA,EAAGF,CAAAA,CAAY,MAAM,CAAA,CAAA,EAAIA,CAAAA,CAAY,SAAS,CAAA,CAAA,CAC5DG,CAAAA,CAAYlB,EAAe,GAAA,CAAIiB,CAAW,CAAA,CAC1CE,CAAAA,CAAWJ,CAAAA,CAAY,UAAA,EAAc,IAE3C,GAAIG,CAAAA,EAAa,KAAK,GAAA,EAAI,CAAIA,EAAYC,CAAAA,CAAU,SAEpD,IAAMC,CAAAA,CAAWL,CAAAA,CAAY,UAAY,GAAA,CACnCnc,CAAAA,CAAQoc,EAAO,SAAA,CACfK,CAAAA,CAAYN,EAAY,SAAA,CAE1BO,CAAAA,CAAY,KAAA,CAChB,OAAQF,CAAAA,EACN,KAAK,GAAA,CACHE,CAAAA,CAAY1c,EAAQyc,CAAAA,CACpB,MACF,KAAK,GAAA,CACHC,CAAAA,CAAY1c,CAAAA,CAAQyc,CAAAA,CACpB,MACF,KAAK,KACHC,CAAAA,CAAY1c,CAAAA,EAASyc,EACrB,MACF,KAAK,KACHC,CAAAA,CAAY1c,CAAAA,EAASyc,CAAAA,CACrB,MACF,KAAK,IAAA,CACHC,EAAY1c,CAAAA,GAAUyc,CAAAA,CACtB,KACJ,CAEA,GAAIC,EAAW,CACb,IAAMC,CAAAA,CAAyB,CAC7B,OAAA,CAASjD,EAAAA,GACT,MAAA,CAAQwC,CAAAA,CACR,aAAclc,CAAAA,CACd,SAAA,CAAAyc,EACA,QAAA,CAAAD,CAAAA,CACA,MAAA,CAAQL,CAAAA,CAAY,MAAA,CACpB,SAAA,CAAW,KAAK,GAAA,EAAI,CACpB,QAAS,CAAA,OAAA,EAAUD,CAAU,IAAIM,CAAQ,CAAA,CAAA,EAAIC,CAAS,CAAA,WAAA,EAAczc,CAAK,CAAA,CAAA,CAC3E,EASA,OAPAmb,CAAAA,CAAY,KAAKwB,CAAU,CAAA,CACvBxB,EAAY,MAAA,CAAS,GAAA,EACvBA,CAAAA,CAAY,MAAA,CAAO,CAAA,CAAGA,CAAAA,CAAY,OAAS,GAAI,CAAA,CACjDC,EAAe,GAAA,CAAIiB,CAAAA,CAAa,KAAK,GAAA,EAAK,EAE1C/I,CAAAA,CAAO,OAAA,GAAUqJ,CAAU,CAAA,CAEnBR,CAAAA,CAAY,QAClB,KAAK,MACH,OAAA,CAAQ,GAAA,CAAI,CAAA,gBAAA,EAAmBQ,CAAAA,CAAW,OAAO,CAAA,CAAE,EACnD,MACF,KAAK,OACH,OAAA,CAAQ,IAAA,CAAK,mBAAmBA,CAAAA,CAAW,OAAO,CAAA,CAAE,CAAA,CACpD,MACF,KAAK,QACH,OAAA,CAAQ,KAAA,CAAM,yBAAyBA,CAAAA,CAAW,OAAO,EAAE,CAAA,CAC3D,MACF,KAAK,UAAA,CACHR,CAAAA,CAAY,QAAA,GAAWC,EAAQK,CAAS,CAAA,CACxC,KACJ,CACF,CACF,CACF,CAEA,SAASG,CAAAA,CAAejK,CAAAA,CAItB,CAEA,IAAMkK,EAAsB,EAAC,CAC7B,OAAW,CAAC9c,CAAAA,CAAK2b,CAAM,CAAA,GAAKV,CAAAA,CAC1B,GAAIjb,CAAAA,CAAI,UAAA,CAAW,CAAA,EAAG4S,CAAI,CAAA,CAAA,CAAG,CAAA,CAC3B,QAAWkJ,CAAAA,IAAKH,CAAAA,CACdmB,EAAU,IAAA,CAAKhB,CAAAA,CAAE,KAAK,CAAA,CAI5B,OAAIgB,CAAAA,CAAU,SAAW,CAAA,CAAU,GAC5B,CACL,GAAA,CAAKlD,GAAoBkD,CAAAA,CAAW,EAAE,CAAA,CACtC,GAAA,CAAKlD,EAAAA,CAAoBkD,CAAAA,CAAW,EAAE,CAAA,CACtC,GAAA,CAAKlD,GAAoBkD,CAAAA,CAAW,EAAE,CACxC,CACF,CAEA,OAAO,CACL,gBAAA,CACElK,EACAmK,CAAAA,CAAiC,GACjC9c,CAAAA,CAAQ,CAAA,CACF,CACNwb,CAAAA,CAAa,CACX,IAAA,CAAA7I,CAAAA,CACA,IAAA,CAAM,SAAA,CACN,MAAA3S,CAAAA,CACA,MAAA,CAAA8c,EACA,SAAA,CAAW,IAAA,CAAK,KAClB,CAAC,EACH,CAAA,CAEA,QAAA,CACEnK,CAAAA,CACA3S,EACA8c,CAAAA,CAAiC,GAC3B,CACNtB,CAAAA,CAAa,CACX,IAAA,CAAA7I,CAAAA,CACA,IAAA,CAAM,OAAA,CACN,KAAA,CAAA3S,CAAAA,CACA,OAAA8c,CAAAA,CACA,SAAA,CAAW,KAAK,GAAA,EAClB,CAAC,EACH,CAAA,CAEA,gBAAA,CACEnK,CAAAA,CACA3S,CAAAA,CACA8c,CAAAA,CAAiC,EAAC,CAC5B,CACNtB,EAAa,CACX,IAAA,CAAA7I,EACA,IAAA,CAAM,WAAA,CACN,KAAA,CAAA3S,CAAAA,CACA,MAAA,CAAA8c,CAAAA,CACA,UAAW,IAAA,CAAK,GAAA,EAClB,CAAC,EACH,EAEA,SAAA,CAAUC,CAAAA,CAAuBC,CAAAA,CAAkC,CAEjE,GAAI,IAAA,CAAK,QAAO,CAAIpC,CAAAA,CAElB,OAAO,CACL,OAAA,CAAS,cACT,MAAA,CAAQ,aAAA,CACR,aAAA,CAAAmC,CAAAA,CACA,WAAA,CAAA9C,CAAAA,CACA,UAAW,IAAA,CAAK,GAAA,GAChB,MAAA,CAAQ,IAAA,CACR,KAAM,EAAC,CACP,KAAM,EACR,EAGF,IAAMgD,CAAAA,CAAkB,CACtB,OAAA,CAASD,CAAAA,CACJ/B,EAAY,GAAA,CAAI+B,CAAY,CAAA,EAAG,OAAA,EAAWtD,EAAAA,EAAW,CACtDA,IAAW,CACf,MAAA,CAAQA,IAAW,CACnB,YAAA,CAAAsD,EACA,aAAA,CAAAD,CAAAA,CACA,WAAA,CAAA9C,CAAAA,CACA,SAAA,CAAW,IAAA,CAAK,KAAI,CACpB,MAAA,CAAQ,KACR,IAAA,CAAM,GACN,IAAA,CAAM,EACR,CAAA,CAEA,OAAIU,CAAAA,GACFM,EAAY,GAAA,CAAIgC,CAAAA,CAAK,OAAQA,CAAI,CAAA,CACjC3J,EAAO,WAAA,GAAc2J,CAAI,CAAA,CAAA,CAGpBA,CACT,CAAA,CAEA,OAAA,CAAQC,EAAgBC,CAAAA,CAAqC,IAAA,CAAY,CACvE,GAAID,CAAAA,GAAW,cAAe,OAE9B,IAAMD,CAAAA,CAAOhC,CAAAA,CAAY,GAAA,CAAIiC,CAAM,EACnC,GAAKD,CAAAA,CAUL,KARAA,CAAAA,CAAK,OAAA,CAAU,KAAK,GAAA,EAAI,CACxBA,CAAAA,CAAK,QAAA,CAAWA,CAAAA,CAAK,OAAA,CAAUA,EAAK,SAAA,CACpCA,CAAAA,CAAK,OAASE,CAAAA,CAEdlC,CAAAA,CAAY,OAAOiC,CAAM,CAAA,CACzBhC,CAAAA,CAAe,IAAA,CAAK+B,CAAI,CAAA,CAGjB/B,EAAe,MAAA,CAASL,CAAAA,EAC7BK,EAAe,KAAA,EAAM,CAIvBM,EAAa,CACX,IAAA,CAAM,GAAGyB,CAAAA,CAAK,aAAa,WAC3B,IAAA,CAAM,WAAA,CACN,MAAOA,CAAAA,CAAK,QAAA,CACZ,OAAQ,EAAC,CACT,SAAA,CAAW,IAAA,CAAK,GAAA,EAClB,CAAC,CAAA,CAEGE,CAAAA,GAAW,SACb3B,CAAAA,CAAa,CACX,KAAM,CAAA,EAAGyB,CAAAA,CAAK,aAAa,CAAA,OAAA,CAAA,CAC3B,IAAA,CAAM,SAAA,CACN,MAAO,CAAA,CACP,MAAA,CAAQ,EAAC,CACT,SAAA,CAAW,KAAK,GAAA,EAClB,CAAC,CAAA,CAGH3J,CAAAA,CAAO,SAAA,GAAY2J,CAAI,EAAA,CACzB,CAAA,CAEA,WACEC,CAAAA,CACAE,CAAAA,CACA9d,EAA6C,MAAA,CACvC,CACN,GAAI4d,CAAAA,GAAW,aAAA,CAAe,OAE9B,IAAMD,CAAAA,CAAOhC,CAAAA,CAAY,IAAIiC,CAAM,CAAA,CAC9BD,GAELA,CAAAA,CAAK,IAAA,CAAK,IAAA,CAAK,CACb,SAAA,CAAW,IAAA,CAAK,KAAI,CACpB,OAAA,CAAAG,EACA,KAAA,CAAA9d,CACF,CAAC,EACH,CAAA,CAEA,UAAA,CACE4d,CAAAA,CACAnd,CAAAA,CACAC,CAAAA,CACM,CACN,GAAIkd,CAAAA,GAAW,cAAe,OAE9B,IAAMD,EAAOhC,CAAAA,CAAY,GAAA,CAAIiC,CAAM,CAAA,CAC9BD,CAAAA,GAELA,CAAAA,CAAK,KAAKld,CAAG,CAAA,CAAIC,GACnB,CAAA,CAEA,YAAA,EAA8B,CAE5B,IAAMqd,CAAAA,CAAiBhC,EAAkB,GAAA,CAAIf,CAAAA,CAAmB,QAAQ,CAAA,CAClEgD,CAAAA,CAAejC,EAAkB,GAAA,CAAIf,CAAAA,CAAmB,MAAM,CAAA,CAC9DiD,CAAAA,CAAgBlC,CAAAA,CAAkB,GAAA,CAAIf,CAAAA,CAAmB,OAAO,EAChEkD,CAAAA,CAAenC,CAAAA,CAAkB,IAAIf,CAAAA,CAAmB,MAAM,EAC9DmD,CAAAA,CAAapC,CAAAA,CAAkB,GAAA,CAAIf,CAAAA,CAAmB,IAAI,CAAA,CAE1DoD,EAAgBL,CAAAA,EAAgB,GAAA,EAAO,EACvCM,CAAAA,CAAcL,CAAAA,EAAc,KAAO,CAAA,CACnCM,CAAAA,CAAYF,CAAAA,CAAgB,CAAA,CAAIC,CAAAA,CAAcD,CAAAA,CAAgB,EAG9DG,CAAAA,CAAqBN,CAAAA,CACvBX,EAAetC,CAAAA,CAAmB,OAAO,EACzC,EAAC,CAEL,OAAO,CACL,OAAA,CAAS,CACP,KAAML,CAAAA,CACN,MAAA,CAAQ,KAAK,GAAA,EAAI,CAAIc,EACrB,SAAA,CAAAA,CACF,CAAA,CACA,OAAA,CAAS,MAAA,CAAO,WAAA,CAAYM,CAAiB,CAAA,CAC7C,MAAA,CAAQ,CAAC,GAAGH,CAAc,EAAE,KAAA,CAAM,IAAI,CAAA,CACtC,MAAA,CAAQ,CAAC,GAAGC,CAAW,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA,CAClC,OAAA,CAAS,CACP,aAAA,CAAAuC,CAAAA,CACA,WAAA,CAAAC,CAAAA,CACA,SAAA,CAAAC,CAAAA,CACA,WAAYL,CAAAA,EAAe,GAAA,EAAO,EAClC,UAAA,CAAYM,CAAAA,CAAmB,KAAO,CAAA,CACtC,WAAA,CAAa5C,EAAY,IAAA,CACzB,WAAA,CAAauC,GAAc,GAAA,EAAO,CAAA,CAClC,UAAWC,CAAAA,EAAY,GAAA,EAAO,CAChC,CACF,CACF,CAAA,CAEA,SAAA,CAAU9K,CAAAA,CAA4C,CACpD,IAAMyJ,CAAAA,CAASf,CAAAA,CAAkB,IAAI1I,CAAI,CAAA,CACzC,GAAI,CAACyJ,CAAAA,CAAQ,OAEb,IAAM0B,CAAAA,CAAclB,CAAAA,CAAejK,CAAI,CAAA,CACvC,OAAO,CAAE,GAAGyJ,CAAAA,CAAQ,GAAG0B,CAAY,CACrC,CAAA,CAEA,SAAA,CAAUC,CAAAA,CAAQ,GAAA,CAAkB,CAClC,OAAO,CAAC,GAAG7C,CAAc,CAAA,CAAE,MAAM,CAAC6C,CAAK,CACzC,CAAA,CAEA,SAAA,EAA0B,CACxB,OAAO,CAAC,GAAG5C,CAAW,CACxB,CAAA,CAEA,QAAS,CACP,OAAO,CACL,OAAA,CAAS,KAAA,CAAM,IAAA,CAAKE,EAAkB,MAAA,EAAQ,EAC9C,MAAA,CAAQ,CAAC,GAAGH,CAAc,CAAA,CAC1B,MAAA,CAAQ,CAAC,GAAGC,CAAW,CACzB,CACF,CAAA,CAEA,OAAQ,CACNH,CAAAA,CAAiB,OAAM,CACvBK,CAAAA,CAAkB,KAAA,EAAM,CACxBJ,CAAAA,CAAY,KAAA,GACZC,CAAAA,CAAe,MAAA,CAAS,EACxBC,CAAAA,CAAY,MAAA,CAAS,EACrBC,CAAAA,CAAe,KAAA,GACjB,CAAA,CAEA,MAAM,SAAU,CAEVE,CAAAA,GACF,cAAcA,CAAW,CAAA,CACzBA,EAAc,MAAA,CAAA,CAIhB,GAAI,CACEb,CAAAA,EAAmBF,CAAAA,EAAkBc,CAAAA,CAAkB,KAAO,CAAA,EAChE,MAAMZ,EAAgB,KAAA,CAAM,IAAA,CAAKY,EAAkB,MAAA,EAAQ,CAAC,CAAA,CAE1DP,CAAAA,EAAmBH,CAAAA,EAAkBO,EAAe,MAAA,CAAS,CAAA,EAC/D,MAAMJ,CAAAA,CAAgB,CAAC,GAAGI,CAAc,CAAC,EAE7C,CAAA,MAASxa,CAAAA,CAAO,CACd,QAAQ,KAAA,CACN,+DAAA,CACAA,CACF,EACF,CAGAsa,EAAiB,KAAA,EAAM,CACvBK,CAAAA,CAAkB,KAAA,EAAM,CACxBJ,CAAAA,CAAY,OAAM,CAClBC,CAAAA,CAAe,OAAS,CAAA,CACxBC,CAAAA,CAAY,OAAS,CAAA,CACrBC,CAAAA,CAAe,KAAA,GACjB,CAAA,CAEA,eAAA,EAAkB,CAChB,IAAMiC,CAAAA,CAAiBhC,EAAkB,GAAA,CAAIf,CAAAA,CAAmB,QAAQ,CAAA,CAClEgD,CAAAA,CAAejC,CAAAA,CAAkB,GAAA,CAAIf,CAAAA,CAAmB,MAAM,EAE9DoD,CAAAA,CAAgBL,CAAAA,EAAgB,KAAO,CAAA,CACvCM,CAAAA,CAAcL,GAAc,GAAA,EAAO,CAAA,CACnCM,CAAAA,CAAYF,CAAAA,CAAgB,CAAA,CAAIC,CAAAA,CAAcD,EAAgB,CAAA,CAG9DM,CAAAA,CAAmB7C,EAAY,MAAA,CAClC1Q,CAAAA,EAAM,KAAK,GAAA,EAAI,CAAIA,EAAE,SAAA,CAAY,GACpC,EAAE,MAAA,CAEF,OAAO,CACL,OAAA,CAASmT,CAAAA,CAAY,IAAOI,CAAAA,GAAqB,CAAA,CACjD,MAAA,CAAQ,IAAA,CAAK,GAAA,EAAI,CAAIjD,EACrB,SAAA,CAAA6C,CAAAA,CACA,aAAcI,CAChB,CACF,CACF,CACF,CAwBO,SAASC,EAAAA,CAAmBC,CAAAA,CAA4B,CAC7D,OAAO,CACL,QAAA,CACEC,EACA9d,CAAAA,CAQM,CACN,IAAMyc,CAAAA,CAAS,CAAE,KAAA,CAAOqB,CAAU,CAAA,CAElCD,CAAAA,CAAI,iBAAiB,gBAAA,CAAkBpB,CAAM,EAExCzc,CAAAA,CAAO,OAAA,EACV6d,EAAI,gBAAA,CAAiB,cAAA,CAAgBpB,CAAM,CAAA,CAG7CoB,CAAAA,CAAI,gBAAA,CAAiB,gBAAiB7d,CAAAA,CAAO,SAAA,CAAWyc,CAAM,CAAA,CAE1Dzc,CAAAA,CAAO,cAAgB,MAAA,GACzB6d,CAAAA,CAAI,gBAAA,CAAiB,oBAAA,CAAsBpB,CAAAA,CAAQzc,CAAAA,CAAO,WAAW,CAAA,CACrE6d,CAAAA,CAAI,iBAAiB,cAAA,CAAgBpB,CAAAA,CAAQzc,EAAO,WAAW,CAAA,CAAA,CAG7DA,CAAAA,CAAO,YAAA,GAAiB,MAAA,GAC1B6d,CAAAA,CAAI,iBACF,qBAAA,CACApB,CAAAA,CACAzc,EAAO,YACT,CAAA,CACA6d,EAAI,gBAAA,CAAiB,cAAA,CAAgBpB,CAAAA,CAAQzc,CAAAA,CAAO,YAAY,CAAA,CAAA,CAG9DA,EAAO,IAAA,GAAS,MAAA,EAClB6d,EAAI,gBAAA,CAAiB,YAAA,CAAcpB,EAAQzc,CAAAA,CAAO,IAAI,EAGpDA,CAAAA,CAAO,SAAA,GAAc,QACvB6d,CAAAA,CAAI,gBAAA,CAAiB,mBAAoBpB,CAAAA,CAAQzc,CAAAA,CAAO,SAAS,EAErE,CAAA,CAEA,cAAA,CACE+d,CAAAA,CACA/d,CAAAA,CAKM,CACN,IAAMyc,CAAAA,CAAS,CAAE,UAAWsB,CAAc,CAAA,CAE1CF,EAAI,gBAAA,CAAiB,kBAAA,CAAoBpB,CAAM,CAAA,CAE1Czc,CAAAA,CAAO,MAAA,EACV6d,EAAI,gBAAA,CAAiB,oBAAA,CAAsBpB,CAAM,CAAA,CAG/Czc,CAAAA,CAAO,SACT6d,CAAAA,CAAI,gBAAA,CAAiB,kBAAA,CAAoBpB,CAAM,CAAA,CAGjDoB,CAAAA,CAAI,iBAAiB,mBAAA,CAAqB7d,CAAAA,CAAO,UAAWyc,CAAM,EACpE,EAEA,aAAA,CACEuB,CAAAA,CACAhe,CAAAA,CAKM,CACN,IAAMyc,CAAAA,CAAS,CAAE,IAAA,CAAMuB,CAAS,EAEhCH,CAAAA,CAAI,gBAAA,CAAiB,oBAAqBpB,CAAM,CAAA,CAE5Czc,CAAAA,CAAO,QAAA,CACT6d,CAAAA,CAAI,gBAAA,CAAiB,oBAAqBpB,CAAM,CAAA,CAEhDoB,EAAI,gBAAA,CAAiB,mBAAA,CAAqBpB,CAAM,CAAA,CAG9Czc,CAAAA,CAAO,QAAA,EACT6d,CAAAA,CAAI,gBAAA,CAAiB,mBAAA,CAAqBpB,CAAM,CAAA,CAGlDoB,CAAAA,CAAI,iBAAiB,oBAAA,CAAsB7d,CAAAA,CAAO,WAAYyc,CAAM,EACtE,CAAA,CAEA,YAAA,CAAawB,CAAAA,CAAmBC,CAAAA,CAAiBC,EAAyB,CACxEN,CAAAA,CAAI,iBAAiB,eAAA,CAAiB,CAAE,KAAMI,CAAAA,CAAW,EAAA,CAAIC,CAAQ,CAAC,CAAA,CACtEL,EAAI,gBAAA,CAAiB,iBAAA,CAAmBM,CAAS,EACnD,CACF,CACF,CCx0BA,SAASC,EAAAA,CAAczE,CAAAA,CAA0C,CAC/D,IAAM0E,EAAgE,CACpE,CACE,IAAK,cAAA,CACL,KAAA,CAAO,CAAE,WAAA,CAAa1E,CAAAA,CAAO,WAAA,EAAe,kBAAmB,CACjE,CAAA,CAIA,CACE,GAAA,CAAK,oBAAA,CACL,MAAO,CAAE,WAAA,CAAa,qBAAsB,CAC9C,CAAA,CACA,CACE,GAAA,CAAK,wBAAA,CACL,KAAA,CAAO,CAAE,WAAA,CAAa,YAAa,CACrC,CAAA,CACA,CACE,IAAK,uBAAA,CACL,KAAA,CAAO,CAAE,WAAA,CAAa,QAAS,CACjC,CACF,CAAA,CASA,GAPIA,EAAO,cAAA,EACT0E,CAAAA,CAAM,KAAK,CACT,GAAA,CAAK,iBAAA,CACL,KAAA,CAAO,CAAE,WAAA,CAAa1E,EAAO,cAAe,CAC9C,CAAC,CAAA,CAGCA,CAAAA,CAAO,mBACT,IAAA,GAAW,CAACja,CAAAA,CAAK4e,CAAG,CAAA,GAAK,MAAA,CAAO,QAAQ3E,CAAAA,CAAO,kBAAkB,EAC/D0E,CAAAA,CAAM,IAAA,CAAK,CAAE,GAAA,CAAA3e,CAAAA,CAAK,KAAA,CAAO,CAAE,WAAA,CAAa4e,CAAI,CAAE,CAAC,CAAA,CAInD,OAAO,CAAE,UAAA,CAAYD,CAAM,CAC7B,CAEA,SAASE,EAAAA,CAAQC,CAAAA,CAA6B,CAC5C,OAAO,CAAA,EAAG,OAAOA,CAAW,CAAA,CAAI,OAAO,GAAS,CAAC,CAAA,CACnD,CAEA,SAASC,EAAAA,CAAiBvd,EAAsB,CAC9C,OAAQA,GACN,KAAK,UACH,OAAO,KAAA,CACT,KAAK,OAAA,CACH,OAAO,OAAA,CACT,KAAK,WAAA,CACH,OAAO,YACT,QACE,OAAO,OACX,CACF,CAEA,SAASwd,EAAAA,CACPC,CAAAA,CACAC,CAAAA,CACAC,EACyB,CACzB,IAAMC,EAAeH,CAAAA,CAAQ,GAAA,CAAK5C,GAAW,CAI3C,IAAMgD,CAAAA,CAAchD,CAAAA,CAAO,WAAA,CAAc,GAAA,CAEnCiD,EAAa,CACjB,CACE,MAAOjD,CAAAA,CAAO,IAAA,GAAS,UAAYA,CAAAA,CAAO,GAAA,CAAM,MAAA,CAChD,QAAA,CAAUA,CAAAA,CAAO,IAAA,GAAS,UAAYA,CAAAA,CAAO,SAAA,CAAY,OACzD,YAAA,CAAcwC,EAAAA,CAAQxC,EAAO,WAAW,CAAA,CACxC,iBAAA,CAAmBwC,EAAAA,CAAQQ,CAAW,CAAA,CACtC,WAAY,EACd,CACF,CAAA,CAEME,CAAAA,CAAWR,GAAiB1C,CAAAA,CAAO,IAAI,CAAA,CACvCmD,CAAAA,CAAsC,CAC1C,IAAA,CAAMnD,EAAO,IAAA,CACb,IAAA,CAAM,EACR,CAAA,CAEA,OAAIkD,IAAa,KAAA,CACfC,CAAAA,CAAW,IAAM,CACf,UAAA,CAAAF,EACA,sBAAA,CAAwB,CAAA,CACxB,YAAa,IACf,CAAA,CACSC,IAAa,WAAA,CACtBC,CAAAA,CAAW,SAAA,CAAY,CACrB,UAAA,CAAY,CACV,CACE,KAAA,CAAOnD,CAAAA,CAAO,MACd,GAAA,CAAKA,CAAAA,CAAO,IACZ,GAAA,CAAKA,CAAAA,CAAO,GAAA,CACZ,GAAA,CAAKA,CAAAA,CAAO,GAAA,CACZ,aAAcwC,EAAAA,CAAQxC,CAAAA,CAAO,WAAW,CAAA,CACxC,iBAAA,CAAmBwC,GAAQQ,CAAW,CAAA,CACtC,UAAA,CAAY,EACd,CACF,EACA,sBAAA,CAAwB,CAC1B,EAEAG,CAAAA,CAAW,KAAA,CAAQ,CAAE,UAAA,CAAAF,CAAW,CAAA,CAG3BE,CACT,CAAC,CAAA,CAED,OAAO,CACL,eAAA,CAAiB,CACf,CACE,QAAA,CAAAN,EACA,YAAA,CAAc,CACZ,CACE,KAAA,CAAO,CAAE,IAAA,CAAM,YAAa,OAAA,CAASC,CAAa,EAClD,OAAA,CAASC,CACX,CACF,CACF,CACF,CACF,CACF,CAEA,SAASK,GACPC,CAAAA,CACAR,CAAAA,CACAC,EACyB,CACzB,IAAMQ,EAAQD,CAAAA,CAAO,GAAA,CAAKxC,CAAAA,EAAS,CACjC,IAAM3J,CAAAA,CAAS2J,EAAK,IAAA,CAAK,GAAA,CAAKtd,IAAS,CACrC,YAAA,CAAcif,GAAQjf,CAAAA,CAAI,SAAS,EACnC,IAAA,CAAMA,CAAAA,CAAI,MACV,UAAA,CAAY,CACV,CAAE,GAAA,CAAK,SAAA,CAAW,MAAO,CAAE,WAAA,CAAaA,CAAAA,CAAI,OAAQ,CAAE,CAAA,CACtD,CAAE,GAAA,CAAK,OAAA,CAAS,MAAO,CAAE,WAAA,CAAaA,EAAI,KAAM,CAAE,CACpD,CACF,CAAA,CAAE,CAAA,CAEIggB,EAAa,MAAA,CAAO,OAAA,CAAQ1C,EAAK,IAAI,CAAA,CAAE,IAAI,CAAC,CAACld,CAAAA,CAAK4e,CAAG,CAAA,IAAO,CAChE,IAAA5e,CAAAA,CACA,KAAA,CACE,OAAO4e,CAAAA,EAAQ,QAAA,CACX,CAAE,WAAA,CAAaA,CAAI,CAAA,CACnB,OAAOA,CAAAA,EAAQ,QAAA,CACb,CAAE,QAAA,CAAU,CAAA,EAAGA,CAAG,CAAA,CAAG,CAAA,CACrB,CAAE,SAAA,CAAWA,CAAI,CAC3B,CAAA,CAAE,CAAA,CAEIiB,CAAAA,CACJ3C,EAAK,MAAA,GAAW,IAAA,CAAO,EAAIA,CAAAA,CAAK,MAAA,GAAW,QAAU,CAAA,CAAI,CAAA,CAE3D,OAAO,CACL,OAAA,CAASA,CAAAA,CAAK,QAAQ,OAAA,CAAQ,IAAA,CAAM,EAAE,CAAA,CAAE,MAAA,CAAO,GAAI,GAAG,CAAA,CAAE,KAAA,CAAM,CAAA,CAAG,EAAE,CAAA,CACnE,OAAQA,CAAAA,CAAK,MAAA,CAAO,QAAQ,IAAA,CAAM,EAAE,EAAE,MAAA,CAAO,EAAA,CAAI,GAAG,CAAA,CAAE,KAAA,CAAM,EAAG,EAAE,CAAA,CACjE,aAAcA,CAAAA,CAAK,YAAA,CACfA,EAAK,YAAA,CAAa,OAAA,CAAQ,IAAA,CAAM,EAAE,CAAA,CAAE,MAAA,CAAO,GAAI,GAAG,CAAA,CAAE,MAAM,CAAA,CAAG,EAAE,EAC/D,MAAA,CACJ,IAAA,CAAMA,CAAAA,CAAK,aAAA,CACX,IAAA,CAAM,CAAA,CACN,kBAAmB2B,EAAAA,CAAQ3B,CAAAA,CAAK,SAAS,CAAA,CACzC,eAAA,CAAiBA,EAAK,OAAA,CAClB2B,EAAAA,CAAQ3B,CAAAA,CAAK,OAAO,CAAA,CACpB2B,EAAAA,CAAQ3B,EAAK,SAAS,CAAA,CAC1B,WAAA0C,CAAAA,CACA,MAAA,CAAArM,EACA,MAAA,CAAQ,CAAE,IAAA,CAAMsM,CAAW,CAC7B,CACF,CAAC,CAAA,CAED,OAAO,CACL,aAAA,CAAe,CACb,CACE,QAAA,CAAAX,CAAAA,CACA,UAAA,CAAY,CACV,CACE,KAAA,CAAO,CAAE,IAAA,CAAM,WAAA,CAAa,QAASC,CAAa,CAAA,CAClD,MAAAQ,CACF,CACF,CACF,CACF,CACF,CACF,CA6BO,SAASG,EAAAA,CAAmB7F,EAA0C,CAC3E,GAAM,CACJ,QAAA,CAAA8F,CAAAA,CACA,OAAA,CAAA7Q,CAAAA,CAAU,EAAC,CACX,aAAAiQ,CAAAA,CAAe,OAAA,CACf,UAAAa,CAAAA,CAAY,GAAA,CACZ,MAAOC,CAAAA,CAAU,UAAA,CAAW,MAC5B,OAAA,CAAAxI,CACF,EAAIwC,CAAAA,CAGJ,GAAI,CACF,IAAM/D,CAAAA,CAAM,IAAI,GAAA,CAAI6J,CAAQ,CAAA,CAC5B,GAAI7J,CAAAA,CAAI,QAAA,GAAa,SAAWA,CAAAA,CAAI,QAAA,GAAa,SAC/C,MAAM,IAAI,MACR,2DACF,CAEJ,CAAA,MAASvV,CAAAA,CAAO,CACd,MAAM,IAAI,KAAA,CACR,CAAA,uCAAA,EAA0Cof,CAAQ,CAAA,GAAA,EAAMpf,CAAAA,YAAiB,MAAQA,CAAAA,CAAM,OAAA,CAAU,MAAA,CAAOA,CAAK,CAAC,CAAA,CAChH,CACF,CAUA,GAPI,yBAAyB,IAAA,CAAKof,CAAQ,GACxC,OAAA,CAAQ,IAAA,CACN,CAAA,2BAAA,EAA8BA,CAAQ,CAAA,gLAAA,CACxC,CAAA,CAIEC,GAAa,CAAA,EAAK,CAAC,OAAO,QAAA,CAASA,CAAS,EAC9C,MAAM,IAAI,KAAA,CAAM,CAAA,4CAAA,EAA+CA,CAAS,CAAA,CAAE,EAG5E,IAAMd,CAAAA,CAAWR,GAAczE,CAAM,CAAA,CAErC,eAAeiG,CAAAA,CACbrU,CAAAA,CACAlF,CAAAA,CACAnF,CAAAA,CACe,CACf,IAAM0U,EAAM,CAAA,EAAG6J,CAAAA,CAAS,QAAQ,KAAA,CAAO,EAAE,CAAC,CAAA,EAAGlU,CAAI,CAAA,CAAA,CAC3CsU,CAAAA,CAAa,IAAI,eAAA,CACjBjN,EAAQ,UAAA,CAAW,IAAMiN,EAAW,KAAA,EAAM,CAAGH,CAAS,CAAA,CAE5D,GAAI,CACF,IAAMI,CAAAA,CAAW,MAAMH,CAAAA,CAAQ/J,CAAAA,CAAK,CAClC,MAAA,CAAQ,MAAA,CACR,QAAS,CACP,cAAA,CAAgB,kBAAA,CAChB,GAAGhH,CACL,CAAA,CACA,KAAM,IAAA,CAAK,SAAA,CAAUvI,CAAI,CAAA,CACzB,MAAA,CAAQwZ,EAAW,MACrB,CAAC,CAAA,CAED,GAAI,CAACC,CAAAA,CAAS,GACZ,MAAM,IAAI,MACR,CAAA,gCAAA,EAAmCA,CAAAA,CAAS,MAAM,CAAA,CAAA,EAAIA,CAAAA,CAAS,UAAU,CAAA,CAC3E,CAEJ,CAAA,MAASzf,EAAO,CACd,IAAM0f,EAAM1f,CAAAA,YAAiB,KAAA,CAAQA,EAAQ,IAAI,KAAA,CAAM,MAAA,CAAOA,CAAK,CAAC,CAAA,CAChE8W,EACFA,CAAAA,CAAQ4I,CAAAA,CAAK7e,CAAI,CAAA,CAEjB,OAAA,CAAQ,MAAM,CAAA,wBAAA,EAA2BA,CAAI,CAAA,OAAA,CAAA,CAAW6e,CAAAA,CAAI,OAAO,EAEvE,QAAE,CACA,YAAA,CAAanN,CAAK,EACpB,CACF,CAEA,OAAO,CACL,MAAM,aAAA,CAAc+L,CAAAA,CAA4C,CAC9D,GAAIA,CAAAA,CAAQ,MAAA,GAAW,EAAG,OAC1B,IAAMtY,EAAOqY,EAAAA,CAAeC,CAAAA,CAASC,CAAAA,CAAUC,CAAY,CAAA,CAC3D,MAAMe,EAAK,aAAA,CAAevZ,CAAAA,CAAM,SAAS,EAC3C,CAAA,CAEA,MAAM,YAAA,CAAa+Y,CAAAA,CAAoC,CACrD,GAAIA,CAAAA,CAAO,SAAW,CAAA,CAAG,OACzB,IAAM/Y,CAAAA,CAAO8Y,EAAAA,CAAcC,EAAQR,CAAAA,CAAUC,CAAY,CAAA,CACzD,MAAMe,CAAAA,CAAK,YAAA,CAAcvZ,EAAM,QAAQ,EACzC,CACF,CACF,KC5Qa2Z,EAAAA,CAAN,cAAsC,KAAM,CACxC,IAAA,CAAO,cAAA,CACP,aACA,KAAA,CAET,WAAA,CACE1N,EACA2N,CAAAA,CACAvM,CAAAA,CAA8B,OAC9BwM,CAAAA,CACA,CACA,IAAMC,CAAAA,CAAMD,CAAAA,CACR,CAAA,oCAAA,EAAuC5N,CAAI,CAAA,KAAA,EAAQoB,CAAK,KAAKwM,CAAM,CAAA,CAAA,CACnE,uCAAuC5N,CAAI,CAAA,KAAA,EAAQoB,CAAK,CAAA,iCAAA,EAAoC,IAAA,CAAK,IAAA,CAAKuM,EAAe,GAAI,CAAC,KAC9H,KAAA,CAAME,CAAG,EACT,IAAA,CAAK,IAAA,CAAO,yBAAA,CACZ,IAAA,CAAK,YAAA,CAAeF,CAAAA,CACpB,KAAK,KAAA,CAAQvM,EACf,CACF,EAqCO,SAAS0M,GACdzG,CAAAA,CAA+B,EAAC,CAChB,CAChB,GAAM,CACJ,iBAAA0G,CAAAA,CAAmB,CAAA,CACnB,eAAAC,CAAAA,CAAiB,GAAA,CACjB,oBAAAC,CAAAA,CAAsB,CAAA,CACtB,eAAA,CAAAC,CAAAA,CAAkB,GAAA,CAClB,aAAA,CAAAC,EACA,YAAA,CAAAC,CAAAA,CAAe,kBACf,IAAA,CAAApO,CAAAA,CAAO,UACP,SAAA,CAAAqO,CAAAA,CAAY,IAAM,IAAA,CAClB,aAAA,CAAAC,CACF,CAAA,CAAIjH,CAAAA,CAGJ,GAAI0G,CAAAA,CAAmB,CAAA,EAAK,CAAC,MAAA,CAAO,QAAA,CAASA,CAAgB,CAAA,CAC3D,MAAM,IAAI,MACR,CAAA,8DAAA,EAAiEA,CAAgB,EACnF,CAAA,CAEF,GAAIC,GAAkB,CAAA,EAAK,CAAC,MAAA,CAAO,QAAA,CAASA,CAAc,CAAA,CACxD,MAAM,IAAI,KAAA,CACR,8DAA8DA,CAAc,CAAA,CAC9E,EAEF,GAAIC,CAAAA,CAAsB,CAAA,EAAK,CAAC,MAAA,CAAO,QAAA,CAASA,CAAmB,CAAA,CACjE,MAAM,IAAI,KAAA,CACR,CAAA,iEAAA,EAAoEA,CAAmB,CAAA,CACzF,CAAA,CAEF,GAAIC,CAAAA,EAAmB,CAAA,EAAK,CAAC,OAAO,QAAA,CAASA,CAAe,EAC1D,MAAM,IAAI,MACR,CAAA,4DAAA,EAA+DA,CAAe,CAAA,CAChF,CAAA,CAGF,IAAI9M,CAAAA,CAAsB,SACtBmN,CAAAA,CAA8B,GAC9BC,CAAAA,CAAmB,CAAA,CACnBC,EAAoB,CAAA,CACpBC,CAAAA,CAAkB,IAAA,CAAK,GAAA,EAAI,CAC3BC,CAAAA,CAAW,EAGX5D,CAAAA,CAAgB,CAAA,CAChB6D,EAAgB,CAAA,CAChBC,CAAAA,CAAiB,EACjBC,CAAAA,CAAgB,CAAA,CAChBC,CAAAA,CAAiC,IAAA,CACjCC,CAAAA,CAAiC,IAAA,CAErC,SAASC,CAAAA,CAAWC,CAAAA,CAA8B,CAChD,GAAI9N,CAAAA,GAAU8N,EAAU,OACxB,IAAMC,EAAW/N,CAAAA,CACjBA,CAAAA,CAAQ8N,EACRR,CAAAA,CAAkB,IAAA,CAAK,KAAI,CAEvBQ,CAAAA,GAAa,SACfP,CAAAA,CAAW,IAAA,CAAK,GAAA,EAAI,CAAA,CAElBO,CAAAA,GAAa,WAAA,GACfV,EAAmB,CAAA,CACnBC,CAAAA,CAAoB,GAGtBH,CAAAA,GAAgBa,CAAAA,CAAUD,CAAQ,CAAA,CAE9Bf,CAAAA,EACFA,CAAAA,CAAc,gBAAA,CAAiB,CAAA,EAAGC,CAAY,gBAAiB,CAC7D,IAAA,CAAApO,EACA,IAAA,CAAMmP,CAAAA,CACN,GAAID,CACN,CAAC,EAEL,CAEA,SAASE,CAAAA,EAA4B,CACnC,IAAMC,CAAAA,CAAS,KAAK,GAAA,EAAI,CAAInB,EAC5B,OAAAK,CAAAA,CAAoBA,CAAAA,CAAkB,MAAA,CAAQhO,CAAAA,EAAMA,CAAAA,CAAI8O,CAAM,CAAA,CACvDd,CAAAA,CAAkB,MAC3B,CAEA,SAASe,GAAsB,CAC7BT,CAAAA,EAAAA,CACAG,CAAAA,CAAkB,IAAA,CAAK,GAAA,EAAI,CAEvBb,GACFA,CAAAA,CAAc,gBAAA,CAAiB,GAAGC,CAAY,CAAA,QAAA,CAAA,CAAY,CAAE,IAAA,CAAApO,CAAK,CAAC,CAAA,CAGhEoB,CAAAA,GAAU,WAAA,GACZqN,IACIA,CAAAA,EAAqBR,CAAAA,GACvBgB,EAAW,QAAQ,CAAA,CACnBV,EAAoB,EAAC,CAAA,EAG3B,CAEA,SAASgB,CAAAA,CAAcxhB,CAAAA,CAAoB,CACzC,GAAI,CAACsgB,EAAUtgB,CAAK,CAAA,CAAG,CACrBuhB,CAAAA,EAAc,CACd,MACF,CAEAV,CAAAA,EAAAA,CACAG,EAAkB,IAAA,CAAK,GAAA,GACvBR,CAAAA,CAAkB,IAAA,CAAK,KAAK,GAAA,EAAK,CAAA,CAGjC,IAAMiB,CAAAA,CAAgBzB,CAAAA,CAAmB,EASzC,GARIQ,CAAAA,CAAkB,OAASiB,CAAAA,GAC7BjB,CAAAA,CAAoBA,EAAkB,KAAA,CAAM,CAACiB,CAAa,CAAA,CAAA,CAGxDrB,CAAAA,EACFA,CAAAA,CAAc,iBAAiB,CAAA,EAAGC,CAAY,WAAY,CAAE,IAAA,CAAApO,CAAK,CAAC,CAAA,CAGhEoB,CAAAA,GAAU,WAAA,CAAa,CACzB6N,CAAAA,CAAW,MAAM,CAAA,CACjB,MACF,CAEI7N,CAAAA,GAAU,QAAA,EAAYgO,GAAkB,EAAKrB,CAAAA,EAC/CkB,CAAAA,CAAW,MAAM,EAErB,CAEA,OAAO,CACL,MAAM,QAAWQ,CAAAA,CAAkC,CAQjD,GAPA1E,CAAAA,EAAAA,CAEIoD,CAAAA,EACFA,CAAAA,CAAc,gBAAA,CAAiB,CAAA,EAAGC,CAAY,YAAa,CAAE,IAAA,CAAApO,CAAK,CAAC,CAAA,CAIjEoB,IAAU,MAAA,CAEZ,GAAI,IAAA,CAAK,GAAA,EAAI,CAAIuN,CAAAA,EAAYX,EAC3BiB,CAAAA,CAAW,WAAW,OAEtB,MAAAH,CAAAA,EAAAA,CACIX,GACFA,CAAAA,CAAc,gBAAA,CAAiB,CAAA,EAAGC,CAAY,CAAA,SAAA,CAAA,CAAa,CACzD,KAAApO,CACF,CAAC,EAEG,IAAI0N,EAAAA,CACR1N,EACAgO,CAAAA,EAAkB,IAAA,CAAK,KAAI,CAAIW,CAAAA,CACjC,EAIJ,GAAIvN,CAAAA,GAAU,YAAa,CACzB,GAAIoN,GAAoBP,CAAAA,CACtB,MAAAa,CAAAA,EAAAA,CACM,IAAIpB,EAAAA,CACR1N,CAAAA,CACAgO,EACA,WAAA,CACA,CAAA,oBAAA,EAAuBC,CAAmB,CAAA,UAAA,CAC5C,CAAA,CAEFO,IACF,CAGA,IAAM5N,CAAAA,CAAQ,IAAA,CAAK,GAAA,EAAI,CACvB,GAAI,CACF,IAAMlT,EAAS,MAAM+hB,CAAAA,GACrB,OAAAH,CAAAA,EAAc,CAEVnB,CAAAA,EACFA,CAAAA,CAAc,gBAAA,CACZ,GAAGC,CAAY,CAAA,QAAA,CAAA,CACf,KAAK,GAAA,EAAI,CAAIxN,EACb,CAAE,IAAA,CAAAZ,CAAK,CACT,CAAA,CAGKtS,CACT,OAASK,CAAAA,CAAO,CACd,IAAM0f,CAAAA,CAAM1f,CAAAA,YAAiB,MAAQA,CAAAA,CAAQ,IAAI,KAAA,CAAM,MAAA,CAAOA,CAAK,CAAC,EACpE,MAAAwhB,CAAAA,CAAc9B,CAAG,CAAA,CAEbU,CAAAA,EACFA,EAAc,gBAAA,CACZ,CAAA,EAAGC,CAAY,CAAA,QAAA,CAAA,CACf,IAAA,CAAK,GAAA,GAAQxN,CAAAA,CACb,CAAE,KAAAZ,CAAK,CACT,EAGIjS,CACR,CACF,CAAA,CAEA,QAAA,EAAyB,CAEvB,OAAIqT,IAAU,MAAA,EAAU,IAAA,CAAK,KAAI,CAAIuN,CAAAA,EAAYX,GAC/CiB,CAAAA,CAAW,WAAW,EAEjB7N,CACT,CAAA,CAEA,UAAgC,CAG9B,OAAO,CACL,KAAA,CAFmB,IAAA,CAAK,UAAS,CAGjC,aAAA,CAAA2J,CAAAA,CACA,aAAA,CAAA6D,CAAAA,CACA,cAAA,CAAAC,EACA,aAAA,CAAAC,CAAAA,CACA,eAAgBM,CAAAA,EAAkB,CAClC,gBAAAL,CAAAA,CACA,eAAA,CAAAC,CAAAA,CACA,eAAA,CAAAN,CACF,CACF,EAEA,UAAA,CAAWQ,CAAAA,CAA8B,CACvCD,CAAAA,CAAWC,CAAQ,EACrB,CAAA,CAEA,KAAA,EAAc,CACZ,IAAMC,CAAAA,CAAW/N,CAAAA,CACjBA,EAAQ,QAAA,CACRmN,CAAAA,CAAoB,EAAC,CACrBC,CAAAA,CAAmB,EACnBC,CAAAA,CAAoB,CAAA,CACpBC,CAAAA,CAAkB,IAAA,CAAK,GAAA,EAAI,CAC3BC,EAAW,CAAA,CACX5D,CAAAA,CAAgB,EAChB6D,CAAAA,CAAgB,CAAA,CAChBC,EAAiB,CAAA,CACjBC,CAAAA,CAAgB,CAAA,CAChBC,CAAAA,CAAkB,IAAA,CAClBC,CAAAA,CAAkB,KACdG,CAAAA,GAAa,QAAA,EACfb,IAAgBa,CAAAA,CAAU,QAAQ,EAEtC,CAAA,CAEA,SAAA,EAAqB,CACnB,OAAI/N,CAAAA,GAAU,QAAA,CAAiB,KAC3BA,CAAAA,GAAU,MAAA,CACL,KAAK,GAAA,EAAI,CAAIuN,GAAYX,CAAAA,CAG3BQ,CAAAA,CAAmBP,CAC5B,CACF,CACF","file":"index.cjs","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, whenExplain) => {\n // For data-form `when`, log a compact pass/fail summary alongside the\n // active flag so users tailing the log can see which clauses tripped\n // without flipping on a separate devtools session. Function-form\n // `when` omits the summary.\n if (whenExplain) {\n const passed = whenExplain.filter((c) => c.pass).length;\n log(\"debug\", \"constraint.evaluate\", {\n id,\n active,\n clauses: { total: whenExplain.length, passed },\n });\n\n return;\n }\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 onResolverWriteRejected: (event) => {\n log(\n \"warn\",\n \"resolver.write.rejected\",\n event.kind === \"summary\"\n ? {\n kind: event.kind,\n resolver: event.resolver,\n requirementId: event.req.id,\n reason: event.reason,\n dropped: event.dropped,\n }\n : {\n kind: event.kind,\n resolver: event.resolver,\n requirementId: event.req.id,\n reason: event.reason,\n fact: event.fact,\n expected: event.expected,\n actual: event.actual,\n },\n );\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 onSourceAttach: (id, moduleId) => {\n log(\"debug\", \"source.attach\", { id, moduleId });\n },\n\n // `debug` level by default: at typical \"info\"-level logger config the high\n // publish-rate sources (Supabase realtime, polling timers) would dominate\n // the log; opt-in via `level: \"debug\"` for the noisy variant.\n onSourcePublish: (id, moduleId, eventName) => {\n log(\"debug\", \"source.publish\", { id, moduleId, eventName });\n },\n\n onSourceDetach: (id, moduleId) => {\n log(\"debug\", \"source.detach\", { id, moduleId });\n },\n\n onSourceError: (id, moduleId, phase, error) => {\n log(\"error\", \"source.error\", { id, moduleId, phase, 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 // Constraints section — per-clause whenExplain tree (R4.E)\n constraintsSection: HTMLDetailsElement;\n constraintsBody: HTMLDivElement;\n constraintsCount: HTMLSpanElement;\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 type { ClauseResult } from \"../core/types/predicate.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 // Constraints section — per-clause whenExplain tree (R4.E)\n const constraintsSectionRefs = (() => {\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: S.accent,\n marginBottom: \"4px\",\n });\n const countSpan = document.createElement(\"span\");\n countSpan.textContent = \"0\";\n summary.textContent = \"Constraints (\";\n summary.appendChild(countSpan);\n summary.appendChild(document.createTextNode(\")\"));\n details.appendChild(summary);\n const body = document.createElement(\"div\");\n Object.assign(body.style, { fontSize: \"11px\" });\n // Empty state\n const empty = document.createElement(\"div\");\n empty.style.color = S.muted;\n empty.style.padding = \"4px\";\n empty.style.fontStyle = \"italic\";\n empty.textContent = \"Waiting for first evaluation…\";\n empty.className = \"dt-constraints-empty\";\n body.appendChild(empty);\n details.appendChild(body);\n container.appendChild(details);\n\n return { details, body, countSpan };\n })();\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 constraintsSection: constraintsSectionRefs.details,\n constraintsBody: constraintsSectionRefs.body,\n constraintsCount: constraintsSectionRefs.countSpan,\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// ============================================================================\n// Constraint whenExplain rendering (R4.E)\n// ============================================================================\n\n/**\n * Human-readable symbols for predicate operators. Prototype-null map +\n * Object.hasOwn guard so a malicious / buggy `clause.op` of `__proto__`\n * or `constructor` can't return `Object.prototype` / a function ref.\n */\nconst OP_SYMBOL: Record<string, string> = Object.assign(Object.create(null), {\n $eq: \"=\",\n $ne: \"≠\",\n $gt: \">\",\n $gte: \"≥\",\n $lt: \"<\",\n $lte: \"≤\",\n $in: \"∈\",\n $nin: \"∉\",\n $exists: \"exists\",\n $between: \"in\",\n $startsWith: \"starts with\",\n $endsWith: \"ends with\",\n $contains: \"contains\",\n $matches: \"matches\",\n $changed: \"changed\",\n});\n\nfunction opSymbol(op: string): string {\n return Object.hasOwn(OP_SYMBOL, op) ? OP_SYMBOL[op]! : op;\n}\n\n/**\n * Format a clause operand for display. RegExp's `JSON.stringify` → `{}`,\n * which `formatValue` would emit verbatim; `String(re)` gives `/foo/i`.\n * Otherwise defer to the shared `formatValue` (which truncates strings,\n * stringifies objects, etc).\n */\nfunction formatClauseValue(v: unknown): string {\n if (v instanceof RegExp) {\n return truncate(String(v), 40);\n }\n\n return formatValue(v);\n}\n\nconst COMBINATOR_OPS = new Set([\"$all\", \"$any\", \"$not\"]);\n\n/**\n * Render a single clause as a list item. Recurses into combinator\n * children. Failed clauses include the actual value for quick diff.\n */\nfunction renderClauseLi(clause: ClauseResult): HTMLLIElement {\n const li = document.createElement(\"li\");\n const mark = clause.pass ? \"✓\" : \"✗\";\n li.style.color = clause.pass ? S.green : S.red;\n li.style.listStyle = \"none\";\n\n if (COMBINATOR_OPS.has(clause.op)) {\n const path = clause.path ? ` @ ${clause.path}` : \"\";\n li.textContent = `${mark} ${clause.op}${path}`;\n if (clause.children && clause.children.length > 0) {\n const sub = document.createElement(\"ul\");\n Object.assign(sub.style, {\n margin: \"0\",\n paddingLeft: \"14px\",\n listStyle: \"none\",\n });\n for (const c of clause.children) {\n sub.appendChild(renderClauseLi(c));\n }\n li.appendChild(sub);\n }\n } else {\n const symbol = opSymbol(clause.op);\n const expected = formatClauseValue(clause.expected);\n if (clause.pass) {\n li.textContent = `${mark} ${clause.path} ${symbol} ${expected}`;\n } else {\n const actual = formatClauseValue(clause.actual);\n li.textContent = `${mark} ${clause.path} ${symbol} ${expected} (actual: ${actual})`;\n }\n }\n\n return li;\n}\n\n/**\n * Remove a constraint row from the panel — called when the engine\n * emits `definition.unregister` for a constraint so stale rows don't\n * linger after `disable()` / removeModule.\n *\n * @internal\n */\nexport function removeConstraintRow(\n refs: PanelRefs,\n rowMap: Map<string, HTMLDivElement>,\n id: string,\n): void {\n const row = rowMap.get(id);\n if (row) {\n row.remove();\n rowMap.delete(id);\n refs.constraintsCount.textContent = String(rowMap.size);\n }\n // Restore empty state if we just emptied the list.\n if (\n rowMap.size === 0 &&\n !refs.constraintsBody.querySelector(\".dt-constraints-empty\")\n ) {\n const empty = document.createElement(\"div\");\n empty.style.color = S.muted;\n empty.style.padding = \"4px\";\n empty.style.fontStyle = \"italic\";\n empty.textContent = \"Waiting for first evaluation…\";\n empty.className = \"dt-constraints-empty\";\n refs.constraintsBody.appendChild(empty);\n }\n}\n\n/**\n * Refine the Constraints section's empty-state text after we know how\n * many constraints the system actually declares. A system with zero\n * constraints would otherwise sit on \"Waiting…\" forever — say so plainly.\n *\n * @internal\n */\nexport function setConstraintsEmptyState(\n refs: PanelRefs,\n hasAnyConstraints: boolean,\n): void {\n const empty = refs.constraintsBody.querySelector(\".dt-constraints-empty\");\n if (!empty) return;\n empty.textContent = hasAnyConstraints\n ? \"Waiting for first evaluation…\"\n : \"This system has no constraints\";\n}\n\n/**\n * Upsert a constraint row in the Constraints section. Renders the\n * per-clause `whenExplain` tree when provided (data-form `when`).\n * Function-form constraints render the header alone with a small\n * \"function-form\" note.\n *\n * The row map persists across calls so the same constraint updates\n * in place rather than appending duplicates.\n *\n * @internal\n */\nexport function renderConstraintRow(\n refs: PanelRefs,\n rowMap: Map<string, HTMLDivElement>,\n id: string,\n active: boolean,\n whenExplain?: readonly ClauseResult[],\n label?: string,\n): void {\n // Drop empty-state placeholder on first row.\n const empty = refs.constraintsBody.querySelector(\".dt-constraints-empty\");\n if (empty) {\n empty.remove();\n }\n\n let row = rowMap.get(id);\n if (!row) {\n row = document.createElement(\"div\");\n Object.assign(row.style, {\n marginBottom: \"6px\",\n paddingBottom: \"4px\",\n borderBottom: `1px solid ${S.rowBorder}`,\n });\n rowMap.set(id, row);\n refs.constraintsBody.appendChild(row);\n refs.constraintsCount.textContent = String(rowMap.size);\n }\n\n // Rebuild contents — simpler than diffing the clause tree.\n row.replaceChildren();\n\n const header = document.createElement(\"div\");\n Object.assign(header.style, {\n fontWeight: \"bold\",\n color: active ? S.green : S.muted,\n });\n const mark = active ? \"✓\" : \"✗\";\n header.textContent = label ? `${mark} ${id} (${label})` : `${mark} ${id}`;\n row.appendChild(header);\n\n if (whenExplain && whenExplain.length > 0) {\n const tree = document.createElement(\"ul\");\n Object.assign(tree.style, {\n margin: \"2px 0 0 0\",\n paddingLeft: \"14px\",\n listStyle: \"none\",\n });\n for (const clause of whenExplain) {\n tree.appendChild(renderClauseLi(clause));\n }\n row.appendChild(tree);\n } else if (!whenExplain) {\n const note = document.createElement(\"div\");\n Object.assign(note.style, {\n color: S.muted,\n fontSize: \"10px\",\n fontStyle: \"italic\",\n paddingLeft: \"14px\",\n });\n note.textContent = \"function-form when (no clause tree)\";\n row.appendChild(note);\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) => {\n const fMeta = inspection.facts.find((f) => f.key === k);\n return {\n id: k,\n label: truncate(fMeta?.meta?.label ?? k, FLOW.labelMaxChars),\n };\n }),\n );\n const derivNodes = layoutColumn(\n derivKeys.map((k) => {\n const dMeta = inspection.derivations.find((d) => d.id === k);\n return {\n id: k,\n label: truncate(dMeta?.meta?.label ?? k, FLOW.labelMaxChars),\n };\n }),\n );\n const constraintNodes = layoutColumn(\n allConstraints.map((c) => ({\n id: c.id,\n label: truncate(c.meta?.label ?? 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) => {\n const rDef = inspection.resolverDefs.find((r) => r.id === id);\n return {\n id,\n label: truncate(rDef?.meta?.label ?? id, FLOW.labelMaxChars),\n };\n }),\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 tooltip?: string,\n ) {\n const g = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n if (tooltip) {\n const title = document.createElementNS(\n \"http://www.w3.org/2000/svg\",\n \"title\",\n );\n title.textContent = tooltip;\n g.appendChild(title);\n }\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 (with meta tooltips)\n for (const f of factNodes) {\n const pulsing = depGraph.recentlyChangedFacts.has(f.id);\n const fMeta = inspection.facts.find((ff) => ff.key === f.id)?.meta;\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 fMeta?.description,\n );\n factPositions.set(f.id, pos);\n }\n\n // Draw derivation nodes (with meta tooltips)\n for (const d of derivNodes) {\n const pulsing = depGraph.recentlyComputedDerivations.has(d.id);\n const dMeta = inspection.derivations.find((dd) => dd.id === d.id)?.meta;\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 dMeta?.description,\n );\n derivPositions.set(d.id, pos);\n }\n\n // Draw constraint nodes (show ALL, dim inactive, with meta tooltips)\n for (const c of constraintNodes) {\n const pulsing = depGraph.recentlyActiveConstraints.has(c.id);\n const cMeta = allConstraints.find((cc) => cc.id === c.id)?.meta;\n const pos = drawNode(\n 2,\n colX[2],\n c.y,\n c.id,\n c.label,\n cMeta?.color ?? (c.active ? S.yellow : S.muted),\n !c.active,\n pulsing,\n cMeta?.description,\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, with meta tooltips + colors)\n for (const r of resolverNodeArr) {\n const isActive = inflightReqs.some((f) => f.resolverId === r.id);\n const rMeta = inspection.resolverDefs.find((rd) => rd.id === r.id)?.meta;\n drawNode(\n 4,\n colX[4],\n r.y,\n r.id,\n r.label,\n rMeta?.color ?? (isActive ? S.green : S.muted),\n !isActive,\n false,\n rMeta?.description,\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 removeConstraintRow,\n removeTableRow,\n renderConstraintRow,\n renderRequirements,\n renderStatus,\n setConstraintsEmptyState,\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 constraintRowMap = new Map<string, HTMLDivElement>();\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 const D_CONSTRAINTS = 256;\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 // Pending constraint clause-tree updates — coalesced per rAF so a\n // batch that flips many constraints paints once. Last-write-wins.\n type PendingConstraint = {\n active: boolean;\n whenExplain?: readonly import(\"../core/types/predicate.js\").ClauseResult[];\n label?: string;\n };\n const pendingConstraintUpdates = new Map<string, PendingConstraint>();\n const pendingConstraintDeletes = 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_CONSTRAINTS) {\n // Drain removals first so a removed+re-registered constraint within\n // the same frame ends up with a fresh row.\n for (const id of pendingConstraintDeletes) {\n removeConstraintRow(refs, constraintRowMap, id);\n }\n pendingConstraintDeletes.clear();\n for (const [\n id,\n { active, whenExplain, label },\n ] of pendingConstraintUpdates) {\n renderConstraintRow(\n refs,\n constraintRowMap,\n id,\n active,\n whenExplain,\n label,\n );\n }\n pendingConstraintUpdates.clear();\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 // R4.E: refine the Constraints empty-state. A system with zero\n // constraints would otherwise sit on \"Waiting…\" forever.\n const hasConstraints = (inspection?.constraints?.length ?? 0) > 0;\n setConstraintsEmptyState(refs, hasConstraints);\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 constraintRowMap.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, whenExplain) => {\n const label = state.system?.meta?.constraint(id)?.label;\n // whenExplain is supplied for data-form `when` only; carry it through\n // to the recorded event log so devtools can render the clause tree\n // alongside the active flag. Function-form `when` gives `undefined`\n // and is omitted from the payload to keep events compact.\n const basePayload = label ? { id, active, label } : { id, active };\n const payload = whenExplain\n ? { ...basePayload, whenExplain }\n : basePayload;\n addEvent(\"constraint.evaluate\", payload);\n recordEvent(\"constraint.evaluate\", payload);\n if (active) {\n depGraph.activeConstraints.add(id);\n depGraph.recentlyActiveConstraints.add(id);\n } else {\n depGraph.activeConstraints.delete(id);\n }\n // R4.E: queue the per-constraint whenExplain row for the next rAF.\n // Coalescing means a batch that flips 50 constraints repaints once.\n // Function-form `when` passes whenExplain=undefined, which renders\n // a single header line (no clause tree).\n if (panel) {\n pendingConstraintUpdates.set(id, { active, whenExplain, label });\n pendingConstraintDeletes.delete(id);\n schedulePanelUpdate(D_CONSTRAINTS);\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 const label = state.system?.meta?.resolver(resolver)?.label;\n const basePayload = { resolver, requirementId: req.id };\n const payload = label ? { ...basePayload, label } : basePayload;\n addEvent(\"resolver.start\", payload);\n recordEvent(\"resolver.start\", payload);\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 const label = state.system?.meta?.resolver(resolver)?.label;\n addEvent(\"resolver.complete\", {\n resolver,\n requirementId: req.id,\n duration,\n ...(label ? { label } : {}),\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 onResolverWriteRejected: (event) => {\n const payload =\n event.kind === \"summary\"\n ? {\n kind: event.kind,\n resolver: event.resolver,\n requirementId: event.req.id,\n reason: event.reason,\n dropped: event.dropped,\n }\n : {\n kind: event.kind,\n resolver: event.resolver,\n requirementId: event.req.id,\n reason: event.reason,\n fact: event.fact,\n expected: event.expected,\n actual: event.actual,\n };\n addEvent(\"resolver.write.rejected\", payload);\n recordEvent(\"resolver.write.rejected\", payload);\n panelEvent(\n \"resolver.write.rejected\",\n event.kind === \"summary\"\n ? { resolver: event.resolver, dropped: event.dropped }\n : { resolver: event.resolver, fact: event.fact },\n );\n },\n\n onEffectRun: (id) => {\n const label = state.system?.meta?.effect(id)?.label;\n const payload = label ? { id, label } : { id };\n addEvent(\"effect.run\", payload);\n recordEvent(\"effect.run\", payload);\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 // R4.E: constraints will re-evaluate after the snapshot loads;\n // wipe the row map + DOM so stale clause trees don't linger.\n constraintRowMap.clear();\n panel.refs.constraintsBody.replaceChildren();\n panel.refs.constraintsCount.textContent = \"0\";\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 // R4.E: drop the constraint's clause-tree row when the engine\n // tells us it's gone (disable / removeModule). Avoids stale\n // ✗ rows pinned to constraints that no longer exist.\n if (type === \"constraint\" && panel) {\n pendingConstraintDeletes.add(id);\n pendingConstraintUpdates.delete(id);\n schedulePanelUpdate(D_CONSTRAINTS);\n }\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 * // detectPII is async — await it before reading `detected`.\n * async function check(text: string) {\n * const result = await detectPII(text)\n * emitDevToolsEvent({\n * type: 'guardrail_check',\n * guardrailName: 'pii-detection',\n * guardrailType: 'input',\n * passed: !result.detected,\n * })\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 // OpenTelemetry Resource Semantic Conventions — required SDK identification.\n // Some backends (Tempo, Honeycomb strict mode) quarantine resources missing\n // these attributes.\n {\n key: \"telemetry.sdk.name\",\n value: { stringValue: \"@directive-run/core\" },\n },\n {\n key: \"telemetry.sdk.language\",\n value: { stringValue: \"typescript\" },\n },\n {\n key: \"telemetry.sdk.version\",\n value: { stringValue: \"1.20.2\" },\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(\n \"[Directive] Only http: and https: protocols are supported\",\n );\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. The exporter will append /v1/metrics or /v1/traces automatically. 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"]}
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","../../src/plugins/clobber-alert.ts","../../src/plugins/clobber-loop.ts"],"names":["LOG_LEVELS","loggingPlugin","options","level","filter","logger","prefix","minLevel","log","eventLevel","event","args","key","value","prev","changes","id","deps","result","active","whenExplain","passed","c","error","req","byResolver","resolver","duration","attempt","moduleId","eventName","phase","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","constraintsSectionRefs","body","empty","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","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","OP_SYMBOL","opSymbol","op","formatClauseValue","COMBINATOR_OPS","renderClauseLi","clause","mark","path","sub","symbol","expected","actual","removeConstraintRow","setConstraintsEmptyState","hasAnyConstraints","renderConstraintRow","tree","note","graphCaches","computeFingerprint","factKeys","derivKeys","constraints","reqMap","resolverIds","activeResolverIds","r","updateAnimationAttrs","cache","depGraph","constraintIds","node","pulsing","updateDependencyGraph","inspection","allConstraints","unmetReqs","inflightReqs","u","f","text","fingerprint","existingCache","colW","colX","totalW","layoutColumn","items","y","factNodes","k","fMeta","derivNodes","dMeta","d","constraintNodes","reqNodeArr","resolverNodeArr","rDef","maxRows","totalH","headers","i","newCache","drawNode","x","cy","nodeId","dimmed","tooltip","g","title","rect","drawEdge","x1","y1","x2","y2","factPositions","derivPositions","constraintPositions","reqPositions","ff","pos","dd","cMeta","cc","isActive","rMeta","rd","dPos","dep","fPos","cPos","rPos","rn","n","scheduleAnimationClear","updateTimeline","timeline","entries","minMs","maxMs","startMs","range","barAreaW","resolverOrder","seen","visibleResolvers","markers","ms","colorIdx","resolverEntries","w","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","panel","factsRowMap","constraintRowMap","recording","shouldCreatePanel","rafId","dirty","D_FACTS","D_DERIV","D_REQS","D_STATUS","D_PERF","D_FLOW","D_TT","D_TIMELINE","D_CONSTRAINTS","pendingFactUpdates","pendingFactDeletes","pendingConstraintUpdates","pendingConstraintDeletes","lastResult","schedulePanelUpdate","bits","flushPanelUpdates","sys","flags","panelEvent","recordEvent","facts","hasConstraints","payload","blob","url","_system","change","_snapshot","basePayload","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","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","clobberAlertPlugin","irreversibleTags","irreversibleResolvers","cooldownMs","onAlert","onSummary","systemRef","lastAlerted","priorIrreversibleAlertResolvers","resolverListed","priorAlert","matched","tagMatched","resolverMatched","matchedBy","last","oldestKey","DEFAULTS","createLruMap","cap","buildPredicateOverlap","whenA","whenB","whenSourceHashes","flatA","flatB","flattenPredicate","keyOf","setA","setB","coFire","conflicting","sawIndeterminate","verdict","compareClauses","clobberLoopPlugin","windowMs","resolvedAfterMs","maxTrackedFacts","maxParticipantsPerFact","maxEmissionsPerSec","capturePII","dev","onLoop","formatWarningText","onResolved","enabled","seq","resolverIdToRequirementType","whenSpecCache","constraintByRequirementType","piiTaggedFacts","factTagsCache","resolverModuleCache","emissionsThisSecond","suppressedSinceLastEmit","secondWindowStart","factState","refreshWhenSpecCache","redactWhenSpec","internal","cid","def","reqType","refreshPIITags","tagged","getFactTags","fact","cached","tags","trimBuffer","buf","canEmit","fireLoop","participantSet","nowMs","sortedParticipants","sig","lastFire","rejections","firstAt","severity","overlap","buildOverlapForParticipants","participantModules","readSystemId","eventToObservation","reqTypeA","reqTypeB","cidA","cidB","sweepResolved","dur","_kind","_id","record","recentDistinct","activeParticipants"],"mappings":"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","file":"index.cjs","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, whenExplain) => {\n // For data-form `when`, log a compact pass/fail summary alongside the\n // active flag so users tailing the log can see which clauses tripped\n // without flipping on a separate devtools session. Function-form\n // `when` omits the summary.\n if (whenExplain) {\n const passed = whenExplain.filter((c) => c.pass).length;\n log(\"debug\", \"constraint.evaluate\", {\n id,\n active,\n clauses: { total: whenExplain.length, passed },\n });\n\n return;\n }\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 onResolverWriteRejected: (event) => {\n log(\n \"warn\",\n \"resolver.write.rejected\",\n event.kind === \"summary\"\n ? {\n kind: event.kind,\n resolver: event.resolver,\n requirementId: event.req.id,\n reason: event.reason,\n dropped: event.dropped,\n }\n : {\n kind: event.kind,\n resolver: event.resolver,\n requirementId: event.req.id,\n reason: event.reason,\n fact: event.fact,\n expected: event.expected,\n actual: event.actual,\n },\n );\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 onSourceAttach: (id, moduleId) => {\n log(\"debug\", \"source.attach\", { id, moduleId });\n },\n\n // `debug` level by default: at typical \"info\"-level logger config the high\n // publish-rate sources (Supabase realtime, polling timers) would dominate\n // the log; opt-in via `level: \"debug\"` for the noisy variant.\n onSourcePublish: (id, moduleId, eventName) => {\n log(\"debug\", \"source.publish\", { id, moduleId, eventName });\n },\n\n onSourceDetach: (id, moduleId) => {\n log(\"debug\", \"source.detach\", { id, moduleId });\n },\n\n onSourceError: (id, moduleId, phase, error) => {\n log(\"error\", \"source.error\", { id, moduleId, phase, 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 // Constraints section — per-clause whenExplain tree (R4.E)\n constraintsSection: HTMLDetailsElement;\n constraintsBody: HTMLDivElement;\n constraintsCount: HTMLSpanElement;\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 type { ClauseResult } from \"../core/types/predicate.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 // Constraints section — per-clause whenExplain tree (R4.E)\n const constraintsSectionRefs = (() => {\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: S.accent,\n marginBottom: \"4px\",\n });\n const countSpan = document.createElement(\"span\");\n countSpan.textContent = \"0\";\n summary.textContent = \"Constraints (\";\n summary.appendChild(countSpan);\n summary.appendChild(document.createTextNode(\")\"));\n details.appendChild(summary);\n const body = document.createElement(\"div\");\n Object.assign(body.style, { fontSize: \"11px\" });\n // Empty state\n const empty = document.createElement(\"div\");\n empty.style.color = S.muted;\n empty.style.padding = \"4px\";\n empty.style.fontStyle = \"italic\";\n empty.textContent = \"Waiting for first evaluation…\";\n empty.className = \"dt-constraints-empty\";\n body.appendChild(empty);\n details.appendChild(body);\n container.appendChild(details);\n\n return { details, body, countSpan };\n })();\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 constraintsSection: constraintsSectionRefs.details,\n constraintsBody: constraintsSectionRefs.body,\n constraintsCount: constraintsSectionRefs.countSpan,\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// ============================================================================\n// Constraint whenExplain rendering (R4.E)\n// ============================================================================\n\n/**\n * Human-readable symbols for predicate operators. Prototype-null map +\n * Object.hasOwn guard so a malicious / buggy `clause.op` of `__proto__`\n * or `constructor` can't return `Object.prototype` / a function ref.\n */\nconst OP_SYMBOL: Record<string, string> = Object.assign(Object.create(null), {\n $eq: \"=\",\n $ne: \"≠\",\n $gt: \">\",\n $gte: \"≥\",\n $lt: \"<\",\n $lte: \"≤\",\n $in: \"∈\",\n $nin: \"∉\",\n $exists: \"exists\",\n $between: \"in\",\n $startsWith: \"starts with\",\n $endsWith: \"ends with\",\n $contains: \"contains\",\n $matches: \"matches\",\n $changed: \"changed\",\n});\n\nfunction opSymbol(op: string): string {\n return Object.hasOwn(OP_SYMBOL, op) ? OP_SYMBOL[op]! : op;\n}\n\n/**\n * Format a clause operand for display. RegExp's `JSON.stringify` → `{}`,\n * which `formatValue` would emit verbatim; `String(re)` gives `/foo/i`.\n * Otherwise defer to the shared `formatValue` (which truncates strings,\n * stringifies objects, etc).\n */\nfunction formatClauseValue(v: unknown): string {\n if (v instanceof RegExp) {\n return truncate(String(v), 40);\n }\n\n return formatValue(v);\n}\n\nconst COMBINATOR_OPS = new Set([\"$all\", \"$any\", \"$not\"]);\n\n/**\n * Render a single clause as a list item. Recurses into combinator\n * children. Failed clauses include the actual value for quick diff.\n */\nfunction renderClauseLi(clause: ClauseResult): HTMLLIElement {\n const li = document.createElement(\"li\");\n const mark = clause.pass ? \"✓\" : \"✗\";\n li.style.color = clause.pass ? S.green : S.red;\n li.style.listStyle = \"none\";\n\n if (COMBINATOR_OPS.has(clause.op)) {\n const path = clause.path ? ` @ ${clause.path}` : \"\";\n li.textContent = `${mark} ${clause.op}${path}`;\n if (clause.children && clause.children.length > 0) {\n const sub = document.createElement(\"ul\");\n Object.assign(sub.style, {\n margin: \"0\",\n paddingLeft: \"14px\",\n listStyle: \"none\",\n });\n for (const c of clause.children) {\n sub.appendChild(renderClauseLi(c));\n }\n li.appendChild(sub);\n }\n } else {\n const symbol = opSymbol(clause.op);\n const expected = formatClauseValue(clause.expected);\n if (clause.pass) {\n li.textContent = `${mark} ${clause.path} ${symbol} ${expected}`;\n } else {\n const actual = formatClauseValue(clause.actual);\n li.textContent = `${mark} ${clause.path} ${symbol} ${expected} (actual: ${actual})`;\n }\n }\n\n return li;\n}\n\n/**\n * Remove a constraint row from the panel — called when the engine\n * emits `definition.unregister` for a constraint so stale rows don't\n * linger after `disable()` / removeModule.\n *\n * @internal\n */\nexport function removeConstraintRow(\n refs: PanelRefs,\n rowMap: Map<string, HTMLDivElement>,\n id: string,\n): void {\n const row = rowMap.get(id);\n if (row) {\n row.remove();\n rowMap.delete(id);\n refs.constraintsCount.textContent = String(rowMap.size);\n }\n // Restore empty state if we just emptied the list.\n if (\n rowMap.size === 0 &&\n !refs.constraintsBody.querySelector(\".dt-constraints-empty\")\n ) {\n const empty = document.createElement(\"div\");\n empty.style.color = S.muted;\n empty.style.padding = \"4px\";\n empty.style.fontStyle = \"italic\";\n empty.textContent = \"Waiting for first evaluation…\";\n empty.className = \"dt-constraints-empty\";\n refs.constraintsBody.appendChild(empty);\n }\n}\n\n/**\n * Refine the Constraints section's empty-state text after we know how\n * many constraints the system actually declares. A system with zero\n * constraints would otherwise sit on \"Waiting…\" forever — say so plainly.\n *\n * @internal\n */\nexport function setConstraintsEmptyState(\n refs: PanelRefs,\n hasAnyConstraints: boolean,\n): void {\n const empty = refs.constraintsBody.querySelector(\".dt-constraints-empty\");\n if (!empty) return;\n empty.textContent = hasAnyConstraints\n ? \"Waiting for first evaluation…\"\n : \"This system has no constraints\";\n}\n\n/**\n * Upsert a constraint row in the Constraints section. Renders the\n * per-clause `whenExplain` tree when provided (data-form `when`).\n * Function-form constraints render the header alone with a small\n * \"function-form\" note.\n *\n * The row map persists across calls so the same constraint updates\n * in place rather than appending duplicates.\n *\n * @internal\n */\nexport function renderConstraintRow(\n refs: PanelRefs,\n rowMap: Map<string, HTMLDivElement>,\n id: string,\n active: boolean,\n whenExplain?: readonly ClauseResult[],\n label?: string,\n): void {\n // Drop empty-state placeholder on first row.\n const empty = refs.constraintsBody.querySelector(\".dt-constraints-empty\");\n if (empty) {\n empty.remove();\n }\n\n let row = rowMap.get(id);\n if (!row) {\n row = document.createElement(\"div\");\n Object.assign(row.style, {\n marginBottom: \"6px\",\n paddingBottom: \"4px\",\n borderBottom: `1px solid ${S.rowBorder}`,\n });\n rowMap.set(id, row);\n refs.constraintsBody.appendChild(row);\n refs.constraintsCount.textContent = String(rowMap.size);\n }\n\n // Rebuild contents — simpler than diffing the clause tree.\n row.replaceChildren();\n\n const header = document.createElement(\"div\");\n Object.assign(header.style, {\n fontWeight: \"bold\",\n color: active ? S.green : S.muted,\n });\n const mark = active ? \"✓\" : \"✗\";\n header.textContent = label ? `${mark} ${id} (${label})` : `${mark} ${id}`;\n row.appendChild(header);\n\n if (whenExplain && whenExplain.length > 0) {\n const tree = document.createElement(\"ul\");\n Object.assign(tree.style, {\n margin: \"2px 0 0 0\",\n paddingLeft: \"14px\",\n listStyle: \"none\",\n });\n for (const clause of whenExplain) {\n tree.appendChild(renderClauseLi(clause));\n }\n row.appendChild(tree);\n } else if (!whenExplain) {\n const note = document.createElement(\"div\");\n Object.assign(note.style, {\n color: S.muted,\n fontSize: \"10px\",\n fontStyle: \"italic\",\n paddingLeft: \"14px\",\n });\n note.textContent = \"function-form when (no clause tree)\";\n row.appendChild(note);\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) => {\n const fMeta = inspection.facts.find((f) => f.key === k);\n return {\n id: k,\n label: truncate(fMeta?.meta?.label ?? k, FLOW.labelMaxChars),\n };\n }),\n );\n const derivNodes = layoutColumn(\n derivKeys.map((k) => {\n const dMeta = inspection.derivations.find((d) => d.id === k);\n return {\n id: k,\n label: truncate(dMeta?.meta?.label ?? k, FLOW.labelMaxChars),\n };\n }),\n );\n const constraintNodes = layoutColumn(\n allConstraints.map((c) => ({\n id: c.id,\n label: truncate(c.meta?.label ?? 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) => {\n const rDef = inspection.resolverDefs.find((r) => r.id === id);\n return {\n id,\n label: truncate(rDef?.meta?.label ?? id, FLOW.labelMaxChars),\n };\n }),\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 tooltip?: string,\n ) {\n const g = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n if (tooltip) {\n const title = document.createElementNS(\n \"http://www.w3.org/2000/svg\",\n \"title\",\n );\n title.textContent = tooltip;\n g.appendChild(title);\n }\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 (with meta tooltips)\n for (const f of factNodes) {\n const pulsing = depGraph.recentlyChangedFacts.has(f.id);\n const fMeta = inspection.facts.find((ff) => ff.key === f.id)?.meta;\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 fMeta?.description,\n );\n factPositions.set(f.id, pos);\n }\n\n // Draw derivation nodes (with meta tooltips)\n for (const d of derivNodes) {\n const pulsing = depGraph.recentlyComputedDerivations.has(d.id);\n const dMeta = inspection.derivations.find((dd) => dd.id === d.id)?.meta;\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 dMeta?.description,\n );\n derivPositions.set(d.id, pos);\n }\n\n // Draw constraint nodes (show ALL, dim inactive, with meta tooltips)\n for (const c of constraintNodes) {\n const pulsing = depGraph.recentlyActiveConstraints.has(c.id);\n const cMeta = allConstraints.find((cc) => cc.id === c.id)?.meta;\n const pos = drawNode(\n 2,\n colX[2],\n c.y,\n c.id,\n c.label,\n cMeta?.color ?? (c.active ? S.yellow : S.muted),\n !c.active,\n pulsing,\n cMeta?.description,\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, with meta tooltips + colors)\n for (const r of resolverNodeArr) {\n const isActive = inflightReqs.some((f) => f.resolverId === r.id);\n const rMeta = inspection.resolverDefs.find((rd) => rd.id === r.id)?.meta;\n drawNode(\n 4,\n colX[4],\n r.y,\n r.id,\n r.label,\n rMeta?.color ?? (isActive ? S.green : S.muted),\n !isActive,\n false,\n rMeta?.description,\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 removeConstraintRow,\n removeTableRow,\n renderConstraintRow,\n renderRequirements,\n renderStatus,\n setConstraintsEmptyState,\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 constraintRowMap = new Map<string, HTMLDivElement>();\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 const D_CONSTRAINTS = 256;\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 // Pending constraint clause-tree updates — coalesced per rAF so a\n // batch that flips many constraints paints once. Last-write-wins.\n type PendingConstraint = {\n active: boolean;\n whenExplain?: readonly import(\"../core/types/predicate.js\").ClauseResult[];\n label?: string;\n };\n const pendingConstraintUpdates = new Map<string, PendingConstraint>();\n const pendingConstraintDeletes = 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_CONSTRAINTS) {\n // Drain removals first so a removed+re-registered constraint within\n // the same frame ends up with a fresh row.\n for (const id of pendingConstraintDeletes) {\n removeConstraintRow(refs, constraintRowMap, id);\n }\n pendingConstraintDeletes.clear();\n for (const [\n id,\n { active, whenExplain, label },\n ] of pendingConstraintUpdates) {\n renderConstraintRow(\n refs,\n constraintRowMap,\n id,\n active,\n whenExplain,\n label,\n );\n }\n pendingConstraintUpdates.clear();\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 // R4.E: refine the Constraints empty-state. A system with zero\n // constraints would otherwise sit on \"Waiting…\" forever.\n const hasConstraints = (inspection?.constraints?.length ?? 0) > 0;\n setConstraintsEmptyState(refs, hasConstraints);\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 constraintRowMap.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, whenExplain) => {\n const label = state.system?.meta?.constraint(id)?.label;\n // whenExplain is supplied for data-form `when` only; carry it through\n // to the recorded event log so devtools can render the clause tree\n // alongside the active flag. Function-form `when` gives `undefined`\n // and is omitted from the payload to keep events compact.\n const basePayload = label ? { id, active, label } : { id, active };\n const payload = whenExplain\n ? { ...basePayload, whenExplain }\n : basePayload;\n addEvent(\"constraint.evaluate\", payload);\n recordEvent(\"constraint.evaluate\", payload);\n if (active) {\n depGraph.activeConstraints.add(id);\n depGraph.recentlyActiveConstraints.add(id);\n } else {\n depGraph.activeConstraints.delete(id);\n }\n // R4.E: queue the per-constraint whenExplain row for the next rAF.\n // Coalescing means a batch that flips 50 constraints repaints once.\n // Function-form `when` passes whenExplain=undefined, which renders\n // a single header line (no clause tree).\n if (panel) {\n pendingConstraintUpdates.set(id, { active, whenExplain, label });\n pendingConstraintDeletes.delete(id);\n schedulePanelUpdate(D_CONSTRAINTS);\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 const label = state.system?.meta?.resolver(resolver)?.label;\n const basePayload = { resolver, requirementId: req.id };\n const payload = label ? { ...basePayload, label } : basePayload;\n addEvent(\"resolver.start\", payload);\n recordEvent(\"resolver.start\", payload);\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 const label = state.system?.meta?.resolver(resolver)?.label;\n addEvent(\"resolver.complete\", {\n resolver,\n requirementId: req.id,\n duration,\n ...(label ? { label } : {}),\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 onResolverWriteRejected: (event) => {\n const payload =\n event.kind === \"summary\"\n ? {\n kind: event.kind,\n resolver: event.resolver,\n requirementId: event.req.id,\n reason: event.reason,\n dropped: event.dropped,\n }\n : {\n kind: event.kind,\n resolver: event.resolver,\n requirementId: event.req.id,\n reason: event.reason,\n fact: event.fact,\n expected: event.expected,\n actual: event.actual,\n };\n addEvent(\"resolver.write.rejected\", payload);\n recordEvent(\"resolver.write.rejected\", payload);\n panelEvent(\n \"resolver.write.rejected\",\n event.kind === \"summary\"\n ? { resolver: event.resolver, dropped: event.dropped }\n : { resolver: event.resolver, fact: event.fact },\n );\n },\n\n onEffectRun: (id) => {\n const label = state.system?.meta?.effect(id)?.label;\n const payload = label ? { id, label } : { id };\n addEvent(\"effect.run\", payload);\n recordEvent(\"effect.run\", payload);\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 // R4.E: constraints will re-evaluate after the snapshot loads;\n // wipe the row map + DOM so stale clause trees don't linger.\n constraintRowMap.clear();\n panel.refs.constraintsBody.replaceChildren();\n panel.refs.constraintsCount.textContent = \"0\";\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 // R4.E: drop the constraint's clause-tree row when the engine\n // tells us it's gone (disable / removeModule). Avoids stale\n // ✗ rows pinned to constraints that no longer exist.\n if (type === \"constraint\" && panel) {\n pendingConstraintDeletes.add(id);\n pendingConstraintUpdates.delete(id);\n schedulePanelUpdate(D_CONSTRAINTS);\n }\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 * // detectPII is async — await it before reading `detected`.\n * async function check(text: string) {\n * const result = await detectPII(text)\n * emitDevToolsEvent({\n * type: 'guardrail_check',\n * guardrailName: 'pii-detection',\n * guardrailType: 'input',\n * passed: !result.detected,\n * })\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 // OpenTelemetry Resource Semantic Conventions — required SDK identification.\n // Some backends (Tempo, Honeycomb strict mode) quarantine resources missing\n // these attributes.\n {\n key: \"telemetry.sdk.name\",\n value: { stringValue: \"@directive-run/core\" },\n },\n {\n key: \"telemetry.sdk.language\",\n value: { stringValue: \"typescript\" },\n },\n {\n key: \"telemetry.sdk.version\",\n value: { stringValue: \"1.20.2\" },\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(\n \"[Directive] Only http: and https: protocols are supported\",\n );\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. The exporter will append /v1/metrics or /v1/traces automatically. 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","/**\n * Clobber Alert Plugin – default high-severity alerting for\n * `resolver.write.rejected { reason: \"clobbered\" }` events landing on\n * facts tagged irreversible.\n *\n * The audit ledger already records every clobber event with full\n * forensic detail (fact, expected, actual, resolver, requirementId).\n * But a clobber on a fact tagged `\"money\"` / `\"pii\"` / `\"irreversible\"`\n * is operationally far more urgent than a clobber on a UI status fact.\n * Without this plugin, a consumer has to write their own SIEM rule to\n * separate \"noise\" from \"page an engineer NOW.\"\n *\n * Default behaviour: fire `console.error` on every clobber whose fact's\n * schema meta carries any tag in `irreversibleTags`. Replace the\n * `onAlert` callback to route to PagerDuty / Slack / Sentry / your SIEM\n * of choice.\n *\n * @public\n */\n\nimport type { ModuleSchema, Plugin, System } from \"../core/types.js\";\n\n/** Configuration for the {@link clobberAlertPlugin}. */\nexport interface ClobberAlertPluginOptions {\n /**\n * Fact-meta tags that promote a clobber event from \"noise\" to\n * \"high-severity alert.\" A clobber whose fact's schema meta carries\n * ANY of these tags fires `onAlert`.\n *\n * **Why tag the fact, not the resolver?** A clobber is detected at\n * fact-write time. The audit event payload (`fact`, `expected`,\n * `actual`) names the fact, not the side effect — the fact is the\n * trigger surface for any irreversible work the resolver is about\n * to do (a charge, a send, a delete). Tagging `payment.amount` with\n * `\"money\"` marks the fact whose race-loss should page someone.\n *\n * If your model puts the irreversibility on the resolver rather than\n * the fact, use `irreversibleResolvers` — both filters OR.\n *\n * Default: `[\"money\", \"pii\", \"irreversible\"]`.\n */\n irreversibleTags?: readonly string[];\n /**\n * Resolver IDs whose clobbered writes should always alert, regardless\n * of fact tags. Use this when irreversibility is modeled on the\n * resolver (e.g. `stripeCharge`) rather than on the trigger fact.\n * Defaults to empty — the fact-tag path covers most cases.\n */\n irreversibleResolvers?: readonly string[];\n /**\n * Callback fired when a clobber lands on a fact whose tags overlap\n * `irreversibleTags`, or whose resolver is in `irreversibleResolvers`.\n * Default: `console.error(...)`.\n */\n onAlert?: (event: ClobberAlertEvent) => void;\n /**\n * Callback fired when the engine's per-resolver rate limit aggregates\n * multiple per-write clobber events into a single\n * `kind: \"summary\"` event (default cap: 10 per-resolver-instance).\n * The summary names the resolver + dropped count but loses per-fact\n * attribution — the engine has no way to enumerate every dropped\n * write inside the cap.\n *\n * Only fires when EITHER:\n * - the resolver is listed in `irreversibleResolvers`, OR\n * - this plugin has previously fired `onAlert` for the resolver\n * (i.e. the resolver has touched an irreversible fact in this\n * session, so a follow-on burst is operationally relevant)\n *\n * Default: undefined (no summary alerts). Set this to preserve\n * SIEM telemetry past the engine's rate-limit cap on a hot\n * resolver fighting an irreversible fact.\n */\n onSummary?: (event: ClobberSummaryEvent) => void;\n /**\n * Cooldown window keyed by `(fact, resolver)` pair. A second clobber\n * from the same resolver on the same fact within this window does not\n * re-fire `onAlert`. A clobber from a *different* resolver on the\n * same fact still fires — fighting writers are a different\n * operational incident than a single resolver retrying.\n *\n * The audit ledger records every clobber regardless of cooldown.\n *\n * Default: `0` (no cooldown — every event alerts).\n */\n cooldownMs?: number;\n}\n\n/** Payload passed to {@link ClobberAlertPluginOptions.onAlert}. */\nexport interface ClobberAlertEvent {\n readonly fact: string;\n /**\n * Fact-meta tags that matched `irreversibleTags`. Empty when the alert\n * fired only because the resolver matched `irreversibleResolvers`.\n * Use {@link matchedBy} to distinguish without checking length.\n */\n readonly tags: readonly string[];\n /**\n * Which filter triggered the alert:\n * - `\"tag\"` — fact-meta tags overlapped `irreversibleTags`\n * - `\"resolver\"` — resolver ID matched `irreversibleResolvers`\n * - `\"both\"` — both filters matched\n */\n readonly matchedBy: \"tag\" | \"resolver\" | \"both\";\n readonly resolver: string;\n readonly requirementId: string;\n readonly expected: unknown;\n readonly actual: unknown;\n /** `Date.now()` at the moment the alert fired. */\n readonly timestamp: number;\n}\n\n/**\n * Payload passed to {@link ClobberAlertPluginOptions.onSummary}.\n *\n * Fired when the engine's per-resolver clobber rate-limit aggregates\n * multiple per-write events into one summary. Per-fact attribution is\n * lost (the engine cannot enumerate every dropped write inside the\n * cap), but the resolver + dropped count are preserved so SIEM can\n * page on \"this resolver is still fighting an irreversible fact\n * past the cap.\"\n */\nexport interface ClobberSummaryEvent {\n readonly resolver: string;\n readonly requirementId: string;\n /** Number of per-write clobber events the engine suppressed under the cap. */\n readonly dropped: number;\n /**\n * Why the summary surfaced from this plugin's filter:\n * - `\"resolver-listed\"` — the resolver was in `irreversibleResolvers`\n * - `\"prior-irreversible-alert\"` — the resolver had already fired\n * `onAlert` on an irreversible fact in this session\n */\n readonly matchedBy: \"resolver-listed\" | \"prior-irreversible-alert\";\n /** `Date.now()` at the moment the summary fired. */\n readonly timestamp: number;\n}\n\n/**\n * Cap the per-(fact, resolver) cooldown map at this size with FIFO\n * eviction so a long-running system with high resolver churn (e.g.\n * dynamically-registered resolvers) cannot grow the map unboundedly.\n * Matches the cap precedent set for `retryAttempts` in the engine.\n */\nconst COOLDOWN_MAP_CAP = 1000;\n\n/**\n * Create a plugin that fires high-severity alerts for clobber events\n * landing on irreversible-tagged facts.\n *\n * @example\n * ```ts\n * createSystem({\n * module: myModule,\n * plugins: [\n * clobberAlertPlugin({\n * irreversibleTags: [\"money\", \"pii\"],\n * onAlert: (e) => pagerduty.trigger({\n * severity: \"critical\",\n * summary: `Clobber on ${e.fact} (${e.tags.join(\", \")})`,\n * details: e,\n * }),\n * }),\n * ],\n * });\n * ```\n */\nexport function clobberAlertPlugin<M extends ModuleSchema>(\n options: ClobberAlertPluginOptions = {},\n): Plugin<M> {\n const irreversibleTags = new Set(\n options.irreversibleTags ?? [\"money\", \"pii\", \"irreversible\"],\n );\n const irreversibleResolvers = new Set(options.irreversibleResolvers ?? []);\n const cooldownMs = options.cooldownMs ?? 0;\n const onAlert =\n options.onAlert ??\n ((event: ClobberAlertEvent) => {\n console.error(\n `[Directive] CLOBBER on irreversible fact '${event.fact}' (tags: ${event.tags.join(\", \")}) by resolver '${event.resolver}'`,\n { expected: event.expected, actual: event.actual },\n );\n });\n const onSummary = options.onSummary;\n\n let systemRef: System<M> | null = null;\n const lastAlerted = new Map<string, number>();\n /**\n * Resolver IDs that have fired at least one `onAlert` in this session.\n * Used to surface summary alerts for resolvers that have proven they\n * touch irreversible state — even if the summary event itself lacks\n * the fact-tag information the per-event path uses.\n */\n const priorIrreversibleAlertResolvers = new Set<string>();\n\n return {\n name: \"clobber-alert\",\n onInit(system) {\n systemRef = system;\n },\n onDestroy() {\n systemRef = null;\n lastAlerted.clear();\n priorIrreversibleAlertResolvers.clear();\n },\n onResolverWriteRejected(event) {\n if (!systemRef) return;\n\n if (event.kind === \"summary\") {\n if (!onSummary) return;\n const resolverListed = irreversibleResolvers.has(event.resolver);\n const priorAlert = priorIrreversibleAlertResolvers.has(event.resolver);\n if (!resolverListed && !priorAlert) return;\n try {\n onSummary({\n resolver: event.resolver,\n requirementId: event.req.id,\n dropped: event.dropped,\n matchedBy: resolverListed\n ? \"resolver-listed\"\n : \"prior-irreversible-alert\",\n timestamp: Date.now(),\n });\n } catch (err) {\n console.error(\n `[Directive] clobberAlertPlugin: onSummary callback threw for resolver '${event.resolver}'`,\n err,\n );\n }\n return;\n }\n\n // event.kind === \"rejection\"\n\n const factMeta = systemRef.meta.fact(event.fact);\n const tags = factMeta?.tags ?? [];\n const matched = tags.filter((t) => irreversibleTags.has(t));\n const tagMatched = matched.length > 0;\n const resolverMatched = irreversibleResolvers.has(event.resolver);\n if (!tagMatched && !resolverMatched) return;\n\n const matchedBy: \"tag\" | \"resolver\" | \"both\" =\n tagMatched && resolverMatched\n ? \"both\"\n : tagMatched\n ? \"tag\"\n : \"resolver\";\n\n const cooldownKey = `${event.fact}::${event.resolver}`;\n if (cooldownMs > 0) {\n // Key by (fact, resolver) so two different resolvers fighting\n // on the same fact (a real incident) both alert, while a single\n // resolver retrying the same fact (noise) is suppressed.\n const last = lastAlerted.get(cooldownKey) ?? 0;\n const now = Date.now();\n if (now - last < cooldownMs) return;\n }\n\n try {\n onAlert({\n fact: event.fact,\n tags: matched,\n matchedBy,\n resolver: event.resolver,\n requirementId: event.req.id,\n expected: event.expected,\n actual: event.actual,\n timestamp: Date.now(),\n });\n // Stamp the cooldown only AFTER a successful alert. If the\n // callback throws (PagerDuty 503, etc.), don't burn the cooldown\n // slot — the next genuine alert can still fire.\n if (cooldownMs > 0) {\n // FIFO eviction at cap so the map can't grow without bound\n // under high resolver churn (e.g. dynamically registered\n // resolvers in a long-running system).\n if (lastAlerted.size >= COOLDOWN_MAP_CAP) {\n const oldestKey = lastAlerted.keys().next().value;\n if (oldestKey !== undefined) lastAlerted.delete(oldestKey);\n }\n lastAlerted.set(cooldownKey, Date.now());\n }\n // Remember this resolver fired an irreversible alert so a\n // subsequent summary event (the engine's rate-limit aggregate)\n // can route to `onSummary` even though per-fact attribution\n // is lost in the summary payload.\n priorIrreversibleAlertResolvers.add(event.resolver);\n } catch (err) {\n // The consumer's `onAlert` threw (PagerDuty 503, Slack rate\n // limit, etc.). Surface it without breaking the dispatch path.\n // The audit ledger already recorded the clobber; this is\n // purely the alerting side.\n console.error(\n `[Directive] clobberAlertPlugin: onAlert callback threw for fact '${event.fact}'`,\n err,\n );\n }\n },\n };\n}\n","/**\n * Clobber Loop Detector Plugin – fires a structured warning when the\n * same set of resolvers clobber the same fact above threshold within a\n * time window. A single clobber is fine — the `abortOn:` binding caught\n * the race and the audit ledger recorded it. A *loop* is two or more\n * resolvers whose `when:` predicates both satisfy a shared state and\n * keep rewriting the fact every reconcile tick, indefinitely.\n *\n * Today the symptom surfaces as a value flapping between two states in\n * a customer screenshot. The audit ledger holds the forensic evidence\n * (800 clobbers/sec on `cart.discount`), but nobody looks until a\n * customer complains. This plugin closes the loop: one structured\n * warning per detected loop, with a **predicate-overlap proof** built\n * from the participants' `whenSpec` so the warning points at the\n * specific clauses that co-fire instead of stopping at \"these resolvers\n * fight.\"\n *\n * @public\n */\n\nimport { compareClauses } from \"../core/doctor.js\";\nimport { type LeafClause, flattenPredicate } from \"../core/rules-diff.js\";\nimport type {\n FactPredicate,\n ModuleSchema,\n Plugin,\n PredicateOverlapProof,\n System,\n} from \"../core/types.js\";\nimport { redactWhenSpec } from \"./audit-ledger/predicate-redact.js\";\n\n/** Configuration for the {@link clobberLoopPlugin}. */\nexport interface ClobberLoopPluginOptions {\n /**\n * Window over which clobber-rejection events are aggregated. A loop\n * fires when `threshold` distinct-requirement rejections involving\n * ≥2 distinct resolvers land on the same fact within `windowMs`.\n *\n * Default: 1000ms. Catches the canonical \"5 clobbers in <500ms\" case\n * while sitting well outside tick-boundary noise.\n */\n windowMs?: number;\n /**\n * Minimum distinct-requirement rejection count within `windowMs` to\n * trigger a loop event. Distinct by `requirement.id`, so a single\n * resolver's retry storm (which shares one requirement id) counts as\n * one rejection and never crosses the threshold alone — only true\n * multi-participant contention does.\n *\n * Default: 5.\n */\n threshold?: number;\n /**\n * After a loop fires on a `(fact, participantSet)`, suppress same-key\n * re-fire for this duration. Mirrors `clobberAlertPlugin`'s\n * cooldown precedent.\n *\n * Default: 5000ms.\n */\n cooldownMs?: number;\n /**\n * Quiet window after the last contributing clobber rejection before\n * the loop is considered closed and a `resolver.clobber.loop.resolved`\n * event fires. The resolver may have shipped a fix (priority added,\n * `when:` narrowed), or the surrounding state changed enough that\n * both participants no longer co-fire.\n *\n * Default: 30000ms.\n */\n resolvedAfterMs?: number;\n /**\n * Global LRU cap on the number of facts the detector tracks. A\n * hot-then-cold attacker fact key can churn the map, but LRU\n * eviction ensures the legitimate hot fact stays resident. Memory\n * bound: ~32 ring-buffer entries × `maxTrackedFacts` slim records.\n *\n * Default: 256.\n */\n maxTrackedFacts?: number;\n /**\n * Per-fact cap on participant resolver tracking. Above this, a single\n * \"N-way contention on fact X\" event fires once and detailed\n * participant tracking pauses for the cooldown window.\n *\n * Default: 16.\n */\n maxParticipantsPerFact?: number;\n /**\n * Global emission cap (loop-events per second across all facts). A\n * storm where every fact enters a loop simultaneously should not blow\n * up the observation bus or pager. Above-cap detections increment a\n * counter and surface in the next emitted event's\n * `suppressedSinceLastEmit` field.\n *\n * Default: 10.\n */\n maxEmissionsPerSec?: number;\n /**\n * Callback fired when a loop is detected. The payload is the\n * fully-constructed event including PII-redacted `predicateOverlap`\n * (when applicable).\n *\n * Default in dev mode: `console.warn` with the structured warning\n * text. Default in production: `console.error` to stderr — NOT noop,\n * so the signal still lands in CloudWatch/Loki/Datadog log pipelines\n * even when consumers haven't explicitly wired routing.\n */\n onLoop?: (event: ClobberLoopDetectedEvent) => void;\n /**\n * Callback fired when a previously-detected loop is considered\n * resolved (quiet window elapsed, participant unregistered, or\n * predicate narrowed).\n *\n * Default: no-op. Wire when monitoring needs \"5 active loops\" rather\n * than \"47 historical loops.\"\n */\n onResolved?: (event: ClobberLoopResolvedEvent) => void;\n /**\n * Opt-out of PII redaction in the emitted event's `predicateOverlap`\n * clauses. The default (`false`) routes `whenSpec` operand pointers\n * through `redactWhenSpec` against `system.meta.byTag(\"pii\")` BEFORE\n * the event is constructed, so downstream sinks see `[redacted]` in\n * place of the literal operand.\n *\n * Set to `true` only when the deployment has a data-processing\n * addendum that permits unredacted operand capture.\n *\n * Default: `false`.\n */\n capturePII?: boolean;\n}\n\n/**\n * Emitted payload for {@link ClobberLoopPluginOptions.onLoop}. Identical\n * shape to the `\"resolver.clobber.loop.detected\"` ObservationEvent so\n * consumers can route the same code path through either surface.\n *\n * @public\n */\nexport interface ClobberLoopDetectedEvent {\n readonly systemId: string;\n readonly fact: string;\n readonly participants: readonly string[];\n readonly participantModules: readonly string[];\n readonly count: number;\n readonly windowMs: number;\n readonly firstAt: number;\n readonly lastAt: number;\n readonly predicateOverlap?: PredicateOverlapProof;\n readonly severity: \"warn\" | \"error\";\n readonly factTags: readonly string[];\n readonly suppressedSinceLastEmit: number;\n readonly rejectionSeqs: readonly number[];\n}\n\n/**\n * Emitted payload for {@link ClobberLoopPluginOptions.onResolved}.\n *\n * @public\n */\nexport interface ClobberLoopResolvedEvent {\n readonly systemId: string;\n readonly fact: string;\n readonly participants: readonly string[];\n readonly durationMs: number;\n readonly resolution:\n | \"no-recurrence-in-window\"\n | \"participant-disabled\"\n | \"predicate-narrowed\";\n}\n\n/**\n * Runtime kill-switch handle returned alongside the plugin. Lets an SRE\n * flip the detector off during incident response without redeploying.\n * `disable()` stops emission but preserves buffer state so `enable()`\n * resumes cleanly without warm-up drift.\n *\n * @public\n */\nexport interface ClobberLoopPluginHandle<M extends ModuleSchema> {\n readonly plugin: Plugin<M>;\n disable(): void;\n enable(): void;\n isEnabled(): boolean;\n}\n\nconst DEFAULTS = {\n windowMs: 1000,\n threshold: 5,\n cooldownMs: 5000,\n resolvedAfterMs: 30000,\n maxTrackedFacts: 256,\n maxParticipantsPerFact: 16,\n maxEmissionsPerSec: 10,\n} as const;\n\n/**\n * Slim per-rejection record. Notably absent: `expected`/`actual` values.\n * The audit ledger already keeps the forensic payload — the detector's\n * ring buffer holds only what aggregation needs, so PII can't bleed\n * through this surface.\n */\ninterface RejectionRecord {\n readonly timestamp: number;\n readonly requirementId: string;\n readonly resolverId: string;\n readonly seq: number;\n}\n\ninterface FactState {\n readonly buffer: RejectionRecord[];\n participants: Set<string>;\n /** ms epoch of last cooldown fire keyed by sorted-participant signature. */\n readonly cooldowns: Map<string, number>;\n /** Active loop record for resolved-event tracking. */\n activeLoop: {\n readonly participants: readonly string[];\n readonly firstAt: number;\n lastClobberAt: number;\n } | null;\n}\n\n/**\n * Module-local LRU implementation. Not exported — when a second\n * detector (retry-storm, etc.) lands and validates the same shape, lift\n * to a shared utility. Until then, copy-paste is cheaper than the\n * abstraction tax.\n */\nfunction createLruMap<K, V>(\n cap: number,\n): {\n get(k: K): V | undefined;\n set(k: K, v: V): void;\n delete(k: K): boolean;\n size(): number;\n keys(): IterableIterator<K>;\n clear(): void;\n} {\n const data = new Map<K, V>();\n return {\n get(k) {\n const v = data.get(k);\n if (v !== undefined) {\n data.delete(k);\n data.set(k, v);\n }\n return v;\n },\n set(k, v) {\n if (data.has(k)) {\n data.delete(k);\n } else if (data.size >= cap) {\n const oldest = data.keys().next().value;\n if (oldest !== undefined) data.delete(oldest);\n }\n data.set(k, v);\n },\n delete(k) {\n return data.delete(k);\n },\n size() {\n return data.size;\n },\n keys() {\n return data.keys();\n },\n clear() {\n data.clear();\n },\n };\n}\n\n/**\n * Build a {@link PredicateOverlapProof} for the two whenSpecs that\n * participants' resolvers chain through. Best-effort:\n *\n * - both `undefined` → `function-form-opaque`\n * - identical clause structure → `matched`\n * - shared paths, no contradictions → `overlap`\n * - non-comparable operator detected → `indeterminate`\n *\n * The proof never throws; on any unexpected shape, falls back to\n * `function-form-opaque` so the warning message remains honest about\n * the limit of its own evidence.\n */\nfunction buildPredicateOverlap(\n whenA: FactPredicate<unknown> | undefined,\n whenB: FactPredicate<unknown> | undefined,\n whenSourceHashes?: readonly string[],\n): PredicateOverlapProof {\n if (!whenA || !whenB) {\n return {\n verdict: \"function-form-opaque\",\n reason: \"one-or-both-when-is-a-function\",\n ...(whenSourceHashes ? { whenSourceHashes } : {}),\n };\n }\n\n let flatA: LeafClause[];\n let flatB: LeafClause[];\n try {\n flatA = flattenPredicate(whenA);\n flatB = flattenPredicate(whenB);\n } catch {\n return {\n verdict: \"function-form-opaque\",\n reason: \"one-or-both-when-is-a-function\",\n };\n }\n\n if (flatA.length === 0 || flatB.length === 0) {\n return {\n verdict: \"function-form-opaque\",\n reason: \"one-or-both-when-is-a-function\",\n };\n }\n\n const keyOf = (c: LeafClause) =>\n `${c.path}::${c.op}::${JSON.stringify(c.value)}`;\n const setA = new Set(flatA.map(keyOf));\n const setB = new Set(flatB.map(keyOf));\n\n const allIdentical =\n setA.size === setB.size && [...setA].every((k) => setB.has(k));\n if (allIdentical) {\n return {\n verdict: \"matched\",\n coFireClauses: flatA,\n conflictingClauses: [],\n };\n }\n\n const coFire: LeafClause[] = [];\n const conflicting: LeafClause[] = [];\n let sawIndeterminate = false;\n\n for (const a of flatA) {\n for (const b of flatB) {\n if (a.path !== b.path) continue;\n const verdict = compareClauses(a, b);\n if (!verdict) continue;\n if (verdict.type === \"direct\") {\n conflicting.push(a);\n } else if (verdict.type === \"subset\" || verdict.type === \"overlap\") {\n coFire.push(a);\n // doctor.ts maps non-comparable operators to a soft \"overlap\" verdict\n // with a generic reason — surface that as indeterminate to be honest.\n if (\n verdict.reason.startsWith(\"Both rules touch\") &&\n verdict.type === \"overlap\"\n ) {\n sawIndeterminate = true;\n }\n }\n }\n }\n\n if (sawIndeterminate && coFire.length > 0) {\n return {\n verdict: \"indeterminate\",\n reason: \"non-comparable-operator\",\n coFireClauses: coFire,\n };\n }\n\n if (coFire.length > 0 && conflicting.length === 0) {\n return {\n verdict: \"overlap\",\n coFireClauses: coFire,\n conflictingClauses: [],\n };\n }\n\n if (coFire.length > 0) {\n return {\n verdict: \"overlap\",\n coFireClauses: coFire,\n conflictingClauses: conflicting,\n };\n }\n\n return {\n verdict: \"function-form-opaque\",\n reason: \"one-or-both-when-is-a-function\",\n };\n}\n\nfunction isDevMode(): boolean {\n try {\n return (\n typeof process !== \"undefined\" && process.env?.NODE_ENV !== \"production\"\n );\n } catch {\n return true;\n }\n}\n\n/**\n * Create a clobber-loop detector plugin. Returns a {@link\n * ClobberLoopPluginHandle} so callers can flip the detector off at\n * runtime without redeploying. The `.plugin` field is the value to\n * pass into `createSystem({ plugins: [...] })`.\n *\n * @example\n * ```ts\n * const loopDetector = clobberLoopPlugin({\n * threshold: 5,\n * windowMs: 1000,\n * onLoop: (e) => pagerduty.trigger({\n * severity: e.severity,\n * summary: `Clobber loop on ${e.fact}: ${e.participants.join(\" vs \")}`,\n * details: e,\n * }),\n * });\n *\n * createSystem({\n * module: myModule,\n * plugins: [loopDetector.plugin],\n * });\n *\n * // During incident response:\n * loopDetector.disable();\n * ```\n *\n * @public\n */\nexport function clobberLoopPlugin<M extends ModuleSchema>(\n options: ClobberLoopPluginOptions = {},\n): ClobberLoopPluginHandle<M> {\n const windowMs = options.windowMs ?? DEFAULTS.windowMs;\n const threshold = options.threshold ?? DEFAULTS.threshold;\n const cooldownMs = options.cooldownMs ?? DEFAULTS.cooldownMs;\n const resolvedAfterMs = options.resolvedAfterMs ?? DEFAULTS.resolvedAfterMs;\n const maxTrackedFacts = options.maxTrackedFacts ?? DEFAULTS.maxTrackedFacts;\n const maxParticipantsPerFact =\n options.maxParticipantsPerFact ?? DEFAULTS.maxParticipantsPerFact;\n const maxEmissionsPerSec =\n options.maxEmissionsPerSec ?? DEFAULTS.maxEmissionsPerSec;\n const capturePII = options.capturePII ?? false;\n const dev = isDevMode();\n const onLoop =\n options.onLoop ??\n ((event: ClobberLoopDetectedEvent) => {\n const text = formatWarningText(event);\n if (dev) {\n console.warn(text);\n } else {\n // Production default: stderr (NOT noop), so the signal lands in\n // log aggregators even when no explicit sink is wired.\n console.error(text);\n }\n });\n const onResolved = options.onResolved;\n\n let systemRef: System<M> | null = null;\n let enabled = true;\n let seq = 0;\n // Track the requirement → resolver mapping so we can map from the\n // rejection event's `req.id` back to the originating constraint.\n // Best-effort — when a resolverDef isn't reachable, predicateOverlap\n // falls back to `function-form-opaque`.\n const resolverIdToRequirementType = new Map<string, string>();\n const whenSpecCache = new Map<string, FactPredicate<unknown>>();\n const constraintByRequirementType = new Map<string, string>();\n const piiTaggedFacts = new Set<string>();\n const factTagsCache = new Map<string, readonly string[]>();\n const resolverModuleCache = new Map<string, string>();\n // Global emission rate limit — token bucket reset every second.\n let emissionsThisSecond = 0;\n let suppressedSinceLastEmit = 0;\n let secondWindowStart = 0;\n\n const factState = createLruMap<string, FactState>(maxTrackedFacts);\n\n function refreshWhenSpecCache(): void {\n whenSpecCache.clear();\n constraintByRequirementType.clear();\n if (!systemRef) return;\n try {\n const inspection = systemRef.inspect();\n for (const c of inspection.constraints) {\n if (c.whenSpec !== undefined) {\n whenSpecCache.set(\n c.id,\n redactWhenSpec(\n c.whenSpec,\n capturePII,\n piiTaggedFacts,\n ) as FactPredicate<unknown>,\n );\n }\n }\n // Map requirement type → constraint id. The relationship is via\n // the constraint's `require.type`, which inspect() doesn't expose\n // directly — best-effort via internal definition access. When\n // unreachable, leave the map empty; the overlap proof will fall\n // back to `function-form-opaque`.\n const internal = (\n systemRef as unknown as {\n $internal?: {\n mergedConstraints?: Record<\n string,\n { require?: { type?: string } | (() => { type?: string }) }\n >;\n };\n }\n ).$internal;\n if (internal?.mergedConstraints) {\n for (const [cid, def] of Object.entries(internal.mergedConstraints)) {\n let reqType: string | undefined;\n if (typeof def.require === \"function\") {\n try {\n reqType = def.require()?.type;\n } catch {\n // No-op\n }\n } else if (\n def.require &&\n typeof def.require === \"object\" &&\n \"type\" in def.require\n ) {\n reqType = (def.require as { type?: string }).type;\n }\n if (reqType) constraintByRequirementType.set(reqType, cid);\n }\n }\n\n for (const r of inspection.resolverDefs) {\n resolverIdToRequirementType.set(r.id, r.requirement);\n const moduleId =\n (r.meta as { moduleId?: string } | undefined)?.moduleId ?? \"\";\n resolverModuleCache.set(r.id, moduleId);\n }\n } catch {\n // System not ready / inspect unavailable — skip silently.\n }\n }\n\n function refreshPIITags(): void {\n piiTaggedFacts.clear();\n factTagsCache.clear();\n if (!systemRef) return;\n try {\n const tagged = systemRef.meta.byTag?.(\"pii\") ?? [];\n for (const m of tagged) piiTaggedFacts.add(m.id);\n } catch {\n // No meta accessor — skip.\n }\n }\n\n function getFactTags(fact: string): readonly string[] {\n const cached = factTagsCache.get(fact);\n if (cached) return cached;\n let tags: readonly string[] = [];\n try {\n tags = systemRef?.meta.fact(fact)?.tags ?? [];\n } catch {\n tags = [];\n }\n factTagsCache.set(fact, tags);\n return tags;\n }\n\n function trimBuffer(buf: RejectionRecord[], now: number): void {\n // Drop entries older than windowMs from the head.\n while (buf.length > 0 && buf[0]!.timestamp < now - windowMs) {\n buf.shift();\n }\n }\n\n function canEmit(now: number): boolean {\n if (now - secondWindowStart >= 1000) {\n emissionsThisSecond = 0;\n secondWindowStart = now;\n }\n if (emissionsThisSecond >= maxEmissionsPerSec) {\n suppressedSinceLastEmit += 1;\n return false;\n }\n emissionsThisSecond += 1;\n return true;\n }\n\n function fireLoop(\n fact: string,\n state: FactState,\n participantSet: Set<string>,\n nowMs: number,\n ): void {\n const sortedParticipants = [...participantSet].sort();\n const sig = sortedParticipants.join(\"|\");\n const lastFire = state.cooldowns.get(sig) ?? 0;\n if (nowMs - lastFire < cooldownMs) return;\n\n if (!canEmit(nowMs)) return;\n\n const rejections = state.buffer.filter((r) =>\n participantSet.has(r.resolverId),\n );\n const firstAt = rejections[0]?.timestamp ?? nowMs;\n const tags = getFactTags(fact);\n const severity: \"warn\" | \"error\" = tags.some(\n (t) => piiTaggedFacts.has(fact) || t === \"pii\" || t === \"money\",\n )\n ? \"error\"\n : \"warn\";\n\n const overlap = buildOverlapForParticipants(sortedParticipants);\n\n const participantModules = sortedParticipants.map(\n (id) => resolverModuleCache.get(id) ?? \"\",\n );\n\n const event: ClobberLoopDetectedEvent = {\n systemId: systemRef ? readSystemId(systemRef) : \"\",\n fact,\n participants: sortedParticipants,\n participantModules,\n count: rejections.length,\n windowMs,\n firstAt,\n lastAt: nowMs,\n ...(overlap ? { predicateOverlap: overlap } : {}),\n severity,\n factTags: tags,\n suppressedSinceLastEmit,\n rejectionSeqs: rejections.map((r) => r.seq),\n };\n suppressedSinceLastEmit = 0;\n\n state.cooldowns.set(sig, nowMs);\n state.activeLoop = {\n participants: sortedParticipants,\n firstAt,\n lastClobberAt: nowMs,\n };\n\n // Publish through the observation bus so audit-ledger, devtools, and\n // OTel exporters capture the loop without coupling to this plugin.\n // The user-facing `onLoop` callback still fires below — it's the\n // human-routing path; the bus is for backend wiring.\n try {\n systemRef?.notify.clobberLoopDetected(eventToObservation(event));\n } catch {\n // notify channel unavailable (very old engine? destroyed mid-emit?)\n // — fall back to the direct callback path only.\n }\n try {\n onLoop(event);\n } catch (err) {\n console.error(\n `[Directive] clobberLoopPlugin: onLoop callback threw for fact '${fact}'`,\n err,\n );\n }\n }\n\n function eventToObservation(\n event: ClobberLoopDetectedEvent,\n ): Parameters<NonNullable<System<M>[\"notify\"]>[\"clobberLoopDetected\"]>[0] {\n return {\n type: \"resolver.clobber.loop.detected\",\n systemId: event.systemId,\n fact: event.fact,\n participants: event.participants,\n participantModules: event.participantModules,\n count: event.count,\n windowMs: event.windowMs,\n firstAt: event.firstAt,\n lastAt: event.lastAt,\n ...(event.predicateOverlap\n ? { predicateOverlap: event.predicateOverlap }\n : {}),\n severity: event.severity,\n factTags: event.factTags,\n suppressedSinceLastEmit: event.suppressedSinceLastEmit,\n rejectionSeqs: event.rejectionSeqs,\n };\n }\n\n function buildOverlapForParticipants(\n sortedParticipants: readonly string[],\n ): PredicateOverlapProof | undefined {\n if (sortedParticipants.length < 2) return undefined;\n // Pair the first two participants for the proof. N-way contention\n // (>2 resolvers) gets the same proof shape from the first two —\n // the warning text names every participant separately.\n const [a, b] = sortedParticipants;\n const reqTypeA = a ? resolverIdToRequirementType.get(a) : undefined;\n const reqTypeB = b ? resolverIdToRequirementType.get(b) : undefined;\n const cidA = reqTypeA\n ? constraintByRequirementType.get(reqTypeA)\n : undefined;\n const cidB = reqTypeB\n ? constraintByRequirementType.get(reqTypeB)\n : undefined;\n const whenA = cidA ? whenSpecCache.get(cidA) : undefined;\n const whenB = cidB ? whenSpecCache.get(cidB) : undefined;\n return buildPredicateOverlap(whenA, whenB);\n }\n\n function sweepResolved(nowMs: number): void {\n for (const fact of [...factState.keys()]) {\n const state = factState.get(fact);\n if (!state?.activeLoop) continue;\n if (nowMs - state.activeLoop.lastClobberAt < resolvedAfterMs) continue;\n const event: ClobberLoopResolvedEvent = {\n systemId: systemRef ? readSystemId(systemRef) : \"\",\n fact,\n participants: state.activeLoop.participants,\n durationMs: nowMs - state.activeLoop.firstAt,\n resolution: \"no-recurrence-in-window\",\n };\n state.activeLoop = null;\n try {\n systemRef?.notify.clobberLoopResolved({\n type: \"resolver.clobber.loop.resolved\",\n systemId: event.systemId,\n fact: event.fact,\n participants: event.participants,\n durationMs: event.durationMs,\n resolution: event.resolution,\n });\n } catch {\n // notify channel unavailable — fall through to direct callback.\n }\n if (onResolved) {\n try {\n onResolved(event);\n } catch (err) {\n console.error(\n `[Directive] clobberLoopPlugin: onResolved callback threw for fact '${fact}'`,\n err,\n );\n }\n }\n }\n }\n\n function readSystemId(sys: System<M>): string {\n try {\n const meta = (sys as unknown as { meta?: { systemId?: string } }).meta;\n return meta?.systemId ?? \"\";\n } catch {\n return \"\";\n }\n }\n\n function formatWarningText(event: ClobberLoopDetectedEvent): string {\n const dur = event.lastAt - event.firstAt;\n const verdict = event.predicateOverlap?.verdict ?? \"function-form-opaque\";\n const lines = [\n `[directive] CLOBBER LOOP on \\`${event.fact}\\` (${event.count} clobbers in ${dur}ms)`,\n ` Participants: ${event.participants.join(\", \")}`,\n ` Predicate overlap: ${verdict}`,\n ];\n if (\n (event.predicateOverlap?.verdict === \"matched\" ||\n event.predicateOverlap?.verdict === \"overlap\") &&\n event.predicateOverlap.coFireClauses.length > 0\n ) {\n lines.push(\" Both `when:` predicates fire when:\");\n for (const c of event.predicateOverlap.coFireClauses.slice(0, 5)) {\n lines.push(` - ${c.path} ${c.op} ${JSON.stringify(c.value)}`);\n }\n }\n if (event.predicateOverlap?.verdict === \"function-form-opaque\") {\n lines.push(\n \" (cannot prove overlap — at least one constraint uses function-form `when:`)\",\n );\n }\n if (event.predicateOverlap?.verdict === \"indeterminate\") {\n lines.push(\n \" (cannot prove overlap — predicate uses non-comparable operator)\",\n );\n }\n lines.push(\n \" Suggested fix: add `priority:` to one, narrow `when:` to disjoint conditions, or merge into a single resolver.\",\n );\n return lines.join(\"\\n\");\n }\n\n const plugin: Plugin<M> = {\n name: \"clobber-loop\",\n onInit(system) {\n systemRef = system;\n secondWindowStart = Date.now();\n refreshPIITags();\n refreshWhenSpecCache();\n },\n onDestroy() {\n systemRef = null;\n factState.clear();\n whenSpecCache.clear();\n constraintByRequirementType.clear();\n resolverIdToRequirementType.clear();\n resolverModuleCache.clear();\n piiTaggedFacts.clear();\n factTagsCache.clear();\n emissionsThisSecond = 0;\n suppressedSinceLastEmit = 0;\n },\n onDefinitionRegister(_kind, _id) {\n refreshWhenSpecCache();\n refreshPIITags();\n },\n onDefinitionAssign(_kind, _id) {\n refreshWhenSpecCache();\n },\n onDefinitionUnregister(_kind, _id) {\n refreshWhenSpecCache();\n },\n onResolverWriteRejected(event) {\n if (!enabled || !systemRef) return;\n if (event.kind !== \"rejection\") return;\n // Skip self-clobber — a single resolver writing the same fact\n // twice in one dispatch is a resolver bug, not a loop.\n const now = Date.now();\n\n const fact = event.fact;\n let state = factState.get(fact);\n if (!state) {\n state = {\n buffer: [],\n participants: new Set(),\n cooldowns: new Map(),\n activeLoop: null,\n };\n factState.set(fact, state);\n }\n\n if (state.participants.size >= maxParticipantsPerFact) {\n // N-way contention beyond cap — stop adding participants. The\n // existing detected event already covers the situation.\n return;\n }\n\n const record: RejectionRecord = {\n timestamp: now,\n requirementId: event.req.id,\n resolverId: event.resolver,\n seq: seq++,\n };\n state.buffer.push(record);\n state.participants.add(event.resolver);\n trimBuffer(state.buffer, now);\n\n // Run sweep BEFORE we touch activeLoop.lastClobberAt — otherwise\n // the very rejection that arrives after the quiet window would\n // reset the timer and the resolved-event would never fire.\n sweepResolved(now);\n\n // Now update the active loop's last-clobber so a continuing loop\n // stays \"active\" for subsequent sweeps.\n if (state.activeLoop?.participants.includes(event.resolver)) {\n state.activeLoop = {\n ...state.activeLoop,\n lastClobberAt: now,\n };\n }\n\n // Threshold check. Distinct-by-requirementId so retry storms on\n // one requirement don't count multiple times.\n const recentDistinct = new Set<string>();\n const activeParticipants = new Set<string>();\n for (const r of state.buffer) {\n recentDistinct.add(r.requirementId);\n activeParticipants.add(r.resolverId);\n }\n if (recentDistinct.size >= threshold && activeParticipants.size >= 2) {\n fireLoop(fact, state, activeParticipants, now);\n }\n },\n };\n\n return {\n plugin,\n disable() {\n enabled = false;\n },\n enable() {\n enabled = true;\n },\n isEnabled() {\n return enabled;\n },\n };\n}\n"]}