@directive-run/cli 1.6.1 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +105 -74
- package/dist/cli.js.map +1 -1
- package/package.json +5 -5
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/constants.ts","../src/lib/detect.ts","../src/lib/merge.ts","../src/lib/monorepo.ts","../src/templates/claude.ts","../src/templates/cursor.ts","../src/templates/copilot.ts","../src/templates/cline.ts","../src/templates/windsurf.ts","../src/templates/index.ts","../src/commands/ai-rules.ts","../src/lib/loader.ts","../src/lib/timeline-loader.ts","../src/commands/bisect.ts","../src/commands/doctor.ts","../src/commands/examples.ts","../src/commands/explain.ts","../src/commands/graph.ts","../src/commands/init.ts","../src/commands/inspect.ts","../src/commands/new.ts","../../core/src/dev-true.ts","../../core/src/core/tracking.ts","../../core/src/core/types/predicate.ts","../../core/src/core/predicate.ts","../../core/src/core/replay-under.ts","../src/commands/replay-under.ts","../src/commands/replay.ts","../src/commands/timeline-diff.ts","../src/cli.ts"],"names":["CLI_NAME","SECTION_START","SECTION_END","TOOL_SIGNALS","detectTools","rootDir","detected","tool","signal","existsSync","join","getToolConfig","id","t","getAllToolIds","mergeSection","existingContent","newSection","startIdx","endIdx","wrapped","separator","hasDirectiveSection","content","MONOREPO_SIGNALS","detectMonorepo","startDir","dir","resolve","dirname","pkgPath","readFileSync","generateClaudeRules","corePatterns","getKnowledge","antiPatterns","naming","schemaTypes","generateCursorRules","generateCopilotRules","generateClineRules","generateWindsurfRules","generators","getTemplate","toolId","generator","parseArgs","args","opts","i","val","aiRulesCommand","pc","mono","targetDir","placement","relative","selectedTools","config","choices","s","filePath","fileExists","writeFile","action","mkdirSync","writeFileSync","aiRulesUpdateCommand","ruleFiles","updated","file","existing","newContent","merged","aiRulesCheckCommand","checked","stale","freshContent","loadSystem","resolved","mod","isSystem","key","err","obj","sys","loadSystemFactory","candidates","name","candidate","result","loadTimelinePackage","verbose","jsonPath","arg","n","printUsage","compileAssertion","expr","fn","system","facts","bisectCommand","resolvedJson","raw","parsed","deserializeTimeline","bisectTimeline","timeline","assertion","factory","lean","idx","frame","eventType","checkCoreInstalled","pkg","deps","checkVersionCompatibility","directivePackages","k","checkTypeScript","tsconfigPath","stripped","co","issues","checkDuplicateInstances","nodeModules","duplicates","scopeDir","packages","readdirSync","nestedCore","checkAIRulesFreshness","found","doctorCommand","checks","failures","check","icon","CATEGORIES","getCategory","cat","names","getDescription","lines","line","trimmed","jsdocMatch","examplesListCommand","filter","examples","getAllExamples","byCategory","categoryOrder","sortedCategories","a","b","items","item","desc","examplesCopyCommand","dest","getExample","rewritten","rel","requirementId","explainCommand","inspection","explanation","u","resolverEntries","status","state","formatState","dur","payload","resolverStatus","r","renderAsciiGraph","constraintMap","c","entry","resolversByType","info","reqType","resolvers","usedResolvers","renderHtmlGraph","nodes","edges","factKeys","reqTypes","reqIdx","nodeMap","svgWidth","maxY","edgeSvg","e","from","to","nodeSvg","escapeHtml","headerSvg","h","text","graphCommand","factsObj","html","outputPath","execFile","openCmd","detectPackageManager","installCmd","pm","getTemplates","moduleName","generateCounterModule","generateCounterMain","generateAuthModule","generateAuthMain","generateAIModule","generateAIMain","toCamelCase","camelName","_","initCommand","S","nameResult","templateId","templates","choice","template","skipped","depsCmd","formatFacts","entries","value","formatted","formatValue","formatConstraints","constraints","hits","formatResolverDefs","resolverDefs","def","stateStr","formatResolverState","formatUnmet","unmet","formatInflight","inflight","now","inf","elapsed","error","duration","findWarnings","warnings","inspectCommand","w","ALL_SECTIONS","generateModule","sections","hasConstraints","hasResolvers","code","generateOrchestrator","findModulesDir","newModuleCommand","newOrchestratorCommand","dev_true_default","PREDICATE_OPERATORS","PREDICATE_COMBINATORS","MAX_PREDICATE_DEPTH","isPlainObject","v","isPlainObjectStrict","proto","isOperatorObject","count","hasDollarKey","devWarn","isPredicate","walkPredicate","spec","visitor","path","seen","depth","clause","clausePath","kind","children","child","childPath","opObj","op","validatePredicate","checkValueJsonSafe","at","el","checkOperand","_factPath","operand","operandPath","factPath","deepEqualSeen","pairId","deepEqual","guard","bArr","bEntries","used","ka","va","kb","vb","ak","bk","toComparable","relational","actual","applyOperator","prevValue","lo","hi","message","evalField","prev","keys","evaluatePredicate","fact","p","evaluatePredicateExplained","pathPrefix","out","childSpecs","passCount","pass","MAX_REPLAY_FRAMES","validateReplaySpec","which","preview","unknownOp","toReplayFrames","framesFromHistory","list","index","historyExport","framesFromSnapshots","exportObj","snapshots","replayUnder","options","frames","original","proposed","entityKey","requested","maxSamples","originalMatched","proposedMatched","newMatchCount","lostMatchCount","unchanged","newMatches","lostMatches","originalEntities","proposedEntities","prevFacts","originalBit","proposedBit","buildSample","report","sample","readJsonFile","label","loadFrames","N","isEmptyPredicate","previewFacts","parts","extra","printReport","delta","deltaStr","sampled","total","replayUnderCommand","we","replayCommand","replayTimeline","dispatched","truncated","ok","positionals","fmtSign","fmtCountDelta","rows","fmtResolverRows","fmtErrors","sideTag","errStr","readTimeline","timelineDiffCommand","aPath","bPath","diffTimelines","aRaw","bRaw","aTl","bTl","diff","HELP","main","first","fileURLToPath","__dirname","command","subcommand"],"mappings":";uQAAO,IAAMA,CAAAA,CAAW,WAAA,CAGjB,IAAMC,EAAAA,CAAgB,0BAAA,CAChBC,GAAc,wBAAA,CCK3B,IAAMC,EAAAA,CAKD,CACH,CACE,EAAA,CAAI,QAAA,CACJ,IAAA,CAAM,QAAA,CACN,OAAA,CAAS,CAAC,UAAW,cAAc,CAAA,CACnC,WAAY,cACd,CAAA,CACA,CACE,EAAA,CAAI,QAAA,CACJ,KAAM,aAAA,CACN,OAAA,CAAS,CAAC,SAAS,CAAA,CACnB,WAAY,mBACd,CAAA,CACA,CACE,EAAA,CAAI,SAAA,CACJ,IAAA,CAAM,gBAAA,CACN,OAAA,CAAS,CAAC,SAAS,CAAA,CACnB,UAAA,CAAY,iCACd,CAAA,CACA,CACE,GAAI,UAAA,CACJ,IAAA,CAAM,UAAA,CACN,OAAA,CAAS,CAAC,gBAAgB,EAC1B,UAAA,CAAY,gBACd,EACA,CACE,EAAA,CAAI,QACJ,IAAA,CAAM,OAAA,CACN,OAAA,CAAS,CAAC,aAAa,CAAA,CACvB,WAAY,aACd,CACF,EAEO,SAASC,EAAAA,CAAYC,EAAiC,CAC3D,IAAMC,EAA2B,EAAC,CAElC,QAAWC,CAAAA,IAAQJ,EAAAA,CACCI,EAAK,OAAA,CAAQ,IAAA,CAAMC,GACnCC,UAAAA,CAAWC,IAAAA,CAAKL,CAAAA,CAASG,CAAM,CAAC,CAClC,GAGEF,CAAAA,CAAS,IAAA,CAAK,CACZ,IAAA,CAAMC,CAAAA,CAAK,KACX,EAAA,CAAIA,CAAAA,CAAK,EAAA,CACT,UAAA,CAAYG,IAAAA,CAAKL,CAAAA,CAASE,EAAK,UAAU,CAC3C,CAAC,CAAA,CAIL,OAAOD,CACT,CAEO,SAASK,EAAAA,CAAcC,CAAAA,CAAwB,CACpD,IAAML,EAAOJ,EAAAA,CAAa,IAAA,CAAMU,GAAMA,CAAAA,CAAE,EAAA,GAAOD,CAAE,CAAA,CACjD,GAAI,CAACL,CAAAA,CACH,MAAM,IAAI,MAAM,CAAA,cAAA,EAAiBK,CAAE,EAAE,CAAA,CAGvC,OAAOL,CACT,CAEO,SAASO,EAAAA,EAAsC,CACpD,OAAOX,EAAAA,CAAa,IAAKU,CAAAA,EAAMA,CAAAA,CAAE,EAAE,CACrC,CCxEO,SAASE,CAAAA,CACdC,CAAAA,CACAC,CAAAA,CACQ,CACR,IAAMC,CAAAA,CAAWF,EAAgB,OAAA,CAAQf,EAAa,EAChDkB,CAAAA,CAASH,CAAAA,CAAgB,QAAQd,EAAW,CAAA,CAE5CkB,CAAAA,CAAU,CAAA,EAAGnB,EAAa;AAAA,EAAKgB,CAAU;AAAA,EAAKf,EAAW,CAAA,CAAA,CAE/D,GAAIgB,CAAAA,GAAa,EAAA,EAAMC,IAAW,EAAA,EAAMA,CAAAA,CAASD,CAAAA,CAC/C,OACEF,CAAAA,CAAgB,KAAA,CAAM,EAAGE,CAAQ,CAAA,CACjCE,CAAAA,CACAJ,CAAAA,CAAgB,KAAA,CAAMG,CAAAA,CAASjB,EAAAA,CAAY,MAAM,CAAA,CAIrD,IAAMmB,CAAAA,CAAYL,CAAAA,CAAgB,QAAA,CAAS;AAAA,CAAI,CAAA,CAAI;AAAA,CAAA,CAAO;;AAAA,CAAA,CAE1D,OAAOA,CAAAA,CAAkBK,CAAAA,CAAYD,CAAAA,CAAU;AAAA,CACjD,CAKO,SAASE,CAAAA,CAAoBC,EAA0B,CAC5D,OAAOA,EAAQ,QAAA,CAAStB,EAAa,CAAA,EAAKsB,CAAAA,CAAQ,SAASrB,EAAW,CACxE,CCxBA,IAAMsB,EAAAA,CAAmB,CACvB,CAAE,KAAM,qBAAA,CAAuB,IAAA,CAAM,MAAgB,CAAA,CACrD,CAAE,KAAM,YAAA,CAAc,IAAA,CAAM,OAAiB,CAC/C,EAEO,SAASC,EAAAA,CAAeC,EAAgC,CAC7D,IAAIC,EAAMC,OAAAA,CAAQF,CAAQ,CAAA,CAE1B,KAAOC,IAAQE,OAAAA,CAAQF,CAAG,GAAG,CAC3B,IAAA,IAAWnB,KAAUgB,EAAAA,CACnB,GAAIf,UAAAA,CAAWC,IAAAA,CAAKiB,EAAKnB,CAAAA,CAAO,IAAI,CAAC,CAAA,CACnC,OAAO,CAAE,UAAA,CAAY,IAAA,CAAM,OAAA,CAASmB,CAAAA,CAAK,KAAMnB,CAAAA,CAAO,IAAK,EAI/D,IAAMsB,CAAAA,CAAUpB,KAAKiB,CAAAA,CAAK,cAAc,CAAA,CACxC,GAAIlB,WAAWqB,CAAO,CAAA,CACpB,GAAI,CAEF,GADY,KAAK,KAAA,CAAMC,YAAAA,CAAaD,CAAAA,CAAS,OAAO,CAAC,CAAA,CAC7C,UAAA,CAAY,CAClB,IAAMvB,CAAAA,CAAOE,WAAWC,IAAAA,CAAKiB,CAAAA,CAAK,WAAW,CAAC,EACzC,MAAA,CACA,KAAA,CAEL,OAAO,CAAE,UAAA,CAAY,GAAM,OAAA,CAASA,CAAAA,CAAK,IAAA,CAAApB,CAAK,CAChD,CACF,CAAA,KAAQ,CAER,CAGFoB,CAAAA,CAAME,QAAQF,CAAG,EACnB,CAEA,OAAO,CAAE,UAAA,CAAY,KAAA,CAAO,QAASD,CAAS,CAChD,CCrCO,SAASM,IAA8B,CAE5C,IAAMC,EAAeC,YAAAA,CAAa,eAAe,EAC3CC,CAAAA,CAAeD,YAAAA,CAAa,eAAe,CAAA,CAC3CE,CAAAA,CAASF,aAAa,QAAQ,CAAA,CAC9BG,EAAcH,YAAAA,CAAa,cAAc,EAE/C,OAAO,CAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA,EAQPD,CAAY;;AAAA;;AAAA;;AAAA,EAMZE,CAAY;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA,EA2BZC,CAAM;;AAAA;;AAAA;;AAAA,EAMNC,CAAW;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,CA8Kb,CCvOO,SAASC,EAAAA,EAA8B,CAC5C,OAAO,65GAuFT,CCtFO,SAASC,CAAAA,EAA+B,CA2D7C,OA1DaD,EAAAA,GAGa,y2BAAA,CAiBN;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,CAeH;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAwBnB,CC5DO,SAASE,EAAAA,EAA6B,CAC3C,OAAOD,GACT,CCFO,SAASE,EAAAA,EAAgC,CAC9C,OAAOF,GACT,CCAA,IAAMG,EAAAA,CAAuD,CAC3D,MAAA,CAAQJ,EAAAA,CACR,MAAA,CAAQN,EAAAA,CACR,OAAA,CAASO,CAAAA,CACT,QAAA,CAAUE,EAAAA,CACV,KAAA,CAAOD,EACT,CAAA,CAEO,SAASG,EAAAA,CAAYC,CAAAA,CAAoC,CAC9D,IAAMC,EAAYH,EAAAA,CAAWE,CAAM,CAAA,CACnC,GAAI,CAACC,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyBD,CAAM,CAAA,CAAE,CAAA,CAGnD,OAAOC,CAAAA,EACT,CCDA,SAASC,EAAAA,CAAUC,CAAAA,CAAyB,CAC1C,IAAMC,CAAAA,CAAgB,CACpB,KAAA,CAAO,KAAA,CACP,KAAA,CAAO,KAAA,CACP,MAAO,EAAC,CACR,GAAA,CAAK,OAAA,CAAQ,GAAA,EACf,EAEA,IAAA,IAASC,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAIF,CAAAA,CAAK,MAAA,CAAQE,CAAAA,EAAAA,CAG/B,OAFYF,CAAAA,CAAKE,CAAC,CAAA,EAGhB,KAAK,SAAA,CACHD,EAAK,KAAA,CAAQ,IAAA,CACb,MACF,KAAK,SAAA,CACHA,CAAAA,CAAK,MAAQ,IAAA,CACb,MACF,KAAK,QAAA,CAAU,CACb,IAAME,EAAMH,CAAAA,CAAK,EAAEE,CAAC,CAAA,CAChBC,CAAAA,EACFF,CAAAA,CAAK,KAAA,CAAM,IAAA,CAAKE,CAAG,CAAA,CAErB,KACF,CACA,KAAK,OAAA,CAAS,CACZ,IAAMA,CAAAA,CAAMH,CAAAA,CAAK,EAAEE,CAAC,CAAA,CAChBC,IACFF,CAAAA,CAAK,GAAA,CAAME,CAAAA,CAAAA,CAEb,KACF,CACF,CAGF,OAAOF,CACT,CAEA,eAAsBG,EAAAA,CAAeJ,CAAAA,CAAgB,CACnD,IAAMC,CAAAA,CAAOF,EAAAA,CAAUC,CAAI,CAAA,CAEzB,CAAA,CAAA,KAAA,CAAMK,CAAAA,CAAG,MAAA,CAAOA,EAAG,KAAA,CAAM,sBAAsB,CAAC,CAAC,CAAA,CAGnD,IAAMC,EAAO5B,EAAAA,CAAeuB,CAAAA,CAAK,GAAG,CAAA,CAChCM,CAAAA,CAAYN,CAAAA,CAAK,IAErB,GAAIK,CAAAA,CAAK,UAAA,EAAcA,CAAAA,CAAK,OAAA,GAAYL,CAAAA,CAAK,GAAA,CAAK,CAChD,IAAMO,CAAAA,CAAY,MAAQ,CAAA,CAAA,MAAA,CAAO,CAC/B,OAAA,CAAS,yDACT,OAAA,CAAS,CACP,CACE,KAAA,CAAO,MAAA,CACP,KAAA,CAAO,kBAAkBC,QAAAA,CAASR,CAAAA,CAAK,GAAA,CAAKK,CAAAA,CAAK,OAAO,CAAA,EAAK,GAAG,CAAA,CAAA,CAAA,CAChE,IAAA,CAAM,aACR,CAAA,CACA,CACE,KAAA,CAAO,WAAA,CACP,KAAA,CAAO,CAAA,mBAAA,EAAsBG,QAAAA,CAASH,CAAAA,CAAK,OAAA,CAASL,CAAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAC/D,CACF,CACF,CAAC,CAAA,CAEK,CAAA,CAAA,QAAA,CAASO,CAAS,CAAA,GACpB,CAAA,CAAA,MAAA,CAAO,YAAY,CAAA,CACrB,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,CAAA,CAGZA,CAAAA,GAAc,MAAA,GAChBD,CAAAA,CAAYD,CAAAA,CAAK,OAAA,EAErB,CAGA,IAAII,CAAAA,CAEJ,GAAIT,CAAAA,CAAK,KAAA,CAAM,MAAA,CAAS,CAAA,CACtBS,EAAgBT,CAAAA,CAAK,KAAA,CAAM,GAAA,CAAKpC,CAAAA,EAAO,CACrC,IAAM8C,EAAS/C,EAAAA,CAAcC,CAAwB,CAAA,CAErD,OAAO,CACL,IAAA,CAAM8C,EAAO,IAAA,CACb,EAAA,CAAIA,CAAAA,CAAO,EAAA,CACX,UAAA,CAAYhD,IAAAA,CAAK4C,CAAAA,CAAWI,CAAAA,CAAO,UAAU,CAC/C,CACF,CAAC,CAAA,CAAA,KACI,CACL,IAAMpD,CAAAA,CAAWF,EAAAA,CAAYkD,CAAS,CAAA,CAEtC,GAAIhD,CAAAA,CAAS,OAAS,CAAA,CAAG,CACvB,IAAMqD,CAAAA,CAAU,MAAQ,CAAA,CAAA,WAAA,CAAY,CAClC,OAAA,CAAS,CAAA,SAAA,EAAYrD,CAAAA,CAAS,MAAM,CAAA,8CAAA,CAAA,CACpC,OAAA,CAASA,CAAAA,CAAS,GAAA,CAAKO,CAAAA,GAAO,CAC5B,KAAA,CAAOA,CAAAA,CAAE,EAAA,CACT,KAAA,CAAOA,EAAE,IAAA,CACT,IAAA,CAAM2C,QAAAA,CAASF,CAAAA,CAAWzC,CAAAA,CAAE,UAAU,CACxC,CAAA,CAAE,CAAA,CACF,aAAA,CAAeP,CAAAA,CAAS,GAAA,CAAKO,CAAAA,EAAMA,EAAE,EAAE,CAAA,CACvC,QAAA,CAAU,IACZ,CAAC,CAAA,CAEK,CAAA,CAAA,QAAA,CAAS8C,CAAO,CAAA,GAClB,CAAA,CAAA,MAAA,CAAO,YAAY,CAAA,CACrB,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,CAAA,CAGhBF,CAAAA,CAAiBE,CAAAA,CAAiC,GAAA,CAAK/C,CAAAA,EAAO,CAC5D,IAAM8C,CAAAA,CAAS/C,EAAAA,CAAcC,CAAE,CAAA,CAE/B,OAAO,CACL,KAAM8C,CAAAA,CAAO,IAAA,CACb,EAAA,CAAIA,CAAAA,CAAO,EAAA,CACX,UAAA,CAAYhD,IAAAA,CAAK4C,CAAAA,CAAWI,CAAAA,CAAO,UAAU,CAC/C,CACF,CAAC,EACH,MAAO,CACL,IAAMC,CAAAA,CAAU,MAAQ,CAAA,CAAA,WAAA,CAAY,CAClC,QAAS,+CAAA,CACT,OAAA,CAAS7C,EAAAA,EAAc,CAAE,GAAA,CAAKF,CAAAA,EAAO,CACnC,IAAM8C,CAAAA,CAAS/C,EAAAA,CAAcC,CAAE,CAAA,CAE/B,OAAO,CAAE,KAAA,CAAOA,CAAAA,CAAI,KAAA,CAAO8C,CAAAA,CAAO,IAAK,CACzC,CAAC,EACD,QAAA,CAAU,IACZ,CAAC,CAAA,CAEK,CAAA,CAAA,QAAA,CAASC,CAAO,IAClB,CAAA,CAAA,MAAA,CAAO,YAAY,CAAA,CACrB,OAAA,CAAQ,IAAA,CAAK,CAAC,GAGhBF,CAAAA,CAAiBE,CAAAA,CAAiC,GAAA,CAAK/C,CAAAA,EAAO,CAC5D,IAAM8C,CAAAA,CAAS/C,EAAAA,CAAcC,CAAE,CAAA,CAE/B,OAAO,CACL,IAAA,CAAM8C,CAAAA,CAAO,KACb,EAAA,CAAIA,CAAAA,CAAO,EAAA,CACX,UAAA,CAAYhD,IAAAA,CAAK4C,CAAAA,CAAWI,EAAO,UAAU,CAC/C,CACF,CAAC,EACH,CACF,CAEID,CAAAA,CAAc,MAAA,GAAW,CAAA,GACzB,CAAA,CAAA,MAAA,CAAO,oBAAoB,CAAA,CAC7B,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,CAAA,CAIhB,IAAMG,CAAAA,CAAM,CAAA,CAAA,OAAA,EAAQ,CAEpB,QAAWrD,CAAAA,IAAQkD,CAAAA,CAAe,CAChCG,CAAAA,CAAE,KAAA,CAAM,CAAA,WAAA,EAAcrD,CAAAA,CAAK,IAAI,CAAA,SAAA,CAAW,CAAA,CAE1C,IAAMgB,CAAAA,CAAUoB,EAAAA,CAAYpC,CAAAA,CAAK,EAAE,CAAA,CAC7BsD,CAAAA,CAAWtD,CAAAA,CAAK,UAAA,CAChBuD,CAAAA,CAAarD,UAAAA,CAAWoD,CAAQ,CAAA,CAItC,GAFAD,CAAAA,CAAE,IAAA,CAAK,CAAA,UAAA,EAAarD,CAAAA,CAAK,IAAI,SAAS,CAAA,CAElCuD,CAAAA,EAAc,CAACd,CAAAA,CAAK,KAAA,CAAO,CAC7B,IAAMhC,CAAAA,CAAkBe,YAAAA,CAAa8B,CAAAA,CAAU,OAAO,CAAA,CAEtD,GAAIb,EAAK,KAAA,CAAO,CACde,CAAAA,CAAUF,CAAAA,CAAU9C,CAAAA,CAAaC,CAAAA,CAAiBO,CAAO,CAAC,CAAA,CACxD,CAAA,CAAA,GAAA,CAAI,OAAA,CACJ,CAAA,EAAG6B,CAAAA,CAAG,KAAA,CAAM,QAAQ,CAAC,CAAA,wBAAA,EAA2BA,CAAAA,CAAG,GAAA,CAAII,QAAAA,CAASF,CAAAA,CAAWO,CAAQ,CAAC,CAAC,CAAA,CACvF,CAAA,CACA,QACF,CAEA,GAAIvC,CAAAA,CAAoBN,CAAe,CAAA,CAAG,CACxC,IAAMgD,CAAAA,CAAS,MAAQ,CAAA,CAAA,MAAA,CAAO,CAC5B,OAAA,CAAS,CAAA,EAAGR,QAAAA,CAASF,CAAAA,CAAWO,CAAQ,CAAC,CAAA,oDAAA,CAAA,CACzC,OAAA,CAAS,CACP,CACE,KAAA,CAAO,OAAA,CACP,MAAO,+BAAA,CACP,IAAA,CAAM,aACR,CAAA,CACA,CAAE,KAAA,CAAO,YAAa,KAAA,CAAO,uBAAwB,CAAA,CACrD,CAAE,KAAA,CAAO,MAAA,CAAQ,KAAA,CAAO,gBAAiB,CAC3C,CACF,CAAC,CAAA,CAEK,CAAA,CAAA,QAAA,CAASG,CAAM,IACjB,CAAA,CAAA,MAAA,CAAO,YAAY,CAAA,CACrB,OAAA,CAAQ,IAAA,CAAK,CAAC,GAGZA,CAAAA,GAAW,OAAA,EACbD,CAAAA,CAAUF,CAAAA,CAAU9C,CAAAA,CAAaC,CAAAA,CAAiBO,CAAO,CAAC,CAAA,CACxD,CAAA,CAAA,GAAA,CAAI,OAAA,CACJ,CAAA,EAAG6B,CAAAA,CAAG,KAAA,CAAM,SAAS,CAAC,CAAA,CAAA,EAAIA,CAAAA,CAAG,GAAA,CAAII,QAAAA,CAASF,CAAAA,CAAWO,CAAQ,CAAC,CAAC,CAAA,CACjE,CAAA,EACSG,CAAAA,GAAW,WAAA,EACpBD,EAAUF,CAAAA,CAAUtC,CAAO,CAAA,CACzB,CAAA,CAAA,GAAA,CAAI,OAAA,CACJ,CAAA,EAAG6B,EAAG,KAAA,CAAM,OAAO,CAAC,CAAA,CAAA,EAAIA,CAAAA,CAAG,GAAA,CAAII,QAAAA,CAASF,CAAAA,CAAWO,CAAQ,CAAC,CAAC,CAAA,CAC/D,CAAA,EAEE,CAAA,CAAA,GAAA,CAAI,KAAK,CAAA,QAAA,EAAWT,CAAAA,CAAG,GAAA,CAAII,QAAAA,CAASF,CAAAA,CAAWO,CAAQ,CAAC,CAAC,CAAA,CAAE,EAEjE,CAAA,KAAO,CACL,IAAMG,EAAS,MAAQ,CAAA,CAAA,MAAA,CAAO,CAC5B,OAAA,CAAS,CAAA,EAAGR,QAAAA,CAASF,CAAAA,CAAWO,CAAQ,CAAC,CAAA,mCAAA,CAAA,CACzC,OAAA,CAAS,CACP,CACE,KAAA,CAAO,SACP,KAAA,CAAO,0BAAA,CACP,IAAA,CAAM,4BACR,CAAA,CACA,CAAE,MAAO,WAAA,CAAa,KAAA,CAAO,uBAAwB,CAAA,CACrD,CAAE,KAAA,CAAO,OAAQ,KAAA,CAAO,gBAAiB,CAC3C,CACF,CAAC,CAAA,CAEK,CAAA,CAAA,QAAA,CAASG,CAAM,CAAA,GACjB,CAAA,CAAA,MAAA,CAAO,YAAY,CAAA,CACrB,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,CAAA,CAGZA,CAAAA,GAAW,QAAA,EACbD,CAAAA,CAAUF,CAAAA,CAAU9C,CAAAA,CAAaC,EAAiBO,CAAO,CAAC,CAAA,CACxD,CAAA,CAAA,GAAA,CAAI,OAAA,CACJ,CAAA,EAAG6B,EAAG,KAAA,CAAM,UAAU,CAAC,CAAA,IAAA,EAAOA,CAAAA,CAAG,GAAA,CAAII,QAAAA,CAASF,CAAAA,CAAWO,CAAQ,CAAC,CAAC,CAAA,CACrE,CAAA,EACSG,CAAAA,GAAW,aACpBD,CAAAA,CAAUF,CAAAA,CAAUtC,CAAO,CAAA,CACzB,CAAA,CAAA,GAAA,CAAI,OAAA,CACJ,GAAG6B,CAAAA,CAAG,KAAA,CAAM,OAAO,CAAC,CAAA,CAAA,EAAIA,CAAAA,CAAG,IAAII,QAAAA,CAASF,CAAAA,CAAWO,CAAQ,CAAC,CAAC,CAAA,CAC/D,CAAA,EAEE,CAAA,CAAA,GAAA,CAAI,IAAA,CAAK,CAAA,QAAA,EAAWT,CAAAA,CAAG,GAAA,CAAII,QAAAA,CAASF,CAAAA,CAAWO,CAAQ,CAAC,CAAC,CAAA,CAAE,EAEjE,CACF,CAAA,KACEE,EAAUF,CAAAA,CAAUtC,CAAO,CAAA,CACzB,CAAA,CAAA,GAAA,CAAI,OAAA,CACJ,CAAA,EAAG6B,EAAG,KAAA,CAAM,SAAS,CAAC,CAAA,CAAA,EAAIA,CAAAA,CAAG,GAAA,CAAII,QAAAA,CAASF,CAAAA,CAAWO,CAAQ,CAAC,CAAC,CAAA,CACjE,EAEJ,CAEE,QACA,CAAA,UAAA,EAAaT,CAAAA,CAAG,IAAA,CAAK,CAAA,EAAGpD,CAAQ,CAAA,sBAAA,CAAwB,CAAC,CAAA,mBAAA,CAC3D,EACF,CAEA,SAAS+D,CAAAA,CAAUF,CAAAA,CAAkBtC,EAAiB,CACpD,IAAMI,CAAAA,CAAME,OAAAA,CAAQgC,CAAQ,CAAA,CACvBpD,UAAAA,CAAWkB,CAAG,CAAA,EACjBsC,SAAAA,CAAUtC,CAAAA,CAAK,CAAE,SAAA,CAAW,IAAK,CAAC,CAAA,CAGpCuC,aAAAA,CAAcL,CAAAA,CAAUtC,CAAAA,CAAS,OAAO,EAC1C,CAMA,eAAsB4C,EAAAA,CAAqBpB,CAAAA,CAAgB,CAEzD,IAAMO,CAAAA,CADOR,GAAUC,CAAI,CAAA,CACJ,GAAA,CAEjBqB,CAAAA,CAA6D,CACjE,CAAE,EAAA,CAAI,QAAA,CAAU,IAAA,CAAM1D,IAAAA,CAAK4C,CAAAA,CAAW,cAAc,CAAE,CAAA,CACtD,CAAE,EAAA,CAAI,QAAA,CAAU,IAAA,CAAM5C,IAAAA,CAAK4C,CAAAA,CAAW,mBAAmB,CAAE,CAAA,CAC3D,CAAE,EAAA,CAAI,SAAA,CAAW,IAAA,CAAM5C,IAAAA,CAAK4C,EAAW,iCAAiC,CAAE,CAAA,CAC1E,CAAE,EAAA,CAAI,UAAA,CAAY,IAAA,CAAM5C,IAAAA,CAAK4C,CAAAA,CAAW,gBAAgB,CAAE,CAAA,CAC1D,CAAE,EAAA,CAAI,QAAS,IAAA,CAAM5C,IAAAA,CAAK4C,CAAAA,CAAW,aAAa,CAAE,CACtD,EAEIe,CAAAA,CAAU,CAAA,CAEd,IAAA,IAAWC,CAAAA,IAAQF,CAAAA,CAAW,CAC5B,GAAI,CAAC3D,UAAAA,CAAW6D,CAAAA,CAAK,IAAI,CAAA,CACvB,SAGF,IAAMC,CAAAA,CAAWxC,YAAAA,CAAauC,CAAAA,CAAK,IAAA,CAAM,OAAO,CAAA,CAChD,GAAI,CAAChD,CAAAA,CAAoBiD,CAAQ,CAAA,CAC/B,SAGF,IAAMC,CAAAA,CAAa7B,GAAY2B,CAAAA,CAAK,EAAE,CAAA,CAChCG,CAAAA,CAAS1D,CAAAA,CAAawD,CAAAA,CAAUC,CAAU,CAAA,CAEhDT,CAAAA,CAAUO,CAAAA,CAAK,IAAA,CAAMG,CAAM,CAAA,CAC3B,OAAA,CAAQ,GAAA,CACN,CAAA,EAAGrB,CAAAA,CAAG,KAAA,CAAM,SAAS,CAAC,CAAA,CAAA,EAAIA,EAAG,GAAA,CAAII,QAAAA,CAASF,CAAAA,CAAWgB,CAAAA,CAAK,IAAI,CAAC,CAAC,CAAA,CAClE,CAAA,CACAD,CAAAA,GACF,CAGE,OAAA,CAAQ,GAAA,CADNA,CAAAA,GAAY,EAEZjB,CAAAA,CAAG,GAAA,CACD,CAAA,kCAAA,EAAqCA,CAAAA,CAAG,IAAA,CAAK,CAAA,EAAGpD,CAAQ,CAAA,cAAA,CAAgB,CAAC,CAAA,OAAA,CAC3E,CAAA,CAIAoD,CAAAA,CAAG,KAAA,CAAM;AAAA,QAAA,EAAaiB,CAAO,CAAA,qCAAA,CAAuC,CAHtE,EAMJ,CAMA,eAAsBK,EAAAA,CAAoB3B,CAAAA,CAAgB,CAExD,IAAMO,EADOR,EAAAA,CAAUC,CAAI,EACJ,GAAA,CAEjBqB,CAAAA,CAID,CACH,CAAE,EAAA,CAAI,QAAA,CAAU,IAAA,CAAM1D,KAAK4C,CAAAA,CAAW,cAAc,CAAA,CAAG,IAAA,CAAM,QAAS,CAAA,CACtE,CACE,EAAA,CAAI,QAAA,CACJ,KAAM5C,IAAAA,CAAK4C,CAAAA,CAAW,mBAAmB,CAAA,CACzC,IAAA,CAAM,aACR,CAAA,CACA,CACE,EAAA,CAAI,SAAA,CACJ,KAAM5C,IAAAA,CAAK4C,CAAAA,CAAW,iCAAiC,CAAA,CACvD,KAAM,gBACR,CAAA,CACA,CACE,EAAA,CAAI,WACJ,IAAA,CAAM5C,IAAAA,CAAK4C,EAAW,gBAAgB,CAAA,CACtC,KAAM,UACR,CAAA,CACA,CAAE,EAAA,CAAI,QAAS,IAAA,CAAM5C,IAAAA,CAAK4C,CAAAA,CAAW,aAAa,EAAG,IAAA,CAAM,OAAQ,CACrE,CAAA,CAEIqB,EAAU,CAAA,CACVC,CAAAA,CAAQ,EAEZ,IAAA,IAAWN,CAAAA,IAAQF,EAAW,CAC5B,GAAI,CAAC3D,UAAAA,CAAW6D,EAAK,IAAI,CAAA,CACvB,SAGF,IAAMC,EAAWxC,YAAAA,CAAauC,CAAAA,CAAK,IAAA,CAAM,OAAO,EAChD,GAAI,CAAChD,EAAoBiD,CAAQ,CAAA,CAC/B,SAGFI,CAAAA,EAAAA,CAGA,IAAME,CAAAA,CAAelC,EAAAA,CAAY2B,EAAK,EAAE,CAAA,CACzBvD,CAAAA,CAAawD,CAAAA,CAAUM,CAAY,CAAA,GAEnCN,CAAAA,EACb,OAAA,CAAQ,GAAA,CACN,GAAGnB,CAAAA,CAAG,GAAA,CAAI,QAAG,CAAC,CAAA,CAAA,EAAIkB,EAAK,IAAI,CAAA,WAAA,EAAclB,CAAAA,CAAG,MAAA,CAAO,OAAO,CAAC,CAAA,CAC7D,CAAA,CACAwB,CAAAA,EAAAA,EAEA,QAAQ,GAAA,CACN,CAAA,EAAGxB,CAAAA,CAAG,KAAA,CAAM,QAAG,CAAC,CAAA,CAAA,EAAIkB,EAAK,IAAI,CAAA,WAAA,EAAclB,EAAG,KAAA,CAAM,SAAS,CAAC,CAAA,CAChE,EAEJ,CAEA,GAAIuB,IAAY,CAAA,CAAG,CACjB,QAAQ,GAAA,CAAIvB,CAAAA,CAAG,GAAA,CAAI,+BAA+B,CAAC,CAAA,CAEnD,MACF,CAEIwB,CAAAA,CAAQ,CAAA,EACV,QAAQ,GAAA,CACN;AAAA,EAAKxB,CAAAA,CAAG,OAAO,CAAA,EAAGwB,CAAK,qBAAqB,CAAC,CAAA,KAAA,EAAQxB,CAAAA,CAAG,IAAA,CAAK,CAAA,EAAGpD,CAAQ,kBAAkB,CAAC,CAAA,YAAA,CAC7F,EACA,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,EAEd,OAAA,CAAQ,GAAA,CAAIoD,CAAAA,CAAG,KAAA,CAAM;AAAA,2BAAA,CAA+B,CAAC,EAEzD,CCtYA,eAAsB0B,CAAAA,CAAWjB,EAAgC,CAC/D,IAAMkB,CAAAA,CAAWnD,OAAAA,CAAQiC,CAAQ,CAAA,CAEjC,GAAI,CAACpD,UAAAA,CAAWsE,CAAQ,CAAA,CACtB,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmBA,CAAQ,CAAA,CAAE,CAAA,CAI/C,GAAI,CAEF,IAAMC,CAAAA,CAAM,MAAM,OAAOD,CAAAA,CAAAA,CAGzB,GAAIC,CAAAA,CAAI,OAAA,EAAWC,EAASD,CAAAA,CAAI,OAAO,EACrC,OAAOA,CAAAA,CAAI,QAIb,GAAIA,CAAAA,CAAI,QAAUC,CAAAA,CAASD,CAAAA,CAAI,MAAM,CAAA,CACnC,OAAOA,CAAAA,CAAI,OAIb,IAAA,IAAWE,CAAAA,IAAO,OAAO,IAAA,CAAKF,CAAG,EAC/B,GAAIC,CAAAA,CAASD,CAAAA,CAAIE,CAAG,CAAC,CAAA,CACnB,OAAOF,CAAAA,CAAIE,CAAG,EAIlB,MAAM,IAAI,MACR,CAAA,6BAAA,EAAgC9B,CAAAA,CAAG,GAAA,CAAIS,CAAQ,CAAC;AAAA;;AAAA,EAAA,EAEzCT,CAAAA,CAAG,IAAA,CAAK,gBAAgB,CAAC,CAAA;AAAA,EAAA,EACzBA,CAAAA,CAAG,IAAA,CAAK,qBAAqB,CAAC,wCACvC,CACF,CAAA,MAAS+B,CAAAA,CAAK,CACZ,MAAIA,CAAAA,YAAe,KAAA,EAASA,CAAAA,CAAI,QAAQ,QAAA,CAAS,qBAAqB,CAAA,CAC9DA,CAAAA,CAGF,IAAI,KAAA,CACR,CAAA,eAAA,EAAkB/B,CAAAA,CAAG,IAAIS,CAAQ,CAAC,CAAA,EAAA,EAAKsB,CAAAA,YAAe,KAAA,CAAQA,CAAAA,CAAI,OAAA,CAAU,MAAA,CAAOA,CAAG,CAAC;;AAAA;AAAA,EAAA,EAEhF/B,EAAG,IAAA,CAAK,oBAAoB,CAAC,CAAA,CACtC,CACF,CACF,CAKA,SAAS6B,CAAAA,CAASG,CAAAA,CAAuB,CACvC,GAAI,OAAOA,GAAQ,QAAA,EAAYA,CAAAA,GAAQ,KACrC,OAAO,MAAA,CAGT,IAAMC,CAAAA,CAAMD,EAEZ,OACE,OAAOC,EAAI,OAAA,EAAY,UAAA,EACvB,OAAOA,CAAAA,CAAI,KAAA,EAAU,YACrB,OAAOA,CAAAA,CAAI,MAAS,UAAA,EACpB,OAAA,GAAWA,CAEf,CAmCA,eAAsBC,GACpBzB,CAAAA,CAC6B,CAC7B,IAAMkB,CAAAA,CAAWnD,QAAQiC,CAAQ,CAAA,CAEjC,GAAI,CAACpD,UAAAA,CAAWsE,CAAQ,CAAA,CACtB,MAAM,IAAI,KAAA,CAAM,mBAAmBA,CAAQ,CAAA,CAAE,EAG/C,IAAIC,CAAAA,CACJ,GAAI,CACFA,CAAAA,CAAO,MAAM,OAAOD,GACtB,CAAA,MAASI,CAAAA,CAAK,CACZ,MAAM,IAAI,MACR,CAAA,eAAA,EAAkB/B,CAAAA,CAAG,IAAIS,CAAQ,CAAC,KAAKsB,CAAAA,YAAe,KAAA,CAAQA,EAAI,OAAA,CAAU,MAAA,CAAOA,CAAG,CAAC;;AAAA;AAAA,EAAA,EAEhF/B,CAAAA,CAAG,IAAA,CAAK,oBAAoB,CAAC,CAAA,CACtC,CACF,CAEA,IAAMmC,CAAAA,CAAuC,CAC3C,CAAC,cAAA,CAAgBP,CAAAA,CAAI,YAAY,CAAA,CACjC,CAAC,eAAA,CAAiBA,CAAAA,CAAI,aAAa,CAAA,CACnC,CAAC,SAAA,CAAWA,CAAAA,CAAI,OAAO,CACzB,CAAA,CAEA,IAAA,GAAW,CAACQ,CAAAA,CAAMC,CAAS,CAAA,GAAKF,CAAAA,CAC9B,GAAI,OAAOE,CAAAA,EAAc,UAAA,CAIvB,OAAO,SAAY,CACjB,IAAMC,CAAAA,CAAS,MAAM,OAAA,CAAQ,OAAA,CAASD,CAAAA,EAA6B,CAAA,CACnE,GAAI,CAACR,CAAAA,CAASS,CAAM,CAAA,CAClB,MAAM,IAAI,KAAA,CACR,CAAA,SAAA,EAAYF,CAAI,CAAA,OAAA,EAAUpC,CAAAA,CAAG,GAAA,CAAIS,CAAQ,CAAC,CAAA;AAAA,qGAAA,CAE5C,CAAA,CAEF,OAAO6B,CACT,CAAA,CAaJ,MAJET,CAAAA,CAASD,CAAAA,CAAI,OAAO,CAAA,EACpBC,CAAAA,CAASD,CAAAA,CAAI,MAAM,CAAA,EACnB,OAAO,MAAA,CAAOA,CAAG,CAAA,CAAE,IAAA,CAAKC,CAAQ,CAAA,CAG1B,IAAI,KAAA,CACR,CAAA,oCAAA,EAAuC7B,CAAAA,CAAG,GAAA,CAAIS,CAAQ,CAAC,CAAA;AAAA;AAAA,wDAAA,EAEMT,CAAAA,CAAG,IAAA,CAAK,kBAAkB,CAAC,CAAA;;AAAA;;AAAA,EAAA,EAEjFA,CAAAA,CAAG,IAAA,CAAK,gCAAgC,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA,GAAA,CAKlD,EAGI,IAAI,KAAA,CACR,8BAA8BA,CAAAA,CAAG,GAAA,CAAIS,CAAQ,CAAC;AAAA;;AAAA,EAAA,EAEvCT,CAAAA,CAAG,IAAA,CAAK,gCAAgC,CAAC,CAAA;AAAA,EAAA,EACzCA,CAAAA,CAAG,IAAA,CAAK,4BAA4B,CAAC,CAAA;AAAA,EAAA,EACrCA,CAAAA,CAAG,IAAA,CAAK,gBAAgB,CAAC,CAAA;;AAAA;AAAA,gBAAA,EAEXA,CAAAA,CAAG,IAAA,CAAK,aAAa,CAAC,CAAA,mBAAA,CAC7C,CACF,CCrKA,eAAsBuC,CAAAA,CACpBC,CAAAA,CAAU,KAAA,CACe,CACzB,GAAI,CACF,OAAQ,MAAM,OAAO,yBAAyB,CAChD,CAAA,MAAST,CAAAA,CAAK,CACZ,OAAA,CAAQ,KAAA,CACN/B,CAAAA,CAAG,GAAA,CACD,CAAA;AAAA,iEAAA,CACF,CACF,CAAA,CACIwC,CAAAA,EAAS,OAAA,CAAQ,KAAA,CAAMxC,EAAG,GAAA,CAAK+B,CAAAA,CAAc,OAAO,CAAC,EACzD,OAAA,CAAQ,IAAA,CAAK,CAAC,EAChB,CACF,CCyBA,SAASrC,EAAAA,CAAUC,CAAAA,CAGjB,CACA,IAAMC,CAAAA,CAAyB,CAC7B,IAAA,CAAM,MACN,kBAAA,CAAoB,KAAA,CACpB,OAAA,CAAS,KACX,EACI6C,CAAAA,CAAW,EAAA,CAEf,IAAA,IAAS5C,CAAAA,CAAI,EAAGA,CAAAA,CAAIF,CAAAA,CAAK,MAAA,CAAQE,CAAAA,EAAAA,CAAK,CACpC,IAAM6C,CAAAA,CAAM/C,CAAAA,CAAKE,CAAC,EAClB,OAAQ6C,CAAAA,EACN,KAAK,WACL,KAAK,IAAA,CAAM,CACT,IAAM5C,EAAMH,CAAAA,CAAK,EAAEE,CAAC,CAAA,CAChBC,IAAKF,CAAAA,CAAK,UAAA,CAAaE,CAAAA,CAAAA,CAC3B,KACF,CACA,KAAK,UAAA,CACL,KAAK,IAAA,CAAM,CACT,IAAMA,CAAAA,CAAMH,CAAAA,CAAK,EAAEE,CAAC,CAAA,CAChBC,CAAAA,GAAKF,CAAAA,CAAK,UAAA,CAAaE,GAC3B,KACF,CACA,KAAK,cAAA,CAAgB,CACnB,IAAMA,CAAAA,CAAMH,CAAAA,CAAK,EAAEE,CAAC,CAAA,CACd8C,CAAAA,CAAI7C,CAAAA,CAAM,MAAA,CAAO,SAASA,CAAAA,CAAK,EAAE,CAAA,CAAI,MAAA,CAAO,IAC9C,MAAA,CAAO,QAAA,CAAS6C,CAAC,CAAA,EAAKA,EAAI,CAAA,GAAG/C,CAAAA,CAAK,SAAA,CAAY+C,CAAAA,CAAAA,CAClD,KACF,CACA,KAAK,wBAAA,CACH/C,CAAAA,CAAK,mBAAqB,IAAA,CAC1B,MACF,KAAK,QAAA,CACHA,EAAK,IAAA,CAAO,IAAA,CACZ,MACF,KAAK,YACL,KAAK,IAAA,CACHA,CAAAA,CAAK,OAAA,CAAU,KACf,MACF,QACM8C,CAAAA,EAAO,CAACA,EAAI,UAAA,CAAW,GAAG,CAAA,EAAK,CAACD,IAClCA,CAAAA,CAAWC,CAAAA,EAEjB,CACF,CAEA,OAAO,CAAE,QAAA,CAAAD,CAAAA,CAAU,IAAA,CAAA7C,CAAK,CAC1B,CAEA,SAASgD,EAAAA,EAAmB,CAC1B,QAAQ,KAAA,CAAM;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA,CAmCf,EACD,CAYA,SAASC,EAAAA,CAAiBC,CAAAA,CAA4C,CACpE,IAAIC,CAAAA,CACJ,GAAI,CAGFA,CAAAA,CAAK,IAAI,QAAA,CAAS,OAAA,CAAS,QAAA,CAAU,CAAA,sBAAA,EAAyBD,CAAI,CAAA,EAAA,CAAI,EAIxE,CAAA,MAASf,CAAAA,CAAK,CACZ,MAAM,IAAI,KAAA,CACR,CAAA,uCAAA,EAA2CA,CAAAA,CAAc,OAAO;AAAA,cAAA,EAAmBe,CAAI,CAAA,CACzF,CACF,CACA,OAAQE,GAAoB,CAC1B,IAAMC,CAAAA,CAASD,CAAAA,EAAgC,MAE/C,OAAO,CAAA,CADQD,CAAAA,CAAGE,CAAAA,CAAOD,CAAM,CAEjC,CACF,CAEA,eAAsBE,GAAcvD,CAAAA,CAA+B,CAAA,CAC7DA,CAAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,EAAKA,CAAAA,CAAK,QAAA,CAAS,IAAI,GAAKA,CAAAA,CAAK,MAAA,GAAW,CAAA,IACpEiD,EAAAA,GACA,OAAA,CAAQ,IAAA,CAAKjD,CAAAA,CAAK,MAAA,GAAW,EAAI,CAAA,CAAI,CAAC,CAAA,CAAA,CAGxC,GAAM,CAAE,QAAA,CAAA8C,CAAAA,CAAU,IAAA,CAAA7C,CAAK,EAAIF,EAAAA,CAAUC,CAAI,CAAA,CAEpC8C,CAAAA,GACH,QAAQ,KAAA,CAAMzC,CAAAA,CAAG,GAAA,CAAI,yCAAyC,CAAC,CAAA,CAC/D4C,EAAAA,EAAW,CACX,OAAA,CAAQ,KAAK,CAAC,CAAA,CAAA,CAEXhD,CAAAA,CAAK,UAAA,GACR,QAAQ,KAAA,CACNI,CAAAA,CAAG,IAAI,oCAAoC,CAAA,CAC3CA,EAAG,GAAA,CACD;AAAA,0EAAA,CACF,CACF,CAAA,CACA4C,EAAAA,EAAW,CACX,OAAA,CAAQ,KAAK,CAAC,CAAA,CAAA,CAEXhD,CAAAA,CAAK,UAAA,GACR,QAAQ,KAAA,CACNI,CAAAA,CAAG,IAAI,0CAA0C,CAAA,CACjDA,EAAG,GAAA,CACD;AAAA,+DAAA,CACF,CACF,CAAA,CACA4C,EAAAA,EAAW,CACX,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,CAAA,CAIhB,IAAMO,CAAAA,CAAe3E,OAAAA,CAAQiE,CAAQ,CAAA,CAChCpF,UAAAA,CAAW8F,CAAY,CAAA,GAC1B,OAAA,CAAQ,KAAA,CAAMnD,CAAAA,CAAG,GAAA,CAAI,CAAA,gCAAA,EAAmCmD,CAAY,CAAA,CAAE,CAAC,CAAA,CACvE,OAAA,CAAQ,IAAA,CAAK,CAAC,GAGhB,IAAIC,CAAAA,CACJ,GAAI,CACFA,CAAAA,CAAMzE,YAAAA,CAAawE,CAAAA,CAAc,MAAM,EACzC,CAAA,MAASpB,CAAAA,CAAK,CACZ,OAAA,CAAQ,KAAA,CACN/B,CAAAA,CAAG,GAAA,CACD,CAAA,sBAAA,EAAyBmD,CAAY,CAAA,EAAA,EAAMpB,CAAAA,CAAc,OAAO,CAAA,CAClE,CACF,CAAA,CACA,OAAA,CAAQ,IAAA,CAAK,CAAC,EAChB,CAEA,IAAIsB,CAAAA,CACJ,GAAI,CACFA,CAAAA,CAAS,IAAA,CAAK,KAAA,CAAMD,CAAG,EACzB,CAAA,MAASrB,CAAAA,CAAK,CACZ,OAAA,CAAQ,KAAA,CACN/B,CAAAA,CAAG,GAAA,CACD,CAAA,OAAA,EAAUmD,CAAY,CAAA,oBAAA,EAAwBpB,CAAAA,CAAc,OAAO,CAAA,CACrE,CACF,CAAA,CACA,OAAA,CAAQ,IAAA,CAAK,CAAC,EAChB,CAMA,GAAM,CAAE,mBAAA,CAAAuB,CAAAA,CAAqB,cAAA,CAAAC,CAAe,CAAA,CAAI,MAAMhB,CAAAA,CACpD3C,CAAAA,CAAK,OACP,CAAA,CAGI4D,CAAAA,CACJ,GAAI,CACFA,CAAAA,CAAWF,CAAAA,CAAoBD,CAAM,EACvC,CAAA,MAAStB,CAAAA,CAAK,CACZ,OAAA,CAAQ,KAAA,CACN/B,EAAG,GAAA,CACD,CAAA,wCAAA,EAA4C+B,CAAAA,CAAc,OAAO,CAAA,CACnE,CACF,CAAA,CACA,OAAA,CAAQ,IAAA,CAAK,CAAC,EAChB,CAIA,IAAI0B,CAAAA,CACJ,GAAI,CACFA,EAAYZ,EAAAA,CAAiBjD,CAAAA,CAAK,UAAU,EAC9C,CAAA,MAASmC,CAAAA,CAAK,CACZ,OAAA,CAAQ,KAAA,CAAM/B,CAAAA,CAAG,GAAA,CAAI,CAAA,OAAA,EAAW+B,CAAAA,CAAc,OAAO,CAAA,CAAE,CAAC,CAAA,CACxD,OAAA,CAAQ,IAAA,CAAK,CAAC,EAChB,CAGA,IAAI2B,CAAAA,CACJ,GAAI,CACFA,CAAAA,CAAU,MAAMxB,EAAAA,CAAkBtC,CAAAA,CAAK,UAAU,EACnD,OAASmC,CAAAA,CAAK,CACZ,OAAA,CAAQ,KAAA,CACN/B,CAAAA,CAAG,GAAA,CAAI,CAAA,sCAAA,EAA0C+B,CAAAA,CAAc,OAAO,CAAA,CAAE,CAC1E,CAAA,CACA,OAAA,CAAQ,IAAA,CAAK,CAAC,EAChB,CAEInC,CAAAA,CAAK,OAAA,EACP,OAAA,CAAQ,KAAA,CACNI,CAAAA,CAAG,GAAA,CACD,CAAA,UAAA,EAAawD,CAAAA,CAAS,MAAA,CAAO,MAAM,CAAA,wBAAA,EAA2B5D,CAAAA,CAAK,UAAU,CAAA,CAC/E,CACF,EAQF,IAAM0C,CAAAA,CAAS,MAAMiB,CAAAA,CACnBC,CAAAA,CACAE,CAAAA,CAGAD,CAAAA,CACA,CACE,SAAA,CAAW7D,CAAAA,CAAK,SAAA,CAChB,gBAAA,CAAkB,CAACA,CAAAA,CAAK,kBAC1B,CACF,CAAA,CAEA,GAAIA,CAAAA,CAAK,IAAA,CAAM,CASb,IAAM+D,CAAAA,CAAO,CACX,sBAAA,CAAwBrB,CAAAA,CAAO,sBAAA,EAA0B,IAAA,CACzD,UAAA,CAAYA,CAAAA,CAAO,UAAA,CACnB,cAAA,CAAgBA,EAAO,cAAA,CACvB,kBAAA,CAAoBA,CAAAA,CAAO,kBAAA,CAC3B,gBAAA,CAAkBA,CAAAA,CAAO,gBAC3B,CAAA,CACA,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,SAAA,CAAUqB,CAAAA,CAAM,IAAA,CAAM,CAAC,CAAC,EACzC,OAAA,CAAQ,IAAA,CAAK,CAAC,EAChB,CAGIrB,CAAAA,CAAO,gBAAA,GACT,OAAA,CAAQ,KAAA,CAAMtC,CAAAA,CAAG,GAAA,CAAI,sDAAiD,CAAC,CAAA,CACvE,OAAA,CAAQ,KAAA,CACNA,EAAG,GAAA,CACD,CAAA;AAAA;AAAA;AAAA,oEAAA,CAIF,CACF,CAAA,CACA,OAAA,CAAQ,KAAK,CAAC,CAAA,CAAA,CAEZsC,EAAO,cAAA,GACT,OAAA,CAAQ,KAAA,CACNtC,CAAAA,CAAG,OACD,oEACF,CACF,EACA,OAAA,CAAQ,KAAA,CACNA,EAAG,GAAA,CACD,CAAA;AAAA;AAAA,gCAAA,CAGF,CACF,CAAA,CACA,OAAA,CAAQ,KAAK,CAAC,CAAA,CAAA,CAEZsC,EAAO,kBAAA,GACT,OAAA,CAAQ,KAAA,CACNtC,CAAAA,CAAG,OACD,iFACF,CACF,EACA,OAAA,CAAQ,KAAA,CACNA,EAAG,GAAA,CACD,CAAA;AAAA;AAAA,8BAAA,CAGF,CACF,CAAA,CACA,OAAA,CAAQ,IAAA,CAAK,CAAC,GAIhB,IAAM4D,CAAAA,CAAMtB,CAAAA,CAAO,sBAAA,EAA0B,GACvCuB,CAAAA,CAAQvB,CAAAA,CAAO,iBAAA,CACfwB,CAAAA,CAAYD,GAAO,KAAA,CAAM,IAAA,EAAQ,WAAA,CACvC,OAAA,CAAQ,IACN,CAAA,EAAG7D,CAAAA,CAAG,KAAA,CAAM,QAAG,CAAC,CAAA,kBAAA,EAAqBA,CAAAA,CAAG,IAAA,CAAK,CAAA,wBAAA,EAA2B4D,CAAG,CAAA,CAAE,CAAC,CAAA,CAAA,EAAI5D,CAAAA,CAAG,IAAI,CAAA,CAAA,EAAI8D,CAAS,CAAA,CAAA,CAAG,CAAC,EAC5G,CAAA,CACA,OAAA,CAAQ,GAAA,CACN9D,CAAAA,CAAG,IACD,CAAA,qBAAA,EAAmBsC,CAAAA,CAAO,UAAU,CAAA,oBAAA,EAAuBkB,EAAS,MAAA,CAAO,MAAM,CAAA,CACnF,CACF,EACI5D,CAAAA,CAAK,OAAA,EAAWiE,CAAAA,GAClB,OAAA,CAAQ,IAAI7D,CAAAA,CAAG,GAAA,CAAI,iBAAY,CAAC,EAChC,OAAA,CAAQ,GAAA,CACNA,CAAAA,CAAG,GAAA,CACD,OAAO,IAAA,CAAK,SAAA,CAAU6D,EAAO,IAAA,CAAM,CAAC,EAAE,KAAA,CAAM;AAAA,CAAI,EAAE,IAAA,CAAK;AAAA,IAAA,CAAQ,CAAC,CAAA,CAClE,CACF,GAUF,OAAA,CAAQ,IAAA,CAAK,CAAC,EAChB,CCrZA,SAASnE,EAAAA,CAAUC,CAAAA,CAA+B,CAChD,IAAMC,CAAAA,CAAsB,CAAE,GAAA,CAAK,OAAA,CAAQ,KAAM,CAAA,CAEjD,QAASC,CAAAA,CAAI,CAAA,CAAGA,EAAIF,CAAAA,CAAK,MAAA,CAAQE,IAC/B,GAAIF,CAAAA,CAAKE,CAAC,CAAA,GAAM,OAAA,CAAS,CACvB,IAAMC,CAAAA,CAAMH,EAAK,EAAEE,CAAC,EAChBC,CAAAA,GACFF,CAAAA,CAAK,IAAME,CAAAA,EAEf,CAGF,OAAOF,CACT,CAaA,SAASmE,EAAAA,CAAmBxF,CAAAA,CAA0B,CACpD,IAAMG,CAAAA,CAAUpB,KAAKiB,CAAAA,CAAK,cAAc,EACxC,GAAI,CAAClB,WAAWqB,CAAO,CAAA,CACrB,OAAO,CACL,KAAA,CAAO,gCACP,MAAA,CAAQ,KAAA,CACR,QAAS,uBAAA,CACT,GAAA,CAAK,yCACP,CAAA,CAGF,IAAMsF,EAAM,IAAA,CAAK,KAAA,CAAMrF,aAAaD,CAAAA,CAAS,OAAO,CAAC,CAAA,CAC/CuF,CAAAA,CAAO,CAAE,GAAGD,CAAAA,CAAI,aAAc,GAAGA,CAAAA,CAAI,eAAgB,CAAA,CAE3D,OAAKC,EAAK,qBAAqB,CAAA,CASxB,CACL,KAAA,CAAO,+BAAA,CACP,OAAQ,IAAA,CACR,OAAA,CAAS,IAAIA,CAAAA,CAAK,qBAAqB,CAAC,CAAA,CAC1C,CAAA,CAZS,CACL,KAAA,CAAO,+BAAA,CACP,OAAQ,KAAA,CACR,OAAA,CAAS,4BACT,GAAA,CAAK,uCACP,CAQJ,CAEA,SAASC,GAA0B3F,CAAAA,CAA0B,CAC3D,IAAMG,CAAAA,CAAUpB,IAAAA,CAAKiB,EAAK,cAAc,CAAA,CACxC,GAAI,CAAClB,UAAAA,CAAWqB,CAAO,CAAA,CACrB,OAAO,CACL,KAAA,CAAO,+BAAA,CACP,OAAQ,IAAA,CACR,OAAA,CAAS,2BACX,CAAA,CAGF,IAAMsF,EAAM,IAAA,CAAK,KAAA,CAAMrF,aAAaD,CAAAA,CAAS,OAAO,CAAC,CAAA,CAC/CuF,CAAAA,CAAO,CAAE,GAAGD,CAAAA,CAAI,aAAc,GAAGA,CAAAA,CAAI,eAAgB,CAAA,CAErDG,CAAAA,CAAoB,OAAO,IAAA,CAAKF,CAAI,EAAE,MAAA,CAAQG,CAAAA,EAClDA,EAAE,UAAA,CAAW,iBAAiB,CAChC,CAAA,CAEA,OAAID,CAAAA,CAAkB,MAAA,EAAU,EACvB,CACL,KAAA,CAAO,gCACP,MAAA,CAAQ,IAAA,CACR,QACEA,CAAAA,CAAkB,MAAA,GAAW,EAAI,mBAAA,CAAsB,gBAC3D,EAGK,CACL,KAAA,CAAO,gCACP,MAAA,CAAQ,IAAA,CACR,QAAS,CAAA,EAAGA,CAAAA,CAAkB,MAAM,CAAA,WAAA,EAAcA,CAAAA,CAAkB,KAAK,IAAI,CAAC,EAChF,CACF,CAEA,SAASE,EAAAA,CAAgB9F,CAAAA,CAA0B,CACjD,IAAM+F,CAAAA,CAAehH,KAAKiB,CAAAA,CAAK,eAAe,EAE9C,GAAI,CAAClB,WAAWiH,CAAY,CAAA,CAC1B,OAAO,CACL,KAAA,CAAO,2BACP,MAAA,CAAQ,KAAA,CACR,QAAS,wBAAA,CACT,GAAA,CAAK,uDACP,CAAA,CAGF,GAAI,CAIF,IAAMC,CAAAA,CAFM5F,aAAa2F,CAAAA,CAAc,OAAO,EAG3C,OAAA,CAAQ,WAAA,CAAa,EAAE,CAAA,CACvB,OAAA,CAAQ,oBAAqB,EAAE,CAAA,CAE5BE,EADS,IAAA,CAAK,KAAA,CAAMD,CAAQ,CAAA,CAChB,eAAA,EAAmB,EAAC,CAEhCE,CAAAA,CAAmB,EAAC,CAe1B,OAbID,EAAG,MAAA,GAAW,CAAA,CAAA,EAChBC,EAAO,IAAA,CAAK,yBAAyB,EAIrCD,CAAAA,CAAG,gBAAA,EACH,CAAC,CAAC,SAAA,CAAW,WAAY,QAAQ,CAAA,CAAE,SACjCA,CAAAA,CAAG,gBAAA,CAAiB,aACtB,CAAA,EAEAC,EAAO,IAAA,CAAK,CAAA,qBAAA,EAAwBD,EAAG,gBAAgB,CAAA,CAAA,CAAG,EAGxDC,CAAAA,CAAO,MAAA,CAAS,EACX,CACL,KAAA,CAAO,2BACP,MAAA,CAAQ,CAAA,CAAA,CACR,QAASA,CAAAA,CAAO,IAAA,CAAK,IAAI,CAAA,CACzB,GAAA,CAAK,uEACP,CAAA,CAGK,CACL,MAAO,0BAAA,CACP,MAAA,CAAQ,GACR,OAAA,CAAS,wCACX,CACF,CAAA,KAAQ,CACN,OAAO,CACL,KAAA,CAAO,2BACP,MAAA,CAAQ,IAAA,CACR,QAAS,6CACX,CACF,CACF,CAEA,SAASC,GAAwBnG,CAAAA,CAA0B,CACzD,IAAMoG,CAAAA,CAAcrH,IAAAA,CAAKiB,EAAK,cAAc,CAAA,CAE5C,GAAI,CAAClB,UAAAA,CAAWsH,CAAW,CAAA,CACzB,OAAO,CACL,KAAA,CAAO,kCAAA,CACP,OAAQ,IAAA,CACR,OAAA,CAAS,uBACX,CAAA,CAGF,IAAMC,EAAuB,EAAC,CAG9B,GAAI,CACF,IAAMC,EAAWvH,IAAAA,CAAKqH,CAAAA,CAAa,gBAAgB,CAAA,CACnD,GAAItH,WAAWwH,CAAQ,CAAA,CAAG,CACxB,IAAMC,EAAWC,WAAAA,CAAYF,CAAQ,EACrC,IAAA,IAAWb,CAAAA,IAAOc,EAAU,CAC1B,IAAME,EAAa1H,IAAAA,CACjBuH,CAAAA,CACAb,EACA,cAAA,CACA,gBAAA,CACA,MACF,CAAA,CACI3G,UAAAA,CAAW2H,CAAU,CAAA,EACvBJ,CAAAA,CAAW,KACT,CAAA,eAAA,EAAkBZ,CAAG,mCACvB,EAEJ,CACF,CACF,CAAA,KAAQ,CAER,CAEA,OAAIY,CAAAA,CAAW,OAAS,CAAA,CACf,CACL,MAAO,kCAAA,CACP,MAAA,CAAQ,MACR,OAAA,CAAS,CAAA,MAAA,EAASA,EAAW,MAAM,CAAA,eAAA,EAAkBA,EAAW,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAC1E,GAAA,CAAK,kDACP,CAAA,CAGK,CACL,MAAO,kCAAA,CACP,MAAA,CAAQ,KACR,OAAA,CAAS,wBACX,CACF,CAEA,SAASK,GAAsB1G,CAAAA,CAA0B,CACvD,IAAMyC,CAAAA,CAAY,CAChB,eACA,mBAAA,CACA,iCAAA,CACA,iBACA,aACF,CAAA,CAEMkE,EAAkB,EAAC,CAEzB,QAAWhE,CAAAA,IAAQF,CAAAA,CAAW,CAC5B,IAAMP,CAAAA,CAAWnD,KAAKiB,CAAAA,CAAK2C,CAAI,EAC/B,GAAI7D,UAAAA,CAAWoD,CAAQ,CAAA,CAAG,CACxB,IAAMtC,CAAAA,CAAUQ,YAAAA,CAAa8B,EAAU,OAAO,CAAA,CAC1CvC,EAAoBC,CAAO,CAAA,EAC7B+G,EAAM,IAAA,CAAKhE,CAAI,EAEnB,CACF,CAEA,OAAIgE,CAAAA,CAAM,MAAA,GAAW,EACZ,CACL,KAAA,CAAO,kBACP,MAAA,CAAQ,IAAA,CACR,QAAS,0BACX,CAAA,CAGK,CACL,KAAA,CAAO,iBAAA,CACP,OAAQ,IAAA,CACR,OAAA,CAAS,kBAAkBA,CAAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA,CAC7C,CACF,CAMA,eAAsBC,GAAcxF,CAAAA,CAAgB,CAClD,IAAMC,CAAAA,CAAOF,EAAAA,CAAUC,CAAI,CAAA,CAE3B,OAAA,CAAQ,KAAI,CACZ,OAAA,CAAQ,IAAIK,CAAAA,CAAG,IAAA,CAAKA,EAAG,IAAA,CAAK,kBAAkB,CAAC,CAAC,CAAA,CAChD,QAAQ,GAAA,CAAIA,CAAAA,CAAG,IAAI,QAAA,CAAI,MAAA,CAAO,EAAE,CAAC,CAAC,EAClC,OAAA,CAAQ,GAAA,GAER,IAAMoF,CAAAA,CAAS,CACbrB,EAAAA,CAAmBnE,CAAAA,CAAK,GAAG,CAAA,CAC3BsE,EAAAA,CAA0BtE,EAAK,GAAG,CAAA,CAClCyE,GAAgBzE,CAAAA,CAAK,GAAG,EACxB8E,EAAAA,CAAwB9E,CAAAA,CAAK,GAAG,CAAA,CAChCqF,EAAAA,CAAsBrF,EAAK,GAAG,CAChC,EAEIyF,CAAAA,CAAW,CAAA,CAEf,QAAWC,CAAAA,IAASF,CAAAA,CAAQ,CAC1B,IAAMG,CAAAA,CAAOD,EAAM,MAAA,CAAStF,CAAAA,CAAG,MAAM,QAAG,CAAA,CAAIA,EAAG,GAAA,CAAI,QAAG,EACtD,OAAA,CAAQ,GAAA,CAAI,GAAGuF,CAAI,CAAA,CAAA,EAAIvF,EAAG,IAAA,CAAKsF,CAAAA,CAAM,KAAK,CAAC,CAAA,CAAE,EAC7C,OAAA,CAAQ,GAAA,CAAI,KAAKtF,CAAAA,CAAG,GAAA,CAAIsF,EAAM,OAAO,CAAC,EAAE,CAAA,CAEpC,CAACA,EAAM,MAAA,EAAUA,CAAAA,CAAM,MACzB,OAAA,CAAQ,GAAA,CAAI,KAAKtF,CAAAA,CAAG,MAAA,CAAO,MAAM,CAAC,CAAA,CAAA,EAAIsF,EAAM,GAAG,CAAA,CAAE,EACjDD,CAAAA,EAAAA,CAAAA,CAGF,OAAA,CAAQ,MACV,CAEIA,EAAW,CAAA,EACb,OAAA,CAAQ,IACNrF,CAAAA,CAAG,MAAA,CAAO,GAAGqF,CAAQ,CAAA,2CAAA,CAA6C,CACpE,CAAA,CACA,OAAA,CAAQ,KAAK,CAAC,CAAA,EAEd,QAAQ,GAAA,CAAIrF,CAAAA,CAAG,MAAM,oBAAoB,CAAC,EAE9C,CCzRA,IAAMwF,EAAAA,CAAuC,CAC3C,kBAAmB,CAAC,SAAA,CAAW,eAAgB,WAAW,CAAA,CAC1D,gBAAiB,CACf,cAAA,CACA,iBACA,sBAAA,CACA,kBAAA,CACA,gBACA,cAAA,CACA,oBAAA,CACA,aACA,aACF,CAAA,CACA,aAAc,CACZ,kBAAA,CACA,cACA,YAAA,CACA,eAAA,CACA,gBACA,cAAA,CACA,UAAA,CACA,YACA,QACF,CAAA,CACA,MAAO,CAAC,UAAA,CAAY,SAAU,YAAA,CAAc,YAAY,EACxD,EAAA,CAAI,CACF,kBACA,eAAA,CACA,eAAA,CACA,iBACA,kBAAA,CACA,aAAA,CACA,kBACA,cACF,CACF,EAEA,SAASC,EAAAA,CAAYrD,EAAsB,CACzC,IAAA,GAAW,CAACsD,CAAAA,CAAKC,CAAK,IAAK,MAAA,CAAO,OAAA,CAAQH,EAAU,CAAA,CAClD,GAAIG,EAAM,QAAA,CAASvD,CAAI,EACrB,OAAOsD,CAAAA,CAIX,OAAO,OACT,CAEA,SAASE,EAAAA,CAAezH,CAAAA,CAAyB,CAE/C,IAAM0H,CAAAA,CAAQ1H,EAAQ,KAAA,CAAM;AAAA,CAAI,CAAA,CAEhC,IAAA,IAAW2H,CAAAA,IAAQD,CAAAA,CAAO,CACxB,IAAME,CAAAA,CAAUD,CAAAA,CAAK,IAAA,EAAK,CAS1B,GANIC,CAAAA,CAAQ,UAAA,CAAW,aAAa,CAAA,EAGhCA,CAAAA,CAAQ,UAAA,CAAW,YAAY,CAAA,EAG/BA,CAAAA,CAAQ,UAAA,CAAW,cAAc,EACnC,SAIF,IAAMC,CAAAA,CAAaD,CAAAA,CAAQ,KAAA,CAAM,0BAA0B,CAAA,CAC3D,GAAIC,IAAa,CAAC,CAAA,EAAK,CAACA,CAAAA,CAAW,CAAC,CAAA,CAAE,UAAA,CAAW,GAAG,EAClD,OAAOA,CAAAA,CAAW,CAAC,CAAA,CAIrB,GAAID,CAAAA,CAAQ,UAAA,CAAW,IAAI,GAAKA,CAAAA,CAAQ,MAAA,CAAS,CAAA,CAC/C,OAAOA,CAAAA,CAAQ,KAAA,CAAM,CAAC,CAAA,CAAE,MAAK,CAI/B,GACEA,CAAAA,GAAY,EAAA,EACZ,CAACA,CAAAA,CAAQ,UAAA,CAAW,IAAI,GACxB,CAACA,CAAAA,CAAQ,UAAA,CAAW,IAAI,CAAA,EACxB,CAACA,CAAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,CAEvB,KAEJ,CAEA,OAAO,EACT,CAMA,eAAsBE,EAAAA,CAAoBtG,EAAgB,CACxD,IAAIuG,CAAAA,CAEJ,IAAA,IAAS,CAAA,CAAI,CAAA,CAAG,CAAA,CAAIvG,CAAAA,CAAK,OAAQ,CAAA,EAAA,CAC3BA,CAAAA,CAAK,CAAC,CAAA,GAAM,UAAA,GACduG,CAAAA,CAASvG,CAAAA,CAAK,EAAE,CAAC,CAAA,EAAG,WAAA,EAAY,CAAA,CAIpC,IAAMwG,CAAAA,CAAWC,cAAAA,EAAe,CAEhC,OAAA,CAAQ,KAAI,CACZ,OAAA,CAAQ,GAAA,CAAIpG,CAAAA,CAAG,IAAA,CAAKA,CAAAA,CAAG,IAAA,CAAK,oBAAoB,CAAC,CAAC,CAAA,CAClD,OAAA,CAAQ,GAAA,CAAIA,CAAAA,CAAG,GAAA,CAAI,QAAA,CAAI,MAAA,CAAO,EAAE,CAAC,CAAC,CAAA,CAClC,OAAA,CAAQ,GAAA,EAAI,CAGZ,IAAMqG,CAAAA,CAAa,IAAI,GAAA,CAEvB,IAAA,GAAW,CAACjE,CAAAA,CAAMjE,CAAO,CAAA,GAAKgI,CAAAA,CAAU,CACtC,IAAMT,CAAAA,CAAMD,EAAAA,CAAYrD,CAAI,CAAA,CAG1B8D,CAAAA,EACA,CAACR,CAAAA,CAAI,WAAA,GAAc,QAAA,CAASQ,CAAM,CAAA,EAClC,CAAC9D,CAAAA,CAAK,QAAA,CAAS8D,CAAM,CAAA,GAKlBG,EAAW,GAAA,CAAIX,CAAG,CAAA,EACrBW,CAAAA,CAAW,GAAA,CAAIX,CAAAA,CAAK,EAAE,EAExBW,CAAAA,CAAW,GAAA,CAAIX,CAAG,CAAA,CAAG,IAAA,CAAK,CAAE,IAAA,CAAAtD,CAAAA,CAAM,KAAMwD,EAAAA,CAAezH,CAAO,CAAE,CAAC,CAAA,EACnE,CAEA,GAAIkI,CAAAA,CAAW,OAAS,CAAA,CAAG,CACzB,OAAA,CAAQ,GAAA,CAAIrG,CAAAA,CAAG,GAAA,CAAI,+BAA+B,CAAC,EAEnD,MACF,CAGA,IAAMsG,CAAAA,CAAgB,MAAA,CAAO,IAAA,CAAKd,EAAU,CAAA,CACtCe,EAAmB,CAAC,GAAGF,CAAAA,CAAW,IAAA,EAAM,CAAA,CAAE,IAAA,CAC9C,CAACG,EAAGC,CAAAA,GAAAA,CACDH,CAAAA,CAAc,OAAA,CAAQE,CAAC,CAAA,EAAK,EAAA,GAAOF,CAAAA,CAAc,OAAA,CAAQG,CAAC,CAAA,EAAK,EAAA,CACpE,CAAA,CAEA,IAAA,IAAWf,CAAAA,IAAOa,CAAAA,CAAkB,CAClC,IAAMG,EAAQL,CAAAA,CAAW,GAAA,CAAIX,CAAG,CAAA,CAChC,OAAA,CAAQ,GAAA,CAAI1F,CAAAA,CAAG,IAAA,CAAK0F,CAAG,CAAC,CAAA,CAExB,IAAA,IAAWiB,CAAAA,IAAQD,CAAAA,CAAO,CACxB,IAAME,CAAAA,CAAOD,EAAK,IAAA,CAAO3G,CAAAA,CAAG,GAAA,CAAI,CAAA,QAAA,EAAM2G,CAAAA,CAAK,IAAI,CAAA,CAAE,CAAA,CAAI,GACrD,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAA,EAAK3G,CAAAA,CAAG,IAAA,CAAK2G,CAAAA,CAAK,IAAI,CAAC,GAAGC,CAAI,CAAA,CAAE,EAC9C,CAEA,QAAQ,GAAA,GACV,CAEA,OAAA,CAAQ,IACN5G,CAAAA,CAAG,GAAA,CACD,CAAA,EAAGmG,CAAAA,CAAS,IAAI,CAAA,yBAAA,EAA4BnG,CAAAA,CAAG,IAAA,CAAK,gCAAgC,CAAC,CAAA,gBAAA,CACvF,CACF,EACF,CAMA,eAAsB6G,EAAAA,CAAoBzE,CAAAA,CAAczC,EAAgB,CACtE,IAAImH,CAAAA,CAAO,OAAA,CAAQ,GAAA,EAAI,CAEvB,IAAA,IAASjH,CAAAA,CAAI,EAAGA,CAAAA,CAAIF,CAAAA,CAAK,MAAA,CAAQE,CAAAA,EAAAA,CAC/B,GAAIF,CAAAA,CAAKE,CAAC,CAAA,GAAM,SAAU,CACxB,IAAMC,CAAAA,CAAMH,CAAAA,CAAK,EAAEE,CAAC,CAAA,CAChBC,CAAAA,GACFgH,EAAOhH,CAAAA,EAEX,CAGGsC,CAAAA,GACH,OAAA,CAAQ,KAAA,CAAM,sDAAsD,CAAA,CACpE,OAAA,CAAQ,KAAK,CAAC,CAAA,CAAA,CAGhB,IAAMjE,CAAAA,CAAU4I,UAAAA,CAAW3E,CAAI,CAAA,CAE1BjE,CAAAA,GACH,QAAQ,KAAA,CAAM,CAAA,SAAA,EAAYiE,CAAI,CAAA,YAAA,CAAc,CAAA,CAC5C,OAAA,CAAQ,KAAA,CACN,CAAA,IAAA,EAAOpC,EAAG,IAAA,CAAK,yBAAyB,CAAC,CAAA,2BAAA,CAC3C,CAAA,CACA,OAAA,CAAQ,IAAA,CAAK,CAAC,GAIhB,IAAMgH,CAAAA,CAAY7I,CAAAA,CACf,OAAA,CACC,+CAAA,CACA,oCACF,CAAA,CACC,OAAA,CACC,uCACA,4BACF,CAAA,CACC,OAAA,CAAQ,oCAAA,CAAsC,0BAA0B,CAAA,CAErEsC,CAAAA,CAAWnD,IAAAA,CAAKwJ,EAAM,CAAA,EAAG1E,CAAI,CAAA,GAAA,CAAK,CAAA,CAEpC/E,UAAAA,CAAWoD,CAAQ,CAAA,GACrB,OAAA,CAAQ,MAAM,CAAA,qBAAA,EAAwBL,QAAAA,CAAS,OAAA,CAAQ,GAAA,EAAI,CAAGK,CAAQ,CAAC,CAAA,CAAE,EACzE,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,CAAA,CAGhB,IAAMlC,CAAAA,CAAME,OAAAA,CAAQgC,CAAQ,EACvBpD,UAAAA,CAAWkB,CAAG,CAAA,EACjBsC,SAAAA,CAAUtC,CAAAA,CAAK,CAAE,SAAA,CAAW,IAAK,CAAC,CAAA,CAGpCuC,aAAAA,CAAcL,CAAAA,CAAUuG,CAAAA,CAAW,OAAO,CAAA,CAE1C,IAAMC,CAAAA,CAAM7G,QAAAA,CAAS,QAAQ,GAAA,EAAI,CAAGK,CAAQ,CAAA,CAC5C,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAGT,CAAAA,CAAG,MAAM,QAAQ,CAAC,CAAA,CAAA,EAAIA,CAAAA,CAAG,IAAA,CAAKoC,CAAI,CAAC,CAAA,QAAA,EAAMpC,EAAG,GAAA,CAAIiH,CAAG,CAAC,CAAA,CAAE,EACvE,CC/NA,SAASvH,EAAAA,CAAUC,CAAAA,CAIjB,CACA,IAAMC,CAAAA,CAAuB,EAAC,CAC1Ba,EAAW,EAAA,CACXyG,CAAAA,CAEJ,IAAA,IAASrH,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAIF,CAAAA,CAAK,MAAA,CAAQE,IAAK,CACpC,IAAM6C,CAAAA,CAAM/C,CAAAA,CAAKE,CAAC,CAAA,CAElB,GAAQ6C,CAAAA,GACD,WAAY,CACf,IAAM5C,CAAAA,CAAMH,CAAAA,CAAK,EAAEE,CAAC,CAAA,CAChBC,CAAAA,GACFF,EAAK,MAAA,CAASE,CAAAA,EAGlB,CAAA,KAEM4C,CAAAA,EAAO,CAACA,CAAAA,CAAI,UAAA,CAAW,GAAG,IACvBjC,CAAAA,CAEOyG,CAAAA,GACVA,CAAAA,CAAgBxE,CAAAA,CAAAA,CAFhBjC,CAAAA,CAAWiC,CAAAA,EAMrB,CAEA,OAAO,CAAE,QAAA,CAAAjC,CAAAA,CAAU,aAAA,CAAAyG,CAAAA,CAAe,IAAA,CAAAtH,CAAK,CACzC,CAMA,eAAsBuH,EAAAA,CAAexH,CAAAA,CAAgB,CACnD,GAAM,CAAE,QAAA,CAAAc,CAAAA,CAAU,aAAA,CAAAyG,CAAc,CAAA,CAAIxH,EAAAA,CAAUC,CAAI,CAAA,CAE7Cc,CAAAA,GACH,OAAA,CAAQ,KAAA,CAAM,kDAAkD,EAChE,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,CAAA,CAGhB,IAAMuC,CAAAA,CAAS,MAAMtB,CAAAA,CAAWjB,CAAQ,CAAA,CAEnCuC,CAAAA,CAAO,SAAA,EACVA,CAAAA,CAAO,KAAA,EAAM,CAGf,IAAMoE,CAAAA,CAAapE,EAAO,OAAA,EAAQ,CAElC,GAAIkE,CAAAA,CAAe,CAEjB,IAAMG,CAAAA,CAAcrE,CAAAA,CAAO,QAAQkE,CAAa,CAAA,CAEhD,GAAI,CAACG,EAAa,CAMhB,GALA,OAAA,CAAQ,KAAA,CACN,gBAAgBH,CAAa,CAAA;;AAAA,qBAAA,CAE/B,EAEIE,CAAAA,CAAW,KAAA,CAAM,SAAW,CAAA,CAC9B,OAAA,CAAQ,IAAIpH,CAAAA,CAAG,GAAA,CAAI,2BAA2B,CAAC,CAAA,CAAA,aAEpCsH,CAAAA,IAAKF,CAAAA,CAAW,MACzB,OAAA,CAAQ,GAAA,CACN,KAAKpH,CAAAA,CAAG,IAAA,CAAKsH,EAAE,EAAE,CAAC,WAAMA,CAAAA,CAAE,WAAA,CAAY,IAAI,CAAA,OAAA,EAAUA,CAAAA,CAAE,cAAc,CAAA,CAAA,CACtE,CAAA,CAIJtE,EAAO,IAAA,EAAK,CACZ,QAAQ,IAAA,CAAK,CAAC,EAChB,CAEA,OAAA,CAAQ,KAAI,CACZ,OAAA,CAAQ,IAAIhD,CAAAA,CAAG,IAAA,CAAKA,EAAG,IAAA,CAAK,yBAAyB,CAAC,CAAC,CAAA,CACvD,QAAQ,GAAA,CAAIA,CAAAA,CAAG,IAAI,QAAA,CAAI,MAAA,CAAO,EAAE,CAAC,CAAC,EAClC,OAAA,CAAQ,GAAA,GACR,OAAA,CAAQ,GAAA,CAAIqH,CAAW,CAAA,CACvB,OAAA,CAAQ,MACV,CAAA,KAAA,GAEE,QAAQ,GAAA,EAAI,CACZ,QAAQ,GAAA,CAAIrH,CAAAA,CAAG,KAAKA,CAAAA,CAAG,IAAA,CAAK,kBAAkB,CAAC,CAAC,EAChD,OAAA,CAAQ,GAAA,CAAIA,EAAG,GAAA,CAAI,QAAA,CAAI,OAAO,EAAE,CAAC,CAAC,CAAA,CAClC,OAAA,CAAQ,KAAI,CAERoH,CAAAA,CAAW,MAAM,MAAA,GAAW,CAAA,CAAG,CACjC,OAAA,CAAQ,GAAA,CAAIpH,EAAG,KAAA,CAAM,2BAA2B,CAAC,CAAA,CACjD,OAAA,CAAQ,KAAI,CAGZ,IAAMuH,EAAkB,MAAA,CAAO,OAAA,CAC7BH,EAAW,SAIb,CAAA,CACA,GAAIG,CAAAA,CAAgB,MAAA,CAAS,EAAG,CAC9B,OAAA,CAAQ,IAAIvH,CAAAA,CAAG,IAAA,CAAK,2BAA2B,CAAC,CAAA,CAChD,OAAW,CAAC8B,CAAAA,CAAK0F,CAAM,CAAA,GAAKD,CAAAA,CAAiB,CAC3C,IAAME,CAAAA,CAAQC,GAAYF,CAAAA,CAAO,KAAK,EAChCG,CAAAA,CACJH,CAAAA,CAAO,WAAa,MAAA,CAAY,CAAA,EAAA,EAAKA,EAAO,QAAQ,CAAA,GAAA,CAAA,CAAQ,GAC9D,OAAA,CAAQ,GAAA,CAAI,KAAKxH,CAAAA,CAAG,IAAA,CAAK8B,CAAG,CAAC,CAAA,EAAA,EAAK2F,CAAK,CAAA,EAAGE,CAAG,EAAE,EACjD,CACA,QAAQ,GAAA,GACV,CACF,CAAA,KAAO,CACL,QAAQ,GAAA,CACN,CAAA,EAAG3H,EAAG,MAAA,CAAO,MAAA,CAAOoH,EAAW,KAAA,CAAM,MAAM,CAAC,CAAC,CAAA;AAAA,CAC/C,CAAA,CAEA,IAAA,IAAWE,CAAAA,IAAKF,CAAAA,CAAW,KAAA,CAAO,CAChC,OAAA,CAAQ,GAAA,CACN,CAAA,EAAGpH,CAAAA,CAAG,MAAA,CAAO,QAAG,CAAC,CAAA,CAAA,EAAIA,CAAAA,CAAG,IAAA,CAAKsH,CAAAA,CAAE,WAAA,CAAY,IAAI,CAAC,CAAA,MAAA,EAAStH,CAAAA,CAAG,GAAA,CAAIsH,CAAAA,CAAE,EAAE,CAAC,CAAA,CAAA,CACvE,CAAA,CACA,OAAA,CAAQ,IAAI,CAAA,mBAAA,EAAsBtH,CAAAA,CAAG,IAAA,CAAKsH,CAAAA,CAAE,cAAc,CAAC,CAAA,CAAE,CAAA,CAG7D,IAAMM,CAAAA,CAAU,CAAE,GAAGN,CAAAA,CAAE,WAAY,CAAA,CACnC,OAAQM,EAAoC,IAAA,CACxB,MAAA,CAAO,IAAA,CAAKA,CAAO,CAAA,CACvB,MAAA,CAAS,CAAA,EACvB,OAAA,CAAQ,IAAI,CAAA,WAAA,EAAc,IAAA,CAAK,SAAA,CAAUA,CAAO,CAAC,CAAA,CAAE,CAAA,CAIrD,IAAMC,EACJT,CAAAA,CAAW,SAAA,CAIXE,CAAAA,CAAE,EAAE,CAAA,CACFO,CAAAA,CACF,OAAA,CAAQ,GAAA,CACN,CAAA,YAAA,EAAeH,EAAAA,CAAYG,CAAAA,CAAe,KAAK,CAAC,CAAA,EAAGA,CAAAA,CAAe,KAAA,CAAQ,WAAMA,CAAAA,CAAe,KAAK,CAAA,CAAA,CAAK,EAAE,CAAA,CAC7G,CAAA,CAGoBT,CAAAA,CAAW,YAAA,CAAa,KACzCU,CAAAA,EACCA,CAAAA,CAAE,WAAA,GAAgBR,CAAAA,CAAE,WAAA,CAAY,IAAA,EAChCQ,CAAAA,CAAE,WAAA,GAAgB,aACtB,CAAA,EAEE,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAA,EAAK9H,CAAAA,CAAG,GAAA,CAAI,sCAAsC,CAAC,CAAA,CAAE,CAAA,CAIrE,OAAA,CAAQ,GAAA,GACV,CAEA,OAAA,CAAQ,GAAA,CACNA,EAAG,GAAA,CACD,CAAA,IAAA,EAAOA,CAAAA,CAAG,IAAA,CAAK,2CAA2C,CAAC,CAAA,0BAAA,CAC7D,CACF,EACF,CAGFgD,CAAAA,CAAO,IAAA,GACT,CAEA,SAAS0E,EAAAA,CAAYD,CAAAA,CAAuB,CAC1C,OAAQA,CAAAA,EACN,KAAK,UAAA,CACH,OAAOzH,CAAAA,CAAG,KAAA,CAAM,UAAU,CAAA,CAC5B,KAAK,SAAA,CACH,OAAOA,CAAAA,CAAG,GAAA,CAAI,SAAS,EACzB,KAAK,UAAA,CACH,OAAOA,CAAAA,CAAG,MAAA,CAAO,UAAU,CAAA,CAC7B,KAAK,UACH,OAAOA,CAAAA,CAAG,MAAA,CAAO,SAAS,CAAA,CAC5B,KAAK,WAAA,CACH,OAAOA,EAAG,GAAA,CAAI,WAAW,CAAA,CAC3B,QACE,OAAOA,CAAAA,CAAG,GAAA,CAAIyH,CAAK,CACvB,CACF,CCnLA,SAAS/H,EAAAA,CAAUC,CAAAA,CAA0D,CAC3E,IAAMC,CAAAA,CAAqB,CAAE,KAAA,CAAO,KAAA,CAAO,IAAA,CAAM,IAAK,CAAA,CAClDa,EAAW,EAAA,CAEf,IAAA,IAASZ,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAIF,CAAAA,CAAK,MAAA,CAAQE,CAAAA,EAAAA,CAAK,CACpC,IAAM6C,CAAAA,CAAM/C,CAAAA,CAAKE,CAAC,CAAA,CAElB,OAAQ6C,CAAAA,EACN,KAAK,SAAA,CACH9C,CAAAA,CAAK,KAAA,CAAQ,IAAA,CACb,MACF,KAAK,WAAA,CACHA,EAAK,IAAA,CAAO,KAAA,CACZ,MACF,KAAK,UAAA,CAAY,CACf,IAAME,CAAAA,CAAMH,EAAK,EAAEE,CAAC,CAAA,CAChBC,CAAAA,GACFF,CAAAA,CAAK,MAAA,CAASE,CAAAA,CAAAA,CAEhB,KACF,CACA,QACM4C,CAAAA,EAAO,CAACA,CAAAA,CAAI,UAAA,CAAW,GAAG,CAAA,EAAK,CAACjC,CAAAA,GAClCA,CAAAA,CAAWiC,CAAAA,EAEjB,CACF,CAEA,OAAO,CAAE,QAAA,CAAAjC,EAAU,IAAA,CAAAb,CAAK,CAC1B,CAMA,SAASmI,EAAAA,CAAiBX,CAAAA,CAaf,CACT,IAAMvB,CAAAA,CAAkB,EAAC,CAEzBA,CAAAA,CAAM,IAAA,CAAK7F,CAAAA,CAAG,IAAA,CAAK,kBAAkB,CAAC,CAAA,CACtC6F,CAAAA,CAAM,IAAA,CAAK7F,CAAAA,CAAG,GAAA,CAAI,QAAA,CAAI,MAAA,CAAO,EAAE,CAAC,CAAC,CAAA,CACjC6F,CAAAA,CAAM,IAAA,CAAK,EAAE,CAAA,CAGb,IAAMmC,CAAAA,CAAgB,IAAI,GAAA,CAK1B,IAAA,IAAWC,CAAAA,IAAKb,CAAAA,CAAW,WAAA,CACzBY,CAAAA,CAAc,IAAIC,CAAAA,CAAE,EAAA,CAAI,CACtB,QAAA,CAAU,IAAI,GAAA,CACd,MAAA,CAAQA,CAAAA,CAAE,MAAA,CACV,QAAA,CAAUA,CAAAA,CAAE,QACd,CAAC,CAAA,CAIH,IAAA,IAAWX,CAAAA,IAAKF,EAAW,KAAA,CAAO,CAChC,IAAMc,CAAAA,CAAQF,CAAAA,CAAc,GAAA,CAAIV,CAAAA,CAAE,cAAc,EAC5CY,CAAAA,EACFA,CAAAA,CAAM,QAAA,CAAS,GAAA,CAAIZ,CAAAA,CAAE,WAAA,CAAY,IAAI,EAEzC,CAGA,IAAMa,CAAAA,CAAkB,IAAI,GAAA,CAC5B,IAAA,IAAWL,CAAAA,IAAKV,CAAAA,CAAW,YAAA,CACpBe,CAAAA,CAAgB,GAAA,CAAIL,CAAAA,CAAE,WAAW,CAAA,EACpCK,CAAAA,CAAgB,GAAA,CAAIL,CAAAA,CAAE,YAAa,EAAE,CAAA,CAEvCK,CAAAA,CAAgB,GAAA,CAAIL,CAAAA,CAAE,WAAW,CAAA,CAAG,KAAKA,CAAAA,CAAE,EAAE,CAAA,CAI/CjC,CAAAA,CAAM,IAAA,CAAK7F,CAAAA,CAAG,IAAA,CAAK,kDAAwC,CAAC,CAAA,CAC5D6F,CAAAA,CAAM,IAAA,CAAK,EAAE,CAAA,CAEb,IAAA,GAAW,CAACrI,CAAAA,CAAI4K,CAAI,CAAA,GAAKJ,CAAAA,CAAe,CACtC,IAAMR,CAAAA,CAASY,CAAAA,CAAK,MAAA,CAASpI,EAAG,KAAA,CAAM,QAAG,CAAA,CAAIA,CAAAA,CAAG,GAAA,CAAI,QAAG,CAAA,CAGvD,GAFA6F,EAAM,IAAA,CAAK,CAAA,EAAG2B,CAAM,CAAA,CAAA,EAAIxH,CAAAA,CAAG,IAAA,CAAKxC,CAAE,CAAC,eAAe4K,CAAAA,CAAK,QAAQ,CAAA,CAAA,CAAG,CAAA,CAE9DA,CAAAA,CAAK,QAAA,CAAS,IAAA,CAAO,CAAA,CACvB,IAAA,IAAWC,CAAAA,IAAWD,CAAAA,CAAK,QAAA,CAAU,CACnCvC,CAAAA,CAAM,IAAA,CAAK,CAAA,qBAAA,EAAS7F,EAAG,MAAA,CAAOqI,CAAO,CAAC,CAAA,CAAE,CAAA,CAExC,IAAMC,CAAAA,CAAYH,CAAAA,CAAgB,IAAIE,CAAO,CAAA,EAAK,EAAC,CACnD,GAAIC,CAAAA,CAAU,MAAA,CAAS,CAAA,CACrB,QAAWR,CAAAA,IAAKQ,CAAAA,CACdzC,CAAAA,CAAM,IAAA,CAAK,CAAA,yBAAA,EAAa7F,CAAAA,CAAG,OAAA,CAAQ8H,CAAC,CAAC,CAAA,CAAE,CAAA,CAAA,KAGzCjC,CAAAA,CAAM,IAAA,CAAK,CAAA,yBAAA,EAAa7F,CAAAA,CAAG,GAAA,CAAI,eAAe,CAAC,CAAA,CAAE,EAErD,CAAA,KAEA6F,CAAAA,CAAM,IAAA,CAAK,CAAA,qBAAA,EAAS7F,CAAAA,CAAG,IAAI,0BAA0B,CAAC,CAAA,CAAE,CAAA,CAG1D6F,CAAAA,CAAM,IAAA,CAAK,EAAE,EACf,CAGA,IAAM0C,CAAAA,CAAgB,IAAI,GAAA,CAC1B,IAAA,IAAWD,CAAAA,IAAaH,CAAAA,CAAgB,MAAA,EAAO,CAC7C,IAAA,IAAWL,CAAAA,IAAKQ,CAAAA,CACdC,CAAAA,CAAc,GAAA,CAAIT,CAAC,CAAA,CASvB,GALuBV,CAAAA,CAAW,YAAA,CAAa,GAAA,CAAKU,CAAAA,EAAMA,CAAAA,CAAE,EAAE,CAAA,CACzB,MAAA,CAClCA,GAAM,CAACS,CAAAA,CAAc,GAAA,CAAIT,CAAC,CAC7B,CAAA,CAAE,MAAA,CAEkB,CAAA,CAAG,CACrBjC,CAAAA,CAAM,IAAA,CAAK7F,CAAAA,CAAG,IAAA,CAAK,uBAAuB,CAAC,CAAA,CAC3C,IAAA,IAAW8H,CAAAA,IAAKV,CAAAA,CAAW,YAAA,CACpBmB,CAAAA,CAAc,GAAA,CAAIT,CAAAA,CAAE,EAAE,CAAA,EACzBjC,EAAM,IAAA,CAAK,CAAA,EAAA,EAAK7F,CAAAA,CAAG,OAAA,CAAQ8H,CAAAA,CAAE,EAAE,CAAC,CAAA,SAAA,EAAY9H,EAAG,MAAA,CAAO8H,CAAAA,CAAE,WAAW,CAAC,CAAA,CAAE,EAG5E,CAEA,OAAOjC,EAAM,IAAA,CAAK;AAAA,CAAI,CACxB,CAMA,SAAS2C,EAAAA,CACPpB,EAgBAnE,CAAAA,CACQ,CAER,IAAMwF,CAAAA,CAOD,EAAC,CACAC,CAAAA,CAA6C,GAQ7CC,CAAAA,CAAW,MAAA,CAAO,IAAA,CAAK1F,CAAK,CAAA,CAClC,IAAA,IAASpD,CAAAA,CAAI,CAAA,CAAGA,EAAI8I,CAAAA,CAAS,MAAA,CAAQ9I,CAAAA,EAAAA,CAAK,CACxC,IAAMiC,CAAAA,CAAM6G,CAAAA,CAAS9I,CAAC,CAAA,CACtB4I,EAAM,IAAA,CAAK,CACT,EAAA,CAAI,CAAA,KAAA,EAAQ3G,CAAG,CAAA,CAAA,CACf,KAAA,CAAOA,CAAAA,CACP,KAAM,MAAA,CACN,CAAA,CAAG,EAAA,CACH,CAAA,CAAG,EAAA,CAASjC,CAAAA,CAAI,EAAA,CAChB,KAAA,CAAO,SACT,CAAC,EACH,CAGA,IAAA,IAASA,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAIuH,CAAAA,CAAW,YAAY,MAAA,CAAQvH,CAAAA,EAAAA,CAAK,CACtD,IAAMoI,EAAIb,CAAAA,CAAW,WAAA,CAAYvH,CAAC,CAAA,CAClC4I,EAAM,IAAA,CAAK,CACT,EAAA,CAAI,CAAA,WAAA,EAAcR,CAAAA,CAAE,EAAE,CAAA,CAAA,CACtB,KAAA,CAAOA,EAAE,EAAA,CACT,IAAA,CAAM,YAAA,CACN,CAAA,CAAG,GAAA,CACH,CAAA,CAAG,EAAA,CAASpI,CAAAA,CAAI,GAChB,KAAA,CAAOoI,CAAAA,CAAE,MAAA,CAAS,SAAA,CAAY,SAChC,CAAC,EACH,CAGA,IAAMW,CAAAA,CAAW,IAAI,GAAA,CACrB,IAAA,IAAWtB,KAAKF,CAAAA,CAAW,KAAA,CACzBwB,CAAAA,CAAS,GAAA,CAAItB,EAAE,WAAA,CAAY,IAAI,CAAA,CAEjC,IAAIuB,CAAAA,CAAS,CAAA,CACb,IAAA,IAAWR,CAAAA,IAAWO,EACpBH,CAAAA,CAAM,IAAA,CAAK,CACT,EAAA,CAAI,CAAA,IAAA,EAAOJ,CAAO,CAAA,CAAA,CAClB,KAAA,CAAOA,EACP,IAAA,CAAM,aAAA,CACN,CAAA,CAAG,GAAA,CACH,CAAA,CAAG,EAAA,CAASQ,CAAAA,CAAS,EAAA,CACrB,MAAO,SACT,CAAC,CAAA,CACDA,CAAAA,EAAAA,CAIF,QAAShJ,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAIuH,CAAAA,CAAW,aAAa,MAAA,CAAQvH,CAAAA,EAAAA,CAAK,CACvD,IAAMiI,CAAAA,CAAIV,CAAAA,CAAW,YAAA,CAAavH,CAAC,EACnC4I,CAAAA,CAAM,IAAA,CAAK,CACT,EAAA,CAAI,CAAA,SAAA,EAAYX,CAAAA,CAAE,EAAE,CAAA,CAAA,CACpB,MAAOA,CAAAA,CAAE,EAAA,CACT,IAAA,CAAM,UAAA,CACN,CAAA,CAAG,GAAA,CACH,CAAA,CAAG,EAAA,CAASjI,EAAI,EAAA,CAChB,KAAA,CAAO,SACT,CAAC,EACH,CAGA,IAAA,IAAWyH,CAAAA,IAAKF,CAAAA,CAAW,MACzBsB,CAAAA,CAAM,IAAA,CAAK,CACT,IAAA,CAAM,CAAA,WAAA,EAAcpB,CAAAA,CAAE,cAAc,CAAA,CAAA,CACpC,GAAI,CAAA,IAAA,EAAOA,CAAAA,CAAE,WAAA,CAAY,IAAI,CAAA,CAC/B,CAAC,CAAA,CAIH,IAAA,IAAWQ,KAAKV,CAAAA,CAAW,YAAA,CACrBwB,CAAAA,CAAS,GAAA,CAAId,CAAAA,CAAE,WAAW,CAAA,EAC5BY,CAAAA,CAAM,KAAK,CACT,IAAA,CAAM,CAAA,IAAA,EAAOZ,CAAAA,CAAE,WAAW,CAAA,CAAA,CAC1B,EAAA,CAAI,CAAA,SAAA,EAAYA,CAAAA,CAAE,EAAE,CAAA,CACtB,CAAC,CAAA,CAIL,IAAMgB,CAAAA,CAAU,IAAI,GAAA,CAAIL,CAAAA,CAAM,IAAK9F,CAAAA,EAAM,CAACA,CAAAA,CAAE,EAAA,CAAIA,CAAC,CAAC,CAAC,CAAA,CAC7CoG,EAAW,GAAA,CACXC,CAAAA,CAAO,IAAA,CAAK,GAAA,CAAI,GAAGP,CAAAA,CAAM,GAAA,CAAK9F,CAAAA,EAAMA,EAAE,CAAC,CAAC,CAAA,CAAI,EAAA,CAAY,GAExDsG,CAAAA,CAAUP,CAAAA,CACb,GAAA,CAAKQ,CAAAA,EAAM,CACV,IAAMC,CAAAA,CAAOL,CAAAA,CAAQ,GAAA,CAAII,CAAAA,CAAE,IAAI,CAAA,CACzBE,CAAAA,CAAKN,EAAQ,GAAA,CAAII,CAAAA,CAAE,EAAE,CAAA,CAC3B,OAAI,CAACC,CAAAA,EAAQ,CAACC,EACL,EAAA,CAGF,CAAA,UAAA,EAAaD,CAAAA,CAAK,CAAA,CAAI,EAAE,CAAA,MAAA,EAASA,CAAAA,CAAK,CAAA,CAAI,EAAE,CAAA,MAAA,EAASC,CAAAA,CAAG,CAAC,CAAA,MAAA,EAASA,EAAG,CAAA,CAAI,EAAE,CAAA,gEAAA,CACpF,CAAC,EACA,IAAA,CAAK;AAAA,IAAA,CAAQ,CAAA,CAEVC,CAAAA,CAAUZ,CAAAA,CACb,GAAA,CACE9F,CAAAA,EACC,CAAA;AAAA,eAAA,EACSA,CAAAA,CAAE,CAAC,CAAA,KAAA,EAAQA,CAAAA,CAAE,CAAC,0CAA0CA,CAAAA,CAAE,KAAK,CAAA,yBAAA,EAA4BA,CAAAA,CAAE,KAAK,CAAA;AAAA,eAAA,EAClGA,CAAAA,CAAE,CAAA,CAAI,EAAE,CAAA,KAAA,EAAQA,EAAE,CAAA,CAAI,EAAE,CAAA,oEAAA,EAAuEA,CAAAA,CAAE,KAAK,CAAA,EAAA,EAAK2G,EAAAA,CAAW3G,CAAAA,CAAE,KAAK,CAAC,CAAA;AAAA,QAAA,CAE3I,EACC,IAAA,CAAK;AAAA,IAAA,CAAQ,CAAA,CAIV4G,GADU,CAAC,OAAA,CAAS,cAAe,cAAA,CAAgB,WAAW,EAEjE,GAAA,CACC,CAACC,EAAG3J,CAAAA,GACF,CAAA,SAAA,EAAY,GAASA,CAAAA,CAAI,GAAA,CAAW,EAAE,CAAA,uGAAA,EAA0G2J,CAAC,CAAA,OAAA,CACrJ,CAAA,CACC,IAAA,CAAK;AAAA,IAAA,CAAQ,EAEhB,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAAA,EAUOT,CAAQ,aAAaC,CAAI,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,EAMnCO,EAAS;AAAA,IAAA,EACTN,CAAO;AAAA,IAAA,EACPI,CAAO;AAAA;AAAA;AAAA,OAAA,CAIb,CAEA,SAASC,EAAAA,CAAWG,CAAAA,CAAsB,CACxC,OAAOA,CAAAA,CACJ,OAAA,CAAQ,IAAA,CAAM,OAAO,CAAA,CACrB,OAAA,CAAQ,KAAM,MAAM,CAAA,CACpB,OAAA,CAAQ,IAAA,CAAM,MAAM,CAAA,CACpB,OAAA,CAAQ,IAAA,CAAM,QAAQ,CAC3B,CAMA,eAAsBC,EAAAA,CAAa/J,CAAAA,CAAgB,CACjD,GAAM,CAAE,QAAA,CAAAc,CAAAA,CAAU,IAAA,CAAAb,CAAK,EAAIF,EAAAA,CAAUC,CAAI,CAAA,CAEpCc,CAAAA,GACH,OAAA,CAAQ,KAAA,CACN,uEACF,CAAA,CACA,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,CAAA,CAGhB,IAAMuC,CAAAA,CAAS,MAAMtB,CAAAA,CAAWjB,CAAQ,CAAA,CAEnCuC,CAAAA,CAAO,SAAA,EACVA,CAAAA,CAAO,OAAM,CAGf,IAAMoE,CAAAA,CAAapE,CAAAA,CAAO,OAAA,EAAQ,CAElC,GAAIpD,CAAAA,CAAK,KAAA,CAAO,CACd,OAAA,CAAQ,GAAA,CAAImI,EAAAA,CAAiBX,CAAU,CAAC,CAAA,CACxCpE,CAAAA,CAAO,IAAA,EAAK,CAEZ,MACF,CAGA,IAAM2G,CAAAA,CAAoC,EAAC,CAC3C,GAAI3G,CAAAA,CAAO,KAAA,CACT,QAAWlB,CAAAA,IAAO,MAAA,CAAO,IAAA,CAAKkB,CAAAA,CAAO,KAAK,CAAA,CACxC,GAAI,CACF2G,CAAAA,CAAS7H,CAAG,CAAA,CAAIkB,CAAAA,CAAO,KAAA,CAAMlB,CAAG,EAClC,CAAA,KAAQ,CACN6H,CAAAA,CAAS7H,CAAG,CAAA,CAAI,KAClB,CAIJ,IAAM8H,CAAAA,CAAOpB,EAAAA,CAAgBpB,CAAAA,CAAYuC,CAAQ,CAAA,CAC3CE,CAAAA,CACJjK,EAAK,MAAA,EAAUtC,IAAAA,CAAK,OAAA,CAAQ,GAAA,EAAI,CAAG,uBAAuB,EAK5D,GAHAwD,aAAAA,CAAc+I,CAAAA,CAAYD,CAAAA,CAAM,OAAO,CAAA,CACvC,QAAQ,GAAA,CAAI,CAAA,EAAG5J,CAAAA,CAAG,KAAA,CAAM,WAAW,CAAC,CAAA,CAAA,EAAIA,CAAAA,CAAG,GAAA,CAAI6J,CAAU,CAAC,CAAA,CAAE,CAAA,CAExDjK,CAAAA,CAAK,KACP,GAAI,CACF,GAAM,CAAE,QAAA,CAAAkK,CAAS,EAAI,MAAM,OAAO,eAAoB,CAAA,CAChDC,CAAAA,CACJ,OAAA,CAAQ,WAAa,QAAA,CACjB,MAAA,CACA,OAAA,CAAQ,QAAA,GAAa,OAAA,CACnB,OAAA,CACA,UAAA,CACRD,CAAAA,CAASC,CAAAA,CAAS,CAACF,CAAU,CAAC,CAAA,CAC9B,OAAA,CAAQ,IAAI7J,CAAAA,CAAG,GAAA,CAAI,oBAAoB,CAAC,EAC1C,CAAA,KAAQ,CACN,OAAA,CAAQ,GAAA,CACNA,CAAAA,CAAG,GAAA,CAAI,CAAA,KAAA,EAAQ6J,CAAU,qCAAqC,CAChE,EACF,CAGF7G,CAAAA,CAAO,IAAA,GACT,CCnYA,SAAStD,EAAAA,CAAUC,CAAAA,CAA6B,CAC9C,IAAMC,CAAAA,CAAoB,CACxB,GAAA,CAAK,OAAA,CAAQ,GAAA,EAAI,CACjB,aAAA,CAAe,KACjB,CAAA,CAEA,IAAA,IAASC,EAAI,CAAA,CAAGA,CAAAA,CAAIF,CAAAA,CAAK,MAAA,CAAQE,CAAAA,EAAAA,CAG/B,OAFYF,EAAKE,CAAC,CAAA,EAGhB,KAAK,YAAA,CAAc,CACjB,IAAMC,CAAAA,CAAMH,CAAAA,CAAK,EAAEE,CAAC,CAAA,CAChBC,CAAAA,GACFF,CAAAA,CAAK,QAAA,CAAWE,CAAAA,CAAAA,CAElB,KACF,CACA,KAAK,OAAA,CAAS,CACZ,IAAMA,CAAAA,CAAMH,CAAAA,CAAK,EAAEE,CAAC,CAAA,CAChBC,CAAAA,GACFF,EAAK,GAAA,CAAME,CAAAA,CAAAA,CAEb,KACF,CACA,KAAK,kBAAA,CACHF,EAAK,aAAA,CAAgB,IAAA,CACrB,KACJ,CAGF,OAAOA,CACT,CAQA,SAASoK,EAAAA,CAAqBzL,CAAAA,CAA6B,CACzD,OAAIlB,UAAAA,CAAWC,IAAAA,CAAKiB,EAAK,gBAAgB,CAAC,CAAA,CACjC,MAAA,CAELlB,UAAAA,CAAWC,IAAAA,CAAKiB,EAAK,WAAW,CAAC,CAAA,EAAKlB,UAAAA,CAAWC,IAAAA,CAAKiB,CAAAA,CAAK,UAAU,CAAC,CAAA,CACjE,KAAA,CAELlB,UAAAA,CAAWC,IAAAA,CAAKiB,CAAAA,CAAK,WAAW,CAAC,CAAA,CAC5B,MAAA,CAGF,KACT,CAEA,SAAS0L,EAAAA,CAAWC,EAAoBlG,CAAAA,CAAqB,CAC3D,OAAQkG,CAAAA,EACN,KAAK,MAAA,CACH,OAAO,CAAA,SAAA,EAAYlG,CAAG,CAAA,CAAA,CACxB,KAAK,MAAA,CACH,OAAO,YAAYA,CAAG,CAAA,CAAA,CACxB,KAAK,KAAA,CACH,OAAO,CAAA,QAAA,EAAWA,CAAG,CAAA,CAAA,CACvB,QACE,OAAO,CAAA,YAAA,EAAeA,CAAG,CAAA,CAC7B,CACF,CAgBA,SAASmG,EAAAA,CAAaC,CAAAA,CAAwD,CAC5E,OAAO,CACL,QAAS,CACP,EAAA,CAAI,SAAA,CACJ,KAAA,CAAO,mBAAA,CACP,IAAA,CAAM,iEACN,KAAA,CAAO,CACL,CACE,IAAA,CAAM,CAAA,IAAA,EAAOA,CAAU,CAAA,GAAA,CAAA,CACvB,OAAA,CAASC,EAAAA,CAAsBD,CAAU,CAC3C,CAAA,CACA,CACE,IAAA,CAAM,cACN,OAAA,CAASE,EAAAA,CAAoBF,CAAU,CACzC,CACF,CAAA,CACA,IAAA,CAAM,CAAC,qBAAqB,CAC9B,CAAA,CACA,WAAA,CAAa,CACX,EAAA,CAAI,YACJ,KAAA,CAAO,qCAAA,CACP,IAAA,CAAM,4DAAA,CACN,KAAA,CAAO,CACL,CACE,IAAA,CAAM,CAAA,IAAA,EAAOA,CAAU,CAAA,GAAA,CAAA,CACvB,OAAA,CAASG,EAAAA,CAAmBH,CAAU,CACxC,CAAA,CACA,CACE,IAAA,CAAM,aAAA,CACN,OAAA,CAASI,EAAAA,CAAiBJ,CAAU,CACtC,CACF,CAAA,CACA,IAAA,CAAM,CAAC,qBAAqB,CAC9B,CAAA,CACA,iBAAA,CAAmB,CACjB,EAAA,CAAI,iBAAA,CACJ,KAAA,CAAO,iBAAA,CACP,IAAA,CAAM,kDAAA,CACN,KAAA,CAAO,CACL,CACE,IAAA,CAAM,CAAA,IAAA,EAAOA,CAAU,CAAA,GAAA,CAAA,CACvB,OAAA,CAASK,EAAAA,CAAiBL,CAAU,CACtC,CAAA,CACA,CACE,IAAA,CAAM,aAAA,CACN,OAAA,CAASM,EAAAA,CAAeN,CAAU,CACpC,CACF,EACA,IAAA,CAAM,CAAC,qBAAA,CAAuB,mBAAmB,CACnD,CACF,CACF,CAMA,SAASC,EAAAA,CAAsBjI,CAAAA,CAAsB,CAGnD,OAAO,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,aAAA,EAFWuI,CAAAA,CAAYvI,CAAI,CAqBZ,CAAA,iBAAA,EAAoBA,CAAI,CAAA;AAAA;;AAAA;AAAA;AAAA,mBAAA,EAK3BA,CAAI,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAwBzB,CAEA,SAASkI,EAAAA,CAAoBlI,CAAAA,CAAsB,CACjD,IAAMwI,CAAAA,CAAYD,CAAAA,CAAYvI,CAAI,CAAA,CAElC,OAAO,CAAA;AAAA,SAAA,EACEwI,CAAS,cAAcxI,CAAI,CAAA;;AAAA;AAAA,UAAA,EAG1BwI,CAAS,CAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA,CAuBrB,CAEA,SAASL,EAAAA,CAAmBnI,CAAAA,CAAsB,CAGhD,OAAO,CAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,aAAA,EAFWuI,CAAAA,CAAYvI,CAAI,CA6BZ,CAAA,iBAAA,EAAoBA,CAAI,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CA8EhD,CAEA,SAASoI,EAAAA,CAAiBpI,CAAAA,CAAsB,CAC9C,IAAMwI,CAAAA,CAAYD,CAAAA,CAAYvI,CAAI,CAAA,CAElC,OAAO,CAAA;AAAA,SAAA,EACEwI,CAAS,cAAcxI,CAAI,CAAA;;AAAA;AAAA,UAAA,EAG1BwI,CAAS,CAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA,CAkBrB,CAEA,SAASH,EAAAA,CAAiBrI,CAAAA,CAAsB,CAG9C,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,aAAA,EAFWuI,CAAAA,CAAYvI,CAAI,CAoCZ,CAAA,iBAAA,EAAoBA,CAAI,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CA2EhD,CAEA,SAASsI,EAAAA,CAAetI,CAAAA,CAAsB,CAC5C,IAAMwI,CAAAA,CAAYD,CAAAA,CAAYvI,CAAI,CAAA,CAElC,OAAO,CAAA;AAAA,SAAA,EACEwI,CAAS,cAAcxI,CAAI,CAAA;;AAAA;AAAA,UAAA,EAG1BwI,CAAS,CAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA,CAgBrB,CAMA,SAASD,CAAAA,CAAYvI,CAAAA,CAAsB,CACzC,OAAOA,CAAAA,CAAK,OAAA,CAAQ,WAAA,CAAa,CAACyI,CAAAA,CAAG5C,CAAAA,GAAMA,CAAAA,CAAE,WAAA,EAAa,CAC5D,CAEA,SAAStH,EAAAA,CAAUF,EAAkBtC,CAAAA,CAAiB,CACpD,IAAMI,CAAAA,CAAME,QAAQgC,CAAQ,CAAA,CACvBpD,UAAAA,CAAWkB,CAAG,GACjBsC,SAAAA,CAAUtC,CAAAA,CAAK,CAAE,SAAA,CAAW,IAAK,CAAC,CAAA,CAEpCuC,aAAAA,CAAcL,CAAAA,CAAUtC,EAAS,OAAO,EAC1C,CAMA,eAAsB2M,GAAYnL,CAAAA,CAAgB,CAChD,IAAMC,CAAAA,CAAOF,GAAUC,CAAI,CAAA,CAEzBoL,CAAA,CAAA,KAAA,CAAM/K,CAAAA,CAAG,OAAOA,CAAAA,CAAG,KAAA,CAAM,kBAAkB,CAAC,CAAC,CAAA,CAG/C,IAAIoK,CAAAA,CAEJ,GAAIxK,EAAK,aAAA,CACPwK,CAAAA,CAAa,WAAA,CAAA,KACR,CACL,IAAMY,CAAAA,CAAa,MAAQD,CAAA,CAAA,IAAA,CAAK,CAC9B,QAAS,cAAA,CACT,WAAA,CAAa,WAAA,CACb,YAAA,CAAc,YACd,QAAA,CAAWjL,CAAAA,EAAQ,CACjB,GAAI,CAAC,mBAAA,CAAoB,IAAA,CAAKA,CAAG,CAAA,CAC/B,OAAO,uEAEX,CACF,CAAC,CAAA,CAEKiL,WAASC,CAAU,CAAA,GACrBD,CAAA,CAAA,MAAA,CAAO,YAAY,EACrB,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,CAAA,CAGhBX,EAAaY,EACf,CAGA,IAAIC,CAAAA,CAEJ,GAAIrL,CAAAA,CAAK,QAAA,CAAU,CACjB,IAAMsL,EAAYf,EAAAA,CAAaC,CAAU,CAAA,CACnCxK,CAAAA,CAAK,YAAYsL,CAAAA,GACnBH,CAAA,CAAA,GAAA,CAAI,KAAA,CACJ,CAAA,kBAAA,EAAqBnL,EAAK,QAAQ,CAAA,aAAA,EAAgB,MAAA,CAAO,IAAA,CAAKsL,CAAS,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,EACrF,CAAA,CACA,OAAA,CAAQ,IAAA,CAAK,CAAC,GAEhBD,CAAAA,CAAarL,CAAAA,CAAK,SACpB,CAAA,KAAA,GAAWA,EAAK,aAAA,CACdqL,CAAAA,CAAa,SAAA,CAAA,KACR,CACL,IAAMC,CAAAA,CAAYf,EAAAA,CAAaC,CAAU,CAAA,CACnCe,EAAS,MAAQJ,CAAA,CAAA,MAAA,CAAO,CAC5B,OAAA,CAAS,oBACT,OAAA,CAAS,MAAA,CAAO,MAAA,CAAOG,CAAS,EAAE,GAAA,CAAKzN,CAAAA,GAAO,CAC5C,KAAA,CAAOA,EAAE,EAAA,CACT,KAAA,CAAOA,CAAAA,CAAE,KAAA,CACT,KAAMA,CAAAA,CAAE,IACV,CAAA,CAAE,CACJ,CAAC,CAAA,CAEKsN,CAAA,CAAA,QAAA,CAASI,CAAM,CAAA,GACjBJ,SAAO,YAAY,CAAA,CACrB,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,CAAA,CAGhBE,CAAAA,CAAaE,EACf,CAGA,IAAMC,CAAAA,CADYjB,EAAAA,CAAaC,CAAU,CAAA,CACda,CAAU,CAAA,CAG/Bf,CAAAA,CAAKF,EAAAA,CAAqBpK,CAAAA,CAAK,GAAG,CAAA,CACtCmL,CAAA,CAAA,GAAA,CAAI,IAAA,CAAK,CAAA,iBAAA,EAAoB/K,EAAG,IAAA,CAAKkK,CAAE,CAAC,CAAA,CAAE,EAG5C,IAAM1J,CAAAA,CAAMuK,CAAA,CAAA,OAAA,EAAQ,CACpBvK,EAAE,KAAA,CAAM,2BAA2B,CAAA,CAEnC,IACI6K,CAAAA,CAAU,EAEd,IAAA,IAAWnK,KAAQkK,CAAAA,CAAS,KAAA,CAAO,CACjC,IAAM3K,EAAWnD,IAAAA,CAAKsC,CAAAA,CAAK,GAAA,CAAKsB,CAAAA,CAAK,IAAI,CAAA,CAEzC,GAAI7D,UAAAA,CAAWoD,CAAQ,EAAG,CACxB4K,CAAAA,EAAAA,CACA,QACF,CAEA1K,GAAUF,CAAAA,CAAUS,CAAAA,CAAK,OAAO,EAElC,CAEAV,CAAAA,CAAE,IAAA,CAAK,wBAAwB,EAE/B,IAAA,IAAWU,CAAAA,IAAQkK,CAAAA,CAAS,KAAA,CAAO,CACjC,IAAM3K,CAAAA,CAAWnD,IAAAA,CAAKsC,CAAAA,CAAK,IAAKsB,CAAAA,CAAK,IAAI,CAAA,CACnC+F,CAAAA,CAAM7G,SAASR,CAAAA,CAAK,GAAA,CAAKa,CAAQ,CAAA,CAEnCpD,WAAWoD,CAAQ,CAAA,EACnBsK,CAAA,CAAA,GAAA,CAAI,OAAA,CAAQ,GAAG/K,CAAAA,CAAG,KAAA,CAAM,SAAS,CAAC,IAAIA,CAAAA,CAAG,GAAA,CAAIiH,CAAG,CAAC,EAAE,EAEzD,CAEIoE,CAAAA,CAAU,CAAA,EACVN,MAAI,IAAA,CAAK,CAAA,QAAA,EAAWM,CAAO,CAAA,4BAAA,CAA8B,EAI7D,IAAMC,CAAAA,CAAUrB,EAAAA,CAAWC,CAAAA,CAAIkB,EAAS,IAAA,CAAK,IAAA,CAAK,GAAG,CAAC,EAEpDL,CAAA,CAAA,KAAA,CACA,CAAA;AAAA,EAAA,EACO/K,CAAAA,CAAG,IAAA,CAAKsL,CAAO,CAAC;AAAA,EAAA,EAChBtL,CAAAA,CAAG,IAAA,CAAK,CAAA,EAAGpD,CAAQ,gBAAgB,CAAC;AAAA,EAAA,EACpCoD,CAAAA,CAAG,GAAA,CAAI,iBAAiB,CAAC,CAAA,CAClC,EACF,CC3nBA,SAASN,EAAAA,CAAUC,EAA4D,CAC7E,IAAMC,CAAAA,CAAuB,CAAE,IAAA,CAAM,KAAM,EACvCa,CAAAA,CAAW,EAAA,CAEf,IAAA,IAASZ,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAIF,EAAK,MAAA,CAAQE,CAAAA,EAAAA,CAAK,CACpC,IAAM6C,CAAAA,CAAM/C,CAAAA,CAAKE,CAAC,CAAA,CAElB,OAAQ6C,CAAAA,EACN,KAAK,QAAA,CACH9C,EAAK,IAAA,CAAO,IAAA,CACZ,MACF,KAAK,UAAA,CAAY,CACf,IAAME,CAAAA,CAAMH,CAAAA,CAAK,EAAEE,CAAC,CAAA,CAChBC,CAAAA,GACFF,CAAAA,CAAK,OAASE,CAAAA,CAAAA,CAEhB,KACF,CACA,QACM4C,CAAAA,EAAO,CAACA,EAAI,UAAA,CAAW,GAAG,CAAA,EAAK,CAACjC,CAAAA,GAClCA,CAAAA,CAAWiC,GAEjB,CACF,CAEA,OAAO,CAAE,QAAA,CAAAjC,CAAAA,CAAU,IAAA,CAAAb,CAAK,CAC1B,CAMA,SAAS2L,EAAAA,CAAYtI,CAAAA,CAAwC,CAC3D,IAAM4C,CAAAA,CAAkB,EAAC,CACzBA,CAAAA,CAAM,IAAA,CAAK7F,CAAAA,CAAG,KAAK,QAAQ,CAAC,CAAA,CAE5B,IAAMwL,CAAAA,CAAU,MAAA,CAAO,QAAQvI,CAAK,CAAA,CACpC,GAAIuI,CAAAA,CAAQ,MAAA,GAAW,CAAA,CACrB,OAAA3F,CAAAA,CAAM,IAAA,CAAK,UAAU,CAAA,CAEdA,CAAAA,CAAM,IAAA,CAAK;AAAA,CAAI,CAAA,CAGxB,IAAA,GAAW,CAAC/D,CAAAA,CAAK2J,CAAK,CAAA,GAAKD,CAAAA,CAAS,CAClC,IAAME,CAAAA,CAAYC,EAAAA,CAAYF,CAAK,CAAA,CACnC5F,CAAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK7F,CAAAA,CAAG,IAAA,CAAK8B,CAAG,CAAC,CAAA,GAAA,EAAM4J,CAAS,CAAA,CAAE,EAC/C,CAEA,OAAO7F,CAAAA,CAAM,IAAA,CAAK;AAAA,CAAI,CACxB,CAEA,SAAS+F,EAAAA,CACPC,CAAAA,CAQQ,CACR,IAAMhG,CAAAA,CAAkB,EAAC,CAGzB,GAFAA,CAAAA,CAAM,IAAA,CAAK7F,CAAAA,CAAG,IAAA,CAAK,cAAc,CAAC,CAAA,CAE9B6L,CAAAA,CAAY,MAAA,GAAW,CAAA,CACzB,OAAAhG,CAAAA,CAAM,IAAA,CAAK,UAAU,CAAA,CAEdA,CAAAA,CAAM,IAAA,CAAK;AAAA,CAAI,CAAA,CAGxB,IAAA,IAAWoC,CAAAA,IAAK4D,CAAAA,CAAa,CAC3B,IAAMrE,CAAAA,CAASS,CAAAA,CAAE,QAAA,CACbjI,CAAAA,CAAG,GAAA,CAAI,UAAU,EACjBiI,CAAAA,CAAE,MAAA,CACAjI,CAAAA,CAAG,KAAA,CAAM,QAAQ,CAAA,CACjBA,CAAAA,CAAG,GAAA,CAAI,UAAU,CAAA,CACjB8L,CAAAA,CAAO7D,CAAAA,CAAE,QAAA,CAAW,CAAA,CAAIjI,EAAG,MAAA,CAAO,CAAA,EAAA,EAAKiI,CAAAA,CAAE,QAAQ,CAAA,MAAA,CAAQ,CAAA,CAAI,EAAA,CACnEpC,CAAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK7F,CAAAA,CAAG,IAAA,CAAKiI,CAAAA,CAAE,EAAE,CAAC,CAAA,EAAA,EAAKT,CAAM,CAAA,WAAA,EAAcS,CAAAA,CAAE,QAAQ,CAAA,EAAG6D,CAAI,CAAA,CAAE,EAC3E,CAEA,OAAOjG,CAAAA,CAAM,IAAA,CAAK;AAAA,CAAI,CACxB,CAEA,SAASkG,EAAAA,CACPC,CAAAA,CACA1D,CAAAA,CAIQ,CACR,IAAMzC,CAAAA,CAAkB,EAAC,CAGzB,GAFAA,CAAAA,CAAM,IAAA,CAAK7F,CAAAA,CAAG,IAAA,CAAK,YAAY,CAAC,CAAA,CAE5BgM,CAAAA,CAAa,MAAA,GAAW,CAAA,CAC1B,OAAAnG,CAAAA,CAAM,IAAA,CAAK,UAAU,CAAA,CAEdA,CAAAA,CAAM,IAAA,CAAK;AAAA,CAAI,EAGxB,IAAA,IAAWoG,CAAAA,IAAOD,EAAc,CAC9B,IAAMxE,EAASc,CAAAA,CAAU2D,CAAAA,CAAI,EAAE,CAAA,CACzBC,CAAAA,CAAW1E,EACb2E,EAAAA,CAAoB3E,CAAAA,CAAO,MAAOA,CAAAA,CAAO,KAAA,CAAOA,EAAO,QAAQ,CAAA,CAC/DxH,EAAG,GAAA,CAAI,MAAM,EACjB6F,CAAAA,CAAM,IAAA,CAAK,KAAK7F,CAAAA,CAAG,IAAA,CAAKiM,EAAI,EAAE,CAAC,WAAMA,CAAAA,CAAI,WAAW,KAAKC,CAAQ,CAAA,CAAE,EACrE,CAEA,OAAOrG,EAAM,IAAA,CAAK;AAAA,CAAI,CACxB,CAEA,SAASuG,EAAAA,CACPC,EAKQ,CACR,IAAMxG,CAAAA,CAAkB,EAAC,CAGzB,GAFAA,CAAAA,CAAM,IAAA,CAAK7F,EAAG,IAAA,CAAK,qBAAqB,CAAC,CAAA,CAErCqM,CAAAA,CAAM,MAAA,GAAW,CAAA,CACnB,OAAAxG,EAAM,IAAA,CAAK,CAAA,EAAA,EAAK7F,CAAAA,CAAG,KAAA,CAAM,wBAAwB,CAAC,CAAA,CAAE,CAAA,CAE7C6F,EAAM,IAAA,CAAK;AAAA,CAAI,CAAA,CAGxB,IAAA,IAAWyB,CAAAA,IAAK+E,CAAAA,CACdxG,CAAAA,CAAM,IAAA,CACJ,CAAA,EAAA,EAAK7F,CAAAA,CAAG,MAAA,CAAOsH,CAAAA,CAAE,WAAA,CAAY,IAAI,CAAC,CAAA,MAAA,EAAStH,CAAAA,CAAG,GAAA,CAAIsH,CAAAA,CAAE,EAAE,CAAC,CAAA,QAAA,EAAWtH,CAAAA,CAAG,GAAA,CAAIsH,CAAAA,CAAE,cAAc,CAAC,CAAA,CAC5F,CAAA,CAGF,OAAOzB,EAAM,IAAA,CAAK;AAAA,CAAI,CACxB,CAEA,SAASyG,EAAAA,CACPC,EACQ,CACR,IAAM1G,CAAAA,CAAkB,EAAC,CAGzB,GAFAA,CAAAA,CAAM,IAAA,CAAK7F,EAAG,IAAA,CAAK,WAAW,CAAC,CAAA,CAE3BuM,CAAAA,CAAS,MAAA,GAAW,CAAA,CACtB,OAAA1G,EAAM,IAAA,CAAK,CAAA,EAAA,EAAK7F,CAAAA,CAAG,KAAA,CAAM,QAAQ,CAAC,CAAA,CAAE,CAAA,CAE7B6F,EAAM,IAAA,CAAK;AAAA,CAAI,EAGxB,IAAM2G,CAAAA,CAAM,KAAK,GAAA,EAAI,CACrB,QAAWC,CAAAA,IAAOF,CAAAA,CAAU,CAC1B,IAAMG,EAAUF,CAAAA,CAAMC,CAAAA,CAAI,UAC1B5G,CAAAA,CAAM,IAAA,CACJ,KAAK7F,CAAAA,CAAG,IAAA,CAAKyM,CAAAA,CAAI,UAAU,CAAC,CAAA,YAAA,EAAUzM,CAAAA,CAAG,IAAIyM,CAAAA,CAAI,EAAE,CAAC,CAAA,EAAA,EAAKzM,CAAAA,CAAG,OAAO,CAAA,EAAG0M,CAAO,IAAI,CAAC,CAAA,CACpF,EACF,CAEA,OAAO7G,EAAM,IAAA,CAAK;AAAA,CAAI,CACxB,CAEA,SAASsG,EAAAA,CACP1E,EACAkF,CAAAA,CACAC,CAAAA,CACQ,CACR,IAAMjF,CAAAA,CAAMiF,CAAAA,GAAa,MAAA,CAAY,CAAA,CAAA,EAAIA,CAAQ,CAAA,EAAA,CAAA,CAAO,EAAA,CAExD,OAAQnF,CAAAA,EACN,KAAK,UAAA,CACH,OAAOzH,EAAG,KAAA,CAAM,CAAA,QAAA,EAAW2H,CAAG,CAAA,CAAE,CAAA,CAClC,KAAK,SAAA,CACH,OAAO3H,EAAG,GAAA,CAAI,CAAA,OAAA,EAAU2H,CAAG,CAAA,EAAGgF,CAAAA,CAAQ,CAAA,QAAA,EAAMA,CAAK,CAAA,CAAA,CAAK,EAAE,CAAA,CAAE,CAAA,CAC5D,KAAK,UAAA,CACH,OAAO3M,CAAAA,CAAG,MAAA,CAAO,UAAU,EAC7B,KAAK,WAAA,CACH,OAAOA,CAAAA,CAAG,GAAA,CAAI,WAAW,CAAA,CAC3B,QACE,OAAOA,CAAAA,CAAG,GAAA,CAAIyH,CAAK,CACvB,CACF,CAEA,SAASkE,EAAAA,CAAYF,EAAwB,CAC3C,OAAIA,CAAAA,GAAU,IAAA,CACLzL,CAAAA,CAAG,GAAA,CAAI,MAAM,CAAA,CAElByL,IAAU,MAAA,CACLzL,CAAAA,CAAG,GAAA,CAAI,WAAW,CAAA,CAEvB,OAAOyL,CAAAA,EAAU,QAAA,CACZA,EAAM,MAAA,CAAS,EAAA,CAAK,CAAA,CAAA,EAAIA,CAAAA,CAAM,KAAA,CAAM,CAAA,CAAG,EAAE,CAAC,OAAS,CAAA,CAAA,EAAIA,CAAK,CAAA,CAAA,CAAA,CAEjE,OAAOA,CAAAA,EAAU,QAAA,EAAY,OAAOA,CAAAA,EAAU,UACzC,MAAA,CAAOA,CAAK,CAAA,CAEjB,KAAA,CAAM,OAAA,CAAQA,CAAK,CAAA,CACd,CAAA,CAAA,EAAIA,EAAM,MAAM,CAAA,OAAA,CAAA,CAGlB,IAAA,CAAK,SAAA,CAAUA,CAAK,CAAA,CAAE,KAAA,CAAM,CAAA,CAAG,EAAE,CAC1C,CAMA,SAASoB,EAAAA,CAAazF,CAAAA,CAIT,CACX,IAAM0F,CAAAA,CAAqB,EAAC,CAMT,IAAI,GAAA,CAAI1F,CAAAA,CAAW,MAAM,GAAA,CAAKE,CAAAA,EAAMA,CAAAA,CAAE,WAAA,CAAY,IAAI,CAAC,CAAA,CACpD,IAAI,GAAA,CACxBF,CAAAA,CAAW,YAAA,CAAa,GAAA,CAAKU,CAAAA,EAAMA,CAAAA,CAAE,WAAW,CAClD,EAGA,IAAA,IAAWmE,CAAAA,IAAO7E,CAAAA,CAAW,YAAA,CACvB6E,CAAAA,CAAI,WAAA,CAMV,IAAA,IAAW3E,CAAAA,IAAKF,EAAW,KAAA,CACLA,CAAAA,CAAW,YAAA,CAAa,IAAA,CACzCU,CAAAA,EACCA,CAAAA,CAAE,WAAA,GAAgBR,CAAAA,CAAE,YAAY,IAAA,EAAQQ,CAAAA,CAAE,WAAA,GAAgB,aAC9D,CAAA,EAEEgF,CAAAA,CAAS,IAAA,CAAK,CAAA,kCAAA,EAAqCxF,EAAE,WAAA,CAAY,IAAI,CAAA,CAAA,CAAG,CAAA,CAI5E,OAAOwF,CACT,CAMA,eAAsBC,GAAepN,CAAAA,CAAgB,CACnD,GAAM,CAAE,QAAA,CAAAc,CAAAA,CAAU,IAAA,CAAAb,CAAK,EAAIF,EAAAA,CAAUC,CAAI,CAAA,CAEpCc,CAAAA,GACH,OAAA,CAAQ,KAAA,CAAM,4DAA4D,CAAA,CAC1E,QAAQ,IAAA,CAAK,CAAC,CAAA,CAAA,CAGhB,IAAMuC,CAAAA,CAAS,MAAMtB,CAAAA,CAAWjB,CAAQ,EAEnCuC,CAAAA,CAAO,SAAA,EACVA,CAAAA,CAAO,KAAA,EAAM,CAGf,IAAMoE,CAAAA,CAAapE,CAAAA,CAAO,SAAQ,CAElC,GAAIpD,CAAAA,CAAK,IAAA,CAAM,CAEb,IAAM+J,CAAAA,CAAoC,GAC1C,GAAI3G,CAAAA,CAAO,KAAA,CACT,IAAA,IAAWlB,CAAAA,IAAO,MAAA,CAAO,IAAA,CAAKkB,CAAAA,CAAO,KAAK,CAAA,CACxC,GAAI,CACF2G,CAAAA,CAAS7H,CAAG,CAAA,CAAIkB,CAAAA,CAAO,KAAA,CAAMlB,CAAG,EAClC,CAAA,KAAQ,CACN6H,CAAAA,CAAS7H,CAAG,CAAA,CAAI,kBAClB,CAIJ,QAAQ,GAAA,CACN,IAAA,CAAK,SAAA,CACH,CACE,KAAA,CAAO6H,CAAAA,CACP,GAAGvC,CACL,EACA,IAAA,CACA,CACF,CACF,CAAA,CAEApE,CAAAA,CAAO,IAAA,EAAK,CAEZ,MACF,CAGA,OAAA,CAAQ,GAAA,EAAI,CACZ,OAAA,CAAQ,GAAA,CAAIhD,CAAAA,CAAG,IAAA,CAAKA,CAAAA,CAAG,KAAK,6BAA6B,CAAC,CAAC,CAAA,CAC3D,OAAA,CAAQ,GAAA,CAAIA,CAAAA,CAAG,GAAA,CAAI,SAAI,MAAA,CAAO,EAAE,CAAC,CAAC,CAAA,CAClC,OAAA,CAAQ,GAAA,EAAI,CAGZ,IAAM2J,CAAAA,CAAoC,EAAC,CAC3C,GAAI3G,CAAAA,CAAO,KAAA,CACT,IAAA,IAAWlB,CAAAA,IAAO,OAAO,IAAA,CAAKkB,CAAAA,CAAO,KAAK,CAAA,CACxC,GAAI,CACF2G,CAAAA,CAAS7H,CAAG,EAAIkB,CAAAA,CAAO,KAAA,CAAMlB,CAAG,EAClC,CAAA,KAAQ,CACN6H,CAAAA,CAAS7H,CAAG,EAAI,kBAClB,CAGJ,OAAA,CAAQ,GAAA,CAAIyJ,EAAAA,CAAY5B,CAAQ,CAAC,CAAA,CACjC,QAAQ,GAAA,EAAI,CAGZ,OAAA,CAAQ,GAAA,CAAIiC,EAAAA,CAAkBxE,CAAAA,CAAW,WAAW,CAAC,EACrD,OAAA,CAAQ,GAAA,EAAI,CAGZ,OAAA,CAAQ,GAAA,CACN2E,EAAAA,CAAmB3E,CAAAA,CAAW,YAAA,CAAcA,EAAW,SAAS,CAClE,CAAA,CACA,OAAA,CAAQ,GAAA,EAAI,CAGZ,OAAA,CAAQ,GAAA,CAAIgF,GAAYhF,CAAAA,CAAW,KAAK,CAAC,CAAA,CACzC,OAAA,CAAQ,GAAA,EAAI,CAGRA,CAAAA,CAAW,SAAS,MAAA,CAAS,CAAA,GAC/B,OAAA,CAAQ,GAAA,CAAIkF,EAAAA,CAAelF,CAAAA,CAAW,QAAQ,CAAC,EAC/C,OAAA,CAAQ,GAAA,EAAI,CAAA,CAId,IAAM0F,CAAAA,CAAWD,EAAAA,CAAazF,CAAU,CAAA,CACxC,GAAI0F,CAAAA,CAAS,MAAA,CAAS,CAAA,CAAG,CACvB,OAAA,CAAQ,GAAA,CAAI9M,CAAAA,CAAG,IAAA,CAAKA,EAAG,MAAA,CAAO,WAAW,CAAC,CAAC,CAAA,CAC3C,IAAA,IAAWgN,CAAAA,IAAKF,CAAAA,CACd,QAAQ,GAAA,CAAI,CAAA,EAAA,EAAK9M,CAAAA,CAAG,MAAA,CAAO,QAAG,CAAC,CAAA,CAAA,EAAIgN,CAAC,EAAE,CAAA,CAExC,OAAA,CAAQ,GAAA,GACV,CAEAhK,CAAAA,CAAO,IAAA,GACT,CClVA,SAAStD,EAAAA,CAAUC,CAAAA,CAA4B,CAC7C,IAAMC,CAAAA,CAAmB,CACvB,KAAM,EAAC,CACP,OAAA,CAAS,KAAA,CACT,GAAA,CAAK,OAAA,CAAQ,GAAA,EACf,EAEA,IAAA,IAASC,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAIF,CAAAA,CAAK,MAAA,CAAQE,CAAAA,EAAAA,CAG/B,OAFYF,EAAKE,CAAC,CAAA,EAGhB,KAAK,QAAA,CAAU,CACb,IAAMC,CAAAA,CAAMH,EAAK,EAAEE,CAAC,CAAA,CAChBC,CAAAA,GACFF,CAAAA,CAAK,IAAA,CAAOE,CAAAA,CAAI,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAKU,CAAAA,EAAMA,CAAAA,CAAE,IAAA,EAAM,CAAA,CAAA,CAEhD,KACF,CACA,KAAK,WAAA,CACHZ,CAAAA,CAAK,OAAA,CAAU,IAAA,CACf,MACF,KAAK,OAAA,CAAS,CACZ,IAAME,CAAAA,CAAMH,CAAAA,CAAK,EAAEE,CAAC,CAAA,CAChBC,CAAAA,GACFF,CAAAA,CAAK,IAAME,CAAAA,CAAAA,CAEb,KACF,CACF,CAGF,OAAOF,CACT,CAQA,IAAMqN,GAA0B,CAC9B,QAAA,CACA,QAAA,CACA,aAAA,CACA,WAAA,CACA,SACF,CAAA,CAEA,SAASC,GAAe9K,CAAAA,CAAc+K,CAAAA,CAA6B,CACjE,IAAMvC,CAAAA,CAAYD,EAAAA,CAAYvI,CAAI,CAAA,CAC5BgL,EAAiBD,CAAAA,CAAS,QAAA,CAAS,aAAa,CAAA,CAChDE,CAAAA,CAAeF,CAAAA,CAAS,QAAA,CAAS,WAAW,EAI9CG,CAAAA,CAAO,CAAA,SAAA,EAFK,CAAC,mBAAA,CAAqB,cAAA,CAAgB,GAAG,CAAA,CAE1B,IAAA,CAAK,IAAI,CAAC,CAAA;;AAAA,CAAA,CAGzC,OAAAA,CAAAA,EAAQ,CAAA;AAAA,CAAA,CACRA,CAAAA,EAAQ,CAAA;AAAA,CAAA,CACRA,CAAAA,EAAQ,CAAA;AAAA,CAAA,CACRA,CAAAA,EAAQ,CAAA;AAAA,CAAA,CACRA,CAAAA,EAAQ,CAAA;AAAA,CAAA,CAEJH,CAAAA,CAAS,QAAA,CAAS,QAAQ,CAAA,GAC5BG,CAAAA,EAAQ,CAAA;AAAA,CAAA,CACRA,CAAAA,EAAQ,CAAA;AAAA,CAAA,CACRA,CAAAA,EAAQ,CAAA;AAAA,CAAA,CACRA,CAAAA,EAAQ,CAAA;AAAA,CAAA,CAAA,CAGNH,CAAAA,CAAS,QAAA,CAAS,QAAQ,CAAA,GAC5BG,CAAAA,EAAQ,CAAA;AAAA,CAAA,CACRA,CAAAA,EAAQ,CAAA;AAAA,CAAA,CACRA,CAAAA,EAAQ,CAAA;AAAA,CAAA,CACRA,CAAAA,EAAQ,CAAA;AAAA,CAAA,CAAA,CAAA,CAGNF,CAAAA,EAAkBC,KACpBC,CAAAA,EAAQ,CAAA;AAAA,CAAA,CACRA,CAAAA,EAAQ,CAAA;AAAA,CAAA,CACRA,CAAAA,EAAQ,CAAA;AAAA,CAAA,CACRA,CAAAA,EAAQ,CAAA;AAAA,CAAA,CAAA,CAGVA,CAAAA,EAAQ,CAAA;;AAAA,CAAA,CAGRA,CAAAA,EAAQ,CAAA,aAAA,EAAgB1C,CAAS,CAAA,iBAAA,EAAoBxI,CAAI,CAAA;AAAA,CAAA,CACzDkL,CAAAA,EAAQ,CAAA;;AAAA,CAAA,CAERA,CAAAA,EAAQ,CAAA;AAAA,CAAA,CACRA,CAAAA,EAAQ,CAAA;AAAA,CAAA,CACRA,CAAAA,EAAQ,CAAA;AAAA,CAAA,CAEJH,CAAAA,CAAS,QAAA,CAAS,QAAQ,CAAA,GAC5BG,CAAAA,EAAQ;AAAA;AAAA,CAAA,CACRA,CAAAA,EAAQ,CAAA;AAAA,CAAA,CACRA,CAAAA,EAAQ,CAAA;AAAA,CAAA,CAAA,CAGNH,CAAAA,CAAS,QAAA,CAAS,QAAQ,CAAA,GAC5BG,CAAAA,EAAQ;AAAA;AAAA,CAAA,CACRA,CAAAA,EAAQ,CAAA;AAAA,CAAA,CACRA,CAAAA,EAAQ,CAAA;AAAA,CAAA,CACRA,CAAAA,EAAQ,CAAA;AAAA,CAAA,CACRA,CAAAA,EAAQ,CAAA;AAAA,CAAA,CAAA,CAGNF,IACFE,CAAAA,EAAQ;AAAA;AAAA,CAAA,CACRA,CAAAA,EAAQ,CAAA;AAAA,CAAA,CACRA,CAAAA,EAAQ,CAAA;AAAA,CAAA,CACRA,CAAAA,EAAQ,CAAA;AAAA,CAAA,CACRA,CAAAA,EAAQ,CAAA;AAAA,CAAA,CACRA,CAAAA,EAAQ,CAAA;AAAA,CAAA,CACRA,CAAAA,EAAQ,CAAA;AAAA,CAAA,CACRA,CAAAA,EAAQ,CAAA;AAAA,CAAA,CACRA,CAAAA,EAAQ,CAAA;AAAA,CAAA,CACRA,CAAAA,EAAQ,CAAA;AAAA,CAAA,CAAA,CAGND,IACFC,CAAAA,EAAQ;AAAA;AAAA,CAAA,CACRA,CAAAA,EAAQ,CAAA;AAAA,CAAA,CACRA,CAAAA,EAAQ,CAAA;AAAA,CAAA,CACRA,CAAAA,EAAQ,CAAA;AAAA,CAAA,CACRA,CAAAA,EAAQ,CAAA;AAAA,CAAA,CACRA,CAAAA,EAAQ,CAAA;AAAA,CAAA,CACRA,CAAAA,EAAQ,CAAA;AAAA,CAAA,CACRA,CAAAA,EAAQ,CAAA;AAAA,CAAA,CACRA,CAAAA,EAAQ,CAAA;AAAA,CAAA,CAAA,CAGNH,CAAAA,CAAS,QAAA,CAAS,SAAS,CAAA,GAC7BG,CAAAA,EAAQ;AAAA;AAAA,CAAA,CACRA,CAAAA,EAAQ,CAAA;AAAA,CAAA,CACRA,CAAAA,EAAQ,CAAA;AAAA,CAAA,CACRA,CAAAA,EAAQ,CAAA;AAAA,CAAA,CACRA,CAAAA,EAAQ,CAAA;AAAA,CAAA,CACRA,CAAAA,EAAQ,4EACRA,CAAAA,EAAQ,CAAA;AAAA,CAAA,CACRA,CAAAA,EAAQ,CAAA;AAAA,CAAA,CACRA,CAAAA,EAAQ,CAAA;AAAA,CAAA,CACRA,CAAAA,EAAQ,CAAA;AAAA,CAAA,CAAA,CAGVA,CAAAA,EAAQ,CAAA;AAAA,CAAA,CAEDA,CACT,CAMA,SAASC,EAAAA,CAAqBnL,CAAAA,CAAsB,CAClD,IAAMwI,CAAAA,CAAYD,EAAAA,CAAYvI,CAAI,CAAA,CAElC,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA,aAAA,EA2CMwI,CAAS,oBAAoBxI,CAAI,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA,UAAA,EAsFpCwI,CAAS,CAAA;AAAA;AAAA,CAGrB,CAMA,SAASD,EAAAA,CAAYvI,CAAAA,CAAsB,CACzC,OAAOA,CAAAA,CAAK,OAAA,CAAQ,WAAA,CAAa,CAACyI,CAAAA,CAAG5C,CAAAA,GAAMA,CAAAA,CAAE,WAAA,EAAa,CAC5D,CAEA,SAAStH,EAAAA,CAAUF,EAAkBtC,CAAAA,CAAiB,CACpD,IAAMI,CAAAA,CAAME,QAAQgC,CAAQ,CAAA,CACvBpD,UAAAA,CAAWkB,CAAG,GACjBsC,SAAAA,CAAUtC,CAAAA,CAAK,CAAE,SAAA,CAAW,IAAK,CAAC,CAAA,CAEpCuC,aAAAA,CAAcL,CAAAA,CAAUtC,CAAAA,CAAS,OAAO,EAC1C,CAEA,SAASqP,EAAAA,CAAejP,CAAAA,CAAqB,CAC3C,OAAOjB,KAAKiB,CAAAA,CAAK,KAAK,CACxB,CAMA,eAAsBkP,EAAAA,CAAiBrL,CAAAA,CAAczC,CAAAA,CAAgB,CACnE,IAAMC,CAAAA,CAAOF,EAAAA,CAAUC,CAAI,CAAA,CAAA,CAEvB,CAACyC,CAAAA,EAAQ,CAAC,mBAAA,CAAoB,IAAA,CAAKA,CAAI,CAAA,IACzC,OAAA,CAAQ,KAAA,CACN,CAAA,qBAAA,EAAwBA,GAAQ,QAAQ;AAAA,sEAAA,CAE1C,CAAA,CACA,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,CAAA,CAGhB,IAAI+K,CAAAA,CAEAvN,CAAAA,CAAK,OAAA,CACPuN,CAAAA,CAAW,EAAC,CACHvN,EAAK,IAAA,CAAK,MAAA,CAAS,CAAA,CAC5BuN,CAAAA,CAAWvN,CAAAA,CAAK,IAAA,CAAK,MAAA,CAAQY,CAAAA,EAC3ByM,EAAAA,CAAa,QAAA,CAASzM,CAAY,CACpC,CAAA,CAEA2M,CAAAA,CAAWF,EAAAA,CAGb,IAAM/M,EAAYsN,EAAAA,CAAe5N,CAAAA,CAAK,GAAG,CAAA,CACnCa,CAAAA,CAAWnD,IAAAA,CAAK4C,CAAAA,CAAW,CAAA,EAAGkC,CAAI,CAAA,GAAA,CAAK,CAAA,CAEzC/E,UAAAA,CAAWoD,CAAQ,CAAA,GACrB,OAAA,CAAQ,KAAA,CAAM,wBAAwBL,QAAAA,CAASR,CAAAA,CAAK,GAAA,CAAKa,CAAQ,CAAC,CAAA,CAAE,CAAA,CACpE,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,CAAA,CAGhB,IAAMtC,CAAAA,CAAU+O,EAAAA,CAAe9K,CAAAA,CAAM+K,CAAQ,EAC7CxM,EAAAA,CAAUF,CAAAA,CAAUtC,CAAO,CAAA,CAE3B,IAAM8I,CAAAA,CAAM7G,QAAAA,CAASR,CAAAA,CAAK,GAAA,CAAKa,CAAQ,CAAA,CACvC,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAGT,CAAAA,CAAG,KAAA,CAAM,SAAS,CAAC,CAAA,CAAA,EAAIA,CAAAA,CAAG,GAAA,CAAIiH,CAAG,CAAC,CAAA,CAAE,CAAA,CAE/CkG,CAAAA,CAAS,MAAA,GAAW,CAAA,CACtB,OAAA,CAAQ,GAAA,CAAInN,CAAAA,CAAG,GAAA,CAAI,uCAAuC,CAAC,CAAA,CAE3D,OAAA,CAAQ,GAAA,CAAIA,CAAAA,CAAG,GAAA,CAAI,CAAA,YAAA,EAAemN,CAAAA,CAAS,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAC,EAE5D,CAEA,eAAsBO,EAAAA,CAAuBtL,EAAczC,CAAAA,CAAgB,CACzE,IAAMC,CAAAA,CAAOF,EAAAA,CAAUC,CAAI,CAAA,CAAA,CAEvB,CAACyC,GAAQ,CAAC,mBAAA,CAAoB,IAAA,CAAKA,CAAI,CAAA,IACzC,OAAA,CAAQ,KAAA,CACN,CAAA,2BAAA,EAA8BA,GAAQ,QAAQ;AAAA,sEAAA,CAEhD,EACA,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,CAAA,CAGhB,IAAMlC,CAAAA,CAAYsN,EAAAA,CAAe5N,CAAAA,CAAK,GAAG,EACnCa,CAAAA,CAAWnD,IAAAA,CAAK4C,EAAW,CAAA,EAAGkC,CAAI,KAAK,CAAA,CAEzC/E,UAAAA,CAAWoD,CAAQ,CAAA,GACrB,QAAQ,KAAA,CAAM,CAAA,qBAAA,EAAwBL,SAASR,CAAAA,CAAK,GAAA,CAAKa,CAAQ,CAAC,CAAA,CAAE,CAAA,CACpE,OAAA,CAAQ,KAAK,CAAC,CAAA,CAAA,CAGhB,IAAMtC,CAAAA,CAAUoP,EAAAA,CAAqBnL,CAAI,CAAA,CACzCzB,EAAAA,CAAUF,CAAAA,CAAUtC,CAAO,EAE3B,IAAM8I,CAAAA,CAAM7G,QAAAA,CAASR,CAAAA,CAAK,IAAKa,CAAQ,CAAA,CACvC,OAAA,CAAQ,GAAA,CAAI,GAAGT,CAAAA,CAAG,KAAA,CAAM,SAAS,CAAC,CAAA,CAAA,EAAIA,EAAG,GAAA,CAAIiH,CAAG,CAAC,CAAA,CAAE,EACnD,OAAA,CAAQ,GAAA,CACNjH,EAAG,GAAA,CAAI,0DAA0D,CACnE,EACF,CC1YA,IAAO2N,EAAAA,CAAQ,OAAO,QAAY,GAAA,EAChC,OAAA,CAAQ,GAAA,EAAK,QAAA,GAAa,aC4GsB,MAAA,CAAO,MAAA,CACvD,IAAI,GAAA,CAAI,CAAC,YAAa,aAAA,CAAe,WAAW,CAAC,CACnD,ECrEO,IAAMC,CAAAA,CAA2C,IAAI,GAAA,CAAY,CACtE,MACA,KAAA,CACA,KAAA,CACA,OACA,SAAA,CACA,KAAA,CACA,MAAA,CACA,KAAA,CACA,OACA,UAAA,CACA,UAAA,CACA,cACA,WAAA,CACA,WAAA,CACA,UACF,CAAC,CAAA,CAOYC,EAAAA,CAA6C,IAAI,IAAY,CACxE,MAAA,CACA,MAAA,CACA,MACF,CAAC,CAAA,CC3CYC,EAAAA,CAAsB,EAAA,CASnC,SAASC,EAAcC,CAAAA,CAA0C,CAC/D,OAAI,OAAOA,CAAAA,EAAM,UAAYA,CAAAA,GAAM,IAAA,EAAQ,KAAA,CAAM,OAAA,CAAQA,CAAC,CAAA,CACjD,KAAA,CAGF,EAAEA,CAAAA,YAAa,IAAA,CAAA,EAAS,EAAEA,CAAAA,YAAa,MAAA,CAChD,CAMA,SAASC,GAAoBD,CAAAA,CAA0C,CACrE,GAAI,OAAOA,CAAAA,EAAM,UAAYA,CAAAA,GAAM,IAAA,EAAQ,KAAA,CAAM,OAAA,CAAQA,CAAC,CAAA,CACxD,OAAO,MAAA,CAET,IAAME,EAAQ,MAAA,CAAO,cAAA,CAAeF,CAAC,CAAA,CAErC,OAAOE,CAAAA,GAAU,MAAA,CAAO,WAAaA,CAAAA,GAAU,IACjD,CAQA,SAASC,EAAAA,CAAiBH,CAAAA,CAA0C,CAClE,GAAI,CAACD,CAAAA,CAAcC,CAAC,CAAA,CAClB,OAAO,OAGT,IAAII,CAAAA,CAAQ,CAAA,CACRC,CAAAA,CAAe,MACnB,IAAA,IAAWjK,CAAAA,IAAK,OAAO,IAAA,CAAK4J,CAAC,EAAG,CAC9B,GAAI5J,CAAAA,CAAE,UAAA,CAAW,GAAG,CAAA,CAClBiK,CAAAA,CAAe,IAAA,CACVT,CAAAA,CAAoB,IAAIxJ,CAAC,CAAA,EAC5BkK,EAAAA,CACE,CAAA,6BAAA,EAAgClK,CAAC,CAAA,6CAAA,EAA2C,CAAC,GAAGwJ,CAAmB,CAAA,CAAE,KAAK,IAAI,CAAC,CAAA,CACjH,CAAA,CAAA,KAAA,GAEOS,GAAgBD,CAAAA,GAAU,CAAA,CAInC,OAAO,MAAA,CAETA,CAAAA,GACF,CAEA,OAAKC,CAAAA,CAMED,CAAAA,CAAQ,CAAA,CALN,KAMX,CAcO,SAASG,GAAYP,CAAAA,CAAqB,CAC/C,OAAIA,CAAAA,GAAM,IAAA,CACD,KAAA,CAEL,KAAA,CAAM,QAAQA,CAAC,CAAA,CACVA,CAAAA,CAAE,KAAA,CACN/F,GACCgG,EAAAA,CAAoBhG,CAAC,CAAA,EACrB,MAAA,GAAWA,GACX,IAAA,GAASA,CACb,EAGKgG,EAAAA,CAAoBD,CAAC,CAC9B,CAyEO,SAASQ,EAAAA,CACdC,CAAAA,CACAC,EACAC,CAAAA,CAAO,EAAA,CACPC,EAAwB,IAAI,OAAA,CAC5BC,EAAQ,CAAA,CACF,CACN,GAAIA,CAAAA,CAAQf,GAAqB,CAC3BH,EAAAA,EACF,QAAQ,IAAA,CACN,CAAA,mCAAA,EAAsCG,EAAmB,CAAA,qIAAA,CAC3D,CAAA,CAEFY,CAAAA,CAAQ,IAAA,GAAO,OAAO,CAAA,CAEtB,MACF,CAGA,GAAI,MAAM,OAAA,CAAQD,CAAI,CAAA,CAAG,CACvBA,EAAK,OAAA,CAAQ,CAACK,EAAQjP,CAAAA,GAAM,CAC1B,GAAI,CAACkO,CAAAA,CAAce,CAAM,CAAA,CACvB,OAEF,IAAM7G,CAAAA,CAAI6G,EACV,GAAI,OAAO7G,EAAE,IAAA,EAAS,QAAA,EAAY,OAAOA,CAAAA,CAAE,IAAO,QAAA,CAAU,CAC1D,IAAM8G,CAAAA,CAAaJ,CAAAA,CAAO,GAAGA,CAAI,CAAA,CAAA,EAAI9O,CAAC,CAAA,CAAA,CAAA,CAAM,IAAIA,CAAC,CAAA,CAAA,CAAA,CACjD6O,CAAAA,CAAQ,QAAA,GACNC,EAAO,CAAA,EAAGA,CAAI,CAAA,CAAA,EAAI1G,CAAAA,CAAE,IAAI,CAAA,CAAA,CAAKA,CAAAA,CAAE,KAC/BA,CAAAA,CAAE,EAAA,CACFA,EAAE,KAAA,CACF,CAAA,EAAG8G,CAAU,CAAA,MAAA,CACf,EACF,CACF,CAAC,EAED,MACF,CAEA,GAAI,CAAChB,CAAAA,CAAcU,CAAI,CAAA,CACrB,OAEF,GAAIG,CAAAA,CAAK,IAAIH,CAAI,CAAA,CAAG,CACdd,EAAAA,EACF,OAAA,CAAQ,IAAA,CAAK,kDAAkD,EAEjEe,CAAAA,CAAQ,IAAA,GAAO,OAAO,CAAA,CAEtB,MACF,CACAE,CAAAA,CAAK,GAAA,CAAIH,CAAI,EAEb,IAAMzM,CAAAA,CAAMyM,EAGZ,IAAA,IAAWO,CAAAA,IAAQ,CAAC,MAAA,CAAQ,MAAA,CAAQ,MAAM,CAAA,CACxC,GAAIA,CAAAA,IAAQhN,CAAAA,CAAK,CAEf,GADgB0M,CAAAA,CAAQ,aAAaM,CAAI,CAAA,GACzB,KAAA,CACd,OAEF,IAAMC,CAAAA,CACJD,CAAAA,GAAS,OAAS,CAAChN,CAAAA,CAAI,IAAI,CAAA,CAAMA,CAAAA,CAAIgN,CAAI,CAAA,EAAmB,EAAA,CAC9D,IAAA,IAAWE,CAAAA,IAASD,CAAAA,CAClBT,GAAcU,CAAAA,CAAOR,CAAAA,CAASC,CAAAA,CAAMC,CAAAA,CAAMC,EAAQ,CAAC,CAAA,CAGrD,MACF,CAIF,IAAA,IAAW/M,KAAO,MAAA,CAAO,IAAA,CAAKE,CAAG,CAAA,CAAG,CAClC,IAAMmN,CAAAA,CAAYR,EAAO,CAAA,EAAGA,CAAI,IAAI7M,CAAG,CAAA,CAAA,CAAKA,CAAAA,CAE5C,GAAIA,EAAI,UAAA,CAAW,GAAG,EAAG,CAGvB4M,CAAAA,CAAQ,mBAAmB5M,CAAAA,CAAKqN,CAAS,CAAA,CACzC,QACF,CAEA,IAAM1D,CAAAA,CAAQzJ,CAAAA,CAAIF,CAAG,EAErB,GAAIqM,EAAAA,CAAiB1C,CAAK,CAAA,CAAG,CAC3B,IAAM2D,CAAAA,CAAQ3D,EACd,IAAA,IAAW4D,CAAAA,IAAM,OAAO,IAAA,CAAKD,CAAK,CAAA,CAChCV,CAAAA,CAAQ,WAAWS,CAAAA,CAAWE,CAAAA,CAAID,EAAMC,CAAE,CAAA,CAAG,GAAGF,CAAS,CAAA,CAAA,EAAIE,CAAE,CAAA,CAAE,EAEnE,QACF,CAMA,GAAIpB,EAAAA,CAAoBxC,CAAK,EAAG,CAE9B,GADgBiD,CAAAA,CAAQ,MAAA,GAAS5M,CAAG,CAAA,GACpB,KAAA,CACd,SAEF0M,EAAAA,CAAc/C,EAAOiD,CAAAA,CAASS,CAAAA,CAAWP,CAAAA,CAAMC,CAAAA,CAAQ,CAAC,CAAA,CACxD,QACF,CAGAH,CAAAA,CAAQ,OAAA,GAAUS,EAAW1D,CAAK,EACpC,CACF,CA8GO,SAAS6D,EAAAA,CAAkBb,CAAAA,CAAeE,EAAO,EAAA,CAAU,CAUhE,SAASY,CAAAA,CACP9D,CAAAA,CACA+D,CAAAA,CACAZ,CAAAA,CACAC,EACM,CACN,GAAI,OAAOpD,CAAAA,EAAU,QAAA,CACnB,MAAM,IAAI,KAAA,CACR,CAAA,kDAAA,EAAqD+D,CAAE,+DACzD,CAAA,CAEF,GAAI/D,CAAAA,YAAiB,GAAA,CACnB,MAAM,IAAI,KAAA,CACR,CAAA,+CAAA,EAAkD+D,CAAE,sEACtD,CAAA,CAEF,GAAI/D,aAAiB,GAAA,CACnB,MAAM,IAAI,KAAA,CACR,CAAA,+CAAA,EAAkD+D,CAAE,CAAA,oEAAA,CACtD,EAEF,GAAI/D,CAAAA,YAAiB,OACnB,MAAM,IAAI,MACR,CAAA,kDAAA,EAAqD+D,CAAE,CAAA,mHAAA,CACzD,CAAA,CAEF,GAAI,EAAA/D,CAAAA,GAAU,MAAQ,OAAOA,CAAAA,EAAU,WAGnC,EAAAoD,CAAAA,CAAQf,EAAAA,CAAAA,EAGR,CAAAc,EAAK,GAAA,CAAInD,CAAK,CAAA,CAKlB,CAAA,GAFAmD,CAAAA,CAAK,GAAA,CAAInD,CAAK,CAAA,CAEV,MAAM,OAAA,CAAQA,CAAK,EAAG,CACxBA,CAAAA,CAAM,QAAQ,CAACgE,CAAAA,CAAI5P,CAAAA,GAAM,CACvB0P,EAAmBE,CAAAA,CAAI,CAAA,EAAGD,CAAE,CAAA,CAAA,EAAI3P,CAAC,IAAK+O,CAAAA,CAAMC,CAAAA,CAAQ,CAAC,EACvD,CAAC,CAAA,CAED,MACF,CAEA,IAAA,IAAWzK,CAAAA,IAAK,OAAO,IAAA,CAAKqH,CAAgC,CAAA,CAC1D8D,CAAAA,CACG9D,EAAkCrH,CAAC,CAAA,CACpCoL,CAAAA,CAAK,CAAA,EAAGA,CAAE,CAAA,CAAA,EAAIpL,CAAC,CAAA,CAAA,CAAKA,CAAAA,CACpBwK,EACAC,CAAAA,CAAQ,CACV,EAAA,CAEJ,CAGA,SAASa,CAAAA,CAAajE,CAAAA,CAAgB4D,CAAAA,CAAYG,CAAAA,CAAkB,CAClE,GAAI,OAAO/D,GAAU,QAAA,CACnB,MAAM,IAAI,KAAA,CACR,CAAA,kDAAA,EAAqD+D,CAAE,CAAA,6DAAA,CACzD,EAEF,GAAI/D,CAAAA,YAAiB,IACnB,MAAM,IAAI,MACR,CAAA,+CAAA,EAAkD+D,CAAE,CAAA,oEAAA,CACtD,CAAA,CAEF,GAAI/D,CAAAA,YAAiB,GAAA,CACnB,MAAM,IAAI,MACR,CAAA,+CAAA,EAAkD+D,CAAE,CAAA,oEAAA,CACtD,CAAA,CAEF,GAAIH,CAAAA,GAAO,UAAA,EAAc,EAAE5D,CAAAA,YAAiB,MAAA,CAAA,CAC1C,MAAM,IAAI,KAAA,CACR,CAAA,oDAAA,EAAuD+D,CAAE,2BAA2B/D,CAAAA,GAAU,IAAA,CAAO,OAAS,OAAOA,CAAK,yGAC5H,CAAA,CAOF,GAAI,KAAA,CAAM,OAAA,CAAQA,CAAK,CAAA,CACrBA,CAAAA,CAAM,QAAQ,CAACgE,CAAAA,CAAI5P,IAAM,CACvB0P,CAAAA,CAAmBE,CAAAA,CAAI,CAAA,EAAGD,CAAE,CAAA,CAAA,EAAI3P,CAAC,CAAA,CAAA,CAAA,CAAK,IAAI,QAAW,CAAC,EACxD,CAAC,CAAA,CAAA,KAAA,GACQoO,GAAoBxC,CAAK,CAAA,CAClC,QAAWrH,CAAAA,IAAK,MAAA,CAAO,KAAKqH,CAAK,CAAA,CAC/B8D,CAAAA,CAAmB9D,CAAAA,CAAMrH,CAAC,CAAA,CAAG,CAAA,EAAGoL,CAAE,CAAA,CAAA,EAAIpL,CAAC,GAAI,IAAI,OAAA,CAAW,CAAC,EAGjE,CAKA,GAAIqK,CAAAA,YAAgB,IAClB,MAAM,IAAI,MACR,CAAA,0CAAA,EAA6CE,CAAAA,CAAO,CAAA,KAAA,EAAQA,CAAI,IAAM,EAAE,CAAA,mEAAA,CAC1E,CAAA,CAEF,GAAIF,aAAgB,GAAA,CAClB,MAAM,IAAI,KAAA,CACR,6CAA6CE,CAAAA,CAAO,CAAA,KAAA,EAAQA,CAAI,CAAA,CAAA,CAAA,CAAM,EAAE,qEAC1E,CAAA,CAMFH,EAAAA,CAAcC,CAAAA,CAAM,CAClB,SAASkB,CAAAA,CAAWN,CAAAA,CAAIO,EAASC,CAAAA,CAAa,CAC5CH,EAAaE,CAAAA,CAASP,CAAAA,CAAIV,CAAAA,CAAO,CAAA,EAAGA,CAAI,CAAA,CAAA,EAAIkB,CAAW,GAAKA,CAAW,EACzE,EACA,OAAA,CAAQC,CAAAA,CAAUrE,CAAAA,CAAO,CACvBiE,EAAajE,CAAAA,CAAO,EAAA,CAAIkD,CAAAA,CAAO,CAAA,EAAGA,CAAI,CAAA,CAAA,EAAImB,CAAQ,CAAA,CAAA,CAAKA,CAAQ,EACjE,CACF,CAAC,EACH,CAkBA,SAASC,IAA+B,CACtC,OAAO,CAAE,GAAA,CAAK,IAAI,OAAA,CAAW,IAAA,CAAM,CAAE,CAAA,CAAG,CAAE,EAAG,KAAA,CAAO,IAAI,GAAM,CAChE,CAEA,SAASC,EAAAA,CAAOpB,EAAqB5M,CAAAA,CAAqB,CACxD,IAAIxE,CAAAA,CAAKoR,CAAAA,CAAK,GAAA,CAAI,GAAA,CAAI5M,CAAG,CAAA,CACzB,OAAIxE,CAAAA,GAAO,MAAA,GACTA,EAAKoR,CAAAA,CAAK,IAAA,CAAK,CAAA,EAAA,CACfA,CAAAA,CAAK,IAAI,GAAA,CAAI5M,CAAAA,CAAKxE,CAAE,CAAA,CAAA,CAGfA,CACT,CAGA,SAASyS,CAAAA,CAAUzJ,CAAAA,CAAYC,CAAAA,CAAYmI,EAA+B,CACxE,GAAI,OAAO,EAAA,CAAGpI,CAAAA,CAAGC,CAAC,CAAA,CAChB,OAAO,KAAA,CAGT,GAAID,aAAa,IAAA,EAAQC,CAAAA,YAAa,KACpC,OAAOD,CAAAA,CAAE,SAAA,GAAcC,CAAAA,CAAE,OAAA,EAAA,CAG3B,GACE,OAAOD,CAAAA,EAAM,QAAA,EACb,OAAOC,GAAM,QAAA,EACbD,CAAAA,GAAM,IAAA,EACNC,CAAAA,GAAM,KAEN,OAAO,MAAA,CAGT,IAAMyJ,CAAAA,CAAQtB,CAAAA,EAAQmB,IAAAA,CAChBjO,CAAAA,CAAM,CAAA,EAAGkO,EAAAA,CAAOE,EAAO1J,CAAC,CAAC,IAAIwJ,EAAAA,CAAOE,CAAAA,CAAOzJ,CAAC,CAAC,CAAA,CAAA,CACnD,GAAIyJ,CAAAA,CAAM,MAAM,GAAA,CAAIpO,CAAG,EACrB,OAAO,KAAA,CAIT,GAFAoO,CAAAA,CAAM,KAAA,CAAM,GAAA,CAAIpO,CAAG,EAEf,KAAA,CAAM,OAAA,CAAQ0E,CAAC,CAAA,EAAK,MAAM,OAAA,CAAQC,CAAC,CAAA,CACrC,OAAI,CAAC,KAAA,CAAM,OAAA,CAAQD,CAAC,CAAA,EAAK,CAAC,MAAM,OAAA,CAAQC,CAAC,CAAA,EAAKD,CAAAA,CAAE,SAAWC,CAAAA,CAAE,MAAA,CACpD,MAGFD,CAAAA,CAAE,KAAA,CAAM,CAACwH,CAAAA,CAAGnO,CAAAA,GAAMoQ,CAAAA,CAAUjC,CAAAA,CAAGvH,EAAE5G,CAAC,CAAA,CAAGqQ,CAAK,CAAC,CAAA,CAOpD,GAAI1J,CAAAA,YAAa,GAAA,EAAOC,CAAAA,YAAa,GAAA,CAAK,CACxC,GAAI,EAAED,CAAAA,YAAa,GAAA,CAAA,EAAQ,EAAEC,CAAAA,YAAa,GAAA,CAAA,EAAQD,CAAAA,CAAE,IAAA,GAASC,EAAE,IAAA,CAC7D,OAAO,OAET,IAAM0J,CAAAA,CAAO,CAAC,GAAG1J,CAAC,CAAA,CAElB,OAAO,CAAC,GAAGD,CAAC,EAAE,KAAA,CAAOwH,CAAAA,EAAMmC,EAAK,IAAA,CAAMnD,CAAAA,EAAMiD,CAAAA,CAAUjC,CAAAA,CAAGhB,EAAGkD,CAAK,CAAC,CAAC,CACrE,CAKA,GAAI1J,CAAAA,YAAa,GAAA,EAAOC,CAAAA,YAAa,GAAA,CAAK,CACxC,GAAI,EAAED,CAAAA,YAAa,GAAA,CAAA,EAAQ,EAAEC,CAAAA,YAAa,GAAA,CAAA,EAAQD,CAAAA,CAAE,IAAA,GAASC,EAAE,IAAA,CAC7D,OAAO,OAET,IAAM2J,CAAAA,CAAW,CAAC,GAAG3J,CAAAA,CAAE,OAAA,EAAS,EAC1B4J,CAAAA,CAAO,IAAI,MAAeD,CAAAA,CAAS,MAAM,EAAE,IAAA,CAAK,KAAK,CAAA,CAC3D,IAAA,GAAW,CAACE,CAAAA,CAAIC,CAAE,IAAK/J,CAAAA,CAAG,CACxB,IAAItB,CAAAA,CAAQ,KAAA,CACZ,IAAA,IAASrF,CAAAA,CAAI,EAAGA,CAAAA,CAAIuQ,CAAAA,CAAS,MAAA,CAAQvQ,CAAAA,EAAAA,CAAK,CACxC,GAAIwQ,CAAAA,CAAKxQ,CAAC,CAAA,CACR,SAEF,GAAM,CAAC2Q,EAAIC,CAAE,CAAA,CAAIL,EAASvQ,CAAC,CAAA,CAC3B,GAAIoQ,CAAAA,CAAUK,EAAIE,CAAAA,CAAIN,CAAK,GAAKD,CAAAA,CAAUM,CAAAA,CAAIE,EAAIP,CAAK,CAAA,CAAG,CACxDG,CAAAA,CAAKxQ,CAAC,CAAA,CAAI,IAAA,CACVqF,EAAQ,IAAA,CACR,KACF,CACF,CACA,GAAI,CAACA,CAAAA,CACH,OAAO,MAEX,CAEA,OAAO,KACT,CAEA,IAAMwL,CAAAA,CAAK,MAAA,CAAO,IAAA,CAAKlK,CAAW,CAAA,CAC5BmK,CAAAA,CAAK,OAAO,IAAA,CAAKlK,CAAW,EAClC,OAAIiK,CAAAA,CAAG,MAAA,GAAWC,CAAAA,CAAG,OACZ,KAAA,CAGFD,CAAAA,CAAG,MACPtM,CAAAA,EACC,MAAA,CAAO,OAAOqC,CAAAA,CAAarC,CAAC,CAAA,EAC5B6L,CAAAA,CACGzJ,EAA8BpC,CAAC,CAAA,CAC/BqC,EAA8BrC,CAAC,CAAA,CAChC8L,CACF,CACJ,CACF,CAMA,SAASU,GAAa5C,CAAAA,CAAkD,CACtE,GAAIA,CAAAA,YAAa,KACf,OAAOA,CAAAA,CAAE,OAAA,EAAA,CAEX,GAAI,OAAOA,CAAAA,EAAM,UAAY,OAAOA,CAAAA,EAAM,UAAY,OAAOA,CAAAA,EAAM,QAAA,CACjE,OAAOA,CAIX,CAEA,SAAS6C,GACPxB,CAAAA,CACAyB,CAAAA,CACAlB,EACS,CACT,IAAMpJ,CAAAA,CAAIoK,EAAAA,CAAaE,CAAM,CAAA,CACvBrK,CAAAA,CAAImK,GAAahB,CAAO,CAAA,CAC9B,GAAIpJ,CAAAA,GAAM,MAAA,EAAaC,CAAAA,GAAM,MAAA,EAAa,OAAOD,CAAAA,EAAM,OAAOC,CAAAA,CAC5D,OAAO,OAGT,OAAQ4I,CAAAA,EACN,KAAK,MACH,OAAO7I,CAAAA,CAAIC,EACb,KAAK,MAAA,CACH,OAAOD,CAAAA,EAAKC,CAAAA,CACd,KAAK,KAAA,CACH,OAAOD,CAAAA,CAAIC,CAAAA,CACb,KAAK,MAAA,CACH,OAAOD,GAAKC,CAAAA,CACd,QACE,OAAO,MACX,CACF,CAGA,SAASsK,GACP1B,CAAAA,CACAyB,CAAAA,CACAlB,EACAoB,CAAAA,CACS,CACT,OAAQ3B,CAAAA,EACN,KAAK,KAAA,CACH,OAAOY,CAAAA,CAAUa,EAAQlB,CAAO,CAAA,CAClC,KAAK,KAAA,CACH,OAAO,CAACK,CAAAA,CAAUa,EAAQlB,CAAO,CAAA,CACnC,KAAK,KAAA,CACH,OACE,KAAA,CAAM,OAAA,CAAQA,CAAO,CAAA,EAAKA,CAAAA,CAAQ,KAAM5B,CAAAA,EAAMiC,CAAAA,CAAUa,EAAQ9C,CAAC,CAAC,CAAA,CAEtE,KAAK,OACH,OACE,KAAA,CAAM,QAAQ4B,CAAO,CAAA,EAAK,CAACA,CAAAA,CAAQ,IAAA,CAAM5B,CAAAA,EAAMiC,CAAAA,CAAUa,EAAQ9C,CAAC,CAAC,CAAA,CAEvE,KAAK,UACH,OAAO4B,CAAAA,IAAakB,CAAAA,GAAW,MAAA,CAAA,CACjC,KAAK,UAAA,CACH,OAAO,CAACb,CAAAA,CAAUa,CAAAA,CAAQE,CAAS,CAAA,CACrC,KAAK,KAAA,CACL,KAAK,OACL,KAAK,KAAA,CACL,KAAK,MAAA,CACH,OAAOH,GAAWxB,CAAAA,CAAIyB,CAAAA,CAAQlB,CAAO,CAAA,CACvC,KAAK,UAAA,CAAY,CACf,GAAI,CAAC,KAAA,CAAM,QAAQA,CAAO,CAAA,EAAKA,CAAAA,CAAQ,MAAA,GAAW,EAChD,OAAO,MAAA,CAET,IAAMqB,CAAAA,CAAKL,EAAAA,CAAahB,EAAQ,CAAC,CAAC,CAAA,CAC5BsB,CAAAA,CAAKN,GAAahB,CAAAA,CAAQ,CAAC,CAAC,CAAA,CAClC,OACEqB,IAAO,MAAA,EACPC,CAAAA,GAAO,MAAA,EACP,OAAOD,GAAO,OAAOC,CAAAA,EACrBD,EAAKC,CAAAA,EAEL5C,EAAAA,CAAQ,oDAA+C,CAAA,CAEhD,KAAA,EAIPuC,EAAAA,CAAW,MAAA,CAAQC,EAAQlB,CAAAA,CAAQ,CAAC,CAAC,CAAA,EACrCiB,EAAAA,CAAW,OAAQC,CAAAA,CAAQlB,CAAAA,CAAQ,CAAC,CAAC,CAEzC,CACA,KAAK,UAAA,CAAY,CACf,GAAI,EAAEA,CAAAA,YAAmB,MAAA,CAAA,CAKvB,MAAM,IAAI,KAAA,CACR,wHACF,EAEF,OAAI,OAAOkB,GAAW,QAAA,CACb,KAAA,CAGFlB,CAAAA,CAAQ,IAAA,CAAKkB,CAAM,CAC5B,CACA,KAAK,aAAA,CACH,OAAI,OAAOA,CAAAA,EAAW,QAAA,CACb,KAAA,CAGFA,CAAAA,CAAO,WAAW,MAAA,CAAOlB,CAAO,CAAC,CAAA,CAC1C,KAAK,YACH,OAAI,OAAOkB,CAAAA,EAAW,QAAA,CACb,MAGFA,CAAAA,CAAO,QAAA,CAAS,MAAA,CAAOlB,CAAO,CAAC,CAAA,CACxC,KAAK,WAAA,CACH,OAAI,OAAOkB,CAAAA,EAAW,QAAA,CACbA,EAAO,QAAA,CAAS,MAAA,CAAOlB,CAAO,CAAC,CAAA,CAEpC,KAAA,CAAM,OAAA,CAAQkB,CAAM,CAAA,CACfA,CAAAA,CAAO,KAAM9C,CAAAA,EAAMiC,CAAAA,CAAUjC,EAAG4B,CAAO,CAAC,CAAA,CAM7CkB,CAAAA,YAAkB,IACbA,CAAAA,CAAO,GAAA,CAAIlB,CAAO,CAAA,CAGpB,KAAA,CACT,QACE,OAAO,MACX,CACF,CAMA,SAAStB,EAAAA,CAAQ6C,CAAAA,CAAuB,CAClCxD,EAAAA,EACF,QAAQ,IAAA,CAAK,CAAA,YAAA,EAAewD,CAAO,CAAA,CAAE,EAEzC,CAEA,SAASC,GACP3F,CAAAA,CACAqF,CAAAA,CACAO,EACAxC,CAAAA,CACS,CACT,GAAIV,EAAAA,CAAiB1C,CAAK,CAAA,CAAG,CAC3B,IAAM6F,CAAAA,CAAO,MAAA,CAAO,KAAK7F,CAAK,CAAA,CAI1B6F,CAAAA,CAAK,MAAA,CAAS,GAChBhD,EAAAA,CACE,CAAA,+BAAA,EAAkCgD,EAAK,MAAM,CAAA,YAAA,EAAeA,EAAK,IAAA,CAAK,IAAI,CAAC,CAAA,+FAAA,CAC7E,EAEF,IAAA,IAAWjC,CAAAA,IAAMiC,CAAAA,CACf,GAAI,CAACP,EAAAA,CAAc1B,CAAAA,CAAmByB,CAAAA,CAAQrF,CAAAA,CAAM4D,CAAE,CAAA,CAAGgC,CAAI,EAC3D,OAAO,MAAA,CAIX,OAAO,KACT,CAGA,OAAItD,CAAAA,CAActC,CAAK,CAAA,CACd8F,CAAAA,CACL9F,EACAsC,CAAAA,CAAc+C,CAAM,EAAIA,CAAAA,CAAS,MAAA,CAAO,MAAA,CAAO,IAAI,EACnD/C,CAAAA,CAAcsD,CAAI,EAAIA,CAAAA,CAAO,MAAA,CAC7BxC,EAAQ,CACV,CAAA,CAIKoB,CAAAA,CAAUa,CAAAA,CAAQrF,CAAK,CAChC,CAcO,SAAS8F,CAAAA,CACd9C,EACAxL,CAAAA,CACAoO,CAAAA,CACAxC,CAAAA,CAAQ,CAAA,CACC,CAIT,GAAIA,CAAAA,CAAQf,GACV,OAAAQ,EAAAA,CACE,0BAA0BR,EAAmB,CAAA,qIAAA,CAC/C,CAAA,CAEO,KAAA,CAGT,GAAI,KAAA,CAAM,OAAA,CAAQW,CAAI,CAAA,CACpB,OAAOA,EAAK,KAAA,CAAOK,CAAAA,EAAW,CAC5B,GAAI,CAACf,CAAAA,CAAce,CAAM,EACvB,OAAO,MAAA,CAET,GAAM,CAAE,IAAA,CAAA0C,CAAAA,CAAM,EAAA,CAAAnC,EAAI,KAAA,CAAA5D,CAAM,CAAA,CAAIqD,CAAAA,CAM5B,OAAOiC,EAAAA,CAAc1B,CAAAA,CAAIpM,CAAAA,GAAQuO,CAAI,EAAG/F,CAAAA,CAAO4F,CAAAA,GAAOG,CAAI,CAAC,CAC7D,CAAC,CAAA,CAGH,GAAI,CAACzD,CAAAA,CAAcU,CAAI,CAAA,CACrB,OAAO,CAAA,CAAQA,CAAAA,CAIjB,GAAI,MAAA,GAAUA,CAAAA,CACZ,OAAQA,CAAAA,CAAK,KAAmB,KAAA,CAAOgD,CAAAA,EACrCF,EAAkBE,CAAAA,CAAGxO,CAAAA,CAAOoO,EAAMxC,CAAAA,CAAQ,CAAC,CAC7C,CAAA,CAEF,GAAI,MAAA,GAAUJ,CAAAA,CACZ,OAAQA,CAAAA,CAAK,KAAmB,IAAA,CAAMgD,CAAAA,EACpCF,CAAAA,CAAkBE,CAAAA,CAAGxO,EAAOoO,CAAAA,CAAMxC,CAAAA,CAAQ,CAAC,CAC7C,CAAA,CAEF,GAAI,MAAA,GAAUJ,CAAAA,CACZ,OAAO,CAAC8C,EAAkB9C,CAAAA,CAAK,IAAA,CAAMxL,EAAOoO,CAAAA,CAAMxC,CAAAA,CAAQ,CAAC,CAAA,CAI7D,IAAA,IAAW/M,CAAAA,IAAO,MAAA,CAAO,KAAK2M,CAAI,CAAA,CAAG,CACnC,GAAIb,CAAAA,CAAoB,IAAI9L,CAAG,CAAA,CAC7B,OAAAwM,EAAAA,CACE,wBAAwBxM,CAAG,CAAA,iEAAA,CAC7B,CAAA,CAEO,KAAA,CAET,GAAI,CAACsP,EAAAA,CAAU3C,CAAAA,CAAK3M,CAAG,EAAGmB,CAAAA,GAAQnB,CAAG,EAAGuP,CAAAA,GAAOvP,CAAG,EAAG+M,CAAK,CAAA,CACxD,OAAO,MAEX,CAEA,OAAO,KACT,CAkBO,SAAS6C,EAAAA,CACdjD,EACAxL,CAAAA,CACAoO,CAAAA,CACAM,CAAAA,CAAa,EAAA,CACG,CAChB,IAAMC,CAAAA,CAAsB,EAAA,CAE5B,GAAI,MAAM,OAAA,CAAQnD,CAAI,CAAA,CAAG,CACvB,QAAWK,CAAAA,IAAUL,CAAAA,CAAM,CACzB,GAAI,CAACV,CAAAA,CAAce,CAAM,CAAA,CACvB,SAEF,GAAM,CAAE,IAAA,CAAA0C,EAAM,EAAA,CAAAnC,CAAAA,CAAI,MAAA5D,CAAM,CAAA,CAAIqD,CAAAA,CAKtBgC,CAAAA,CAAS7N,IAAQuO,CAAI,CAAA,CAC3BI,EAAI,IAAA,CAAK,CACP,KAAMD,CAAAA,CAAaH,CAAAA,CACnB,EAAA,CAAAnC,CAAAA,CACA,SAAU5D,CAAAA,CACV,MAAA,CAAAqF,EACA,IAAA,CAAMC,EAAAA,CAAc1B,EAAIyB,CAAAA,CAAQrF,CAAAA,CAAO4F,CAAAA,GAAOG,CAAI,CAAC,CACrD,CAAC,EACH,CAEA,OAAOI,CACT,CAEA,GAAI,CAAC7D,EAAcU,CAAI,CAAA,CACrB,OAAOmD,CAAAA,CAGT,IAAA,IAAW9P,KAAO,CAAC,MAAA,CAAQ,MAAA,CAAQ,MAAM,EACvC,GAAIA,CAAAA,IAAO2M,EAAM,CACf,IAAMoD,EACJ/P,CAAAA,GAAQ,MAAA,CAAS,CAAC2M,CAAAA,CAAK,IAAI,CAAA,CAAKA,CAAAA,CAAK3M,CAAG,CAAA,CACpCmN,CAAAA,CAA2B,EAAA,CACjC,IAAA,IAAWC,CAAAA,IAAS2C,CAAAA,CAClB5C,EAAS,IAAA,CACP,GAAGyC,EAAAA,CAA2BxC,CAAAA,CAAOjM,EAAOoO,CAAAA,CAAMM,CAAU,CAC9D,CAAA,CAEF,IAAMG,CAAAA,CAAY7C,CAAAA,CAAS,OAAQhH,CAAAA,EAAMA,CAAAA,CAAE,IAAI,CAAA,CAAE,MAAA,CAC7C8J,CAAAA,CACJ,OAAIjQ,IAAQ,MAAA,CACViQ,CAAAA,CAAO9C,EAAS,MAAA,GAAW,CAAA,EAAK6C,IAAc7C,CAAAA,CAAS,MAAA,CAC9CnN,CAAAA,GAAQ,MAAA,CACjBiQ,EAAO9C,CAAAA,CAAS,MAAA,CAAS,GAAK6C,CAAAA,CAAY,CAAA,CAG1CC,EAAO,CAAC9C,CAAAA,CAAS,KAAA,CAAOhH,CAAAA,EAAMA,EAAE,IAAI,CAAA,CAEtC2J,CAAAA,CAAI,IAAA,CAAK,CACP,IAAA,CAAMD,CAAAA,EAAc7P,CAAAA,CACpB,EAAA,CAAIA,EACJ,QAAA,CAAU+P,CAAAA,CAAW,OACrB,MAAA,CAAQC,CAAAA,CACR,KAAAC,CAAAA,CACA,QAAA,CAAA9C,CACF,CAAC,EAEM2C,CACT,CAGF,QAAW9P,CAAAA,IAAO,MAAA,CAAO,KAAK2M,CAAI,CAAA,CAAG,CACnC,GAAIb,EAAoB,GAAA,CAAI9L,CAAG,EAC7B,SAEF,IAAM2J,EAAQgD,CAAAA,CAAK3M,CAAG,CAAA,CAChBgP,CAAAA,CAAS7N,IAAQnB,CAAG,CAAA,CACpB6M,CAAAA,CAAOgD,CAAAA,CAAa7P,EAE1B,GAAIqM,EAAAA,CAAiB1C,CAAK,CAAA,CACxB,QAAW4D,CAAAA,IAAM,MAAA,CAAO,KAAK5D,CAAK,CAAA,CAChCmG,EAAI,IAAA,CAAK,CACP,IAAA,CAAAjD,CAAAA,CACA,GAAIU,CAAAA,CACJ,QAAA,CAAU5D,EAAM4D,CAAE,CAAA,CAClB,OAAAyB,CAAAA,CACA,IAAA,CAAMC,EAAAA,CACJ1B,CAAAA,CACAyB,EACArF,CAAAA,CAAM4D,CAAE,EACRgC,CAAAA,GAAOvP,CAAG,CACZ,CACF,CAAC,CAAA,CAAA,KAEMiM,CAAAA,CAActC,CAAK,CAAA,CAC5BmG,CAAAA,CAAI,IAAA,CACF,GAAGF,GACDjG,CAAAA,CACAsC,CAAAA,CAAc+C,CAAM,CAAA,CAAIA,EAAS,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA,CACnD/C,CAAAA,CAAcsD,IAAOvP,CAAG,CAAC,CAAA,CAAKuP,CAAAA,GAAOvP,CAAG,CAAA,CAAc,MAAA,CACtD,GAAG6M,CAAI,CAAA,CAAA,CACT,CACF,CAAA,CAEAiD,CAAAA,CAAI,IAAA,CAAK,CACP,KAAAjD,CAAAA,CACA,EAAA,CAAI,MACJ,QAAA,CAAUlD,CAAAA,CACV,OAAAqF,CAAAA,CACA,IAAA,CAAMb,CAAAA,CAAUa,CAAAA,CAAQrF,CAAK,CAC/B,CAAC,EAEL,CAEA,OAAOmG,CACT,CCvgCO,IAAMI,EAAAA,CAAoB,IAsFjC,SAASC,EAAAA,CACPxD,EACAyD,CAAAA,CACM,CACN,GAAI,CACF5C,EAAAA,CAAkBb,CAAI,EACxB,OAAS1M,CAAAA,CAAK,CACZ,IAAMoP,CAAAA,CAAUpP,CAAAA,YAAe,MAAQA,CAAAA,CAAI,OAAA,CAAU,MAAA,CAAOA,CAAG,EAE/D,MAAM,IAAI,MACR,CAAA,6BAAA,EAAgCmQ,CAAK,gCAA2Bf,CAAO,CAAA,CACzE,CACF,CAEA,GAAI,CAAC5C,EAAAA,CAAYE,CAAI,CAAA,CAAG,CACtB,IAAM0D,CAAAA,CACJ1D,CAAAA,GAAS,IAAA,EAAQ,OAAOA,CAAAA,EAAS,QAAA,CAC7B,GAAG,OAAOA,CAAI,WAAM,IAAA,CAAK,SAAA,CAAUA,CAAI,CAAC,GACxC,IAAA,CAAK,SAAA,CAAUA,CAAI,CAAA,CAAE,KAAA,CAAM,EAAG,EAAE,CAAA,CAEtC,MAAM,IAAI,MACR,CAAA,6BAAA,EAAgCyD,CAAK,gDAAgDC,CAAO,CAAA,CAAA,CAC9F,CACF,CAKA,IAAIC,CAAAA,CAsBJ,GArBA5D,GAAcC,CAAAA,CAAM,CAClB,QAAA,CAASkB,CAAAA,CAAWN,EAAI,CAEpB+C,CAAAA,GAAc,MAAA,EACd/C,CAAAA,CAAG,WAAW,GAAG,CAAA,EACjB,CAACzB,CAAAA,CAAoB,GAAA,CAAIyB,CAAE,CAAA,GAE3B+C,CAAAA,CAAY/C,CAAAA,EAEhB,CAAA,CACA,iBAAiBvN,CAAAA,CAAK,CAElBsQ,IAAc,MAAA,EACd,CAACxE,EAAoB,GAAA,CAAI9L,CAAG,CAAA,EAC5B,CAAC+L,GAAsB,GAAA,CAAI/L,CAAG,IAE9BsQ,CAAAA,CAAYtQ,CAAAA,EAEhB,CACF,CAAC,CAAA,CAEGsQ,CAAAA,GAAc,MAAA,CAChB,MAAM,IAAI,KAAA,CACR,CAAA,6BAAA,EAAgCF,CAAK,wCAAwCE,CAAS,CAAA,0BAAA,EAAwB,CAAC,GAAGxE,CAAmB,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CACnJ,CAEJ,CA2BO,SAASyE,EAAAA,CAAejP,CAAAA,CAA6B,CAI1D,GACEA,CAAAA,EACA,OAAOA,CAAAA,EAAQ,QAAA,EACf,CAAC,KAAA,CAAM,OAAA,CAAQA,CAAG,CAAA,EAClB,MAAM,OAAA,CAASA,CAAAA,CAAgC,SAAS,CAAA,CAExD,OAAOkP,GAAkBlP,CAAG,CAAA,CAG9B,IAAMmP,CAAAA,CAAyB,MAAM,OAAA,CAAQnP,CAAG,CAAA,CAC5CA,CAAAA,CACAA,GACE,OAAOA,CAAAA,EAAQ,QAAA,EACf,KAAA,CAAM,QAASA,CAAAA,CAA6B,MAAM,EACjDA,CAAAA,CAA8B,MAAA,CAC/B,KAEN,GAAI,CAACmP,CAAAA,CACH,MAAM,IAAI,KAAA,CACR,mJACF,EAKF,GAAIA,CAAAA,CAAK,OAASP,EAAAA,CAChB,MAAM,IAAI,KAAA,CACR,2CAA2CO,CAAAA,CAAK,MAAM,iDAAiDP,EAAiB,CAAA,yCAAA,CAC1H,EAGF,OAAOO,CAAAA,CAAK,GAAA,CAAI,CAACrK,EAAOsK,CAAAA,GAAU,CAChC,GAAItK,CAAAA,EAAS,OAAOA,CAAAA,EAAU,QAAA,EAAY,OAAA,GAAWA,CAAAA,CAAO,CAC1D,IAAMrE,CAAAA,CAAQqE,EAOR0J,CAAAA,CAAmB,CACvB,GAAI/N,CAAAA,CAAM,EAAA,EAAM,CAAA,CAAA,EAAI2O,CAAK,GACzB,KAAA,CAAQ3O,CAAAA,CAAM,OAAS,EACzB,EACA,OAAI,OAAOA,CAAAA,CAAM,SAAA,EAAc,WAC7B+N,CAAAA,CAAI,SAAA,CAAY/N,EAAM,SAAA,CAAA,CAGjB+N,CACT,CAGA,OAAO,CAAE,EAAA,CAAI,CAAA,CAAA,EAAIY,CAAK,CAAA,CAAA,CAAI,KAAA,CAAQtK,CAAAA,EAAS,EAA+B,CAC5E,CAAC,CACH,CAqBO,SAASoK,EAAAA,CAAkBG,CAAAA,CAAuC,CACvE,IAAMpP,CAAAA,CACJ,OAAOoP,CAAAA,EAAkB,QAAA,CACpB,IAAA,CAAK,KAAA,CAAMA,CAAa,CAAA,CACzBA,CAAAA,CAGN,GAAI,KAAA,CAAM,OAAA,CAAQpP,CAAM,CAAA,CACtB,OAAOqP,EAAAA,CAAoBrP,CAAM,EAGnC,GAAI,CAACA,GAAU,OAAOA,CAAAA,EAAW,SAC/B,MAAM,IAAI,KAAA,CACR,yHACF,EAGF,IAAMsP,CAAAA,CAAYtP,CAAAA,CAIlB,GAAIsP,EAAU,OAAA,GAAY,MAAA,EAAaA,CAAAA,CAAU,OAAA,GAAY,EAC3D,MAAM,IAAI,MACR,CAAA,kEAAA,EAAqE,IAAA,CAAK,UAAUA,CAAAA,CAAU,OAAO,CAAC,CAAA,kBAAA,CACxG,EAGF,GAAI,CAAC,MAAM,OAAA,CAAQA,CAAAA,CAAU,SAAS,CAAA,CACpC,MAAM,IAAI,KAAA,CACR,yHACF,CAAA,CAGF,OAAOD,GAAoBC,CAAAA,CAAU,SAAS,CAChD,CAkBO,SAASD,EAAAA,CAAoBE,CAAAA,CAAmC,CACrE,GAAI,CAAC,KAAA,CAAM,OAAA,CAAQA,CAAS,CAAA,CAC1B,MAAM,IAAI,KAAA,CACR,4EACF,CAAA,CAGF,GAAIA,EAAU,MAAA,CAASZ,EAAAA,CACrB,MAAM,IAAI,KAAA,CACR,CAAA,6CAAA,EAAgDY,CAAAA,CAAU,MAAM,CAAA,iDAAA,EAAoDZ,EAAiB,2CACvI,CAAA,CAKF,IAAA,IAASnS,EAAI,CAAA,CAAGA,CAAAA,CAAI+S,CAAAA,CAAU,MAAA,CAAQ/S,IAAK,CACzC,IAAMW,EAAIoS,CAAAA,CAAU/S,CAAC,EACrB,GAAI,CAACW,CAAAA,EAAK,OAAOA,GAAM,QAAA,EAAY,EAAE,OAAA,GAAWA,CAAAA,CAAAA,CAC9C,MAAM,IAAI,KAAA,CACR,CAAA,mDAAA,EAAsDX,CAAC,iCACzD,CAEJ,CAEA,OAAOwS,EAAAA,CAAeO,CAAS,CACjC,CAoCO,SAASC,EAAAA,CACdC,CAAAA,CACyB,CACzB,GAAM,CAAE,OAAAC,CAAAA,CAAQ,QAAA,CAAAC,EAAU,QAAA,CAAAC,CAAAA,CAAU,SAAA,CAAAC,CAAU,EAAIJ,CAAAA,CAC5CK,CAAAA,CAAYL,EAAQ,UAAA,EAAc,EAAA,CAClCM,EAAaD,CAAAA,CAAY,CAAA,CAAIA,CAAAA,CAAY,CAAA,CAE/C,GAAIJ,CAAAA,CAAO,MAAA,CAASf,EAAAA,CAClB,MAAM,IAAI,KAAA,CACR,CAAA,qCAAA,EAAwCe,CAAAA,CAAO,MAAM,iDAAiDf,EAAiB,CAAA,yCAAA,CACzH,EAKFC,EAAAA,CAAmBe,CAAAA,CAAU,UAAU,CAAA,CACvCf,EAAAA,CAAmBgB,CAAAA,CAAU,UAAU,EAEvC,IAAII,CAAAA,CAAkB,EAClBC,CAAAA,CAAkB,CAAA,CAClBC,EAAgB,CAAA,CAChBC,CAAAA,CAAiB,CAAA,CACjBC,CAAAA,CAAY,EACVC,CAAAA,CAAiC,GACjCC,CAAAA,CAAkC,GAGlCC,CAAAA,CAAmBV,CAAAA,CAAY,IAAI,GAAA,CAAiB,OACpDW,CAAAA,CAAmBX,CAAAA,CAAY,IAAI,GAAA,CAAiB,OAEtDY,CAAAA,CAEJ,IAAA,IAAWjQ,CAAAA,IAASkP,CAAAA,CAAQ,CAC1B,IAAM9P,CAAAA,CAAQY,EAAM,KAAA,CACdkQ,CAAAA,CAAcxC,EAAkByB,CAAAA,CAAU/P,CAAAA,CAAO6Q,CAAS,CAAA,CAC1DE,GAAczC,CAAAA,CAAkB0B,CAAAA,CAAUhQ,EAAO6Q,CAAS,CAAA,CAE5DC,IACFV,CAAAA,EAAAA,CACAO,CAAAA,EAAkB,GAAA,CAAI3Q,CAAAA,CAAMiQ,CAAmB,CAAC,CAAA,CAAA,CAE9Cc,KACFV,CAAAA,EAAAA,CACAO,CAAAA,EAAkB,IAAI5Q,CAAAA,CAAMiQ,CAAmB,CAAC,CAAA,CAAA,CAG9Ca,IAAgBC,EAAAA,CAClBP,CAAAA,EAAAA,CACS,CAACM,CAAAA,EAAeC,IACzBT,CAAAA,EAAAA,CACIG,CAAAA,CAAW,MAAA,CAASN,CAAAA,EACtBM,EAAW,IAAA,CAAKO,EAAAA,CAAYpQ,EAAOmP,CAAAA,CAAUC,CAAAA,CAAUa,CAAS,CAAC,CAAA,GAGnEN,CAAAA,EAAAA,CACIG,CAAAA,CAAY,OAASP,CAAAA,EACvBO,CAAAA,CAAY,KAAKM,EAAAA,CAAYpQ,CAAAA,CAAOmP,EAAUC,CAAAA,CAAUa,CAAS,CAAC,CAAA,CAAA,CAItEA,EAAY7Q,EACd,CAEA,IAAMiR,EAAAA,CAAkC,CACtC,gBAAiBnB,CAAAA,CAAO,MAAA,CACxB,QAAA,CAAU,CAAE,QAASM,CAAgB,CAAA,CACrC,QAAA,CAAU,CAAE,QAASC,CAAgB,CAAA,CACrC,KAAA,CAAOA,CAAAA,CAAkBD,EACzB,aAAA,CAAAE,CAAAA,CACA,eAAAC,CAAAA,CACA,SAAA,CAAAC,EACA,UAAA,CAAAC,CAAAA,CACA,WAAA,CAAAC,CACF,EAEA,OAAIC,CAAAA,EAAoBC,IACtBK,EAAAA,CAAO,QAAA,CAAS,gBAAkBN,CAAAA,CAAiB,IAAA,CACnDM,EAAAA,CAAO,QAAA,CAAS,gBAAkBL,CAAAA,CAAiB,IAAA,CAAA,CAG9CK,EACT,CAOA,SAASD,GACPpQ,CAAAA,CACAmP,CAAAA,CACAC,CAAAA,CACAa,CAAAA,CACkB,CAClB,IAAM7Q,CAAAA,CAAQY,CAAAA,CAAM,KAAA,CACdsQ,EAA2B,CAC/B,OAAA,CAAStQ,CAAAA,CAAM,EAAA,CACf,MAAAZ,CAAAA,CACA,eAAA,CAAiByO,GAA2BsB,CAAAA,CAAU/P,CAAAA,CAAO6Q,CAAS,CAAA,CACtE,eAAA,CAAiBpC,EAAAA,CAA2BuB,CAAAA,CAAUhQ,EAAO6Q,CAAS,CACxE,EAEA,OAAIjQ,CAAAA,CAAM,YAAc,MAAA,GACtBsQ,CAAAA,CAAO,SAAA,CAAYtQ,CAAAA,CAAM,WAGpBsQ,CACT,CCxcA,SAASzU,EAAAA,CAAUC,CAAAA,CAAuC,CACxD,IAAMC,EAA8B,CAAE,UAAA,CAAY,EAAA,CAAI,IAAA,CAAM,KAAM,CAAA,CAElE,IAAA,IAASC,CAAAA,CAAI,CAAA,CAAGA,EAAIF,CAAAA,CAAK,MAAA,CAAQE,IAE/B,OADYF,CAAAA,CAAKE,CAAC,CAAA,EAEhB,KAAK,WAAA,CAAa,CAChB,IAAMC,CAAAA,CAAMH,EAAK,EAAEE,CAAC,EAChBC,CAAAA,GACFF,CAAAA,CAAK,WAAA,CAAcE,CAAAA,CAAAA,CAErB,KACF,CACA,KAAK,aACL,KAAK,IAAA,CAAM,CACT,IAAMA,CAAAA,CAAMH,CAAAA,CAAK,EAAEE,CAAC,CAAA,CAChBC,CAAAA,GACFF,CAAAA,CAAK,YAAA,CAAeE,GAEtB,KACF,CACA,KAAK,YAAA,CACL,KAAK,IAAA,CAAM,CACT,IAAMA,CAAAA,CAAMH,CAAAA,CAAK,EAAEE,CAAC,CAAA,CAChBC,CAAAA,GACFF,CAAAA,CAAK,aAAeE,CAAAA,CAAAA,CAEtB,KACF,CACA,KAAK,eAAA,CAAiB,CACpB,IAAMA,CAAAA,CAAMH,CAAAA,CAAK,EAAEE,CAAC,CAAA,CACd8C,CAAAA,CAAI7C,EAAM,MAAA,CAAO,QAAA,CAASA,EAAK,EAAE,CAAA,CAAI,MAAA,CAAO,GAAA,CAC9C,OAAO,QAAA,CAAS6C,CAAC,GAAKA,CAAAA,EAAK,CAAA,GAC7B/C,EAAK,UAAA,CAAa+C,CAAAA,CAAAA,CAEpB,KACF,CACA,KAAK,cAAA,CAAgB,CACnB,IAAM7C,CAAAA,CAAMH,CAAAA,CAAK,EAAEE,CAAC,CAAA,CAChBC,CAAAA,GACFF,CAAAA,CAAK,UAAYE,CAAAA,CAAAA,CAEnB,KACF,CACA,KAAK,QAAA,CACHF,EAAK,IAAA,CAAO,IAAA,CACZ,KACJ,CAGF,OAAOA,CACT,CAEA,SAASgD,EAAAA,EAAmB,CAC1B,QAAQ,KAAA,CAAM;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAwBf,EACD,CAGA,SAASwR,EAAAA,CAAazF,EAAc0F,CAAAA,CAAwB,CAC1D,IAAM1S,CAAAA,CAAWnD,OAAAA,CAAQmQ,CAAI,CAAA,CACxBtR,UAAAA,CAAWsE,CAAQ,CAAA,GACtB,OAAA,CAAQ,MAAM3B,CAAAA,CAAG,GAAA,CAAI,CAAA,OAAA,EAAUqU,CAAK,CAAA,iBAAA,EAAoB1S,CAAQ,EAAE,CAAC,CAAA,CACnE,QAAQ,IAAA,CAAK,CAAC,GAEhB,GAAI,CACF,OAAO,IAAA,CAAK,KAAA,CAAMhD,YAAAA,CAAagD,EAAU,MAAM,CAAC,CAClD,CAAA,MAASI,CAAAA,CAAK,CACZ,OAAA,CAAQ,KAAA,CACN/B,CAAAA,CAAG,GAAA,CAAI,CAAA,uBAAA,EAA0BqU,CAAK,KAAK1S,CAAQ,CAAA,GAAA,CAAK,EACrDI,CAAAA,CAAc,OACnB,EACA,OAAA,CAAQ,IAAA,CAAK,CAAC,EAChB,CACF,CAOA,SAASuS,EAAAA,CAAWlR,CAAAA,CAA6B,CAC/C,GAAI,CACF,OAAOmR,EAAAA,CAAenR,CAAG,CAC3B,CAAA,MAASrB,CAAAA,CAAK,CACZ,QAAQ,KAAA,CAAM/B,CAAAA,CAAG,IAAI,CAAA,OAAA,EAAW+B,CAAAA,CAAc,OAAO,CAAA,CAAE,CAAC,CAAA,CACxD,OAAA,CAAQ,IAAA,CAAK,CAAC,EAChB,CACF,CAGA,SAASyS,EAAAA,CAAiB/F,CAAAA,CAAwB,CAChD,OACEA,CAAAA,GAAS,IAAA,EACT,OAAOA,CAAAA,EAAS,QAAA,EAChB,CAAC,KAAA,CAAM,OAAA,CAAQA,CAAI,CAAA,EACnB,MAAA,CAAO,KAAKA,CAAc,CAAA,CAAE,MAAA,GAAW,CAE3C,CAGA,SAASgG,GAAaxR,CAAAA,CAAwC,CAC5D,IAAMyR,CAAAA,CAAQ,MAAA,CAAO,QAAQzR,CAAK,CAAA,CAC/B,KAAA,CAAM,CAAA,CAAG,CAAC,CAAA,CACV,IAAI,CAAC,CAACmB,EAAG4J,CAAC,CAAA,GAAM,GAAG5J,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,SAAA,CAAU4J,CAAC,CAAC,EAAE,CAAA,CACxC2G,CAAAA,CAAQ,OAAO,IAAA,CAAK1R,CAAK,EAAE,MAAA,CAASyR,CAAAA,CAAM,MAAA,CAEhD,OAAOA,CAAAA,CAAM,IAAA,CAAK,GAAG,CAAA,EAAKC,CAAAA,CAAQ,EAAI3U,CAAAA,CAAG,GAAA,CAAI,KAAK2U,CAAK,CAAA,KAAA,CAAO,CAAA,CAAI,EAAA,CACpE,CAEA,SAASC,GACPV,CAAAA,CACAhB,CAAAA,CACM,CACN,GAAM,CAAE,SAAAF,CAAAA,CAAU,QAAA,CAAAC,CAAAA,CAAU,KAAA,CAAA4B,CAAM,CAAA,CAAIX,EAChCY,CAAAA,CACJD,CAAAA,CAAQ,EACJ7U,CAAAA,CAAG,KAAA,CAAM,IAAI6U,CAAK,CAAA,CAAE,CAAA,CACpBA,CAAAA,CAAQ,CAAA,CACN7U,CAAAA,CAAG,IAAI,CAAA,EAAG6U,CAAK,EAAE,CAAA,CACjB7U,CAAAA,CAAG,IAAI,OAAI,CAAA,CA+BnB,GA7BA,OAAA,CAAQ,GAAA,CAAI;AAAA,EAAKA,CAAAA,CAAG,IAAA,CAAK,cAAc,CAAC,CAAA;AAAA,CAAyB,CAAA,CACjE,OAAA,CAAQ,GAAA,CAAI,CAAA,qBAAA,EAAwBkU,EAAO,eAAe,CAAA,CAAE,CAAA,CAC5D,OAAA,CAAQ,GAAA,CAAI,CAAA,6BAAA,EAAgClB,CAAAA,CAAS,OAAO,SAAS,CAAA,CACrE,OAAA,CAAQ,GAAA,CACN,CAAA,6BAAA,EAAgCC,CAAAA,CAAS,OAAO,CAAA,WAAA,EAAc6B,CAAQ,GACxE,CAAA,CAIE5B,CAAAA,EACAF,CAAAA,CAAS,eAAA,GAAoB,MAAA,EAC7BC,CAAAA,CAAS,eAAA,GAAoB,MAAA,GAE7B,QAAQ,GAAA,CACN;AAAA,oCAAA,EAAyCD,CAAAA,CAAS,eAAe,CAAA,CAAA,EAAIE,CAAS,CAAA,CAAA,CAChF,CAAA,CACA,OAAA,CAAQ,GAAA,CACN,CAAA,oCAAA,EAAuCD,CAAAA,CAAS,eAAe,CAAA,CAAA,EAAIC,CAAS,CAAA,CAAA,CAC9E,CAAA,CAAA,CAGF,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA,CACd,OAAA,CAAQ,GAAA,CACN,CAAA,EAAA,EAAKlT,CAAAA,CAAG,KAAA,CAAM,CAAA,CAAA,EAAIkU,CAAAA,CAAO,aAAa,CAAA,CAAE,CAAC,CAAA,gBAAA,EAAmBlU,CAAAA,CAAG,GAAA,CAAI,gCAAgC,CAAC,CAAA,CACtG,CAAA,CACA,OAAA,CAAQ,GAAA,CACN,CAAA,EAAA,EAAKA,CAAAA,CAAG,GAAA,CAAI,CAAA,CAAA,EAAIkU,CAAAA,CAAO,cAAc,CAAA,CAAE,CAAC,CAAA,gBAAA,EAAmBlU,CAAAA,CAAG,GAAA,CAAI,6BAA6B,CAAC,CAAA,CAClG,CAAA,CAEIkU,CAAAA,CAAO,UAAA,CAAW,MAAA,CAAS,CAAA,CAAG,CAChC,OAAA,CAAQ,GAAA,CAAI;AAAA,EAAA,EAAOlU,EAAG,KAAA,CAAM,qBAAqB,CAAC,CAAA,CAAE,EACpD,IAAA,IAAWQ,CAAAA,IAAK0T,CAAAA,CAAO,UAAA,CAAW,MAAM,CAAA,CAAG,CAAC,CAAA,CAC1C,OAAA,CAAQ,IAAI,CAAA,UAAA,EAAa1T,CAAAA,CAAE,OAAO,CAAA,GAAA,EAAMR,EAAG,GAAA,CAAIyU,EAAAA,CAAajU,CAAAA,CAAE,KAAK,CAAC,CAAC,CAAA,CAAE,EAE3E,CACA,GAAI0T,CAAAA,CAAO,WAAA,CAAY,OAAS,CAAA,CAAG,CACjC,QAAQ,GAAA,CAAI;AAAA,EAAA,EAAOlU,CAAAA,CAAG,IAAI,sBAAsB,CAAC,EAAE,CAAA,CACnD,IAAA,IAAWQ,CAAAA,IAAK0T,CAAAA,CAAO,WAAA,CAAY,KAAA,CAAM,EAAG,CAAC,CAAA,CAC3C,QAAQ,GAAA,CAAI,CAAA,UAAA,EAAa1T,EAAE,OAAO,CAAA,GAAA,EAAMR,CAAAA,CAAG,GAAA,CAAIyU,EAAAA,CAAajU,CAAAA,CAAE,KAAK,CAAC,CAAC,EAAE,EAE3E,CAEA,IAAMuU,CAAAA,CAAUb,CAAAA,CAAO,UAAA,CAAW,MAAA,CAASA,CAAAA,CAAO,WAAA,CAAY,OACxDc,CAAAA,CAAQd,CAAAA,CAAO,cAAgBA,CAAAA,CAAO,cAAA,CACxCa,EAAUC,CAAAA,EACZ,OAAA,CAAQ,GAAA,CACNhV,CAAAA,CAAG,GAAA,CAAI;AAAA,EAAA,EAAO+U,CAAO,CAAA,IAAA,EAAOC,CAAK,CAAA,sDAAA,CAAmD,CACtF,EAEF,OAAA,CAAQ,GAAA,CAAI,EAAE,EAChB,CAEA,eAAsBC,EAAAA,CAAmBtV,CAAAA,CAA+B,CAAA,CAClEA,EAAK,QAAA,CAAS,QAAQ,CAAA,EAAKA,CAAAA,CAAK,SAAW,CAAA,IAC7CiD,EAAAA,EAAW,CACX,OAAA,CAAQ,KAAKjD,CAAAA,CAAK,MAAA,GAAW,CAAA,CAAI,CAAA,CAAI,CAAC,CAAA,CAAA,CAGxC,IAAMC,EAAOF,EAAAA,CAAUC,CAAI,EAEtBC,CAAAA,CAAK,WAAA,GACR,OAAA,CAAQ,KAAA,CAAMI,EAAG,GAAA,CAAI,4CAA4C,CAAC,CAAA,CAClE4C,IAAW,CACX,OAAA,CAAQ,IAAA,CAAK,CAAC,GAEXhD,CAAAA,CAAK,YAAA,GACR,OAAA,CAAQ,KAAA,CAAMI,EAAG,GAAA,CAAI,2CAA2C,CAAC,CAAA,CACjE4C,IAAW,CACX,OAAA,CAAQ,IAAA,CAAK,CAAC,GAEXhD,CAAAA,CAAK,YAAA,GACR,OAAA,CAAQ,KAAA,CACNI,EAAG,GAAA,CAAI,2CAA2C,EAChDA,CAAAA,CAAG,GAAA,CAAI,iFAAiF,CAC5F,CAAA,CACA4C,EAAAA,EAAW,CACX,QAAQ,IAAA,CAAK,CAAC,CAAA,CAAA,CAGhB,IAAMmQ,EAASuB,EAAAA,CAAWF,EAAAA,CAAaxU,CAAAA,CAAK,WAAA,CAAa,WAAW,CAAC,CAAA,CAC/DoT,CAAAA,CAAWoB,EAAAA,CAAaxU,EAAK,YAAA,CAAc,YAAY,CAAA,CACvDqT,CAAAA,CAAWmB,GAAaxU,CAAAA,CAAK,YAAA,CAAc,YAAY,CAAA,CAIzD4U,GAAiBxB,CAAQ,CAAA,EAC3B,OAAA,CAAQ,KAAA,CACNhT,EAAG,MAAA,CAAO,4EAAuE,CACnF,CAAA,CAEEwU,EAAAA,CAAiBvB,CAAQ,CAAA,EAC3B,OAAA,CAAQ,KAAA,CACNjT,CAAAA,CAAG,OAAO,4EAAuE,CACnF,CAAA,CAGF,IAAIkU,EACJ,GAAI,CAIFA,CAAAA,CAASgB,EAAAA,CAAY,CACnB,MAAA,CAAAnC,CAAAA,CACA,QAAA,CAAUC,CAAAA,CACV,SAAUC,CAAAA,CACV,UAAA,CAAYrT,CAAAA,CAAK,UAAA,CACjB,UAAWA,CAAAA,CAAK,SAClB,CAAC,EACH,OAASmC,CAAAA,CAAK,CAIZ,OAAA,CAAQ,KAAA,CAAM/B,EAAG,GAAA,CAAI,CAAA,OAAA,EAAW+B,EAAc,OAAO,CAAA,CAAE,CAAC,CAAA,CACxD,OAAA,CAAQ,IAAA,CAAK,CAAC,EAChB,CAEA,GAAInC,CAAAA,CAAK,IAAA,CAAM,CACb,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,SAAA,CAAUsU,EAAQ,IAAA,CAAM,CAAC,CAAC,CAAA,CAE3C,MACF,CAEAU,EAAAA,CAAYV,CAAAA,CAAQtU,CAAAA,CAAK,SAAS,EACpC,CC7QA,SAASF,EAAAA,CAAUC,CAAAA,CAGjB,CACA,IAAMC,EAAyB,CAC7B,IAAA,CAAM,KAAA,CACN,gBAAA,CAAkB,KAClB,OAAA,CAAS,KACX,CAAA,CACI6C,CAAAA,CAAW,GAEf,IAAA,IAAS5C,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAIF,EAAK,MAAA,CAAQE,CAAAA,EAAAA,CAAK,CACpC,IAAM6C,EAAM/C,CAAAA,CAAKE,CAAC,CAAA,CAClB,OAAQ6C,GACN,KAAK,UAAA,CACL,KAAK,KAAM,CACT,IAAM5C,EAAMH,CAAAA,CAAK,EAAEE,CAAC,CAAA,CAChBC,CAAAA,GAAKF,CAAAA,CAAK,UAAA,CAAaE,GAC3B,KACF,CACA,KAAK,cAAA,CAAgB,CACnB,IAAMA,CAAAA,CAAMH,CAAAA,CAAK,EAAEE,CAAC,CAAA,CACd8C,CAAAA,CAAI7C,CAAAA,CAAM,MAAA,CAAO,SAASA,CAAAA,CAAK,EAAE,CAAA,CAAI,MAAA,CAAO,IAC9C,MAAA,CAAO,QAAA,CAAS6C,CAAC,CAAA,EAAKA,EAAI,CAAA,GAAG/C,CAAAA,CAAK,SAAA,CAAY+C,CAAAA,CAAAA,CAClD,KACF,CACA,KAAK,eACL,KAAK,wBAAA,CACH/C,EAAK,gBAAA,CAAmB,KAAA,CACxB,MACF,KAAK,SACHA,CAAAA,CAAK,IAAA,CAAO,IAAA,CACZ,MACF,KAAK,WAAA,CACL,KAAK,IAAA,CACHA,CAAAA,CAAK,QAAU,IAAA,CACf,MACF,QACM8C,CAAAA,EAAO,CAACA,EAAI,UAAA,CAAW,GAAG,CAAA,EAAK,CAACD,IAClCA,CAAAA,CAAWC,CAAAA,EAEjB,CACF,CAEA,OAAO,CAAE,QAAA,CAAAD,CAAAA,CAAU,IAAA,CAAA7C,CAAK,CAC1B,CAEA,SAASgD,EAAAA,EAAmB,CAC1B,QAAQ,KAAA,CAAM;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,CAsBf,EACD,CAEA,eAAsBuS,EAAAA,CAAcxV,CAAAA,CAA+B,CAAA,CAC7DA,CAAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,EAAKA,CAAAA,CAAK,QAAA,CAAS,IAAI,CAAA,EAAKA,CAAAA,CAAK,MAAA,GAAW,CAAA,IACpEiD,EAAAA,EAAW,CACX,OAAA,CAAQ,IAAA,CAAKjD,CAAAA,CAAK,MAAA,GAAW,CAAA,CAAI,CAAA,CAAI,CAAC,CAAA,CAAA,CAGxC,GAAM,CAAE,QAAA,CAAA8C,CAAAA,CAAU,IAAA,CAAA7C,CAAK,CAAA,CAAIF,EAAAA,CAAUC,CAAI,CAAA,CAEpC8C,CAAAA,GACH,OAAA,CAAQ,KAAA,CAAMzC,CAAAA,CAAG,GAAA,CAAI,yCAAyC,CAAC,CAAA,CAC/D4C,EAAAA,EAAW,CACX,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,CAAA,CAEXhD,CAAAA,CAAK,UAAA,GACR,OAAA,CAAQ,KAAA,CACNI,CAAAA,CAAG,GAAA,CAAI,oCAAoC,CAAA,CAC3CA,CAAAA,CAAG,GAAA,CAAI;AAAA,wDAAA,CAA4D,CACrE,CAAA,CACA4C,EAAAA,GACA,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,CAAA,CAGhB,IAAMO,EAAe3E,OAAAA,CAAQiE,CAAQ,EAChCpF,UAAAA,CAAW8F,CAAY,IAC1B,OAAA,CAAQ,KAAA,CAAMnD,EAAG,GAAA,CAAI,CAAA,gCAAA,EAAmCmD,CAAY,CAAA,CAAE,CAAC,EACvE,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,CAAA,CAIhB,IAAIC,EACJ,GAAI,CACFA,EAAMzE,YAAAA,CAAawE,CAAAA,CAAc,MAAM,EACzC,CAAA,MAASpB,EAAK,CACZ,OAAA,CAAQ,MACN/B,CAAAA,CAAG,GAAA,CACD,yBAAyBmD,CAAY,CAAA,EAAA,EAAMpB,EAAc,OAAO,CAAA,CAClE,CACF,CAAA,CACA,OAAA,CAAQ,KAAK,CAAC,EAChB,CAEA,IAAIsB,CAAAA,CACJ,GAAI,CACFA,CAAAA,CAAS,KAAK,KAAA,CAAMD,CAAG,EACzB,CAAA,MAASrB,CAAAA,CAAK,CACZ,OAAA,CAAQ,KAAA,CACN/B,EAAG,GAAA,CACD,CAAA,OAAA,EAAUmD,CAAY,CAAA,oBAAA,EAAwBpB,CAAAA,CAAc,OAAO,CAAA,CACrE,CACF,EACA,OAAA,CAAQ,IAAA,CAAK,CAAC,EAChB,CAGA,GAAM,CAAE,mBAAA,CAAAuB,EAAqB,cAAA,CAAA8R,CAAe,CAAA,CAAI,MAAM7S,EACpD3C,CAAAA,CAAK,OACP,EAGI4D,CAAAA,CACJ,GAAI,CACFA,CAAAA,CAAWF,CAAAA,CAAoBD,CAAM,EACvC,CAAA,MAAStB,EAAK,CACZ,OAAA,CAAQ,MACN/B,CAAAA,CAAG,GAAA,CACD,2CAA4C+B,CAAAA,CAAc,OAAO,EACnE,CACF,CAAA,CACA,QAAQ,IAAA,CAAK,CAAC,EAChB,CAGA,IAAIiB,EACJ,GAAI,CACFA,EAAS,MAAMtB,CAAAA,CAAW9B,EAAK,UAAU,EAC3C,OAASmC,CAAAA,CAAK,CACZ,QAAQ,KAAA,CACN/B,CAAAA,CAAG,IAAI,CAAA,mCAAA,EAAuC+B,CAAAA,CAAc,OAAO,CAAA,CAAE,CACvE,EACA,OAAA,CAAQ,IAAA,CAAK,CAAC,EAChB,CAGA,IAAME,CAAAA,CAAMe,CAAAA,CAaZ,GAZI,OAAOf,CAAAA,CAAI,UAAa,UAAA,GAC1B,OAAA,CAAQ,MACNjC,CAAAA,CAAG,GAAA,CACD,uHACF,CACF,CAAA,CACA,QAAQ,IAAA,CAAK,CAAC,GAMZ,OAAOiC,CAAAA,CAAI,OAAU,UAAA,CACvB,GAAI,CACFA,CAAAA,CAAI,KAAA,GACN,CAAA,KAAQ,CAER,CAOF,IAAMK,CAAAA,CAAS,MAAM8S,CAAAA,CACnB5R,CAAAA,CACAvB,CAAAA,CAGA,CACE,iBAAkBrC,CAAAA,CAAK,gBAAA,CACvB,UAAWA,CAAAA,CAAK,SAClB,CACF,CAAA,CAEA,GAAIA,EAAK,IAAA,CACP,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU0C,EAAQ,IAAA,CAAM,CAAC,CAAC,CAAA,CAAA,KACtC,CACL,GAAM,CAAE,UAAA,CAAA+S,EAAY,OAAA,CAAAhK,CAAAA,CAAS,UAAAiK,CAAU,CAAA,CAAIhT,EACrCiT,CAAAA,CAAKF,CAAAA,CAAa,EACxB,OAAA,CAAQ,GAAA,CACN,GAAGE,CAAAA,CAAKvV,CAAAA,CAAG,MAAM,QAAG,CAAA,CAAIA,EAAG,MAAA,CAAO,QAAG,CAAC,CAAA,iBAAA,CAAA,CACtCA,CAAAA,CAAG,KAAK,CAAA,EAAGqV,CAAU,aAAa,CAAA,CAClCrV,CAAAA,CAAG,IAAI,CAAA,EAAA,EAAKqL,CAAO,UAAU,CAAA,CAC7BiK,CAAAA,CAAY,EAAItV,CAAAA,CAAG,MAAA,CAAO,KAAKsV,CAAS,CAAA,UAAA,CAAY,EAAI,EAC1D,CAAA,CACID,IAAe,CAAA,EACjB,OAAA,CAAQ,MACNrV,CAAAA,CAAG,MAAA,CACD,6LACF,CACF,CAAA,CAEEsV,EAAY,CAAA,EACd,OAAA,CAAQ,MACNtV,CAAAA,CAAG,MAAA,CACD,YAAYsV,CAAS,CAAA,uFAAA,CACvB,CACF,EAEJ,CAKA,QAAQ,IAAA,CAAK,CAAC,EAChB,CCjOA,SAAS5V,EAAAA,CAAUC,EAIjB,CACA,IAAMC,EAA+B,CAAE,IAAA,CAAM,MAAO,OAAA,CAAS,KAAM,EAC7D4V,CAAAA,CAAwB,GAC9B,IAAA,IAAS3V,CAAAA,CAAI,EAAGA,CAAAA,CAAIF,CAAAA,CAAK,OAAQE,CAAAA,EAAAA,CAAK,CACpC,IAAM6C,CAAAA,CAAM/C,CAAAA,CAAKE,CAAC,CAAA,CAClB,OAAQ6C,GACN,KAAK,SACH9C,CAAAA,CAAK,IAAA,CAAO,KACZ,MACF,KAAK,YACL,KAAK,IAAA,CACHA,EAAK,OAAA,CAAU,IAAA,CACf,MACF,QACM8C,CAAAA,EAAO,CAACA,CAAAA,CAAI,UAAA,CAAW,GAAG,CAAA,EAAG8S,CAAAA,CAAY,KAAK9S,CAAG,EACzD,CACF,CACA,OAAO,CACL,KAAA,CAAO8S,CAAAA,CAAY,CAAC,CAAA,EAAK,EAAA,CACzB,MAAOA,CAAAA,CAAY,CAAC,GAAK,EAAA,CACzB,IAAA,CAAA5V,CACF,CACF,CAEA,SAASgD,EAAAA,EAAmB,CAC1B,QAAQ,KAAA,CAAM;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,CAwBf,EACD,CAEA,SAAS6S,EAAAA,CAAQ9S,EAAmB,CAClC,OAAIA,CAAAA,CAAI,CAAA,CAAU3C,CAAAA,CAAG,KAAA,CAAM,CAAA,CAAA,EAAI2C,CAAC,EAAE,CAAA,CAC9BA,CAAAA,CAAI,CAAA,CAAU3C,CAAAA,CAAG,GAAA,CAAI,CAAA,EAAG2C,CAAC,CAAA,CAAE,EACxB3C,CAAAA,CAAG,GAAA,CAAI,IAAI,CACpB,CAEA,SAAS0V,EAAAA,CAAcC,CAAAA,CAA8B,CACnD,OAAIA,CAAAA,CAAK,MAAA,GAAW,CAAA,CAAU,CAAC3V,CAAAA,CAAG,GAAA,CAAI,oBAAoB,CAAC,CAAA,CACpD2V,CAAAA,CAAK,GAAA,CACT7N,CAAAA,EACC,CAAA,EAAA,EAAK9H,CAAAA,CAAG,IAAA,CAAK8H,CAAAA,CAAE,GAAG,MAAA,CAAO,EAAE,CAAC,CAAC,CAAA,CAAA,EAAI,MAAA,CAAOA,CAAAA,CAAE,MAAM,EAAE,QAAA,CAAS,CAAC,CAAC,CAAA,QAAA,EAAM,MAAA,CAAOA,CAAAA,CAAE,MAAM,CAAA,CAAE,SAAS,CAAC,CAAC,CAAA,GAAA,EAAM2N,EAAAA,CAAQ3N,CAAAA,CAAE,KAAK,CAAC,CAAA,CAAA,CACzH,CACF,CAEA,SAAS8N,EAAAA,CAAgBD,CAAAA,CAAoC,CAC3D,OAAIA,CAAAA,CAAK,MAAA,GAAW,EAAU,CAAC3V,CAAAA,CAAG,GAAA,CAAI,oBAAoB,CAAC,CAAA,CACpD2V,CAAAA,CAAK,GAAA,CACT7N,GACC,CAAA,EAAA,EAAK9H,CAAAA,CAAG,IAAA,CAAK8H,CAAAA,CAAE,QAAA,CAAS,MAAA,CAAO,EAAE,CAAC,CAAC,CAAA,QAAA,EACzBA,CAAAA,CAAE,OAAO,CAAA,MAAA,EAAIA,CAAAA,CAAE,OAAO,CAAA,EAAA,EAAK2N,EAAAA,CAAQ3N,EAAE,OAAA,CAAUA,CAAAA,CAAE,OAAO,CAAC,CAAA,aAAA,EACtDA,CAAAA,CAAE,UAAU,CAAA,MAAA,EAAIA,EAAE,UAAU,CAAA,EAAA,EAAK2N,EAAAA,CAAQ3N,CAAAA,CAAE,UAAA,CAAaA,CAAAA,CAAE,UAAU,CAAC,aACxEA,CAAAA,CAAE,OAAO,CAAA,MAAA,EAAIA,CAAAA,CAAE,OAAO,CAAA,EAAA,EAAK2N,EAAAA,CAAQ3N,CAAAA,CAAE,OAAA,CAAUA,EAAE,OAAO,CAAC,CAAA,CAAA,CACvE,CACF,CAEA,SAAS+N,EAAAA,CAAUF,CAAAA,CAA8B,CAC/C,OAAIA,CAAAA,CAAK,MAAA,GAAW,CAAA,CAAU,CAAC3V,CAAAA,CAAG,GAAA,CAAI,mBAAmB,CAAC,CAAA,CACnD2V,CAAAA,CAAK,GAAA,CAAKzM,CAAAA,EAAM,CACrB,IAAM4M,CAAAA,CAAU5M,CAAAA,CAAE,OAAS,GAAA,CAAMlJ,CAAAA,CAAG,IAAA,CAAK,QAAQ,CAAA,CAAIA,CAAAA,CAAG,MAAA,CAAO,QAAQ,EACjE+V,CAAAA,CAAAA,CAAU,IAAM,CACpB,GAAI,CACF,OAAO,IAAA,CAAK,SAAA,CAAU7M,EAAE,KAAK,CAC/B,CAAA,KAAQ,CACN,OAAO,CAAA,CAAA,EAAI,OAAOA,CAAAA,CAAE,KAAK,CAAA,CAAA,CAC3B,CACF,CAAA,GAAG,CACH,OAAO,CAAA,EAAA,EAAK4M,CAAO,CAAA,SAAA,EAAY5M,EAAE,UAAU,CAAA,EAAA,EAAKlJ,CAAAA,CAAG,IAAA,CAAKkJ,EAAE,IAAI,CAAC,CAAA,EAAA,EAAKA,CAAAA,CAAE,EAAE,CAAA,GAAA,EAAMlJ,CAAAA,CAAG,GAAA,CAAI+V,CAAM,CAAC,CAAA,CAC9F,CAAC,CACH,CAEA,SAASC,EAAAA,CAAarH,CAAAA,CAAuB,CAC3C,IAAMhN,CAAAA,CAAWnD,OAAAA,CAAQmQ,CAAI,EACxBtR,UAAAA,CAAWsE,CAAQ,CAAA,GACtB,OAAA,CAAQ,KAAA,CAAM3B,CAAAA,CAAG,GAAA,CAAI,CAAA,gCAAA,EAAmC2B,CAAQ,CAAA,CAAE,CAAC,CAAA,CACnE,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,CAAA,CAEhB,IAAIyB,EACJ,GAAI,CACFA,CAAAA,CAAMzE,YAAAA,CAAagD,CAAAA,CAAU,MAAM,EACrC,CAAA,MAASI,EAAK,CACZ,OAAA,CAAQ,KAAA,CACN/B,CAAAA,CAAG,GAAA,CAAI,CAAA,sBAAA,EAAyB2B,CAAQ,CAAA,EAAA,EAAMI,EAAc,OAAO,CAAA,CAAE,CACvE,CAAA,CACA,OAAA,CAAQ,IAAA,CAAK,CAAC,EAChB,CACA,GAAI,CACF,OAAO,IAAA,CAAK,MAAMqB,CAAG,CACvB,CAAA,MAASrB,CAAAA,CAAK,CACZ,OAAA,CAAQ,KAAA,CACN/B,CAAAA,CAAG,GAAA,CAAI,CAAA,OAAA,EAAU2B,CAAQ,CAAA,oBAAA,EAAwBI,CAAAA,CAAc,OAAO,CAAA,CAAE,CAC1E,CAAA,CACA,OAAA,CAAQ,IAAA,CAAK,CAAC,EAChB,CACF,CAEA,eAAsBkU,EAAAA,CAAoBtW,CAAAA,CAA+B,CAAA,CACnEA,CAAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,EAAKA,EAAK,QAAA,CAAS,IAAI,CAAA,EAAKA,CAAAA,CAAK,MAAA,GAAW,CAAA,IACpEiD,EAAAA,EAAW,CACX,QAAQ,IAAA,CAAKjD,CAAAA,CAAK,MAAA,GAAW,CAAA,CAAI,CAAA,CAAI,CAAC,CAAA,CAAA,CAGxC,GAAM,CAAE,KAAA,CAAAuW,CAAAA,CAAO,KAAA,CAAAC,CAAAA,CAAO,IAAA,CAAAvW,CAAK,CAAA,CAAIF,EAAAA,CAAUC,CAAI,CAAA,CAAA,CACzC,CAACuW,CAAAA,EAAS,CAACC,CAAAA,IACb,OAAA,CAAQ,KAAA,CAAMnW,CAAAA,CAAG,IAAI,gDAAgD,CAAC,CAAA,CACtE4C,EAAAA,EAAW,CACX,OAAA,CAAQ,IAAA,CAAK,CAAC,GAIhB,GAAM,CAAE,mBAAA,CAAAU,CAAAA,CAAqB,aAAA,CAAA8S,CAAc,CAAA,CAAI,MAAM7T,EACnD3C,CAAAA,CAAK,OACP,CAAA,CAGMyW,CAAAA,CAAOL,EAAAA,CAAaE,CAAK,CAAA,CACzBI,CAAAA,CAAON,GAAaG,CAAK,CAAA,CAC3BI,CAAAA,CACAC,CAAAA,CACJ,GAAI,CACFD,CAAAA,CAAMjT,CAAAA,CAAoB+S,CAAI,CAAA,CAC9BG,CAAAA,CAAMlT,CAAAA,CAAoBgT,CAAI,EAChC,CAAA,MAASvU,CAAAA,CAAK,CACZ,QAAQ,KAAA,CACN/B,CAAAA,CAAG,GAAA,CACD,CAAA,wCAAA,EAA4C+B,CAAAA,CAAc,OAAO,CAAA,CACnE,CACF,EACA,OAAA,CAAQ,IAAA,CAAK,CAAC,EAChB,CAEA,IAAM0U,CAAAA,CAAOL,CAAAA,CAAcG,EAAKC,CAAG,CAAA,CAE/B5W,CAAAA,CAAK,IAAA,GACP,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU6W,EAAM,IAAA,CAAM,CAAC,CAAC,CAAA,CACzC,QAAQ,IAAA,CAAKA,CAAAA,CAAK,SAAA,CAAY,CAAA,CAAI,CAAC,CAAA,CAAA,CAIjCA,CAAAA,CAAK,SAAA,GACP,OAAA,CAAQ,GAAA,CACNzW,CAAAA,CAAG,KAAA,CAAM,mBAAc,EACvB,CAAA,oBAAA,EAAuByW,CAAAA,CAAK,WAAW,CAAA,kCAAA,CACzC,CAAA,CACA,OAAA,CAAQ,IAAA,CAAK,CAAC,GAGhB,OAAA,CAAQ,GAAA,CAAIzW,CAAAA,CAAG,IAAA,CAAK,eAAe,CAAA,CAAGA,CAAAA,CAAG,GAAA,CAAI,IAAIkW,CAAK,CAAA,IAAA,EAAOC,CAAK,CAAA,CAAA,CAAG,CAAC,CAAA,CACtE,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA,CACd,OAAA,CAAQ,GAAA,CACN,CAAA,kBAAA,EAAqBM,CAAAA,CAAK,WAAW,CAAA,QAAA,EAAMA,CAAAA,CAAK,WAAW,CAAA,GAAA,EAAMhB,EAAAA,CAAQgB,CAAAA,CAAK,eAAe,CAAC,CAAA,CAAA,CAChG,CAAA,CACA,OAAA,CAAQ,IAAI,EAAE,CAAA,CAEd,OAAA,CAAQ,GAAA,CAAIzW,CAAAA,CAAG,IAAA,CAAK,mBAAmB,CAAC,EACxC,IAAA,IAAW8F,CAAAA,IAAQ4P,EAAAA,CAAce,CAAAA,CAAK,eAAe,CAAA,CAAG,OAAA,CAAQ,GAAA,CAAI3Q,CAAI,EACxE,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA,CAEd,OAAA,CAAQ,GAAA,CAAI9F,CAAAA,CAAG,IAAA,CAAK,YAAY,CAAC,CAAA,CACjC,IAAA,IAAW8F,CAAAA,IAAQ4P,EAAAA,CAAce,CAAAA,CAAK,SAAS,CAAA,CAAG,QAAQ,GAAA,CAAI3Q,CAAI,CAAA,CAClE,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA,CAEd,OAAA,CAAQ,IAAI9F,CAAAA,CAAG,IAAA,CAAK,gBAAgB,CAAC,CAAA,CACrC,IAAA,IAAW8F,CAAAA,IAAQ8P,EAAAA,CAAgBa,EAAK,YAAY,CAAA,CAAG,OAAA,CAAQ,GAAA,CAAI3Q,CAAI,CAAA,CACvE,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA,CAEd,OAAA,CAAQ,GAAA,CAAI9F,CAAAA,CAAG,IAAA,CAAK,aAAa,CAAC,CAAA,CAClC,QAAW8F,CAAAA,IAAQ+P,EAAAA,CAAUY,CAAAA,CAAK,SAAS,CAAA,CAAG,OAAA,CAAQ,GAAA,CAAI3Q,CAAI,EAC9D,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA,CAEd,QAAQ,IAAA,CAAK,CAAC,EAChB,CC3NA,IAAM4Q,EAAAA,CAAO;AAAA,EACX9Z,CAAQ,CAAA;;AAAA,OAAA,EAEDA,CAAQ,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,CAAA,CAwDf,MAAK,CAEP,eAAe+Z,EAAAA,EAAO,CACpB,IAAMhX,CAAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,CAO3BiX,CAAAA,CAAQjX,EAAK,CAAC,CAAA,CAQpB,IANEA,CAAAA,CAAK,MAAA,GAAW,CAAA,EAAKiX,CAAAA,GAAU,UAAYA,CAAAA,GAAU,IAAA,IAErD,OAAA,CAAQ,GAAA,CAAIF,EAAI,CAAA,CAChB,OAAA,CAAQ,IAAA,CAAK,CAAC,GAGZE,CAAAA,GAAU,WAAA,EAAeA,IAAU,IAAA,CAAM,CAC3C,GAAM,CAAE,YAAA,CAAAjY,CAAa,CAAA,CAAI,MAAM,OAAO,IAAS,CAAA,CACzC,CAAE,cAAAkY,CAAc,CAAA,CAAI,MAAM,OAAO,KAAU,CAAA,CAC3C,CAAE,QAAApY,CAAAA,CAAS,IAAA,CAAAnB,CAAK,CAAA,CAAI,MAAM,OAAO,MAAW,EAE5CwZ,CAAAA,CAAYrY,CAAAA,CAAQoY,EAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAC,CAAA,CAClD7S,CAAAA,CAAM,IAAA,CAAK,KAAA,CACfrF,EAAarB,CAAAA,CAAKwZ,CAAAA,CAAW,KAAM,cAAc,CAAA,CAAG,OAAO,CAC7D,CAAA,CAEA,OAAA,CAAQ,GAAA,CAAI9S,EAAI,OAAO,CAAA,CACvB,OAAA,CAAQ,IAAA,CAAK,CAAC,EAChB,CAEA,IAAM+S,CAAAA,CAAUpX,EAAK,CAAC,CAAA,CAEtB,OAAQoX,CAAAA,EACN,KAAK,MAAA,CAAQ,CACX,MAAMjM,EAAAA,CAAYnL,EAAK,KAAA,CAAM,CAAC,CAAC,CAAA,CAC/B,KACF,CAEA,KAAK,KAAA,CAAO,CACV,IAAMqX,EAAarX,CAAAA,CAAK,CAAC,EACnByC,CAAAA,CAAOzC,CAAAA,CAAK,CAAC,CAAA,CAEfqX,CAAAA,GAAe,QAAA,EACZ5U,CAAAA,GACH,QAAQ,KAAA,CAAM,oCAAoC,CAAA,CAClD,OAAA,CAAQ,KAAK,CAAC,CAAA,CAAA,CAEhB,MAAMqL,EAAAA,CAAiBrL,EAAMzC,CAAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA,EACjCqX,IAAe,cAAA,EACnB5U,CAAAA,GACH,OAAA,CAAQ,KAAA,CAAM,0CAA0C,CAAA,CACxD,OAAA,CAAQ,KAAK,CAAC,CAAA,CAAA,CAEhB,MAAMsL,EAAAA,CAAuBtL,CAAAA,CAAMzC,CAAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA,GAEhD,QAAQ,KAAA,CACN,CAAA,oBAAA,EAAuBqX,GAAc,QAAQ;AAAA,OAAA,EACjCpa,CAAQ,CAAA;AAAA,OAAA,EACRA,CAAQ,0BACtB,CAAA,CACA,OAAA,CAAQ,KAAK,CAAC,CAAA,CAAA,CAEhB,KACF,CAEA,KAAK,UAAW,CACd,MAAMmQ,GAAepN,CAAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA,CAClC,KACF,CAEA,KAAK,SAAA,CAAW,CACd,MAAMwH,EAAAA,CAAexH,EAAK,KAAA,CAAM,CAAC,CAAC,CAAA,CAClC,KACF,CAEA,KAAK,OAAA,CAAS,CACZ,MAAM+J,EAAAA,CAAa/J,EAAK,KAAA,CAAM,CAAC,CAAC,CAAA,CAChC,KACF,CAEA,KAAK,QAAA,CAAU,CACb,MAAMwF,EAAAA,CAAcxF,CAAAA,CAAK,MAAM,CAAC,CAAC,EACjC,KACF,CAEA,KAAK,UAAA,CAAY,CACf,IAAMqX,CAAAA,CAAarX,CAAAA,CAAK,CAAC,CAAA,CAErBqX,CAAAA,GAAe,OACjB,MAAMjX,EAAAA,CAAeJ,CAAAA,CAAK,KAAA,CAAM,CAAC,CAAC,EACzBqX,CAAAA,GAAe,QAAA,CACxB,MAAMjW,EAAAA,CAAqBpB,CAAAA,CAAK,MAAM,CAAC,CAAC,EAC/BqX,CAAAA,GAAe,OAAA,CACxB,MAAM1V,EAAAA,CAAoB3B,CAAAA,CAAK,MAAM,CAAC,CAAC,GAEvC,OAAA,CAAQ,KAAA,CACN,CAAA,oBAAA,EAAuBqX,CAAAA,EAAc,QAAQ;AAAA,OAAA,EACjCpa,CAAQ,CAAA;AAAA,OAAA,EACRA,CAAQ,CAAA;AAAA,OAAA,EACRA,CAAQ,CAAA,eAAA,CACtB,CAAA,CACA,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,CAAA,CAEhB,KACF,CAEA,KAAK,UAAA,CAAY,CACf,IAAMoa,EAAarX,CAAAA,CAAK,CAAC,CAAA,CAEzB,GAAIqX,CAAAA,GAAe,MAAA,CACjB,MAAM/Q,EAAAA,CAAoBtG,CAAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,KAAA,GAC9BqX,CAAAA,GAAe,OAAQ,CAChC,IAAM5U,CAAAA,CAAOzC,CAAAA,CAAK,CAAC,CAAA,CACdyC,CAAAA,GACH,OAAA,CAAQ,KAAA,CAAM,uCAAuC,CAAA,CACrD,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,CAAA,CAEhB,MAAMyE,EAAAA,CAAoBzE,CAAAA,CAAMzC,CAAAA,CAAK,KAAA,CAAM,CAAC,CAAC,EAC/C,CAAA,KACE,OAAA,CAAQ,KAAA,CACN,CAAA,oBAAA,EAAuBqX,CAAAA,EAAc,QAAQ;AAAA,OAAA,EACjCpa,CAAQ,CAAA;AAAA,OAAA,EACRA,CAAQ,CAAA,oCAAA,CACtB,CAAA,CACA,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,CAEhB,KACF,CAEA,KAAK,QAAA,CAAU,CACb,MAAMuY,EAAAA,CAAcxV,CAAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA,CACjC,KACF,CAEA,KAAK,cAAA,CAAgB,CACnB,MAAMsV,EAAAA,CAAmBtV,CAAAA,CAAK,KAAA,CAAM,CAAC,CAAC,EACtC,KACF,CAEA,KAAK,QAAA,CAAU,CACb,MAAMuD,EAAAA,CAAcvD,CAAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA,CACjC,KACF,CAEA,KAAK,UAAA,CAAY,CACf,IAAMqX,CAAAA,CAAarX,CAAAA,CAAK,CAAC,CAAA,CACrBqX,CAAAA,GAAe,MAAA,CACjB,MAAMf,GAAoBtW,CAAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA,EAEvC,OAAA,CAAQ,KAAA,CACN,CAAA,oBAAA,EAAuBqX,GAAc,QAAQ;AAAA,OAAA,EACjCpa,CAAQ,CAAA,gCAAA,CACtB,CAAA,CACA,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,CAAA,CAEhB,KACF,CAEA,QACE,OAAA,CAAQ,KAAA,CACN,oBAAoBma,CAAO;AAAA,KAAA,EAAUna,CAAQ,CAAA,mBAAA,CAC/C,CAAA,CACA,OAAA,CAAQ,IAAA,CAAK,CAAC,EAClB,CACF,CAEA+Z,EAAAA,EAAK,CAAE,KAAA,CAAO5U,GAAQ,CACpB,OAAA,CAAQ,KAAA,CAAMA,CAAAA,CAAI,OAAA,EAAWA,CAAG,EAChC,OAAA,CAAQ,IAAA,CAAK,CAAC,EAChB,CAAC,CAAA","file":"cli.js","sourcesContent":["export const CLI_NAME = \"directive\";\nexport const CLI_ALIAS = \"dr\";\nexport const PACKAGE_NAME = \"@directive-run/cli\";\nexport const SECTION_START = \"<!-- directive:start -->\";\nexport const SECTION_END = \"<!-- directive:end -->\";\n","import { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nexport interface DetectedTool {\n name: string;\n id: \"cursor\" | \"claude\" | \"copilot\" | \"windsurf\" | \"cline\";\n outputPath: string;\n}\n\nconst TOOL_SIGNALS: Array<{\n id: DetectedTool[\"id\"];\n name: string;\n signals: string[];\n outputPath: string;\n}> = [\n {\n id: \"cursor\",\n name: \"Cursor\",\n signals: [\".cursor\", \".cursorrules\"],\n outputPath: \".cursorrules\",\n },\n {\n id: \"claude\",\n name: \"Claude Code\",\n signals: [\".claude\"],\n outputPath: \".claude/CLAUDE.md\",\n },\n {\n id: \"copilot\",\n name: \"GitHub Copilot\",\n signals: [\".github\"],\n outputPath: \".github/copilot-instructions.md\",\n },\n {\n id: \"windsurf\",\n name: \"Windsurf\",\n signals: [\".windsurfrules\"],\n outputPath: \".windsurfrules\",\n },\n {\n id: \"cline\",\n name: \"Cline\",\n signals: [\".clinerules\"],\n outputPath: \".clinerules\",\n },\n];\n\nexport function detectTools(rootDir: string): DetectedTool[] {\n const detected: DetectedTool[] = [];\n\n for (const tool of TOOL_SIGNALS) {\n const hasSignal = tool.signals.some((signal) =>\n existsSync(join(rootDir, signal)),\n );\n\n if (hasSignal) {\n detected.push({\n name: tool.name,\n id: tool.id,\n outputPath: join(rootDir, tool.outputPath),\n });\n }\n }\n\n return detected;\n}\n\nexport function getToolConfig(id: DetectedTool[\"id\"]) {\n const tool = TOOL_SIGNALS.find((t) => t.id === id);\n if (!tool) {\n throw new Error(`Unknown tool: ${id}`);\n }\n\n return tool;\n}\n\nexport function getAllToolIds(): DetectedTool[\"id\"][] {\n return TOOL_SIGNALS.map((t) => t.id);\n}\n","import { SECTION_END, SECTION_START } from \"./constants.js\";\n\n/**\n * Replace the Directive section within existing content, or append it.\n * Section markers: <!-- directive:start --> ... <!-- directive:end -->\n */\nexport function mergeSection(\n existingContent: string,\n newSection: string,\n): string {\n const startIdx = existingContent.indexOf(SECTION_START);\n const endIdx = existingContent.indexOf(SECTION_END);\n\n const wrapped = `${SECTION_START}\\n${newSection}\\n${SECTION_END}`;\n\n if (startIdx !== -1 && endIdx !== -1 && endIdx > startIdx) {\n return (\n existingContent.slice(0, startIdx) +\n wrapped +\n existingContent.slice(endIdx + SECTION_END.length)\n );\n }\n\n const separator = existingContent.endsWith(\"\\n\") ? \"\\n\" : \"\\n\\n\";\n\n return existingContent + separator + wrapped + \"\\n\";\n}\n\n/**\n * Check if content already has a Directive section.\n */\nexport function hasDirectiveSection(content: string): boolean {\n return content.includes(SECTION_START) && content.includes(SECTION_END);\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\n\nexport interface MonorepoInfo {\n isMonorepo: boolean;\n rootDir: string;\n tool?: \"pnpm\" | \"turbo\" | \"npm\" | \"yarn\";\n}\n\nconst MONOREPO_SIGNALS = [\n { file: \"pnpm-workspace.yaml\", tool: \"pnpm\" as const },\n { file: \"turbo.json\", tool: \"turbo\" as const },\n];\n\nexport function detectMonorepo(startDir: string): MonorepoInfo {\n let dir = resolve(startDir);\n\n while (dir !== dirname(dir)) {\n for (const signal of MONOREPO_SIGNALS) {\n if (existsSync(join(dir, signal.file))) {\n return { isMonorepo: true, rootDir: dir, tool: signal.tool };\n }\n }\n\n const pkgPath = join(dir, \"package.json\");\n if (existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\"));\n if (pkg.workspaces) {\n const tool = existsSync(join(dir, \"yarn.lock\"))\n ? (\"yarn\" as const)\n : (\"npm\" as const);\n\n return { isMonorepo: true, rootDir: dir, tool };\n }\n } catch {\n // ignore parse errors\n }\n }\n\n dir = dirname(dir);\n }\n\n return { isMonorepo: false, rootDir: startDir };\n}\n","import { getKnowledge } from \"../lib/knowledge.js\";\n\n/**\n * Generate Claude Code rules (~30KB).\n * Strategy: Full anti-patterns + core-patterns + naming + schema-types (most critical),\n * condensed summaries for everything else.\n */\nexport function generateClaudeRules(): string {\n // These 4 files are included in full (~25KB)\n const corePatterns = getKnowledge(\"core-patterns\");\n const antiPatterns = getKnowledge(\"anti-patterns\");\n const naming = getKnowledge(\"naming\");\n const schemaTypes = getKnowledge(\"schema-types\");\n\n return `# Directive — Complete AI Coding Rules\n\n> Constraint-driven runtime for TypeScript. Declare requirements, let the runtime resolve them.\n> https://directive.run | \\`npm install @directive-run/core\\`\n> Full reference with examples: https://directive.run/llms.txt\n\n## Core Patterns\n\n${corePatterns}\n\n---\n\n## Anti-Patterns (All 36)\n\n${antiPatterns}\n\n### AI Package Anti-Patterns (21-36)\n\n| # | WRONG | CORRECT |\n|---|-------|---------|\n| 21 | TS types for factsSchema: \\`{ confidence: number }\\` | Use \\`{ confidence: t.number() }\\` |\n| 22 | \\`facts.cache.push(item)\\` in orchestrator | \\`facts.cache = [...facts.cache, item]\\` |\n| 23 | Returning data from orchestrator \\`resolve\\` | Resolvers return \\`void\\` — mutate \\`context.facts\\` |\n| 24 | Forgetting \\`orchestrator.start()\\` multi-agent | Single: implicit. Multi: must call \\`start()\\` |\n| 25 | Catching \\`Error\\` not \\`GuardrailError\\` | \\`GuardrailError\\` has \\`.guardrailName\\`, \\`.errorCode\\` |\n| 26 | \\`from '@directive-run/ai'\\` for adapters | Subpath: \\`from '@directive-run/ai/openai'\\` |\n| 27 | Assuming \\`{ input_tokens }\\` structure | Normalized: \\`{ inputTokens, outputTokens }\\` |\n| 28 | Same CircuitBreaker across agents | Create separate instances per dependency |\n| 29 | \\`budgetWarningThreshold: 1.5\\` | Must be 0-1 (percentage) |\n| 30 | \\`race\\` minSuccess > agents.length | Must be \\`1 ≤ minSuccess ≤ agents.length\\` |\n| 31 | Async summarizer with autoManage: true | Use \\`autoManage: false\\` for sync control |\n| 32 | Side effects in reflect \\`evaluator\\` | Evaluator must be pure |\n| 33 | Task calling \\`runSingleAgent\\` | Tasks can't call agents — separate node |\n| 34 | Task expecting object input | Input is always \\`string\\` — \\`JSON.parse(input)\\` |\n| 35 | Task ID same as agent ID | IDs share namespace — distinct names |\n| 36 | \\`from '@directive-run/ai/mcp'\\` | \\`from '@directive-run/ai'\\` (main export) |\n\n---\n\n## Naming Conventions\n\n${naming}\n\n---\n\n## Schema Type Builders\n\n${schemaTypes}\n\n---\n\n## Multi-Module Quick Reference\n\n\\`\\`\\`typescript\n// Two modules with cross-module dependency\nconst authSchema = { facts: { token: t.string(), isAuth: t.boolean() } };\nconst authModule = createModule(\"auth\", { schema: authSchema, /* ... */ });\n\nconst cartModule = createModule(\"cart\", {\n schema: { facts: { items: t.array<CartItem>() } },\n crossModuleDeps: { auth: authSchema }, // Declare dependency\n constraints: {\n checkout: {\n when: (facts) => facts.self.items.length > 0 && facts.auth.isAuth, // facts.self.* for own, facts.auth.* for cross\n require: () => ({ type: \"CHECKOUT\" }),\n },\n },\n // ...\n});\n\nconst system = createSystem({ modules: { auth: authModule, cart: cartModule } });\n// Access: system.facts.auth.token, system.events.cart.addItem({...})\n\\`\\`\\`\n\nKey rules:\n- \\`facts.self.*\\` for own module facts in constraints/resolvers\n- \\`facts.otherModule.*\\` for cross-module reads\n- \\`crossModuleDeps\\` must declare consumed schemas\n- \\`system.events.moduleName.eventName(payload)\\` for namespaced events\n- The \\`::\\` separator is internal — always use dot notation\n\n---\n\n## Constraints\n\n- \\`when(facts)\\` → boolean. When true, requirement is emitted.\n- \\`require(facts)\\` → \\`{ type: \"TYPE\", ...data }\\` object (never string literal)\n- \\`priority: number\\` — higher evaluated first\n- \\`after: [\"constraintName\"]\\` — ordering within same priority\n- Async: \\`async: true\\` + \\`deps: ['factName']\\` (deps REQUIRED for async)\n- Constraints DECLARE needs, resolvers FULFILL them — decoupled.\n\n---\n\n## Resolvers\n\n- \\`resolve(req, context)\\` — async, returns \\`void\\`. Mutate \\`context.facts.*\\`.\n- \\`requirement: \"TYPE\"\\` — which type this handles\n- \\`key: (req) => string\\` — deduplication key\n- \\`retry: { attempts: 3, backoff: \"exponential\", initialDelay: 100 }\\`\n- \\`batch: { maxSize: 10, windowMs: 50 }\\` for N+1 prevention\n- Always \\`await system.settle()\\` after start to wait for resolution\n\n---\n\n## System API\n\n- \\`system.facts.fieldName\\` — read/write facts\n- \\`system.derive.derivationName\\` — read derived values\n- \\`system.events.eventName(payload)\\` — dispatch events\n- \\`system.subscribe(listener)\\` — subscribe to all changes\n- \\`system.read(key)\\` — read fact or derivation by string key\n- \\`system.inspect()\\` — full state snapshot\n- \\`system.settle()\\` — wait for async operations\n- \\`system.start()\\` / \\`system.stop()\\` / \\`system.destroy()\\`\n\n---\n\n## React (\\`@directive-run/react\\`)\n\n\\`\\`\\`typescript\nimport { useSelector, useEvent } from \"@directive-run/react\";\n\nconst count = useSelector(system, (s) => s.facts.count);\nconst events = useEvent(system);\n// onClick={() => events.increment()}\n\\`\\`\\`\n\n**NO** \\`useDirective()\\` hook. Use \\`useSelector\\` + \\`useEvent\\`.\n\n---\n\n## Plugins (\\`@directive-run/core/plugins\\`)\n\n\\`devtoolsPlugin()\\`, \\`loggingPlugin()\\`, \\`persistencePlugin(config)\\`,\n\\`createCircuitBreaker(config)\\`, \\`createObservability(config)\\`\n\n---\n\n## AI Package (\\`@directive-run/ai\\`)\n\n### Single-Agent Orchestrator\n\n\\`\\`\\`typescript\nimport { createAgentOrchestrator, t } from '@directive-run/ai';\nimport { createAnthropicRunner } from '@directive-run/ai/anthropic';\n\nconst orchestrator = createAgentOrchestrator({\n runner: createAnthropicRunner({ apiKey }),\n factsSchema: { result: t.string(), confidence: t.number() },\n init: (facts) => { facts.result = \"\"; facts.confidence = 0; },\n maxTokenBudget: 100000,\n budgetWarningThreshold: 0.8,\n guardrails: { input: [...], output: [...] },\n memory: createAgentMemory({ strategy: createSlidingWindowStrategy({ maxMessages: 30 }) }),\n debug: true,\n});\n\nconst result = await orchestrator.run(agent, \"analyze this\");\n\\`\\`\\`\n\n### Multi-Agent\n\n\\`\\`\\`typescript\nimport { createMultiAgentOrchestrator, parallel, sequential, dag } from '@directive-run/ai';\n\nconst orch = createMultiAgentOrchestrator({\n agents: { researcher: agentA, writer: agentB },\n patterns: {\n pipeline: sequential([\"researcher\", \"writer\"]),\n brainstorm: parallel([\"researcher\", \"writer\"], mergeResults),\n workflow: dag([\n { id: \"research\", handler: \"researcher\" },\n { id: \"write\", handler: \"writer\", dependencies: [\"research\"] },\n ]),\n },\n runner,\n});\norch.start(); // Required for multi-agent!\n\\`\\`\\`\n\n8 patterns: \\`parallel\\`, \\`sequential\\`, \\`supervisor\\`, \\`dag\\`, \\`reflect\\`, \\`race\\`, \\`debate\\`, \\`goal\\`\n\n### Adapter Imports (Subpath!)\n\n\\`\\`\\`typescript\nimport { createAnthropicRunner } from '@directive-run/ai/anthropic';\nimport { createOpenAIRunner } from '@directive-run/ai/openai';\nimport { createOllamaRunner } from '@directive-run/ai/ollama';\nimport { createGeminiRunner } from '@directive-run/ai/gemini';\n\\`\\`\\`\n\n### Guardrails\n\n\\`createPIIGuardrail\\`, \\`createModerationGuardrail\\`, \\`createRateLimitGuardrail\\`,\n\\`createToolGuardrail\\`, \\`createOutputSchemaGuardrail\\`, \\`createLengthGuardrail\\`,\n\\`createContentFilterGuardrail\\`\n\n\\`GuardrailResult: { passed: boolean, reason?: string, transformed?: unknown }\\`\n\n### Memory\n\n\\`createAgentMemory({ strategy, summarizer?, autoManage? })\\`\nStrategies: \\`createSlidingWindowStrategy\\`, \\`createTokenBasedStrategy\\`, \\`createHybridStrategy\\`\nSummarizers: \\`createTruncationSummarizer\\`, \\`createKeyPointsSummarizer\\`, \\`createLLMSummarizer(runner)\\`\n\n### Streaming\n\n\\`\\`\\`typescript\nconst streamResult = orchestrator.runStream(agent, \"analyze\");\nfor await (const chunk of streamResult.stream) {\n switch (chunk.type) {\n case \"token\": process.stdout.write(chunk.data); break;\n case \"done\": console.log(\"Tokens:\", chunk.totalTokens); break;\n case \"error\": console.error(chunk.error); break;\n }\n}\n\\`\\`\\`\n\nBackpressure: \\`\"buffer\"\\` (default), \\`\"block\"\\`, \\`\"drop\"\\`\n`;\n}\n","/**\n * Generate Cursor rules (<10KB).\n * Handcrafted condensed content — core patterns, top 10 anti-patterns, naming, 1 mini example.\n */\nexport function generateCursorRules(): string {\n return `# Directive — AI Coding Rules\n\n> Constraint-driven runtime for TypeScript. \\`npm install @directive-run/core\\`\n> Full reference: https://directive.run/llms.txt\n\n## Schema Shape (CRITICAL)\n\n\\`\\`\\`typescript\nimport { createModule, createSystem, t } from \"@directive-run/core\";\n\nconst myModule = createModule(\"name\", {\n schema: {\n facts: { count: t.number(), items: t.array<string>() },\n derivations: { total: \"number\" },\n events: { increment: \"void\", addItem: \"string\" },\n requirements: { FETCH_DATA: { url: \"string\" } },\n },\n init: (facts) => { facts.count = 0; facts.items = []; },\n derive: {\n total: (facts) => facts.items.length + facts.count,\n },\n events: {\n increment: (facts) => { facts.count += 1; },\n addItem: (facts, item) => { facts.items = [...facts.items, item]; },\n },\n constraints: {\n fetchWhenReady: {\n when: (facts) => facts.count > 0 && facts.items.length === 0,\n require: (facts) => ({ type: \"FETCH_DATA\", url: \"/api/items\" }),\n },\n },\n resolvers: {\n fetchData: {\n requirement: \"FETCH_DATA\",\n resolve: async (req, context) => {\n const data = await fetch(req.url).then(r => r.json());\n context.facts.items = data;\n },\n },\n },\n});\n\nconst system = createSystem({ module: myModule });\nawait system.settle();\n\\`\\`\\`\n\n## Top 10 Anti-Patterns\n\n| # | WRONG | CORRECT |\n|---|-------|---------|\n| 1 | \\`facts.profile as ResourceState<Profile>\\` | Remove cast — schema provides types |\n| 2 | \\`{ phase: t.string() }\\` flat schema | \\`schema: { facts: { phase: t.string() } }\\` |\n| 3 | \\`facts.items\\` in multi-module | \\`facts.self.items\\` |\n| 4 | \\`t.map()\\`, \\`t.set()\\`, \\`t.promise()\\` | Don't exist. Use \\`t.object<Map<K,V>>()\\` |\n| 5 | \\`(req, ctx)\\` in resolver | \\`(req, context)\\` — never abbreviate |\n| 6 | \\`createModule(\"n\", { phase: t.string() })\\` | Must wrap: \\`schema: { facts: { ... } }\\` |\n| 7 | \\`system.dispatch('login', {...})\\` | \\`system.events.login({...})\\` |\n| 8 | \\`facts.items.push(item)\\` | \\`facts.items = [...facts.items, item]\\` |\n| 9 | \\`useDirective(system)\\` | \\`useSelector(system, s => s.facts.count)\\` |\n| 10 | \\`facts['auth::status']\\` | \\`facts.auth.status\\` dot notation |\n\n## Naming\n\n- \\`req\\` = requirement (not request). Parameter: \\`(req, context)\\`\n- \\`derive\\` / derivations — never \"computed\" or \"selectors\"\n- Resolvers return \\`void\\` — mutate \\`context.facts\\` instead\n- Always use braces for returns: \\`if (x) { return y; }\\`\n- Multi-module: \\`facts.self.fieldName\\` for own module facts\n- Events: \\`system.events.eventName(payload)\\` — not \\`system.dispatch()\\`\n- Import from main: \\`import { createModule } from '@directive-run/core'\\`\n\n## Schema Types That Exist\n\n\\`t.string<T>()\\`, \\`t.number()\\`, \\`t.boolean()\\`, \\`t.array<T>()\\`, \\`t.object<T>()\\`,\n\\`t.enum(\"a\",\"b\")\\`, \\`t.literal(value)\\`, \\`t.nullable(inner)\\`, \\`t.optional(inner)\\`, \\`t.union(...)\\`\n\nChainable: \\`.default()\\`, \\`.validate()\\`, \\`.transform()\\`, \\`.brand<>()\\`, \\`.refine()\\`\n\n**DO NOT USE** (hallucinations): \\`t.map()\\`, \\`t.set()\\`, \\`t.date()\\`, \\`t.tuple()\\`, \\`t.record()\\`, \\`t.promise()\\`, \\`t.any()\\`\n\n## Key Pattern: Constraint → Requirement → Resolver\n\nWhen the user wants \"do X when Y\": create THREE things:\n1. **Constraint**: \\`when: (facts) => Y_condition\\` → \\`require: { type: \"DO_X\" }\\`\n2. **Resolver**: handles \"DO_X\", calls API, sets \\`context.facts\\`\n3. They are **decoupled**. Constraint declares need, resolver fulfills it.\n`;\n}\n","import { generateCursorRules } from \"./cursor.js\";\n\n/**\n * Generate GitHub Copilot instructions (~12KB).\n * Cursor content + all 20 anti-patterns + schema types detail + AI basics.\n */\nexport function generateCopilotRules(): string {\n const base = generateCursorRules();\n\n // Add anti-patterns 11-19 that cursor doesn't include\n const extraAntiPatterns = `\n## Anti-Patterns 11-19\n\n| # | WRONG | CORRECT |\n|---|-------|---------|\n| 11 | Returning data from \\`resolve\\` | Resolvers return \\`void\\` — mutate \\`context.facts\\` |\n| 12 | Async logic in \\`init\\` | \\`init\\` is synchronous, facts assignment only |\n| 13 | \\`await system.start()\\` without settle | Add \\`await system.settle()\\` after start |\n| 14 | Missing \\`crossModuleDeps\\` | Declare \\`crossModuleDeps: { auth: authSchema }\\` |\n| 15 | \\`require: \"TYPE\"\\` string literal | \\`require: { type: \"TYPE\" }\\` object form |\n| 16 | Passthrough derivation \\`(f) => f.count\\` | Remove — read fact directly |\n| 17 | \\`from '@directive-run/core/module'\\` | \\`from '@directive-run/core'\\` (main export) |\n| 18 | \\`async when()\\` without \\`deps\\` | Add \\`deps: ['factName']\\` for async constraints |\n| 19 | No error boundary on resolver | Use try-catch or module error boundary config |\n`;\n\n // Add multi-module basics\n const multiModule = `\n## Multi-Module\n\n\\`\\`\\`typescript\nconst system = createSystem({\n modules: { auth: authModule, cart: cartModule },\n});\n\n// Access: system.facts.auth.token, system.events.cart.addItem({...})\n// In constraints/resolvers: use facts.self.* for own module\n// Declare deps: crossModuleDeps: { auth: authSchema }\n\\`\\`\\`\n`;\n\n // Add AI basics\n const aiBasics = `\n## AI Package Basics (\\`@directive-run/ai\\`)\n\n\\`\\`\\`typescript\nimport { createAgentOrchestrator, t } from '@directive-run/ai';\nimport { createAnthropicRunner } from '@directive-run/ai/anthropic'; // Subpath import!\n\nconst orchestrator = createAgentOrchestrator({\n runner: createAnthropicRunner({ apiKey: process.env.ANTHROPIC_API_KEY }),\n factsSchema: { result: t.string(), confidence: t.number() }, // Use t.*() !\n init: (facts) => { facts.result = \"\"; facts.confidence = 0; },\n});\n\nconst result = await orchestrator.run(agent, \"analyze this\");\n\\`\\`\\`\n\n**AI Anti-Patterns:**\n- Use \\`t.number()\\` not \\`number\\` for factsSchema\n- Subpath imports: \\`from '@directive-run/ai/anthropic'\\` not \\`from '@directive-run/ai'\\`\n- Token usage normalized: \\`{ inputTokens, outputTokens }\\` (not provider-specific)\n- \\`facts.cache = [...facts.cache, item]\\` not \\`facts.cache.push(item)\\`\n`;\n\n return base + extraAntiPatterns + multiModule + aiBasics;\n}\n","import { generateCopilotRules } from \"./copilot.js\";\n\n/**\n * Generate Cline rules (~12KB).\n * Same content as Copilot.\n */\nexport function generateClineRules(): string {\n return generateCopilotRules();\n}\n","import { generateCopilotRules } from \"./copilot.js\";\n\n/**\n * Generate Windsurf rules (~12KB).\n * Same content as Copilot.\n */\nexport function generateWindsurfRules(): string {\n return generateCopilotRules();\n}\n","import type { DetectedTool } from \"../lib/detect.js\";\nimport { generateClaudeRules } from \"./claude.js\";\nimport { generateClineRules } from \"./cline.js\";\nimport { generateCopilotRules } from \"./copilot.js\";\nimport { generateCursorRules } from \"./cursor.js\";\nimport { generateLlmsTxt } from \"./llms-txt.js\";\nimport { generateWindsurfRules } from \"./windsurf.js\";\n\nconst generators: Record<DetectedTool[\"id\"], () => string> = {\n cursor: generateCursorRules,\n claude: generateClaudeRules,\n copilot: generateCopilotRules,\n windsurf: generateWindsurfRules,\n cline: generateClineRules,\n};\n\nexport function getTemplate(toolId: DetectedTool[\"id\"]): string {\n const generator = generators[toolId];\n if (!generator) {\n throw new Error(`No template for tool: ${toolId}`);\n }\n\n return generator();\n}\n\nexport { generateLlmsTxt };\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join, relative } from \"node:path\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { CLI_NAME } from \"../lib/constants.js\";\nimport {\n type DetectedTool,\n detectTools,\n getAllToolIds,\n getToolConfig,\n} from \"../lib/detect.js\";\nimport { hasDirectiveSection, mergeSection } from \"../lib/merge.js\";\nimport { detectMonorepo } from \"../lib/monorepo.js\";\nimport { getTemplate } from \"../templates/index.js\";\n\ninterface Options {\n force: boolean;\n merge: boolean;\n tools: string[];\n dir: string;\n}\n\nfunction parseArgs(args: string[]): Options {\n const opts: Options = {\n force: false,\n merge: false,\n tools: [],\n dir: process.cwd(),\n };\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n\n switch (arg) {\n case \"--force\":\n opts.force = true;\n break;\n case \"--merge\":\n opts.merge = true;\n break;\n case \"--tool\": {\n const val = args[++i];\n if (val) {\n opts.tools.push(val);\n }\n break;\n }\n case \"--dir\": {\n const val = args[++i];\n if (val) {\n opts.dir = val;\n }\n break;\n }\n }\n }\n\n return opts;\n}\n\nexport async function aiRulesCommand(args: string[]) {\n const opts = parseArgs(args);\n\n p.intro(pc.bgCyan(pc.black(\" directive ai-rules \")));\n\n // Step 1: Detect monorepo\n const mono = detectMonorepo(opts.dir);\n let targetDir = opts.dir;\n\n if (mono.isMonorepo && mono.rootDir !== opts.dir) {\n const placement = await p.select({\n message: \"Monorepo detected. Where should AI rules be installed?\",\n options: [\n {\n value: \"root\",\n label: `Monorepo root (${relative(opts.dir, mono.rootDir) || \".\"})`,\n hint: \"recommended\",\n },\n {\n value: \"workspace\",\n label: `Current workspace (${relative(mono.rootDir, opts.dir)})`,\n },\n ],\n });\n\n if (p.isCancel(placement)) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n\n if (placement === \"root\") {\n targetDir = mono.rootDir;\n }\n }\n\n // Step 2: Detect or select tools\n let selectedTools: DetectedTool[];\n\n if (opts.tools.length > 0) {\n selectedTools = opts.tools.map((id) => {\n const config = getToolConfig(id as DetectedTool[\"id\"]);\n\n return {\n name: config.name,\n id: config.id,\n outputPath: join(targetDir, config.outputPath),\n };\n });\n } else {\n const detected = detectTools(targetDir);\n\n if (detected.length > 0) {\n const choices = await p.multiselect({\n message: `Detected ${detected.length} AI tool(s). Which should get Directive rules?`,\n options: detected.map((t) => ({\n value: t.id,\n label: t.name,\n hint: relative(targetDir, t.outputPath),\n })),\n initialValues: detected.map((t) => t.id),\n required: true,\n });\n\n if (p.isCancel(choices)) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n\n selectedTools = (choices as DetectedTool[\"id\"][]).map((id) => {\n const config = getToolConfig(id);\n\n return {\n name: config.name,\n id: config.id,\n outputPath: join(targetDir, config.outputPath),\n };\n });\n } else {\n const choices = await p.multiselect({\n message: \"No AI tools detected. Which tools do you use?\",\n options: getAllToolIds().map((id) => {\n const config = getToolConfig(id);\n\n return { value: id, label: config.name };\n }),\n required: true,\n });\n\n if (p.isCancel(choices)) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n\n selectedTools = (choices as DetectedTool[\"id\"][]).map((id) => {\n const config = getToolConfig(id);\n\n return {\n name: config.name,\n id: config.id,\n outputPath: join(targetDir, config.outputPath),\n };\n });\n }\n }\n\n if (selectedTools.length === 0) {\n p.cancel(\"No tools selected.\");\n process.exit(0);\n }\n\n // Step 3: Write files\n const s = p.spinner();\n\n for (const tool of selectedTools) {\n s.start(`Generating ${tool.name} rules...`);\n\n const content = getTemplate(tool.id);\n const filePath = tool.outputPath;\n const fileExists = existsSync(filePath);\n\n s.stop(`Generated ${tool.name} rules.`);\n\n if (fileExists && !opts.force) {\n const existingContent = readFileSync(filePath, \"utf-8\");\n\n if (opts.merge) {\n writeFile(filePath, mergeSection(existingContent, content));\n p.log.success(\n `${pc.green(\"Merged\")} Directive section into ${pc.dim(relative(targetDir, filePath))}`,\n );\n continue;\n }\n\n if (hasDirectiveSection(existingContent)) {\n const action = await p.select({\n message: `${relative(targetDir, filePath)} already has a Directive section. What should we do?`,\n options: [\n {\n value: \"merge\",\n label: \"Update Directive section only\",\n hint: \"recommended\",\n },\n { value: \"overwrite\", label: \"Overwrite entire file\" },\n { value: \"skip\", label: \"Skip this file\" },\n ],\n });\n\n if (p.isCancel(action)) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n\n if (action === \"merge\") {\n writeFile(filePath, mergeSection(existingContent, content));\n p.log.success(\n `${pc.green(\"Updated\")} ${pc.dim(relative(targetDir, filePath))}`,\n );\n } else if (action === \"overwrite\") {\n writeFile(filePath, content);\n p.log.success(\n `${pc.green(\"Wrote\")} ${pc.dim(relative(targetDir, filePath))}`,\n );\n } else {\n p.log.info(`Skipped ${pc.dim(relative(targetDir, filePath))}`);\n }\n } else {\n const action = await p.select({\n message: `${relative(targetDir, filePath)} already exists. What should we do?`,\n options: [\n {\n value: \"append\",\n label: \"Append Directive section\",\n hint: \"preserves existing content\",\n },\n { value: \"overwrite\", label: \"Overwrite entire file\" },\n { value: \"skip\", label: \"Skip this file\" },\n ],\n });\n\n if (p.isCancel(action)) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n\n if (action === \"append\") {\n writeFile(filePath, mergeSection(existingContent, content));\n p.log.success(\n `${pc.green(\"Appended\")} to ${pc.dim(relative(targetDir, filePath))}`,\n );\n } else if (action === \"overwrite\") {\n writeFile(filePath, content);\n p.log.success(\n `${pc.green(\"Wrote\")} ${pc.dim(relative(targetDir, filePath))}`,\n );\n } else {\n p.log.info(`Skipped ${pc.dim(relative(targetDir, filePath))}`);\n }\n }\n } else {\n writeFile(filePath, content);\n p.log.success(\n `${pc.green(\"Created\")} ${pc.dim(relative(targetDir, filePath))}`,\n );\n }\n }\n\n p.outro(\n `Done! Run ${pc.cyan(`${CLI_NAME} ai-rules init --merge`)} anytime to update.`,\n );\n}\n\nfunction writeFile(filePath: string, content: string) {\n const dir = dirname(filePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n writeFileSync(filePath, content, \"utf-8\");\n}\n\n// ---------------------------------------------------------------------------\n// ai-rules update — regenerate all existing rule files\n// ---------------------------------------------------------------------------\n\nexport async function aiRulesUpdateCommand(args: string[]) {\n const opts = parseArgs(args);\n const targetDir = opts.dir;\n\n const ruleFiles: Array<{ id: DetectedTool[\"id\"]; path: string }> = [\n { id: \"cursor\", path: join(targetDir, \".cursorrules\") },\n { id: \"claude\", path: join(targetDir, \".claude/CLAUDE.md\") },\n { id: \"copilot\", path: join(targetDir, \".github/copilot-instructions.md\") },\n { id: \"windsurf\", path: join(targetDir, \".windsurfrules\") },\n { id: \"cline\", path: join(targetDir, \".clinerules\") },\n ];\n\n let updated = 0;\n\n for (const file of ruleFiles) {\n if (!existsSync(file.path)) {\n continue;\n }\n\n const existing = readFileSync(file.path, \"utf-8\");\n if (!hasDirectiveSection(existing)) {\n continue;\n }\n\n const newContent = getTemplate(file.id);\n const merged = mergeSection(existing, newContent);\n\n writeFile(file.path, merged);\n console.log(\n `${pc.green(\"Updated\")} ${pc.dim(relative(targetDir, file.path))}`,\n );\n updated++;\n }\n\n if (updated === 0) {\n console.log(\n pc.dim(\n `No existing rule files found. Run ${pc.cyan(`${CLI_NAME} ai-rules init`)} first.`,\n ),\n );\n } else {\n console.log(\n pc.green(`\\nUpdated ${updated} file(s) to latest knowledge version.`),\n );\n }\n}\n\n// ---------------------------------------------------------------------------\n// ai-rules check — exit non-zero if rules are stale (CI-friendly)\n// ---------------------------------------------------------------------------\n\nexport async function aiRulesCheckCommand(args: string[]) {\n const opts = parseArgs(args);\n const targetDir = opts.dir;\n\n const ruleFiles: Array<{\n id: DetectedTool[\"id\"];\n path: string;\n name: string;\n }> = [\n { id: \"cursor\", path: join(targetDir, \".cursorrules\"), name: \"Cursor\" },\n {\n id: \"claude\",\n path: join(targetDir, \".claude/CLAUDE.md\"),\n name: \"Claude Code\",\n },\n {\n id: \"copilot\",\n path: join(targetDir, \".github/copilot-instructions.md\"),\n name: \"GitHub Copilot\",\n },\n {\n id: \"windsurf\",\n path: join(targetDir, \".windsurfrules\"),\n name: \"Windsurf\",\n },\n { id: \"cline\", path: join(targetDir, \".clinerules\"), name: \"Cline\" },\n ];\n\n let checked = 0;\n let stale = 0;\n\n for (const file of ruleFiles) {\n if (!existsSync(file.path)) {\n continue;\n }\n\n const existing = readFileSync(file.path, \"utf-8\");\n if (!hasDirectiveSection(existing)) {\n continue;\n }\n\n checked++;\n\n // Generate fresh content and merge, then compare\n const freshContent = getTemplate(file.id);\n const merged = mergeSection(existing, freshContent);\n\n if (merged !== existing) {\n console.log(\n `${pc.red(\"✗\")} ${file.name} rules are ${pc.yellow(\"stale\")}`,\n );\n stale++;\n } else {\n console.log(\n `${pc.green(\"✓\")} ${file.name} rules are ${pc.green(\"current\")}`,\n );\n }\n }\n\n if (checked === 0) {\n console.log(pc.dim(\"No rule files found to check.\"));\n\n return;\n }\n\n if (stale > 0) {\n console.log(\n `\\n${pc.yellow(`${stale} file(s) are stale.`)} Run ${pc.cyan(`${CLI_NAME} ai-rules update`)} to refresh.`,\n );\n process.exit(1);\n } else {\n console.log(pc.green(\"\\nAll rule files are current.\"));\n }\n}\n","import { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport pc from \"picocolors\";\n\n/**\n * Loads a Directive system from a user's TypeScript file.\n *\n * Uses tsx to handle TypeScript imports. Looks for:\n * 1. Default export of a System instance\n * 2. Named \"system\" export\n *\n * Returns the live System object for inspection/explain/graph commands.\n *\n * Note: Returns `any` intentionally — the loaded module is user code with\n * unknown types. Duck-type validation via `isSystem()` ensures the returned\n * object has the required shape (start, stop, inspect, facts).\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport async function loadSystem(filePath: string): Promise<any> {\n const resolved = resolve(filePath);\n\n if (!existsSync(resolved)) {\n throw new Error(`File not found: ${resolved}`);\n }\n\n // Use tsx register to handle TypeScript imports\n try {\n // Dynamic import with tsx — tsx must be available\n const mod = await import(resolved);\n\n // Look for default export first\n if (mod.default && isSystem(mod.default)) {\n return mod.default;\n }\n\n // Look for named \"system\" export\n if (mod.system && isSystem(mod.system)) {\n return mod.system;\n }\n\n // Look for any export that looks like a System\n for (const key of Object.keys(mod)) {\n if (isSystem(mod[key])) {\n return mod[key];\n }\n }\n\n throw new Error(\n `No Directive system found in ${pc.dim(filePath)}\\n` +\n `Export a system as default or named \"system\":\\n\\n` +\n ` ${pc.cyan(\"export default\")} createSystem({ module: myModule });\\n` +\n ` ${pc.cyan(\"export const system\")} = createSystem({ module: myModule });`,\n );\n } catch (err) {\n if (err instanceof Error && err.message.includes(\"No Directive system\")) {\n throw err;\n }\n\n throw new Error(\n `Failed to load ${pc.dim(filePath)}: ${err instanceof Error ? err.message : String(err)}\\n\\n` +\n `Make sure the file is valid TypeScript and tsx is installed:\\n` +\n ` ${pc.cyan(\"npm install -D tsx\")}`,\n );\n }\n}\n\n/**\n * Duck-type check for a Directive System object.\n */\nfunction isSystem(obj: unknown): boolean {\n if (typeof obj !== \"object\" || obj === null) {\n return false;\n }\n\n const sys = obj as Record<string, unknown>;\n\n return (\n typeof sys.inspect === \"function\" &&\n typeof sys.start === \"function\" &&\n typeof sys.stop === \"function\" &&\n \"facts\" in sys\n );\n}\n\n/**\n * Loads a Directive system *factory* from a user's TypeScript file.\n *\n * Where {@link loadSystem} returns a one-shot started system instance,\n * `loadSystemFactory()` returns a callable that produces a fresh,\n * started system on every invocation. This is the contract that\n * `directive bisect` needs — each midpoint replay must start from the\n * same hermetic initial state, so we re-instantiate per attempt.\n *\n * Lookup order (first match wins):\n * 1. Named export `createSystem` (function).\n * 2. Named export `systemFactory` (function).\n * 3. Default export, if it's a function.\n *\n * The factory may return either a System directly or a Promise<System>.\n * Whatever it returns must satisfy {@link isSystem}'s duck-type\n * (`inspect`/`start`/`stop`/`facts`). The factory is responsible for\n * calling `start()` itself — the bisect runner does NOT call start.\n *\n * @example\n * ```ts\n * // User's bisect-system.ts:\n * import { createSystem as makeSys } from \"@directive-run/core\";\n * import { counterModule } from \"./modules/counter\";\n *\n * export function createSystem() {\n * const sys = makeSys({ module: counterModule });\n * sys.start();\n * return sys;\n * }\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport async function loadSystemFactory(\n filePath: string,\n): Promise<() => Promise<any>> {\n const resolved = resolve(filePath);\n\n if (!existsSync(resolved)) {\n throw new Error(`File not found: ${resolved}`);\n }\n\n let mod: Record<string, unknown>;\n try {\n mod = (await import(resolved)) as Record<string, unknown>;\n } catch (err) {\n throw new Error(\n `Failed to load ${pc.dim(filePath)}: ${err instanceof Error ? err.message : String(err)}\\n\\n` +\n `Make sure the file is valid TypeScript and tsx is installed:\\n` +\n ` ${pc.cyan(\"npm install -D tsx\")}`,\n );\n }\n\n const candidates: Array<[string, unknown]> = [\n [\"createSystem\", mod.createSystem],\n [\"systemFactory\", mod.systemFactory],\n [\"default\", mod.default],\n ];\n\n for (const [name, candidate] of candidates) {\n if (typeof candidate === \"function\") {\n // Wrap so we always return a Promise and validate the result\n // shape after each call (catches \"factory exists but returns\n // junk\" — common when the user forgets to call sys.start()).\n return async () => {\n const result = await Promise.resolve((candidate as () => unknown)());\n if (!isSystem(result)) {\n throw new Error(\n `Factory '${name}' from ${pc.dim(filePath)} returned a value that is not a started Directive system.\\n` +\n `Expected an object with inspect/start/stop/facts. The factory must call sys.start() before returning.`,\n );\n }\n return result;\n };\n }\n }\n\n // R5 DX C4: detect the most common confusion — user passed a file\n // that exports a STARTED system (the shape `directive replay` wants)\n // and got a confusing \"no factory\" error. Surface a targeted message\n // explaining how to wrap it.\n const hasStartedInstance =\n isSystem(mod.default) ||\n isSystem(mod.system) ||\n Object.values(mod).some(isSystem);\n\n if (hasStartedInstance) {\n throw new Error(\n `Found a started Directive system in ${pc.dim(filePath)}, but bisect needs a factory.\\n` +\n `Bisect instantiates a fresh system for every midpoint replay (so each attempt is hermetic),\\n` +\n `which means it can't reuse a singleton instance the way ${pc.cyan(\"directive replay\")} does.\\n\\n` +\n `Wrap the existing export in a function:\\n\\n` +\n ` ${pc.cyan(\"export function createSystem()\")} {\\n` +\n ` const sys = createSystem({ module: yourModule });\\n` +\n ` sys.start();\\n` +\n ` return sys;\\n` +\n ` }`,\n );\n }\n\n throw new Error(\n `No system factory found in ${pc.dim(filePath)}\\n` +\n `Bisect needs to instantiate a fresh system per midpoint replay. Export one of:\\n\\n` +\n ` ${pc.cyan(\"export function createSystem()\")} { ... return sys; }\\n` +\n ` ${pc.cyan(\"export const systemFactory\")} = () => { ... return sys; };\\n` +\n ` ${pc.cyan(\"export default\")} () => { ... return sys; };\\n\\n` +\n `The factory MUST call sys.start() and return the started system.\\n` +\n `(Did you forget ${pc.cyan(\"sys.start()\")} before returning?)`,\n );\n}\n","/**\n * Shared lazy-import helper for `@directive-run/timeline`. Three CLI\n * commands (`replay`, `bisect`, `timeline diff`) all need to load\n * timeline at runtime as an optional peer — without this helper each\n * command duplicates the same try/catch + error message.\n *\n * `import type` at the top is fully erased at compile time, so the\n * lazy `await import()` semantics are preserved exactly: timeline\n * stays an optional peer, the CLI runs without it for non-timeline\n * commands, and the typed module shape is still single-sourced.\n *\n * (R5 arch C2 + arch M2.)\n */\n\nimport pc from \"picocolors\";\n\n// eslint-disable-next-line @typescript-eslint/consistent-type-imports\nimport type * as Timeline from \"@directive-run/timeline\";\n\nexport type TimelineModule = typeof Timeline;\n\n/**\n * Load `@directive-run/timeline` lazily. On failure, prints a clear\n * install-prompt error and exits with code 1.\n *\n * @param verbose — when true, also prints the underlying require/import\n * error to stderr for debugging.\n */\nexport async function loadTimelinePackage(\n verbose = false,\n): Promise<TimelineModule> {\n try {\n return (await import(\"@directive-run/timeline\")) as TimelineModule;\n } catch (err) {\n console.error(\n pc.red(\n `error: @directive-run/timeline not installed in this project.\\n Install it: npm install --save-dev @directive-run/timeline`,\n ),\n );\n if (verbose) console.error(pc.dim((err as Error).message));\n process.exit(1);\n }\n}\n","/**\n * `directive bisect <timeline.json> --system <factory.ts> --assert <expr>`\n *\n * Git-bisect, but over recorded timeline frames. Pairs with\n * `@directive-run/timeline`'s `serializeTimeline()` + `bisectTimeline()`\n * — typical flow:\n *\n * 1. Production captures a timeline that ends in a known-bad state.\n * 2. Engineer downloads the JSON, picks a JS expression that\n * distinguishes the good state from the bad state (e.g.\n * `facts.count >= 0`).\n * 3. Run:\n * directive bisect bug-1234.json \\\n * --system test/bisect-system.ts \\\n * --assert 'facts.count >= 0'\n * 4. CLI binary-searches the frame stream and prints the first\n * frame whose inclusion flips the assertion to false.\n *\n * --system contract\n * The user's TypeScript file must export a factory: a callable\n * returning a freshly-instantiated, started Directive system. Bisect\n * calls the factory once per midpoint replay so each attempt is\n * hermetic. See `loadSystemFactory()` for the exact lookup rules.\n *\n * --assert contract\n * The expression is evaluated as a JS Function body with `facts` and\n * `system` in scope. Returning a truthy value means \"this prefix is\n * in the GOOD region of the search\"; falsy means \"this prefix is in\n * the BAD region.\" Bisect locates the smallest prefix in the BAD\n * region.\n *\n * --assert 'facts.count >= 0' // good: count never negative\n * --assert 'facts.status !== \"error\"' // good: status not error\n * --assert 'system.inspect().errors.length === 0' // good: no errors\n *\n * The expression runs LOCALLY in the CLI process — there's no\n * sandbox. Don't pass arbitrary strings from untrusted callers.\n *\n * v0.1 scope:\n * - Single-timeline bisect (no good.json/bad.json comparison yet).\n * - String --assert expression (no `--assert-file` to load a vitest\n * yet; that's R2.D territory).\n * - Reports first failing frame index + reconstructs the dispatch\n * payload for human readability.\n *\n * v0.2 (deferred):\n * - `directive bisect --good <good.json> --bad <bad.json>` — diff\n * two timelines and bisect the delta.\n * - `--assert-file <vitest.ts>` — run a real test as the oracle.\n * - `--git-bisect` — emit a bisect-run script.\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport pc from \"picocolors\";\nimport { loadSystemFactory } from \"../lib/loader.js\";\nimport { loadTimelinePackage } from \"../lib/timeline-loader.js\";\n\ninterface BisectCliOptions {\n systemPath?: string;\n assertExpr?: string;\n maxFrames?: number;\n noDeterminismCheck: boolean;\n json: boolean;\n verbose: boolean;\n}\n\nfunction parseArgs(args: string[]): {\n jsonPath: string;\n opts: BisectCliOptions;\n} {\n const opts: BisectCliOptions = {\n json: false,\n noDeterminismCheck: false,\n verbose: false,\n };\n let jsonPath = \"\";\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n switch (arg) {\n case \"--system\":\n case \"-s\": {\n const val = args[++i];\n if (val) opts.systemPath = val;\n break;\n }\n case \"--assert\":\n case \"-a\": {\n const val = args[++i];\n if (val) opts.assertExpr = val;\n break;\n }\n case \"--max-frames\": {\n const val = args[++i];\n const n = val ? Number.parseInt(val, 10) : Number.NaN;\n if (Number.isFinite(n) && n > 0) opts.maxFrames = n;\n break;\n }\n case \"--no-determinism-check\":\n opts.noDeterminismCheck = true;\n break;\n case \"--json\":\n opts.json = true;\n break;\n case \"--verbose\":\n case \"-v\":\n opts.verbose = true;\n break;\n default:\n if (arg && !arg.startsWith(\"-\") && !jsonPath) {\n jsonPath = arg;\n }\n }\n }\n\n return { jsonPath, opts };\n}\n\nfunction printUsage(): void {\n console.error(`\nUsage: directive bisect <timeline.json> --system <factory.ts> --assert <expr>\n\nBinary-search a recorded timeline for the first frame that triggers a\nfailing assertion — git-bisect, but over ObservationEvent frames.\n\nArguments:\n <timeline.json> Path to a timeline produced by serializeTimeline()\n\nOptions:\n --system, -s <path> TypeScript file exporting a system factory\n (createSystem / systemFactory / default).\n The factory must return a started Directive\n system; bisect calls it once per midpoint.\n --assert, -a <expression> JS expression with 'facts' and 'system' in\n scope. Truthy = good prefix, falsy = bad\n prefix. Bisect finds the smallest bad prefix.\n --max-frames <n> Per-replay frame cap (default 100,000)\n --no-determinism-check Skip the \"replay-twice and compare\" gate\n before bisecting. Use only on timelines you\n know are deterministic.\n --json Emit BisectResult as JSON\n --verbose, -v Print every midpoint and its verdict\n --help, -h Show this help\n\nSECURITY: --assert is evaluated as JavaScript in this process. Only\npass expressions from sources you trust (your own scripts, your own\nPRs). Don't paste expressions from issues, untrusted Slack messages,\nor third-party sources without reading them first.\n\nExamples:\n directive bisect bug-1234.json --system test/bisect-sys.ts \\\\\n --assert 'facts.count >= 0'\n\n directive bisect crash.json -s factory.ts -a 'facts.status !== \"error\"' --json\n`);\n}\n\n/**\n * Build a user-supplied JS expression into a callable oracle that\n * returns boolean. Accepts `facts` and `system` as the only in-scope\n * names. Throws at parse time if the expression is malformed.\n *\n * Important: this evaluates user-supplied JS in the CLI process. The\n * CLI is a local-trust tool (operator runs it on their own machine\n * with their own input), so this is acceptable. Do NOT relay this\n * surface to a server-side context.\n */\nfunction compileAssertion(expr: string): (system: unknown) => boolean {\n let fn: (facts: unknown, system: unknown) => unknown;\n try {\n // Function constructor is intentional: the assertion expression\n // needs lexical scope of `facts` + `system` as variables.\n fn = new Function(\"facts\", \"system\", `\"use strict\"; return (${expr});`) as (\n facts: unknown,\n system: unknown,\n ) => unknown;\n } catch (err) {\n throw new Error(\n `Failed to compile --assert expression: ${(err as Error).message}\\n expression: ${expr}`,\n );\n }\n return (system: unknown) => {\n const facts = (system as { facts?: unknown })?.facts;\n const result = fn(facts, system);\n return Boolean(result);\n };\n}\n\nexport async function bisectCommand(args: string[]): Promise<void> {\n if (args.includes(\"--help\") || args.includes(\"-h\") || args.length === 0) {\n printUsage();\n process.exit(args.length === 0 ? 1 : 0);\n }\n\n const { jsonPath, opts } = parseArgs(args);\n\n if (!jsonPath) {\n console.error(pc.red(\"error: missing <timeline.json> argument\"));\n printUsage();\n process.exit(1);\n }\n if (!opts.systemPath) {\n console.error(\n pc.red(\"error: --system <path> is required\"),\n pc.dim(\n \"\\n (bisect needs a factory to instantiate a fresh system per midpoint)\",\n ),\n );\n printUsage();\n process.exit(1);\n }\n if (!opts.assertExpr) {\n console.error(\n pc.red(\"error: --assert <expression> is required\"),\n pc.dim(\n \"\\n (assertion distinguishes 'good' from 'bad' system state)\",\n ),\n );\n printUsage();\n process.exit(1);\n }\n\n // Load the timeline JSON.\n const resolvedJson = resolve(jsonPath);\n if (!existsSync(resolvedJson)) {\n console.error(pc.red(`error: timeline file not found: ${resolvedJson}`));\n process.exit(1);\n }\n\n let raw: string;\n try {\n raw = readFileSync(resolvedJson, \"utf8\");\n } catch (err) {\n console.error(\n pc.red(\n `error: failed to read ${resolvedJson}: ${(err as Error).message}`,\n ),\n );\n process.exit(1);\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (err) {\n console.error(\n pc.red(\n `error: ${resolvedJson} is not valid JSON: ${(err as Error).message}`,\n ),\n );\n process.exit(1);\n }\n\n // Lazy-import the timeline package — optional peer. Types come\n // from `import type` inside the helper, so we get full type safety\n // without forcing timeline into the install graph for non-timeline\n // CLI commands.\n const { deserializeTimeline, bisectTimeline } = await loadTimelinePackage(\n opts.verbose,\n );\n\n // Validate + deserialize.\n let timeline: ReturnType<typeof deserializeTimeline>;\n try {\n timeline = deserializeTimeline(parsed);\n } catch (err) {\n console.error(\n pc.red(\n `error: timeline JSON failed validation: ${(err as Error).message}`,\n ),\n );\n process.exit(1);\n }\n\n // Compile the assertion before any replay so a malformed expression\n // fails fast with a clear message instead of after a minute of work.\n let assertion: (system: unknown) => boolean;\n try {\n assertion = compileAssertion(opts.assertExpr);\n } catch (err) {\n console.error(pc.red(`error: ${(err as Error).message}`));\n process.exit(1);\n }\n\n // Load the user's factory.\n let factory: () => Promise<unknown>;\n try {\n factory = await loadSystemFactory(opts.systemPath);\n } catch (err) {\n console.error(\n pc.red(`error: failed to load system factory: ${(err as Error).message}`),\n );\n process.exit(1);\n }\n\n if (opts.verbose) {\n console.error(\n pc.dim(\n `bisecting ${timeline.frames.length} frames with assertion: ${opts.assertExpr}`,\n ),\n );\n }\n\n // Run bisect. The factory's return is verified at runtime by\n // loadSystemFactory() to be a started Directive system (which\n // satisfies ReplayableSystem's `dispatch` requirement); the cast\n // here just bridges loadSystemFactory's `any` return to bisect's\n // typed factory shape.\n const result = await bisectTimeline(\n timeline,\n factory as () => Promise<{\n dispatch: (event: { type: string; [key: string]: unknown }) => void;\n }>,\n assertion,\n {\n maxFrames: opts.maxFrames,\n determinismCheck: !opts.noDeterminismCheck,\n },\n );\n\n if (opts.json) {\n // Strip the heavy frame object from JSON output — the index alone\n // is enough for tooling, and the full frame would double the\n // payload size for callers that just want to pipe into jq.\n // R5 sec #9: emit `null` (not `undefined`) for absent index so jq\n // consumers can distinguish \"fails before frame 0\" (index=null,\n // failsOnEmptyReplay=true) from \"frame 0 itself triggers\"\n // (index=0, failsOnEmptyReplay=false). JSON.stringify drops\n // `undefined` keys which made these states indistinguishable.\n const lean = {\n firstFailingFrameIndex: result.firstFailingFrameIndex ?? null,\n iterations: result.iterations,\n noFailureFound: result.noFailureFound,\n failsOnEmptyReplay: result.failsOnEmptyReplay,\n nonDeterministic: result.nonDeterministic,\n };\n console.log(JSON.stringify(lean, null, 2));\n process.exit(0);\n }\n\n // Human-friendly output.\n if (result.nonDeterministic) {\n console.error(pc.red(\"✗ bisect aborted: timeline is non-deterministic\"));\n console.error(\n pc.dim(\n ` Two full-timeline replays produced different oracle verdicts.\\n` +\n ` Bisection is unreliable on non-deterministic timelines.\\n` +\n ` Either fix the timeline source (deterministic clocks/seeds)\\n` +\n ` or re-run with --no-determinism-check if you accept the risk.`,\n ),\n );\n process.exit(2);\n }\n if (result.noFailureFound) {\n console.error(\n pc.yellow(\n \"⚠ no failure to bisect: assertion passes on the full timeline\",\n ),\n );\n console.error(\n pc.dim(\n ` The recorded timeline does not exhibit the bug your\\n` +\n ` --assert expression checks. Verify the assertion or\\n` +\n ` try a different bad.json.`,\n ),\n );\n process.exit(0);\n }\n if (result.failsOnEmptyReplay) {\n console.error(\n pc.yellow(\n \"⚠ assertion fails BEFORE any frame replays — bug is in initialization\",\n ),\n );\n console.error(\n pc.dim(\n ` The freshly-started system already violates the assertion.\\n` +\n ` Bisect cannot narrow further. Inspect the system factory\\n` +\n ` or initial fact values.`,\n ),\n );\n process.exit(0);\n }\n\n // Standard hit.\n const idx = result.firstFailingFrameIndex ?? -1;\n const frame = result.firstFailingFrame;\n const eventType = frame?.event.type ?? \"<unknown>\";\n console.log(\n `${pc.green(\"✓\")} bisect complete: ${pc.bold(`first failing frame is #${idx}`)} ${pc.dim(`(${eventType})`)}`,\n );\n console.log(\n pc.dim(\n ` • iterations: ${result.iterations} | timeline frames: ${timeline.frames.length}`,\n ),\n );\n if (opts.verbose && frame) {\n console.log(pc.dim(\" • frame:\"));\n console.log(\n pc.dim(\n ` ${JSON.stringify(frame, null, 2).split(\"\\n\").join(\"\\n \")}`,\n ),\n );\n }\n // R5 DX M3: align with `directive timeline diff` and the rest of\n // the CLI's exit-code convention. A \"standard hit\" means we LOCATED\n // a failing frame — the user's original premise (bad.json fails)\n // is now confirmed. CI gates can branch on `directive bisect && echo OK`\n // to mean \"the timeline is clean.\"\n // 0 — nothing wrong (noFailureFound / failsOnEmptyReplay handled above)\n // 1 — CLI argument / file / module error (handled above)\n // 2 — problem found (this branch) OR refused to bisect (nonDeterministic, above)\n process.exit(2);\n}\n","import { existsSync, readFileSync, readdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport pc from \"picocolors\";\nimport { hasDirectiveSection } from \"../lib/merge.js\";\n\ninterface DoctorOptions {\n dir: string;\n}\n\nfunction parseArgs(args: string[]): DoctorOptions {\n const opts: DoctorOptions = { dir: process.cwd() };\n\n for (let i = 0; i < args.length; i++) {\n if (args[i] === \"--dir\") {\n const val = args[++i];\n if (val) {\n opts.dir = val;\n }\n }\n }\n\n return opts;\n}\n\n// ---------------------------------------------------------------------------\n// Checks\n// ---------------------------------------------------------------------------\n\ninterface CheckResult {\n label: string;\n passed: boolean;\n message: string;\n fix?: string;\n}\n\nfunction checkCoreInstalled(dir: string): CheckResult {\n const pkgPath = join(dir, \"package.json\");\n if (!existsSync(pkgPath)) {\n return {\n label: \"@directive-run/core installed\",\n passed: false,\n message: \"No package.json found\",\n fix: \"Run `npm init` to create a package.json\",\n };\n }\n\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\"));\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\n\n if (!deps[\"@directive-run/core\"]) {\n return {\n label: \"@directive-run/core installed\",\n passed: false,\n message: \"Not found in dependencies\",\n fix: \"Run `npm install @directive-run/core`\",\n };\n }\n\n return {\n label: \"@directive-run/core installed\",\n passed: true,\n message: `v${deps[\"@directive-run/core\"]}`,\n };\n}\n\nfunction checkVersionCompatibility(dir: string): CheckResult {\n const pkgPath = join(dir, \"package.json\");\n if (!existsSync(pkgPath)) {\n return {\n label: \"Package version compatibility\",\n passed: true,\n message: \"Skipped (no package.json)\",\n };\n }\n\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\"));\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\n\n const directivePackages = Object.keys(deps).filter((k) =>\n k.startsWith(\"@directive-run/\"),\n );\n\n if (directivePackages.length <= 1) {\n return {\n label: \"Package version compatibility\",\n passed: true,\n message:\n directivePackages.length === 0 ? \"No packages found\" : \"Single package\",\n };\n }\n\n return {\n label: \"Package version compatibility\",\n passed: true,\n message: `${directivePackages.length} packages: ${directivePackages.join(\", \")}`,\n };\n}\n\nfunction checkTypeScript(dir: string): CheckResult {\n const tsconfigPath = join(dir, \"tsconfig.json\");\n\n if (!existsSync(tsconfigPath)) {\n return {\n label: \"TypeScript configuration\",\n passed: false,\n message: \"No tsconfig.json found\",\n fix: \"Run `tsc --init` to create a TypeScript configuration\",\n };\n }\n\n try {\n // Simple JSON parse — doesn't handle comments or extends\n const raw = readFileSync(tsconfigPath, \"utf-8\");\n // Strip single-line comments for parsing\n const stripped = raw\n .replace(/\\/\\/.*$/gm, \"\")\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, \"\");\n const config = JSON.parse(stripped);\n const co = config.compilerOptions || {};\n\n const issues: string[] = [];\n\n if (co.strict !== true) {\n issues.push(\"strict mode not enabled\");\n }\n\n if (\n co.moduleResolution &&\n ![\"bundler\", \"nodenext\", \"node16\"].includes(\n co.moduleResolution.toLowerCase(),\n )\n ) {\n issues.push(`moduleResolution is \"${co.moduleResolution}\"`);\n }\n\n if (issues.length > 0) {\n return {\n label: \"TypeScript configuration\",\n passed: false,\n message: issues.join(\", \"),\n fix: 'Set \"strict\": true and \"moduleResolution\": \"bundler\" in tsconfig.json',\n };\n }\n\n return {\n label: \"TypeScript configuration\",\n passed: true,\n message: \"strict mode, correct module resolution\",\n };\n } catch {\n return {\n label: \"TypeScript configuration\",\n passed: true,\n message: \"Found (could not parse for detailed checks)\",\n };\n }\n}\n\nfunction checkDuplicateInstances(dir: string): CheckResult {\n const nodeModules = join(dir, \"node_modules\");\n\n if (!existsSync(nodeModules)) {\n return {\n label: \"No duplicate Directive instances\",\n passed: true,\n message: \"No node_modules found\",\n };\n }\n\n const duplicates: string[] = [];\n\n // Check for nested @directive-run/core in node_modules\n try {\n const scopeDir = join(nodeModules, \"@directive-run\");\n if (existsSync(scopeDir)) {\n const packages = readdirSync(scopeDir);\n for (const pkg of packages) {\n const nestedCore = join(\n scopeDir,\n pkg,\n \"node_modules\",\n \"@directive-run\",\n \"core\",\n );\n if (existsSync(nestedCore)) {\n duplicates.push(\n `@directive-run/${pkg}/node_modules/@directive-run/core`,\n );\n }\n }\n }\n } catch {\n // Can't read node_modules, skip\n }\n\n if (duplicates.length > 0) {\n return {\n label: \"No duplicate Directive instances\",\n passed: false,\n message: `Found ${duplicates.length} duplicate(s): ${duplicates.join(\", \")}`,\n fix: \"Run `npm dedupe` or check for version mismatches\",\n };\n }\n\n return {\n label: \"No duplicate Directive instances\",\n passed: true,\n message: \"No duplicates detected\",\n };\n}\n\nfunction checkAIRulesFreshness(dir: string): CheckResult {\n const ruleFiles = [\n \".cursorrules\",\n \".claude/CLAUDE.md\",\n \".github/copilot-instructions.md\",\n \".windsurfrules\",\n \".clinerules\",\n ];\n\n const found: string[] = [];\n\n for (const file of ruleFiles) {\n const filePath = join(dir, file);\n if (existsSync(filePath)) {\n const content = readFileSync(filePath, \"utf-8\");\n if (hasDirectiveSection(content)) {\n found.push(file);\n }\n }\n }\n\n if (found.length === 0) {\n return {\n label: \"AI coding rules\",\n passed: true,\n message: \"Not installed (optional)\",\n };\n }\n\n return {\n label: \"AI coding rules\",\n passed: true,\n message: `Installed for: ${found.join(\", \")}`,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Command\n// ---------------------------------------------------------------------------\n\nexport async function doctorCommand(args: string[]) {\n const opts = parseArgs(args);\n\n console.log();\n console.log(pc.bold(pc.cyan(\"Directive Doctor\")));\n console.log(pc.dim(\"─\".repeat(40)));\n console.log();\n\n const checks = [\n checkCoreInstalled(opts.dir),\n checkVersionCompatibility(opts.dir),\n checkTypeScript(opts.dir),\n checkDuplicateInstances(opts.dir),\n checkAIRulesFreshness(opts.dir),\n ];\n\n let failures = 0;\n\n for (const check of checks) {\n const icon = check.passed ? pc.green(\"✓\") : pc.red(\"✗\");\n console.log(`${icon} ${pc.bold(check.label)}`);\n console.log(` ${pc.dim(check.message)}`);\n\n if (!check.passed && check.fix) {\n console.log(` ${pc.yellow(\"Fix:\")} ${check.fix}`);\n failures++;\n }\n\n console.log();\n }\n\n if (failures > 0) {\n console.log(\n pc.yellow(`${failures} issue(s) found. See suggested fixes above.`),\n );\n process.exit(1);\n } else {\n console.log(pc.green(\"All checks passed!\"));\n }\n}\n","import { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, join, relative } from \"node:path\";\nimport pc from \"picocolors\";\nimport { getAllExamples, getExample } from \"../lib/knowledge.js\";\n\n// ---------------------------------------------------------------------------\n// Categories\n// ---------------------------------------------------------------------------\n\nconst CATEGORIES: Record<string, string[]> = {\n \"Getting Started\": [\"counter\", \"contact-form\", \"auth-flow\"],\n \"Core Patterns\": [\n \"async-chains\",\n \"batch-resolver\",\n \"debounce-constraints\",\n \"error-boundaries\",\n \"feature-flags\",\n \"multi-module\",\n \"optimistic-updates\",\n \"pagination\",\n \"permissions\",\n ],\n \"Real-World\": [\n \"dashboard-loader\",\n \"form-wizard\",\n \"newsletter\",\n \"notifications\",\n \"shopping-cart\",\n \"theme-locale\",\n \"url-sync\",\n \"websocket\",\n \"server\",\n ],\n Games: [\"checkers\", \"sudoku\", \"goal-heist\", \"ab-testing\"],\n AI: [\n \"ai-orchestrator\",\n \"ai-checkpoint\",\n \"ai-guardrails\",\n \"fraud-analysis\",\n \"provider-routing\",\n \"topic-guard\",\n \"dynamic-modules\",\n \"time-machine\",\n ],\n};\n\nfunction getCategory(name: string): string {\n for (const [cat, names] of Object.entries(CATEGORIES)) {\n if (names.includes(name)) {\n return cat;\n }\n }\n\n return \"Other\";\n}\n\nfunction getDescription(content: string): string {\n // Extract first line comment or jsdoc summary\n const lines = content.split(\"\\n\");\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n // Match: // Example: name or // Source: ...\n if (trimmed.startsWith(\"// Example:\")) {\n continue;\n }\n if (trimmed.startsWith(\"// Source:\")) {\n continue;\n }\n if (trimmed.startsWith(\"// Extracted\")) {\n continue;\n }\n\n // Match JSDoc: * Description text\n const jsdocMatch = trimmed.match(/^\\*\\s+(.+?)(?:\\s*\\*\\/)?$/);\n if (jsdocMatch?.[1] && !jsdocMatch[1].startsWith(\"@\")) {\n return jsdocMatch[1];\n }\n\n // Match: // Description text\n if (trimmed.startsWith(\"//\") && trimmed.length > 3) {\n return trimmed.slice(2).trim();\n }\n\n // Stop at first non-comment line\n if (\n trimmed !== \"\" &&\n !trimmed.startsWith(\"//\") &&\n !trimmed.startsWith(\"/*\") &&\n !trimmed.startsWith(\"*\")\n ) {\n break;\n }\n }\n\n return \"\";\n}\n\n// ---------------------------------------------------------------------------\n// List command\n// ---------------------------------------------------------------------------\n\nexport async function examplesListCommand(args: string[]) {\n let filter: string | undefined;\n\n for (let i = 0; i < args.length; i++) {\n if (args[i] === \"--filter\") {\n filter = args[++i]?.toLowerCase();\n }\n }\n\n const examples = getAllExamples();\n\n console.log();\n console.log(pc.bold(pc.cyan(\"Directive Examples\")));\n console.log(pc.dim(\"─\".repeat(50)));\n console.log();\n\n // Group by category\n const byCategory = new Map<string, Array<{ name: string; desc: string }>>();\n\n for (const [name, content] of examples) {\n const cat = getCategory(name);\n\n if (\n filter &&\n !cat.toLowerCase().includes(filter) &&\n !name.includes(filter)\n ) {\n continue;\n }\n\n if (!byCategory.has(cat)) {\n byCategory.set(cat, []);\n }\n byCategory.get(cat)!.push({ name, desc: getDescription(content) });\n }\n\n if (byCategory.size === 0) {\n console.log(pc.dim(\"No examples match the filter.\"));\n\n return;\n }\n\n // Print in category order\n const categoryOrder = Object.keys(CATEGORIES);\n const sortedCategories = [...byCategory.keys()].sort(\n (a, b) =>\n (categoryOrder.indexOf(a) ?? 99) - (categoryOrder.indexOf(b) ?? 99),\n );\n\n for (const cat of sortedCategories) {\n const items = byCategory.get(cat)!;\n console.log(pc.bold(cat));\n\n for (const item of items) {\n const desc = item.desc ? pc.dim(` — ${item.desc}`) : \"\";\n console.log(` ${pc.cyan(item.name)}${desc}`);\n }\n\n console.log();\n }\n\n console.log(\n pc.dim(\n `${examples.size} examples available. Run ${pc.cyan(\"directive examples copy <name>\")} to extract one.`,\n ),\n );\n}\n\n// ---------------------------------------------------------------------------\n// Copy command\n// ---------------------------------------------------------------------------\n\nexport async function examplesCopyCommand(name: string, args: string[]) {\n let dest = process.cwd();\n\n for (let i = 0; i < args.length; i++) {\n if (args[i] === \"--dest\") {\n const val = args[++i];\n if (val) {\n dest = val;\n }\n }\n }\n\n if (!name) {\n console.error(\"Usage: directive examples copy <name> [--dest <dir>]\");\n process.exit(1);\n }\n\n const content = getExample(name);\n\n if (!content) {\n console.error(`Example \"${name}\" not found.`);\n console.error(\n `Run ${pc.cyan(\"directive examples list\")} to see available examples.`,\n );\n process.exit(1);\n }\n\n // Rewrite workspace imports to published package names\n const rewritten = content\n .replace(\n /from\\s+[\"']@directive-run\\/core\\/plugins[\"']/g,\n 'from \"@directive-run/core/plugins\"',\n )\n .replace(\n /from\\s+[\"']@directive-run\\/core[\"']/g,\n 'from \"@directive-run/core\"',\n )\n .replace(/from\\s+[\"']@directive-run\\/ai[\"']/g, 'from \"@directive-run/ai\"');\n\n const filePath = join(dest, `${name}.ts`);\n\n if (existsSync(filePath)) {\n console.error(`File already exists: ${relative(process.cwd(), filePath)}`);\n process.exit(1);\n }\n\n const dir = dirname(filePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n writeFileSync(filePath, rewritten, \"utf-8\");\n\n const rel = relative(process.cwd(), filePath);\n console.log(`${pc.green(\"Copied\")} ${pc.cyan(name)} → ${pc.dim(rel)}`);\n}\n","import pc from \"picocolors\";\nimport { loadSystem } from \"../lib/loader.js\";\n\ninterface ExplainOptions {\n module?: string;\n}\n\nfunction parseArgs(args: string[]): {\n filePath: string;\n requirementId?: string;\n opts: ExplainOptions;\n} {\n const opts: ExplainOptions = {};\n let filePath = \"\";\n let requirementId: string | undefined;\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n\n switch (arg) {\n case \"--module\": {\n const val = args[++i];\n if (val) {\n opts.module = val;\n }\n break;\n }\n default:\n if (arg && !arg.startsWith(\"-\")) {\n if (!filePath) {\n filePath = arg;\n } else if (!requirementId) {\n requirementId = arg;\n }\n }\n }\n }\n\n return { filePath, requirementId, opts };\n}\n\n// ---------------------------------------------------------------------------\n// Command\n// ---------------------------------------------------------------------------\n\nexport async function explainCommand(args: string[]) {\n const { filePath, requirementId } = parseArgs(args);\n\n if (!filePath) {\n console.error(\"Usage: directive explain <file> [requirement-id]\");\n process.exit(1);\n }\n\n const system = await loadSystem(filePath);\n\n if (!system.isRunning) {\n system.start();\n }\n\n const inspection = system.inspect();\n\n if (requirementId) {\n // Explain a specific requirement\n const explanation = system.explain(requirementId);\n\n if (!explanation) {\n console.error(\n `Requirement \"${requirementId}\" not found.\\n\\n` +\n \"Current requirements:\",\n );\n\n if (inspection.unmet.length === 0) {\n console.log(pc.dim(\" (no unmet requirements)\"));\n } else {\n for (const u of inspection.unmet) {\n console.log(\n ` ${pc.cyan(u.id)} — ${u.requirement.type} (from ${u.fromConstraint})`,\n );\n }\n }\n\n system.stop();\n process.exit(1);\n }\n\n console.log();\n console.log(pc.bold(pc.cyan(\"Requirement Explanation\")));\n console.log(pc.dim(\"─\".repeat(40)));\n console.log();\n console.log(explanation);\n console.log();\n } else {\n // List all requirements with status\n console.log();\n console.log(pc.bold(pc.cyan(\"All Requirements\")));\n console.log(pc.dim(\"─\".repeat(40)));\n console.log();\n\n if (inspection.unmet.length === 0) {\n console.log(pc.green(\"All requirements are met.\"));\n console.log();\n\n // Show resolver history if available\n const resolverEntries = Object.entries(\n inspection.resolvers as Record<\n string,\n { state: string; duration?: number; error?: string }\n >,\n );\n if (resolverEntries.length > 0) {\n console.log(pc.bold(\"Recent Resolver Activity:\"));\n for (const [key, status] of resolverEntries) {\n const state = formatState(status.state);\n const dur =\n status.duration !== undefined ? ` (${status.duration}ms)` : \"\";\n console.log(` ${pc.cyan(key)} ${state}${dur}`);\n }\n console.log();\n }\n } else {\n console.log(\n `${pc.yellow(String(inspection.unmet.length))} unmet requirement(s):\\n`,\n );\n\n for (const u of inspection.unmet) {\n console.log(\n `${pc.yellow(\"●\")} ${pc.bold(u.requirement.type)} (id: ${pc.dim(u.id)})`,\n );\n console.log(` From constraint: ${pc.cyan(u.fromConstraint)}`);\n\n // Show payload\n const payload = { ...u.requirement };\n delete (payload as Record<string, unknown>).type;\n const payloadKeys = Object.keys(payload);\n if (payloadKeys.length > 0) {\n console.log(` Payload: ${JSON.stringify(payload)}`);\n }\n\n // Check resolver status\n const resolverStatus = (\n inspection.resolvers as Record<\n string,\n { state: string; error?: string } | undefined\n >\n )[u.id];\n if (resolverStatus) {\n console.log(\n ` Resolver: ${formatState(resolverStatus.state)}${resolverStatus.error ? ` — ${resolverStatus.error}` : \"\"}`,\n );\n } else {\n // Check if any resolver handles this type\n const hasResolver = inspection.resolverDefs.some(\n (r: { id: string; requirement: string }) =>\n r.requirement === u.requirement.type ||\n r.requirement === \"(predicate)\",\n );\n if (!hasResolver) {\n console.log(` ${pc.red(\"No resolver registered for this type\")}`);\n }\n }\n\n console.log();\n }\n\n console.log(\n pc.dim(\n `Run ${pc.cyan(`directive explain <file> <requirement-id>`)} for detailed explanation.`,\n ),\n );\n }\n }\n\n system.stop();\n}\n\nfunction formatState(state: string): string {\n switch (state) {\n case \"resolved\":\n return pc.green(\"resolved\");\n case \"errored\":\n return pc.red(\"errored\");\n case \"inflight\":\n return pc.yellow(\"inflight\");\n case \"pending\":\n return pc.yellow(\"pending\");\n case \"cancelled\":\n return pc.dim(\"cancelled\");\n default:\n return pc.dim(state);\n }\n}\n","import { writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport pc from \"picocolors\";\nimport { loadSystem } from \"../lib/loader.js\";\n\ninterface GraphOptions {\n ascii: boolean;\n open: boolean;\n output?: string;\n}\n\nfunction parseArgs(args: string[]): { filePath: string; opts: GraphOptions } {\n const opts: GraphOptions = { ascii: false, open: true };\n let filePath = \"\";\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n\n switch (arg) {\n case \"--ascii\":\n opts.ascii = true;\n break;\n case \"--no-open\":\n opts.open = false;\n break;\n case \"--output\": {\n const val = args[++i];\n if (val) {\n opts.output = val;\n }\n break;\n }\n default:\n if (arg && !arg.startsWith(\"-\") && !filePath) {\n filePath = arg;\n }\n }\n }\n\n return { filePath, opts };\n}\n\n// ---------------------------------------------------------------------------\n// ASCII graph renderer\n// ---------------------------------------------------------------------------\n\nfunction renderAsciiGraph(inspection: {\n constraints: Array<{\n id: string;\n active: boolean;\n disabled: boolean;\n priority: number;\n }>;\n resolverDefs: Array<{ id: string; requirement: string }>;\n unmet: Array<{\n id: string;\n requirement: { type: string };\n fromConstraint: string;\n }>;\n}): string {\n const lines: string[] = [];\n\n lines.push(pc.bold(\"Dependency Graph\"));\n lines.push(pc.dim(\"═\".repeat(50)));\n lines.push(\"\");\n\n // Group by flow: constraint → requirement → resolver\n const constraintMap = new Map<\n string,\n { reqTypes: Set<string>; active: boolean; priority: number }\n >();\n\n for (const c of inspection.constraints) {\n constraintMap.set(c.id, {\n reqTypes: new Set(),\n active: c.active,\n priority: c.priority,\n });\n }\n\n // Map unmet requirements to constraints\n for (const u of inspection.unmet) {\n const entry = constraintMap.get(u.fromConstraint);\n if (entry) {\n entry.reqTypes.add(u.requirement.type);\n }\n }\n\n // Map resolvers to requirement types\n const resolversByType = new Map<string, string[]>();\n for (const r of inspection.resolverDefs) {\n if (!resolversByType.has(r.requirement)) {\n resolversByType.set(r.requirement, []);\n }\n resolversByType.get(r.requirement)!.push(r.id);\n }\n\n // Render constraint flows\n lines.push(pc.bold(\"Constraints → Requirements → Resolvers\"));\n lines.push(\"\");\n\n for (const [id, info] of constraintMap) {\n const status = info.active ? pc.green(\"●\") : pc.dim(\"○\");\n lines.push(`${status} ${pc.cyan(id)} (priority: ${info.priority})`);\n\n if (info.reqTypes.size > 0) {\n for (const reqType of info.reqTypes) {\n lines.push(` └─▶ ${pc.yellow(reqType)}`);\n\n const resolvers = resolversByType.get(reqType) || [];\n if (resolvers.length > 0) {\n for (const r of resolvers) {\n lines.push(` └─▶ ${pc.magenta(r)}`);\n }\n } else {\n lines.push(` └─▶ ${pc.red(\"(no resolver)\")}`);\n }\n }\n } else {\n lines.push(` └─▶ ${pc.dim(\"(no active requirements)\")}`);\n }\n\n lines.push(\"\");\n }\n\n // Orphaned resolvers\n const usedResolvers = new Set<string>();\n for (const resolvers of resolversByType.values()) {\n for (const r of resolvers) {\n usedResolvers.add(r);\n }\n }\n\n const allResolverIds = inspection.resolverDefs.map((r) => r.id);\n const orphanedCount = allResolverIds.filter(\n (r) => !usedResolvers.has(r),\n ).length;\n\n if (orphanedCount > 0) {\n lines.push(pc.bold(\"Standalone Resolvers:\"));\n for (const r of inspection.resolverDefs) {\n if (!usedResolvers.has(r.id)) {\n lines.push(` ${pc.magenta(r.id)} handles ${pc.yellow(r.requirement)}`);\n }\n }\n }\n\n return lines.join(\"\\n\");\n}\n\n// ---------------------------------------------------------------------------\n// HTML graph renderer\n// ---------------------------------------------------------------------------\n\nfunction renderHtmlGraph(\n inspection: {\n constraints: Array<{\n id: string;\n active: boolean;\n disabled: boolean;\n priority: number;\n hitCount: number;\n }>;\n resolverDefs: Array<{ id: string; requirement: string }>;\n resolvers: Record<string, { state: string }>;\n unmet: Array<{\n id: string;\n requirement: { type: string };\n fromConstraint: string;\n }>;\n },\n facts: Record<string, unknown>,\n): string {\n // Build nodes and edges for a simple SVG visualization\n const nodes: Array<{\n id: string;\n label: string;\n type: \"fact\" | \"constraint\" | \"requirement\" | \"resolver\";\n x: number;\n y: number;\n color: string;\n }> = [];\n const edges: Array<{ from: string; to: string }> = [];\n\n const colWidth = 220;\n const rowHeight = 50;\n const startX = 40;\n const startY = 60;\n\n // Column 1: Facts\n const factKeys = Object.keys(facts);\n for (let i = 0; i < factKeys.length; i++) {\n const key = factKeys[i]!;\n nodes.push({\n id: `fact-${key}`,\n label: key,\n type: \"fact\",\n x: startX,\n y: startY + i * rowHeight,\n color: \"#3b82f6\",\n });\n }\n\n // Column 2: Constraints\n for (let i = 0; i < inspection.constraints.length; i++) {\n const c = inspection.constraints[i]!;\n nodes.push({\n id: `constraint-${c.id}`,\n label: c.id,\n type: \"constraint\",\n x: startX + colWidth,\n y: startY + i * rowHeight,\n color: c.active ? \"#22c55e\" : \"#6b7280\",\n });\n }\n\n // Column 3: Requirements (from unmet)\n const reqTypes = new Set<string>();\n for (const u of inspection.unmet) {\n reqTypes.add(u.requirement.type);\n }\n let reqIdx = 0;\n for (const reqType of reqTypes) {\n nodes.push({\n id: `req-${reqType}`,\n label: reqType,\n type: \"requirement\",\n x: startX + colWidth * 2,\n y: startY + reqIdx * rowHeight,\n color: \"#eab308\",\n });\n reqIdx++;\n }\n\n // Column 4: Resolvers\n for (let i = 0; i < inspection.resolverDefs.length; i++) {\n const r = inspection.resolverDefs[i]!;\n nodes.push({\n id: `resolver-${r.id}`,\n label: r.id,\n type: \"resolver\",\n x: startX + colWidth * 3,\n y: startY + i * rowHeight,\n color: \"#a855f7\",\n });\n }\n\n // Edges: constraint → requirement\n for (const u of inspection.unmet) {\n edges.push({\n from: `constraint-${u.fromConstraint}`,\n to: `req-${u.requirement.type}`,\n });\n }\n\n // Edges: requirement → resolver\n for (const r of inspection.resolverDefs) {\n if (reqTypes.has(r.requirement)) {\n edges.push({\n from: `req-${r.requirement}`,\n to: `resolver-${r.id}`,\n });\n }\n }\n\n const nodeMap = new Map(nodes.map((n) => [n.id, n]));\n const svgWidth = startX + colWidth * 4 + 40;\n const maxY = Math.max(...nodes.map((n) => n.y)) + rowHeight + 20;\n\n const edgeSvg = edges\n .map((e) => {\n const from = nodeMap.get(e.from);\n const to = nodeMap.get(e.to);\n if (!from || !to) {\n return \"\";\n }\n\n return `<line x1=\"${from.x + 90}\" y1=\"${from.y + 15}\" x2=\"${to.x}\" y2=\"${to.y + 15}\" stroke=\"#94a3b8\" stroke-width=\"1.5\" marker-end=\"url(#arrow)\"/>`;\n })\n .join(\"\\n \");\n\n const nodeSvg = nodes\n .map(\n (n) =>\n `<g>\n <rect x=\"${n.x}\" y=\"${n.y}\" width=\"180\" height=\"30\" rx=\"6\" fill=\"${n.color}\" opacity=\"0.15\" stroke=\"${n.color}\" stroke-width=\"1.5\"/>\n <text x=\"${n.x + 90}\" y=\"${n.y + 19}\" text-anchor=\"middle\" font-size=\"12\" font-family=\"monospace\" fill=\"${n.color}\">${escapeHtml(n.label)}</text>\n </g>`,\n )\n .join(\"\\n \");\n\n // Column headers\n const headers = [\"Facts\", \"Constraints\", \"Requirements\", \"Resolvers\"];\n const headerSvg = headers\n .map(\n (h, i) =>\n `<text x=\"${startX + i * colWidth + 90}\" y=\"35\" text-anchor=\"middle\" font-size=\"14\" font-weight=\"bold\" font-family=\"system-ui\" fill=\"#e2e8f0\">${h}</text>`,\n )\n .join(\"\\n \");\n\n return `<!DOCTYPE html>\n<html>\n<head>\n <title>Directive System Graph</title>\n <style>\n body { margin: 0; background: #0f172a; display: flex; justify-content: center; padding: 20px; }\n svg { max-width: 100%; }\n </style>\n</head>\n<body>\n <svg width=\"${svgWidth}\" height=\"${maxY}\" xmlns=\"http://www.w3.org/2000/svg\">\n <defs>\n <marker id=\"arrow\" viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"6\" markerHeight=\"6\" orient=\"auto-start-reverse\">\n <path d=\"M 0 0 L 10 5 L 0 10 z\" fill=\"#94a3b8\"/>\n </marker>\n </defs>\n ${headerSvg}\n ${edgeSvg}\n ${nodeSvg}\n </svg>\n</body>\n</html>`;\n}\n\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\");\n}\n\n// ---------------------------------------------------------------------------\n// Command\n// ---------------------------------------------------------------------------\n\nexport async function graphCommand(args: string[]) {\n const { filePath, opts } = parseArgs(args);\n\n if (!filePath) {\n console.error(\n \"Usage: directive graph <file> [--ascii] [--no-open] [--output <path>]\",\n );\n process.exit(1);\n }\n\n const system = await loadSystem(filePath);\n\n if (!system.isRunning) {\n system.start();\n }\n\n const inspection = system.inspect();\n\n if (opts.ascii) {\n console.log(renderAsciiGraph(inspection));\n system.stop();\n\n return;\n }\n\n // HTML output\n const factsObj: Record<string, unknown> = {};\n if (system.facts) {\n for (const key of Object.keys(system.facts)) {\n try {\n factsObj[key] = system.facts[key];\n } catch {\n factsObj[key] = null;\n }\n }\n }\n\n const html = renderHtmlGraph(inspection, factsObj);\n const outputPath =\n opts.output || join(process.cwd(), \".directive-graph.html\");\n\n writeFileSync(outputPath, html, \"utf-8\");\n console.log(`${pc.green(\"Generated\")} ${pc.dim(outputPath)}`);\n\n if (opts.open) {\n try {\n const { execFile } = await import(\"node:child_process\");\n const openCmd =\n process.platform === \"darwin\"\n ? \"open\"\n : process.platform === \"win32\"\n ? \"start\"\n : \"xdg-open\";\n execFile(openCmd, [outputPath]);\n console.log(pc.dim(\"Opened in browser.\"));\n } catch {\n console.log(\n pc.dim(`Open ${outputPath} in your browser to view the graph.`),\n );\n }\n }\n\n system.stop();\n}\n","import { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, join, relative } from \"node:path\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { CLI_NAME } from \"../lib/constants.js\";\n\ninterface InitOptions {\n template?: string;\n dir: string;\n noInteractive: boolean;\n}\n\nfunction parseArgs(args: string[]): InitOptions {\n const opts: InitOptions = {\n dir: process.cwd(),\n noInteractive: false,\n };\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n\n switch (arg) {\n case \"--template\": {\n const val = args[++i];\n if (val) {\n opts.template = val;\n }\n break;\n }\n case \"--dir\": {\n const val = args[++i];\n if (val) {\n opts.dir = val;\n }\n break;\n }\n case \"--no-interactive\":\n opts.noInteractive = true;\n break;\n }\n }\n\n return opts;\n}\n\n// ---------------------------------------------------------------------------\n// Package manager detection\n// ---------------------------------------------------------------------------\n\ntype PackageManager = \"pnpm\" | \"npm\" | \"yarn\" | \"bun\";\n\nfunction detectPackageManager(dir: string): PackageManager {\n if (existsSync(join(dir, \"pnpm-lock.yaml\"))) {\n return \"pnpm\";\n }\n if (existsSync(join(dir, \"bun.lockb\")) || existsSync(join(dir, \"bun.lock\"))) {\n return \"bun\";\n }\n if (existsSync(join(dir, \"yarn.lock\"))) {\n return \"yarn\";\n }\n\n return \"npm\";\n}\n\nfunction installCmd(pm: PackageManager, pkg: string): string {\n switch (pm) {\n case \"pnpm\":\n return `pnpm add ${pkg}`;\n case \"yarn\":\n return `yarn add ${pkg}`;\n case \"bun\":\n return `bun add ${pkg}`;\n default:\n return `npm install ${pkg}`;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Templates\n// ---------------------------------------------------------------------------\n\ntype TemplateId = \"counter\" | \"auth-flow\" | \"ai-orchestrator\";\n\ninterface TemplateConfig {\n id: TemplateId;\n label: string;\n hint: string;\n files: Array<{ path: string; content: string }>;\n deps: string[];\n}\n\nfunction getTemplates(moduleName: string): Record<TemplateId, TemplateConfig> {\n return {\n counter: {\n id: \"counter\",\n label: \"Counter (minimal)\",\n hint: \"schema + init + derive + events — simplest starting point\",\n files: [\n {\n path: `src/${moduleName}.ts`,\n content: generateCounterModule(moduleName),\n },\n {\n path: \"src/main.ts\",\n content: generateCounterMain(moduleName),\n },\n ],\n deps: [\"@directive-run/core\"],\n },\n \"auth-flow\": {\n id: \"auth-flow\",\n label: \"Auth flow (constraints + resolvers)\",\n hint: \"login flow with constraints, resolvers, retry, and effects\",\n files: [\n {\n path: `src/${moduleName}.ts`,\n content: generateAuthModule(moduleName),\n },\n {\n path: \"src/main.ts\",\n content: generateAuthMain(moduleName),\n },\n ],\n deps: [\"@directive-run/core\"],\n },\n \"ai-orchestrator\": {\n id: \"ai-orchestrator\",\n label: \"AI orchestrator\",\n hint: \"agent orchestrator with guardrails and streaming\",\n files: [\n {\n path: `src/${moduleName}.ts`,\n content: generateAIModule(moduleName),\n },\n {\n path: \"src/main.ts\",\n content: generateAIMain(moduleName),\n },\n ],\n deps: [\"@directive-run/core\", \"@directive-run/ai\"],\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Template generators\n// ---------------------------------------------------------------------------\n\nfunction generateCounterModule(name: string): string {\n const camelName = toCamelCase(name);\n\n return `import { type ModuleSchema, createModule, t } from \"@directive-run/core\";\n\nconst schema = {\n facts: {\n count: t.number(),\n label: t.string(),\n },\n derivations: {\n isEven: t.boolean(),\n display: t.string(),\n },\n events: {\n increment: {},\n decrement: {},\n reset: {},\n setLabel: { value: t.string() },\n },\n} satisfies ModuleSchema;\n\nexport const ${camelName} = createModule(\"${name}\", {\n schema,\n\n init: (facts) => {\n facts.count = 0;\n facts.label = \"${name}\";\n },\n\n derive: {\n isEven: (facts) => facts.count % 2 === 0,\n display: (facts) => \\`\\${facts.label}: \\${facts.count}\\`,\n },\n\n events: {\n increment: (facts) => {\n facts.count++;\n },\n decrement: (facts) => {\n facts.count--;\n },\n reset: (facts) => {\n facts.count = 0;\n },\n setLabel: (facts, { value }) => {\n facts.label = value;\n },\n },\n});\n`;\n}\n\nfunction generateCounterMain(name: string): string {\n const camelName = toCamelCase(name);\n\n return `import { createSystem } from \"@directive-run/core\";\nimport { ${camelName} } from \"./${name}.js\";\n\nconst system = createSystem({\n module: ${camelName},\n});\n\nsystem.start();\n\n// Read facts and derivations\nconsole.log(\"count:\", system.facts.count);\nconsole.log(\"display:\", system.read(\"display\"));\n\n// Dispatch events\nsystem.events.increment();\nconsole.log(\"after increment:\", system.facts.count);\n\n// Subscribe to changes\nsystem.subscribe([\"count\"], () => {\n console.log(\"count changed:\", system.facts.count);\n});\n\nsystem.events.increment();\nsystem.events.increment();\n\nexport default system;\n`;\n}\n\nfunction generateAuthModule(name: string): string {\n const camelName = toCamelCase(name);\n\n return `import { type ModuleSchema, createModule, t } from \"@directive-run/core\";\n\ntype AuthStatus = \"idle\" | \"authenticating\" | \"authenticated\" | \"expired\";\n\nconst schema = {\n facts: {\n email: t.string(),\n password: t.string(),\n token: t.string(),\n status: t.string<AuthStatus>(),\n error: t.string(),\n },\n derivations: {\n isAuthenticated: t.boolean(),\n canLogin: t.boolean(),\n },\n events: {\n setEmail: { value: t.string() },\n setPassword: { value: t.string() },\n requestLogin: {},\n logout: {},\n },\n requirements: {\n LOGIN: { email: t.string(), password: t.string() },\n },\n} satisfies ModuleSchema;\n\nexport const ${camelName} = createModule(\"${name}\", {\n schema,\n\n init: (facts) => {\n facts.email = \"\";\n facts.password = \"\";\n facts.token = \"\";\n facts.status = \"idle\";\n facts.error = \"\";\n },\n\n derive: {\n isAuthenticated: (facts) => facts.status === \"authenticated\",\n canLogin: (facts) => {\n return (\n facts.email.trim() !== \"\" &&\n facts.password.trim() !== \"\" &&\n (facts.status === \"idle\" || facts.status === \"expired\")\n );\n },\n },\n\n events: {\n setEmail: (facts, { value }) => {\n facts.email = value;\n },\n setPassword: (facts, { value }) => {\n facts.password = value;\n },\n requestLogin: (facts) => {\n facts.status = \"authenticating\";\n facts.error = \"\";\n },\n logout: (facts) => {\n facts.token = \"\";\n facts.status = \"idle\";\n },\n },\n\n constraints: {\n needsLogin: {\n priority: 100,\n when: (facts) => facts.status === \"authenticating\",\n require: (facts) => ({\n type: \"LOGIN\",\n email: facts.email,\n password: facts.password,\n }),\n },\n },\n\n resolvers: {\n login: {\n requirement: \"LOGIN\",\n retry: { attempts: 2, backoff: \"exponential\" },\n resolve: async (req, context) => {\n // Replace with real auth API call\n await new Promise((resolve) => setTimeout(resolve, 500));\n\n const token = \\`token_\\${Date.now()}\\`;\n context.facts.token = token;\n context.facts.status = \"authenticated\";\n },\n },\n },\n\n effects: {\n logStatusChange: {\n deps: [\"status\"],\n run: (facts, prev) => {\n if (prev && prev.status !== facts.status) {\n console.log(\\`Auth status: \\${prev.status} → \\${facts.status}\\`);\n }\n },\n },\n },\n});\n`;\n}\n\nfunction generateAuthMain(name: string): string {\n const camelName = toCamelCase(name);\n\n return `import { createSystem } from \"@directive-run/core\";\nimport { ${camelName} } from \"./${name}.js\";\n\nconst system = createSystem({\n module: ${camelName},\n});\n\nsystem.start();\n\n// Set credentials and login\nsystem.events.setEmail({ value: \"user@example.com\" });\nsystem.events.setPassword({ value: \"password123\" });\nsystem.events.requestLogin();\n\n// Wait for auth to complete\nawait system.settle();\n\nconsole.log(\"authenticated:\", system.read(\"isAuthenticated\"));\nconsole.log(\"token:\", system.facts.token);\n\nexport default system;\n`;\n}\n\nfunction generateAIModule(name: string): string {\n const camelName = toCamelCase(name);\n\n return `import { type ModuleSchema, createModule, t } from \"@directive-run/core\";\nimport {\n createAgentOrchestrator,\n createAgentMemory,\n createSlidingWindowStrategy,\n} from \"@directive-run/ai\";\n\n// ============================================================================\n// Module — state management\n// ============================================================================\n\ntype AgentStatus = \"idle\" | \"thinking\" | \"done\" | \"error\";\n\nconst schema = {\n facts: {\n input: t.string(),\n output: t.string(),\n status: t.string<AgentStatus>(),\n error: t.string(),\n },\n derivations: {\n isThinking: t.boolean(),\n hasOutput: t.boolean(),\n },\n events: {\n setInput: { value: t.string() },\n requestRun: {},\n reset: {},\n },\n requirements: {\n RUN_AGENT: { input: t.string() },\n },\n} satisfies ModuleSchema;\n\nexport const ${camelName} = createModule(\"${name}\", {\n schema,\n\n init: (facts) => {\n facts.input = \"\";\n facts.output = \"\";\n facts.status = \"idle\";\n facts.error = \"\";\n },\n\n derive: {\n isThinking: (facts) => facts.status === \"thinking\",\n hasOutput: (facts) => facts.output !== \"\",\n },\n\n events: {\n setInput: (facts, { value }) => {\n facts.input = value;\n },\n requestRun: (facts) => {\n facts.status = \"thinking\";\n facts.output = \"\";\n facts.error = \"\";\n },\n reset: (facts) => {\n facts.input = \"\";\n facts.output = \"\";\n facts.status = \"idle\";\n facts.error = \"\";\n },\n },\n\n constraints: {\n needsRun: {\n priority: 100,\n when: (facts) => facts.status === \"thinking\",\n require: (facts) => ({\n type: \"RUN_AGENT\",\n input: facts.input,\n }),\n },\n },\n\n resolvers: {\n runAgent: {\n requirement: \"RUN_AGENT\",\n timeout: 30000,\n resolve: async (req, context) => {\n // Replace with your agent runner (e.g., Anthropic, OpenAI)\n const result = \\`Echo: \\${req.input}\\`;\n\n context.facts.output = result;\n context.facts.status = \"done\";\n },\n },\n },\n});\n\n// ============================================================================\n// Orchestrator — optional AI features\n// ============================================================================\n\nexport const memory = createAgentMemory({\n strategy: createSlidingWindowStrategy(),\n strategyConfig: { maxMessages: 30, preserveRecentCount: 6 },\n autoManage: true,\n});\n\n// Uncomment to add orchestrator features:\n// export const orchestrator = createAgentOrchestrator({\n// runner: yourAgentRunner,\n// maxTokenBudget: 50000,\n// memory,\n// });\n`;\n}\n\nfunction generateAIMain(name: string): string {\n const camelName = toCamelCase(name);\n\n return `import { createSystem } from \"@directive-run/core\";\nimport { ${camelName} } from \"./${name}.js\";\n\nconst system = createSystem({\n module: ${camelName},\n});\n\nsystem.start();\n\n// Set input and run\nsystem.events.setInput({ value: \"Hello, world!\" });\nsystem.events.requestRun();\n\n// Wait for completion\nawait system.settle();\n\nconsole.log(\"output:\", system.facts.output);\n\nexport default system;\n`;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction toCamelCase(name: string): string {\n return name.replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n}\n\nfunction writeFile(filePath: string, content: string) {\n const dir = dirname(filePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(filePath, content, \"utf-8\");\n}\n\n// ---------------------------------------------------------------------------\n// Command\n// ---------------------------------------------------------------------------\n\nexport async function initCommand(args: string[]) {\n const opts = parseArgs(args);\n\n p.intro(pc.bgCyan(pc.black(\" directive init \")));\n\n // Step 1: Project name\n let moduleName: string;\n\n if (opts.noInteractive) {\n moduleName = \"my-module\";\n } else {\n const nameResult = await p.text({\n message: \"Module name:\",\n placeholder: \"my-module\",\n defaultValue: \"my-module\",\n validate: (val) => {\n if (!/^[a-z][a-z0-9-]*$/.test(val)) {\n return \"Must start with a letter, use lowercase letters, numbers, and hyphens\";\n }\n },\n });\n\n if (p.isCancel(nameResult)) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n\n moduleName = nameResult;\n }\n\n // Step 2: Template selection\n let templateId: TemplateId;\n\n if (opts.template) {\n const templates = getTemplates(moduleName);\n if (!(opts.template in templates)) {\n p.log.error(\n `Unknown template: ${opts.template}. Available: ${Object.keys(templates).join(\", \")}`,\n );\n process.exit(1);\n }\n templateId = opts.template as TemplateId;\n } else if (opts.noInteractive) {\n templateId = \"counter\";\n } else {\n const templates = getTemplates(moduleName);\n const choice = await p.select({\n message: \"Project template:\",\n options: Object.values(templates).map((t) => ({\n value: t.id,\n label: t.label,\n hint: t.hint,\n })),\n });\n\n if (p.isCancel(choice)) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n\n templateId = choice as TemplateId;\n }\n\n const templates = getTemplates(moduleName);\n const template = templates[templateId];\n\n // Step 3: Detect package manager\n const pm = detectPackageManager(opts.dir);\n p.log.info(`Package manager: ${pc.cyan(pm)}`);\n\n // Step 4: Write files\n const s = p.spinner();\n s.start(\"Creating project files...\");\n\n let created = 0;\n let skipped = 0;\n\n for (const file of template.files) {\n const filePath = join(opts.dir, file.path);\n\n if (existsSync(filePath)) {\n skipped++;\n continue;\n }\n\n writeFile(filePath, file.content);\n created++;\n }\n\n s.stop(\"Project files created.\");\n\n for (const file of template.files) {\n const filePath = join(opts.dir, file.path);\n const rel = relative(opts.dir, filePath);\n\n if (existsSync(filePath)) {\n p.log.success(`${pc.green(\"Created\")} ${pc.dim(rel)}`);\n }\n }\n\n if (skipped > 0) {\n p.log.warn(`Skipped ${skipped} file(s) that already exist.`);\n }\n\n // Step 5: Show next steps\n const depsCmd = installCmd(pm, template.deps.join(\" \"));\n\n p.outro(\n `Next steps:\\n` +\n ` ${pc.cyan(depsCmd)}\\n` +\n ` ${pc.cyan(`${CLI_NAME} ai-rules init`)}\\n` +\n ` ${pc.dim(\"Start building!\")}`,\n );\n}\n","import pc from \"picocolors\";\nimport { loadSystem } from \"../lib/loader.js\";\n\ninterface InspectOptions {\n json: boolean;\n module?: string;\n}\n\nfunction parseArgs(args: string[]): { filePath: string; opts: InspectOptions } {\n const opts: InspectOptions = { json: false };\n let filePath = \"\";\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n\n switch (arg) {\n case \"--json\":\n opts.json = true;\n break;\n case \"--module\": {\n const val = args[++i];\n if (val) {\n opts.module = val;\n }\n break;\n }\n default:\n if (arg && !arg.startsWith(\"-\") && !filePath) {\n filePath = arg;\n }\n }\n }\n\n return { filePath, opts };\n}\n\n// ---------------------------------------------------------------------------\n// Formatters\n// ---------------------------------------------------------------------------\n\nfunction formatFacts(facts: Record<string, unknown>): string {\n const lines: string[] = [];\n lines.push(pc.bold(\"Facts:\"));\n\n const entries = Object.entries(facts);\n if (entries.length === 0) {\n lines.push(\" (none)\");\n\n return lines.join(\"\\n\");\n }\n\n for (const [key, value] of entries) {\n const formatted = formatValue(value);\n lines.push(` ${pc.cyan(key)} = ${formatted}`);\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction formatConstraints(\n constraints: Array<{\n id: string;\n active: boolean;\n disabled: boolean;\n priority: number;\n hitCount: number;\n lastActiveAt: number | null;\n }>,\n): string {\n const lines: string[] = [];\n lines.push(pc.bold(\"Constraints:\"));\n\n if (constraints.length === 0) {\n lines.push(\" (none)\");\n\n return lines.join(\"\\n\");\n }\n\n for (const c of constraints) {\n const status = c.disabled\n ? pc.dim(\"disabled\")\n : c.active\n ? pc.green(\"active\")\n : pc.dim(\"inactive\");\n const hits = c.hitCount > 0 ? pc.yellow(` (${c.hitCount} hits)`) : \"\";\n lines.push(` ${pc.cyan(c.id)} ${status} priority=${c.priority}${hits}`);\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction formatResolverDefs(\n resolverDefs: Array<{ id: string; requirement: string }>,\n resolvers: Record<\n string,\n { state: string; error?: string; duration?: number }\n >,\n): string {\n const lines: string[] = [];\n lines.push(pc.bold(\"Resolvers:\"));\n\n if (resolverDefs.length === 0) {\n lines.push(\" (none)\");\n\n return lines.join(\"\\n\");\n }\n\n for (const def of resolverDefs) {\n const status = resolvers[def.id];\n const stateStr = status\n ? formatResolverState(status.state, status.error, status.duration)\n : pc.dim(\"idle\");\n lines.push(` ${pc.cyan(def.id)} → ${def.requirement} ${stateStr}`);\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction formatUnmet(\n unmet: Array<{\n id: string;\n requirement: { type: string };\n fromConstraint: string;\n }>,\n): string {\n const lines: string[] = [];\n lines.push(pc.bold(\"Unmet Requirements:\"));\n\n if (unmet.length === 0) {\n lines.push(` ${pc.green(\"(all requirements met)\")}`);\n\n return lines.join(\"\\n\");\n }\n\n for (const u of unmet) {\n lines.push(\n ` ${pc.yellow(u.requirement.type)} (id: ${pc.dim(u.id)}) from ${pc.dim(u.fromConstraint)}`,\n );\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction formatInflight(\n inflight: Array<{ id: string; resolverId: string; startedAt: number }>,\n): string {\n const lines: string[] = [];\n lines.push(pc.bold(\"Inflight:\"));\n\n if (inflight.length === 0) {\n lines.push(` ${pc.green(\"(none)\")}`);\n\n return lines.join(\"\\n\");\n }\n\n const now = Date.now();\n for (const inf of inflight) {\n const elapsed = now - inf.startedAt;\n lines.push(\n ` ${pc.cyan(inf.resolverId)} → req ${pc.dim(inf.id)} ${pc.yellow(`${elapsed}ms`)}`,\n );\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction formatResolverState(\n state: string,\n error?: string,\n duration?: number,\n): string {\n const dur = duration !== undefined ? ` ${duration}ms` : \"\";\n\n switch (state) {\n case \"resolved\":\n return pc.green(`resolved${dur}`);\n case \"errored\":\n return pc.red(`errored${dur}${error ? ` — ${error}` : \"\"}`);\n case \"inflight\":\n return pc.yellow(\"inflight\");\n case \"cancelled\":\n return pc.dim(\"cancelled\");\n default:\n return pc.dim(state);\n }\n}\n\nfunction formatValue(value: unknown): string {\n if (value === null) {\n return pc.dim(\"null\");\n }\n if (value === undefined) {\n return pc.dim(\"undefined\");\n }\n if (typeof value === \"string\") {\n return value.length > 60 ? `\"${value.slice(0, 57)}...\"` : `\"${value}\"`;\n }\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n if (Array.isArray(value)) {\n return `[${value.length} items]`;\n }\n\n return JSON.stringify(value).slice(0, 60);\n}\n\n// ---------------------------------------------------------------------------\n// Warnings\n// ---------------------------------------------------------------------------\n\nfunction findWarnings(inspection: {\n resolverDefs: Array<{ id: string; requirement: string }>;\n constraints: Array<{ id: string; active: boolean; disabled: boolean }>;\n unmet: Array<{ requirement: { type: string } }>;\n}): string[] {\n const warnings: string[] = [];\n\n // Orphaned resolvers: resolver handles a type no constraint emits\n const constraintTypes = new Set<string>();\n // We can't know constraint requirement types from inspection alone,\n // but we can check unmet requirements\n const unmetTypes = new Set(inspection.unmet.map((u) => u.requirement.type));\n const resolverTypes = new Set(\n inspection.resolverDefs.map((r) => r.requirement),\n );\n\n // Resolver types not in unmet — might be orphaned (can't be sure without full constraint analysis)\n for (const def of inspection.resolverDefs) {\n if (def.requirement === \"(predicate)\") {\n continue;\n }\n }\n\n // Unmet requirements with no matching resolver\n for (const u of inspection.unmet) {\n const hasResolver = inspection.resolverDefs.some(\n (r) =>\n r.requirement === u.requirement.type || r.requirement === \"(predicate)\",\n );\n if (!hasResolver) {\n warnings.push(`No resolver for requirement type \"${u.requirement.type}\"`);\n }\n }\n\n return warnings;\n}\n\n// ---------------------------------------------------------------------------\n// Command\n// ---------------------------------------------------------------------------\n\nexport async function inspectCommand(args: string[]) {\n const { filePath, opts } = parseArgs(args);\n\n if (!filePath) {\n console.error(\"Usage: directive inspect <file> [--json] [--module <name>]\");\n process.exit(1);\n }\n\n const system = await loadSystem(filePath);\n\n if (!system.isRunning) {\n system.start();\n }\n\n const inspection = system.inspect();\n\n if (opts.json) {\n // Get facts as plain object\n const factsObj: Record<string, unknown> = {};\n if (system.facts) {\n for (const key of Object.keys(system.facts)) {\n try {\n factsObj[key] = system.facts[key];\n } catch {\n factsObj[key] = \"(error reading)\";\n }\n }\n }\n\n console.log(\n JSON.stringify(\n {\n facts: factsObj,\n ...inspection,\n },\n null,\n 2,\n ),\n );\n\n system.stop();\n\n return;\n }\n\n // Pretty output\n console.log();\n console.log(pc.bold(pc.cyan(\"Directive System Inspection\")));\n console.log(pc.dim(\"─\".repeat(40)));\n console.log();\n\n // Facts\n const factsObj: Record<string, unknown> = {};\n if (system.facts) {\n for (const key of Object.keys(system.facts)) {\n try {\n factsObj[key] = system.facts[key];\n } catch {\n factsObj[key] = \"(error reading)\";\n }\n }\n }\n console.log(formatFacts(factsObj));\n console.log();\n\n // Constraints\n console.log(formatConstraints(inspection.constraints));\n console.log();\n\n // Resolvers\n console.log(\n formatResolverDefs(inspection.resolverDefs, inspection.resolvers),\n );\n console.log();\n\n // Unmet requirements\n console.log(formatUnmet(inspection.unmet));\n console.log();\n\n // Inflight\n if (inspection.inflight.length > 0) {\n console.log(formatInflight(inspection.inflight));\n console.log();\n }\n\n // Warnings\n const warnings = findWarnings(inspection);\n if (warnings.length > 0) {\n console.log(pc.bold(pc.yellow(\"Warnings:\")));\n for (const w of warnings) {\n console.log(` ${pc.yellow(\"⚠\")} ${w}`);\n }\n console.log();\n }\n\n system.stop();\n}\n","import { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, join, relative } from \"node:path\";\nimport pc from \"picocolors\";\n\ninterface NewOptions {\n with: string[];\n minimal: boolean;\n dir: string;\n}\n\nfunction parseArgs(args: string[]): NewOptions {\n const opts: NewOptions = {\n with: [],\n minimal: false,\n dir: process.cwd(),\n };\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n\n switch (arg) {\n case \"--with\": {\n const val = args[++i];\n if (val) {\n opts.with = val.split(\",\").map((s) => s.trim());\n }\n break;\n }\n case \"--minimal\":\n opts.minimal = true;\n break;\n case \"--dir\": {\n const val = args[++i];\n if (val) {\n opts.dir = val;\n }\n break;\n }\n }\n }\n\n return opts;\n}\n\n// ---------------------------------------------------------------------------\n// Module generator\n// ---------------------------------------------------------------------------\n\ntype Section = \"derive\" | \"events\" | \"constraints\" | \"resolvers\" | \"effects\";\n\nconst ALL_SECTIONS: Section[] = [\n \"derive\",\n \"events\",\n \"constraints\",\n \"resolvers\",\n \"effects\",\n];\n\nfunction generateModule(name: string, sections: Section[]): string {\n const camelName = toCamelCase(name);\n const hasConstraints = sections.includes(\"constraints\");\n const hasResolvers = sections.includes(\"resolvers\");\n\n const imports = [\"type ModuleSchema\", \"createModule\", \"t\"];\n\n let code = `import { ${imports.join(\", \")} } from \"@directive-run/core\";\\n\\n`;\n\n // Schema\n code += `const schema = {\\n`;\n code += ` facts: {\\n`;\n code += ` // Add your facts here\\n`;\n code += ` status: t.string(),\\n`;\n code += ` },\\n`;\n\n if (sections.includes(\"derive\")) {\n code += ` derivations: {\\n`;\n code += ` // Add derivation types here\\n`;\n code += ` isReady: t.boolean(),\\n`;\n code += ` },\\n`;\n }\n\n if (sections.includes(\"events\")) {\n code += ` events: {\\n`;\n code += ` // Add event shapes here\\n`;\n code += ` setStatus: { value: t.string() },\\n`;\n code += ` },\\n`;\n }\n\n if (hasConstraints || hasResolvers) {\n code += ` requirements: {\\n`;\n code += ` // Add requirement shapes here\\n`;\n code += ` PROCESS: { input: t.string() },\\n`;\n code += ` },\\n`;\n }\n\n code += `} satisfies ModuleSchema;\\n\\n`;\n\n // Module\n code += `export const ${camelName} = createModule(\"${name}\", {\\n`;\n code += ` schema,\\n\\n`;\n\n code += ` init: (facts) => {\\n`;\n code += ` facts.status = \"idle\";\\n`;\n code += ` },\\n`;\n\n if (sections.includes(\"derive\")) {\n code += `\\n derive: {\\n`;\n code += ` isReady: (facts) => facts.status === \"ready\",\\n`;\n code += ` },\\n`;\n }\n\n if (sections.includes(\"events\")) {\n code += `\\n events: {\\n`;\n code += ` setStatus: (facts, { value }) => {\\n`;\n code += ` facts.status = value;\\n`;\n code += ` },\\n`;\n code += ` },\\n`;\n }\n\n if (hasConstraints) {\n code += `\\n constraints: {\\n`;\n code += ` needsProcessing: {\\n`;\n code += ` priority: 100,\\n`;\n code += ` when: (facts) => facts.status === \"pending\",\\n`;\n code += ` require: (facts) => ({\\n`;\n code += ` type: \"PROCESS\",\\n`;\n code += ` input: facts.status,\\n`;\n code += ` }),\\n`;\n code += ` },\\n`;\n code += ` },\\n`;\n }\n\n if (hasResolvers) {\n code += `\\n resolvers: {\\n`;\n code += ` process: {\\n`;\n code += ` requirement: \"PROCESS\",\\n`;\n code += ` resolve: async (req, context) => {\\n`;\n code += ` // Implement resolution logic here\\n`;\n code += ` context.facts.status = \"done\";\\n`;\n code += ` },\\n`;\n code += ` },\\n`;\n code += ` },\\n`;\n }\n\n if (sections.includes(\"effects\")) {\n code += `\\n effects: {\\n`;\n code += ` logChange: {\\n`;\n code += ` deps: [\"status\"],\\n`;\n code += ` run: (facts, prev) => {\\n`;\n code += ` if (prev && prev.status !== facts.status) {\\n`;\n code += ` console.log(\\`Status: \\${prev.status} → \\${facts.status}\\`);\\n`;\n code += ` }\\n`;\n code += ` },\\n`;\n code += ` },\\n`;\n code += ` },\\n`;\n }\n\n code += `});\\n`;\n\n return code;\n}\n\n// ---------------------------------------------------------------------------\n// Orchestrator generator\n// ---------------------------------------------------------------------------\n\nfunction generateOrchestrator(name: string): string {\n const camelName = toCamelCase(name);\n\n return `import { type ModuleSchema, createModule, createSystem, t } from \"@directive-run/core\";\nimport {\n createAgentOrchestrator,\n createAgentMemory,\n createSlidingWindowStrategy,\n} from \"@directive-run/ai\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\ntype AgentStatus = \"idle\" | \"thinking\" | \"done\" | \"error\";\n\n// ============================================================================\n// Schema\n// ============================================================================\n\nconst schema = {\n facts: {\n input: t.string(),\n output: t.string(),\n status: t.string<AgentStatus>(),\n error: t.string(),\n totalTokens: t.number(),\n },\n derivations: {\n isThinking: t.boolean(),\n hasOutput: t.boolean(),\n },\n events: {\n setInput: { value: t.string() },\n requestRun: {},\n reset: {},\n },\n requirements: {\n RUN_AGENT: { input: t.string() },\n },\n} satisfies ModuleSchema;\n\n// ============================================================================\n// Module\n// ============================================================================\n\nexport const ${camelName} = createModule(\"${name}\", {\n schema,\n\n init: (facts) => {\n facts.input = \"\";\n facts.output = \"\";\n facts.status = \"idle\";\n facts.error = \"\";\n facts.totalTokens = 0;\n },\n\n derive: {\n isThinking: (facts) => facts.status === \"thinking\",\n hasOutput: (facts) => facts.output !== \"\",\n },\n\n events: {\n setInput: (facts, { value }) => {\n facts.input = value;\n },\n requestRun: (facts) => {\n facts.status = \"thinking\";\n facts.output = \"\";\n facts.error = \"\";\n },\n reset: (facts) => {\n facts.input = \"\";\n facts.output = \"\";\n facts.status = \"idle\";\n facts.error = \"\";\n facts.totalTokens = 0;\n },\n },\n\n constraints: {\n needsRun: {\n priority: 100,\n when: (facts) => facts.status === \"thinking\",\n require: (facts) => ({\n type: \"RUN_AGENT\",\n input: facts.input,\n }),\n },\n },\n\n resolvers: {\n runAgent: {\n requirement: \"RUN_AGENT\",\n timeout: 30000,\n resolve: async (req, context) => {\n // TODO: Replace with your agent runner\n const result = \\`Echo: \\${req.input}\\`;\n\n context.facts.output = result;\n context.facts.status = \"done\";\n },\n },\n },\n});\n\n// ============================================================================\n// AI Features\n// ============================================================================\n\nexport const memory = createAgentMemory({\n strategy: createSlidingWindowStrategy(),\n strategyConfig: { maxMessages: 30, preserveRecentCount: 6 },\n autoManage: true,\n});\n\n// TODO: Add your agent runner and configure the orchestrator\n// export const orchestrator = createAgentOrchestrator({\n// runner: yourAgentRunner,\n// maxTokenBudget: 50000,\n// memory,\n// guardrails: {\n// input: [],\n// output: [],\n// },\n// });\n\n// ============================================================================\n// System\n// ============================================================================\n\nexport const system = createSystem({\n module: ${camelName},\n});\n`;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction toCamelCase(name: string): string {\n return name.replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n}\n\nfunction writeFile(filePath: string, content: string) {\n const dir = dirname(filePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(filePath, content, \"utf-8\");\n}\n\nfunction findModulesDir(dir: string): string {\n return join(dir, \"src\");\n}\n\n// ---------------------------------------------------------------------------\n// Commands\n// ---------------------------------------------------------------------------\n\nexport async function newModuleCommand(name: string, args: string[]) {\n const opts = parseArgs(args);\n\n if (!name || !/^[a-z][a-z0-9-]*$/.test(name)) {\n console.error(\n `Invalid module name: ${name || \"(none)\"}\\n` +\n \"Must start with a letter, use lowercase letters, numbers, and hyphens.\",\n );\n process.exit(1);\n }\n\n let sections: Section[];\n\n if (opts.minimal) {\n sections = [];\n } else if (opts.with.length > 0) {\n sections = opts.with.filter((s) =>\n ALL_SECTIONS.includes(s as Section),\n ) as Section[];\n } else {\n sections = ALL_SECTIONS;\n }\n\n const targetDir = findModulesDir(opts.dir);\n const filePath = join(targetDir, `${name}.ts`);\n\n if (existsSync(filePath)) {\n console.error(`File already exists: ${relative(opts.dir, filePath)}`);\n process.exit(1);\n }\n\n const content = generateModule(name, sections);\n writeFile(filePath, content);\n\n const rel = relative(opts.dir, filePath);\n console.log(`${pc.green(\"Created\")} ${pc.dim(rel)}`);\n\n if (sections.length === 0) {\n console.log(pc.dim(\" Minimal module (schema + init only)\"));\n } else {\n console.log(pc.dim(` Sections: ${sections.join(\", \")}`));\n }\n}\n\nexport async function newOrchestratorCommand(name: string, args: string[]) {\n const opts = parseArgs(args);\n\n if (!name || !/^[a-z][a-z0-9-]*$/.test(name)) {\n console.error(\n `Invalid orchestrator name: ${name || \"(none)\"}\\n` +\n \"Must start with a letter, use lowercase letters, numbers, and hyphens.\",\n );\n process.exit(1);\n }\n\n const targetDir = findModulesDir(opts.dir);\n const filePath = join(targetDir, `${name}.ts`);\n\n if (existsSync(filePath)) {\n console.error(`File already exists: ${relative(opts.dir, filePath)}`);\n process.exit(1);\n }\n\n const content = generateOrchestrator(name);\n writeFile(filePath, content);\n\n const rel = relative(opts.dir, filePath);\n console.log(`${pc.green(\"Created\")} ${pc.dim(rel)}`);\n console.log(\n pc.dim(\" AI orchestrator with memory, guardrails, and streaming\"),\n );\n}\n","// Runtime check that bundlers (webpack, esbuild, turbopack, rollup) inline\n// based on the consumer's NODE_ENV. Without this, the published bundle bakes\n// in `true` and dev-mode validation runs in every consumer's production\n// build — a real footgun the v1.5/v1.6 release hit.\nexport default typeof process !== \"undefined\" &&\n process.env?.NODE_ENV !== \"production\";\n","/**\n * Dependency tracking context for auto-tracking derivations\n *\n * Uses a stack-based approach to handle nested derivation computations.\n * When a derivation accesses a fact, the tracking context records it.\n */\n\n/** Stack of active dependency sets (bare Sets for zero-allocation hot path) */\nconst depStack: Set<string>[] = [];\n\n/**\n * Get the current dependency set, or null if not tracking.\n *\n * @returns The active dependency Set, or `null` if no tracking is active.\n *\n * @internal\n */\nexport function getCurrentDeps(): Set<string> | null {\n const len = depStack.length;\n return len === 0 ? null : depStack[len - 1]!;\n}\n\n/**\n * Check if dependency tracking is currently active.\n *\n * @returns `true` if inside a {@link withTracking} call, `false` otherwise.\n *\n * @internal\n */\nexport function isTracking(): boolean {\n return depStack.length > 0;\n}\n\n/**\n * Run a function with dependency tracking.\n *\n * @remarks\n * Pushes a fresh Set onto the stack, executes `fn`, then pops it.\n * Any fact reads inside `fn` are recorded as dependencies.\n * Nesting is supported — inner calls get their own independent Set.\n *\n * @param fn - The function to execute under tracking.\n * @returns An object with the computed `value` and a `deps` Set of accessed\n * fact keys.\n *\n * @internal\n */\nexport function withTracking<T>(fn: () => T): { value: T; deps: Set<string> } {\n const deps = new Set<string>();\n depStack.push(deps);\n\n try {\n const value = fn();\n return { value, deps };\n } finally {\n depStack.pop();\n }\n}\n\n/**\n * Run a function without tracking.\n *\n * @remarks\n * Temporarily clears the tracking stack so that fact reads inside `fn` do\n * not register as dependencies. The stack is restored after `fn` returns\n * (even on error). Useful for side-effect reads that should not trigger\n * derivation invalidation.\n *\n * @param fn - The function to execute without tracking.\n * @returns The return value of `fn`.\n *\n * @internal\n */\nexport function withoutTracking<T>(fn: () => T): T {\n const saved = depStack.splice(0, depStack.length);\n\n try {\n return fn();\n } finally {\n for (const ctx of saved) {\n depStack.push(ctx);\n }\n }\n}\n\n/**\n * Track a specific key in the current context.\n *\n * @remarks\n * No-op if no tracking context is active.\n *\n * @param key - The fact key to record as a dependency.\n *\n * @internal\n */\nexport function trackAccess(key: string): void {\n const len = depStack.length;\n if (len === 0) {\n return;\n }\n depStack[len - 1]!.add(key);\n}\n\n/**\n * Prototype pollution guard — shared across all proxy handlers.\n *\n * @remarks\n * Contains `__proto__`, `constructor`, and `prototype`. Every proxy `get`\n * and `has` trap checks this set and returns `undefined` / `false` for\n * matching keys, preventing prototype pollution via proxy-based objects.\n *\n * @internal\n */\nexport const BLOCKED_PROPS: ReadonlySet<string> = Object.freeze(\n new Set([\"__proto__\", \"constructor\", \"prototype\"]),\n);\n\n// ============================================================================\n// Non-JSON value-type detection (MIGRATION_FEEDBACK item 20)\n// ============================================================================\n\n/**\n * Detect whether `value` is a non-JSON-roundtrippable type whose mutations\n * the facts proxy cannot track for reactivity.\n *\n * Returns the kind label (`\"Date\"`, `\"Set\"`, `\"Map\"`, `\"File\"`, or\n * `\"ClassInstance\"`) when one is detected, or `null` for plain objects,\n * arrays, primitives, and `null`/`undefined`.\n *\n * The `File` check is SSR-safe: if the runtime has no `File` global the\n * branch is skipped without throwing.\n *\n * The `ClassInstance` check fires for any object whose prototype is not\n * `Object.prototype` and which is not an array — e.g. instances of user\n * classes whose mutations bypass reactivity.\n *\n * @internal\n */\nexport function detectNonJsonValueType(value: unknown): string | null {\n if (value === null || typeof value !== \"object\") {\n return null;\n }\n if (value instanceof Date) {\n return \"Date\";\n }\n if (value instanceof Set) {\n return \"Set\";\n }\n if (value instanceof Map) {\n return \"Map\";\n }\n if (typeof File !== \"undefined\" && value instanceof File) {\n return \"File\";\n }\n // Plain objects and arrays are JSON-friendly.\n if (Array.isArray(value)) {\n return null;\n }\n // Class instances: prototype is not Object.prototype.\n // Plain `{}` literals have prototype `Object.prototype`; objects created\n // via `Object.create(null)` have a `null` prototype which we treat as\n // \"plain\" (it's still JSON-roundtrippable).\n const proto = Object.getPrototypeOf(value);\n if (proto !== null && proto !== Object.prototype) {\n return \"ClassInstance\";\n }\n\n return null;\n}\n\n/**\n * Per-(path, valueType) dedupe cache — once a warning fires for a given\n * combo we never re-emit. Keeps the dev console quiet under loops that\n * assign the same Date 100 times in a row.\n *\n * @internal\n */\nconst nonJsonWarningCache = new Set<string>();\n\nconst nonJsonHints: Record<string, string> = {\n Date: \".getTime() for timestamps\",\n Set: \"[...set] for arrays\",\n Map: \"Object.fromEntries(map) for plain objects\",\n File: \"{ name, size, type, lastModified } for metadata\",\n ClassInstance: \"a plain-object snapshot\",\n};\n\n/**\n * Emit a one-time dev-mode warning when a non-JSON value is assigned to a\n * fact. Called from the proxy `set` traps in both `createFactsProxy`\n * (single-module / standalone facts) and `createModuleFactsProxy`\n * (system-namespaced facts). No-ops in production builds — the call sites\n * are gated on `isDevelopment` so this entire helper is tree-shakable.\n *\n * @param factPath - Display path for the warning (e.g. `auth.token` or\n * bare `token` for non-namespaced stores).\n * @param valueType - The label returned from {@link detectNonJsonValueType}.\n *\n * @internal\n */\nexport function warnNonJsonFactAssignment(\n factPath: string,\n valueType: string,\n): void {\n const cacheKey = `${factPath}|${valueType}`;\n if (nonJsonWarningCache.has(cacheKey)) {\n return;\n }\n nonJsonWarningCache.add(cacheKey);\n\n const hint = nonJsonHints[valueType] ?? \"a JSON-roundtrippable value\";\n console.warn(\n `[Directive] Fact \"${factPath}\" assigned a ${valueType} instance.\\n` +\n `Facts must be JSON-roundtrippable for reactivity to work correctly.\\n` +\n `${valueType} mutations are not tracked.\\n` +\n `Use ${hint} instead.\\n` +\n `See: https://directive.run/docs/facts#json-rule`,\n );\n}\n\n/**\n * Reset the warning dedupe cache. Test-only — exported via internals for\n * vitest spec setup. Not part of the public API.\n *\n * @internal\n */\nexport function _resetNonJsonWarningCache(): void {\n nonJsonWarningCache.clear();\n}\n","/**\n * Data-configuration predicates and templates.\n *\n * A {@link FactPredicate} is a declarative, serializable boolean spec over a\n * module's fact namespace — the data form of a constraint `when`, an effect\n * `on`, or a boolean derivation. A {@link FactTemplate} is the value-producing\n * counterpart: a fact-interpolating string.\n *\n * Convention: `$` marks an operator/expression node inside a predicate or\n * template body (`$eq`, `$gte`, `$all`, `$template`, `$set`, `$ref`).\n * Definition arms (`compute`, `handler`, `patch`) stay sigil-free.\n *\n * Operators are `$`-prefixed so they can never collide with a fact key —\n * schema keys starting with `$` are rejected at registration.\n */\n\n// ============================================================================\n// Operators\n// ============================================================================\n\n/** Comparison operator names — the `$`-prefixed keys inside an operator object. */\nexport type PredicateOp =\n | \"$eq\"\n | \"$ne\"\n | \"$in\"\n | \"$nin\"\n | \"$exists\"\n | \"$gt\"\n | \"$gte\"\n | \"$lt\"\n | \"$lte\"\n | \"$between\"\n | \"$matches\"\n | \"$startsWith\"\n | \"$endsWith\"\n | \"$contains\"\n | \"$changed\";\n\n/** Combinator node keys. */\nexport type PredicateCombinatorKey = \"$all\" | \"$any\" | \"$not\";\n\n/**\n * Every reserved `$`-key recognized inside a predicate body.\n *\n * @internal\n */\nexport const PREDICATE_OPERATORS: ReadonlySet<string> = new Set<string>([\n \"$eq\",\n \"$ne\",\n \"$in\",\n \"$nin\",\n \"$exists\",\n \"$gt\",\n \"$gte\",\n \"$lt\",\n \"$lte\",\n \"$between\",\n \"$matches\",\n \"$startsWith\",\n \"$endsWith\",\n \"$contains\",\n \"$changed\",\n]);\n\n/**\n * Combinator keys, as a runtime set.\n *\n * @internal\n */\nexport const PREDICATE_COMBINATORS: ReadonlySet<string> = new Set<string>([\n \"$all\",\n \"$any\",\n \"$not\",\n]);\n\n// ============================================================================\n// Operator object\n// ============================================================================\n\n/**\n * `true` when `V` supports relational operators (`$gt` … `$between`).\n * `[V]` tuple-wrapping suppresses distribution over union-typed facts.\n */\ntype IsOrderable<V> = [V] extends [number | bigint | Date]\n ? true\n : [V] extends [string]\n ? true\n : false;\n\n/**\n * The operator object permitted for a fact of type `V`. Built as a\n * **per-operator union** (one operator per member) rather than an\n * intersection — a typo'd operator (`$eqq`) then matches no member and is a\n * compile error, and a relational operator on a non-orderable fact resolves\n * to `never`.\n *\n * One operator per object — for two operators on the same fact, write the\n * array form or `$all`. This is by design (the type is the source of truth).\n *\n * `$matches` requires `RegExp`. The runtime throws on string operands.\n *\n * @example\n * ```ts\n * const op1: OperatorObject<number> = { $gte: 30 };\n * const op2: OperatorObject<string> = { $matches: /^J/i };\n * const op3: OperatorObject<string> = { $in: [\"red\", \"yellow\"] };\n * const op4: OperatorObject<string> = { $startsWith: \"Ada\" };\n * const op5: OperatorObject<string> = { $endsWith: \".com\" };\n * ```\n */\nexport type OperatorObject<V> =\n | { $eq: V }\n | { $ne: V }\n | { $in: readonly V[] }\n | { $nin: readonly V[] }\n | { $exists: boolean }\n | { $changed: true }\n | (IsOrderable<V> extends true\n ?\n | { $gt: V }\n | { $gte: V }\n | { $lt: V }\n | { $lte: V }\n | { $between: readonly [V, V] }\n : never)\n | ([V] extends [string]\n ?\n | { $matches: RegExp }\n | { $contains: string }\n | { $startsWith: string }\n | { $endsWith: string }\n : never)\n | ([V] extends [readonly (infer E)[]] ? { $contains: E } : never);\n\n/**\n * The spec for a single fact key: a bare value (equality), an operator\n * object, or — for an object-typed fact — a nested predicate (partial match).\n */\ntype PredicateField<V> =\n | V\n | OperatorObject<V>\n | ([V] extends [readonly unknown[]]\n ? never\n : [V] extends [object]\n ? PredicateObject<V>\n : never);\n\n// ============================================================================\n// FactPredicate\n// ============================================================================\n\n/**\n * Object form — every key is a fact name, every value a\n * {@link PredicateField}. Multiple keys are AND-ed. A nested object value\n * recurses (partial match), which is how cross-module namespaced predicates\n * (`{ self: { phase: \"red\" }, auth: { token: { $exists: true } } }`) work.\n */\nexport type PredicateObject<F> = {\n [K in keyof F]?: PredicateField<F[K]>;\n};\n\n/** Array form — explicit clauses, AND-ed. The codegen/devtools-friendly form. */\nexport type PredicateClause<F> = {\n [K in keyof F]: {\n readonly fact: K;\n readonly op: PredicateOp;\n readonly value: unknown;\n };\n}[keyof F];\n\n/** Combinator node — exactly one of `$all` / `$any` / `$not`. */\nexport type PredicateCombinator<F> =\n | { $all: readonly FactPredicate<F>[]; $any?: never; $not?: never }\n | { $any: readonly FactPredicate<F>[]; $all?: never; $not?: never }\n | { $not: FactPredicate<F>; $all?: never; $any?: never };\n\n/**\n * A declarative boolean spec over a fact namespace `F`. The data form of a\n * constraint `when`, an effect `on`, or a boolean derivation. Accepts an\n * object form, an array-of-clauses form, or a combinator node.\n *\n * Keys are **fact names only** — derivations are not addressable from inside\n * a predicate. To gate on a derivation, either reference the underlying fact\n * the derivation reads, or fall back to the function form of `when` / `on`.\n *\n * @example\n * ```ts\n * // Object form (the common case)\n * const p1: FactPredicate<{ phase: string; elapsed: number }> = {\n * phase: \"red\",\n * elapsed: { $gte: 30 },\n * };\n *\n * // Combinator form\n * const p2: FactPredicate<{ phase: string }> = {\n * $any: [{ phase: \"red\" }, { phase: \"yellow\" }],\n * };\n * ```\n */\nexport type FactPredicate<F> =\n | PredicateObject<F>\n | readonly PredicateClause<F>[]\n | PredicateCombinator<F>;\n\n// ============================================================================\n// FactTemplate\n// ============================================================================\n\n/**\n * A fact-interpolating string expression. `${key}` placeholders are replaced\n * with the named fact's value; `$${` emits a literal `${`. The value-producing\n * counterpart to {@link FactPredicate} — usable as a string derivation, a\n * constraint `require` field value, or an event `patch` value.\n *\n * @example { $template: \"Phase ${phase} for ${elapsed}s\" }\n */\nexport interface FactTemplate {\n readonly $template: string;\n}\n\n// ============================================================================\n// Selectors (resolver key, event patch)\n// ============================================================================\n\n/**\n * *Note: despite the \"Selector\" name, this does not select from facts — it\n * projects fields of the requirement payload for stable-stringification.*\n *\n * A resolver dedup key written as data: an ordered list of requirement-payload\n * field names. `key: [\"type\", \"to\"]` dedupes requirements by those fields.\n *\n * @example\n * ```ts\n * resolvers: {\n * fetch: {\n * requirement: \"FETCH\",\n * key: [\"url\", \"method\"] satisfies KeySelector<{ url: string; method: string }>,\n * resolve: doFetch,\n * },\n * }\n * ```\n */\nexport type KeySelector<R> = readonly (keyof R & string)[];\n\n/**\n * *Note: Directive's `$ref` is **not** a JSON Pointer or JSON Schema `$ref`.\n * It is a payload field copy — equivalent to `event.payload[key]`. Renaming\n * to `$from` is tracked as a possible v1.6+ additive alias.*\n *\n * A typed single-field copy from an event payload. Lives in the patch-spec\n * namespace — used inside a {@link PatchSpec} `$set` value.\n *\n * @example\n * ```ts\n * patch: { $set: { userId: { $ref: \"id\" } satisfies PayloadRef<{ id: string }> } }\n * ```\n */\nexport interface PayloadRef<P> {\n readonly $ref: keyof P & string;\n}\n\n/**\n * A patch value: a literal, a typed payload copy, or (for string facts) a\n * template. Lives in the patch-spec namespace — used inside a {@link PatchSpec}\n * `$set` block.\n *\n * @example\n * ```ts\n * const v1: PatchValue<boolean, { active: boolean }> = true;\n * const v2: PatchValue<string, { name: string }> = { $ref: \"name\" };\n * const v3: PatchValue<string, { name: string }> = { $template: \"user ${name}\" };\n * ```\n */\nexport type PatchValue<V, P> =\n | V\n | PayloadRef<P>\n | ([V] extends [string] ? FactTemplate : never);\n\n/**\n * An event handler written as data: assigns facts from literals, payload\n * fields (`$ref`), or interpolated strings (`$template`).\n *\n * @example\n * ```ts\n * const spec: PatchSpec<{ status: string; label: string }, { name: string }> = {\n * $set: {\n * status: \"active\",\n * label: { $template: \"user ${name}\" },\n * },\n * };\n * ```\n */\nexport interface PatchSpec<F, P> {\n readonly $set: { [K in keyof F]?: PatchValue<F[K], P> };\n}\n\n// ============================================================================\n// Explain\n// ============================================================================\n\n/**\n * The per-clause result of an explained predicate evaluation. One entry per\n * leaf operator (`$eq`, `$gte`, …); combinator nodes (`$all`, `$any`, `$not`)\n * may also appear as headers when the runtime emits them — hence the union\n * over {@link PredicateCombinatorKey}.\n *\n * @example\n * ```ts\n * const result: ClauseResult = {\n * path: \"elapsed\",\n * op: \"$gte\",\n * expected: 30,\n * actual: 20,\n * pass: false,\n * };\n * ```\n */\nexport interface ClauseResult {\n /** Dotted path to the fact (`elapsed`, `auth.token`). */\n readonly path: string;\n /** The operator applied (`$gte`, `$eq`, …) — `$eq` for a bare value. */\n readonly op: PredicateOp | PredicateCombinatorKey;\n /**\n * The value the predicate expected. For combinator clauses (`$all`,\n * `$any`, `$not`) this is the child count.\n */\n readonly expected: unknown;\n /**\n * The actual fact value at evaluation time. For combinator clauses this\n * is the number of child clauses that passed.\n */\n readonly actual: unknown;\n /** Whether this clause passed. */\n readonly pass: boolean;\n /**\n * Children of a combinator clause (`$all`, `$any`, `$not`). Preserves the\n * tree shape of the original predicate so renderers (devtools,\n * `system.explain()`) can indent nested clauses.\n */\n readonly children?: ClauseResult[];\n}\n","/**\n * Runtime for data-configuration predicates and templates.\n *\n * Pure module — imports only its own types. Reads facts through whatever\n * object it is handed (the reactive `Facts` proxy in production, a plain\n * snapshot in tests), so it never depends on the engine, store, or tracking.\n */\n\nimport isDevelopment from \"#is-development\";\nimport { stableStringify } from \"../utils/utils.js\";\nimport {\n type ClauseResult,\n type FactTemplate,\n PREDICATE_OPERATORS,\n type PatchSpec,\n type PredicateOp,\n} from \"./types/predicate.js\";\n\n// ============================================================================\n// Recursion bound\n// ============================================================================\n\n/**\n * Maximum predicate-AST recursion depth. Legitimate cross-module predicates\n * nest fewer than ~15 levels; 64 is generous but bounded — past it the runtime\n * dev-warns and bails rather than risking a stack overflow on a cyclic or\n * pathologically deep spec. Shared by every structural predicate walker\n * ({@link walkPredicate}, {@link evaluatePredicate}) so the cap lives in one\n * place.\n */\nexport const MAX_PREDICATE_DEPTH = 64;\n\n// ============================================================================\n// Discriminators\n// ============================================================================\n\n/** A readable scope — the `Facts` proxy and a plain snapshot both satisfy it. */\ntype Scope = Record<string, unknown>;\n\nfunction isPlainObject(v: unknown): v is Record<string, unknown> {\n if (typeof v !== \"object\" || v === null || Array.isArray(v)) {\n return false;\n }\n\n return !(v instanceof Date) && !(v instanceof RegExp);\n}\n\n/**\n * True when `v` is a plain `{}` literal (its prototype is `Object.prototype`\n * or `null`). Excludes class instances, Date, RegExp, Map, Set, Promise, etc.\n */\nfunction isPlainObjectStrict(v: unknown): v is Record<string, unknown> {\n if (typeof v !== \"object\" || v === null || Array.isArray(v)) {\n return false;\n }\n const proto = Object.getPrototypeOf(v);\n\n return proto === Object.prototype || proto === null;\n}\n\n/**\n * True when every own key of `v` is a recognized `$`-operator (and there is ≥1).\n * If any key starts with `$` but is not a known operator, dev-warn (typo) and\n * still treat the value as an operator object so the typo is not masked as a\n * literal — `applyOperator` will return false for the unknown op.\n */\nfunction isOperatorObject(v: unknown): v is Record<string, unknown> {\n if (!isPlainObject(v)) {\n return false;\n }\n\n let count = 0;\n let hasDollarKey = false;\n for (const k of Object.keys(v)) {\n if (k.startsWith(\"$\")) {\n hasDollarKey = true;\n if (!PREDICATE_OPERATORS.has(k)) {\n devWarn(\n `predicate: unknown operator \"${k}\" — looks like a typo. Known operators: ${[...PREDICATE_OPERATORS].join(\", \")}`,\n );\n }\n } else if (hasDollarKey || count === 0) {\n // Mixed $/non-$ keys aren't an operator object; let the caller treat\n // it as a literal/recursive predicate. The non-$ key check happens\n // below by short-circuiting when a non-$ key appears.\n return false;\n }\n count++;\n }\n\n if (!hasDollarKey) {\n return false;\n }\n\n // All keys are `$`-prefixed: this is an operator object, even if some keys\n // are typos. An unknown op makes applyOperator() return false.\n return count > 0;\n}\n\n/**\n * True when `v` is a data-form spec (predicate object/array) rather than a\n * function. Excludes class instances (Date, RegExp, Map, Set, Promise, etc.)\n * — only plain `{}` literals and arrays of plain clause shapes qualify.\n *\n * @example\n * ```ts\n * isPredicate({ phase: \"red\" }); // true\n * isPredicate((f) => f.phase === \"red\"); // false\n * isPredicate([{ fact: \"phase\", op: \"$eq\", value: \"red\" }]); // true\n * ```\n */\nexport function isPredicate(v: unknown): boolean {\n if (v === null) {\n return false;\n }\n if (Array.isArray(v)) {\n return v.every(\n (c) =>\n isPlainObjectStrict(c) &&\n \"fact\" in (c as object) &&\n \"op\" in (c as object),\n );\n }\n\n return isPlainObjectStrict(v);\n}\n\n// ============================================================================\n// Structural traversal\n// ============================================================================\n\n/**\n * Visitor passed to {@link walkPredicate}. Every callback is optional; a\n * walker implements only the arms it cares about.\n */\nexport interface PredicateVisitor {\n /**\n * A leaf operator clause: a fact + a `$`-operator + its operand. Fires once\n * per operator in a multi-operator object.\n *\n * @param factPath - Dotted path to the fact (`elapsed`, `auth.token`).\n * @param op - The operator key (`$gte`, `$matches`, …).\n * @param operand - The operator's operand value.\n * @param operandPath - Dotted path to the operand for diagnostics\n * (`elapsed.$gte`, `value` / `[0].value` for the array-clause form).\n */\n operator?(\n factPath: string,\n op: string,\n operand: unknown,\n operandPath: string,\n ): void;\n /**\n * A bare-value (equality) clause — a fact mapped to a non-object literal,\n * an array, or a non-plain class instance (Date, RegExp, Set, …).\n *\n * @param factPath - Dotted path to the fact.\n * @param value - The equality operand.\n */\n literal?(factPath: string, value: unknown): void;\n /**\n * A combinator node (`$all` / `$any` / `$not`), called before descending.\n * Return `false` to skip its children.\n */\n combinator?(kind: \"$all\" | \"$any\" | \"$not\"): boolean | void;\n /**\n * A nested-object (cross-module pivot) key, called before descending.\n * Return `false` to skip its children.\n */\n nested?(key: string): boolean | void;\n /**\n * A `$`-prefixed key appearing where a fact key was expected — either an\n * unknown/typo operator, or an operator mixed with fact keys at predicate\n * top level.\n *\n * @param key - The stray `$`-key.\n * @param factPath - Dotted path to the stray key.\n */\n strayOperatorKey?(key: string, factPath: string): void;\n /**\n * Called when traversal bails out early — a cycle was re-encountered or\n * the depth cap was hit. The subtree below the bail point is NOT visited.\n */\n bail?(reason: \"cycle\" | \"depth\"): void;\n}\n\n/**\n * Single depth-guarded, cycle-guarded structural traversal of a predicate\n * AST. The pure structural walkers — dependency extraction, `$changed`\n * detection, empty/config detection, serialization validation — share this\n * so a new operator or combinator is threaded through one place.\n *\n * Handles the object form, the array-clause form, combinator nodes, nested\n * cross-module objects, operator objects, and bare-value literals. It does\n * **not** evaluate — see {@link evaluatePredicate} for that.\n *\n * @internal\n */\nexport function walkPredicate(\n spec: unknown,\n visitor: PredicateVisitor,\n path = \"\",\n seen: WeakSet<object> = new WeakSet(),\n depth = 0,\n): void {\n if (depth > MAX_PREDICATE_DEPTH) {\n if (isDevelopment) {\n console.warn(\n `[Directive] predicate depth limit (${MAX_PREDICATE_DEPTH}) exceeded — flatten the predicate or split it into multiple constraints. If this is unexpected, check for a cyclic spec object.`,\n );\n }\n visitor.bail?.(\"depth\");\n\n return;\n }\n\n // Array-clause form — each `{ fact, op, value }` clause is a leaf operator.\n if (Array.isArray(spec)) {\n spec.forEach((clause, i) => {\n if (!isPlainObject(clause)) {\n return;\n }\n const c = clause as Record<string, unknown>;\n if (typeof c.fact === \"string\" && typeof c.op === \"string\") {\n const clausePath = path ? `${path}[${i}]` : `[${i}]`;\n visitor.operator?.(\n path ? `${path}.${c.fact}` : c.fact,\n c.op,\n c.value,\n `${clausePath}.value`,\n );\n }\n });\n\n return;\n }\n\n if (!isPlainObject(spec)) {\n return;\n }\n if (seen.has(spec)) {\n if (isDevelopment) {\n console.warn(\"[Directive] walkPredicate: cyclic predicate spec\");\n }\n visitor.bail?.(\"cycle\");\n\n return;\n }\n seen.add(spec);\n\n const obj = spec as Record<string, unknown>;\n\n // Combinator node — descend into children unless the visitor opts out.\n for (const kind of [\"$all\", \"$any\", \"$not\"] as const) {\n if (kind in obj) {\n const descend = visitor.combinator?.(kind);\n if (descend === false) {\n return;\n }\n const children =\n kind === \"$not\" ? [obj.$not] : ((obj[kind] as unknown[]) ?? []);\n for (const child of children) {\n walkPredicate(child, visitor, path, seen, depth + 1);\n }\n\n return;\n }\n }\n\n // Object form — one entry per key.\n for (const key of Object.keys(obj)) {\n const childPath = path ? `${path}.${key}` : key;\n\n if (key.startsWith(\"$\")) {\n // A `$`-key at fact position — typo operator or top-level operator\n // mixed with fact keys. Surface it; do not descend.\n visitor.strayOperatorKey?.(key, childPath);\n continue;\n }\n\n const value = obj[key];\n\n if (isOperatorObject(value)) {\n const opObj = value as Record<string, unknown>;\n for (const op of Object.keys(opObj)) {\n visitor.operator?.(childPath, op, opObj[op], `${childPath}.${op}`);\n }\n continue;\n }\n\n // Only a strict plain object (`{}` / `Object.create(null)`) recurses as\n // a nested cross-module predicate. A Set, Map, or class instance is a\n // bare-value leaf — surfacing it as `literal` lets a walker inspect its\n // runtime class (e.g. validatePredicate's JSON-serializability check).\n if (isPlainObjectStrict(value)) {\n const descend = visitor.nested?.(key);\n if (descend === false) {\n continue;\n }\n walkPredicate(value, visitor, childPath, seen, depth + 1);\n continue;\n }\n\n // Bare value — equality leaf (also array / Set / Map / class instances).\n visitor.literal?.(childPath, value);\n }\n}\n\n/**\n * True when `v` structurally passes {@link isPredicate} but contains no\n * operators, no combinators, and no fact-clause entries that resolve to a\n * primitive/operator leaf — i.e. an empty `{}` or a deeply-nested object\n * tree that never bottoms out in a leaf value. Used by the dynamic\n * `register()` / `assign()` paths to dev-warn when a config object is\n * passed where a predicate (or function) was expected.\n *\n * Returns `false` for arrays — array-form predicates with `fact`+`op`\n * clauses are handled by the structural `isPredicate` check upstream.\n *\n * @example\n * ```ts\n * isEmptyOrConfigPredicate({}); // true (empty — config-object misuse)\n * isEmptyOrConfigPredicate({ phase: \"red\" }); // false (real fact clause)\n * isEmptyOrConfigPredicate({ $eq: 5 }); // false (operator)\n * isEmptyOrConfigPredicate({ count: { $gt: 5 } }); // false (operator clause)\n * ```\n *\n * @internal\n */\nexport function isEmptyOrConfigPredicate(v: unknown): boolean {\n // Arrays and non-plain-object specs are never \"empty config objects\".\n if (!isPlainObjectStrict(v)) {\n return false;\n }\n\n // A spec is a config tree only when walkPredicate fires NONE of the\n // predicate-semantic callbacks — no operator, no combinator, no literal\n // leaf, no stray `$`-key. Nested plain objects are descended; an empty\n // `{}` or a tree of empty `{}` fires nothing and stays \"config\". A cycle\n // or depth-cap bail is treated as \"not a config object\" (can't determine\n // — fail safe so the dev-warn is not spuriously emitted).\n let isPredicateBody = false;\n walkPredicate(v, {\n operator() {\n isPredicateBody = true;\n },\n literal() {\n isPredicateBody = true;\n },\n combinator() {\n isPredicateBody = true;\n },\n strayOperatorKey() {\n isPredicateBody = true;\n },\n bail() {\n isPredicateBody = true;\n },\n });\n\n return !isPredicateBody;\n}\n\n/**\n * True when `v` is a {@link FactTemplate} (`{ $template: string }`).\n *\n * @example\n * ```ts\n * isTemplate({ $template: \"Hi ${name}\" }); // true\n * isTemplate({ $set: { name: \"x\" } }); // false\n * ```\n */\nexport function isTemplate(v: unknown): v is FactTemplate {\n return (\n isPlainObject(v) &&\n Object.hasOwn(v, \"$template\") &&\n typeof (v as { $template: unknown }).$template === \"string\"\n );\n}\n\n// ============================================================================\n// Load-time validation\n// ============================================================================\n\n/**\n * Throw when a predicate spec contains an operand that cannot survive a\n * JSON round-trip — i.e. that would silently mis-evaluate if the spec was\n * loaded from `JSON.parse`.\n *\n * Three failure classes are detected:\n *\n * - **Lost `RegExp` operand.** A `$matches` operand that is not a\n * `RegExp` instance. `JSON.parse` reconstructs a serialized regex as\n * `{}`, so a `$matches` clause with an empty-object operand is the\n * signature of a regex that did not survive serialization. Reify it\n * with `new RegExp(pattern, flags)` before installing the predicate.\n * - **`bigint` operand.** `JSON.stringify` throws on `bigint`, so a\n * `bigint` operand cannot have been produced by a JSON pipeline and\n * cannot be persisted by one either.\n * - **`Set` / `Map` operand.** Both serialize to `{}` and lose all\n * members; a predicate carrying one is not JSON-safe.\n *\n * This is an opt-in helper — the engine does not call it automatically.\n * Users who load predicates from JSON should call it after `JSON.parse`\n * to fail loud rather than silently mis-evaluate. See the\n * \"Serialization\" section of RFC-0004.\n *\n * @example\n * ```ts\n * validatePredicate({ phase: { $matches: {} } });\n * // throws — empty object where a RegExp is required\n *\n * validatePredicate({ phase: \"red\", elapsed: { $gte: 30 } });\n * // ok — JSON-clean operands\n * ```\n */\nexport function validatePredicate(spec: unknown, path = \"\"): void {\n /**\n * Recursively walk an operand's object/array structure, throwing on any\n * value that cannot survive a JSON round-trip — `bigint`, `Set`, `Map`, or\n * a nested `RegExp`. Depth- and cycle-guarded. A top-level operand is\n * inspected by the operator-specific {@link checkOperand} (which permits a\n * `RegExp` as the direct `$matches` operand); this helper handles values\n * nested *inside* a plain-object or array operand, where a `RegExp` is just\n * as JSON-unsafe as a `Set`.\n */\n function checkValueJsonSafe(\n value: unknown,\n at: string,\n seen: WeakSet<object>,\n depth: number,\n ): void {\n if (typeof value === \"bigint\") {\n throw new Error(\n `[Directive] validatePredicate: bigint operand at \"${at}\" is not JSON-serializable (JSON.stringify throws on bigint).`,\n );\n }\n if (value instanceof Set) {\n throw new Error(\n `[Directive] validatePredicate: Set operand at \"${at}\" is not JSON-serializable (serializes to {} and loses all members).`,\n );\n }\n if (value instanceof Map) {\n throw new Error(\n `[Directive] validatePredicate: Map operand at \"${at}\" is not JSON-serializable (serializes to {} and loses all entries).`,\n );\n }\n if (value instanceof RegExp) {\n throw new Error(\n `[Directive] validatePredicate: RegExp operand at \"${at}\" is not JSON-serializable (a regex lost to JSON.parse becomes {}). Only a direct $matches operand may be a RegExp.`,\n );\n }\n if (value === null || typeof value !== \"object\") {\n return;\n }\n if (depth > MAX_PREDICATE_DEPTH) {\n return;\n }\n if (seen.has(value)) {\n return;\n }\n seen.add(value);\n\n if (Array.isArray(value)) {\n value.forEach((el, i) => {\n checkValueJsonSafe(el, `${at}[${i}]`, seen, depth + 1);\n });\n\n return;\n }\n\n for (const k of Object.keys(value as Record<string, unknown>)) {\n checkValueJsonSafe(\n (value as Record<string, unknown>)[k],\n at ? `${at}.${k}` : k,\n seen,\n depth + 1,\n );\n }\n }\n\n /** Throw on a JSON-unrehydratable operand value. */\n function checkOperand(value: unknown, op: string, at: string): void {\n if (typeof value === \"bigint\") {\n throw new Error(\n `[Directive] validatePredicate: bigint operand at \"${at}\" is not JSON-serializable (JSON.stringify throws on bigint).`,\n );\n }\n if (value instanceof Set) {\n throw new Error(\n `[Directive] validatePredicate: Set operand at \"${at}\" is not JSON-serializable (serializes to {} and loses all members).`,\n );\n }\n if (value instanceof Map) {\n throw new Error(\n `[Directive] validatePredicate: Map operand at \"${at}\" is not JSON-serializable (serializes to {} and loses all entries).`,\n );\n }\n if (op === \"$matches\" && !(value instanceof RegExp)) {\n throw new Error(\n `[Directive] validatePredicate: $matches operand at \"${at}\" must be a RegExp; got ${value === null ? \"null\" : typeof value}. A regex lost to JSON.parse becomes {} — reify with new RegExp(pattern, flags) before installing.`,\n );\n }\n // A plain-object / array operand (e.g. `$eq: { ... }`, `$in: [ ... ]`)\n // can carry a `bigint`, `Set`, `Map`, or nested `RegExp` arbitrarily deep\n // — `checkOperand` only sees the operand's top type, so recurse into its\n // structure. The direct `$matches` RegExp is handled above and never\n // reaches this branch (a RegExp is not a plain object / array).\n if (Array.isArray(value)) {\n value.forEach((el, i) => {\n checkValueJsonSafe(el, `${at}[${i}]`, new WeakSet(), 1);\n });\n } else if (isPlainObjectStrict(value)) {\n for (const k of Object.keys(value)) {\n checkValueJsonSafe(value[k], `${at}.${k}`, new WeakSet(), 1);\n }\n }\n }\n\n // Top-level Set / Map node — a regex / set / map handed in directly as the\n // whole spec. walkPredicate would treat it as an empty object, so check\n // the entry node here.\n if (spec instanceof Set) {\n throw new Error(\n `[Directive] validatePredicate: Set operand${path ? ` at \"${path}\"` : \"\"} is not JSON-serializable (serializes to {} and loses all members).`,\n );\n }\n if (spec instanceof Map) {\n throw new Error(\n `[Directive] validatePredicate: Map operand${path ? ` at \"${path}\"` : \"\"} is not JSON-serializable (serializes to {} and loses all entries).`,\n );\n }\n\n // Single structural traversal — every operator clause and equality leaf is\n // checked for a JSON-unrehydratable operand. The walker threads the dotted\n // operand path so error messages point at the offending clause.\n walkPredicate(spec, {\n operator(_factPath, op, operand, operandPath) {\n checkOperand(operand, op, path ? `${path}.${operandPath}` : operandPath);\n },\n literal(factPath, value) {\n checkOperand(value, \"\", path ? `${path}.${factPath}` : factPath);\n },\n });\n}\n\n// ============================================================================\n// Equality\n// ============================================================================\n\n/**\n * Pairwise cycle-guard state shared across a single `deepEqual` traversal.\n *\n * Asymmetric cycles (only one side cyclic) must not short-circuit; we only\n * treat a pair as equal when the same `(a, b)` pair is re-encountered.\n */\ninterface DeepEqualSeen {\n ids: WeakMap<object, number>;\n next: { v: number };\n pairs: Set<string>;\n}\n\nfunction deepEqualSeen(): DeepEqualSeen {\n return { ids: new WeakMap(), next: { v: 1 }, pairs: new Set() };\n}\n\nfunction pairId(seen: DeepEqualSeen, obj: object): number {\n let id = seen.ids.get(obj);\n if (id === undefined) {\n id = seen.next.v++;\n seen.ids.set(obj, id);\n }\n\n return id;\n}\n\n/** Structural equality with NaN/Date handling and a pairwise cycle guard. */\nfunction deepEqual(a: unknown, b: unknown, seen?: DeepEqualSeen): boolean {\n if (Object.is(a, b)) {\n return true;\n }\n\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime();\n }\n\n if (\n typeof a !== \"object\" ||\n typeof b !== \"object\" ||\n a === null ||\n b === null\n ) {\n return false;\n }\n\n const guard = seen ?? deepEqualSeen();\n const key = `${pairId(guard, a)}:${pairId(guard, b)}`;\n if (guard.pairs.has(key)) {\n return true; // same (a, b) pair re-encountered — treat as equal\n }\n guard.pairs.add(key);\n\n if (Array.isArray(a) || Array.isArray(b)) {\n if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) {\n return false;\n }\n\n return a.every((v, i) => deepEqual(v, b[i], guard));\n }\n\n // Set equality — same size, every element of `a` has a structurally-equal\n // counterpart in `b`. Must precede the `Object.keys` fallback below because\n // `Object.keys(new Set(...))` is always `[]`, which would otherwise let\n // any two Sets (or any two Maps) compare equal regardless of contents.\n if (a instanceof Set || b instanceof Set) {\n if (!(a instanceof Set) || !(b instanceof Set) || a.size !== b.size) {\n return false;\n }\n const bArr = [...b];\n\n return [...a].every((v) => bArr.some((w) => deepEqual(v, w, guard)));\n }\n\n // Map equality — same size, every key in `a` matches a key in `b` with a\n // structurally-equal value. Greedy match with a used-flag to handle\n // structural (non-reference) key equality correctly.\n if (a instanceof Map || b instanceof Map) {\n if (!(a instanceof Map) || !(b instanceof Map) || a.size !== b.size) {\n return false;\n }\n const bEntries = [...b.entries()];\n const used = new Array<boolean>(bEntries.length).fill(false);\n for (const [ka, va] of a) {\n let found = false;\n for (let i = 0; i < bEntries.length; i++) {\n if (used[i]) {\n continue;\n }\n const [kb, vb] = bEntries[i]!;\n if (deepEqual(ka, kb, guard) && deepEqual(va, vb, guard)) {\n used[i] = true;\n found = true;\n break;\n }\n }\n if (!found) {\n return false;\n }\n }\n\n return true;\n }\n\n const ak = Object.keys(a as object);\n const bk = Object.keys(b as object);\n if (ak.length !== bk.length) {\n return false;\n }\n\n return ak.every(\n (k) =>\n Object.hasOwn(b as object, k) &&\n deepEqual(\n (a as Record<string, unknown>)[k],\n (b as Record<string, unknown>)[k],\n guard,\n ),\n );\n}\n\n// ============================================================================\n// Operators\n// ============================================================================\n\nfunction toComparable(v: unknown): number | bigint | string | undefined {\n if (v instanceof Date) {\n return v.getTime();\n }\n if (typeof v === \"number\" || typeof v === \"bigint\" || typeof v === \"string\") {\n return v;\n }\n\n return undefined;\n}\n\nfunction relational(\n op: PredicateOp,\n actual: unknown,\n operand: unknown,\n): boolean {\n const a = toComparable(actual);\n const b = toComparable(operand);\n if (a === undefined || b === undefined || typeof a !== typeof b) {\n return false;\n }\n\n switch (op) {\n case \"$gt\":\n return a > b;\n case \"$gte\":\n return a >= b;\n case \"$lt\":\n return a < b;\n case \"$lte\":\n return a <= b;\n default:\n return false;\n }\n}\n\n/** Apply one operator. `prevValue` is supplied only for `$changed`. */\nfunction applyOperator(\n op: PredicateOp,\n actual: unknown,\n operand: unknown,\n prevValue: unknown,\n): boolean {\n switch (op) {\n case \"$eq\":\n return deepEqual(actual, operand);\n case \"$ne\":\n return !deepEqual(actual, operand);\n case \"$in\":\n return (\n Array.isArray(operand) && operand.some((v) => deepEqual(actual, v))\n );\n case \"$nin\":\n return (\n Array.isArray(operand) && !operand.some((v) => deepEqual(actual, v))\n );\n case \"$exists\":\n return operand === (actual !== undefined);\n case \"$changed\":\n return !deepEqual(actual, prevValue);\n case \"$gt\":\n case \"$gte\":\n case \"$lt\":\n case \"$lte\":\n return relational(op, actual, operand);\n case \"$between\": {\n if (!Array.isArray(operand) || operand.length !== 2) {\n return false;\n }\n const lo = toComparable(operand[0]);\n const hi = toComparable(operand[1]);\n if (\n lo !== undefined &&\n hi !== undefined &&\n typeof lo === typeof hi &&\n lo > hi\n ) {\n devWarn(\"$between: reversed pair — [min, max] required\");\n\n return false;\n }\n\n return (\n relational(\"$gte\", actual, operand[0]) &&\n relational(\"$lte\", actual, operand[1])\n );\n }\n case \"$matches\": {\n if (!(operand instanceof RegExp)) {\n // String operands are not accepted — a string cannot carry flags\n // (case-insensitivity, dotall, multiline) and would also enable a\n // ReDoS surface for data-loaded predicates. Throw immediately so\n // the bug surfaces at the point of use.\n throw new Error(\n \"[Directive] $matches: operand must be a RegExp (string operands are no longer accepted; pass /pattern/flags directly).\",\n );\n }\n if (typeof actual !== \"string\") {\n return false;\n }\n\n return operand.test(actual);\n }\n case \"$startsWith\":\n if (typeof actual !== \"string\") {\n return false;\n }\n\n return actual.startsWith(String(operand));\n case \"$endsWith\":\n if (typeof actual !== \"string\") {\n return false;\n }\n\n return actual.endsWith(String(operand));\n case \"$contains\":\n if (typeof actual === \"string\") {\n return actual.includes(String(operand));\n }\n if (Array.isArray(actual)) {\n return actual.some((v) => deepEqual(v, operand));\n }\n // Set membership — uses `.has()` which is reference-equality for\n // objects (matches native Set semantics) and value-equality for\n // primitives. Map `$contains` is deferred to v2; users who need it\n // today can fall back to a function-form predicate.\n if (actual instanceof Set) {\n return actual.has(operand);\n }\n\n return false;\n default:\n return false;\n }\n}\n\n// ============================================================================\n// Evaluation\n// ============================================================================\n\nfunction devWarn(message: string): void {\n if (isDevelopment) {\n console.warn(`[Directive] ${message}`);\n }\n}\n\nfunction evalField(\n value: unknown,\n actual: unknown,\n prev: unknown,\n depth: number,\n): boolean {\n if (isOperatorObject(value)) {\n const keys = Object.keys(value);\n // Type rejects multi-operator objects; the runtime ANDs them on a\n // best-effort basis but dev-warns so the author knows to switch to the\n // array form or `$all`.\n if (keys.length > 1) {\n devWarn(\n `predicate: operator object has ${keys.length} operators (${keys.join(\", \")}) — write the array form or $all instead. The runtime ANDs them as a best-effort fallback.`,\n );\n }\n for (const op of keys) {\n if (!applyOperator(op as PredicateOp, actual, value[op], prev)) {\n return false;\n }\n }\n\n return true;\n }\n\n // A plain (non-operator) object recurses — nested / namespaced predicate.\n if (isPlainObject(value)) {\n return evaluatePredicate(\n value,\n isPlainObject(actual) ? actual : Object.create(null),\n isPlainObject(prev) ? prev : undefined,\n depth + 1,\n );\n }\n\n // Bare value → equality.\n return deepEqual(actual, value);\n}\n\n/**\n * Evaluate a {@link FactPredicate} against a fact scope. `prev` (a previous\n * snapshot) is consulted only by the `$changed` operator.\n *\n * @example\n * ```ts\n * evaluatePredicate({ phase: \"red\", elapsed: { $gte: 30 } }, { phase: \"red\", elapsed: 45 });\n * // → true\n * evaluatePredicate({ $any: [{ phase: \"red\" }, { phase: \"yellow\" }] }, { phase: \"green\" });\n * // → false\n * ```\n */\nexport function evaluatePredicate(\n spec: unknown,\n facts: Scope,\n prev?: Scope,\n depth = 0,\n): boolean {\n // `freezeSpec` permits cycles (it uses a WeakSet seen-guard), so a\n // registered spec can be self-referential. Cap recursion to defend the\n // reconcile loop against a stack overflow at evaluation time.\n if (depth > MAX_PREDICATE_DEPTH) {\n devWarn(\n `predicate depth limit (${MAX_PREDICATE_DEPTH}) exceeded — flatten the predicate or split it into multiple constraints. If this is unexpected, check for a cyclic spec object.`,\n );\n\n return false;\n }\n // Array form — clauses AND-ed.\n if (Array.isArray(spec)) {\n return spec.every((clause) => {\n if (!isPlainObject(clause)) {\n return false;\n }\n const { fact, op, value } = clause as {\n fact: string;\n op: PredicateOp;\n value: unknown;\n };\n\n return applyOperator(op, facts?.[fact], value, prev?.[fact]);\n });\n }\n\n if (!isPlainObject(spec)) {\n return Boolean(spec);\n }\n\n // Combinator node.\n if (\"$all\" in spec) {\n return (spec.$all as unknown[]).every((p) =>\n evaluatePredicate(p, facts, prev, depth + 1),\n );\n }\n if (\"$any\" in spec) {\n return (spec.$any as unknown[]).some((p) =>\n evaluatePredicate(p, facts, prev, depth + 1),\n );\n }\n if (\"$not\" in spec) {\n return !evaluatePredicate(spec.$not, facts, prev, depth + 1);\n }\n\n // Object form — every key AND-ed.\n for (const key of Object.keys(spec)) {\n if (PREDICATE_OPERATORS.has(key)) {\n devWarn(\n `predicate: operator \"${key}\" mixed with fact keys — wrap operators in a per-fact object`,\n );\n\n return false;\n }\n if (!evalField(spec[key], facts?.[key], prev?.[key], depth)) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Evaluate a predicate and return a per-clause breakdown — the data feed for\n * devtools, `system.explain()`, and `directive explain`.\n *\n * @example\n * ```ts\n * evaluatePredicateExplained(\n * { phase: \"red\", elapsed: { $gte: 30 } },\n * { phase: \"red\", elapsed: 20 },\n * );\n * // → [\n * // { path: \"phase\", op: \"$eq\", expected: \"red\", actual: \"red\", pass: true },\n * // { path: \"elapsed\", op: \"$gte\", expected: 30, actual: 20, pass: false },\n * // ]\n * ```\n */\nexport function evaluatePredicateExplained(\n spec: unknown,\n facts: Scope,\n prev?: Scope,\n pathPrefix = \"\",\n): ClauseResult[] {\n const out: ClauseResult[] = [];\n\n if (Array.isArray(spec)) {\n for (const clause of spec) {\n if (!isPlainObject(clause)) {\n continue;\n }\n const { fact, op, value } = clause as {\n fact: string;\n op: PredicateOp;\n value: unknown;\n };\n const actual = facts?.[fact];\n out.push({\n path: pathPrefix + fact,\n op,\n expected: value,\n actual,\n pass: applyOperator(op, actual, value, prev?.[fact]),\n });\n }\n\n return out;\n }\n\n if (!isPlainObject(spec)) {\n return out;\n }\n\n for (const key of [\"$all\", \"$any\", \"$not\"] as const) {\n if (key in spec) {\n const childSpecs =\n key === \"$not\" ? [spec.$not] : (spec[key] as unknown[]);\n const children: ClauseResult[] = [];\n for (const child of childSpecs) {\n children.push(\n ...evaluatePredicateExplained(child, facts, prev, pathPrefix),\n );\n }\n const passCount = children.filter((c) => c.pass).length;\n let pass: boolean;\n if (key === \"$all\") {\n pass = children.length === 0 || passCount === children.length;\n } else if (key === \"$any\") {\n pass = children.length > 0 && passCount > 0;\n } else {\n // $not — single child wrapped above\n pass = !children.every((c) => c.pass);\n }\n out.push({\n path: pathPrefix || key,\n op: key,\n expected: childSpecs.length,\n actual: passCount,\n pass,\n children,\n });\n\n return out;\n }\n }\n\n for (const key of Object.keys(spec)) {\n if (PREDICATE_OPERATORS.has(key)) {\n continue;\n }\n const value = spec[key];\n const actual = facts?.[key];\n const path = pathPrefix + key;\n\n if (isOperatorObject(value)) {\n for (const op of Object.keys(value)) {\n out.push({\n path,\n op: op as PredicateOp,\n expected: value[op],\n actual,\n pass: applyOperator(\n op as PredicateOp,\n actual,\n value[op],\n prev?.[key],\n ),\n });\n }\n } else if (isPlainObject(value)) {\n out.push(\n ...evaluatePredicateExplained(\n value,\n isPlainObject(actual) ? actual : Object.create(null),\n isPlainObject(prev?.[key]) ? (prev?.[key] as Scope) : undefined,\n `${path}.`,\n ),\n );\n } else {\n out.push({\n path,\n op: \"$eq\",\n expected: value,\n actual,\n pass: deepEqual(actual, value),\n });\n }\n }\n\n return out;\n}\n\nconst memoizedCache = new WeakMap<\n object,\n (facts: Scope, prev?: Scope) => boolean\n>();\n\n/**\n * Memoize a predicate as a reusable evaluation closure.\n *\n * The returned function accepts any `facts` scope (the reactive proxy in\n * production, a plain object in tests) plus an optional `prev` snapshot for\n * `$changed`. The closure is cached **by predicate identity** in a\n * `WeakMap`, so passing the same `predicate` reference repeatedly is\n * allocation-free; cleanup is automatic once the predicate is no longer\n * reachable.\n *\n * Note: no actual compilation happens — the returned closure re-walks the\n * spec on every call via `evaluatePredicate`. The name reflects what the\n * function does (closure memoization keyed by predicate identity), not a\n * bytecode/AST compile step.\n *\n * Intended for advanced users who want a stable function reference per\n * predicate (custom devtools, batched analyses). Regular module code does\n * not need to call this — the engine wraps data-form `when` / `on` specs\n * automatically at registration.\n *\n * @example\n * ```ts\n * const predicate = { phase: \"red\", elapsed: { $gte: 30 } };\n * const check = memoizePredicate(predicate);\n * check({ phase: \"red\", elapsed: 45 }); // → true\n * check({ phase: \"red\", elapsed: 5 }); // → false\n * ```\n */\nexport function memoizePredicate(\n predicate: object,\n): (facts: Scope, prev?: Scope) => boolean {\n if (predicate === null || typeof predicate !== \"object\") {\n throw new Error(\n `[Directive] memoizePredicate: predicate must be a plain object or array; got ${typeof predicate}`,\n );\n }\n const cached = memoizedCache.get(predicate);\n if (cached) {\n return cached;\n }\n\n const fn = (facts: Scope, prev?: Scope): boolean =>\n evaluatePredicate(predicate, facts, prev);\n memoizedCache.set(predicate, fn);\n\n return fn;\n}\n\n// ============================================================================\n// Dependency extraction\n// ============================================================================\n\n/**\n * Collect the fact keys a predicate references. Used for static analysis,\n * devtools, and effect `on` dependency wiring. Nested predicates contribute\n * dotted keys (`auth.token`).\n *\n * @example\n * ```ts\n * extractDeps({ phase: \"red\", elapsed: { $gte: 30 } });\n * // → Set { \"phase\", \"elapsed\" }\n * extractDeps({ self: { phase: \"red\" }, auth: { token: { $exists: true } } });\n * // → Set { \"self.phase\", \"auth.token\" }\n * ```\n */\nexport function extractDeps(spec: unknown, prefix = \"\"): Set<string> {\n const deps = new Set<string>();\n\n // Single structural traversal — every operator clause and equality leaf\n // contributes its dotted fact path. Combinators and nested objects are\n // descended automatically; stray `$`-keys never synthesize phantom deps.\n walkPredicate(spec, {\n operator(factPath) {\n deps.add(prefix + factPath);\n },\n literal(factPath) {\n deps.add(prefix + factPath);\n },\n strayOperatorKey(key) {\n // A `$`-key at fact position never synthesizes a phantom dep. A typo'd\n // operator (e.g. `$eqq`) additionally dev-warns; a known operator\n // mixed with fact keys is skipped silently (evaluatePredicate warns).\n if (!PREDICATE_OPERATORS.has(key)) {\n devWarn(\n `extractDeps: unknown operator \"${key}\" — skipping. Known operators: ${[...PREDICATE_OPERATORS].join(\", \")}`,\n );\n }\n },\n });\n\n return deps;\n}\n\n// ============================================================================\n// Templates\n// ============================================================================\n\nconst IDENTIFIER = /^[A-Za-z_][A-Za-z0-9_]*$/;\n\n/** Stringify a value without dev-warns for null/undefined — used when the\n * caller has already emitted a higher-level diagnostic (e.g. \"unknown key\"). */\nfunction stringifyValueQuiet(v: unknown): string {\n if (typeof v === \"symbol\") {\n return \"\";\n }\n if (v === undefined || v === null) {\n return \"\";\n }\n\n return String(v);\n}\n\nfunction stringifyValue(v: unknown, key?: string): string {\n if (typeof v === \"symbol\") {\n devWarn(\"template: cannot interpolate a symbol value — using empty string\");\n\n return \"\";\n }\n if (v === undefined) {\n devWarn(\n `template: ${key ? `key \"${key}\" is ` : \"\"}undefined — using empty string`,\n );\n\n return \"\";\n }\n if (v === null) {\n devWarn(\n `template: ${key ? `key \"${key}\" is ` : \"\"}null — using empty string`,\n );\n\n return \"\";\n }\n\n return String(v);\n}\n\n/**\n * Interpolate a {@link FactTemplate} against a scope. Single-pass character\n * scanner: `${ident}` interpolates `scope[ident]`; `$${` emits a literal\n * `${`; unknown keys dev-warn and yield an empty string.\n *\n * @example\n * ```ts\n * evaluateTemplate({ $template: \"Hi ${name}!\" }, { name: \"Ada\" });\n * // → \"Hi Ada!\"\n * evaluateTemplate({ $template: \"$${price}\" }, {});\n * // → \"${price}\"\n * ```\n */\nexport function evaluateTemplate(spec: FactTemplate, scope: Scope): string {\n const tpl = spec.$template;\n let out = \"\";\n let i = 0;\n\n while (i < tpl.length) {\n if (tpl[i] === \"$\" && tpl[i + 1] === \"$\" && tpl[i + 2] === \"{\") {\n out += \"${\";\n i += 3;\n continue;\n }\n\n if (tpl[i] === \"$\" && tpl[i + 1] === \"{\") {\n const end = tpl.indexOf(\"}\", i + 2);\n if (end === -1) {\n devWarn(`template: unterminated \"\\${\" in ${JSON.stringify(tpl)}`);\n out += tpl.slice(i);\n break;\n }\n const key = tpl.slice(i + 2, end);\n if (!IDENTIFIER.test(key)) {\n devWarn(\n `template: invalid placeholder \"\\${${key}}\" — not an identifier`,\n );\n } else {\n // `stringifyValue` dev-warns separately for null vs undefined; here\n // we only warn when the key itself is missing from the scope (vs\n // present-but-null), so users see distinct diagnostics. Use\n // Object.hasOwn rather than `in` so prototype-chain keys (e.g.\n // `toString`, `constructor`) are never interpolated.\n const present = scope != null && Object.hasOwn(scope, key);\n const value = present ? scope[key] : undefined;\n if (!present) {\n devWarn(`template: unknown key \"${key}\"`);\n out += stringifyValueQuiet(value);\n } else {\n out += stringifyValue(value, key);\n }\n }\n i = end + 1;\n continue;\n }\n\n out += tpl[i];\n i++;\n }\n\n return out;\n}\n\n/**\n * Collect the placeholder keys referenced by a template. The static-analysis\n * counterpart to {@link extractDeps} — useful for devtools, codegen, and\n * \"which facts does this template read\" inspections. Only valid identifier\n * placeholders are collected; malformed ones are ignored.\n *\n * @example\n * ```ts\n * extractTemplateKeys({ $template: \"${firstName} ${lastName}\" });\n * // → Set { \"firstName\", \"lastName\" }\n * extractTemplateKeys({ $template: \"$${literal}\" });\n * // → Set {} (escaped — not a placeholder)\n * ```\n */\nexport function extractTemplateKeys(spec: FactTemplate): Set<string> {\n const keys = new Set<string>();\n const tpl = spec.$template;\n let i = 0;\n\n while (i < tpl.length) {\n if (tpl[i] === \"$\" && tpl[i + 1] === \"$\" && tpl[i + 2] === \"{\") {\n i += 3;\n continue;\n }\n if (tpl[i] === \"$\" && tpl[i + 1] === \"{\") {\n const end = tpl.indexOf(\"}\", i + 2);\n if (end === -1) {\n break;\n }\n const key = tpl.slice(i + 2, end);\n if (IDENTIFIER.test(key)) {\n keys.add(key);\n }\n i = end + 1;\n continue;\n }\n i++;\n }\n\n return keys;\n}\n\n// ============================================================================\n// Selectors\n// ============================================================================\n\n/**\n * Build a stable dedup key by selecting fields from a requirement payload.\n * Order-as-declared; values are stable-stringified (keys sorted recursively)\n * so two payloads with the same fields in different orders dedupe to the\n * same key.\n *\n * @example\n * ```ts\n * evaluateKeySelector([\"url\", \"method\"], { url: \"/a\", method: \"GET\" });\n * // → '\"/a\"|\"GET\"'\n * evaluateKeySelector([\"id\"], { id: 42 });\n * // → '42'\n * ```\n */\nexport function evaluateKeySelector(\n selector: readonly string[],\n source: Record<string, unknown>,\n): string {\n return selector.map((field) => stableStringify(source?.[field])).join(\"|\");\n}\n\n// ============================================================================\n// Patch\n// ============================================================================\n\n/**\n * Apply a {@link PatchSpec} — assign facts from literals, payload copies\n * (`$ref`), or interpolated strings (`$template`). Mutates through the passed\n * `facts` proxy so change-tracking and downstream invalidation fire.\n *\n * @example\n * ```ts\n * const spec = {\n * $set: {\n * active: true,\n * userId: { $ref: \"id\" },\n * label: { $template: \"user ${name}\" },\n * },\n * };\n * applyPatch(spec, facts, { id: \"u_1\", name: \"Ada\" });\n * // facts.active = true; facts.userId = \"u_1\"; facts.label = \"user Ada\"\n * ```\n */\nexport function applyPatch(\n spec: PatchSpec<Record<string, unknown>, Record<string, unknown>>,\n facts: Record<string, unknown>,\n payload: Record<string, unknown>,\n): void {\n const set = spec.$set;\n const safePayload = payload ?? {};\n for (const key of Object.keys(set)) {\n const value = (set as Record<string, unknown>)[key];\n\n if (isTemplate(value)) {\n facts[key] = evaluateTemplate(value, safePayload);\n } else if (\n isPlainObject(value) &&\n Object.hasOwn(value, \"$ref\") &&\n typeof value.$ref === \"string\"\n ) {\n const refKey = value.$ref;\n // Use Object.hasOwn rather than `in` — tightens defense against\n // prototype-chain lookups so a payload `__proto__` shape can't smuggle\n // an inherited property into the fact assignment. The proxy already\n // blocks writes to dangerous keys, but this keeps the read symmetric.\n if (!Object.hasOwn(safePayload, refKey)) {\n devWarn(\n `applyPatch: $ref \"${refKey}\" is missing from event payload — assigning undefined to fact \"${key}\"`,\n );\n }\n facts[key] = safePayload[refKey];\n } else {\n facts[key] = value;\n }\n }\n}\n","/**\n * Predicate backtest — rule-change impact.\n *\n * Given a recorded sequence of fact-state frames and a proposed replacement\n * for a constraint's `when` predicate, re-score the frames against BOTH the\n * original and the proposed predicate and produce a backtest report: how\n * many frames each matched, plus the per-frame diff (frames that newly\n * match / no longer match). It answers \"how many recorded frames would the\n * proposed rule have matched differently\" against real recorded history.\n *\n * This is a *static* backtest, not a behavioral simulation — the engine is\n * not re-run. Recorded frames are re-scored against a new predicate; the\n * resulting requirements, resolvers, and downstream fact changes are NOT\n * modeled. Treat the numbers as a divergence scan, not a forecast.\n *\n * Pure module — imports only the predicate runtime. No engine, store, or\n * tracking dependency. Replay walks frames in order; for `$changed`-style\n * predicates each frame is evaluated against the previous frame's facts.\n */\n\nimport {\n evaluatePredicate,\n evaluatePredicateExplained,\n isPredicate,\n validatePredicate,\n walkPredicate,\n} from \"./predicate.js\";\nimport type { ClauseResult, FactPredicate } from \"./types/predicate.js\";\nimport { PREDICATE_COMBINATORS, PREDICATE_OPERATORS } from \"./types/predicate.js\";\n\n/**\n * Upper bound on the number of frames a single {@link replayUnder} call will\n * process. A history file is held entirely in memory; an unbounded array is a\n * denial-of-service surface. A history larger than this should be split or\n * down-sampled before replay.\n */\nexport const MAX_REPLAY_FRAMES = 1_000_000;\n\n/** One recorded fact-state frame. */\nexport interface ReplayFrame<F = Record<string, unknown>> {\n /** Stable identifier — a snapshot id, an index, a session key. */\n id: string | number;\n /** Optional wall-clock time (ms epoch). */\n timestamp?: number;\n /** The fact state at this frame. */\n facts: F;\n}\n\nexport interface ReplayUnderOptions<F = Record<string, unknown>> {\n /** Recorded frames, chronological order. */\n frames: readonly ReplayFrame<F>[];\n /** The constraint's current `when` predicate (the baseline). */\n original: FactPredicate<F>;\n /** The proposed replacement `when` predicate. */\n proposed: FactPredicate<F>;\n /** Max diff samples to attach per bucket (default 20). */\n maxSamples?: number;\n /**\n * A fact key identifying the entity a frame belongs to (e.g. `\"userId\"`,\n * `\"sessionId\"`). When set, the report also reports distinct-entity counts\n * — how many unique entities matched, not just how many frames. Without it\n * the unit is frames: one fact snapshot, not one user or session.\n */\n entityKey?: string;\n}\n\n/** A frame where the original and proposed predicate disagree. */\nexport interface ReplayDiffSample {\n frameId: string | number;\n timestamp?: number;\n /** The fact state at this frame. */\n facts: Record<string, unknown>;\n /** Per-clause breakdown under the original predicate. */\n originalExplain: ClauseResult[];\n /** Per-clause breakdown under the proposed predicate. */\n proposedExplain: ClauseResult[];\n}\n\n/**\n * The outcome of replaying a recorded history under two predicates — a\n * static backtest of a proposed rule change, not a behavioral simulation.\n */\nexport interface PredicateBacktestReport {\n /** Total frames evaluated. */\n framesEvaluated: number;\n /**\n * Frames where the original predicate matched (was true). `matchedEntities`\n * is the count of distinct `entityKey` values among matched frames — only\n * populated when {@link ReplayUnderOptions.entityKey} was supplied.\n */\n original: { matched: number; matchedEntities?: number };\n /** Frames where the proposed predicate matched. */\n proposed: { matched: number; matchedEntities?: number };\n /** proposed.matched - original.matched. */\n delta: number;\n /** Total count of frames that newly match (original false -> proposed true). */\n newMatchCount: number;\n /** Total count of frames that no longer match (original true -> proposed false). */\n lostMatchCount: number;\n /** Frames where original and proposed agree. */\n unchanged: number;\n /** Sampled new-match frames (capped at maxSamples), with clause explain. */\n newMatches: ReplayDiffSample[];\n /** Sampled lost-match frames (capped at maxSamples), with clause explain. */\n lostMatches: ReplayDiffSample[];\n}\n\n/**\n * Validate one predicate spec for {@link replayUnder}, re-throwing any failure\n * with a message that names which spec (`original` / `proposed`) was bad.\n *\n * Three checks run, all up front so a malformed spec never reaches the\n * per-frame loop (where {@link evaluatePredicate} would throw a raw error on,\n * say, a `$matches` operand that is not a RegExp):\n *\n * 1. {@link validatePredicate} — JSON-unrehydratable operands (a `$matches`\n * operand that is not a RegExp, a `bigint`, a `Set`/`Map`).\n * 2. {@link isPredicate} — the spec is structurally a FactPredicate. An\n * empty object `{}` is a valid (always-true) predicate and is allowed.\n * 3. Unknown `$`-operators — a single walk surfaces any `$frobnicate`-style\n * typo as one clear error instead of a per-call dev-warn.\n */\nfunction validateReplaySpec(\n spec: unknown,\n which: \"original\" | \"proposed\",\n): void {\n try {\n validatePredicate(spec);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n\n throw new Error(\n `[Directive] replayUnder: the ${which} predicate is invalid — ${message}`,\n );\n }\n\n if (!isPredicate(spec)) {\n const preview =\n spec === null || typeof spec !== \"object\"\n ? `${typeof spec} — ${JSON.stringify(spec)}`\n : JSON.stringify(spec).slice(0, 80);\n\n throw new Error(\n `[Directive] replayUnder: the ${which} predicate is not a valid FactPredicate (got ${preview})`,\n );\n }\n\n // Surface an unknown `$`-operator (`$frobnicate`) as one clear error.\n // `walkPredicate` reports a `$`-key at fact position via `strayOperatorKey`\n // and an operator clause via `operator`; check both against the known sets.\n let unknownOp: string | undefined;\n walkPredicate(spec, {\n operator(_factPath, op) {\n if (\n unknownOp === undefined &&\n op.startsWith(\"$\") &&\n !PREDICATE_OPERATORS.has(op)\n ) {\n unknownOp = op;\n }\n },\n strayOperatorKey(key) {\n if (\n unknownOp === undefined &&\n !PREDICATE_OPERATORS.has(key) &&\n !PREDICATE_COMBINATORS.has(key)\n ) {\n unknownOp = key;\n }\n },\n });\n\n if (unknownOp !== undefined) {\n throw new Error(\n `[Directive] replayUnder: the ${which} predicate uses an unknown operator \"${unknownOp}\" — known operators: ${[...PREDICATE_OPERATORS].join(\", \")}`,\n );\n }\n}\n\n/**\n * Normalize a parsed-from-JSON history value into a `ReplayFrame[]`.\n *\n * Accepts the three documented history shapes:\n *\n * 1. A bare array of frames: `[{ id, timestamp?, facts }, ...]`\n * 2. An object wrapping them: `{ frames: [{ id, ..., facts }, ...] }`\n * 3. A bare array of fact objects: `[{ phase: \"red\", ... }, ...]`\n * — each element is wrapped as a frame.\n *\n * Frame ids are kept unambiguous: a frame that supplies its own `id` keeps\n * it; a frame missing an `id` (and every bare-fact frame) gets an\n * **index-derived** id prefixed with `#` (`\"#0\"`, `\"#1\"`, …) so a fallback\n * id can never collide with an explicit numeric or string id in a mixed\n * history. This is a pure helper — it **throws** a clear `Error` on bad\n * input and never calls `process.exit`, so library users can catch it.\n *\n * @example\n * ```ts\n * toReplayFrames([{ id: \"s1\", facts: { phase: \"red\" } }]);\n * // → [{ id: \"s1\", facts: { phase: \"red\" } }]\n * toReplayFrames([{ phase: \"red\" }, { phase: \"green\" }]);\n * // → [{ id: \"#0\", facts: { phase: \"red\" } }, { id: \"#1\", facts: { phase: \"green\" } }]\n * ```\n */\nexport function toReplayFrames(raw: unknown): ReplayFrame[] {\n // A history-manager export ({ version, snapshots, currentIndex }) is a\n // valid input shape — route it through framesFromHistory so the CLI and\n // the library accept the same files.\n if (\n raw &&\n typeof raw === \"object\" &&\n !Array.isArray(raw) &&\n Array.isArray((raw as { snapshots?: unknown }).snapshots)\n ) {\n return framesFromHistory(raw);\n }\n\n const list: unknown[] | null = Array.isArray(raw)\n ? raw\n : raw &&\n typeof raw === \"object\" &&\n Array.isArray((raw as { frames?: unknown }).frames)\n ? (raw as { frames: unknown[] }).frames\n : null;\n\n if (!list) {\n throw new Error(\n \"[Directive] toReplayFrames: history must be a JSON array of frames, an object with a `frames` array, or a history export with a `snapshots` array\",\n );\n }\n\n // Enforce the frame cap on `length` before `.map()` materializes a second\n // array — the cap must bound memory, not just the evaluation loop.\n if (list.length > MAX_REPLAY_FRAMES) {\n throw new Error(\n `[Directive] toReplayFrames: history has ${list.length} frames, exceeds the MAX_REPLAY_FRAMES limit (${MAX_REPLAY_FRAMES}) — split or down-sample the history`,\n );\n }\n\n return list.map((entry, index) => {\n if (entry && typeof entry === \"object\" && \"facts\" in entry) {\n const frame = entry as {\n id?: string | number;\n timestamp?: number;\n facts: unknown;\n };\n // An explicit id is used verbatim; a missing id falls back to a\n // `#`-prefixed index so it cannot collide with an explicit id.\n const out: ReplayFrame = {\n id: frame.id ?? `#${index}`,\n facts: (frame.facts ?? {}) as Record<string, unknown>,\n };\n if (typeof frame.timestamp === \"number\") {\n out.timestamp = frame.timestamp;\n }\n\n return out;\n }\n\n // A bare fact object — wrap it, keyed by `#`-prefixed index.\n return { id: `#${index}`, facts: (entry ?? {}) as Record<string, unknown> };\n });\n}\n\n/**\n * Convert a history-manager export (the JSON produced by\n * `system.history.export()`) into a `ReplayFrame[]` ready for\n * {@link replayUnder}.\n *\n * The history manager records a ring buffer of `{ id, timestamp, facts,\n * trigger }` snapshots; `export()` wraps them as `{ version, snapshots,\n * currentIndex }`. Each snapshot's `facts` is the fact state at that point,\n * so the snapshot sequence is exactly a frame stream.\n *\n * Accepts either the parsed export object, the raw JSON string, or a bare\n * array of snapshots. Throws a clear `Error` on bad input.\n *\n * @example\n * ```ts\n * const frames = framesFromHistory(system.history.export());\n * const report = replayUnder({ frames, original, proposed });\n * ```\n */\nexport function framesFromHistory(historyExport: unknown): ReplayFrame[] {\n const parsed =\n typeof historyExport === \"string\"\n ? (JSON.parse(historyExport) as unknown)\n : historyExport;\n\n // A bare snapshot array is accepted directly.\n if (Array.isArray(parsed)) {\n return framesFromSnapshots(parsed);\n }\n\n if (!parsed || typeof parsed !== \"object\") {\n throw new Error(\n \"[Directive] framesFromHistory: expected a history export object with a `snapshots` array (from system.history.export())\",\n );\n }\n\n const exportObj = parsed as { version?: unknown; snapshots?: unknown };\n\n // Mirror history.ts import(): only version 1 is understood. A bump in the\n // export format must fail loud here, not silently yield wrong frames.\n if (exportObj.version !== undefined && exportObj.version !== 1) {\n throw new Error(\n `[Directive] framesFromHistory: unsupported history export version ${JSON.stringify(exportObj.version)} — expected 1`,\n );\n }\n\n if (!Array.isArray(exportObj.snapshots)) {\n throw new Error(\n \"[Directive] framesFromHistory: expected a history export object with a `snapshots` array (from system.history.export())\",\n );\n }\n\n return framesFromSnapshots(exportObj.snapshots);\n}\n\n/**\n * Convert an array of `{ id, timestamp?, facts }` snapshots — e.g. the\n * `snapshots` field of a history export, or an array assembled by pushing\n * `system.getSnapshot()` on each reconcile — into a `ReplayFrame[]`.\n *\n * Throws a clear `Error` if the argument is not an array. Each snapshot is\n * normalized through the same {@link toReplayFrames} id logic.\n *\n * @example\n * ```ts\n * const snapshots: typeof history[] = [];\n * system.observe(() => snapshots.push(system.getSnapshot()));\n * // ...later\n * const frames = framesFromSnapshots(snapshots);\n * ```\n */\nexport function framesFromSnapshots(snapshots: unknown): ReplayFrame[] {\n if (!Array.isArray(snapshots)) {\n throw new Error(\n \"[Directive] framesFromSnapshots: expected an array of fact-state snapshots\",\n );\n }\n\n if (snapshots.length > MAX_REPLAY_FRAMES) {\n throw new Error(\n `[Directive] framesFromSnapshots: history has ${snapshots.length} snapshots, exceeds the MAX_REPLAY_FRAMES limit (${MAX_REPLAY_FRAMES}) — split or down-sample the history`,\n );\n }\n\n // A snapshot is always a { facts, ... } object — reject a garbage array\n // before it is silently wrapped into empty-fact frames.\n for (let i = 0; i < snapshots.length; i++) {\n const s = snapshots[i];\n if (!s || typeof s !== \"object\" || !(\"facts\" in s)) {\n throw new Error(\n `[Directive] framesFromSnapshots: snapshot at index ${i} is not a { facts, ... } object`,\n );\n }\n }\n\n return toReplayFrames(snapshots);\n}\n\n/**\n * Replay a recorded fact-frame history through two predicates — the\n * constraint's current `when` and a proposed replacement — and report how\n * their match sets differ.\n *\n * This is a **predicate backtest**: the engine is not re-run. Each recorded\n * frame is statically re-scored against both specs; the previous frame's\n * facts are threaded as `prev` so a replayed effect-`on` predicate using\n * `$changed` still works (for a constraint `when` it is harmless). The\n * report counts matches under each spec and buckets the disagreements into\n * new matches (original false, proposed true) and lost matches (original\n * true, proposed false). Up to `maxSamples` diff frames per bucket carry a\n * per-clause `evaluatePredicateExplained` breakdown for inspection.\n *\n * Both specs are validated up front — a malformed spec throws a clear\n * `[Directive] replayUnder:` error identifying which spec failed, rather\n * than letting a raw `evaluatePredicate` error escape mid-loop.\n *\n * @example\n * ```ts\n * const report = replayUnder({\n * frames: [\n * { id: 0, facts: { phase: \"red\", elapsed: 10 } },\n * { id: 1, facts: { phase: \"red\", elapsed: 35 } },\n * ],\n * original: { phase: \"red\" },\n * proposed: { phase: \"red\", elapsed: { $gte: 30 } },\n * });\n * // report.original.matched === 2\n * // report.proposed.matched === 1\n * // report.delta === -1\n * // report.lostMatchCount === 1\n * ```\n */\nexport function replayUnder<F = Record<string, unknown>>(\n options: ReplayUnderOptions<F>,\n): PredicateBacktestReport {\n const { frames, original, proposed, entityKey } = options;\n const requested = options.maxSamples ?? 20;\n const maxSamples = requested > 0 ? requested : 0;\n\n if (frames.length > MAX_REPLAY_FRAMES) {\n throw new Error(\n `[Directive] replayUnder: history has ${frames.length} frames, exceeds the MAX_REPLAY_FRAMES limit (${MAX_REPLAY_FRAMES}) — split or down-sample the history`,\n );\n }\n\n // Validate both specs before the frame loop — fail loud and clear here\n // rather than at frame 0 with a raw evaluatePredicate stack trace.\n validateReplaySpec(original, \"original\");\n validateReplaySpec(proposed, \"proposed\");\n\n let originalMatched = 0;\n let proposedMatched = 0;\n let newMatchCount = 0;\n let lostMatchCount = 0;\n let unchanged = 0;\n const newMatches: ReplayDiffSample[] = [];\n const lostMatches: ReplayDiffSample[] = [];\n\n // Distinct-entity tracking — only allocated when `entityKey` was supplied.\n const originalEntities = entityKey ? new Set<unknown>() : undefined;\n const proposedEntities = entityKey ? new Set<unknown>() : undefined;\n\n let prevFacts: Record<string, unknown> | undefined;\n\n for (const frame of frames) {\n const facts = frame.facts as Record<string, unknown>;\n const originalBit = evaluatePredicate(original, facts, prevFacts);\n const proposedBit = evaluatePredicate(proposed, facts, prevFacts);\n\n if (originalBit) {\n originalMatched++;\n originalEntities?.add(facts[entityKey as string]);\n }\n if (proposedBit) {\n proposedMatched++;\n proposedEntities?.add(facts[entityKey as string]);\n }\n\n if (originalBit === proposedBit) {\n unchanged++;\n } else if (!originalBit && proposedBit) {\n newMatchCount++;\n if (newMatches.length < maxSamples) {\n newMatches.push(buildSample(frame, original, proposed, prevFacts));\n }\n } else {\n lostMatchCount++;\n if (lostMatches.length < maxSamples) {\n lostMatches.push(buildSample(frame, original, proposed, prevFacts));\n }\n }\n\n prevFacts = facts;\n }\n\n const report: PredicateBacktestReport = {\n framesEvaluated: frames.length,\n original: { matched: originalMatched },\n proposed: { matched: proposedMatched },\n delta: proposedMatched - originalMatched,\n newMatchCount,\n lostMatchCount,\n unchanged,\n newMatches,\n lostMatches,\n };\n\n if (originalEntities && proposedEntities) {\n report.original.matchedEntities = originalEntities.size;\n report.proposed.matchedEntities = proposedEntities.size;\n }\n\n return report;\n}\n\n/**\n * Build a {@link ReplayDiffSample} for a frame the two predicates disagree\n * on — the per-clause explain is computed only here, never for non-diff\n * frames, so the common (mostly-agreeing) case stays cheap.\n */\nfunction buildSample<F>(\n frame: ReplayFrame<F>,\n original: unknown,\n proposed: unknown,\n prevFacts: Record<string, unknown> | undefined,\n): ReplayDiffSample {\n const facts = frame.facts as Record<string, unknown>;\n const sample: ReplayDiffSample = {\n frameId: frame.id,\n facts,\n originalExplain: evaluatePredicateExplained(original, facts, prevFacts),\n proposedExplain: evaluatePredicateExplained(proposed, facts, prevFacts),\n };\n\n if (frame.timestamp !== undefined) {\n sample.timestamp = frame.timestamp;\n }\n\n return sample;\n}\n","/**\n * `directive replay-under --history <frames.json> --proposed <spec.json>`\n *\n * Predicate backtest — rule-change impact. Given a recorded history of\n * fact-state frames and a proposed replacement for a constraint's `when`\n * predicate, re-score the frames against both the original and the proposed\n * predicate and report how their match sets differ — how many recorded\n * frames the proposed rule would have matched differently, answered against\n * real recorded history.\n *\n * History JSON is accepted in four shapes:\n * 1. A bare array of frames: [{ id, timestamp?, facts }, ...]\n * 2. An object wrapping them: { frames: [{ id, ..., facts }, ...] }\n * 3. A bare array of fact objects: [{ phase: \"red\", ... }, ...]\n * — each element is wrapped as a frame keyed by a `#`-prefixed index.\n * 4. A history-manager export: { version, snapshots, currentIndex }\n * — `system.history.export()` written to a file, read directly.\n *\n * The proposed (and original) predicate files each contain a single\n * FactPredicate object as JSON.\n *\n * v1 scope: `--original` is required — the CLI does not yet introspect a\n * live system to recover the constraint's current `when`. Recovering the\n * original spec from `system.inspect().constraints[].whenSpec` is a planned\n * enhancement.\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport {\n type FactPredicate,\n type PredicateBacktestReport,\n type ReplayFrame,\n replayUnder,\n toReplayFrames,\n} from \"@directive-run/core\";\nimport pc from \"picocolors\";\n\ninterface ReplayUnderCliOptions {\n historyPath?: string;\n proposedPath?: string;\n originalPath?: string;\n maxSamples: number;\n entityKey?: string;\n json: boolean;\n}\n\nfunction parseArgs(args: string[]): ReplayUnderCliOptions {\n const opts: ReplayUnderCliOptions = { maxSamples: 20, json: false };\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n switch (arg) {\n case \"--history\": {\n const val = args[++i];\n if (val) {\n opts.historyPath = val;\n }\n break;\n }\n case \"--proposed\":\n case \"-p\": {\n const val = args[++i];\n if (val) {\n opts.proposedPath = val;\n }\n break;\n }\n case \"--original\":\n case \"-o\": {\n const val = args[++i];\n if (val) {\n opts.originalPath = val;\n }\n break;\n }\n case \"--max-samples\": {\n const val = args[++i];\n const n = val ? Number.parseInt(val, 10) : Number.NaN;\n if (Number.isFinite(n) && n >= 0) {\n opts.maxSamples = n;\n }\n break;\n }\n case \"--entity-key\": {\n const val = args[++i];\n if (val) {\n opts.entityKey = val;\n }\n break;\n }\n case \"--json\":\n opts.json = true;\n break;\n }\n }\n\n return opts;\n}\n\nfunction printUsage(): void {\n console.error(`\nUsage: directive replay-under --history <frames.json> --proposed <spec.json>\n\nReplay a recorded fact-frame history through a proposed constraint\npredicate and report how its match set differs from the original.\nThis is a static predicate backtest — the engine is not re-run.\n\nOptions:\n --history <path> Recorded frames JSON (required) — a frame array,\n a { frames } object, a bare fact-object array, or\n a system.history.export() file\n --proposed <path> Proposed predicate JSON (required)\n --original <path> Original predicate JSON (required in v1)\n --max-samples <n> Diff frames sampled per bucket (default 20)\n --entity-key <fact> Fact key identifying an entity — also reports\n distinct-entity counts (e.g. userId, sessionId)\n --json Emit the PredicateBacktestReport as JSON\n --help Show this help\n\nExamples:\n directive replay-under --history sessions.json \\\\\n --original current-rule.json --proposed tightened-rule.json\n directive replay-under --history sessions.json \\\\\n --original a.json --proposed b.json --entity-key userId --json\n`);\n}\n\n/** Parse a JSON file, exiting with a clear message on failure. */\nfunction readJsonFile(path: string, label: string): unknown {\n const resolved = resolve(path);\n if (!existsSync(resolved)) {\n console.error(pc.red(`error: ${label} file not found: ${resolved}`));\n process.exit(1);\n }\n try {\n return JSON.parse(readFileSync(resolved, \"utf8\"));\n } catch (err) {\n console.error(\n pc.red(`error: failed to parse ${label} (${resolved}): `) +\n (err as Error).message,\n );\n process.exit(1);\n }\n}\n\n/**\n * Normalize a parsed history JSON into a `ReplayFrame[]` — a thin wrapper\n * over the core `toReplayFrames` helper that turns its thrown error into a\n * clean CLI message and exit.\n */\nfunction loadFrames(raw: unknown): ReplayFrame[] {\n try {\n return toReplayFrames(raw);\n } catch (err) {\n console.error(pc.red(`error: ${(err as Error).message}`));\n process.exit(1);\n }\n}\n\n/** True when a parsed spec is the always-true empty predicate `{}`. */\nfunction isEmptyPredicate(spec: unknown): boolean {\n return (\n spec !== null &&\n typeof spec === \"object\" &&\n !Array.isArray(spec) &&\n Object.keys(spec as object).length === 0\n );\n}\n\n/** Compact one-line preview of a frame's facts. */\nfunction previewFacts(facts: Record<string, unknown>): string {\n const parts = Object.entries(facts)\n .slice(0, 6)\n .map(([k, v]) => `${k}=${JSON.stringify(v)}`);\n const extra = Object.keys(facts).length - parts.length;\n\n return parts.join(\" \") + (extra > 0 ? pc.dim(` +${extra} more`) : \"\");\n}\n\nfunction printReport(\n report: PredicateBacktestReport,\n entityKey: string | undefined,\n): void {\n const { original, proposed, delta } = report;\n const deltaStr =\n delta > 0\n ? pc.green(`+${delta}`)\n : delta < 0\n ? pc.red(`${delta}`)\n : pc.dim(\"±0\");\n\n console.log(`\\n${pc.bold(\"replay-under\")} — predicate backtest\\n`);\n console.log(` frames evaluated ${report.framesEvaluated}`);\n console.log(` original spec matched ${original.matched} frames`);\n console.log(\n ` proposed spec matched ${proposed.matched} frames (${deltaStr})`,\n );\n\n // Distinct-entity counts — only present when --entity-key was supplied.\n if (\n entityKey &&\n original.matchedEntities !== undefined &&\n proposed.matchedEntities !== undefined\n ) {\n console.log(\n `\\n original spec matched across ${original.matchedEntities} ${entityKey}s`,\n );\n console.log(\n ` proposed spec matched across ${proposed.matchedEntities} ${entityKey}s`,\n );\n }\n\n console.log(\"\");\n console.log(\n ` ${pc.green(`+${report.newMatchCount}`)} new matches ${pc.dim(\"frames that now match the rule\")}`,\n );\n console.log(\n ` ${pc.red(`-${report.lostMatchCount}`)} lost matches ${pc.dim(\"frames that no longer match\")}`,\n );\n\n if (report.newMatches.length > 0) {\n console.log(`\\n ${pc.green(\"sample new matches:\")}`);\n for (const s of report.newMatches.slice(0, 8)) {\n console.log(` frame ${s.frameId} ${pc.dim(previewFacts(s.facts))}`);\n }\n }\n if (report.lostMatches.length > 0) {\n console.log(`\\n ${pc.red(\"sample lost matches:\")}`);\n for (const s of report.lostMatches.slice(0, 8)) {\n console.log(` frame ${s.frameId} ${pc.dim(previewFacts(s.facts))}`);\n }\n }\n\n const sampled = report.newMatches.length + report.lostMatches.length;\n const total = report.newMatchCount + report.lostMatchCount;\n if (sampled < total) {\n console.log(\n pc.dim(`\\n ${sampled} of ${total} diff frames sampled — --json for the full report`),\n );\n }\n console.log(\"\");\n}\n\nexport async function replayUnderCommand(args: string[]): Promise<void> {\n if (args.includes(\"--help\") || args.length === 0) {\n printUsage();\n process.exit(args.length === 0 ? 1 : 0);\n }\n\n const opts = parseArgs(args);\n\n if (!opts.historyPath) {\n console.error(pc.red(\"error: --history <frames.json> is required\"));\n printUsage();\n process.exit(1);\n }\n if (!opts.proposedPath) {\n console.error(pc.red(\"error: --proposed <spec.json> is required\"));\n printUsage();\n process.exit(1);\n }\n if (!opts.originalPath) {\n console.error(\n pc.red(\"error: --original <spec.json> is required\") +\n pc.dim(\"\\n (v1 cannot recover the constraint's current `when` from a live system)\"),\n );\n printUsage();\n process.exit(1);\n }\n\n const frames = loadFrames(readJsonFile(opts.historyPath, \"--history\"));\n const original = readJsonFile(opts.originalPath, \"--original\");\n const proposed = readJsonFile(opts.proposedPath, \"--proposed\");\n\n // An empty predicate `{}` is valid but always-true — warn so a confident\n // \"matched every frame\" report is not mistaken for a meaningful result.\n if (isEmptyPredicate(original)) {\n console.error(\n pc.yellow(\"warning: --original is an empty predicate {} — it matches every frame\"),\n );\n }\n if (isEmptyPredicate(proposed)) {\n console.error(\n pc.yellow(\"warning: --proposed is an empty predicate {} — it matches every frame\"),\n );\n }\n\n let report: PredicateBacktestReport;\n try {\n // `original` / `proposed` are JSON-parsed `unknown` — replayUnder\n // validates their structure at runtime and throws a clear error on a\n // bad spec, so the cast here is the documented boundary.\n report = replayUnder({\n frames,\n original: original as FactPredicate<Record<string, unknown>>,\n proposed: proposed as FactPredicate<Record<string, unknown>>,\n maxSamples: opts.maxSamples,\n entityKey: opts.entityKey,\n });\n } catch (err) {\n // replayUnder throws a clear `[Directive] replayUnder:` error on an\n // invalid spec or an over-limit history — surface the message, never a\n // raw stack trace.\n console.error(pc.red(`error: ${(err as Error).message}`));\n process.exit(1);\n }\n\n if (opts.json) {\n console.log(JSON.stringify(report, null, 2));\n\n return;\n }\n\n printReport(report, opts.entityKey);\n}\n","/**\n * `directive replay <timeline.json> --system <module.ts>`\n *\n * Replay a serialized timeline against a fresh Directive system. Pairs\n * with `@directive-run/timeline`'s `serializeTimeline()` — the typical\n * flow:\n *\n * 1. Production error captures the last N seconds of timeline frames\n * via `recordTimeline(sys, ...)` + `serializeTimeline(t)`. The\n * JSON gets attached to a Sentry / PostHog / bug-tracker entry.\n * 2. A developer downloads the JSON and runs:\n * directive replay bug-1234.json --system path/to/module.ts\n * 3. The CLI loads the module, instantiates a fresh system, and\n * replays every dispatchable frame in order. The `ReplayResult`\n * summarizes how many frames dispatched / skipped / truncated.\n *\n * v0.1 scope (deliberately narrow):\n * - Only reconstructs MUTATE dispatches (matches @directive-run/timeline's\n * v0.1 dispatchable filter).\n * - The user's --system file must default-export a `System` instance,\n * OR export a named `createSystem`-shaped factory we can call.\n * - No assertion DSL today — the CLI prints the replay diagnostic.\n * Consumers writing assertions use `replayTimeline()` from the\n * library directly inside vitest, paired with R1.B matchers.\n *\n * v0.2 scope (deferred, see docs/IDEAS.md):\n * - `--as-test` flag emits a vitest source file that drives the same\n * replay loop with structured assertions.\n * - `--bisect <good.json>` for git-bisect over timeline frames.\n * - `--diff <other.json>` for causal-graph diff output.\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport pc from \"picocolors\";\nimport { loadSystem } from \"../lib/loader.js\";\nimport { loadTimelinePackage } from \"../lib/timeline-loader.js\";\n\ninterface ReplayCliOptions {\n systemPath?: string;\n maxFrames?: number;\n json: boolean;\n dispatchableOnly: boolean;\n verbose: boolean;\n}\n\nfunction parseArgs(args: string[]): {\n jsonPath: string;\n opts: ReplayCliOptions;\n} {\n const opts: ReplayCliOptions = {\n json: false,\n dispatchableOnly: true,\n verbose: false,\n };\n let jsonPath = \"\";\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n switch (arg) {\n case \"--system\":\n case \"-s\": {\n const val = args[++i];\n if (val) opts.systemPath = val;\n break;\n }\n case \"--max-frames\": {\n const val = args[++i];\n const n = val ? Number.parseInt(val, 10) : Number.NaN;\n if (Number.isFinite(n) && n > 0) opts.maxFrames = n;\n break;\n }\n case \"--all-frames\":\n case \"--no-dispatchable-only\":\n opts.dispatchableOnly = false;\n break;\n case \"--json\":\n opts.json = true;\n break;\n case \"--verbose\":\n case \"-v\":\n opts.verbose = true;\n break;\n default:\n if (arg && !arg.startsWith(\"-\") && !jsonPath) {\n jsonPath = arg;\n }\n }\n }\n\n return { jsonPath, opts };\n}\n\nfunction printUsage(): void {\n console.error(`\nUsage: directive replay <timeline.json> [options]\n\nReplay a serialized Directive timeline against a fresh system.\n\nArguments:\n <timeline.json> Path to a timeline produced by serializeTimeline()\n\nOptions:\n --system, -s <path> Path to a TypeScript file exporting a Directive\n system (default export or 'system' named export)\n --max-frames <n> Cap on frames replayed (default 100,000)\n --all-frames Walk every frame, not just dispatchable ones\n (diagnostic mode — most frames will skip silently)\n --json Emit ReplayResult as JSON\n --verbose, -v Print per-frame trace\n --help, -h Show this help\n\nExamples:\n directive replay bug-1234.json --system src/app/system.ts\n directive replay error.json --system src/system.ts --json\n directive replay error.json --system src/system.ts --verbose\n`);\n}\n\nexport async function replayCommand(args: string[]): Promise<void> {\n if (args.includes(\"--help\") || args.includes(\"-h\") || args.length === 0) {\n printUsage();\n process.exit(args.length === 0 ? 1 : 0);\n }\n\n const { jsonPath, opts } = parseArgs(args);\n\n if (!jsonPath) {\n console.error(pc.red(\"error: missing <timeline.json> argument\"));\n printUsage();\n process.exit(1);\n }\n if (!opts.systemPath) {\n console.error(\n pc.red(\"error: --system <path> is required\"),\n pc.dim(\"\\n (replay needs a fresh system to dispatch against)\"),\n );\n printUsage();\n process.exit(1);\n }\n\n const resolvedJson = resolve(jsonPath);\n if (!existsSync(resolvedJson)) {\n console.error(pc.red(`error: timeline file not found: ${resolvedJson}`));\n process.exit(1);\n }\n\n // Load the timeline JSON.\n let raw: string;\n try {\n raw = readFileSync(resolvedJson, \"utf8\");\n } catch (err) {\n console.error(\n pc.red(\n `error: failed to read ${resolvedJson}: ${(err as Error).message}`,\n ),\n );\n process.exit(1);\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (err) {\n console.error(\n pc.red(\n `error: ${resolvedJson} is not valid JSON: ${(err as Error).message}`,\n ),\n );\n process.exit(1);\n }\n\n // Lazy-import the timeline package — optional peer.\n const { deserializeTimeline, replayTimeline } = await loadTimelinePackage(\n opts.verbose,\n );\n\n // Validate + deserialize.\n let timeline: ReturnType<typeof deserializeTimeline>;\n try {\n timeline = deserializeTimeline(parsed);\n } catch (err) {\n console.error(\n pc.red(\n `error: timeline JSON failed validation: ${(err as Error).message}`,\n ),\n );\n process.exit(1);\n }\n\n // Load the user's system.\n let system: unknown;\n try {\n system = await loadSystem(opts.systemPath);\n } catch (err) {\n console.error(\n pc.red(`error: failed to load system file: ${(err as Error).message}`),\n );\n process.exit(1);\n }\n\n // Type-guard: replayTimeline needs a `dispatch` function.\n const sys = system as { dispatch?: unknown; start?: () => void };\n if (typeof sys.dispatch !== \"function\") {\n console.error(\n pc.red(\n `error: loaded system has no dispatch() method. The --system file must export a started Directive system or a factory.`,\n ),\n );\n process.exit(1);\n }\n\n // Start the system if it isn't already running. Many user files\n // export pre-started systems; double-start is safe (createSystem\n // handles it idempotently).\n if (typeof sys.start === \"function\") {\n try {\n sys.start();\n } catch {\n /* already running — fine */\n }\n }\n\n // Replay. The earlier `typeof sys.dispatch !== 'function'` guard\n // (line ~210) verifies the duck-type at runtime; the cast here just\n // bridges the unknown-typed loadSystem return to replayTimeline's\n // typed ReplayableSystem.\n const result = await replayTimeline(\n timeline,\n sys as {\n dispatch: (event: { type: string; [key: string]: unknown }) => void;\n },\n {\n dispatchableOnly: opts.dispatchableOnly,\n maxFrames: opts.maxFrames,\n },\n );\n\n if (opts.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n const { dispatched, skipped, truncated } = result;\n const ok = dispatched > 0;\n console.log(\n `${ok ? pc.green(\"✓\") : pc.yellow(\"⚠\")} replay complete:`,\n pc.bold(`${dispatched} dispatched`),\n pc.dim(`/ ${skipped} skipped`),\n truncated > 0 ? pc.yellow(`/ ${truncated} TRUNCATED`) : \"\",\n );\n if (dispatched === 0) {\n console.error(\n pc.yellow(\n \"warning: 0 frames dispatched. Either the timeline contains only non-dispatchable frames (system lifecycle, derivations, etc.) or the system shape doesn't match what the timeline recorded.\",\n ),\n );\n }\n if (truncated > 0) {\n console.error(\n pc.yellow(\n `warning: ${truncated} frames truncated by --max-frames cap. Raise it with --max-frames <n> if you need them.`,\n ),\n );\n }\n }\n\n // Exit cleanly. The caller's tests / assertions can chain off this\n // exit status: 0 = replay completed (independent of dispatched count\n // — that's a metric, not a pass/fail).\n process.exit(0);\n}\n","/**\n * `directive timeline diff <a.json> <b.json>`\n *\n * Semantic causal-graph diff between two serialized timelines. Pairs\n * with `@directive-run/timeline`'s `diffTimelines()` (R2.C). Typical\n * flow:\n *\n * 1. Engineer captures two timelines: a known-good run + a\n * regression-bearing run.\n * 2. Run:\n * directive timeline diff good.json bad.json\n * 3. CLI prints a structured report — frame counts, constraint-fire\n * deltas, mutation deltas, resolver-run deltas, new errors.\n *\n * Output modes:\n * - default: human-readable Markdown-style table.\n * - --json: raw `TimelineDiff` for piping into jq / CI.\n *\n * Exit codes:\n * 0 → identical timelines\n * 1 → CLI argument error\n * 2 → diff found differences (CI gate friendly)\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\n// R5 arch C2: import types directly from the timeline package. These\n// imports are fully erased at compile time (no runtime require), so the\n// optional-peer / lazy `await import()` pattern below is preserved\n// exactly. Sourcing the types from the package eliminates the silent\n// drift risk that would arise from re-declaring them here.\nimport type {\n CountDelta,\n ErrorDelta,\n ResolverRunDelta,\n} from \"@directive-run/timeline\";\nimport pc from \"picocolors\";\nimport { loadTimelinePackage } from \"../lib/timeline-loader.js\";\n\ninterface TimelineDiffCliOptions {\n json: boolean;\n verbose: boolean;\n}\n\nfunction parseArgs(args: string[]): {\n aPath: string;\n bPath: string;\n opts: TimelineDiffCliOptions;\n} {\n const opts: TimelineDiffCliOptions = { json: false, verbose: false };\n const positionals: string[] = [];\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n switch (arg) {\n case \"--json\":\n opts.json = true;\n break;\n case \"--verbose\":\n case \"-v\":\n opts.verbose = true;\n break;\n default:\n if (arg && !arg.startsWith(\"-\")) positionals.push(arg);\n }\n }\n return {\n aPath: positionals[0] ?? \"\",\n bPath: positionals[1] ?? \"\",\n opts,\n };\n}\n\nfunction printUsage(): void {\n console.error(`\nUsage: directive timeline diff <a.json> <b.json>\n\nCompare two serialized Directive timelines as a structured causal-graph\ndiff. Reports frame counts, constraint-fire deltas, mutation deltas,\nresolver runs, and new errors.\n\nArguments:\n <a.json> First timeline (typically the \"good\" / baseline run)\n <b.json> Second timeline (typically the \"bad\" / regression run)\n\nOptions:\n --json Emit TimelineDiff as JSON\n -v, --verbose Include unchanged categories in the human output\n --help, -h Show this help\n\nExit codes:\n 0 identical timelines\n 1 CLI argument error\n 2 diff found differences\n\nExamples:\n directive timeline diff baseline.json regression.json\n directive timeline diff a.json b.json --json | jq .constraintFires\n`);\n}\n\nfunction fmtSign(n: number): string {\n if (n > 0) return pc.green(`+${n}`);\n if (n < 0) return pc.red(`${n}`);\n return pc.dim(\" 0\");\n}\n\nfunction fmtCountDelta(rows: CountDelta[]): string[] {\n if (rows.length === 0) return [pc.dim(\" (no differences)\")];\n return rows.map(\n (r) =>\n ` ${pc.bold(r.id.padEnd(28))} ${String(r.aCount).padStart(4)} → ${String(r.bCount).padStart(4)} (${fmtSign(r.delta)})`,\n );\n}\n\nfunction fmtResolverRows(rows: ResolverRunDelta[]): string[] {\n if (rows.length === 0) return [pc.dim(\" (no differences)\")];\n return rows.map(\n (r) =>\n ` ${pc.bold(r.resolver.padEnd(28))} ` +\n `starts ${r.aStarts}→${r.bStarts} (${fmtSign(r.bStarts - r.aStarts)}) ` +\n `completes ${r.aCompletes}→${r.bCompletes} (${fmtSign(r.bCompletes - r.aCompletes)}) ` +\n `errors ${r.aErrors}→${r.bErrors} (${fmtSign(r.bErrors - r.aErrors)})`,\n );\n}\n\nfunction fmtErrors(rows: ErrorDelta[]): string[] {\n if (rows.length === 0) return [pc.dim(\" (no new errors)\")];\n return rows.map((e) => {\n const sideTag = e.side === \"a\" ? pc.cyan(\"a-only\") : pc.yellow(\"b-only\");\n const errStr = (() => {\n try {\n return JSON.stringify(e.error);\n } catch {\n return `[${typeof e.error}]`;\n }\n })();\n return ` ${sideTag} frame #${e.frameIndex} ${pc.bold(e.kind)} '${e.id}' ${pc.dim(errStr)}`;\n });\n}\n\nfunction readTimeline(path: string): unknown {\n const resolved = resolve(path);\n if (!existsSync(resolved)) {\n console.error(pc.red(`error: timeline file not found: ${resolved}`));\n process.exit(1);\n }\n let raw: string;\n try {\n raw = readFileSync(resolved, \"utf8\");\n } catch (err) {\n console.error(\n pc.red(`error: failed to read ${resolved}: ${(err as Error).message}`),\n );\n process.exit(1);\n }\n try {\n return JSON.parse(raw);\n } catch (err) {\n console.error(\n pc.red(`error: ${resolved} is not valid JSON: ${(err as Error).message}`),\n );\n process.exit(1);\n }\n}\n\nexport async function timelineDiffCommand(args: string[]): Promise<void> {\n if (args.includes(\"--help\") || args.includes(\"-h\") || args.length === 0) {\n printUsage();\n process.exit(args.length === 0 ? 1 : 0);\n }\n\n const { aPath, bPath, opts } = parseArgs(args);\n if (!aPath || !bPath) {\n console.error(pc.red(\"error: both <a.json> and <b.json> are required\"));\n printUsage();\n process.exit(1);\n }\n\n // Lazy-import the timeline package — optional peer.\n const { deserializeTimeline, diffTimelines } = await loadTimelinePackage(\n opts.verbose,\n );\n\n // Parse + validate.\n const aRaw = readTimeline(aPath);\n const bRaw = readTimeline(bPath);\n let aTl: ReturnType<typeof deserializeTimeline>;\n let bTl: ReturnType<typeof deserializeTimeline>;\n try {\n aTl = deserializeTimeline(aRaw);\n bTl = deserializeTimeline(bRaw);\n } catch (err) {\n console.error(\n pc.red(\n `error: timeline JSON failed validation: ${(err as Error).message}`,\n ),\n );\n process.exit(1);\n }\n\n const diff = diffTimelines(aTl, bTl);\n\n if (opts.json) {\n console.log(JSON.stringify(diff, null, 2));\n process.exit(diff.identical ? 0 : 2);\n }\n\n // Human output.\n if (diff.identical) {\n console.log(\n pc.green(\"✓ identical:\"),\n `both timelines have ${diff.aFrameCount} frames and the same causal shape.`,\n );\n process.exit(0);\n }\n\n console.log(pc.bold(\"Timeline diff\"), pc.dim(`(${aPath} vs ${bPath})`));\n console.log(\"\");\n console.log(\n `Frames: ${diff.aFrameCount} → ${diff.bFrameCount} (${fmtSign(diff.frameCountDelta)})`,\n );\n console.log(\"\");\n\n console.log(pc.bold(\"Constraint fires:\"));\n for (const line of fmtCountDelta(diff.constraintFires)) console.log(line);\n console.log(\"\");\n\n console.log(pc.bold(\"Mutations:\"));\n for (const line of fmtCountDelta(diff.mutations)) console.log(line);\n console.log(\"\");\n\n console.log(pc.bold(\"Resolver runs:\"));\n for (const line of fmtResolverRows(diff.resolverRuns)) console.log(line);\n console.log(\"\");\n\n console.log(pc.bold(\"New errors:\"));\n for (const line of fmtErrors(diff.newErrors)) console.log(line);\n console.log(\"\");\n\n process.exit(2);\n}\n","import {\n aiRulesCheckCommand,\n aiRulesCommand,\n aiRulesUpdateCommand,\n} from \"./commands/ai-rules.js\";\nimport { bisectCommand } from \"./commands/bisect.js\";\nimport { doctorCommand } from \"./commands/doctor.js\";\nimport {\n examplesCopyCommand,\n examplesListCommand,\n} from \"./commands/examples.js\";\nimport { explainCommand } from \"./commands/explain.js\";\nimport { graphCommand } from \"./commands/graph.js\";\nimport { initCommand } from \"./commands/init.js\";\nimport { inspectCommand } from \"./commands/inspect.js\";\nimport { newModuleCommand, newOrchestratorCommand } from \"./commands/new.js\";\nimport { replayUnderCommand } from \"./commands/replay-under.js\";\nimport { replayCommand } from \"./commands/replay.js\";\nimport { timelineDiffCommand } from \"./commands/timeline-diff.js\";\nimport { CLI_NAME } from \"./lib/constants.js\";\n\nconst HELP = `\n${CLI_NAME} — CLI tools for Directive\n\nUsage: ${CLI_NAME} <command> [options]\n\nCommands:\n init Project scaffolding wizard\n new module <name> Generate a module file\n new orchestrator <name> Generate an AI orchestrator\n inspect <file> Runtime system introspection\n explain <file> [req-id] Explain why a requirement exists\n graph <file> Visual dependency graph\n doctor Health check for project setup\n ai-rules init Install AI coding rules\n ai-rules update Refresh rules to latest version\n ai-rules check Validate rules are current (CI)\n examples list Browse available examples\n examples copy <name> Extract example to project\n replay <timeline.json> Replay a serialized Directive timeline\n (paired with @directive-run/timeline)\n replay-under --history ... Predicate backtest — diff a proposed\n predicate against recorded history\n bisect <timeline.json> Binary-search a timeline for the first\n frame that triggers a failing assertion\n timeline diff <a> <b> Semantic causal-graph diff between two\n serialized timelines\n\nOptions:\n --help, -h Show this help message\n --version, -v Show version\n\ninit options:\n --template <name> Template: counter, auth-flow, ai-orchestrator\n --dir <path> Target directory (default: cwd)\n --no-interactive Skip prompts, use defaults\n\nnew module options:\n --with <sections> Sections: derive,events,constraints,resolvers,effects\n --minimal Schema + init only\n --dir <path> Target directory (default: cwd)\n\ninspect options:\n --json Output as JSON\n --module <name> Inspect specific module\n\ngraph options:\n --ascii Terminal-only output\n --no-open Don't open in browser\n --output <path> Output file path\n\nai-rules init options:\n --force Overwrite existing files without asking\n --merge Use section markers to update only the Directive section\n --tool <name> Skip detection, install for specific tool(s)\n --dir <path> Target directory (default: cwd)\n\nexamples options:\n --filter <category> Filter by category or name\n --dest <dir> Destination directory for copy\n`.trim();\n\nasync function main() {\n const args = process.argv.slice(2);\n\n // Only treat `--help` / `-h` as a request for *global* help when there is\n // no command, or the first arg is itself the help flag. When a command is\n // present (`directive replay-under --help`), routing wins and the command\n // prints its own help — otherwise a command's `-h` alias and its own\n // `--help` handling would be unreachable.\n const first = args[0];\n const wantsGlobalHelp =\n args.length === 0 || first === \"--help\" || first === \"-h\";\n if (wantsGlobalHelp) {\n console.log(HELP);\n process.exit(0);\n }\n\n if (first === \"--version\" || first === \"-v\") {\n const { readFileSync } = await import(\"node:fs\");\n const { fileURLToPath } = await import(\"node:url\");\n const { dirname, join } = await import(\"node:path\");\n\n const __dirname = dirname(fileURLToPath(import.meta.url));\n const pkg = JSON.parse(\n readFileSync(join(__dirname, \"..\", \"package.json\"), \"utf-8\"),\n );\n\n console.log(pkg.version);\n process.exit(0);\n }\n\n const command = args[0];\n\n switch (command) {\n case \"init\": {\n await initCommand(args.slice(1));\n break;\n }\n\n case \"new\": {\n const subcommand = args[1];\n const name = args[2];\n\n if (subcommand === \"module\") {\n if (!name) {\n console.error(\"Usage: directive new module <name>\");\n process.exit(1);\n }\n await newModuleCommand(name, args.slice(3));\n } else if (subcommand === \"orchestrator\") {\n if (!name) {\n console.error(\"Usage: directive new orchestrator <name>\");\n process.exit(1);\n }\n await newOrchestratorCommand(name, args.slice(3));\n } else {\n console.error(\n `Unknown subcommand: ${subcommand ?? \"(none)\"}\\n` +\n `Usage: ${CLI_NAME} new module <name>\\n` +\n ` ${CLI_NAME} new orchestrator <name>`,\n );\n process.exit(1);\n }\n break;\n }\n\n case \"inspect\": {\n await inspectCommand(args.slice(1));\n break;\n }\n\n case \"explain\": {\n await explainCommand(args.slice(1));\n break;\n }\n\n case \"graph\": {\n await graphCommand(args.slice(1));\n break;\n }\n\n case \"doctor\": {\n await doctorCommand(args.slice(1));\n break;\n }\n\n case \"ai-rules\": {\n const subcommand = args[1];\n\n if (subcommand === \"init\") {\n await aiRulesCommand(args.slice(2));\n } else if (subcommand === \"update\") {\n await aiRulesUpdateCommand(args.slice(2));\n } else if (subcommand === \"check\") {\n await aiRulesCheckCommand(args.slice(2));\n } else {\n console.error(\n `Unknown subcommand: ${subcommand ?? \"(none)\"}\\n` +\n `Usage: ${CLI_NAME} ai-rules init\\n` +\n ` ${CLI_NAME} ai-rules update\\n` +\n ` ${CLI_NAME} ai-rules check`,\n );\n process.exit(1);\n }\n break;\n }\n\n case \"examples\": {\n const subcommand = args[1];\n\n if (subcommand === \"list\") {\n await examplesListCommand(args.slice(2));\n } else if (subcommand === \"copy\") {\n const name = args[2];\n if (!name) {\n console.error(\"Usage: directive examples copy <name>\");\n process.exit(1);\n }\n await examplesCopyCommand(name, args.slice(3));\n } else {\n console.error(\n `Unknown subcommand: ${subcommand ?? \"(none)\"}\\n` +\n `Usage: ${CLI_NAME} examples list [--filter <category>]\\n` +\n ` ${CLI_NAME} examples copy <name> [--dest <dir>]`,\n );\n process.exit(1);\n }\n break;\n }\n\n case \"replay\": {\n await replayCommand(args.slice(1));\n break;\n }\n\n case \"replay-under\": {\n await replayUnderCommand(args.slice(1));\n break;\n }\n\n case \"bisect\": {\n await bisectCommand(args.slice(1));\n break;\n }\n\n case \"timeline\": {\n const subcommand = args[1];\n if (subcommand === \"diff\") {\n await timelineDiffCommand(args.slice(2));\n } else {\n console.error(\n `Unknown subcommand: ${subcommand ?? \"(none)\"}\\n` +\n `Usage: ${CLI_NAME} timeline diff <a.json> <b.json>`,\n );\n process.exit(1);\n }\n break;\n }\n\n default:\n console.error(\n `Unknown command: ${command}\\nRun '${CLI_NAME} --help' for usage.`,\n );\n process.exit(1);\n }\n}\n\nmain().catch((err) => {\n console.error(err.message || err);\n process.exit(1);\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/lib/constants.ts","../src/lib/detect.ts","../src/lib/merge.ts","../src/lib/monorepo.ts","../src/templates/claude.ts","../src/templates/cursor.ts","../src/templates/copilot.ts","../src/templates/cline.ts","../src/templates/windsurf.ts","../src/templates/index.ts","../src/commands/ai-rules.ts","../src/lib/loader.ts","../src/lib/timeline-loader.ts","../src/commands/bisect.ts","../src/commands/doctor.ts","../src/commands/examples.ts","../src/commands/explain.ts","../src/commands/graph.ts","../src/commands/init.ts","../src/commands/inspect.ts","../src/commands/new.ts","../../core/src/dev-true.ts","../../core/src/core/tracking.ts","../../core/src/core/types/predicate.ts","../../core/src/core/predicate.ts","../../core/src/core/replay-under.ts","../../core/src/core/sweep-under.ts","../src/commands/replay-under.ts","../src/commands/replay.ts","../src/commands/timeline-diff.ts","../src/commands/tune.ts","../src/cli.ts"],"names":["CLI_NAME","SECTION_START","SECTION_END","TOOL_SIGNALS","detectTools","rootDir","detected","tool","signal","existsSync","join","getToolConfig","id","t","getAllToolIds","mergeSection","existingContent","newSection","startIdx","endIdx","wrapped","separator","hasDirectiveSection","content","MONOREPO_SIGNALS","detectMonorepo","startDir","dir","resolve","dirname","pkgPath","readFileSync","generateClaudeRules","corePatterns","getKnowledge","antiPatterns","naming","schemaTypes","generateCursorRules","generateCopilotRules","generateClineRules","generateWindsurfRules","generators","getTemplate","toolId","generator","parseArgs","args","opts","i","val","aiRulesCommand","pc","mono","targetDir","placement","relative","selectedTools","config","choices","s","filePath","fileExists","writeFile","action","mkdirSync","writeFileSync","aiRulesUpdateCommand","ruleFiles","updated","file","existing","newContent","merged","aiRulesCheckCommand","checked","stale","freshContent","loadSystem","resolved","mod","isSystem","key","err","obj","sys","loadSystemFactory","candidates","name","candidate","result","loadTimelinePackage","verbose","jsonPath","arg","n","printUsage","compileAssertion","expr","fn","system","facts","bisectCommand","resolvedJson","raw","parsed","deserializeTimeline","bisectTimeline","timeline","assertion","factory","lean","idx","frame","eventType","checkCoreInstalled","pkg","deps","checkVersionCompatibility","directivePackages","k","checkTypeScript","tsconfigPath","stripped","co","issues","checkDuplicateInstances","nodeModules","duplicates","scopeDir","packages","readdirSync","nestedCore","checkAIRulesFreshness","found","doctorCommand","checks","failures","check","icon","CATEGORIES","getCategory","cat","names","getDescription","lines","line","trimmed","jsdocMatch","examplesListCommand","filter","examples","getAllExamples","byCategory","categoryOrder","sortedCategories","a","b","items","item","desc","examplesCopyCommand","dest","getExample","rewritten","rel","requirementId","explainCommand","inspection","explanation","u","resolverEntries","status","state","formatState","dur","payload","resolverStatus","r","renderAsciiGraph","constraintMap","c","entry","resolversByType","info","reqType","resolvers","usedResolvers","renderHtmlGraph","nodes","edges","factKeys","reqTypes","reqIdx","nodeMap","svgWidth","maxY","edgeSvg","e","from","to","nodeSvg","escapeHtml","headerSvg","h","text","graphCommand","factsObj","html","outputPath","execFile","openCmd","detectPackageManager","installCmd","pm","getTemplates","moduleName","generateCounterModule","generateCounterMain","generateAuthModule","generateAuthMain","generateAIModule","generateAIMain","toCamelCase","camelName","_","initCommand","R","nameResult","templateId","templates","choice","template","skipped","depsCmd","formatFacts","entries","value","formatted","formatValue","formatConstraints","constraints","hits","formatResolverDefs","resolverDefs","def","stateStr","formatResolverState","formatUnmet","unmet","formatInflight","inflight","now","inf","elapsed","error","duration","findWarnings","warnings","inspectCommand","w","ALL_SECTIONS","generateModule","sections","hasConstraints","hasResolvers","code","generateOrchestrator","findModulesDir","newModuleCommand","newOrchestratorCommand","dev_true_default","PREDICATE_OPERATORS","PREDICATE_COMBINATORS","MAX_PREDICATE_DEPTH","isPlainObject","v","isPlainObjectStrict","proto","isOperatorObject","count","hasDollarKey","devWarn","isPredicate","walkPredicate","spec","visitor","path","seen","depth","clause","clausePath","kind","children","child","childPath","opObj","op","validatePredicate","checkValueJsonSafe","at","el","checkOperand","_factPath","operand","operandPath","factPath","deepEqualSeen","pairId","deepEqual","guard","bArr","bEntries","used","ka","va","kb","vb","ak","bk","toComparable","relational","actual","applyOperator","prevValue","lo","hi","message","evalField","prev","keys","evaluatePredicate","fact","p","evaluatePredicateExplained","pathPrefix","out","childSpecs","passCount","pass","MAX_REPLAY_FRAMES","validateReplaySpec","which","preview","unknownOp","toReplayFrames","framesFromHistory","list","index","historyExport","framesFromSnapshots","exportObj","snapshots","replayUnder","options","frames","original","proposed","entityKey","requested","maxSamples","originalMatched","proposedMatched","newMatchCount","lostMatchCount","unchanged","newMatches","lostMatches","originalEntities","proposedEntities","prevFacts","originalBit","proposedBit","buildSample","report","sample","MAX_SWEEP_POINTS","MAX_SWEEP_EVALUATIONS","isHole","substitute","values","cartesian","sweep","head","rest","headValues","tail","gridSize","size","arr","sweepUnder","objective","total","evaluations","warnedObjective","safeObjective","baselineReport","baseline","points","bestIndex","bestScore","score","best","readJsonFile","label","loadFrames","z","isEmptyPredicate","previewFacts","parts","extra","printReport","delta","deltaStr","sampled","replayUnderCommand","C","replayCommand","replayTimeline","dispatched","truncated","ok","positionals","fmtSign","fmtCountDelta","rows","fmtResolverRows","fmtErrors","sideTag","errStr","readTimeline","timelineDiffCommand","aPath","bPath","diffTimelines","aRaw","bRaw","aTl","bTl","diff","parseSweepArg","colon","rangeStr","rangeMatch","startStr","endStr","stepStr","start","end","step","tokens","BLOCKS","printCurve","baselineMatched","scores","minScore","scoreRange","sparkline","valueKeys","header","valsStr","matched","entityStr","barLen","row","isBest","tuneCommand","je","HELP","main","first","fileURLToPath","__dirname","command","subcommand"],"mappings":"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","file":"cli.js","sourcesContent":["export const CLI_NAME = \"directive\";\nexport const CLI_ALIAS = \"dr\";\nexport const PACKAGE_NAME = \"@directive-run/cli\";\nexport const SECTION_START = \"<!-- directive:start -->\";\nexport const SECTION_END = \"<!-- directive:end -->\";\n","import { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nexport interface DetectedTool {\n name: string;\n id: \"cursor\" | \"claude\" | \"copilot\" | \"windsurf\" | \"cline\";\n outputPath: string;\n}\n\nconst TOOL_SIGNALS: Array<{\n id: DetectedTool[\"id\"];\n name: string;\n signals: string[];\n outputPath: string;\n}> = [\n {\n id: \"cursor\",\n name: \"Cursor\",\n signals: [\".cursor\", \".cursorrules\"],\n outputPath: \".cursorrules\",\n },\n {\n id: \"claude\",\n name: \"Claude Code\",\n signals: [\".claude\"],\n outputPath: \".claude/CLAUDE.md\",\n },\n {\n id: \"copilot\",\n name: \"GitHub Copilot\",\n signals: [\".github\"],\n outputPath: \".github/copilot-instructions.md\",\n },\n {\n id: \"windsurf\",\n name: \"Windsurf\",\n signals: [\".windsurfrules\"],\n outputPath: \".windsurfrules\",\n },\n {\n id: \"cline\",\n name: \"Cline\",\n signals: [\".clinerules\"],\n outputPath: \".clinerules\",\n },\n];\n\nexport function detectTools(rootDir: string): DetectedTool[] {\n const detected: DetectedTool[] = [];\n\n for (const tool of TOOL_SIGNALS) {\n const hasSignal = tool.signals.some((signal) =>\n existsSync(join(rootDir, signal)),\n );\n\n if (hasSignal) {\n detected.push({\n name: tool.name,\n id: tool.id,\n outputPath: join(rootDir, tool.outputPath),\n });\n }\n }\n\n return detected;\n}\n\nexport function getToolConfig(id: DetectedTool[\"id\"]) {\n const tool = TOOL_SIGNALS.find((t) => t.id === id);\n if (!tool) {\n throw new Error(`Unknown tool: ${id}`);\n }\n\n return tool;\n}\n\nexport function getAllToolIds(): DetectedTool[\"id\"][] {\n return TOOL_SIGNALS.map((t) => t.id);\n}\n","import { SECTION_END, SECTION_START } from \"./constants.js\";\n\n/**\n * Replace the Directive section within existing content, or append it.\n * Section markers: <!-- directive:start --> ... <!-- directive:end -->\n */\nexport function mergeSection(\n existingContent: string,\n newSection: string,\n): string {\n const startIdx = existingContent.indexOf(SECTION_START);\n const endIdx = existingContent.indexOf(SECTION_END);\n\n const wrapped = `${SECTION_START}\\n${newSection}\\n${SECTION_END}`;\n\n if (startIdx !== -1 && endIdx !== -1 && endIdx > startIdx) {\n return (\n existingContent.slice(0, startIdx) +\n wrapped +\n existingContent.slice(endIdx + SECTION_END.length)\n );\n }\n\n const separator = existingContent.endsWith(\"\\n\") ? \"\\n\" : \"\\n\\n\";\n\n return existingContent + separator + wrapped + \"\\n\";\n}\n\n/**\n * Check if content already has a Directive section.\n */\nexport function hasDirectiveSection(content: string): boolean {\n return content.includes(SECTION_START) && content.includes(SECTION_END);\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\n\nexport interface MonorepoInfo {\n isMonorepo: boolean;\n rootDir: string;\n tool?: \"pnpm\" | \"turbo\" | \"npm\" | \"yarn\";\n}\n\nconst MONOREPO_SIGNALS = [\n { file: \"pnpm-workspace.yaml\", tool: \"pnpm\" as const },\n { file: \"turbo.json\", tool: \"turbo\" as const },\n];\n\nexport function detectMonorepo(startDir: string): MonorepoInfo {\n let dir = resolve(startDir);\n\n while (dir !== dirname(dir)) {\n for (const signal of MONOREPO_SIGNALS) {\n if (existsSync(join(dir, signal.file))) {\n return { isMonorepo: true, rootDir: dir, tool: signal.tool };\n }\n }\n\n const pkgPath = join(dir, \"package.json\");\n if (existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\"));\n if (pkg.workspaces) {\n const tool = existsSync(join(dir, \"yarn.lock\"))\n ? (\"yarn\" as const)\n : (\"npm\" as const);\n\n return { isMonorepo: true, rootDir: dir, tool };\n }\n } catch {\n // ignore parse errors\n }\n }\n\n dir = dirname(dir);\n }\n\n return { isMonorepo: false, rootDir: startDir };\n}\n","import { getKnowledge } from \"../lib/knowledge.js\";\n\n/**\n * Generate Claude Code rules (~30KB).\n * Strategy: Full anti-patterns + core-patterns + naming + schema-types (most critical),\n * condensed summaries for everything else.\n */\nexport function generateClaudeRules(): string {\n // These 4 files are included in full (~25KB)\n const corePatterns = getKnowledge(\"core-patterns\");\n const antiPatterns = getKnowledge(\"anti-patterns\");\n const naming = getKnowledge(\"naming\");\n const schemaTypes = getKnowledge(\"schema-types\");\n\n return `# Directive — Complete AI Coding Rules\n\n> Constraint-driven runtime for TypeScript. Declare requirements, let the runtime resolve them.\n> https://directive.run | \\`npm install @directive-run/core\\`\n> Full reference with examples: https://directive.run/llms.txt\n\n## Core Patterns\n\n${corePatterns}\n\n---\n\n## Anti-Patterns (All 36)\n\n${antiPatterns}\n\n### AI Package Anti-Patterns (21-36)\n\n| # | WRONG | CORRECT |\n|---|-------|---------|\n| 21 | TS types for factsSchema: \\`{ confidence: number }\\` | Use \\`{ confidence: t.number() }\\` |\n| 22 | \\`facts.cache.push(item)\\` in orchestrator | \\`facts.cache = [...facts.cache, item]\\` |\n| 23 | Returning data from orchestrator \\`resolve\\` | Resolvers return \\`void\\` — mutate \\`context.facts\\` |\n| 24 | Forgetting \\`orchestrator.start()\\` multi-agent | Single: implicit. Multi: must call \\`start()\\` |\n| 25 | Catching \\`Error\\` not \\`GuardrailError\\` | \\`GuardrailError\\` has \\`.guardrailName\\`, \\`.errorCode\\` |\n| 26 | \\`from '@directive-run/ai'\\` for adapters | Subpath: \\`from '@directive-run/ai/openai'\\` |\n| 27 | Assuming \\`{ input_tokens }\\` structure | Normalized: \\`{ inputTokens, outputTokens }\\` |\n| 28 | Same CircuitBreaker across agents | Create separate instances per dependency |\n| 29 | \\`budgetWarningThreshold: 1.5\\` | Must be 0-1 (percentage) |\n| 30 | \\`race\\` minSuccess > agents.length | Must be \\`1 ≤ minSuccess ≤ agents.length\\` |\n| 31 | Async summarizer with autoManage: true | Use \\`autoManage: false\\` for sync control |\n| 32 | Side effects in reflect \\`evaluator\\` | Evaluator must be pure |\n| 33 | Task calling \\`runSingleAgent\\` | Tasks can't call agents — separate node |\n| 34 | Task expecting object input | Input is always \\`string\\` — \\`JSON.parse(input)\\` |\n| 35 | Task ID same as agent ID | IDs share namespace — distinct names |\n| 36 | \\`from '@directive-run/ai/mcp'\\` | \\`from '@directive-run/ai'\\` (main export) |\n\n---\n\n## Naming Conventions\n\n${naming}\n\n---\n\n## Schema Type Builders\n\n${schemaTypes}\n\n---\n\n## Multi-Module Quick Reference\n\n\\`\\`\\`typescript\n// Two modules with cross-module dependency\nconst authSchema = { facts: { token: t.string(), isAuth: t.boolean() } };\nconst authModule = createModule(\"auth\", { schema: authSchema, /* ... */ });\n\nconst cartModule = createModule(\"cart\", {\n schema: { facts: { items: t.array<CartItem>() } },\n crossModuleDeps: { auth: authSchema }, // Declare dependency\n constraints: {\n checkout: {\n when: (facts) => facts.self.items.length > 0 && facts.auth.isAuth, // facts.self.* for own, facts.auth.* for cross\n require: () => ({ type: \"CHECKOUT\" }),\n },\n },\n // ...\n});\n\nconst system = createSystem({ modules: { auth: authModule, cart: cartModule } });\n// Access: system.facts.auth.token, system.events.cart.addItem({...})\n\\`\\`\\`\n\nKey rules:\n- \\`facts.self.*\\` for own module facts in constraints/resolvers\n- \\`facts.otherModule.*\\` for cross-module reads\n- \\`crossModuleDeps\\` must declare consumed schemas\n- \\`system.events.moduleName.eventName(payload)\\` for namespaced events\n- The \\`::\\` separator is internal — always use dot notation\n\n---\n\n## Constraints\n\n- \\`when(facts)\\` → boolean. When true, requirement is emitted.\n- \\`require(facts)\\` → \\`{ type: \"TYPE\", ...data }\\` object (never string literal)\n- \\`priority: number\\` — higher evaluated first\n- \\`after: [\"constraintName\"]\\` — ordering within same priority\n- Async: \\`async: true\\` + \\`deps: ['factName']\\` (deps REQUIRED for async)\n- Constraints DECLARE needs, resolvers FULFILL them — decoupled.\n\n---\n\n## Resolvers\n\n- \\`resolve(req, context)\\` — async, returns \\`void\\`. Mutate \\`context.facts.*\\`.\n- \\`requirement: \"TYPE\"\\` — which type this handles\n- \\`key: (req) => string\\` — deduplication key\n- \\`retry: { attempts: 3, backoff: \"exponential\", initialDelay: 100 }\\`\n- \\`batch: { maxSize: 10, windowMs: 50 }\\` for N+1 prevention\n- Always \\`await system.settle()\\` after start to wait for resolution\n\n---\n\n## System API\n\n- \\`system.facts.fieldName\\` — read/write facts\n- \\`system.derive.derivationName\\` — read derived values\n- \\`system.events.eventName(payload)\\` — dispatch events\n- \\`system.subscribe(listener)\\` — subscribe to all changes\n- \\`system.read(key)\\` — read fact or derivation by string key\n- \\`system.inspect()\\` — full state snapshot\n- \\`system.settle()\\` — wait for async operations\n- \\`system.start()\\` / \\`system.stop()\\` / \\`system.destroy()\\`\n\n---\n\n## React (\\`@directive-run/react\\`)\n\n\\`\\`\\`typescript\nimport { useSelector, useEvent } from \"@directive-run/react\";\n\nconst count = useSelector(system, (s) => s.facts.count);\nconst events = useEvent(system);\n// onClick={() => events.increment()}\n\\`\\`\\`\n\n**NO** \\`useDirective()\\` hook. Use \\`useSelector\\` + \\`useEvent\\`.\n\n---\n\n## Plugins (\\`@directive-run/core/plugins\\`)\n\n\\`devtoolsPlugin()\\`, \\`loggingPlugin()\\`, \\`persistencePlugin(config)\\`,\n\\`createCircuitBreaker(config)\\`, \\`createObservability(config)\\`\n\n---\n\n## AI Package (\\`@directive-run/ai\\`)\n\n### Single-Agent Orchestrator\n\n\\`\\`\\`typescript\nimport { createAgentOrchestrator, t } from '@directive-run/ai';\nimport { createAnthropicRunner } from '@directive-run/ai/anthropic';\n\nconst orchestrator = createAgentOrchestrator({\n runner: createAnthropicRunner({ apiKey }),\n factsSchema: { result: t.string(), confidence: t.number() },\n init: (facts) => { facts.result = \"\"; facts.confidence = 0; },\n maxTokenBudget: 100000,\n budgetWarningThreshold: 0.8,\n guardrails: { input: [...], output: [...] },\n memory: createAgentMemory({ strategy: createSlidingWindowStrategy({ maxMessages: 30 }) }),\n debug: true,\n});\n\nconst result = await orchestrator.run(agent, \"analyze this\");\n\\`\\`\\`\n\n### Multi-Agent\n\n\\`\\`\\`typescript\nimport { createMultiAgentOrchestrator, parallel, sequential, dag } from '@directive-run/ai';\n\nconst orch = createMultiAgentOrchestrator({\n agents: { researcher: agentA, writer: agentB },\n patterns: {\n pipeline: sequential([\"researcher\", \"writer\"]),\n brainstorm: parallel([\"researcher\", \"writer\"], mergeResults),\n workflow: dag([\n { id: \"research\", handler: \"researcher\" },\n { id: \"write\", handler: \"writer\", dependencies: [\"research\"] },\n ]),\n },\n runner,\n});\norch.start(); // Required for multi-agent!\n\\`\\`\\`\n\n8 patterns: \\`parallel\\`, \\`sequential\\`, \\`supervisor\\`, \\`dag\\`, \\`reflect\\`, \\`race\\`, \\`debate\\`, \\`goal\\`\n\n### Adapter Imports (Subpath!)\n\n\\`\\`\\`typescript\nimport { createAnthropicRunner } from '@directive-run/ai/anthropic';\nimport { createOpenAIRunner } from '@directive-run/ai/openai';\nimport { createOllamaRunner } from '@directive-run/ai/ollama';\nimport { createGeminiRunner } from '@directive-run/ai/gemini';\n\\`\\`\\`\n\n### Guardrails\n\n\\`createPIIGuardrail\\`, \\`createModerationGuardrail\\`, \\`createRateLimitGuardrail\\`,\n\\`createToolGuardrail\\`, \\`createOutputSchemaGuardrail\\`, \\`createLengthGuardrail\\`,\n\\`createContentFilterGuardrail\\`\n\n\\`GuardrailResult: { passed: boolean, reason?: string, transformed?: unknown }\\`\n\n### Memory\n\n\\`createAgentMemory({ strategy, summarizer?, autoManage? })\\`\nStrategies: \\`createSlidingWindowStrategy\\`, \\`createTokenBasedStrategy\\`, \\`createHybridStrategy\\`\nSummarizers: \\`createTruncationSummarizer\\`, \\`createKeyPointsSummarizer\\`, \\`createLLMSummarizer(runner)\\`\n\n### Streaming\n\n\\`\\`\\`typescript\nconst streamResult = orchestrator.runStream(agent, \"analyze\");\nfor await (const chunk of streamResult.stream) {\n switch (chunk.type) {\n case \"token\": process.stdout.write(chunk.data); break;\n case \"done\": console.log(\"Tokens:\", chunk.totalTokens); break;\n case \"error\": console.error(chunk.error); break;\n }\n}\n\\`\\`\\`\n\nBackpressure: \\`\"buffer\"\\` (default), \\`\"block\"\\`, \\`\"drop\"\\`\n`;\n}\n","/**\n * Generate Cursor rules (<10KB).\n * Handcrafted condensed content — core patterns, top 10 anti-patterns, naming, 1 mini example.\n */\nexport function generateCursorRules(): string {\n return `# Directive — AI Coding Rules\n\n> Constraint-driven runtime for TypeScript. \\`npm install @directive-run/core\\`\n> Full reference: https://directive.run/llms.txt\n\n## Schema Shape (CRITICAL)\n\n\\`\\`\\`typescript\nimport { createModule, createSystem, t } from \"@directive-run/core\";\n\nconst myModule = createModule(\"name\", {\n schema: {\n facts: { count: t.number(), items: t.array<string>() },\n derivations: { total: \"number\" },\n events: { increment: \"void\", addItem: \"string\" },\n requirements: { FETCH_DATA: { url: \"string\" } },\n },\n init: (facts) => { facts.count = 0; facts.items = []; },\n derive: {\n total: (facts) => facts.items.length + facts.count,\n },\n events: {\n increment: (facts) => { facts.count += 1; },\n addItem: (facts, item) => { facts.items = [...facts.items, item]; },\n },\n constraints: {\n fetchWhenReady: {\n when: (facts) => facts.count > 0 && facts.items.length === 0,\n require: (facts) => ({ type: \"FETCH_DATA\", url: \"/api/items\" }),\n },\n },\n resolvers: {\n fetchData: {\n requirement: \"FETCH_DATA\",\n resolve: async (req, context) => {\n const data = await fetch(req.url).then(r => r.json());\n context.facts.items = data;\n },\n },\n },\n});\n\nconst system = createSystem({ module: myModule });\nawait system.settle();\n\\`\\`\\`\n\n## Top 10 Anti-Patterns\n\n| # | WRONG | CORRECT |\n|---|-------|---------|\n| 1 | \\`facts.profile as ResourceState<Profile>\\` | Remove cast — schema provides types |\n| 2 | \\`{ phase: t.string() }\\` flat schema | \\`schema: { facts: { phase: t.string() } }\\` |\n| 3 | \\`facts.items\\` in multi-module | \\`facts.self.items\\` |\n| 4 | \\`t.map()\\`, \\`t.set()\\`, \\`t.promise()\\` | Don't exist. Use \\`t.object<Map<K,V>>()\\` |\n| 5 | \\`(req, ctx)\\` in resolver | \\`(req, context)\\` — never abbreviate |\n| 6 | \\`createModule(\"n\", { phase: t.string() })\\` | Must wrap: \\`schema: { facts: { ... } }\\` |\n| 7 | \\`system.dispatch('login', {...})\\` | \\`system.events.login({...})\\` |\n| 8 | \\`facts.items.push(item)\\` | \\`facts.items = [...facts.items, item]\\` |\n| 9 | \\`useDirective(system)\\` | \\`useSelector(system, s => s.facts.count)\\` |\n| 10 | \\`facts['auth::status']\\` | \\`facts.auth.status\\` dot notation |\n\n## Naming\n\n- \\`req\\` = requirement (not request). Parameter: \\`(req, context)\\`\n- \\`derive\\` / derivations — never \"computed\" or \"selectors\"\n- Resolvers return \\`void\\` — mutate \\`context.facts\\` instead\n- Always use braces for returns: \\`if (x) { return y; }\\`\n- Multi-module: \\`facts.self.fieldName\\` for own module facts\n- Events: \\`system.events.eventName(payload)\\` — not \\`system.dispatch()\\`\n- Import from main: \\`import { createModule } from '@directive-run/core'\\`\n\n## Schema Types That Exist\n\n\\`t.string<T>()\\`, \\`t.number()\\`, \\`t.boolean()\\`, \\`t.array<T>()\\`, \\`t.object<T>()\\`,\n\\`t.enum(\"a\",\"b\")\\`, \\`t.literal(value)\\`, \\`t.nullable(inner)\\`, \\`t.optional(inner)\\`, \\`t.union(...)\\`\n\nChainable: \\`.default()\\`, \\`.validate()\\`, \\`.transform()\\`, \\`.brand<>()\\`, \\`.refine()\\`\n\n**DO NOT USE** (hallucinations): \\`t.map()\\`, \\`t.set()\\`, \\`t.date()\\`, \\`t.tuple()\\`, \\`t.record()\\`, \\`t.promise()\\`, \\`t.any()\\`\n\n## Key Pattern: Constraint → Requirement → Resolver\n\nWhen the user wants \"do X when Y\": create THREE things:\n1. **Constraint**: \\`when: (facts) => Y_condition\\` → \\`require: { type: \"DO_X\" }\\`\n2. **Resolver**: handles \"DO_X\", calls API, sets \\`context.facts\\`\n3. They are **decoupled**. Constraint declares need, resolver fulfills it.\n`;\n}\n","import { generateCursorRules } from \"./cursor.js\";\n\n/**\n * Generate GitHub Copilot instructions (~12KB).\n * Cursor content + all 20 anti-patterns + schema types detail + AI basics.\n */\nexport function generateCopilotRules(): string {\n const base = generateCursorRules();\n\n // Add anti-patterns 11-19 that cursor doesn't include\n const extraAntiPatterns = `\n## Anti-Patterns 11-19\n\n| # | WRONG | CORRECT |\n|---|-------|---------|\n| 11 | Returning data from \\`resolve\\` | Resolvers return \\`void\\` — mutate \\`context.facts\\` |\n| 12 | Async logic in \\`init\\` | \\`init\\` is synchronous, facts assignment only |\n| 13 | \\`await system.start()\\` without settle | Add \\`await system.settle()\\` after start |\n| 14 | Missing \\`crossModuleDeps\\` | Declare \\`crossModuleDeps: { auth: authSchema }\\` |\n| 15 | \\`require: \"TYPE\"\\` string literal | \\`require: { type: \"TYPE\" }\\` object form |\n| 16 | Passthrough derivation \\`(f) => f.count\\` | Remove — read fact directly |\n| 17 | \\`from '@directive-run/core/module'\\` | \\`from '@directive-run/core'\\` (main export) |\n| 18 | \\`async when()\\` without \\`deps\\` | Add \\`deps: ['factName']\\` for async constraints |\n| 19 | No error boundary on resolver | Use try-catch or module error boundary config |\n`;\n\n // Add multi-module basics\n const multiModule = `\n## Multi-Module\n\n\\`\\`\\`typescript\nconst system = createSystem({\n modules: { auth: authModule, cart: cartModule },\n});\n\n// Access: system.facts.auth.token, system.events.cart.addItem({...})\n// In constraints/resolvers: use facts.self.* for own module\n// Declare deps: crossModuleDeps: { auth: authSchema }\n\\`\\`\\`\n`;\n\n // Add AI basics\n const aiBasics = `\n## AI Package Basics (\\`@directive-run/ai\\`)\n\n\\`\\`\\`typescript\nimport { createAgentOrchestrator, t } from '@directive-run/ai';\nimport { createAnthropicRunner } from '@directive-run/ai/anthropic'; // Subpath import!\n\nconst orchestrator = createAgentOrchestrator({\n runner: createAnthropicRunner({ apiKey: process.env.ANTHROPIC_API_KEY }),\n factsSchema: { result: t.string(), confidence: t.number() }, // Use t.*() !\n init: (facts) => { facts.result = \"\"; facts.confidence = 0; },\n});\n\nconst result = await orchestrator.run(agent, \"analyze this\");\n\\`\\`\\`\n\n**AI Anti-Patterns:**\n- Use \\`t.number()\\` not \\`number\\` for factsSchema\n- Subpath imports: \\`from '@directive-run/ai/anthropic'\\` not \\`from '@directive-run/ai'\\`\n- Token usage normalized: \\`{ inputTokens, outputTokens }\\` (not provider-specific)\n- \\`facts.cache = [...facts.cache, item]\\` not \\`facts.cache.push(item)\\`\n`;\n\n return base + extraAntiPatterns + multiModule + aiBasics;\n}\n","import { generateCopilotRules } from \"./copilot.js\";\n\n/**\n * Generate Cline rules (~12KB).\n * Same content as Copilot.\n */\nexport function generateClineRules(): string {\n return generateCopilotRules();\n}\n","import { generateCopilotRules } from \"./copilot.js\";\n\n/**\n * Generate Windsurf rules (~12KB).\n * Same content as Copilot.\n */\nexport function generateWindsurfRules(): string {\n return generateCopilotRules();\n}\n","import type { DetectedTool } from \"../lib/detect.js\";\nimport { generateClaudeRules } from \"./claude.js\";\nimport { generateClineRules } from \"./cline.js\";\nimport { generateCopilotRules } from \"./copilot.js\";\nimport { generateCursorRules } from \"./cursor.js\";\nimport { generateLlmsTxt } from \"./llms-txt.js\";\nimport { generateWindsurfRules } from \"./windsurf.js\";\n\nconst generators: Record<DetectedTool[\"id\"], () => string> = {\n cursor: generateCursorRules,\n claude: generateClaudeRules,\n copilot: generateCopilotRules,\n windsurf: generateWindsurfRules,\n cline: generateClineRules,\n};\n\nexport function getTemplate(toolId: DetectedTool[\"id\"]): string {\n const generator = generators[toolId];\n if (!generator) {\n throw new Error(`No template for tool: ${toolId}`);\n }\n\n return generator();\n}\n\nexport { generateLlmsTxt };\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join, relative } from \"node:path\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { CLI_NAME } from \"../lib/constants.js\";\nimport {\n type DetectedTool,\n detectTools,\n getAllToolIds,\n getToolConfig,\n} from \"../lib/detect.js\";\nimport { hasDirectiveSection, mergeSection } from \"../lib/merge.js\";\nimport { detectMonorepo } from \"../lib/monorepo.js\";\nimport { getTemplate } from \"../templates/index.js\";\n\ninterface Options {\n force: boolean;\n merge: boolean;\n tools: string[];\n dir: string;\n}\n\nfunction parseArgs(args: string[]): Options {\n const opts: Options = {\n force: false,\n merge: false,\n tools: [],\n dir: process.cwd(),\n };\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n\n switch (arg) {\n case \"--force\":\n opts.force = true;\n break;\n case \"--merge\":\n opts.merge = true;\n break;\n case \"--tool\": {\n const val = args[++i];\n if (val) {\n opts.tools.push(val);\n }\n break;\n }\n case \"--dir\": {\n const val = args[++i];\n if (val) {\n opts.dir = val;\n }\n break;\n }\n }\n }\n\n return opts;\n}\n\nexport async function aiRulesCommand(args: string[]) {\n const opts = parseArgs(args);\n\n p.intro(pc.bgCyan(pc.black(\" directive ai-rules \")));\n\n // Step 1: Detect monorepo\n const mono = detectMonorepo(opts.dir);\n let targetDir = opts.dir;\n\n if (mono.isMonorepo && mono.rootDir !== opts.dir) {\n const placement = await p.select({\n message: \"Monorepo detected. Where should AI rules be installed?\",\n options: [\n {\n value: \"root\",\n label: `Monorepo root (${relative(opts.dir, mono.rootDir) || \".\"})`,\n hint: \"recommended\",\n },\n {\n value: \"workspace\",\n label: `Current workspace (${relative(mono.rootDir, opts.dir)})`,\n },\n ],\n });\n\n if (p.isCancel(placement)) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n\n if (placement === \"root\") {\n targetDir = mono.rootDir;\n }\n }\n\n // Step 2: Detect or select tools\n let selectedTools: DetectedTool[];\n\n if (opts.tools.length > 0) {\n selectedTools = opts.tools.map((id) => {\n const config = getToolConfig(id as DetectedTool[\"id\"]);\n\n return {\n name: config.name,\n id: config.id,\n outputPath: join(targetDir, config.outputPath),\n };\n });\n } else {\n const detected = detectTools(targetDir);\n\n if (detected.length > 0) {\n const choices = await p.multiselect({\n message: `Detected ${detected.length} AI tool(s). Which should get Directive rules?`,\n options: detected.map((t) => ({\n value: t.id,\n label: t.name,\n hint: relative(targetDir, t.outputPath),\n })),\n initialValues: detected.map((t) => t.id),\n required: true,\n });\n\n if (p.isCancel(choices)) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n\n selectedTools = (choices as DetectedTool[\"id\"][]).map((id) => {\n const config = getToolConfig(id);\n\n return {\n name: config.name,\n id: config.id,\n outputPath: join(targetDir, config.outputPath),\n };\n });\n } else {\n const choices = await p.multiselect({\n message: \"No AI tools detected. Which tools do you use?\",\n options: getAllToolIds().map((id) => {\n const config = getToolConfig(id);\n\n return { value: id, label: config.name };\n }),\n required: true,\n });\n\n if (p.isCancel(choices)) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n\n selectedTools = (choices as DetectedTool[\"id\"][]).map((id) => {\n const config = getToolConfig(id);\n\n return {\n name: config.name,\n id: config.id,\n outputPath: join(targetDir, config.outputPath),\n };\n });\n }\n }\n\n if (selectedTools.length === 0) {\n p.cancel(\"No tools selected.\");\n process.exit(0);\n }\n\n // Step 3: Write files\n const s = p.spinner();\n\n for (const tool of selectedTools) {\n s.start(`Generating ${tool.name} rules...`);\n\n const content = getTemplate(tool.id);\n const filePath = tool.outputPath;\n const fileExists = existsSync(filePath);\n\n s.stop(`Generated ${tool.name} rules.`);\n\n if (fileExists && !opts.force) {\n const existingContent = readFileSync(filePath, \"utf-8\");\n\n if (opts.merge) {\n writeFile(filePath, mergeSection(existingContent, content));\n p.log.success(\n `${pc.green(\"Merged\")} Directive section into ${pc.dim(relative(targetDir, filePath))}`,\n );\n continue;\n }\n\n if (hasDirectiveSection(existingContent)) {\n const action = await p.select({\n message: `${relative(targetDir, filePath)} already has a Directive section. What should we do?`,\n options: [\n {\n value: \"merge\",\n label: \"Update Directive section only\",\n hint: \"recommended\",\n },\n { value: \"overwrite\", label: \"Overwrite entire file\" },\n { value: \"skip\", label: \"Skip this file\" },\n ],\n });\n\n if (p.isCancel(action)) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n\n if (action === \"merge\") {\n writeFile(filePath, mergeSection(existingContent, content));\n p.log.success(\n `${pc.green(\"Updated\")} ${pc.dim(relative(targetDir, filePath))}`,\n );\n } else if (action === \"overwrite\") {\n writeFile(filePath, content);\n p.log.success(\n `${pc.green(\"Wrote\")} ${pc.dim(relative(targetDir, filePath))}`,\n );\n } else {\n p.log.info(`Skipped ${pc.dim(relative(targetDir, filePath))}`);\n }\n } else {\n const action = await p.select({\n message: `${relative(targetDir, filePath)} already exists. What should we do?`,\n options: [\n {\n value: \"append\",\n label: \"Append Directive section\",\n hint: \"preserves existing content\",\n },\n { value: \"overwrite\", label: \"Overwrite entire file\" },\n { value: \"skip\", label: \"Skip this file\" },\n ],\n });\n\n if (p.isCancel(action)) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n\n if (action === \"append\") {\n writeFile(filePath, mergeSection(existingContent, content));\n p.log.success(\n `${pc.green(\"Appended\")} to ${pc.dim(relative(targetDir, filePath))}`,\n );\n } else if (action === \"overwrite\") {\n writeFile(filePath, content);\n p.log.success(\n `${pc.green(\"Wrote\")} ${pc.dim(relative(targetDir, filePath))}`,\n );\n } else {\n p.log.info(`Skipped ${pc.dim(relative(targetDir, filePath))}`);\n }\n }\n } else {\n writeFile(filePath, content);\n p.log.success(\n `${pc.green(\"Created\")} ${pc.dim(relative(targetDir, filePath))}`,\n );\n }\n }\n\n p.outro(\n `Done! Run ${pc.cyan(`${CLI_NAME} ai-rules init --merge`)} anytime to update.`,\n );\n}\n\nfunction writeFile(filePath: string, content: string) {\n const dir = dirname(filePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n writeFileSync(filePath, content, \"utf-8\");\n}\n\n// ---------------------------------------------------------------------------\n// ai-rules update — regenerate all existing rule files\n// ---------------------------------------------------------------------------\n\nexport async function aiRulesUpdateCommand(args: string[]) {\n const opts = parseArgs(args);\n const targetDir = opts.dir;\n\n const ruleFiles: Array<{ id: DetectedTool[\"id\"]; path: string }> = [\n { id: \"cursor\", path: join(targetDir, \".cursorrules\") },\n { id: \"claude\", path: join(targetDir, \".claude/CLAUDE.md\") },\n { id: \"copilot\", path: join(targetDir, \".github/copilot-instructions.md\") },\n { id: \"windsurf\", path: join(targetDir, \".windsurfrules\") },\n { id: \"cline\", path: join(targetDir, \".clinerules\") },\n ];\n\n let updated = 0;\n\n for (const file of ruleFiles) {\n if (!existsSync(file.path)) {\n continue;\n }\n\n const existing = readFileSync(file.path, \"utf-8\");\n if (!hasDirectiveSection(existing)) {\n continue;\n }\n\n const newContent = getTemplate(file.id);\n const merged = mergeSection(existing, newContent);\n\n writeFile(file.path, merged);\n console.log(\n `${pc.green(\"Updated\")} ${pc.dim(relative(targetDir, file.path))}`,\n );\n updated++;\n }\n\n if (updated === 0) {\n console.log(\n pc.dim(\n `No existing rule files found. Run ${pc.cyan(`${CLI_NAME} ai-rules init`)} first.`,\n ),\n );\n } else {\n console.log(\n pc.green(`\\nUpdated ${updated} file(s) to latest knowledge version.`),\n );\n }\n}\n\n// ---------------------------------------------------------------------------\n// ai-rules check — exit non-zero if rules are stale (CI-friendly)\n// ---------------------------------------------------------------------------\n\nexport async function aiRulesCheckCommand(args: string[]) {\n const opts = parseArgs(args);\n const targetDir = opts.dir;\n\n const ruleFiles: Array<{\n id: DetectedTool[\"id\"];\n path: string;\n name: string;\n }> = [\n { id: \"cursor\", path: join(targetDir, \".cursorrules\"), name: \"Cursor\" },\n {\n id: \"claude\",\n path: join(targetDir, \".claude/CLAUDE.md\"),\n name: \"Claude Code\",\n },\n {\n id: \"copilot\",\n path: join(targetDir, \".github/copilot-instructions.md\"),\n name: \"GitHub Copilot\",\n },\n {\n id: \"windsurf\",\n path: join(targetDir, \".windsurfrules\"),\n name: \"Windsurf\",\n },\n { id: \"cline\", path: join(targetDir, \".clinerules\"), name: \"Cline\" },\n ];\n\n let checked = 0;\n let stale = 0;\n\n for (const file of ruleFiles) {\n if (!existsSync(file.path)) {\n continue;\n }\n\n const existing = readFileSync(file.path, \"utf-8\");\n if (!hasDirectiveSection(existing)) {\n continue;\n }\n\n checked++;\n\n // Generate fresh content and merge, then compare\n const freshContent = getTemplate(file.id);\n const merged = mergeSection(existing, freshContent);\n\n if (merged !== existing) {\n console.log(\n `${pc.red(\"✗\")} ${file.name} rules are ${pc.yellow(\"stale\")}`,\n );\n stale++;\n } else {\n console.log(\n `${pc.green(\"✓\")} ${file.name} rules are ${pc.green(\"current\")}`,\n );\n }\n }\n\n if (checked === 0) {\n console.log(pc.dim(\"No rule files found to check.\"));\n\n return;\n }\n\n if (stale > 0) {\n console.log(\n `\\n${pc.yellow(`${stale} file(s) are stale.`)} Run ${pc.cyan(`${CLI_NAME} ai-rules update`)} to refresh.`,\n );\n process.exit(1);\n } else {\n console.log(pc.green(\"\\nAll rule files are current.\"));\n }\n}\n","import { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport pc from \"picocolors\";\n\n/**\n * Loads a Directive system from a user's TypeScript file.\n *\n * Uses tsx to handle TypeScript imports. Looks for:\n * 1. Default export of a System instance\n * 2. Named \"system\" export\n *\n * Returns the live System object for inspection/explain/graph commands.\n *\n * Note: Returns `any` intentionally — the loaded module is user code with\n * unknown types. Duck-type validation via `isSystem()` ensures the returned\n * object has the required shape (start, stop, inspect, facts).\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport async function loadSystem(filePath: string): Promise<any> {\n const resolved = resolve(filePath);\n\n if (!existsSync(resolved)) {\n throw new Error(`File not found: ${resolved}`);\n }\n\n // Use tsx register to handle TypeScript imports\n try {\n // Dynamic import with tsx — tsx must be available\n const mod = await import(resolved);\n\n // Look for default export first\n if (mod.default && isSystem(mod.default)) {\n return mod.default;\n }\n\n // Look for named \"system\" export\n if (mod.system && isSystem(mod.system)) {\n return mod.system;\n }\n\n // Look for any export that looks like a System\n for (const key of Object.keys(mod)) {\n if (isSystem(mod[key])) {\n return mod[key];\n }\n }\n\n throw new Error(\n `No Directive system found in ${pc.dim(filePath)}\\n` +\n `Export a system as default or named \"system\":\\n\\n` +\n ` ${pc.cyan(\"export default\")} createSystem({ module: myModule });\\n` +\n ` ${pc.cyan(\"export const system\")} = createSystem({ module: myModule });`,\n );\n } catch (err) {\n if (err instanceof Error && err.message.includes(\"No Directive system\")) {\n throw err;\n }\n\n throw new Error(\n `Failed to load ${pc.dim(filePath)}: ${err instanceof Error ? err.message : String(err)}\\n\\n` +\n `Make sure the file is valid TypeScript and tsx is installed:\\n` +\n ` ${pc.cyan(\"npm install -D tsx\")}`,\n );\n }\n}\n\n/**\n * Duck-type check for a Directive System object.\n */\nfunction isSystem(obj: unknown): boolean {\n if (typeof obj !== \"object\" || obj === null) {\n return false;\n }\n\n const sys = obj as Record<string, unknown>;\n\n return (\n typeof sys.inspect === \"function\" &&\n typeof sys.start === \"function\" &&\n typeof sys.stop === \"function\" &&\n \"facts\" in sys\n );\n}\n\n/**\n * Loads a Directive system *factory* from a user's TypeScript file.\n *\n * Where {@link loadSystem} returns a one-shot started system instance,\n * `loadSystemFactory()` returns a callable that produces a fresh,\n * started system on every invocation. This is the contract that\n * `directive bisect` needs — each midpoint replay must start from the\n * same hermetic initial state, so we re-instantiate per attempt.\n *\n * Lookup order (first match wins):\n * 1. Named export `createSystem` (function).\n * 2. Named export `systemFactory` (function).\n * 3. Default export, if it's a function.\n *\n * The factory may return either a System directly or a Promise<System>.\n * Whatever it returns must satisfy {@link isSystem}'s duck-type\n * (`inspect`/`start`/`stop`/`facts`). The factory is responsible for\n * calling `start()` itself — the bisect runner does NOT call start.\n *\n * @example\n * ```ts\n * // User's bisect-system.ts:\n * import { createSystem as makeSys } from \"@directive-run/core\";\n * import { counterModule } from \"./modules/counter\";\n *\n * export function createSystem() {\n * const sys = makeSys({ module: counterModule });\n * sys.start();\n * return sys;\n * }\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport async function loadSystemFactory(\n filePath: string,\n): Promise<() => Promise<any>> {\n const resolved = resolve(filePath);\n\n if (!existsSync(resolved)) {\n throw new Error(`File not found: ${resolved}`);\n }\n\n let mod: Record<string, unknown>;\n try {\n mod = (await import(resolved)) as Record<string, unknown>;\n } catch (err) {\n throw new Error(\n `Failed to load ${pc.dim(filePath)}: ${err instanceof Error ? err.message : String(err)}\\n\\n` +\n `Make sure the file is valid TypeScript and tsx is installed:\\n` +\n ` ${pc.cyan(\"npm install -D tsx\")}`,\n );\n }\n\n const candidates: Array<[string, unknown]> = [\n [\"createSystem\", mod.createSystem],\n [\"systemFactory\", mod.systemFactory],\n [\"default\", mod.default],\n ];\n\n for (const [name, candidate] of candidates) {\n if (typeof candidate === \"function\") {\n // Wrap so we always return a Promise and validate the result\n // shape after each call (catches \"factory exists but returns\n // junk\" — common when the user forgets to call sys.start()).\n return async () => {\n const result = await Promise.resolve((candidate as () => unknown)());\n if (!isSystem(result)) {\n throw new Error(\n `Factory '${name}' from ${pc.dim(filePath)} returned a value that is not a started Directive system.\\n` +\n `Expected an object with inspect/start/stop/facts. The factory must call sys.start() before returning.`,\n );\n }\n return result;\n };\n }\n }\n\n // R5 DX C4: detect the most common confusion — user passed a file\n // that exports a STARTED system (the shape `directive replay` wants)\n // and got a confusing \"no factory\" error. Surface a targeted message\n // explaining how to wrap it.\n const hasStartedInstance =\n isSystem(mod.default) ||\n isSystem(mod.system) ||\n Object.values(mod).some(isSystem);\n\n if (hasStartedInstance) {\n throw new Error(\n `Found a started Directive system in ${pc.dim(filePath)}, but bisect needs a factory.\\n` +\n `Bisect instantiates a fresh system for every midpoint replay (so each attempt is hermetic),\\n` +\n `which means it can't reuse a singleton instance the way ${pc.cyan(\"directive replay\")} does.\\n\\n` +\n `Wrap the existing export in a function:\\n\\n` +\n ` ${pc.cyan(\"export function createSystem()\")} {\\n` +\n ` const sys = createSystem({ module: yourModule });\\n` +\n ` sys.start();\\n` +\n ` return sys;\\n` +\n ` }`,\n );\n }\n\n throw new Error(\n `No system factory found in ${pc.dim(filePath)}\\n` +\n `Bisect needs to instantiate a fresh system per midpoint replay. Export one of:\\n\\n` +\n ` ${pc.cyan(\"export function createSystem()\")} { ... return sys; }\\n` +\n ` ${pc.cyan(\"export const systemFactory\")} = () => { ... return sys; };\\n` +\n ` ${pc.cyan(\"export default\")} () => { ... return sys; };\\n\\n` +\n `The factory MUST call sys.start() and return the started system.\\n` +\n `(Did you forget ${pc.cyan(\"sys.start()\")} before returning?)`,\n );\n}\n","/**\n * Shared lazy-import helper for `@directive-run/timeline`. Three CLI\n * commands (`replay`, `bisect`, `timeline diff`) all need to load\n * timeline at runtime as an optional peer — without this helper each\n * command duplicates the same try/catch + error message.\n *\n * `import type` at the top is fully erased at compile time, so the\n * lazy `await import()` semantics are preserved exactly: timeline\n * stays an optional peer, the CLI runs without it for non-timeline\n * commands, and the typed module shape is still single-sourced.\n *\n * (R5 arch C2 + arch M2.)\n */\n\nimport pc from \"picocolors\";\n\n// eslint-disable-next-line @typescript-eslint/consistent-type-imports\nimport type * as Timeline from \"@directive-run/timeline\";\n\nexport type TimelineModule = typeof Timeline;\n\n/**\n * Load `@directive-run/timeline` lazily. On failure, prints a clear\n * install-prompt error and exits with code 1.\n *\n * @param verbose — when true, also prints the underlying require/import\n * error to stderr for debugging.\n */\nexport async function loadTimelinePackage(\n verbose = false,\n): Promise<TimelineModule> {\n try {\n return (await import(\"@directive-run/timeline\")) as TimelineModule;\n } catch (err) {\n console.error(\n pc.red(\n `error: @directive-run/timeline not installed in this project.\\n Install it: npm install --save-dev @directive-run/timeline`,\n ),\n );\n if (verbose) console.error(pc.dim((err as Error).message));\n process.exit(1);\n }\n}\n","/**\n * `directive bisect <timeline.json> --system <factory.ts> --assert <expr>`\n *\n * Git-bisect, but over recorded timeline frames. Pairs with\n * `@directive-run/timeline`'s `serializeTimeline()` + `bisectTimeline()`\n * — typical flow:\n *\n * 1. Production captures a timeline that ends in a known-bad state.\n * 2. Engineer downloads the JSON, picks a JS expression that\n * distinguishes the good state from the bad state (e.g.\n * `facts.count >= 0`).\n * 3. Run:\n * directive bisect bug-1234.json \\\n * --system test/bisect-system.ts \\\n * --assert 'facts.count >= 0'\n * 4. CLI binary-searches the frame stream and prints the first\n * frame whose inclusion flips the assertion to false.\n *\n * --system contract\n * The user's TypeScript file must export a factory: a callable\n * returning a freshly-instantiated, started Directive system. Bisect\n * calls the factory once per midpoint replay so each attempt is\n * hermetic. See `loadSystemFactory()` for the exact lookup rules.\n *\n * --assert contract\n * The expression is evaluated as a JS Function body with `facts` and\n * `system` in scope. Returning a truthy value means \"this prefix is\n * in the GOOD region of the search\"; falsy means \"this prefix is in\n * the BAD region.\" Bisect locates the smallest prefix in the BAD\n * region.\n *\n * --assert 'facts.count >= 0' // good: count never negative\n * --assert 'facts.status !== \"error\"' // good: status not error\n * --assert 'system.inspect().errors.length === 0' // good: no errors\n *\n * The expression runs LOCALLY in the CLI process — there's no\n * sandbox. Don't pass arbitrary strings from untrusted callers.\n *\n * v0.1 scope:\n * - Single-timeline bisect (no good.json/bad.json comparison yet).\n * - String --assert expression (no `--assert-file` to load a vitest\n * yet; that's R2.D territory).\n * - Reports first failing frame index + reconstructs the dispatch\n * payload for human readability.\n *\n * v0.2 (deferred):\n * - `directive bisect --good <good.json> --bad <bad.json>` — diff\n * two timelines and bisect the delta.\n * - `--assert-file <vitest.ts>` — run a real test as the oracle.\n * - `--git-bisect` — emit a bisect-run script.\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport pc from \"picocolors\";\nimport { loadSystemFactory } from \"../lib/loader.js\";\nimport { loadTimelinePackage } from \"../lib/timeline-loader.js\";\n\ninterface BisectCliOptions {\n systemPath?: string;\n assertExpr?: string;\n maxFrames?: number;\n noDeterminismCheck: boolean;\n json: boolean;\n verbose: boolean;\n}\n\nfunction parseArgs(args: string[]): {\n jsonPath: string;\n opts: BisectCliOptions;\n} {\n const opts: BisectCliOptions = {\n json: false,\n noDeterminismCheck: false,\n verbose: false,\n };\n let jsonPath = \"\";\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n switch (arg) {\n case \"--system\":\n case \"-s\": {\n const val = args[++i];\n if (val) opts.systemPath = val;\n break;\n }\n case \"--assert\":\n case \"-a\": {\n const val = args[++i];\n if (val) opts.assertExpr = val;\n break;\n }\n case \"--max-frames\": {\n const val = args[++i];\n const n = val ? Number.parseInt(val, 10) : Number.NaN;\n if (Number.isFinite(n) && n > 0) opts.maxFrames = n;\n break;\n }\n case \"--no-determinism-check\":\n opts.noDeterminismCheck = true;\n break;\n case \"--json\":\n opts.json = true;\n break;\n case \"--verbose\":\n case \"-v\":\n opts.verbose = true;\n break;\n default:\n if (arg && !arg.startsWith(\"-\") && !jsonPath) {\n jsonPath = arg;\n }\n }\n }\n\n return { jsonPath, opts };\n}\n\nfunction printUsage(): void {\n console.error(`\nUsage: directive bisect <timeline.json> --system <factory.ts> --assert <expr>\n\nBinary-search a recorded timeline for the first frame that triggers a\nfailing assertion — git-bisect, but over ObservationEvent frames.\n\nArguments:\n <timeline.json> Path to a timeline produced by serializeTimeline()\n\nOptions:\n --system, -s <path> TypeScript file exporting a system factory\n (createSystem / systemFactory / default).\n The factory must return a started Directive\n system; bisect calls it once per midpoint.\n --assert, -a <expression> JS expression with 'facts' and 'system' in\n scope. Truthy = good prefix, falsy = bad\n prefix. Bisect finds the smallest bad prefix.\n --max-frames <n> Per-replay frame cap (default 100,000)\n --no-determinism-check Skip the \"replay-twice and compare\" gate\n before bisecting. Use only on timelines you\n know are deterministic.\n --json Emit BisectResult as JSON\n --verbose, -v Print every midpoint and its verdict\n --help, -h Show this help\n\nSECURITY: --assert is evaluated as JavaScript in this process. Only\npass expressions from sources you trust (your own scripts, your own\nPRs). Don't paste expressions from issues, untrusted Slack messages,\nor third-party sources without reading them first.\n\nExamples:\n directive bisect bug-1234.json --system test/bisect-sys.ts \\\\\n --assert 'facts.count >= 0'\n\n directive bisect crash.json -s factory.ts -a 'facts.status !== \"error\"' --json\n`);\n}\n\n/**\n * Build a user-supplied JS expression into a callable oracle that\n * returns boolean. Accepts `facts` and `system` as the only in-scope\n * names. Throws at parse time if the expression is malformed.\n *\n * Important: this evaluates user-supplied JS in the CLI process. The\n * CLI is a local-trust tool (operator runs it on their own machine\n * with their own input), so this is acceptable. Do NOT relay this\n * surface to a server-side context.\n */\nfunction compileAssertion(expr: string): (system: unknown) => boolean {\n let fn: (facts: unknown, system: unknown) => unknown;\n try {\n // Function constructor is intentional: the assertion expression\n // needs lexical scope of `facts` + `system` as variables.\n fn = new Function(\"facts\", \"system\", `\"use strict\"; return (${expr});`) as (\n facts: unknown,\n system: unknown,\n ) => unknown;\n } catch (err) {\n throw new Error(\n `Failed to compile --assert expression: ${(err as Error).message}\\n expression: ${expr}`,\n );\n }\n return (system: unknown) => {\n const facts = (system as { facts?: unknown })?.facts;\n const result = fn(facts, system);\n return Boolean(result);\n };\n}\n\nexport async function bisectCommand(args: string[]): Promise<void> {\n if (args.includes(\"--help\") || args.includes(\"-h\") || args.length === 0) {\n printUsage();\n process.exit(args.length === 0 ? 1 : 0);\n }\n\n const { jsonPath, opts } = parseArgs(args);\n\n if (!jsonPath) {\n console.error(pc.red(\"error: missing <timeline.json> argument\"));\n printUsage();\n process.exit(1);\n }\n if (!opts.systemPath) {\n console.error(\n pc.red(\"error: --system <path> is required\"),\n pc.dim(\n \"\\n (bisect needs a factory to instantiate a fresh system per midpoint)\",\n ),\n );\n printUsage();\n process.exit(1);\n }\n if (!opts.assertExpr) {\n console.error(\n pc.red(\"error: --assert <expression> is required\"),\n pc.dim(\n \"\\n (assertion distinguishes 'good' from 'bad' system state)\",\n ),\n );\n printUsage();\n process.exit(1);\n }\n\n // Load the timeline JSON.\n const resolvedJson = resolve(jsonPath);\n if (!existsSync(resolvedJson)) {\n console.error(pc.red(`error: timeline file not found: ${resolvedJson}`));\n process.exit(1);\n }\n\n let raw: string;\n try {\n raw = readFileSync(resolvedJson, \"utf8\");\n } catch (err) {\n console.error(\n pc.red(\n `error: failed to read ${resolvedJson}: ${(err as Error).message}`,\n ),\n );\n process.exit(1);\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (err) {\n console.error(\n pc.red(\n `error: ${resolvedJson} is not valid JSON: ${(err as Error).message}`,\n ),\n );\n process.exit(1);\n }\n\n // Lazy-import the timeline package — optional peer. Types come\n // from `import type` inside the helper, so we get full type safety\n // without forcing timeline into the install graph for non-timeline\n // CLI commands.\n const { deserializeTimeline, bisectTimeline } = await loadTimelinePackage(\n opts.verbose,\n );\n\n // Validate + deserialize.\n let timeline: ReturnType<typeof deserializeTimeline>;\n try {\n timeline = deserializeTimeline(parsed);\n } catch (err) {\n console.error(\n pc.red(\n `error: timeline JSON failed validation: ${(err as Error).message}`,\n ),\n );\n process.exit(1);\n }\n\n // Compile the assertion before any replay so a malformed expression\n // fails fast with a clear message instead of after a minute of work.\n let assertion: (system: unknown) => boolean;\n try {\n assertion = compileAssertion(opts.assertExpr);\n } catch (err) {\n console.error(pc.red(`error: ${(err as Error).message}`));\n process.exit(1);\n }\n\n // Load the user's factory.\n let factory: () => Promise<unknown>;\n try {\n factory = await loadSystemFactory(opts.systemPath);\n } catch (err) {\n console.error(\n pc.red(`error: failed to load system factory: ${(err as Error).message}`),\n );\n process.exit(1);\n }\n\n if (opts.verbose) {\n console.error(\n pc.dim(\n `bisecting ${timeline.frames.length} frames with assertion: ${opts.assertExpr}`,\n ),\n );\n }\n\n // Run bisect. The factory's return is verified at runtime by\n // loadSystemFactory() to be a started Directive system (which\n // satisfies ReplayableSystem's `dispatch` requirement); the cast\n // here just bridges loadSystemFactory's `any` return to bisect's\n // typed factory shape.\n const result = await bisectTimeline(\n timeline,\n factory as () => Promise<{\n dispatch: (event: { type: string; [key: string]: unknown }) => void;\n }>,\n assertion,\n {\n maxFrames: opts.maxFrames,\n determinismCheck: !opts.noDeterminismCheck,\n },\n );\n\n if (opts.json) {\n // Strip the heavy frame object from JSON output — the index alone\n // is enough for tooling, and the full frame would double the\n // payload size for callers that just want to pipe into jq.\n // R5 sec #9: emit `null` (not `undefined`) for absent index so jq\n // consumers can distinguish \"fails before frame 0\" (index=null,\n // failsOnEmptyReplay=true) from \"frame 0 itself triggers\"\n // (index=0, failsOnEmptyReplay=false). JSON.stringify drops\n // `undefined` keys which made these states indistinguishable.\n const lean = {\n firstFailingFrameIndex: result.firstFailingFrameIndex ?? null,\n iterations: result.iterations,\n noFailureFound: result.noFailureFound,\n failsOnEmptyReplay: result.failsOnEmptyReplay,\n nonDeterministic: result.nonDeterministic,\n };\n console.log(JSON.stringify(lean, null, 2));\n process.exit(0);\n }\n\n // Human-friendly output.\n if (result.nonDeterministic) {\n console.error(pc.red(\"✗ bisect aborted: timeline is non-deterministic\"));\n console.error(\n pc.dim(\n ` Two full-timeline replays produced different oracle verdicts.\\n` +\n ` Bisection is unreliable on non-deterministic timelines.\\n` +\n ` Either fix the timeline source (deterministic clocks/seeds)\\n` +\n ` or re-run with --no-determinism-check if you accept the risk.`,\n ),\n );\n process.exit(2);\n }\n if (result.noFailureFound) {\n console.error(\n pc.yellow(\n \"⚠ no failure to bisect: assertion passes on the full timeline\",\n ),\n );\n console.error(\n pc.dim(\n ` The recorded timeline does not exhibit the bug your\\n` +\n ` --assert expression checks. Verify the assertion or\\n` +\n ` try a different bad.json.`,\n ),\n );\n process.exit(0);\n }\n if (result.failsOnEmptyReplay) {\n console.error(\n pc.yellow(\n \"⚠ assertion fails BEFORE any frame replays — bug is in initialization\",\n ),\n );\n console.error(\n pc.dim(\n ` The freshly-started system already violates the assertion.\\n` +\n ` Bisect cannot narrow further. Inspect the system factory\\n` +\n ` or initial fact values.`,\n ),\n );\n process.exit(0);\n }\n\n // Standard hit.\n const idx = result.firstFailingFrameIndex ?? -1;\n const frame = result.firstFailingFrame;\n const eventType = frame?.event.type ?? \"<unknown>\";\n console.log(\n `${pc.green(\"✓\")} bisect complete: ${pc.bold(`first failing frame is #${idx}`)} ${pc.dim(`(${eventType})`)}`,\n );\n console.log(\n pc.dim(\n ` • iterations: ${result.iterations} | timeline frames: ${timeline.frames.length}`,\n ),\n );\n if (opts.verbose && frame) {\n console.log(pc.dim(\" • frame:\"));\n console.log(\n pc.dim(\n ` ${JSON.stringify(frame, null, 2).split(\"\\n\").join(\"\\n \")}`,\n ),\n );\n }\n // R5 DX M3: align with `directive timeline diff` and the rest of\n // the CLI's exit-code convention. A \"standard hit\" means we LOCATED\n // a failing frame — the user's original premise (bad.json fails)\n // is now confirmed. CI gates can branch on `directive bisect && echo OK`\n // to mean \"the timeline is clean.\"\n // 0 — nothing wrong (noFailureFound / failsOnEmptyReplay handled above)\n // 1 — CLI argument / file / module error (handled above)\n // 2 — problem found (this branch) OR refused to bisect (nonDeterministic, above)\n process.exit(2);\n}\n","import { existsSync, readFileSync, readdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport pc from \"picocolors\";\nimport { hasDirectiveSection } from \"../lib/merge.js\";\n\ninterface DoctorOptions {\n dir: string;\n}\n\nfunction parseArgs(args: string[]): DoctorOptions {\n const opts: DoctorOptions = { dir: process.cwd() };\n\n for (let i = 0; i < args.length; i++) {\n if (args[i] === \"--dir\") {\n const val = args[++i];\n if (val) {\n opts.dir = val;\n }\n }\n }\n\n return opts;\n}\n\n// ---------------------------------------------------------------------------\n// Checks\n// ---------------------------------------------------------------------------\n\ninterface CheckResult {\n label: string;\n passed: boolean;\n message: string;\n fix?: string;\n}\n\nfunction checkCoreInstalled(dir: string): CheckResult {\n const pkgPath = join(dir, \"package.json\");\n if (!existsSync(pkgPath)) {\n return {\n label: \"@directive-run/core installed\",\n passed: false,\n message: \"No package.json found\",\n fix: \"Run `npm init` to create a package.json\",\n };\n }\n\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\"));\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\n\n if (!deps[\"@directive-run/core\"]) {\n return {\n label: \"@directive-run/core installed\",\n passed: false,\n message: \"Not found in dependencies\",\n fix: \"Run `npm install @directive-run/core`\",\n };\n }\n\n return {\n label: \"@directive-run/core installed\",\n passed: true,\n message: `v${deps[\"@directive-run/core\"]}`,\n };\n}\n\nfunction checkVersionCompatibility(dir: string): CheckResult {\n const pkgPath = join(dir, \"package.json\");\n if (!existsSync(pkgPath)) {\n return {\n label: \"Package version compatibility\",\n passed: true,\n message: \"Skipped (no package.json)\",\n };\n }\n\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\"));\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\n\n const directivePackages = Object.keys(deps).filter((k) =>\n k.startsWith(\"@directive-run/\"),\n );\n\n if (directivePackages.length <= 1) {\n return {\n label: \"Package version compatibility\",\n passed: true,\n message:\n directivePackages.length === 0 ? \"No packages found\" : \"Single package\",\n };\n }\n\n return {\n label: \"Package version compatibility\",\n passed: true,\n message: `${directivePackages.length} packages: ${directivePackages.join(\", \")}`,\n };\n}\n\nfunction checkTypeScript(dir: string): CheckResult {\n const tsconfigPath = join(dir, \"tsconfig.json\");\n\n if (!existsSync(tsconfigPath)) {\n return {\n label: \"TypeScript configuration\",\n passed: false,\n message: \"No tsconfig.json found\",\n fix: \"Run `tsc --init` to create a TypeScript configuration\",\n };\n }\n\n try {\n // Simple JSON parse — doesn't handle comments or extends\n const raw = readFileSync(tsconfigPath, \"utf-8\");\n // Strip single-line comments for parsing\n const stripped = raw\n .replace(/\\/\\/.*$/gm, \"\")\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, \"\");\n const config = JSON.parse(stripped);\n const co = config.compilerOptions || {};\n\n const issues: string[] = [];\n\n if (co.strict !== true) {\n issues.push(\"strict mode not enabled\");\n }\n\n if (\n co.moduleResolution &&\n ![\"bundler\", \"nodenext\", \"node16\"].includes(\n co.moduleResolution.toLowerCase(),\n )\n ) {\n issues.push(`moduleResolution is \"${co.moduleResolution}\"`);\n }\n\n if (issues.length > 0) {\n return {\n label: \"TypeScript configuration\",\n passed: false,\n message: issues.join(\", \"),\n fix: 'Set \"strict\": true and \"moduleResolution\": \"bundler\" in tsconfig.json',\n };\n }\n\n return {\n label: \"TypeScript configuration\",\n passed: true,\n message: \"strict mode, correct module resolution\",\n };\n } catch {\n return {\n label: \"TypeScript configuration\",\n passed: true,\n message: \"Found (could not parse for detailed checks)\",\n };\n }\n}\n\nfunction checkDuplicateInstances(dir: string): CheckResult {\n const nodeModules = join(dir, \"node_modules\");\n\n if (!existsSync(nodeModules)) {\n return {\n label: \"No duplicate Directive instances\",\n passed: true,\n message: \"No node_modules found\",\n };\n }\n\n const duplicates: string[] = [];\n\n // Check for nested @directive-run/core in node_modules\n try {\n const scopeDir = join(nodeModules, \"@directive-run\");\n if (existsSync(scopeDir)) {\n const packages = readdirSync(scopeDir);\n for (const pkg of packages) {\n const nestedCore = join(\n scopeDir,\n pkg,\n \"node_modules\",\n \"@directive-run\",\n \"core\",\n );\n if (existsSync(nestedCore)) {\n duplicates.push(\n `@directive-run/${pkg}/node_modules/@directive-run/core`,\n );\n }\n }\n }\n } catch {\n // Can't read node_modules, skip\n }\n\n if (duplicates.length > 0) {\n return {\n label: \"No duplicate Directive instances\",\n passed: false,\n message: `Found ${duplicates.length} duplicate(s): ${duplicates.join(\", \")}`,\n fix: \"Run `npm dedupe` or check for version mismatches\",\n };\n }\n\n return {\n label: \"No duplicate Directive instances\",\n passed: true,\n message: \"No duplicates detected\",\n };\n}\n\nfunction checkAIRulesFreshness(dir: string): CheckResult {\n const ruleFiles = [\n \".cursorrules\",\n \".claude/CLAUDE.md\",\n \".github/copilot-instructions.md\",\n \".windsurfrules\",\n \".clinerules\",\n ];\n\n const found: string[] = [];\n\n for (const file of ruleFiles) {\n const filePath = join(dir, file);\n if (existsSync(filePath)) {\n const content = readFileSync(filePath, \"utf-8\");\n if (hasDirectiveSection(content)) {\n found.push(file);\n }\n }\n }\n\n if (found.length === 0) {\n return {\n label: \"AI coding rules\",\n passed: true,\n message: \"Not installed (optional)\",\n };\n }\n\n return {\n label: \"AI coding rules\",\n passed: true,\n message: `Installed for: ${found.join(\", \")}`,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Command\n// ---------------------------------------------------------------------------\n\nexport async function doctorCommand(args: string[]) {\n const opts = parseArgs(args);\n\n console.log();\n console.log(pc.bold(pc.cyan(\"Directive Doctor\")));\n console.log(pc.dim(\"─\".repeat(40)));\n console.log();\n\n const checks = [\n checkCoreInstalled(opts.dir),\n checkVersionCompatibility(opts.dir),\n checkTypeScript(opts.dir),\n checkDuplicateInstances(opts.dir),\n checkAIRulesFreshness(opts.dir),\n ];\n\n let failures = 0;\n\n for (const check of checks) {\n const icon = check.passed ? pc.green(\"✓\") : pc.red(\"✗\");\n console.log(`${icon} ${pc.bold(check.label)}`);\n console.log(` ${pc.dim(check.message)}`);\n\n if (!check.passed && check.fix) {\n console.log(` ${pc.yellow(\"Fix:\")} ${check.fix}`);\n failures++;\n }\n\n console.log();\n }\n\n if (failures > 0) {\n console.log(\n pc.yellow(`${failures} issue(s) found. See suggested fixes above.`),\n );\n process.exit(1);\n } else {\n console.log(pc.green(\"All checks passed!\"));\n }\n}\n","import { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, join, relative } from \"node:path\";\nimport pc from \"picocolors\";\nimport { getAllExamples, getExample } from \"../lib/knowledge.js\";\n\n// ---------------------------------------------------------------------------\n// Categories\n// ---------------------------------------------------------------------------\n\nconst CATEGORIES: Record<string, string[]> = {\n \"Getting Started\": [\"counter\", \"contact-form\", \"auth-flow\"],\n \"Core Patterns\": [\n \"async-chains\",\n \"batch-resolver\",\n \"debounce-constraints\",\n \"error-boundaries\",\n \"feature-flags\",\n \"multi-module\",\n \"optimistic-updates\",\n \"pagination\",\n \"permissions\",\n ],\n \"Real-World\": [\n \"dashboard-loader\",\n \"form-wizard\",\n \"newsletter\",\n \"notifications\",\n \"shopping-cart\",\n \"theme-locale\",\n \"url-sync\",\n \"websocket\",\n \"server\",\n ],\n Games: [\"checkers\", \"sudoku\", \"goal-heist\", \"ab-testing\"],\n AI: [\n \"ai-orchestrator\",\n \"ai-checkpoint\",\n \"ai-guardrails\",\n \"fraud-analysis\",\n \"provider-routing\",\n \"topic-guard\",\n \"dynamic-modules\",\n \"time-machine\",\n ],\n};\n\nfunction getCategory(name: string): string {\n for (const [cat, names] of Object.entries(CATEGORIES)) {\n if (names.includes(name)) {\n return cat;\n }\n }\n\n return \"Other\";\n}\n\nfunction getDescription(content: string): string {\n // Extract first line comment or jsdoc summary\n const lines = content.split(\"\\n\");\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n // Match: // Example: name or // Source: ...\n if (trimmed.startsWith(\"// Example:\")) {\n continue;\n }\n if (trimmed.startsWith(\"// Source:\")) {\n continue;\n }\n if (trimmed.startsWith(\"// Extracted\")) {\n continue;\n }\n\n // Match JSDoc: * Description text\n const jsdocMatch = trimmed.match(/^\\*\\s+(.+?)(?:\\s*\\*\\/)?$/);\n if (jsdocMatch?.[1] && !jsdocMatch[1].startsWith(\"@\")) {\n return jsdocMatch[1];\n }\n\n // Match: // Description text\n if (trimmed.startsWith(\"//\") && trimmed.length > 3) {\n return trimmed.slice(2).trim();\n }\n\n // Stop at first non-comment line\n if (\n trimmed !== \"\" &&\n !trimmed.startsWith(\"//\") &&\n !trimmed.startsWith(\"/*\") &&\n !trimmed.startsWith(\"*\")\n ) {\n break;\n }\n }\n\n return \"\";\n}\n\n// ---------------------------------------------------------------------------\n// List command\n// ---------------------------------------------------------------------------\n\nexport async function examplesListCommand(args: string[]) {\n let filter: string | undefined;\n\n for (let i = 0; i < args.length; i++) {\n if (args[i] === \"--filter\") {\n filter = args[++i]?.toLowerCase();\n }\n }\n\n const examples = getAllExamples();\n\n console.log();\n console.log(pc.bold(pc.cyan(\"Directive Examples\")));\n console.log(pc.dim(\"─\".repeat(50)));\n console.log();\n\n // Group by category\n const byCategory = new Map<string, Array<{ name: string; desc: string }>>();\n\n for (const [name, content] of examples) {\n const cat = getCategory(name);\n\n if (\n filter &&\n !cat.toLowerCase().includes(filter) &&\n !name.includes(filter)\n ) {\n continue;\n }\n\n if (!byCategory.has(cat)) {\n byCategory.set(cat, []);\n }\n byCategory.get(cat)!.push({ name, desc: getDescription(content) });\n }\n\n if (byCategory.size === 0) {\n console.log(pc.dim(\"No examples match the filter.\"));\n\n return;\n }\n\n // Print in category order\n const categoryOrder = Object.keys(CATEGORIES);\n const sortedCategories = [...byCategory.keys()].sort(\n (a, b) =>\n (categoryOrder.indexOf(a) ?? 99) - (categoryOrder.indexOf(b) ?? 99),\n );\n\n for (const cat of sortedCategories) {\n const items = byCategory.get(cat)!;\n console.log(pc.bold(cat));\n\n for (const item of items) {\n const desc = item.desc ? pc.dim(` — ${item.desc}`) : \"\";\n console.log(` ${pc.cyan(item.name)}${desc}`);\n }\n\n console.log();\n }\n\n console.log(\n pc.dim(\n `${examples.size} examples available. Run ${pc.cyan(\"directive examples copy <name>\")} to extract one.`,\n ),\n );\n}\n\n// ---------------------------------------------------------------------------\n// Copy command\n// ---------------------------------------------------------------------------\n\nexport async function examplesCopyCommand(name: string, args: string[]) {\n let dest = process.cwd();\n\n for (let i = 0; i < args.length; i++) {\n if (args[i] === \"--dest\") {\n const val = args[++i];\n if (val) {\n dest = val;\n }\n }\n }\n\n if (!name) {\n console.error(\"Usage: directive examples copy <name> [--dest <dir>]\");\n process.exit(1);\n }\n\n const content = getExample(name);\n\n if (!content) {\n console.error(`Example \"${name}\" not found.`);\n console.error(\n `Run ${pc.cyan(\"directive examples list\")} to see available examples.`,\n );\n process.exit(1);\n }\n\n // Rewrite workspace imports to published package names\n const rewritten = content\n .replace(\n /from\\s+[\"']@directive-run\\/core\\/plugins[\"']/g,\n 'from \"@directive-run/core/plugins\"',\n )\n .replace(\n /from\\s+[\"']@directive-run\\/core[\"']/g,\n 'from \"@directive-run/core\"',\n )\n .replace(/from\\s+[\"']@directive-run\\/ai[\"']/g, 'from \"@directive-run/ai\"');\n\n const filePath = join(dest, `${name}.ts`);\n\n if (existsSync(filePath)) {\n console.error(`File already exists: ${relative(process.cwd(), filePath)}`);\n process.exit(1);\n }\n\n const dir = dirname(filePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n writeFileSync(filePath, rewritten, \"utf-8\");\n\n const rel = relative(process.cwd(), filePath);\n console.log(`${pc.green(\"Copied\")} ${pc.cyan(name)} → ${pc.dim(rel)}`);\n}\n","import pc from \"picocolors\";\nimport { loadSystem } from \"../lib/loader.js\";\n\ninterface ExplainOptions {\n module?: string;\n}\n\nfunction parseArgs(args: string[]): {\n filePath: string;\n requirementId?: string;\n opts: ExplainOptions;\n} {\n const opts: ExplainOptions = {};\n let filePath = \"\";\n let requirementId: string | undefined;\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n\n switch (arg) {\n case \"--module\": {\n const val = args[++i];\n if (val) {\n opts.module = val;\n }\n break;\n }\n default:\n if (arg && !arg.startsWith(\"-\")) {\n if (!filePath) {\n filePath = arg;\n } else if (!requirementId) {\n requirementId = arg;\n }\n }\n }\n }\n\n return { filePath, requirementId, opts };\n}\n\n// ---------------------------------------------------------------------------\n// Command\n// ---------------------------------------------------------------------------\n\nexport async function explainCommand(args: string[]) {\n const { filePath, requirementId } = parseArgs(args);\n\n if (!filePath) {\n console.error(\"Usage: directive explain <file> [requirement-id]\");\n process.exit(1);\n }\n\n const system = await loadSystem(filePath);\n\n if (!system.isRunning) {\n system.start();\n }\n\n const inspection = system.inspect();\n\n if (requirementId) {\n // Explain a specific requirement\n const explanation = system.explain(requirementId);\n\n if (!explanation) {\n console.error(\n `Requirement \"${requirementId}\" not found.\\n\\n` +\n \"Current requirements:\",\n );\n\n if (inspection.unmet.length === 0) {\n console.log(pc.dim(\" (no unmet requirements)\"));\n } else {\n for (const u of inspection.unmet) {\n console.log(\n ` ${pc.cyan(u.id)} — ${u.requirement.type} (from ${u.fromConstraint})`,\n );\n }\n }\n\n system.stop();\n process.exit(1);\n }\n\n console.log();\n console.log(pc.bold(pc.cyan(\"Requirement Explanation\")));\n console.log(pc.dim(\"─\".repeat(40)));\n console.log();\n console.log(explanation);\n console.log();\n } else {\n // List all requirements with status\n console.log();\n console.log(pc.bold(pc.cyan(\"All Requirements\")));\n console.log(pc.dim(\"─\".repeat(40)));\n console.log();\n\n if (inspection.unmet.length === 0) {\n console.log(pc.green(\"All requirements are met.\"));\n console.log();\n\n // Show resolver history if available\n const resolverEntries = Object.entries(\n inspection.resolvers as Record<\n string,\n { state: string; duration?: number; error?: string }\n >,\n );\n if (resolverEntries.length > 0) {\n console.log(pc.bold(\"Recent Resolver Activity:\"));\n for (const [key, status] of resolverEntries) {\n const state = formatState(status.state);\n const dur =\n status.duration !== undefined ? ` (${status.duration}ms)` : \"\";\n console.log(` ${pc.cyan(key)} ${state}${dur}`);\n }\n console.log();\n }\n } else {\n console.log(\n `${pc.yellow(String(inspection.unmet.length))} unmet requirement(s):\\n`,\n );\n\n for (const u of inspection.unmet) {\n console.log(\n `${pc.yellow(\"●\")} ${pc.bold(u.requirement.type)} (id: ${pc.dim(u.id)})`,\n );\n console.log(` From constraint: ${pc.cyan(u.fromConstraint)}`);\n\n // Show payload\n const payload = { ...u.requirement };\n delete (payload as Record<string, unknown>).type;\n const payloadKeys = Object.keys(payload);\n if (payloadKeys.length > 0) {\n console.log(` Payload: ${JSON.stringify(payload)}`);\n }\n\n // Check resolver status\n const resolverStatus = (\n inspection.resolvers as Record<\n string,\n { state: string; error?: string } | undefined\n >\n )[u.id];\n if (resolverStatus) {\n console.log(\n ` Resolver: ${formatState(resolverStatus.state)}${resolverStatus.error ? ` — ${resolverStatus.error}` : \"\"}`,\n );\n } else {\n // Check if any resolver handles this type\n const hasResolver = inspection.resolverDefs.some(\n (r: { id: string; requirement: string }) =>\n r.requirement === u.requirement.type ||\n r.requirement === \"(predicate)\",\n );\n if (!hasResolver) {\n console.log(` ${pc.red(\"No resolver registered for this type\")}`);\n }\n }\n\n console.log();\n }\n\n console.log(\n pc.dim(\n `Run ${pc.cyan(`directive explain <file> <requirement-id>`)} for detailed explanation.`,\n ),\n );\n }\n }\n\n system.stop();\n}\n\nfunction formatState(state: string): string {\n switch (state) {\n case \"resolved\":\n return pc.green(\"resolved\");\n case \"errored\":\n return pc.red(\"errored\");\n case \"inflight\":\n return pc.yellow(\"inflight\");\n case \"pending\":\n return pc.yellow(\"pending\");\n case \"cancelled\":\n return pc.dim(\"cancelled\");\n default:\n return pc.dim(state);\n }\n}\n","import { writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport pc from \"picocolors\";\nimport { loadSystem } from \"../lib/loader.js\";\n\ninterface GraphOptions {\n ascii: boolean;\n open: boolean;\n output?: string;\n}\n\nfunction parseArgs(args: string[]): { filePath: string; opts: GraphOptions } {\n const opts: GraphOptions = { ascii: false, open: true };\n let filePath = \"\";\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n\n switch (arg) {\n case \"--ascii\":\n opts.ascii = true;\n break;\n case \"--no-open\":\n opts.open = false;\n break;\n case \"--output\": {\n const val = args[++i];\n if (val) {\n opts.output = val;\n }\n break;\n }\n default:\n if (arg && !arg.startsWith(\"-\") && !filePath) {\n filePath = arg;\n }\n }\n }\n\n return { filePath, opts };\n}\n\n// ---------------------------------------------------------------------------\n// ASCII graph renderer\n// ---------------------------------------------------------------------------\n\nfunction renderAsciiGraph(inspection: {\n constraints: Array<{\n id: string;\n active: boolean;\n disabled: boolean;\n priority: number;\n }>;\n resolverDefs: Array<{ id: string; requirement: string }>;\n unmet: Array<{\n id: string;\n requirement: { type: string };\n fromConstraint: string;\n }>;\n}): string {\n const lines: string[] = [];\n\n lines.push(pc.bold(\"Dependency Graph\"));\n lines.push(pc.dim(\"═\".repeat(50)));\n lines.push(\"\");\n\n // Group by flow: constraint → requirement → resolver\n const constraintMap = new Map<\n string,\n { reqTypes: Set<string>; active: boolean; priority: number }\n >();\n\n for (const c of inspection.constraints) {\n constraintMap.set(c.id, {\n reqTypes: new Set(),\n active: c.active,\n priority: c.priority,\n });\n }\n\n // Map unmet requirements to constraints\n for (const u of inspection.unmet) {\n const entry = constraintMap.get(u.fromConstraint);\n if (entry) {\n entry.reqTypes.add(u.requirement.type);\n }\n }\n\n // Map resolvers to requirement types\n const resolversByType = new Map<string, string[]>();\n for (const r of inspection.resolverDefs) {\n if (!resolversByType.has(r.requirement)) {\n resolversByType.set(r.requirement, []);\n }\n resolversByType.get(r.requirement)!.push(r.id);\n }\n\n // Render constraint flows\n lines.push(pc.bold(\"Constraints → Requirements → Resolvers\"));\n lines.push(\"\");\n\n for (const [id, info] of constraintMap) {\n const status = info.active ? pc.green(\"●\") : pc.dim(\"○\");\n lines.push(`${status} ${pc.cyan(id)} (priority: ${info.priority})`);\n\n if (info.reqTypes.size > 0) {\n for (const reqType of info.reqTypes) {\n lines.push(` └─▶ ${pc.yellow(reqType)}`);\n\n const resolvers = resolversByType.get(reqType) || [];\n if (resolvers.length > 0) {\n for (const r of resolvers) {\n lines.push(` └─▶ ${pc.magenta(r)}`);\n }\n } else {\n lines.push(` └─▶ ${pc.red(\"(no resolver)\")}`);\n }\n }\n } else {\n lines.push(` └─▶ ${pc.dim(\"(no active requirements)\")}`);\n }\n\n lines.push(\"\");\n }\n\n // Orphaned resolvers\n const usedResolvers = new Set<string>();\n for (const resolvers of resolversByType.values()) {\n for (const r of resolvers) {\n usedResolvers.add(r);\n }\n }\n\n const allResolverIds = inspection.resolverDefs.map((r) => r.id);\n const orphanedCount = allResolverIds.filter(\n (r) => !usedResolvers.has(r),\n ).length;\n\n if (orphanedCount > 0) {\n lines.push(pc.bold(\"Standalone Resolvers:\"));\n for (const r of inspection.resolverDefs) {\n if (!usedResolvers.has(r.id)) {\n lines.push(` ${pc.magenta(r.id)} handles ${pc.yellow(r.requirement)}`);\n }\n }\n }\n\n return lines.join(\"\\n\");\n}\n\n// ---------------------------------------------------------------------------\n// HTML graph renderer\n// ---------------------------------------------------------------------------\n\nfunction renderHtmlGraph(\n inspection: {\n constraints: Array<{\n id: string;\n active: boolean;\n disabled: boolean;\n priority: number;\n hitCount: number;\n }>;\n resolverDefs: Array<{ id: string; requirement: string }>;\n resolvers: Record<string, { state: string }>;\n unmet: Array<{\n id: string;\n requirement: { type: string };\n fromConstraint: string;\n }>;\n },\n facts: Record<string, unknown>,\n): string {\n // Build nodes and edges for a simple SVG visualization\n const nodes: Array<{\n id: string;\n label: string;\n type: \"fact\" | \"constraint\" | \"requirement\" | \"resolver\";\n x: number;\n y: number;\n color: string;\n }> = [];\n const edges: Array<{ from: string; to: string }> = [];\n\n const colWidth = 220;\n const rowHeight = 50;\n const startX = 40;\n const startY = 60;\n\n // Column 1: Facts\n const factKeys = Object.keys(facts);\n for (let i = 0; i < factKeys.length; i++) {\n const key = factKeys[i]!;\n nodes.push({\n id: `fact-${key}`,\n label: key,\n type: \"fact\",\n x: startX,\n y: startY + i * rowHeight,\n color: \"#3b82f6\",\n });\n }\n\n // Column 2: Constraints\n for (let i = 0; i < inspection.constraints.length; i++) {\n const c = inspection.constraints[i]!;\n nodes.push({\n id: `constraint-${c.id}`,\n label: c.id,\n type: \"constraint\",\n x: startX + colWidth,\n y: startY + i * rowHeight,\n color: c.active ? \"#22c55e\" : \"#6b7280\",\n });\n }\n\n // Column 3: Requirements (from unmet)\n const reqTypes = new Set<string>();\n for (const u of inspection.unmet) {\n reqTypes.add(u.requirement.type);\n }\n let reqIdx = 0;\n for (const reqType of reqTypes) {\n nodes.push({\n id: `req-${reqType}`,\n label: reqType,\n type: \"requirement\",\n x: startX + colWidth * 2,\n y: startY + reqIdx * rowHeight,\n color: \"#eab308\",\n });\n reqIdx++;\n }\n\n // Column 4: Resolvers\n for (let i = 0; i < inspection.resolverDefs.length; i++) {\n const r = inspection.resolverDefs[i]!;\n nodes.push({\n id: `resolver-${r.id}`,\n label: r.id,\n type: \"resolver\",\n x: startX + colWidth * 3,\n y: startY + i * rowHeight,\n color: \"#a855f7\",\n });\n }\n\n // Edges: constraint → requirement\n for (const u of inspection.unmet) {\n edges.push({\n from: `constraint-${u.fromConstraint}`,\n to: `req-${u.requirement.type}`,\n });\n }\n\n // Edges: requirement → resolver\n for (const r of inspection.resolverDefs) {\n if (reqTypes.has(r.requirement)) {\n edges.push({\n from: `req-${r.requirement}`,\n to: `resolver-${r.id}`,\n });\n }\n }\n\n const nodeMap = new Map(nodes.map((n) => [n.id, n]));\n const svgWidth = startX + colWidth * 4 + 40;\n const maxY = Math.max(...nodes.map((n) => n.y)) + rowHeight + 20;\n\n const edgeSvg = edges\n .map((e) => {\n const from = nodeMap.get(e.from);\n const to = nodeMap.get(e.to);\n if (!from || !to) {\n return \"\";\n }\n\n return `<line x1=\"${from.x + 90}\" y1=\"${from.y + 15}\" x2=\"${to.x}\" y2=\"${to.y + 15}\" stroke=\"#94a3b8\" stroke-width=\"1.5\" marker-end=\"url(#arrow)\"/>`;\n })\n .join(\"\\n \");\n\n const nodeSvg = nodes\n .map(\n (n) =>\n `<g>\n <rect x=\"${n.x}\" y=\"${n.y}\" width=\"180\" height=\"30\" rx=\"6\" fill=\"${n.color}\" opacity=\"0.15\" stroke=\"${n.color}\" stroke-width=\"1.5\"/>\n <text x=\"${n.x + 90}\" y=\"${n.y + 19}\" text-anchor=\"middle\" font-size=\"12\" font-family=\"monospace\" fill=\"${n.color}\">${escapeHtml(n.label)}</text>\n </g>`,\n )\n .join(\"\\n \");\n\n // Column headers\n const headers = [\"Facts\", \"Constraints\", \"Requirements\", \"Resolvers\"];\n const headerSvg = headers\n .map(\n (h, i) =>\n `<text x=\"${startX + i * colWidth + 90}\" y=\"35\" text-anchor=\"middle\" font-size=\"14\" font-weight=\"bold\" font-family=\"system-ui\" fill=\"#e2e8f0\">${h}</text>`,\n )\n .join(\"\\n \");\n\n return `<!DOCTYPE html>\n<html>\n<head>\n <title>Directive System Graph</title>\n <style>\n body { margin: 0; background: #0f172a; display: flex; justify-content: center; padding: 20px; }\n svg { max-width: 100%; }\n </style>\n</head>\n<body>\n <svg width=\"${svgWidth}\" height=\"${maxY}\" xmlns=\"http://www.w3.org/2000/svg\">\n <defs>\n <marker id=\"arrow\" viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"6\" markerHeight=\"6\" orient=\"auto-start-reverse\">\n <path d=\"M 0 0 L 10 5 L 0 10 z\" fill=\"#94a3b8\"/>\n </marker>\n </defs>\n ${headerSvg}\n ${edgeSvg}\n ${nodeSvg}\n </svg>\n</body>\n</html>`;\n}\n\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\");\n}\n\n// ---------------------------------------------------------------------------\n// Command\n// ---------------------------------------------------------------------------\n\nexport async function graphCommand(args: string[]) {\n const { filePath, opts } = parseArgs(args);\n\n if (!filePath) {\n console.error(\n \"Usage: directive graph <file> [--ascii] [--no-open] [--output <path>]\",\n );\n process.exit(1);\n }\n\n const system = await loadSystem(filePath);\n\n if (!system.isRunning) {\n system.start();\n }\n\n const inspection = system.inspect();\n\n if (opts.ascii) {\n console.log(renderAsciiGraph(inspection));\n system.stop();\n\n return;\n }\n\n // HTML output\n const factsObj: Record<string, unknown> = {};\n if (system.facts) {\n for (const key of Object.keys(system.facts)) {\n try {\n factsObj[key] = system.facts[key];\n } catch {\n factsObj[key] = null;\n }\n }\n }\n\n const html = renderHtmlGraph(inspection, factsObj);\n const outputPath =\n opts.output || join(process.cwd(), \".directive-graph.html\");\n\n writeFileSync(outputPath, html, \"utf-8\");\n console.log(`${pc.green(\"Generated\")} ${pc.dim(outputPath)}`);\n\n if (opts.open) {\n try {\n const { execFile } = await import(\"node:child_process\");\n const openCmd =\n process.platform === \"darwin\"\n ? \"open\"\n : process.platform === \"win32\"\n ? \"start\"\n : \"xdg-open\";\n execFile(openCmd, [outputPath]);\n console.log(pc.dim(\"Opened in browser.\"));\n } catch {\n console.log(\n pc.dim(`Open ${outputPath} in your browser to view the graph.`),\n );\n }\n }\n\n system.stop();\n}\n","import { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, join, relative } from \"node:path\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { CLI_NAME } from \"../lib/constants.js\";\n\ninterface InitOptions {\n template?: string;\n dir: string;\n noInteractive: boolean;\n}\n\nfunction parseArgs(args: string[]): InitOptions {\n const opts: InitOptions = {\n dir: process.cwd(),\n noInteractive: false,\n };\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n\n switch (arg) {\n case \"--template\": {\n const val = args[++i];\n if (val) {\n opts.template = val;\n }\n break;\n }\n case \"--dir\": {\n const val = args[++i];\n if (val) {\n opts.dir = val;\n }\n break;\n }\n case \"--no-interactive\":\n opts.noInteractive = true;\n break;\n }\n }\n\n return opts;\n}\n\n// ---------------------------------------------------------------------------\n// Package manager detection\n// ---------------------------------------------------------------------------\n\ntype PackageManager = \"pnpm\" | \"npm\" | \"yarn\" | \"bun\";\n\nfunction detectPackageManager(dir: string): PackageManager {\n if (existsSync(join(dir, \"pnpm-lock.yaml\"))) {\n return \"pnpm\";\n }\n if (existsSync(join(dir, \"bun.lockb\")) || existsSync(join(dir, \"bun.lock\"))) {\n return \"bun\";\n }\n if (existsSync(join(dir, \"yarn.lock\"))) {\n return \"yarn\";\n }\n\n return \"npm\";\n}\n\nfunction installCmd(pm: PackageManager, pkg: string): string {\n switch (pm) {\n case \"pnpm\":\n return `pnpm add ${pkg}`;\n case \"yarn\":\n return `yarn add ${pkg}`;\n case \"bun\":\n return `bun add ${pkg}`;\n default:\n return `npm install ${pkg}`;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Templates\n// ---------------------------------------------------------------------------\n\ntype TemplateId = \"counter\" | \"auth-flow\" | \"ai-orchestrator\";\n\ninterface TemplateConfig {\n id: TemplateId;\n label: string;\n hint: string;\n files: Array<{ path: string; content: string }>;\n deps: string[];\n}\n\nfunction getTemplates(moduleName: string): Record<TemplateId, TemplateConfig> {\n return {\n counter: {\n id: \"counter\",\n label: \"Counter (minimal)\",\n hint: \"schema + init + derive + events — simplest starting point\",\n files: [\n {\n path: `src/${moduleName}.ts`,\n content: generateCounterModule(moduleName),\n },\n {\n path: \"src/main.ts\",\n content: generateCounterMain(moduleName),\n },\n ],\n deps: [\"@directive-run/core\"],\n },\n \"auth-flow\": {\n id: \"auth-flow\",\n label: \"Auth flow (constraints + resolvers)\",\n hint: \"login flow with constraints, resolvers, retry, and effects\",\n files: [\n {\n path: `src/${moduleName}.ts`,\n content: generateAuthModule(moduleName),\n },\n {\n path: \"src/main.ts\",\n content: generateAuthMain(moduleName),\n },\n ],\n deps: [\"@directive-run/core\"],\n },\n \"ai-orchestrator\": {\n id: \"ai-orchestrator\",\n label: \"AI orchestrator\",\n hint: \"agent orchestrator with guardrails and streaming\",\n files: [\n {\n path: `src/${moduleName}.ts`,\n content: generateAIModule(moduleName),\n },\n {\n path: \"src/main.ts\",\n content: generateAIMain(moduleName),\n },\n ],\n deps: [\"@directive-run/core\", \"@directive-run/ai\"],\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Template generators\n// ---------------------------------------------------------------------------\n\nfunction generateCounterModule(name: string): string {\n const camelName = toCamelCase(name);\n\n return `import { type ModuleSchema, createModule, t } from \"@directive-run/core\";\n\nconst schema = {\n facts: {\n count: t.number(),\n label: t.string(),\n },\n derivations: {\n isEven: t.boolean(),\n display: t.string(),\n },\n events: {\n increment: {},\n decrement: {},\n reset: {},\n setLabel: { value: t.string() },\n },\n} satisfies ModuleSchema;\n\nexport const ${camelName} = createModule(\"${name}\", {\n schema,\n\n init: (facts) => {\n facts.count = 0;\n facts.label = \"${name}\";\n },\n\n derive: {\n isEven: (facts) => facts.count % 2 === 0,\n display: (facts) => \\`\\${facts.label}: \\${facts.count}\\`,\n },\n\n events: {\n increment: (facts) => {\n facts.count++;\n },\n decrement: (facts) => {\n facts.count--;\n },\n reset: (facts) => {\n facts.count = 0;\n },\n setLabel: (facts, { value }) => {\n facts.label = value;\n },\n },\n});\n`;\n}\n\nfunction generateCounterMain(name: string): string {\n const camelName = toCamelCase(name);\n\n return `import { createSystem } from \"@directive-run/core\";\nimport { ${camelName} } from \"./${name}.js\";\n\nconst system = createSystem({\n module: ${camelName},\n});\n\nsystem.start();\n\n// Read facts and derivations\nconsole.log(\"count:\", system.facts.count);\nconsole.log(\"display:\", system.read(\"display\"));\n\n// Dispatch events\nsystem.events.increment();\nconsole.log(\"after increment:\", system.facts.count);\n\n// Subscribe to changes\nsystem.subscribe([\"count\"], () => {\n console.log(\"count changed:\", system.facts.count);\n});\n\nsystem.events.increment();\nsystem.events.increment();\n\nexport default system;\n`;\n}\n\nfunction generateAuthModule(name: string): string {\n const camelName = toCamelCase(name);\n\n return `import { type ModuleSchema, createModule, t } from \"@directive-run/core\";\n\ntype AuthStatus = \"idle\" | \"authenticating\" | \"authenticated\" | \"expired\";\n\nconst schema = {\n facts: {\n email: t.string(),\n password: t.string(),\n token: t.string(),\n status: t.string<AuthStatus>(),\n error: t.string(),\n },\n derivations: {\n isAuthenticated: t.boolean(),\n canLogin: t.boolean(),\n },\n events: {\n setEmail: { value: t.string() },\n setPassword: { value: t.string() },\n requestLogin: {},\n logout: {},\n },\n requirements: {\n LOGIN: { email: t.string(), password: t.string() },\n },\n} satisfies ModuleSchema;\n\nexport const ${camelName} = createModule(\"${name}\", {\n schema,\n\n init: (facts) => {\n facts.email = \"\";\n facts.password = \"\";\n facts.token = \"\";\n facts.status = \"idle\";\n facts.error = \"\";\n },\n\n derive: {\n isAuthenticated: (facts) => facts.status === \"authenticated\",\n canLogin: (facts) => {\n return (\n facts.email.trim() !== \"\" &&\n facts.password.trim() !== \"\" &&\n (facts.status === \"idle\" || facts.status === \"expired\")\n );\n },\n },\n\n events: {\n setEmail: (facts, { value }) => {\n facts.email = value;\n },\n setPassword: (facts, { value }) => {\n facts.password = value;\n },\n requestLogin: (facts) => {\n facts.status = \"authenticating\";\n facts.error = \"\";\n },\n logout: (facts) => {\n facts.token = \"\";\n facts.status = \"idle\";\n },\n },\n\n constraints: {\n needsLogin: {\n priority: 100,\n when: (facts) => facts.status === \"authenticating\",\n require: (facts) => ({\n type: \"LOGIN\",\n email: facts.email,\n password: facts.password,\n }),\n },\n },\n\n resolvers: {\n login: {\n requirement: \"LOGIN\",\n retry: { attempts: 2, backoff: \"exponential\" },\n resolve: async (req, context) => {\n // Replace with real auth API call\n await new Promise((resolve) => setTimeout(resolve, 500));\n\n const token = \\`token_\\${Date.now()}\\`;\n context.facts.token = token;\n context.facts.status = \"authenticated\";\n },\n },\n },\n\n effects: {\n logStatusChange: {\n deps: [\"status\"],\n run: (facts, prev) => {\n if (prev && prev.status !== facts.status) {\n console.log(\\`Auth status: \\${prev.status} → \\${facts.status}\\`);\n }\n },\n },\n },\n});\n`;\n}\n\nfunction generateAuthMain(name: string): string {\n const camelName = toCamelCase(name);\n\n return `import { createSystem } from \"@directive-run/core\";\nimport { ${camelName} } from \"./${name}.js\";\n\nconst system = createSystem({\n module: ${camelName},\n});\n\nsystem.start();\n\n// Set credentials and login\nsystem.events.setEmail({ value: \"user@example.com\" });\nsystem.events.setPassword({ value: \"password123\" });\nsystem.events.requestLogin();\n\n// Wait for auth to complete\nawait system.settle();\n\nconsole.log(\"authenticated:\", system.read(\"isAuthenticated\"));\nconsole.log(\"token:\", system.facts.token);\n\nexport default system;\n`;\n}\n\nfunction generateAIModule(name: string): string {\n const camelName = toCamelCase(name);\n\n return `import { type ModuleSchema, createModule, t } from \"@directive-run/core\";\nimport {\n createAgentOrchestrator,\n createAgentMemory,\n createSlidingWindowStrategy,\n} from \"@directive-run/ai\";\n\n// ============================================================================\n// Module — state management\n// ============================================================================\n\ntype AgentStatus = \"idle\" | \"thinking\" | \"done\" | \"error\";\n\nconst schema = {\n facts: {\n input: t.string(),\n output: t.string(),\n status: t.string<AgentStatus>(),\n error: t.string(),\n },\n derivations: {\n isThinking: t.boolean(),\n hasOutput: t.boolean(),\n },\n events: {\n setInput: { value: t.string() },\n requestRun: {},\n reset: {},\n },\n requirements: {\n RUN_AGENT: { input: t.string() },\n },\n} satisfies ModuleSchema;\n\nexport const ${camelName} = createModule(\"${name}\", {\n schema,\n\n init: (facts) => {\n facts.input = \"\";\n facts.output = \"\";\n facts.status = \"idle\";\n facts.error = \"\";\n },\n\n derive: {\n isThinking: (facts) => facts.status === \"thinking\",\n hasOutput: (facts) => facts.output !== \"\",\n },\n\n events: {\n setInput: (facts, { value }) => {\n facts.input = value;\n },\n requestRun: (facts) => {\n facts.status = \"thinking\";\n facts.output = \"\";\n facts.error = \"\";\n },\n reset: (facts) => {\n facts.input = \"\";\n facts.output = \"\";\n facts.status = \"idle\";\n facts.error = \"\";\n },\n },\n\n constraints: {\n needsRun: {\n priority: 100,\n when: (facts) => facts.status === \"thinking\",\n require: (facts) => ({\n type: \"RUN_AGENT\",\n input: facts.input,\n }),\n },\n },\n\n resolvers: {\n runAgent: {\n requirement: \"RUN_AGENT\",\n timeout: 30000,\n resolve: async (req, context) => {\n // Replace with your agent runner (e.g., Anthropic, OpenAI)\n const result = \\`Echo: \\${req.input}\\`;\n\n context.facts.output = result;\n context.facts.status = \"done\";\n },\n },\n },\n});\n\n// ============================================================================\n// Orchestrator — optional AI features\n// ============================================================================\n\nexport const memory = createAgentMemory({\n strategy: createSlidingWindowStrategy(),\n strategyConfig: { maxMessages: 30, preserveRecentCount: 6 },\n autoManage: true,\n});\n\n// Uncomment to add orchestrator features:\n// export const orchestrator = createAgentOrchestrator({\n// runner: yourAgentRunner,\n// maxTokenBudget: 50000,\n// memory,\n// });\n`;\n}\n\nfunction generateAIMain(name: string): string {\n const camelName = toCamelCase(name);\n\n return `import { createSystem } from \"@directive-run/core\";\nimport { ${camelName} } from \"./${name}.js\";\n\nconst system = createSystem({\n module: ${camelName},\n});\n\nsystem.start();\n\n// Set input and run\nsystem.events.setInput({ value: \"Hello, world!\" });\nsystem.events.requestRun();\n\n// Wait for completion\nawait system.settle();\n\nconsole.log(\"output:\", system.facts.output);\n\nexport default system;\n`;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction toCamelCase(name: string): string {\n return name.replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n}\n\nfunction writeFile(filePath: string, content: string) {\n const dir = dirname(filePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(filePath, content, \"utf-8\");\n}\n\n// ---------------------------------------------------------------------------\n// Command\n// ---------------------------------------------------------------------------\n\nexport async function initCommand(args: string[]) {\n const opts = parseArgs(args);\n\n p.intro(pc.bgCyan(pc.black(\" directive init \")));\n\n // Step 1: Project name\n let moduleName: string;\n\n if (opts.noInteractive) {\n moduleName = \"my-module\";\n } else {\n const nameResult = await p.text({\n message: \"Module name:\",\n placeholder: \"my-module\",\n defaultValue: \"my-module\",\n validate: (val) => {\n if (!/^[a-z][a-z0-9-]*$/.test(val)) {\n return \"Must start with a letter, use lowercase letters, numbers, and hyphens\";\n }\n },\n });\n\n if (p.isCancel(nameResult)) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n\n moduleName = nameResult;\n }\n\n // Step 2: Template selection\n let templateId: TemplateId;\n\n if (opts.template) {\n const templates = getTemplates(moduleName);\n if (!(opts.template in templates)) {\n p.log.error(\n `Unknown template: ${opts.template}. Available: ${Object.keys(templates).join(\", \")}`,\n );\n process.exit(1);\n }\n templateId = opts.template as TemplateId;\n } else if (opts.noInteractive) {\n templateId = \"counter\";\n } else {\n const templates = getTemplates(moduleName);\n const choice = await p.select({\n message: \"Project template:\",\n options: Object.values(templates).map((t) => ({\n value: t.id,\n label: t.label,\n hint: t.hint,\n })),\n });\n\n if (p.isCancel(choice)) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n\n templateId = choice as TemplateId;\n }\n\n const templates = getTemplates(moduleName);\n const template = templates[templateId];\n\n // Step 3: Detect package manager\n const pm = detectPackageManager(opts.dir);\n p.log.info(`Package manager: ${pc.cyan(pm)}`);\n\n // Step 4: Write files\n const s = p.spinner();\n s.start(\"Creating project files...\");\n\n let created = 0;\n let skipped = 0;\n\n for (const file of template.files) {\n const filePath = join(opts.dir, file.path);\n\n if (existsSync(filePath)) {\n skipped++;\n continue;\n }\n\n writeFile(filePath, file.content);\n created++;\n }\n\n s.stop(\"Project files created.\");\n\n for (const file of template.files) {\n const filePath = join(opts.dir, file.path);\n const rel = relative(opts.dir, filePath);\n\n if (existsSync(filePath)) {\n p.log.success(`${pc.green(\"Created\")} ${pc.dim(rel)}`);\n }\n }\n\n if (skipped > 0) {\n p.log.warn(`Skipped ${skipped} file(s) that already exist.`);\n }\n\n // Step 5: Show next steps\n const depsCmd = installCmd(pm, template.deps.join(\" \"));\n\n p.outro(\n `Next steps:\\n` +\n ` ${pc.cyan(depsCmd)}\\n` +\n ` ${pc.cyan(`${CLI_NAME} ai-rules init`)}\\n` +\n ` ${pc.dim(\"Start building!\")}`,\n );\n}\n","import pc from \"picocolors\";\nimport { loadSystem } from \"../lib/loader.js\";\n\ninterface InspectOptions {\n json: boolean;\n module?: string;\n}\n\nfunction parseArgs(args: string[]): { filePath: string; opts: InspectOptions } {\n const opts: InspectOptions = { json: false };\n let filePath = \"\";\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n\n switch (arg) {\n case \"--json\":\n opts.json = true;\n break;\n case \"--module\": {\n const val = args[++i];\n if (val) {\n opts.module = val;\n }\n break;\n }\n default:\n if (arg && !arg.startsWith(\"-\") && !filePath) {\n filePath = arg;\n }\n }\n }\n\n return { filePath, opts };\n}\n\n// ---------------------------------------------------------------------------\n// Formatters\n// ---------------------------------------------------------------------------\n\nfunction formatFacts(facts: Record<string, unknown>): string {\n const lines: string[] = [];\n lines.push(pc.bold(\"Facts:\"));\n\n const entries = Object.entries(facts);\n if (entries.length === 0) {\n lines.push(\" (none)\");\n\n return lines.join(\"\\n\");\n }\n\n for (const [key, value] of entries) {\n const formatted = formatValue(value);\n lines.push(` ${pc.cyan(key)} = ${formatted}`);\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction formatConstraints(\n constraints: Array<{\n id: string;\n active: boolean;\n disabled: boolean;\n priority: number;\n hitCount: number;\n lastActiveAt: number | null;\n }>,\n): string {\n const lines: string[] = [];\n lines.push(pc.bold(\"Constraints:\"));\n\n if (constraints.length === 0) {\n lines.push(\" (none)\");\n\n return lines.join(\"\\n\");\n }\n\n for (const c of constraints) {\n const status = c.disabled\n ? pc.dim(\"disabled\")\n : c.active\n ? pc.green(\"active\")\n : pc.dim(\"inactive\");\n const hits = c.hitCount > 0 ? pc.yellow(` (${c.hitCount} hits)`) : \"\";\n lines.push(` ${pc.cyan(c.id)} ${status} priority=${c.priority}${hits}`);\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction formatResolverDefs(\n resolverDefs: Array<{ id: string; requirement: string }>,\n resolvers: Record<\n string,\n { state: string; error?: string; duration?: number }\n >,\n): string {\n const lines: string[] = [];\n lines.push(pc.bold(\"Resolvers:\"));\n\n if (resolverDefs.length === 0) {\n lines.push(\" (none)\");\n\n return lines.join(\"\\n\");\n }\n\n for (const def of resolverDefs) {\n const status = resolvers[def.id];\n const stateStr = status\n ? formatResolverState(status.state, status.error, status.duration)\n : pc.dim(\"idle\");\n lines.push(` ${pc.cyan(def.id)} → ${def.requirement} ${stateStr}`);\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction formatUnmet(\n unmet: Array<{\n id: string;\n requirement: { type: string };\n fromConstraint: string;\n }>,\n): string {\n const lines: string[] = [];\n lines.push(pc.bold(\"Unmet Requirements:\"));\n\n if (unmet.length === 0) {\n lines.push(` ${pc.green(\"(all requirements met)\")}`);\n\n return lines.join(\"\\n\");\n }\n\n for (const u of unmet) {\n lines.push(\n ` ${pc.yellow(u.requirement.type)} (id: ${pc.dim(u.id)}) from ${pc.dim(u.fromConstraint)}`,\n );\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction formatInflight(\n inflight: Array<{ id: string; resolverId: string; startedAt: number }>,\n): string {\n const lines: string[] = [];\n lines.push(pc.bold(\"Inflight:\"));\n\n if (inflight.length === 0) {\n lines.push(` ${pc.green(\"(none)\")}`);\n\n return lines.join(\"\\n\");\n }\n\n const now = Date.now();\n for (const inf of inflight) {\n const elapsed = now - inf.startedAt;\n lines.push(\n ` ${pc.cyan(inf.resolverId)} → req ${pc.dim(inf.id)} ${pc.yellow(`${elapsed}ms`)}`,\n );\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction formatResolverState(\n state: string,\n error?: string,\n duration?: number,\n): string {\n const dur = duration !== undefined ? ` ${duration}ms` : \"\";\n\n switch (state) {\n case \"resolved\":\n return pc.green(`resolved${dur}`);\n case \"errored\":\n return pc.red(`errored${dur}${error ? ` — ${error}` : \"\"}`);\n case \"inflight\":\n return pc.yellow(\"inflight\");\n case \"cancelled\":\n return pc.dim(\"cancelled\");\n default:\n return pc.dim(state);\n }\n}\n\nfunction formatValue(value: unknown): string {\n if (value === null) {\n return pc.dim(\"null\");\n }\n if (value === undefined) {\n return pc.dim(\"undefined\");\n }\n if (typeof value === \"string\") {\n return value.length > 60 ? `\"${value.slice(0, 57)}...\"` : `\"${value}\"`;\n }\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n if (Array.isArray(value)) {\n return `[${value.length} items]`;\n }\n\n return JSON.stringify(value).slice(0, 60);\n}\n\n// ---------------------------------------------------------------------------\n// Warnings\n// ---------------------------------------------------------------------------\n\nfunction findWarnings(inspection: {\n resolverDefs: Array<{ id: string; requirement: string }>;\n constraints: Array<{ id: string; active: boolean; disabled: boolean }>;\n unmet: Array<{ requirement: { type: string } }>;\n}): string[] {\n const warnings: string[] = [];\n\n // Orphaned resolvers: resolver handles a type no constraint emits\n const constraintTypes = new Set<string>();\n // We can't know constraint requirement types from inspection alone,\n // but we can check unmet requirements\n const unmetTypes = new Set(inspection.unmet.map((u) => u.requirement.type));\n const resolverTypes = new Set(\n inspection.resolverDefs.map((r) => r.requirement),\n );\n\n // Resolver types not in unmet — might be orphaned (can't be sure without full constraint analysis)\n for (const def of inspection.resolverDefs) {\n if (def.requirement === \"(predicate)\") {\n continue;\n }\n }\n\n // Unmet requirements with no matching resolver\n for (const u of inspection.unmet) {\n const hasResolver = inspection.resolverDefs.some(\n (r) =>\n r.requirement === u.requirement.type || r.requirement === \"(predicate)\",\n );\n if (!hasResolver) {\n warnings.push(`No resolver for requirement type \"${u.requirement.type}\"`);\n }\n }\n\n return warnings;\n}\n\n// ---------------------------------------------------------------------------\n// Command\n// ---------------------------------------------------------------------------\n\nexport async function inspectCommand(args: string[]) {\n const { filePath, opts } = parseArgs(args);\n\n if (!filePath) {\n console.error(\"Usage: directive inspect <file> [--json] [--module <name>]\");\n process.exit(1);\n }\n\n const system = await loadSystem(filePath);\n\n if (!system.isRunning) {\n system.start();\n }\n\n const inspection = system.inspect();\n\n if (opts.json) {\n // Get facts as plain object\n const factsObj: Record<string, unknown> = {};\n if (system.facts) {\n for (const key of Object.keys(system.facts)) {\n try {\n factsObj[key] = system.facts[key];\n } catch {\n factsObj[key] = \"(error reading)\";\n }\n }\n }\n\n console.log(\n JSON.stringify(\n {\n facts: factsObj,\n ...inspection,\n },\n null,\n 2,\n ),\n );\n\n system.stop();\n\n return;\n }\n\n // Pretty output\n console.log();\n console.log(pc.bold(pc.cyan(\"Directive System Inspection\")));\n console.log(pc.dim(\"─\".repeat(40)));\n console.log();\n\n // Facts\n const factsObj: Record<string, unknown> = {};\n if (system.facts) {\n for (const key of Object.keys(system.facts)) {\n try {\n factsObj[key] = system.facts[key];\n } catch {\n factsObj[key] = \"(error reading)\";\n }\n }\n }\n console.log(formatFacts(factsObj));\n console.log();\n\n // Constraints\n console.log(formatConstraints(inspection.constraints));\n console.log();\n\n // Resolvers\n console.log(\n formatResolverDefs(inspection.resolverDefs, inspection.resolvers),\n );\n console.log();\n\n // Unmet requirements\n console.log(formatUnmet(inspection.unmet));\n console.log();\n\n // Inflight\n if (inspection.inflight.length > 0) {\n console.log(formatInflight(inspection.inflight));\n console.log();\n }\n\n // Warnings\n const warnings = findWarnings(inspection);\n if (warnings.length > 0) {\n console.log(pc.bold(pc.yellow(\"Warnings:\")));\n for (const w of warnings) {\n console.log(` ${pc.yellow(\"⚠\")} ${w}`);\n }\n console.log();\n }\n\n system.stop();\n}\n","import { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, join, relative } from \"node:path\";\nimport pc from \"picocolors\";\n\ninterface NewOptions {\n with: string[];\n minimal: boolean;\n dir: string;\n}\n\nfunction parseArgs(args: string[]): NewOptions {\n const opts: NewOptions = {\n with: [],\n minimal: false,\n dir: process.cwd(),\n };\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n\n switch (arg) {\n case \"--with\": {\n const val = args[++i];\n if (val) {\n opts.with = val.split(\",\").map((s) => s.trim());\n }\n break;\n }\n case \"--minimal\":\n opts.minimal = true;\n break;\n case \"--dir\": {\n const val = args[++i];\n if (val) {\n opts.dir = val;\n }\n break;\n }\n }\n }\n\n return opts;\n}\n\n// ---------------------------------------------------------------------------\n// Module generator\n// ---------------------------------------------------------------------------\n\ntype Section = \"derive\" | \"events\" | \"constraints\" | \"resolvers\" | \"effects\";\n\nconst ALL_SECTIONS: Section[] = [\n \"derive\",\n \"events\",\n \"constraints\",\n \"resolvers\",\n \"effects\",\n];\n\nfunction generateModule(name: string, sections: Section[]): string {\n const camelName = toCamelCase(name);\n const hasConstraints = sections.includes(\"constraints\");\n const hasResolvers = sections.includes(\"resolvers\");\n\n const imports = [\"type ModuleSchema\", \"createModule\", \"t\"];\n\n let code = `import { ${imports.join(\", \")} } from \"@directive-run/core\";\\n\\n`;\n\n // Schema\n code += `const schema = {\\n`;\n code += ` facts: {\\n`;\n code += ` // Add your facts here\\n`;\n code += ` status: t.string(),\\n`;\n code += ` },\\n`;\n\n if (sections.includes(\"derive\")) {\n code += ` derivations: {\\n`;\n code += ` // Add derivation types here\\n`;\n code += ` isReady: t.boolean(),\\n`;\n code += ` },\\n`;\n }\n\n if (sections.includes(\"events\")) {\n code += ` events: {\\n`;\n code += ` // Add event shapes here\\n`;\n code += ` setStatus: { value: t.string() },\\n`;\n code += ` },\\n`;\n }\n\n if (hasConstraints || hasResolvers) {\n code += ` requirements: {\\n`;\n code += ` // Add requirement shapes here\\n`;\n code += ` PROCESS: { input: t.string() },\\n`;\n code += ` },\\n`;\n }\n\n code += `} satisfies ModuleSchema;\\n\\n`;\n\n // Module\n code += `export const ${camelName} = createModule(\"${name}\", {\\n`;\n code += ` schema,\\n\\n`;\n\n code += ` init: (facts) => {\\n`;\n code += ` facts.status = \"idle\";\\n`;\n code += ` },\\n`;\n\n if (sections.includes(\"derive\")) {\n code += `\\n derive: {\\n`;\n code += ` isReady: (facts) => facts.status === \"ready\",\\n`;\n code += ` },\\n`;\n }\n\n if (sections.includes(\"events\")) {\n code += `\\n events: {\\n`;\n code += ` setStatus: (facts, { value }) => {\\n`;\n code += ` facts.status = value;\\n`;\n code += ` },\\n`;\n code += ` },\\n`;\n }\n\n if (hasConstraints) {\n code += `\\n constraints: {\\n`;\n code += ` needsProcessing: {\\n`;\n code += ` priority: 100,\\n`;\n code += ` when: (facts) => facts.status === \"pending\",\\n`;\n code += ` require: (facts) => ({\\n`;\n code += ` type: \"PROCESS\",\\n`;\n code += ` input: facts.status,\\n`;\n code += ` }),\\n`;\n code += ` },\\n`;\n code += ` },\\n`;\n }\n\n if (hasResolvers) {\n code += `\\n resolvers: {\\n`;\n code += ` process: {\\n`;\n code += ` requirement: \"PROCESS\",\\n`;\n code += ` resolve: async (req, context) => {\\n`;\n code += ` // Implement resolution logic here\\n`;\n code += ` context.facts.status = \"done\";\\n`;\n code += ` },\\n`;\n code += ` },\\n`;\n code += ` },\\n`;\n }\n\n if (sections.includes(\"effects\")) {\n code += `\\n effects: {\\n`;\n code += ` logChange: {\\n`;\n code += ` deps: [\"status\"],\\n`;\n code += ` run: (facts, prev) => {\\n`;\n code += ` if (prev && prev.status !== facts.status) {\\n`;\n code += ` console.log(\\`Status: \\${prev.status} → \\${facts.status}\\`);\\n`;\n code += ` }\\n`;\n code += ` },\\n`;\n code += ` },\\n`;\n code += ` },\\n`;\n }\n\n code += `});\\n`;\n\n return code;\n}\n\n// ---------------------------------------------------------------------------\n// Orchestrator generator\n// ---------------------------------------------------------------------------\n\nfunction generateOrchestrator(name: string): string {\n const camelName = toCamelCase(name);\n\n return `import { type ModuleSchema, createModule, createSystem, t } from \"@directive-run/core\";\nimport {\n createAgentOrchestrator,\n createAgentMemory,\n createSlidingWindowStrategy,\n} from \"@directive-run/ai\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\ntype AgentStatus = \"idle\" | \"thinking\" | \"done\" | \"error\";\n\n// ============================================================================\n// Schema\n// ============================================================================\n\nconst schema = {\n facts: {\n input: t.string(),\n output: t.string(),\n status: t.string<AgentStatus>(),\n error: t.string(),\n totalTokens: t.number(),\n },\n derivations: {\n isThinking: t.boolean(),\n hasOutput: t.boolean(),\n },\n events: {\n setInput: { value: t.string() },\n requestRun: {},\n reset: {},\n },\n requirements: {\n RUN_AGENT: { input: t.string() },\n },\n} satisfies ModuleSchema;\n\n// ============================================================================\n// Module\n// ============================================================================\n\nexport const ${camelName} = createModule(\"${name}\", {\n schema,\n\n init: (facts) => {\n facts.input = \"\";\n facts.output = \"\";\n facts.status = \"idle\";\n facts.error = \"\";\n facts.totalTokens = 0;\n },\n\n derive: {\n isThinking: (facts) => facts.status === \"thinking\",\n hasOutput: (facts) => facts.output !== \"\",\n },\n\n events: {\n setInput: (facts, { value }) => {\n facts.input = value;\n },\n requestRun: (facts) => {\n facts.status = \"thinking\";\n facts.output = \"\";\n facts.error = \"\";\n },\n reset: (facts) => {\n facts.input = \"\";\n facts.output = \"\";\n facts.status = \"idle\";\n facts.error = \"\";\n facts.totalTokens = 0;\n },\n },\n\n constraints: {\n needsRun: {\n priority: 100,\n when: (facts) => facts.status === \"thinking\",\n require: (facts) => ({\n type: \"RUN_AGENT\",\n input: facts.input,\n }),\n },\n },\n\n resolvers: {\n runAgent: {\n requirement: \"RUN_AGENT\",\n timeout: 30000,\n resolve: async (req, context) => {\n // TODO: Replace with your agent runner\n const result = \\`Echo: \\${req.input}\\`;\n\n context.facts.output = result;\n context.facts.status = \"done\";\n },\n },\n },\n});\n\n// ============================================================================\n// AI Features\n// ============================================================================\n\nexport const memory = createAgentMemory({\n strategy: createSlidingWindowStrategy(),\n strategyConfig: { maxMessages: 30, preserveRecentCount: 6 },\n autoManage: true,\n});\n\n// TODO: Add your agent runner and configure the orchestrator\n// export const orchestrator = createAgentOrchestrator({\n// runner: yourAgentRunner,\n// maxTokenBudget: 50000,\n// memory,\n// guardrails: {\n// input: [],\n// output: [],\n// },\n// });\n\n// ============================================================================\n// System\n// ============================================================================\n\nexport const system = createSystem({\n module: ${camelName},\n});\n`;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction toCamelCase(name: string): string {\n return name.replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n}\n\nfunction writeFile(filePath: string, content: string) {\n const dir = dirname(filePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(filePath, content, \"utf-8\");\n}\n\nfunction findModulesDir(dir: string): string {\n return join(dir, \"src\");\n}\n\n// ---------------------------------------------------------------------------\n// Commands\n// ---------------------------------------------------------------------------\n\nexport async function newModuleCommand(name: string, args: string[]) {\n const opts = parseArgs(args);\n\n if (!name || !/^[a-z][a-z0-9-]*$/.test(name)) {\n console.error(\n `Invalid module name: ${name || \"(none)\"}\\n` +\n \"Must start with a letter, use lowercase letters, numbers, and hyphens.\",\n );\n process.exit(1);\n }\n\n let sections: Section[];\n\n if (opts.minimal) {\n sections = [];\n } else if (opts.with.length > 0) {\n sections = opts.with.filter((s) =>\n ALL_SECTIONS.includes(s as Section),\n ) as Section[];\n } else {\n sections = ALL_SECTIONS;\n }\n\n const targetDir = findModulesDir(opts.dir);\n const filePath = join(targetDir, `${name}.ts`);\n\n if (existsSync(filePath)) {\n console.error(`File already exists: ${relative(opts.dir, filePath)}`);\n process.exit(1);\n }\n\n const content = generateModule(name, sections);\n writeFile(filePath, content);\n\n const rel = relative(opts.dir, filePath);\n console.log(`${pc.green(\"Created\")} ${pc.dim(rel)}`);\n\n if (sections.length === 0) {\n console.log(pc.dim(\" Minimal module (schema + init only)\"));\n } else {\n console.log(pc.dim(` Sections: ${sections.join(\", \")}`));\n }\n}\n\nexport async function newOrchestratorCommand(name: string, args: string[]) {\n const opts = parseArgs(args);\n\n if (!name || !/^[a-z][a-z0-9-]*$/.test(name)) {\n console.error(\n `Invalid orchestrator name: ${name || \"(none)\"}\\n` +\n \"Must start with a letter, use lowercase letters, numbers, and hyphens.\",\n );\n process.exit(1);\n }\n\n const targetDir = findModulesDir(opts.dir);\n const filePath = join(targetDir, `${name}.ts`);\n\n if (existsSync(filePath)) {\n console.error(`File already exists: ${relative(opts.dir, filePath)}`);\n process.exit(1);\n }\n\n const content = generateOrchestrator(name);\n writeFile(filePath, content);\n\n const rel = relative(opts.dir, filePath);\n console.log(`${pc.green(\"Created\")} ${pc.dim(rel)}`);\n console.log(\n pc.dim(\" AI orchestrator with memory, guardrails, and streaming\"),\n );\n}\n","// Runtime check that bundlers (webpack, esbuild, turbopack, rollup) inline\n// based on the consumer's NODE_ENV. Without this, the published bundle bakes\n// in `true` and dev-mode validation runs in every consumer's production\n// build — a real footgun the v1.5/v1.6 release hit.\nexport default typeof process !== \"undefined\" &&\n process.env?.NODE_ENV !== \"production\";\n","/**\n * Dependency tracking context for auto-tracking derivations\n *\n * Uses a stack-based approach to handle nested derivation computations.\n * When a derivation accesses a fact, the tracking context records it.\n */\n\n/** Stack of active dependency sets (bare Sets for zero-allocation hot path) */\nconst depStack: Set<string>[] = [];\n\n/**\n * Get the current dependency set, or null if not tracking.\n *\n * @returns The active dependency Set, or `null` if no tracking is active.\n *\n * @internal\n */\nexport function getCurrentDeps(): Set<string> | null {\n const len = depStack.length;\n return len === 0 ? null : depStack[len - 1]!;\n}\n\n/**\n * Check if dependency tracking is currently active.\n *\n * @returns `true` if inside a {@link withTracking} call, `false` otherwise.\n *\n * @internal\n */\nexport function isTracking(): boolean {\n return depStack.length > 0;\n}\n\n/**\n * Run a function with dependency tracking.\n *\n * @remarks\n * Pushes a fresh Set onto the stack, executes `fn`, then pops it.\n * Any fact reads inside `fn` are recorded as dependencies.\n * Nesting is supported — inner calls get their own independent Set.\n *\n * @param fn - The function to execute under tracking.\n * @returns An object with the computed `value` and a `deps` Set of accessed\n * fact keys.\n *\n * @internal\n */\nexport function withTracking<T>(fn: () => T): { value: T; deps: Set<string> } {\n const deps = new Set<string>();\n depStack.push(deps);\n\n try {\n const value = fn();\n return { value, deps };\n } finally {\n depStack.pop();\n }\n}\n\n/**\n * Run a function without tracking.\n *\n * @remarks\n * Temporarily clears the tracking stack so that fact reads inside `fn` do\n * not register as dependencies. The stack is restored after `fn` returns\n * (even on error). Useful for side-effect reads that should not trigger\n * derivation invalidation.\n *\n * @param fn - The function to execute without tracking.\n * @returns The return value of `fn`.\n *\n * @internal\n */\nexport function withoutTracking<T>(fn: () => T): T {\n const saved = depStack.splice(0, depStack.length);\n\n try {\n return fn();\n } finally {\n for (const ctx of saved) {\n depStack.push(ctx);\n }\n }\n}\n\n/**\n * Track a specific key in the current context.\n *\n * @remarks\n * No-op if no tracking context is active.\n *\n * @param key - The fact key to record as a dependency.\n *\n * @internal\n */\nexport function trackAccess(key: string): void {\n const len = depStack.length;\n if (len === 0) {\n return;\n }\n depStack[len - 1]!.add(key);\n}\n\n/**\n * Prototype pollution guard — shared across all proxy handlers.\n *\n * @remarks\n * Contains `__proto__`, `constructor`, and `prototype`. Every proxy `get`\n * and `has` trap checks this set and returns `undefined` / `false` for\n * matching keys, preventing prototype pollution via proxy-based objects.\n *\n * @internal\n */\nexport const BLOCKED_PROPS: ReadonlySet<string> = Object.freeze(\n new Set([\"__proto__\", \"constructor\", \"prototype\"]),\n);\n\n// ============================================================================\n// Non-JSON value-type detection (MIGRATION_FEEDBACK item 20)\n// ============================================================================\n\n/**\n * Detect whether `value` is a non-JSON-roundtrippable type whose mutations\n * the facts proxy cannot track for reactivity.\n *\n * Returns the kind label (`\"Date\"`, `\"Set\"`, `\"Map\"`, `\"File\"`, or\n * `\"ClassInstance\"`) when one is detected, or `null` for plain objects,\n * arrays, primitives, and `null`/`undefined`.\n *\n * The `File` check is SSR-safe: if the runtime has no `File` global the\n * branch is skipped without throwing.\n *\n * The `ClassInstance` check fires for any object whose prototype is not\n * `Object.prototype` and which is not an array — e.g. instances of user\n * classes whose mutations bypass reactivity.\n *\n * @internal\n */\nexport function detectNonJsonValueType(value: unknown): string | null {\n if (value === null || typeof value !== \"object\") {\n return null;\n }\n if (value instanceof Date) {\n return \"Date\";\n }\n if (value instanceof Set) {\n return \"Set\";\n }\n if (value instanceof Map) {\n return \"Map\";\n }\n if (typeof File !== \"undefined\" && value instanceof File) {\n return \"File\";\n }\n // Plain objects and arrays are JSON-friendly.\n if (Array.isArray(value)) {\n return null;\n }\n // Class instances: prototype is not Object.prototype.\n // Plain `{}` literals have prototype `Object.prototype`; objects created\n // via `Object.create(null)` have a `null` prototype which we treat as\n // \"plain\" (it's still JSON-roundtrippable).\n const proto = Object.getPrototypeOf(value);\n if (proto !== null && proto !== Object.prototype) {\n return \"ClassInstance\";\n }\n\n return null;\n}\n\n/**\n * Per-(path, valueType) dedupe cache — once a warning fires for a given\n * combo we never re-emit. Keeps the dev console quiet under loops that\n * assign the same Date 100 times in a row.\n *\n * @internal\n */\nconst nonJsonWarningCache = new Set<string>();\n\nconst nonJsonHints: Record<string, string> = {\n Date: \".getTime() for timestamps\",\n Set: \"[...set] for arrays\",\n Map: \"Object.fromEntries(map) for plain objects\",\n File: \"{ name, size, type, lastModified } for metadata\",\n ClassInstance: \"a plain-object snapshot\",\n};\n\n/**\n * Emit a one-time dev-mode warning when a non-JSON value is assigned to a\n * fact. Called from the proxy `set` traps in both `createFactsProxy`\n * (single-module / standalone facts) and `createModuleFactsProxy`\n * (system-namespaced facts). No-ops in production builds — the call sites\n * are gated on `isDevelopment` so this entire helper is tree-shakable.\n *\n * @param factPath - Display path for the warning (e.g. `auth.token` or\n * bare `token` for non-namespaced stores).\n * @param valueType - The label returned from {@link detectNonJsonValueType}.\n *\n * @internal\n */\nexport function warnNonJsonFactAssignment(\n factPath: string,\n valueType: string,\n): void {\n const cacheKey = `${factPath}|${valueType}`;\n if (nonJsonWarningCache.has(cacheKey)) {\n return;\n }\n nonJsonWarningCache.add(cacheKey);\n\n const hint = nonJsonHints[valueType] ?? \"a JSON-roundtrippable value\";\n console.warn(\n `[Directive] Fact \"${factPath}\" assigned a ${valueType} instance.\\n` +\n `Facts must be JSON-roundtrippable for reactivity to work correctly.\\n` +\n `${valueType} mutations are not tracked.\\n` +\n `Use ${hint} instead.\\n` +\n `See: https://directive.run/docs/facts#json-rule`,\n );\n}\n\n/**\n * Reset the warning dedupe cache. Test-only — exported via internals for\n * vitest spec setup. Not part of the public API.\n *\n * @internal\n */\nexport function _resetNonJsonWarningCache(): void {\n nonJsonWarningCache.clear();\n}\n","/**\n * Data-configuration predicates and templates.\n *\n * A {@link FactPredicate} is a declarative, serializable boolean spec over a\n * module's fact namespace — the data form of a constraint `when`, an effect\n * `on`, or a boolean derivation. A {@link FactTemplate} is the value-producing\n * counterpart: a fact-interpolating string.\n *\n * Convention: `$` marks an operator/expression node inside a predicate or\n * template body (`$eq`, `$gte`, `$all`, `$template`, `$set`, `$ref`).\n * Definition arms (`compute`, `handler`, `patch`) stay sigil-free.\n *\n * Operators are `$`-prefixed so they can never collide with a fact key —\n * schema keys starting with `$` are rejected at registration.\n */\n\n// ============================================================================\n// Operators\n// ============================================================================\n\n/** Comparison operator names — the `$`-prefixed keys inside an operator object. */\nexport type PredicateOp =\n | \"$eq\"\n | \"$ne\"\n | \"$in\"\n | \"$nin\"\n | \"$exists\"\n | \"$gt\"\n | \"$gte\"\n | \"$lt\"\n | \"$lte\"\n | \"$between\"\n | \"$matches\"\n | \"$startsWith\"\n | \"$endsWith\"\n | \"$contains\"\n | \"$changed\";\n\n/** Combinator node keys. */\nexport type PredicateCombinatorKey = \"$all\" | \"$any\" | \"$not\";\n\n/**\n * Every reserved `$`-key recognized inside a predicate body.\n *\n * @internal\n */\nexport const PREDICATE_OPERATORS: ReadonlySet<string> = new Set<string>([\n \"$eq\",\n \"$ne\",\n \"$in\",\n \"$nin\",\n \"$exists\",\n \"$gt\",\n \"$gte\",\n \"$lt\",\n \"$lte\",\n \"$between\",\n \"$matches\",\n \"$startsWith\",\n \"$endsWith\",\n \"$contains\",\n \"$changed\",\n]);\n\n/**\n * Combinator keys, as a runtime set.\n *\n * @internal\n */\nexport const PREDICATE_COMBINATORS: ReadonlySet<string> = new Set<string>([\n \"$all\",\n \"$any\",\n \"$not\",\n]);\n\n// ============================================================================\n// Operator object\n// ============================================================================\n\n/**\n * `true` when `V` supports relational operators (`$gt` … `$between`).\n * `[V]` tuple-wrapping suppresses distribution over union-typed facts.\n */\ntype IsOrderable<V> = [V] extends [number | bigint | Date]\n ? true\n : [V] extends [string]\n ? true\n : false;\n\n/**\n * The operator object permitted for a fact of type `V`. Built as a\n * **per-operator union** (one operator per member) rather than an\n * intersection — a typo'd operator (`$eqq`) then matches no member and is a\n * compile error, and a relational operator on a non-orderable fact resolves\n * to `never`.\n *\n * One operator per object — for two operators on the same fact, write the\n * array form or `$all`. This is by design (the type is the source of truth).\n *\n * `$matches` requires `RegExp`. The runtime throws on string operands.\n *\n * @example\n * ```ts\n * const op1: OperatorObject<number> = { $gte: 30 };\n * const op2: OperatorObject<string> = { $matches: /^J/i };\n * const op3: OperatorObject<string> = { $in: [\"red\", \"yellow\"] };\n * const op4: OperatorObject<string> = { $startsWith: \"Ada\" };\n * const op5: OperatorObject<string> = { $endsWith: \".com\" };\n * ```\n */\nexport type OperatorObject<V> =\n | { $eq: V }\n | { $ne: V }\n | { $in: readonly V[] }\n | { $nin: readonly V[] }\n | { $exists: boolean }\n | { $changed: true }\n | (IsOrderable<V> extends true\n ?\n | { $gt: V }\n | { $gte: V }\n | { $lt: V }\n | { $lte: V }\n | { $between: readonly [V, V] }\n : never)\n | ([V] extends [string]\n ?\n | { $matches: RegExp }\n | { $contains: string }\n | { $startsWith: string }\n | { $endsWith: string }\n : never)\n | ([V] extends [readonly (infer E)[]] ? { $contains: E } : never);\n\n/**\n * The spec for a single fact key: a bare value (equality), an operator\n * object, or — for an object-typed fact — a nested predicate (partial match).\n */\ntype PredicateField<V> =\n | V\n | OperatorObject<V>\n | ([V] extends [readonly unknown[]]\n ? never\n : [V] extends [object]\n ? PredicateObject<V>\n : never);\n\n// ============================================================================\n// FactPredicate\n// ============================================================================\n\n/**\n * Object form — every key is a fact name, every value a\n * {@link PredicateField}. Multiple keys are AND-ed. A nested object value\n * recurses (partial match), which is how cross-module namespaced predicates\n * (`{ self: { phase: \"red\" }, auth: { token: { $exists: true } } }`) work.\n */\nexport type PredicateObject<F> = {\n [K in keyof F]?: PredicateField<F[K]>;\n};\n\n/** Array form — explicit clauses, AND-ed. The codegen/devtools-friendly form. */\nexport type PredicateClause<F> = {\n [K in keyof F]: {\n readonly fact: K;\n readonly op: PredicateOp;\n readonly value: unknown;\n };\n}[keyof F];\n\n/** Combinator node — exactly one of `$all` / `$any` / `$not`. */\nexport type PredicateCombinator<F> =\n | { $all: readonly FactPredicate<F>[]; $any?: never; $not?: never }\n | { $any: readonly FactPredicate<F>[]; $all?: never; $not?: never }\n | { $not: FactPredicate<F>; $all?: never; $any?: never };\n\n/**\n * A declarative boolean spec over a fact namespace `F`. The data form of a\n * constraint `when`, an effect `on`, or a boolean derivation. Accepts an\n * object form, an array-of-clauses form, or a combinator node.\n *\n * Keys are **fact names only** — derivations are not addressable from inside\n * a predicate. To gate on a derivation, either reference the underlying fact\n * the derivation reads, or fall back to the function form of `when` / `on`.\n *\n * @example\n * ```ts\n * // Object form (the common case)\n * const p1: FactPredicate<{ phase: string; elapsed: number }> = {\n * phase: \"red\",\n * elapsed: { $gte: 30 },\n * };\n *\n * // Combinator form\n * const p2: FactPredicate<{ phase: string }> = {\n * $any: [{ phase: \"red\" }, { phase: \"yellow\" }],\n * };\n * ```\n */\nexport type FactPredicate<F> =\n | PredicateObject<F>\n | readonly PredicateClause<F>[]\n | PredicateCombinator<F>;\n\n// ============================================================================\n// FactTemplate\n// ============================================================================\n\n/**\n * A fact-interpolating string expression. `${key}` placeholders are replaced\n * with the named fact's value; `$${` emits a literal `${`. The value-producing\n * counterpart to {@link FactPredicate} — usable as a string derivation, a\n * constraint `require` field value, or an event `patch` value.\n *\n * @example { $template: \"Phase ${phase} for ${elapsed}s\" }\n */\nexport interface FactTemplate {\n readonly $template: string;\n}\n\n// ============================================================================\n// Selectors (resolver key, event patch)\n// ============================================================================\n\n/**\n * *Note: despite the \"Selector\" name, this does not select from facts — it\n * projects fields of the requirement payload for stable-stringification.*\n *\n * A resolver dedup key written as data: an ordered list of requirement-payload\n * field names. `key: [\"type\", \"to\"]` dedupes requirements by those fields.\n *\n * @example\n * ```ts\n * resolvers: {\n * fetch: {\n * requirement: \"FETCH\",\n * key: [\"url\", \"method\"] satisfies KeySelector<{ url: string; method: string }>,\n * resolve: doFetch,\n * },\n * }\n * ```\n */\nexport type KeySelector<R> = readonly (keyof R & string)[];\n\n/**\n * *Note: Directive's `$ref` is **not** a JSON Pointer or JSON Schema `$ref`.\n * It is a payload field copy — equivalent to `event.payload[key]`. Renaming\n * to `$from` is tracked as a possible v1.6+ additive alias.*\n *\n * A typed single-field copy from an event payload. Lives in the patch-spec\n * namespace — used inside a {@link PatchSpec} `$set` value.\n *\n * @example\n * ```ts\n * patch: { $set: { userId: { $ref: \"id\" } satisfies PayloadRef<{ id: string }> } }\n * ```\n */\nexport interface PayloadRef<P> {\n readonly $ref: keyof P & string;\n}\n\n/**\n * A patch value: a literal, a typed payload copy, or (for string facts) a\n * template. Lives in the patch-spec namespace — used inside a {@link PatchSpec}\n * `$set` block.\n *\n * @example\n * ```ts\n * const v1: PatchValue<boolean, { active: boolean }> = true;\n * const v2: PatchValue<string, { name: string }> = { $ref: \"name\" };\n * const v3: PatchValue<string, { name: string }> = { $template: \"user ${name}\" };\n * ```\n */\nexport type PatchValue<V, P> =\n | V\n | PayloadRef<P>\n | ([V] extends [string] ? FactTemplate : never);\n\n/**\n * An event handler written as data: assigns facts from literals, payload\n * fields (`$ref`), or interpolated strings (`$template`).\n *\n * @example\n * ```ts\n * const spec: PatchSpec<{ status: string; label: string }, { name: string }> = {\n * $set: {\n * status: \"active\",\n * label: { $template: \"user ${name}\" },\n * },\n * };\n * ```\n */\nexport interface PatchSpec<F, P> {\n readonly $set: { [K in keyof F]?: PatchValue<F[K], P> };\n}\n\n// ============================================================================\n// Explain\n// ============================================================================\n\n/**\n * The per-clause result of an explained predicate evaluation. One entry per\n * leaf operator (`$eq`, `$gte`, …); combinator nodes (`$all`, `$any`, `$not`)\n * may also appear as headers when the runtime emits them — hence the union\n * over {@link PredicateCombinatorKey}.\n *\n * @example\n * ```ts\n * const result: ClauseResult = {\n * path: \"elapsed\",\n * op: \"$gte\",\n * expected: 30,\n * actual: 20,\n * pass: false,\n * };\n * ```\n */\nexport interface ClauseResult {\n /** Dotted path to the fact (`elapsed`, `auth.token`). */\n readonly path: string;\n /** The operator applied (`$gte`, `$eq`, …) — `$eq` for a bare value. */\n readonly op: PredicateOp | PredicateCombinatorKey;\n /**\n * The value the predicate expected. For combinator clauses (`$all`,\n * `$any`, `$not`) this is the child count.\n */\n readonly expected: unknown;\n /**\n * The actual fact value at evaluation time. For combinator clauses this\n * is the number of child clauses that passed.\n */\n readonly actual: unknown;\n /** Whether this clause passed. */\n readonly pass: boolean;\n /**\n * Children of a combinator clause (`$all`, `$any`, `$not`). Preserves the\n * tree shape of the original predicate so renderers (devtools,\n * `system.explain()`) can indent nested clauses.\n */\n readonly children?: ClauseResult[];\n}\n","/**\n * Runtime for data-configuration predicates and templates.\n *\n * Pure module — imports only its own types. Reads facts through whatever\n * object it is handed (the reactive `Facts` proxy in production, a plain\n * snapshot in tests), so it never depends on the engine, store, or tracking.\n */\n\nimport isDevelopment from \"#is-development\";\nimport { stableStringify } from \"../utils/utils.js\";\nimport {\n type ClauseResult,\n type FactTemplate,\n PREDICATE_OPERATORS,\n type PatchSpec,\n type PredicateOp,\n} from \"./types/predicate.js\";\n\n// ============================================================================\n// Recursion bound\n// ============================================================================\n\n/**\n * Maximum predicate-AST recursion depth. Legitimate cross-module predicates\n * nest fewer than ~15 levels; 64 is generous but bounded — past it the runtime\n * dev-warns and bails rather than risking a stack overflow on a cyclic or\n * pathologically deep spec. Shared by every structural predicate walker\n * ({@link walkPredicate}, {@link evaluatePredicate}) so the cap lives in one\n * place.\n */\nexport const MAX_PREDICATE_DEPTH = 64;\n\n// ============================================================================\n// Discriminators\n// ============================================================================\n\n/** A readable scope — the `Facts` proxy and a plain snapshot both satisfy it. */\ntype Scope = Record<string, unknown>;\n\nfunction isPlainObject(v: unknown): v is Record<string, unknown> {\n if (typeof v !== \"object\" || v === null || Array.isArray(v)) {\n return false;\n }\n\n return !(v instanceof Date) && !(v instanceof RegExp);\n}\n\n/**\n * True when `v` is a plain `{}` literal (its prototype is `Object.prototype`\n * or `null`). Excludes class instances, Date, RegExp, Map, Set, Promise, etc.\n */\nfunction isPlainObjectStrict(v: unknown): v is Record<string, unknown> {\n if (typeof v !== \"object\" || v === null || Array.isArray(v)) {\n return false;\n }\n const proto = Object.getPrototypeOf(v);\n\n return proto === Object.prototype || proto === null;\n}\n\n/**\n * True when every own key of `v` is a recognized `$`-operator (and there is ≥1).\n * If any key starts with `$` but is not a known operator, dev-warn (typo) and\n * still treat the value as an operator object so the typo is not masked as a\n * literal — `applyOperator` will return false for the unknown op.\n */\nfunction isOperatorObject(v: unknown): v is Record<string, unknown> {\n if (!isPlainObject(v)) {\n return false;\n }\n\n let count = 0;\n let hasDollarKey = false;\n for (const k of Object.keys(v)) {\n if (k.startsWith(\"$\")) {\n hasDollarKey = true;\n if (!PREDICATE_OPERATORS.has(k)) {\n devWarn(\n `predicate: unknown operator \"${k}\" — looks like a typo. Known operators: ${[...PREDICATE_OPERATORS].join(\", \")}`,\n );\n }\n } else if (hasDollarKey || count === 0) {\n // Mixed $/non-$ keys aren't an operator object; let the caller treat\n // it as a literal/recursive predicate. The non-$ key check happens\n // below by short-circuiting when a non-$ key appears.\n return false;\n }\n count++;\n }\n\n if (!hasDollarKey) {\n return false;\n }\n\n // All keys are `$`-prefixed: this is an operator object, even if some keys\n // are typos. An unknown op makes applyOperator() return false.\n return count > 0;\n}\n\n/**\n * True when `v` is a data-form spec (predicate object/array) rather than a\n * function. Excludes class instances (Date, RegExp, Map, Set, Promise, etc.)\n * — only plain `{}` literals and arrays of plain clause shapes qualify.\n *\n * @example\n * ```ts\n * isPredicate({ phase: \"red\" }); // true\n * isPredicate((f) => f.phase === \"red\"); // false\n * isPredicate([{ fact: \"phase\", op: \"$eq\", value: \"red\" }]); // true\n * ```\n */\nexport function isPredicate(v: unknown): boolean {\n if (v === null) {\n return false;\n }\n if (Array.isArray(v)) {\n return v.every(\n (c) =>\n isPlainObjectStrict(c) &&\n \"fact\" in (c as object) &&\n \"op\" in (c as object),\n );\n }\n\n return isPlainObjectStrict(v);\n}\n\n// ============================================================================\n// Structural traversal\n// ============================================================================\n\n/**\n * Visitor passed to {@link walkPredicate}. Every callback is optional; a\n * walker implements only the arms it cares about.\n */\nexport interface PredicateVisitor {\n /**\n * A leaf operator clause: a fact + a `$`-operator + its operand. Fires once\n * per operator in a multi-operator object.\n *\n * @param factPath - Dotted path to the fact (`elapsed`, `auth.token`).\n * @param op - The operator key (`$gte`, `$matches`, …).\n * @param operand - The operator's operand value.\n * @param operandPath - Dotted path to the operand for diagnostics\n * (`elapsed.$gte`, `value` / `[0].value` for the array-clause form).\n */\n operator?(\n factPath: string,\n op: string,\n operand: unknown,\n operandPath: string,\n ): void;\n /**\n * A bare-value (equality) clause — a fact mapped to a non-object literal,\n * an array, or a non-plain class instance (Date, RegExp, Set, …).\n *\n * @param factPath - Dotted path to the fact.\n * @param value - The equality operand.\n */\n literal?(factPath: string, value: unknown): void;\n /**\n * A combinator node (`$all` / `$any` / `$not`), called before descending.\n * Return `false` to skip its children.\n */\n combinator?(kind: \"$all\" | \"$any\" | \"$not\"): boolean | void;\n /**\n * A nested-object (cross-module pivot) key, called before descending.\n * Return `false` to skip its children.\n */\n nested?(key: string): boolean | void;\n /**\n * A `$`-prefixed key appearing where a fact key was expected — either an\n * unknown/typo operator, or an operator mixed with fact keys at predicate\n * top level.\n *\n * @param key - The stray `$`-key.\n * @param factPath - Dotted path to the stray key.\n */\n strayOperatorKey?(key: string, factPath: string): void;\n /**\n * Called when traversal bails out early — a cycle was re-encountered or\n * the depth cap was hit. The subtree below the bail point is NOT visited.\n */\n bail?(reason: \"cycle\" | \"depth\"): void;\n}\n\n/**\n * Single depth-guarded, cycle-guarded structural traversal of a predicate\n * AST. The pure structural walkers — dependency extraction, `$changed`\n * detection, empty/config detection, serialization validation — share this\n * so a new operator or combinator is threaded through one place.\n *\n * Handles the object form, the array-clause form, combinator nodes, nested\n * cross-module objects, operator objects, and bare-value literals. It does\n * **not** evaluate — see {@link evaluatePredicate} for that.\n *\n * @internal\n */\nexport function walkPredicate(\n spec: unknown,\n visitor: PredicateVisitor,\n path = \"\",\n seen: WeakSet<object> = new WeakSet(),\n depth = 0,\n): void {\n if (depth > MAX_PREDICATE_DEPTH) {\n if (isDevelopment) {\n console.warn(\n `[Directive] predicate depth limit (${MAX_PREDICATE_DEPTH}) exceeded — flatten the predicate or split it into multiple constraints. If this is unexpected, check for a cyclic spec object.`,\n );\n }\n visitor.bail?.(\"depth\");\n\n return;\n }\n\n // Array-clause form — each `{ fact, op, value }` clause is a leaf operator.\n if (Array.isArray(spec)) {\n spec.forEach((clause, i) => {\n if (!isPlainObject(clause)) {\n return;\n }\n const c = clause as Record<string, unknown>;\n if (typeof c.fact === \"string\" && typeof c.op === \"string\") {\n const clausePath = path ? `${path}[${i}]` : `[${i}]`;\n visitor.operator?.(\n path ? `${path}.${c.fact}` : c.fact,\n c.op,\n c.value,\n `${clausePath}.value`,\n );\n }\n });\n\n return;\n }\n\n if (!isPlainObject(spec)) {\n return;\n }\n if (seen.has(spec)) {\n if (isDevelopment) {\n console.warn(\"[Directive] walkPredicate: cyclic predicate spec\");\n }\n visitor.bail?.(\"cycle\");\n\n return;\n }\n seen.add(spec);\n\n const obj = spec as Record<string, unknown>;\n\n // Combinator node — descend into children unless the visitor opts out.\n for (const kind of [\"$all\", \"$any\", \"$not\"] as const) {\n if (kind in obj) {\n const descend = visitor.combinator?.(kind);\n if (descend === false) {\n return;\n }\n const children =\n kind === \"$not\" ? [obj.$not] : ((obj[kind] as unknown[]) ?? []);\n for (const child of children) {\n walkPredicate(child, visitor, path, seen, depth + 1);\n }\n\n return;\n }\n }\n\n // Object form — one entry per key.\n for (const key of Object.keys(obj)) {\n const childPath = path ? `${path}.${key}` : key;\n\n if (key.startsWith(\"$\")) {\n // A `$`-key at fact position — typo operator or top-level operator\n // mixed with fact keys. Surface it; do not descend.\n visitor.strayOperatorKey?.(key, childPath);\n continue;\n }\n\n const value = obj[key];\n\n if (isOperatorObject(value)) {\n const opObj = value as Record<string, unknown>;\n for (const op of Object.keys(opObj)) {\n visitor.operator?.(childPath, op, opObj[op], `${childPath}.${op}`);\n }\n continue;\n }\n\n // Only a strict plain object (`{}` / `Object.create(null)`) recurses as\n // a nested cross-module predicate. A Set, Map, or class instance is a\n // bare-value leaf — surfacing it as `literal` lets a walker inspect its\n // runtime class (e.g. validatePredicate's JSON-serializability check).\n if (isPlainObjectStrict(value)) {\n const descend = visitor.nested?.(key);\n if (descend === false) {\n continue;\n }\n walkPredicate(value, visitor, childPath, seen, depth + 1);\n continue;\n }\n\n // Bare value — equality leaf (also array / Set / Map / class instances).\n visitor.literal?.(childPath, value);\n }\n}\n\n/**\n * True when `v` structurally passes {@link isPredicate} but contains no\n * operators, no combinators, and no fact-clause entries that resolve to a\n * primitive/operator leaf — i.e. an empty `{}` or a deeply-nested object\n * tree that never bottoms out in a leaf value. Used by the dynamic\n * `register()` / `assign()` paths to dev-warn when a config object is\n * passed where a predicate (or function) was expected.\n *\n * Returns `false` for arrays — array-form predicates with `fact`+`op`\n * clauses are handled by the structural `isPredicate` check upstream.\n *\n * @example\n * ```ts\n * isEmptyOrConfigPredicate({}); // true (empty — config-object misuse)\n * isEmptyOrConfigPredicate({ phase: \"red\" }); // false (real fact clause)\n * isEmptyOrConfigPredicate({ $eq: 5 }); // false (operator)\n * isEmptyOrConfigPredicate({ count: { $gt: 5 } }); // false (operator clause)\n * ```\n *\n * @internal\n */\nexport function isEmptyOrConfigPredicate(v: unknown): boolean {\n // Arrays and non-plain-object specs are never \"empty config objects\".\n if (!isPlainObjectStrict(v)) {\n return false;\n }\n\n // A spec is a config tree only when walkPredicate fires NONE of the\n // predicate-semantic callbacks — no operator, no combinator, no literal\n // leaf, no stray `$`-key. Nested plain objects are descended; an empty\n // `{}` or a tree of empty `{}` fires nothing and stays \"config\". A cycle\n // or depth-cap bail is treated as \"not a config object\" (can't determine\n // — fail safe so the dev-warn is not spuriously emitted).\n let isPredicateBody = false;\n walkPredicate(v, {\n operator() {\n isPredicateBody = true;\n },\n literal() {\n isPredicateBody = true;\n },\n combinator() {\n isPredicateBody = true;\n },\n strayOperatorKey() {\n isPredicateBody = true;\n },\n bail() {\n isPredicateBody = true;\n },\n });\n\n return !isPredicateBody;\n}\n\n/**\n * True when `v` is a {@link FactTemplate} (`{ $template: string }`).\n *\n * @example\n * ```ts\n * isTemplate({ $template: \"Hi ${name}\" }); // true\n * isTemplate({ $set: { name: \"x\" } }); // false\n * ```\n */\nexport function isTemplate(v: unknown): v is FactTemplate {\n return (\n isPlainObject(v) &&\n Object.hasOwn(v, \"$template\") &&\n typeof (v as { $template: unknown }).$template === \"string\"\n );\n}\n\n// ============================================================================\n// Load-time validation\n// ============================================================================\n\n/**\n * Throw when a predicate spec contains an operand that cannot survive a\n * JSON round-trip — i.e. that would silently mis-evaluate if the spec was\n * loaded from `JSON.parse`.\n *\n * Three failure classes are detected:\n *\n * - **Lost `RegExp` operand.** A `$matches` operand that is not a\n * `RegExp` instance. `JSON.parse` reconstructs a serialized regex as\n * `{}`, so a `$matches` clause with an empty-object operand is the\n * signature of a regex that did not survive serialization. Reify it\n * with `new RegExp(pattern, flags)` before installing the predicate.\n * - **`bigint` operand.** `JSON.stringify` throws on `bigint`, so a\n * `bigint` operand cannot have been produced by a JSON pipeline and\n * cannot be persisted by one either.\n * - **`Set` / `Map` operand.** Both serialize to `{}` and lose all\n * members; a predicate carrying one is not JSON-safe.\n *\n * This is an opt-in helper — the engine does not call it automatically.\n * Users who load predicates from JSON should call it after `JSON.parse`\n * to fail loud rather than silently mis-evaluate. See the\n * \"Serialization\" section of RFC-0004.\n *\n * @example\n * ```ts\n * validatePredicate({ phase: { $matches: {} } });\n * // throws — empty object where a RegExp is required\n *\n * validatePredicate({ phase: \"red\", elapsed: { $gte: 30 } });\n * // ok — JSON-clean operands\n * ```\n */\nexport function validatePredicate(spec: unknown, path = \"\"): void {\n /**\n * Recursively walk an operand's object/array structure, throwing on any\n * value that cannot survive a JSON round-trip — `bigint`, `Set`, `Map`, or\n * a nested `RegExp`. Depth- and cycle-guarded. A top-level operand is\n * inspected by the operator-specific {@link checkOperand} (which permits a\n * `RegExp` as the direct `$matches` operand); this helper handles values\n * nested *inside* a plain-object or array operand, where a `RegExp` is just\n * as JSON-unsafe as a `Set`.\n */\n function checkValueJsonSafe(\n value: unknown,\n at: string,\n seen: WeakSet<object>,\n depth: number,\n ): void {\n if (typeof value === \"bigint\") {\n throw new Error(\n `[Directive] validatePredicate: bigint operand at \"${at}\" is not JSON-serializable (JSON.stringify throws on bigint).`,\n );\n }\n if (value instanceof Set) {\n throw new Error(\n `[Directive] validatePredicate: Set operand at \"${at}\" is not JSON-serializable (serializes to {} and loses all members).`,\n );\n }\n if (value instanceof Map) {\n throw new Error(\n `[Directive] validatePredicate: Map operand at \"${at}\" is not JSON-serializable (serializes to {} and loses all entries).`,\n );\n }\n if (value instanceof RegExp) {\n throw new Error(\n `[Directive] validatePredicate: RegExp operand at \"${at}\" is not JSON-serializable (a regex lost to JSON.parse becomes {}). Only a direct $matches operand may be a RegExp.`,\n );\n }\n if (value === null || typeof value !== \"object\") {\n return;\n }\n if (depth > MAX_PREDICATE_DEPTH) {\n return;\n }\n if (seen.has(value)) {\n return;\n }\n seen.add(value);\n\n if (Array.isArray(value)) {\n value.forEach((el, i) => {\n checkValueJsonSafe(el, `${at}[${i}]`, seen, depth + 1);\n });\n\n return;\n }\n\n for (const k of Object.keys(value as Record<string, unknown>)) {\n checkValueJsonSafe(\n (value as Record<string, unknown>)[k],\n at ? `${at}.${k}` : k,\n seen,\n depth + 1,\n );\n }\n }\n\n /** Throw on a JSON-unrehydratable operand value. */\n function checkOperand(value: unknown, op: string, at: string): void {\n if (typeof value === \"bigint\") {\n throw new Error(\n `[Directive] validatePredicate: bigint operand at \"${at}\" is not JSON-serializable (JSON.stringify throws on bigint).`,\n );\n }\n if (value instanceof Set) {\n throw new Error(\n `[Directive] validatePredicate: Set operand at \"${at}\" is not JSON-serializable (serializes to {} and loses all members).`,\n );\n }\n if (value instanceof Map) {\n throw new Error(\n `[Directive] validatePredicate: Map operand at \"${at}\" is not JSON-serializable (serializes to {} and loses all entries).`,\n );\n }\n if (op === \"$matches\" && !(value instanceof RegExp)) {\n throw new Error(\n `[Directive] validatePredicate: $matches operand at \"${at}\" must be a RegExp; got ${value === null ? \"null\" : typeof value}. A regex lost to JSON.parse becomes {} — reify with new RegExp(pattern, flags) before installing.`,\n );\n }\n // A plain-object / array operand (e.g. `$eq: { ... }`, `$in: [ ... ]`)\n // can carry a `bigint`, `Set`, `Map`, or nested `RegExp` arbitrarily deep\n // — `checkOperand` only sees the operand's top type, so recurse into its\n // structure. The direct `$matches` RegExp is handled above and never\n // reaches this branch (a RegExp is not a plain object / array).\n if (Array.isArray(value)) {\n value.forEach((el, i) => {\n checkValueJsonSafe(el, `${at}[${i}]`, new WeakSet(), 1);\n });\n } else if (isPlainObjectStrict(value)) {\n for (const k of Object.keys(value)) {\n checkValueJsonSafe(value[k], `${at}.${k}`, new WeakSet(), 1);\n }\n }\n }\n\n // Top-level Set / Map node — a regex / set / map handed in directly as the\n // whole spec. walkPredicate would treat it as an empty object, so check\n // the entry node here.\n if (spec instanceof Set) {\n throw new Error(\n `[Directive] validatePredicate: Set operand${path ? ` at \"${path}\"` : \"\"} is not JSON-serializable (serializes to {} and loses all members).`,\n );\n }\n if (spec instanceof Map) {\n throw new Error(\n `[Directive] validatePredicate: Map operand${path ? ` at \"${path}\"` : \"\"} is not JSON-serializable (serializes to {} and loses all entries).`,\n );\n }\n\n // Single structural traversal — every operator clause and equality leaf is\n // checked for a JSON-unrehydratable operand. The walker threads the dotted\n // operand path so error messages point at the offending clause.\n walkPredicate(spec, {\n operator(_factPath, op, operand, operandPath) {\n checkOperand(operand, op, path ? `${path}.${operandPath}` : operandPath);\n },\n literal(factPath, value) {\n checkOperand(value, \"\", path ? `${path}.${factPath}` : factPath);\n },\n });\n}\n\n// ============================================================================\n// Equality\n// ============================================================================\n\n/**\n * Pairwise cycle-guard state shared across a single `deepEqual` traversal.\n *\n * Asymmetric cycles (only one side cyclic) must not short-circuit; we only\n * treat a pair as equal when the same `(a, b)` pair is re-encountered.\n */\ninterface DeepEqualSeen {\n ids: WeakMap<object, number>;\n next: { v: number };\n pairs: Set<string>;\n}\n\nfunction deepEqualSeen(): DeepEqualSeen {\n return { ids: new WeakMap(), next: { v: 1 }, pairs: new Set() };\n}\n\nfunction pairId(seen: DeepEqualSeen, obj: object): number {\n let id = seen.ids.get(obj);\n if (id === undefined) {\n id = seen.next.v++;\n seen.ids.set(obj, id);\n }\n\n return id;\n}\n\n/** Structural equality with NaN/Date handling and a pairwise cycle guard. */\nfunction deepEqual(a: unknown, b: unknown, seen?: DeepEqualSeen): boolean {\n if (Object.is(a, b)) {\n return true;\n }\n\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime();\n }\n\n if (\n typeof a !== \"object\" ||\n typeof b !== \"object\" ||\n a === null ||\n b === null\n ) {\n return false;\n }\n\n const guard = seen ?? deepEqualSeen();\n const key = `${pairId(guard, a)}:${pairId(guard, b)}`;\n if (guard.pairs.has(key)) {\n return true; // same (a, b) pair re-encountered — treat as equal\n }\n guard.pairs.add(key);\n\n if (Array.isArray(a) || Array.isArray(b)) {\n if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) {\n return false;\n }\n\n return a.every((v, i) => deepEqual(v, b[i], guard));\n }\n\n // Set equality — same size, every element of `a` has a structurally-equal\n // counterpart in `b`. Must precede the `Object.keys` fallback below because\n // `Object.keys(new Set(...))` is always `[]`, which would otherwise let\n // any two Sets (or any two Maps) compare equal regardless of contents.\n if (a instanceof Set || b instanceof Set) {\n if (!(a instanceof Set) || !(b instanceof Set) || a.size !== b.size) {\n return false;\n }\n const bArr = [...b];\n\n return [...a].every((v) => bArr.some((w) => deepEqual(v, w, guard)));\n }\n\n // Map equality — same size, every key in `a` matches a key in `b` with a\n // structurally-equal value. Greedy match with a used-flag to handle\n // structural (non-reference) key equality correctly.\n if (a instanceof Map || b instanceof Map) {\n if (!(a instanceof Map) || !(b instanceof Map) || a.size !== b.size) {\n return false;\n }\n const bEntries = [...b.entries()];\n const used = new Array<boolean>(bEntries.length).fill(false);\n for (const [ka, va] of a) {\n let found = false;\n for (let i = 0; i < bEntries.length; i++) {\n if (used[i]) {\n continue;\n }\n const [kb, vb] = bEntries[i]!;\n if (deepEqual(ka, kb, guard) && deepEqual(va, vb, guard)) {\n used[i] = true;\n found = true;\n break;\n }\n }\n if (!found) {\n return false;\n }\n }\n\n return true;\n }\n\n const ak = Object.keys(a as object);\n const bk = Object.keys(b as object);\n if (ak.length !== bk.length) {\n return false;\n }\n\n return ak.every(\n (k) =>\n Object.hasOwn(b as object, k) &&\n deepEqual(\n (a as Record<string, unknown>)[k],\n (b as Record<string, unknown>)[k],\n guard,\n ),\n );\n}\n\n// ============================================================================\n// Operators\n// ============================================================================\n\nfunction toComparable(v: unknown): number | bigint | string | undefined {\n if (v instanceof Date) {\n return v.getTime();\n }\n if (typeof v === \"number\" || typeof v === \"bigint\" || typeof v === \"string\") {\n return v;\n }\n\n return undefined;\n}\n\nfunction relational(\n op: PredicateOp,\n actual: unknown,\n operand: unknown,\n): boolean {\n const a = toComparable(actual);\n const b = toComparable(operand);\n if (a === undefined || b === undefined || typeof a !== typeof b) {\n return false;\n }\n\n switch (op) {\n case \"$gt\":\n return a > b;\n case \"$gte\":\n return a >= b;\n case \"$lt\":\n return a < b;\n case \"$lte\":\n return a <= b;\n default:\n return false;\n }\n}\n\n/** Apply one operator. `prevValue` is supplied only for `$changed`. */\nfunction applyOperator(\n op: PredicateOp,\n actual: unknown,\n operand: unknown,\n prevValue: unknown,\n): boolean {\n switch (op) {\n case \"$eq\":\n return deepEqual(actual, operand);\n case \"$ne\":\n return !deepEqual(actual, operand);\n case \"$in\":\n return (\n Array.isArray(operand) && operand.some((v) => deepEqual(actual, v))\n );\n case \"$nin\":\n return (\n Array.isArray(operand) && !operand.some((v) => deepEqual(actual, v))\n );\n case \"$exists\":\n return operand === (actual !== undefined);\n case \"$changed\":\n return !deepEqual(actual, prevValue);\n case \"$gt\":\n case \"$gte\":\n case \"$lt\":\n case \"$lte\":\n return relational(op, actual, operand);\n case \"$between\": {\n if (!Array.isArray(operand) || operand.length !== 2) {\n return false;\n }\n const lo = toComparable(operand[0]);\n const hi = toComparable(operand[1]);\n if (\n lo !== undefined &&\n hi !== undefined &&\n typeof lo === typeof hi &&\n lo > hi\n ) {\n devWarn(\"$between: reversed pair — [min, max] required\");\n\n return false;\n }\n\n return (\n relational(\"$gte\", actual, operand[0]) &&\n relational(\"$lte\", actual, operand[1])\n );\n }\n case \"$matches\": {\n if (!(operand instanceof RegExp)) {\n // String operands are not accepted — a string cannot carry flags\n // (case-insensitivity, dotall, multiline) and would also enable a\n // ReDoS surface for data-loaded predicates. Throw immediately so\n // the bug surfaces at the point of use.\n throw new Error(\n \"[Directive] $matches: operand must be a RegExp (string operands are no longer accepted; pass /pattern/flags directly).\",\n );\n }\n if (typeof actual !== \"string\") {\n return false;\n }\n\n return operand.test(actual);\n }\n case \"$startsWith\":\n if (typeof actual !== \"string\") {\n return false;\n }\n\n return actual.startsWith(String(operand));\n case \"$endsWith\":\n if (typeof actual !== \"string\") {\n return false;\n }\n\n return actual.endsWith(String(operand));\n case \"$contains\":\n if (typeof actual === \"string\") {\n return actual.includes(String(operand));\n }\n if (Array.isArray(actual)) {\n return actual.some((v) => deepEqual(v, operand));\n }\n // Set membership — uses `.has()` which is reference-equality for\n // objects (matches native Set semantics) and value-equality for\n // primitives. Map `$contains` is deferred to v2; users who need it\n // today can fall back to a function-form predicate.\n if (actual instanceof Set) {\n return actual.has(operand);\n }\n\n return false;\n default:\n return false;\n }\n}\n\n// ============================================================================\n// Evaluation\n// ============================================================================\n\nfunction devWarn(message: string): void {\n if (isDevelopment) {\n console.warn(`[Directive] ${message}`);\n }\n}\n\nfunction evalField(\n value: unknown,\n actual: unknown,\n prev: unknown,\n depth: number,\n): boolean {\n if (isOperatorObject(value)) {\n const keys = Object.keys(value);\n // Type rejects multi-operator objects; the runtime ANDs them on a\n // best-effort basis but dev-warns so the author knows to switch to the\n // array form or `$all`.\n if (keys.length > 1) {\n devWarn(\n `predicate: operator object has ${keys.length} operators (${keys.join(\", \")}) — write the array form or $all instead. The runtime ANDs them as a best-effort fallback.`,\n );\n }\n for (const op of keys) {\n if (!applyOperator(op as PredicateOp, actual, value[op], prev)) {\n return false;\n }\n }\n\n return true;\n }\n\n // A plain (non-operator) object recurses — nested / namespaced predicate.\n if (isPlainObject(value)) {\n return evaluatePredicate(\n value,\n isPlainObject(actual) ? actual : Object.create(null),\n isPlainObject(prev) ? prev : undefined,\n depth + 1,\n );\n }\n\n // Bare value → equality.\n return deepEqual(actual, value);\n}\n\n/**\n * Evaluate a {@link FactPredicate} against a fact scope. `prev` (a previous\n * snapshot) is consulted only by the `$changed` operator.\n *\n * @example\n * ```ts\n * evaluatePredicate({ phase: \"red\", elapsed: { $gte: 30 } }, { phase: \"red\", elapsed: 45 });\n * // → true\n * evaluatePredicate({ $any: [{ phase: \"red\" }, { phase: \"yellow\" }] }, { phase: \"green\" });\n * // → false\n * ```\n */\nexport function evaluatePredicate(\n spec: unknown,\n facts: Scope,\n prev?: Scope,\n depth = 0,\n): boolean {\n // `freezeSpec` permits cycles (it uses a WeakSet seen-guard), so a\n // registered spec can be self-referential. Cap recursion to defend the\n // reconcile loop against a stack overflow at evaluation time.\n if (depth > MAX_PREDICATE_DEPTH) {\n devWarn(\n `predicate depth limit (${MAX_PREDICATE_DEPTH}) exceeded — flatten the predicate or split it into multiple constraints. If this is unexpected, check for a cyclic spec object.`,\n );\n\n return false;\n }\n // Array form — clauses AND-ed.\n if (Array.isArray(spec)) {\n return spec.every((clause) => {\n if (!isPlainObject(clause)) {\n return false;\n }\n const { fact, op, value } = clause as {\n fact: string;\n op: PredicateOp;\n value: unknown;\n };\n\n return applyOperator(op, facts?.[fact], value, prev?.[fact]);\n });\n }\n\n if (!isPlainObject(spec)) {\n return Boolean(spec);\n }\n\n // Combinator node.\n if (\"$all\" in spec) {\n return (spec.$all as unknown[]).every((p) =>\n evaluatePredicate(p, facts, prev, depth + 1),\n );\n }\n if (\"$any\" in spec) {\n return (spec.$any as unknown[]).some((p) =>\n evaluatePredicate(p, facts, prev, depth + 1),\n );\n }\n if (\"$not\" in spec) {\n return !evaluatePredicate(spec.$not, facts, prev, depth + 1);\n }\n\n // Object form — every key AND-ed.\n for (const key of Object.keys(spec)) {\n if (PREDICATE_OPERATORS.has(key)) {\n devWarn(\n `predicate: operator \"${key}\" mixed with fact keys — wrap operators in a per-fact object`,\n );\n\n return false;\n }\n if (!evalField(spec[key], facts?.[key], prev?.[key], depth)) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Evaluate a predicate and return a per-clause breakdown — the data feed for\n * devtools, `system.explain()`, and `directive explain`.\n *\n * @example\n * ```ts\n * evaluatePredicateExplained(\n * { phase: \"red\", elapsed: { $gte: 30 } },\n * { phase: \"red\", elapsed: 20 },\n * );\n * // → [\n * // { path: \"phase\", op: \"$eq\", expected: \"red\", actual: \"red\", pass: true },\n * // { path: \"elapsed\", op: \"$gte\", expected: 30, actual: 20, pass: false },\n * // ]\n * ```\n */\nexport function evaluatePredicateExplained(\n spec: unknown,\n facts: Scope,\n prev?: Scope,\n pathPrefix = \"\",\n): ClauseResult[] {\n const out: ClauseResult[] = [];\n\n if (Array.isArray(spec)) {\n for (const clause of spec) {\n if (!isPlainObject(clause)) {\n continue;\n }\n const { fact, op, value } = clause as {\n fact: string;\n op: PredicateOp;\n value: unknown;\n };\n const actual = facts?.[fact];\n out.push({\n path: pathPrefix + fact,\n op,\n expected: value,\n actual,\n pass: applyOperator(op, actual, value, prev?.[fact]),\n });\n }\n\n return out;\n }\n\n if (!isPlainObject(spec)) {\n return out;\n }\n\n for (const key of [\"$all\", \"$any\", \"$not\"] as const) {\n if (key in spec) {\n const childSpecs =\n key === \"$not\" ? [spec.$not] : (spec[key] as unknown[]);\n const children: ClauseResult[] = [];\n for (const child of childSpecs) {\n children.push(\n ...evaluatePredicateExplained(child, facts, prev, pathPrefix),\n );\n }\n const passCount = children.filter((c) => c.pass).length;\n let pass: boolean;\n if (key === \"$all\") {\n pass = children.length === 0 || passCount === children.length;\n } else if (key === \"$any\") {\n pass = children.length > 0 && passCount > 0;\n } else {\n // $not — single child wrapped above\n pass = !children.every((c) => c.pass);\n }\n out.push({\n path: pathPrefix || key,\n op: key,\n expected: childSpecs.length,\n actual: passCount,\n pass,\n children,\n });\n\n return out;\n }\n }\n\n for (const key of Object.keys(spec)) {\n if (PREDICATE_OPERATORS.has(key)) {\n continue;\n }\n const value = spec[key];\n const actual = facts?.[key];\n const path = pathPrefix + key;\n\n if (isOperatorObject(value)) {\n for (const op of Object.keys(value)) {\n out.push({\n path,\n op: op as PredicateOp,\n expected: value[op],\n actual,\n pass: applyOperator(\n op as PredicateOp,\n actual,\n value[op],\n prev?.[key],\n ),\n });\n }\n } else if (isPlainObject(value)) {\n out.push(\n ...evaluatePredicateExplained(\n value,\n isPlainObject(actual) ? actual : Object.create(null),\n isPlainObject(prev?.[key]) ? (prev?.[key] as Scope) : undefined,\n `${path}.`,\n ),\n );\n } else {\n out.push({\n path,\n op: \"$eq\",\n expected: value,\n actual,\n pass: deepEqual(actual, value),\n });\n }\n }\n\n return out;\n}\n\nconst memoizedCache = new WeakMap<\n object,\n (facts: Scope, prev?: Scope) => boolean\n>();\n\n/**\n * Memoize a predicate as a reusable evaluation closure.\n *\n * The returned function accepts any `facts` scope (the reactive proxy in\n * production, a plain object in tests) plus an optional `prev` snapshot for\n * `$changed`. The closure is cached **by predicate identity** in a\n * `WeakMap`, so passing the same `predicate` reference repeatedly is\n * allocation-free; cleanup is automatic once the predicate is no longer\n * reachable.\n *\n * Note: no actual compilation happens — the returned closure re-walks the\n * spec on every call via `evaluatePredicate`. The name reflects what the\n * function does (closure memoization keyed by predicate identity), not a\n * bytecode/AST compile step.\n *\n * Intended for advanced users who want a stable function reference per\n * predicate (custom devtools, batched analyses). Regular module code does\n * not need to call this — the engine wraps data-form `when` / `on` specs\n * automatically at registration.\n *\n * @example\n * ```ts\n * const predicate = { phase: \"red\", elapsed: { $gte: 30 } };\n * const check = memoizePredicate(predicate);\n * check({ phase: \"red\", elapsed: 45 }); // → true\n * check({ phase: \"red\", elapsed: 5 }); // → false\n * ```\n */\nexport function memoizePredicate(\n predicate: object,\n): (facts: Scope, prev?: Scope) => boolean {\n if (predicate === null || typeof predicate !== \"object\") {\n throw new Error(\n `[Directive] memoizePredicate: predicate must be a plain object or array; got ${typeof predicate}`,\n );\n }\n const cached = memoizedCache.get(predicate);\n if (cached) {\n return cached;\n }\n\n const fn = (facts: Scope, prev?: Scope): boolean =>\n evaluatePredicate(predicate, facts, prev);\n memoizedCache.set(predicate, fn);\n\n return fn;\n}\n\n// ============================================================================\n// Dependency extraction\n// ============================================================================\n\n/**\n * Collect the fact keys a predicate references. Used for static analysis,\n * devtools, and effect `on` dependency wiring. Nested predicates contribute\n * dotted keys (`auth.token`).\n *\n * @example\n * ```ts\n * extractDeps({ phase: \"red\", elapsed: { $gte: 30 } });\n * // → Set { \"phase\", \"elapsed\" }\n * extractDeps({ self: { phase: \"red\" }, auth: { token: { $exists: true } } });\n * // → Set { \"self.phase\", \"auth.token\" }\n * ```\n */\nexport function extractDeps(spec: unknown, prefix = \"\"): Set<string> {\n const deps = new Set<string>();\n\n // Single structural traversal — every operator clause and equality leaf\n // contributes its dotted fact path. Combinators and nested objects are\n // descended automatically; stray `$`-keys never synthesize phantom deps.\n walkPredicate(spec, {\n operator(factPath) {\n deps.add(prefix + factPath);\n },\n literal(factPath) {\n deps.add(prefix + factPath);\n },\n strayOperatorKey(key) {\n // A `$`-key at fact position never synthesizes a phantom dep. A typo'd\n // operator (e.g. `$eqq`) additionally dev-warns; a known operator\n // mixed with fact keys is skipped silently (evaluatePredicate warns).\n if (!PREDICATE_OPERATORS.has(key)) {\n devWarn(\n `extractDeps: unknown operator \"${key}\" — skipping. Known operators: ${[...PREDICATE_OPERATORS].join(\", \")}`,\n );\n }\n },\n });\n\n return deps;\n}\n\n// ============================================================================\n// Templates\n// ============================================================================\n\nconst IDENTIFIER = /^[A-Za-z_][A-Za-z0-9_]*$/;\n\n/** Stringify a value without dev-warns for null/undefined — used when the\n * caller has already emitted a higher-level diagnostic (e.g. \"unknown key\"). */\nfunction stringifyValueQuiet(v: unknown): string {\n if (typeof v === \"symbol\") {\n return \"\";\n }\n if (v === undefined || v === null) {\n return \"\";\n }\n\n return String(v);\n}\n\nfunction stringifyValue(v: unknown, key?: string): string {\n if (typeof v === \"symbol\") {\n devWarn(\"template: cannot interpolate a symbol value — using empty string\");\n\n return \"\";\n }\n if (v === undefined) {\n devWarn(\n `template: ${key ? `key \"${key}\" is ` : \"\"}undefined — using empty string`,\n );\n\n return \"\";\n }\n if (v === null) {\n devWarn(\n `template: ${key ? `key \"${key}\" is ` : \"\"}null — using empty string`,\n );\n\n return \"\";\n }\n\n return String(v);\n}\n\n/**\n * Interpolate a {@link FactTemplate} against a scope. Single-pass character\n * scanner: `${ident}` interpolates `scope[ident]`; `$${` emits a literal\n * `${`; unknown keys dev-warn and yield an empty string.\n *\n * @example\n * ```ts\n * evaluateTemplate({ $template: \"Hi ${name}!\" }, { name: \"Ada\" });\n * // → \"Hi Ada!\"\n * evaluateTemplate({ $template: \"$${price}\" }, {});\n * // → \"${price}\"\n * ```\n */\nexport function evaluateTemplate(spec: FactTemplate, scope: Scope): string {\n const tpl = spec.$template;\n let out = \"\";\n let i = 0;\n\n while (i < tpl.length) {\n if (tpl[i] === \"$\" && tpl[i + 1] === \"$\" && tpl[i + 2] === \"{\") {\n out += \"${\";\n i += 3;\n continue;\n }\n\n if (tpl[i] === \"$\" && tpl[i + 1] === \"{\") {\n const end = tpl.indexOf(\"}\", i + 2);\n if (end === -1) {\n devWarn(`template: unterminated \"\\${\" in ${JSON.stringify(tpl)}`);\n out += tpl.slice(i);\n break;\n }\n const key = tpl.slice(i + 2, end);\n if (!IDENTIFIER.test(key)) {\n devWarn(\n `template: invalid placeholder \"\\${${key}}\" — not an identifier`,\n );\n } else {\n // `stringifyValue` dev-warns separately for null vs undefined; here\n // we only warn when the key itself is missing from the scope (vs\n // present-but-null), so users see distinct diagnostics. Use\n // Object.hasOwn rather than `in` so prototype-chain keys (e.g.\n // `toString`, `constructor`) are never interpolated.\n const present = scope != null && Object.hasOwn(scope, key);\n const value = present ? scope[key] : undefined;\n if (!present) {\n devWarn(`template: unknown key \"${key}\"`);\n out += stringifyValueQuiet(value);\n } else {\n out += stringifyValue(value, key);\n }\n }\n i = end + 1;\n continue;\n }\n\n out += tpl[i];\n i++;\n }\n\n return out;\n}\n\n/**\n * Collect the placeholder keys referenced by a template. The static-analysis\n * counterpart to {@link extractDeps} — useful for devtools, codegen, and\n * \"which facts does this template read\" inspections. Only valid identifier\n * placeholders are collected; malformed ones are ignored.\n *\n * @example\n * ```ts\n * extractTemplateKeys({ $template: \"${firstName} ${lastName}\" });\n * // → Set { \"firstName\", \"lastName\" }\n * extractTemplateKeys({ $template: \"$${literal}\" });\n * // → Set {} (escaped — not a placeholder)\n * ```\n */\nexport function extractTemplateKeys(spec: FactTemplate): Set<string> {\n const keys = new Set<string>();\n const tpl = spec.$template;\n let i = 0;\n\n while (i < tpl.length) {\n if (tpl[i] === \"$\" && tpl[i + 1] === \"$\" && tpl[i + 2] === \"{\") {\n i += 3;\n continue;\n }\n if (tpl[i] === \"$\" && tpl[i + 1] === \"{\") {\n const end = tpl.indexOf(\"}\", i + 2);\n if (end === -1) {\n break;\n }\n const key = tpl.slice(i + 2, end);\n if (IDENTIFIER.test(key)) {\n keys.add(key);\n }\n i = end + 1;\n continue;\n }\n i++;\n }\n\n return keys;\n}\n\n// ============================================================================\n// Selectors\n// ============================================================================\n\n/**\n * Build a stable dedup key by selecting fields from a requirement payload.\n * Order-as-declared; values are stable-stringified (keys sorted recursively)\n * so two payloads with the same fields in different orders dedupe to the\n * same key.\n *\n * @example\n * ```ts\n * evaluateKeySelector([\"url\", \"method\"], { url: \"/a\", method: \"GET\" });\n * // → '\"/a\"|\"GET\"'\n * evaluateKeySelector([\"id\"], { id: 42 });\n * // → '42'\n * ```\n */\nexport function evaluateKeySelector(\n selector: readonly string[],\n source: Record<string, unknown>,\n): string {\n return selector.map((field) => stableStringify(source?.[field])).join(\"|\");\n}\n\n// ============================================================================\n// Patch\n// ============================================================================\n\n/**\n * Apply a {@link PatchSpec} — assign facts from literals, payload copies\n * (`$ref`), or interpolated strings (`$template`). Mutates through the passed\n * `facts` proxy so change-tracking and downstream invalidation fire.\n *\n * @example\n * ```ts\n * const spec = {\n * $set: {\n * active: true,\n * userId: { $ref: \"id\" },\n * label: { $template: \"user ${name}\" },\n * },\n * };\n * applyPatch(spec, facts, { id: \"u_1\", name: \"Ada\" });\n * // facts.active = true; facts.userId = \"u_1\"; facts.label = \"user Ada\"\n * ```\n */\nexport function applyPatch(\n spec: PatchSpec<Record<string, unknown>, Record<string, unknown>>,\n facts: Record<string, unknown>,\n payload: Record<string, unknown>,\n): void {\n const set = spec.$set;\n const safePayload = payload ?? {};\n for (const key of Object.keys(set)) {\n const value = (set as Record<string, unknown>)[key];\n\n if (isTemplate(value)) {\n facts[key] = evaluateTemplate(value, safePayload);\n } else if (\n isPlainObject(value) &&\n Object.hasOwn(value, \"$ref\") &&\n typeof value.$ref === \"string\"\n ) {\n const refKey = value.$ref;\n // Use Object.hasOwn rather than `in` — tightens defense against\n // prototype-chain lookups so a payload `__proto__` shape can't smuggle\n // an inherited property into the fact assignment. The proxy already\n // blocks writes to dangerous keys, but this keeps the read symmetric.\n if (!Object.hasOwn(safePayload, refKey)) {\n devWarn(\n `applyPatch: $ref \"${refKey}\" is missing from event payload — assigning undefined to fact \"${key}\"`,\n );\n }\n facts[key] = safePayload[refKey];\n } else {\n facts[key] = value;\n }\n }\n}\n","/**\n * Predicate backtest — rule-change impact.\n *\n * Given a recorded sequence of fact-state frames and a proposed replacement\n * for a constraint's `when` predicate, re-score the frames against BOTH the\n * original and the proposed predicate and produce a backtest report: how\n * many frames each matched, plus the per-frame diff (frames that newly\n * match / no longer match). It answers \"how many recorded frames would the\n * proposed rule have matched differently\" against real recorded history.\n *\n * This is a *static* backtest, not a behavioral simulation — the engine is\n * not re-run. Recorded frames are re-scored against a new predicate; the\n * resulting requirements, resolvers, and downstream fact changes are NOT\n * modeled. Treat the numbers as a divergence scan, not a forecast.\n *\n * Pure module — imports only the predicate runtime. No engine, store, or\n * tracking dependency. Replay walks frames in order; for `$changed`-style\n * predicates each frame is evaluated against the previous frame's facts.\n */\n\nimport {\n evaluatePredicate,\n evaluatePredicateExplained,\n isPredicate,\n validatePredicate,\n walkPredicate,\n} from \"./predicate.js\";\nimport type { ClauseResult, FactPredicate } from \"./types/predicate.js\";\nimport { PREDICATE_COMBINATORS, PREDICATE_OPERATORS } from \"./types/predicate.js\";\n\n/**\n * Upper bound on the number of frames a single {@link replayUnder} call will\n * process. A history file is held entirely in memory; an unbounded array is a\n * denial-of-service surface. A history larger than this should be split or\n * down-sampled before replay.\n */\nexport const MAX_REPLAY_FRAMES = 1_000_000;\n\n/** One recorded fact-state frame. */\nexport interface ReplayFrame<F = Record<string, unknown>> {\n /** Stable identifier — a snapshot id, an index, a session key. */\n id: string | number;\n /** Optional wall-clock time (ms epoch). */\n timestamp?: number;\n /** The fact state at this frame. */\n facts: F;\n}\n\nexport interface ReplayUnderOptions<F = Record<string, unknown>> {\n /** Recorded frames, chronological order. */\n frames: readonly ReplayFrame<F>[];\n /** The constraint's current `when` predicate (the baseline). */\n original: FactPredicate<F>;\n /** The proposed replacement `when` predicate. */\n proposed: FactPredicate<F>;\n /** Max diff samples to attach per bucket (default 20). */\n maxSamples?: number;\n /**\n * A fact key identifying the entity a frame belongs to (e.g. `\"userId\"`,\n * `\"sessionId\"`). When set, the report also reports distinct-entity counts\n * — how many unique entities matched, not just how many frames. Without it\n * the unit is frames: one fact snapshot, not one user or session.\n */\n entityKey?: string;\n}\n\n/** A frame where the original and proposed predicate disagree. */\nexport interface ReplayDiffSample {\n frameId: string | number;\n timestamp?: number;\n /** The fact state at this frame. */\n facts: Record<string, unknown>;\n /** Per-clause breakdown under the original predicate. */\n originalExplain: ClauseResult[];\n /** Per-clause breakdown under the proposed predicate. */\n proposedExplain: ClauseResult[];\n}\n\n/**\n * The outcome of replaying a recorded history under two predicates — a\n * static backtest of a proposed rule change, not a behavioral simulation.\n */\nexport interface PredicateBacktestReport {\n /** Total frames evaluated. */\n framesEvaluated: number;\n /**\n * Frames where the original predicate matched (was true). `matchedEntities`\n * is the count of distinct `entityKey` values among matched frames — only\n * populated when {@link ReplayUnderOptions.entityKey} was supplied.\n */\n original: { matched: number; matchedEntities?: number };\n /** Frames where the proposed predicate matched. */\n proposed: { matched: number; matchedEntities?: number };\n /** proposed.matched - original.matched. */\n delta: number;\n /** Total count of frames that newly match (original false -> proposed true). */\n newMatchCount: number;\n /** Total count of frames that no longer match (original true -> proposed false). */\n lostMatchCount: number;\n /** Frames where original and proposed agree. */\n unchanged: number;\n /** Sampled new-match frames (capped at maxSamples), with clause explain. */\n newMatches: ReplayDiffSample[];\n /** Sampled lost-match frames (capped at maxSamples), with clause explain. */\n lostMatches: ReplayDiffSample[];\n}\n\n/**\n * Validate one predicate spec for {@link replayUnder}, re-throwing any failure\n * with a message that names which spec (`original` / `proposed`) was bad.\n *\n * Three checks run, all up front so a malformed spec never reaches the\n * per-frame loop (where {@link evaluatePredicate} would throw a raw error on,\n * say, a `$matches` operand that is not a RegExp):\n *\n * 1. {@link validatePredicate} — JSON-unrehydratable operands (a `$matches`\n * operand that is not a RegExp, a `bigint`, a `Set`/`Map`).\n * 2. {@link isPredicate} — the spec is structurally a FactPredicate. An\n * empty object `{}` is a valid (always-true) predicate and is allowed.\n * 3. Unknown `$`-operators — a single walk surfaces any `$frobnicate`-style\n * typo as one clear error instead of a per-call dev-warn.\n */\nfunction validateReplaySpec(\n spec: unknown,\n which: \"original\" | \"proposed\",\n): void {\n try {\n validatePredicate(spec);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n\n throw new Error(\n `[Directive] replayUnder: the ${which} predicate is invalid — ${message}`,\n );\n }\n\n if (!isPredicate(spec)) {\n const preview =\n spec === null || typeof spec !== \"object\"\n ? `${typeof spec} — ${JSON.stringify(spec)}`\n : JSON.stringify(spec).slice(0, 80);\n\n throw new Error(\n `[Directive] replayUnder: the ${which} predicate is not a valid FactPredicate (got ${preview})`,\n );\n }\n\n // Surface an unknown `$`-operator (`$frobnicate`) as one clear error.\n // `walkPredicate` reports a `$`-key at fact position via `strayOperatorKey`\n // and an operator clause via `operator`; check both against the known sets.\n let unknownOp: string | undefined;\n walkPredicate(spec, {\n operator(_factPath, op) {\n if (\n unknownOp === undefined &&\n op.startsWith(\"$\") &&\n !PREDICATE_OPERATORS.has(op)\n ) {\n unknownOp = op;\n }\n },\n strayOperatorKey(key) {\n if (\n unknownOp === undefined &&\n !PREDICATE_OPERATORS.has(key) &&\n !PREDICATE_COMBINATORS.has(key)\n ) {\n unknownOp = key;\n }\n },\n });\n\n if (unknownOp !== undefined) {\n throw new Error(\n `[Directive] replayUnder: the ${which} predicate uses an unknown operator \"${unknownOp}\" — known operators: ${[...PREDICATE_OPERATORS].join(\", \")}`,\n );\n }\n}\n\n/**\n * Normalize a parsed-from-JSON history value into a `ReplayFrame[]`.\n *\n * Accepts the three documented history shapes:\n *\n * 1. A bare array of frames: `[{ id, timestamp?, facts }, ...]`\n * 2. An object wrapping them: `{ frames: [{ id, ..., facts }, ...] }`\n * 3. A bare array of fact objects: `[{ phase: \"red\", ... }, ...]`\n * — each element is wrapped as a frame.\n *\n * Frame ids are kept unambiguous: a frame that supplies its own `id` keeps\n * it; a frame missing an `id` (and every bare-fact frame) gets an\n * **index-derived** id prefixed with `#` (`\"#0\"`, `\"#1\"`, …) so a fallback\n * id can never collide with an explicit numeric or string id in a mixed\n * history. This is a pure helper — it **throws** a clear `Error` on bad\n * input and never calls `process.exit`, so library users can catch it.\n *\n * @example\n * ```ts\n * toReplayFrames([{ id: \"s1\", facts: { phase: \"red\" } }]);\n * // → [{ id: \"s1\", facts: { phase: \"red\" } }]\n * toReplayFrames([{ phase: \"red\" }, { phase: \"green\" }]);\n * // → [{ id: \"#0\", facts: { phase: \"red\" } }, { id: \"#1\", facts: { phase: \"green\" } }]\n * ```\n */\nexport function toReplayFrames(raw: unknown): ReplayFrame[] {\n // A history-manager export ({ version, snapshots, currentIndex }) is a\n // valid input shape — route it through framesFromHistory so the CLI and\n // the library accept the same files.\n if (\n raw &&\n typeof raw === \"object\" &&\n !Array.isArray(raw) &&\n Array.isArray((raw as { snapshots?: unknown }).snapshots)\n ) {\n return framesFromHistory(raw);\n }\n\n const list: unknown[] | null = Array.isArray(raw)\n ? raw\n : raw &&\n typeof raw === \"object\" &&\n Array.isArray((raw as { frames?: unknown }).frames)\n ? (raw as { frames: unknown[] }).frames\n : null;\n\n if (!list) {\n throw new Error(\n \"[Directive] toReplayFrames: history must be a JSON array of frames, an object with a `frames` array, or a history export with a `snapshots` array\",\n );\n }\n\n // Enforce the frame cap on `length` before `.map()` materializes a second\n // array — the cap must bound memory, not just the evaluation loop.\n if (list.length > MAX_REPLAY_FRAMES) {\n throw new Error(\n `[Directive] toReplayFrames: history has ${list.length} frames, exceeds the MAX_REPLAY_FRAMES limit (${MAX_REPLAY_FRAMES}) — split or down-sample the history`,\n );\n }\n\n return list.map((entry, index) => {\n if (entry && typeof entry === \"object\" && \"facts\" in entry) {\n const frame = entry as {\n id?: string | number;\n timestamp?: number;\n facts: unknown;\n };\n // An explicit id is used verbatim; a missing id falls back to a\n // `#`-prefixed index so it cannot collide with an explicit id.\n const out: ReplayFrame = {\n id: frame.id ?? `#${index}`,\n facts: (frame.facts ?? {}) as Record<string, unknown>,\n };\n if (typeof frame.timestamp === \"number\") {\n out.timestamp = frame.timestamp;\n }\n\n return out;\n }\n\n // A bare fact object — wrap it, keyed by `#`-prefixed index.\n return { id: `#${index}`, facts: (entry ?? {}) as Record<string, unknown> };\n });\n}\n\n/**\n * Convert a history-manager export (the JSON produced by\n * `system.history.export()`) into a `ReplayFrame[]` ready for\n * {@link replayUnder}.\n *\n * The history manager records a ring buffer of `{ id, timestamp, facts,\n * trigger }` snapshots; `export()` wraps them as `{ version, snapshots,\n * currentIndex }`. Each snapshot's `facts` is the fact state at that point,\n * so the snapshot sequence is exactly a frame stream.\n *\n * Accepts either the parsed export object, the raw JSON string, or a bare\n * array of snapshots. Throws a clear `Error` on bad input.\n *\n * @example\n * ```ts\n * const frames = framesFromHistory(system.history.export());\n * const report = replayUnder({ frames, original, proposed });\n * ```\n */\nexport function framesFromHistory(historyExport: unknown): ReplayFrame[] {\n const parsed =\n typeof historyExport === \"string\"\n ? (JSON.parse(historyExport) as unknown)\n : historyExport;\n\n // A bare snapshot array is accepted directly.\n if (Array.isArray(parsed)) {\n return framesFromSnapshots(parsed);\n }\n\n if (!parsed || typeof parsed !== \"object\") {\n throw new Error(\n \"[Directive] framesFromHistory: expected a history export object with a `snapshots` array (from system.history.export())\",\n );\n }\n\n const exportObj = parsed as { version?: unknown; snapshots?: unknown };\n\n // Mirror history.ts import(): only version 1 is understood. A bump in the\n // export format must fail loud here, not silently yield wrong frames.\n if (exportObj.version !== undefined && exportObj.version !== 1) {\n throw new Error(\n `[Directive] framesFromHistory: unsupported history export version ${JSON.stringify(exportObj.version)} — expected 1`,\n );\n }\n\n if (!Array.isArray(exportObj.snapshots)) {\n throw new Error(\n \"[Directive] framesFromHistory: expected a history export object with a `snapshots` array (from system.history.export())\",\n );\n }\n\n return framesFromSnapshots(exportObj.snapshots);\n}\n\n/**\n * Convert an array of `{ id, timestamp?, facts }` snapshots — e.g. the\n * `snapshots` field of a history export, or an array assembled by pushing\n * `system.getSnapshot()` on each reconcile — into a `ReplayFrame[]`.\n *\n * Throws a clear `Error` if the argument is not an array. Each snapshot is\n * normalized through the same {@link toReplayFrames} id logic.\n *\n * @example\n * ```ts\n * const snapshots: typeof history[] = [];\n * system.observe(() => snapshots.push(system.getSnapshot()));\n * // ...later\n * const frames = framesFromSnapshots(snapshots);\n * ```\n */\nexport function framesFromSnapshots(snapshots: unknown): ReplayFrame[] {\n if (!Array.isArray(snapshots)) {\n throw new Error(\n \"[Directive] framesFromSnapshots: expected an array of fact-state snapshots\",\n );\n }\n\n if (snapshots.length > MAX_REPLAY_FRAMES) {\n throw new Error(\n `[Directive] framesFromSnapshots: history has ${snapshots.length} snapshots, exceeds the MAX_REPLAY_FRAMES limit (${MAX_REPLAY_FRAMES}) — split or down-sample the history`,\n );\n }\n\n // A snapshot is always a { facts, ... } object — reject a garbage array\n // before it is silently wrapped into empty-fact frames.\n for (let i = 0; i < snapshots.length; i++) {\n const s = snapshots[i];\n if (!s || typeof s !== \"object\" || !(\"facts\" in s)) {\n throw new Error(\n `[Directive] framesFromSnapshots: snapshot at index ${i} is not a { facts, ... } object`,\n );\n }\n }\n\n return toReplayFrames(snapshots);\n}\n\n/**\n * Replay a recorded fact-frame history through two predicates — the\n * constraint's current `when` and a proposed replacement — and report how\n * their match sets differ.\n *\n * This is a **predicate backtest**: the engine is not re-run. Each recorded\n * frame is statically re-scored against both specs; the previous frame's\n * facts are threaded as `prev` so a replayed effect-`on` predicate using\n * `$changed` still works (for a constraint `when` it is harmless). The\n * report counts matches under each spec and buckets the disagreements into\n * new matches (original false, proposed true) and lost matches (original\n * true, proposed false). Up to `maxSamples` diff frames per bucket carry a\n * per-clause `evaluatePredicateExplained` breakdown for inspection.\n *\n * Both specs are validated up front — a malformed spec throws a clear\n * `[Directive] replayUnder:` error identifying which spec failed, rather\n * than letting a raw `evaluatePredicate` error escape mid-loop.\n *\n * @example\n * ```ts\n * const report = replayUnder({\n * frames: [\n * { id: 0, facts: { phase: \"red\", elapsed: 10 } },\n * { id: 1, facts: { phase: \"red\", elapsed: 35 } },\n * ],\n * original: { phase: \"red\" },\n * proposed: { phase: \"red\", elapsed: { $gte: 30 } },\n * });\n * // report.original.matched === 2\n * // report.proposed.matched === 1\n * // report.delta === -1\n * // report.lostMatchCount === 1\n * ```\n */\nexport function replayUnder<F = Record<string, unknown>>(\n options: ReplayUnderOptions<F>,\n): PredicateBacktestReport {\n const { frames, original, proposed, entityKey } = options;\n const requested = options.maxSamples ?? 20;\n const maxSamples = requested > 0 ? requested : 0;\n\n if (frames.length > MAX_REPLAY_FRAMES) {\n throw new Error(\n `[Directive] replayUnder: history has ${frames.length} frames, exceeds the MAX_REPLAY_FRAMES limit (${MAX_REPLAY_FRAMES}) — split or down-sample the history`,\n );\n }\n\n // Validate both specs before the frame loop — fail loud and clear here\n // rather than at frame 0 with a raw evaluatePredicate stack trace.\n validateReplaySpec(original, \"original\");\n validateReplaySpec(proposed, \"proposed\");\n\n let originalMatched = 0;\n let proposedMatched = 0;\n let newMatchCount = 0;\n let lostMatchCount = 0;\n let unchanged = 0;\n const newMatches: ReplayDiffSample[] = [];\n const lostMatches: ReplayDiffSample[] = [];\n\n // Distinct-entity tracking — only allocated when `entityKey` was supplied.\n const originalEntities = entityKey ? new Set<unknown>() : undefined;\n const proposedEntities = entityKey ? new Set<unknown>() : undefined;\n\n let prevFacts: Record<string, unknown> | undefined;\n\n for (const frame of frames) {\n const facts = frame.facts as Record<string, unknown>;\n const originalBit = evaluatePredicate(original, facts, prevFacts);\n const proposedBit = evaluatePredicate(proposed, facts, prevFacts);\n\n if (originalBit) {\n originalMatched++;\n originalEntities?.add(facts[entityKey as string]);\n }\n if (proposedBit) {\n proposedMatched++;\n proposedEntities?.add(facts[entityKey as string]);\n }\n\n if (originalBit === proposedBit) {\n unchanged++;\n } else if (!originalBit && proposedBit) {\n newMatchCount++;\n if (newMatches.length < maxSamples) {\n newMatches.push(buildSample(frame, original, proposed, prevFacts));\n }\n } else {\n lostMatchCount++;\n if (lostMatches.length < maxSamples) {\n lostMatches.push(buildSample(frame, original, proposed, prevFacts));\n }\n }\n\n prevFacts = facts;\n }\n\n const report: PredicateBacktestReport = {\n framesEvaluated: frames.length,\n original: { matched: originalMatched },\n proposed: { matched: proposedMatched },\n delta: proposedMatched - originalMatched,\n newMatchCount,\n lostMatchCount,\n unchanged,\n newMatches,\n lostMatches,\n };\n\n if (originalEntities && proposedEntities) {\n report.original.matchedEntities = originalEntities.size;\n report.proposed.matchedEntities = proposedEntities.size;\n }\n\n return report;\n}\n\n/**\n * Build a {@link ReplayDiffSample} for a frame the two predicates disagree\n * on — the per-clause explain is computed only here, never for non-diff\n * frames, so the common (mostly-agreeing) case stays cheap.\n */\nfunction buildSample<F>(\n frame: ReplayFrame<F>,\n original: unknown,\n proposed: unknown,\n prevFacts: Record<string, unknown> | undefined,\n): ReplayDiffSample {\n const facts = frame.facts as Record<string, unknown>;\n const sample: ReplayDiffSample = {\n frameId: frame.id,\n facts,\n originalExplain: evaluatePredicateExplained(original, facts, prevFacts),\n proposedExplain: evaluatePredicateExplained(proposed, facts, prevFacts),\n };\n\n if (frame.timestamp !== undefined) {\n sample.timestamp = frame.timestamp;\n }\n\n return sample;\n}\n","/**\n * Parameter sweep over a predicate template — the grid-search counterpart\n * to `replayUnder`.\n *\n * `replayUnder` diffs ONE proposed predicate against the original.\n * `sweepUnder` takes a **template** with one or more `{ $hole: \"name\" }`\n * markers and a set of candidate values, then replays the history once\n * per (cartesian-product) combination. The result is a response curve\n * over the parameter space plus the argmax under a user-supplied\n * objective — turning rule-tuning from guess-and-check into a one-call\n * optimization against recorded traffic.\n *\n * Pure module — imports only the predicate runtime and replay engine.\n * No engine / store / tracking dependency.\n */\n\nimport { MAX_PREDICATE_DEPTH } from \"./predicate.js\";\nimport { type PredicateBacktestReport, type ReplayFrame, replayUnder } from \"./replay-under.js\";\nimport type { FactPredicate } from \"./types/predicate.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** A placeholder inside a predicate template — substituted from `sweep` values. */\nexport interface SweepHole {\n readonly $hole: string;\n}\n\nexport interface SweepUnderOptions<F = Record<string, unknown>> {\n /** Recorded fact-state frames, in chronological order. */\n frames: readonly ReplayFrame<F>[];\n /** The constraint's current `when` predicate (baseline). */\n original: FactPredicate<F>;\n /**\n * Predicate template containing one or more `{ $hole: \"name\" }` markers.\n * Each marker is substituted by the corresponding value from `sweep` on\n * every point in the curve.\n *\n * @example\n * ```ts\n * { cartTotal: { $gte: { $hole: \"threshold\" } } }\n * ```\n */\n template: unknown;\n /**\n * Map of hole name → candidate values. Multiple holes produce the\n * cartesian product (grid search).\n *\n * @example\n * ```ts\n * { threshold: [25, 50, 100, 200] }\n * { riskScore: [0.5, 0.7, 0.9], minAge: [13, 18, 21] } // 3*3 = 9 points\n * ```\n */\n sweep: Readonly<Record<string, readonly unknown[]>>;\n /**\n * Score function for ranking. Higher is better. Default:\n * `(report) => report.proposed.matched` (maximize matched frames).\n */\n objective?: (report: PredicateBacktestReport) => number;\n /** Optional fact key to additionally report distinct-entity counts. */\n entityKey?: string;\n /**\n * Diff frames sampled per replay (default 0 — count-only for speed).\n * Set higher to inspect specific frames in the report.\n */\n maxSamples?: number;\n}\n\n/** One point on the sweep curve — one candidate value tuple. */\nexport interface SweepPoint {\n /** Hole name → value used at this point. */\n values: Readonly<Record<string, unknown>>;\n /** Full backtest report against this candidate. */\n report: PredicateBacktestReport;\n /** Computed objective score (higher is better). */\n score: number;\n}\n\nexport interface SweepReport {\n /** All points, in sweep order (cartesian-product traversal of sweep keys). */\n points: readonly SweepPoint[];\n /** Index of the highest-scoring point in `points`. */\n bestIndex: number;\n /** Convenience accessor: `points[bestIndex]`. */\n best: SweepPoint;\n /** The original predicate replayed against itself — score baseline for comparison. */\n baseline: SweepPoint;\n}\n\n/** Hard cap on points evaluated in a single sweep — protects against runaway grids. */\nexport const MAX_SWEEP_POINTS = 10_000;\n\n/**\n * Aggregate compute cap: `points × frames` per call. `MAX_SWEEP_POINTS`\n * (10k) and `MAX_REPLAY_FRAMES` (1M) bound each axis individually, but\n * their product would be 10B per-frame evaluations — minutes-to-hours of\n * compute. This caps the realistic upper bound at ~50M evaluations\n * (e.g. 50k frames × 1k points, or 5k frames × 10k points).\n */\nexport const MAX_SWEEP_EVALUATIONS = 50_000_000;\n\n// ============================================================================\n// Hole substitution\n// ============================================================================\n\nfunction isHole(v: unknown): v is SweepHole {\n return (\n v !== null &&\n typeof v === \"object\" &&\n !Array.isArray(v) &&\n Object.keys(v as object).length === 1 &&\n typeof (v as SweepHole).$hole === \"string\"\n );\n}\n\n/**\n * Walk `template`, replacing every `{ $hole: name }` marker with the value\n * looked up in `values`. Returns a new tree — does not mutate `template`.\n * Cycle-guarded; depth-capped at `MAX_PREDICATE_DEPTH`.\n *\n * Throws if a hole's name is not present in `values` — surfaces a typo'd\n * hole name up front rather than letting it land as `undefined` in the\n * evaluator.\n */\nfunction substitute(\n template: unknown,\n values: Record<string, unknown>,\n path: Set<object> = new Set(),\n depth = 0,\n): unknown {\n if (depth > MAX_PREDICATE_DEPTH) {\n throw new Error(\n `[Directive] sweepUnder: template exceeds MAX_PREDICATE_DEPTH (${MAX_PREDICATE_DEPTH}) — flatten the template or split the sweep`,\n );\n }\n\n if (isHole(template)) {\n const name = template.$hole;\n if (!(name in values)) {\n throw new Error(\n `[Directive] sweepUnder: template references hole \"${name}\" but sweep has no values for it`,\n );\n }\n\n // Don't recurse into the substituted value — sweep values are opaque\n // payloads, not templates. A value that itself looks like `{$hole:...}`\n // lands literally in the proposed predicate.\n return values[name];\n }\n\n if (template === null || typeof template !== \"object\") {\n return template;\n }\n\n // Cycle guard via DFS path Set — entries are removed on unwind so that\n // shared (non-cyclic) sub-trees still get substituted on every occurrence.\n if (path.has(template)) {\n throw new Error(\n \"[Directive] sweepUnder: template contains a cycle — predicate templates must be a tree\",\n );\n }\n path.add(template);\n\n try {\n if (Array.isArray(template)) {\n return template.map((entry) => substitute(entry, values, path, depth + 1));\n }\n\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(template)) {\n out[k] = substitute(v, values, path, depth + 1);\n }\n\n return out;\n } finally {\n path.delete(template);\n }\n}\n\n// ============================================================================\n// Cartesian product\n// ============================================================================\n\n/**\n * Iterate the cartesian product of the sweep map's value arrays, in\n * declaration order. Generator avoids materializing the whole grid for\n * large multi-hole sweeps.\n */\nfunction* cartesian(\n keys: readonly string[],\n sweep: Readonly<Record<string, readonly unknown[]>>,\n): Generator<Record<string, unknown>> {\n if (keys.length === 0) {\n yield {};\n\n return;\n }\n\n const head = keys[0] as string;\n const rest = keys.slice(1);\n const headValues = sweep[head] ?? [];\n for (const v of headValues) {\n for (const tail of cartesian(rest, sweep)) {\n yield { [head]: v, ...tail };\n }\n }\n}\n\nfunction gridSize(sweep: Readonly<Record<string, readonly unknown[]>>): number {\n let size = 1;\n for (const arr of Object.values(sweep)) {\n size *= arr.length;\n }\n\n return size;\n}\n\n// ============================================================================\n// Public API\n// ============================================================================\n\n/**\n * Sweep a predicate template's hole(s) across candidate values and replay\n * the recorded history through each one. Returns the full response curve\n * plus the argmax under a user-supplied objective.\n *\n * The mechanism is a tight loop over `replayUnder`: walk the cartesian\n * product of sweep values, substitute each combination into the template,\n * and run a backtest. Same caveats as `replayUnder` apply (no cascade\n * modeling, survivorship bias) — see {@link replayUnder} docs.\n *\n * @example\n * ```ts\n * const report = sweepUnder({\n * frames: recordedSessions,\n * original: { cartTotal: { $gte: 100 } },\n * template: { cartTotal: { $gte: { $hole: \"threshold\" } } },\n * sweep: { threshold: [25, 50, 100, 200] },\n * });\n *\n * report.best.values; // { threshold: 25 } (assuming higher matched is better)\n * report.best.report.proposed.matched; // 9210\n * report.baseline.score; // 4217 — the original spec's matched count\n * report.points.length; // 4\n * ```\n *\n * Multi-hole sweeps grid-search:\n *\n * ```ts\n * sweepUnder({\n * frames,\n * original,\n * template: {\n * risk: { $gte: { $hole: \"minRisk\" } },\n * age: { $gte: { $hole: \"minAge\" } },\n * },\n * sweep: { minRisk: [0.5, 0.7, 0.9], minAge: [13, 18, 21] },\n * });\n * // → 9 points (3 × 3)\n * ```\n */\nexport function sweepUnder<F = Record<string, unknown>>(\n options: SweepUnderOptions<F>,\n): SweepReport {\n const {\n frames,\n original,\n template,\n sweep,\n objective = (r) => r.proposed.matched,\n entityKey,\n maxSamples = 0,\n } = options;\n\n const keys = Object.keys(sweep);\n if (keys.length === 0) {\n throw new Error(\n \"[Directive] sweepUnder: `sweep` must contain at least one hole name\",\n );\n }\n\n const total = gridSize(sweep);\n if (total > MAX_SWEEP_POINTS) {\n throw new Error(\n `[Directive] sweepUnder: grid has ${total} points, exceeds the MAX_SWEEP_POINTS limit (${MAX_SWEEP_POINTS}) — narrow the sweep ranges or split the run`,\n );\n }\n if (total === 0) {\n throw new Error(\n \"[Directive] sweepUnder: at least one hole has zero candidate values\",\n );\n }\n const evaluations = total * frames.length;\n if (evaluations > MAX_SWEEP_EVALUATIONS) {\n throw new Error(\n `[Directive] sweepUnder: ${total} points × ${frames.length} frames = ${evaluations} per-frame evaluations, exceeds the MAX_SWEEP_EVALUATIONS limit (${MAX_SWEEP_EVALUATIONS}) — narrow the sweep, down-sample the history, or split the run`,\n );\n }\n\n // Invoke the user's objective with a catch + finite-number guard.\n // A throw or non-finite return becomes -Infinity so the point sinks in\n // the ranking instead of corrupting it (and stays out of the argmax).\n let warnedObjective = false;\n const safeObjective = (report: PredicateBacktestReport): number => {\n let raw: unknown;\n try {\n raw = objective(report);\n } catch (err) {\n if (!warnedObjective) {\n warnedObjective = true;\n console.warn(\n `[Directive] sweepUnder: objective threw — point will not rank (${(err as Error).message})`,\n );\n }\n\n return Number.NEGATIVE_INFINITY;\n }\n if (typeof raw !== \"number\" || !Number.isFinite(raw)) {\n if (!warnedObjective) {\n warnedObjective = true;\n console.warn(\n `[Directive] sweepUnder: objective returned a non-finite number (${String(raw)}) — point will not rank`,\n );\n }\n\n return Number.NEGATIVE_INFINITY;\n }\n\n return raw;\n };\n\n // Baseline: replay original against itself so the caller has a\n // comparable score under the same objective. This is one extra\n // replayUnder() call regardless of grid size — cheap, useful.\n const baselineReport = replayUnder({\n frames,\n original,\n proposed: original,\n entityKey,\n maxSamples,\n });\n const baseline: SweepPoint = {\n values: {},\n report: baselineReport,\n score: safeObjective(baselineReport),\n };\n\n const points: SweepPoint[] = [];\n let bestIndex = 0;\n let bestScore = Number.NEGATIVE_INFINITY;\n\n for (const values of cartesian(keys, sweep)) {\n const proposed = substitute(template, values) as FactPredicate<F>;\n const report = replayUnder({\n frames,\n original,\n proposed,\n entityKey,\n maxSamples,\n });\n const score = safeObjective(report);\n if (score > bestScore) {\n bestScore = score;\n bestIndex = points.length;\n }\n points.push({ values, report, score });\n }\n\n // points is guaranteed non-empty here because total > 0 and the loop ran.\n const best = points[bestIndex] as SweepPoint;\n\n return {\n points,\n bestIndex,\n best,\n baseline,\n };\n}\n","/**\n * `directive replay-under --history <frames.json> --proposed <spec.json>`\n *\n * Predicate backtest — rule-change impact. Given a recorded history of\n * fact-state frames and a proposed replacement for a constraint's `when`\n * predicate, re-score the frames against both the original and the proposed\n * predicate and report how their match sets differ — how many recorded\n * frames the proposed rule would have matched differently, answered against\n * real recorded history.\n *\n * History JSON is accepted in four shapes:\n * 1. A bare array of frames: [{ id, timestamp?, facts }, ...]\n * 2. An object wrapping them: { frames: [{ id, ..., facts }, ...] }\n * 3. A bare array of fact objects: [{ phase: \"red\", ... }, ...]\n * — each element is wrapped as a frame keyed by a `#`-prefixed index.\n * 4. A history-manager export: { version, snapshots, currentIndex }\n * — `system.history.export()` written to a file, read directly.\n *\n * The proposed (and original) predicate files each contain a single\n * FactPredicate object as JSON.\n *\n * v1 scope: `--original` is required — the CLI does not yet introspect a\n * live system to recover the constraint's current `when`. Recovering the\n * original spec from `system.inspect().constraints[].whenSpec` is a planned\n * enhancement.\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport {\n type FactPredicate,\n type PredicateBacktestReport,\n type ReplayFrame,\n replayUnder,\n toReplayFrames,\n} from \"@directive-run/core\";\nimport pc from \"picocolors\";\n\ninterface ReplayUnderCliOptions {\n historyPath?: string;\n proposedPath?: string;\n originalPath?: string;\n maxSamples: number;\n entityKey?: string;\n json: boolean;\n}\n\nfunction parseArgs(args: string[]): ReplayUnderCliOptions {\n const opts: ReplayUnderCliOptions = { maxSamples: 20, json: false };\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n switch (arg) {\n case \"--history\": {\n const val = args[++i];\n if (val) {\n opts.historyPath = val;\n }\n break;\n }\n case \"--proposed\":\n case \"-p\": {\n const val = args[++i];\n if (val) {\n opts.proposedPath = val;\n }\n break;\n }\n case \"--original\":\n case \"-o\": {\n const val = args[++i];\n if (val) {\n opts.originalPath = val;\n }\n break;\n }\n case \"--max-samples\": {\n const val = args[++i];\n const n = val ? Number.parseInt(val, 10) : Number.NaN;\n if (Number.isFinite(n) && n >= 0) {\n opts.maxSamples = n;\n }\n break;\n }\n case \"--entity-key\": {\n const val = args[++i];\n if (val) {\n opts.entityKey = val;\n }\n break;\n }\n case \"--json\":\n opts.json = true;\n break;\n }\n }\n\n return opts;\n}\n\nfunction printUsage(): void {\n console.error(`\nUsage: directive replay-under --history <frames.json> --proposed <spec.json>\n\nReplay a recorded fact-frame history through a proposed constraint\npredicate and report how its match set differs from the original.\nThis is a static predicate backtest — the engine is not re-run.\n\nOptions:\n --history <path> Recorded frames JSON (required) — a frame array,\n a { frames } object, a bare fact-object array, or\n a system.history.export() file\n --proposed <path> Proposed predicate JSON (required)\n --original <path> Original predicate JSON (required in v1)\n --max-samples <n> Diff frames sampled per bucket (default 20)\n --entity-key <fact> Fact key identifying an entity — also reports\n distinct-entity counts (e.g. userId, sessionId)\n --json Emit the PredicateBacktestReport as JSON\n --help Show this help\n\nExamples:\n directive replay-under --history sessions.json \\\\\n --original current-rule.json --proposed tightened-rule.json\n directive replay-under --history sessions.json \\\\\n --original a.json --proposed b.json --entity-key userId --json\n`);\n}\n\n/** Parse a JSON file, exiting with a clear message on failure. */\nfunction readJsonFile(path: string, label: string): unknown {\n const resolved = resolve(path);\n if (!existsSync(resolved)) {\n console.error(pc.red(`error: ${label} file not found: ${resolved}`));\n process.exit(1);\n }\n try {\n return JSON.parse(readFileSync(resolved, \"utf8\"));\n } catch (err) {\n console.error(\n pc.red(`error: failed to parse ${label} (${resolved}): `) +\n (err as Error).message,\n );\n process.exit(1);\n }\n}\n\n/**\n * Normalize a parsed history JSON into a `ReplayFrame[]` — a thin wrapper\n * over the core `toReplayFrames` helper that turns its thrown error into a\n * clean CLI message and exit.\n */\nfunction loadFrames(raw: unknown): ReplayFrame[] {\n try {\n return toReplayFrames(raw);\n } catch (err) {\n console.error(pc.red(`error: ${(err as Error).message}`));\n process.exit(1);\n }\n}\n\n/** True when a parsed spec is the always-true empty predicate `{}`. */\nfunction isEmptyPredicate(spec: unknown): boolean {\n return (\n spec !== null &&\n typeof spec === \"object\" &&\n !Array.isArray(spec) &&\n Object.keys(spec as object).length === 0\n );\n}\n\n/** Compact one-line preview of a frame's facts. */\nfunction previewFacts(facts: Record<string, unknown>): string {\n const parts = Object.entries(facts)\n .slice(0, 6)\n .map(([k, v]) => `${k}=${JSON.stringify(v)}`);\n const extra = Object.keys(facts).length - parts.length;\n\n return parts.join(\" \") + (extra > 0 ? pc.dim(` +${extra} more`) : \"\");\n}\n\nfunction printReport(\n report: PredicateBacktestReport,\n entityKey: string | undefined,\n): void {\n const { original, proposed, delta } = report;\n const deltaStr =\n delta > 0\n ? pc.green(`+${delta}`)\n : delta < 0\n ? pc.red(`${delta}`)\n : pc.dim(\"±0\");\n\n console.log(`\\n${pc.bold(\"replay-under\")} — predicate backtest\\n`);\n console.log(` frames evaluated ${report.framesEvaluated}`);\n console.log(` original spec matched ${original.matched} frames`);\n console.log(\n ` proposed spec matched ${proposed.matched} frames (${deltaStr})`,\n );\n\n // Distinct-entity counts — only present when --entity-key was supplied.\n if (\n entityKey &&\n original.matchedEntities !== undefined &&\n proposed.matchedEntities !== undefined\n ) {\n console.log(\n `\\n original spec matched across ${original.matchedEntities} ${entityKey}s`,\n );\n console.log(\n ` proposed spec matched across ${proposed.matchedEntities} ${entityKey}s`,\n );\n }\n\n console.log(\"\");\n console.log(\n ` ${pc.green(`+${report.newMatchCount}`)} new matches ${pc.dim(\"frames that now match the rule\")}`,\n );\n console.log(\n ` ${pc.red(`-${report.lostMatchCount}`)} lost matches ${pc.dim(\"frames that no longer match\")}`,\n );\n\n if (report.newMatches.length > 0) {\n console.log(`\\n ${pc.green(\"sample new matches:\")}`);\n for (const s of report.newMatches.slice(0, 8)) {\n console.log(` frame ${s.frameId} ${pc.dim(previewFacts(s.facts))}`);\n }\n }\n if (report.lostMatches.length > 0) {\n console.log(`\\n ${pc.red(\"sample lost matches:\")}`);\n for (const s of report.lostMatches.slice(0, 8)) {\n console.log(` frame ${s.frameId} ${pc.dim(previewFacts(s.facts))}`);\n }\n }\n\n const sampled = report.newMatches.length + report.lostMatches.length;\n const total = report.newMatchCount + report.lostMatchCount;\n if (sampled < total) {\n console.log(\n pc.dim(`\\n ${sampled} of ${total} diff frames sampled — --json for the full report`),\n );\n }\n console.log(\"\");\n}\n\nexport async function replayUnderCommand(args: string[]): Promise<void> {\n if (args.includes(\"--help\") || args.length === 0) {\n printUsage();\n process.exit(args.length === 0 ? 1 : 0);\n }\n\n const opts = parseArgs(args);\n\n if (!opts.historyPath) {\n console.error(pc.red(\"error: --history <frames.json> is required\"));\n printUsage();\n process.exit(1);\n }\n if (!opts.proposedPath) {\n console.error(pc.red(\"error: --proposed <spec.json> is required\"));\n printUsage();\n process.exit(1);\n }\n if (!opts.originalPath) {\n console.error(\n pc.red(\"error: --original <spec.json> is required\") +\n pc.dim(\"\\n (v1 cannot recover the constraint's current `when` from a live system)\"),\n );\n printUsage();\n process.exit(1);\n }\n\n const frames = loadFrames(readJsonFile(opts.historyPath, \"--history\"));\n const original = readJsonFile(opts.originalPath, \"--original\");\n const proposed = readJsonFile(opts.proposedPath, \"--proposed\");\n\n // An empty predicate `{}` is valid but always-true — warn so a confident\n // \"matched every frame\" report is not mistaken for a meaningful result.\n if (isEmptyPredicate(original)) {\n console.error(\n pc.yellow(\"warning: --original is an empty predicate {} — it matches every frame\"),\n );\n }\n if (isEmptyPredicate(proposed)) {\n console.error(\n pc.yellow(\"warning: --proposed is an empty predicate {} — it matches every frame\"),\n );\n }\n\n let report: PredicateBacktestReport;\n try {\n // `original` / `proposed` are JSON-parsed `unknown` — replayUnder\n // validates their structure at runtime and throws a clear error on a\n // bad spec, so the cast here is the documented boundary.\n report = replayUnder({\n frames,\n original: original as FactPredicate<Record<string, unknown>>,\n proposed: proposed as FactPredicate<Record<string, unknown>>,\n maxSamples: opts.maxSamples,\n entityKey: opts.entityKey,\n });\n } catch (err) {\n // replayUnder throws a clear `[Directive] replayUnder:` error on an\n // invalid spec or an over-limit history — surface the message, never a\n // raw stack trace.\n console.error(pc.red(`error: ${(err as Error).message}`));\n process.exit(1);\n }\n\n if (opts.json) {\n console.log(JSON.stringify(report, null, 2));\n\n return;\n }\n\n printReport(report, opts.entityKey);\n}\n","/**\n * `directive replay <timeline.json> --system <module.ts>`\n *\n * Replay a serialized timeline against a fresh Directive system. Pairs\n * with `@directive-run/timeline`'s `serializeTimeline()` — the typical\n * flow:\n *\n * 1. Production error captures the last N seconds of timeline frames\n * via `recordTimeline(sys, ...)` + `serializeTimeline(t)`. The\n * JSON gets attached to a Sentry / PostHog / bug-tracker entry.\n * 2. A developer downloads the JSON and runs:\n * directive replay bug-1234.json --system path/to/module.ts\n * 3. The CLI loads the module, instantiates a fresh system, and\n * replays every dispatchable frame in order. The `ReplayResult`\n * summarizes how many frames dispatched / skipped / truncated.\n *\n * v0.1 scope (deliberately narrow):\n * - Only reconstructs MUTATE dispatches (matches @directive-run/timeline's\n * v0.1 dispatchable filter).\n * - The user's --system file must default-export a `System` instance,\n * OR export a named `createSystem`-shaped factory we can call.\n * - No assertion DSL today — the CLI prints the replay diagnostic.\n * Consumers writing assertions use `replayTimeline()` from the\n * library directly inside vitest, paired with R1.B matchers.\n *\n * v0.2 scope (deferred, see docs/IDEAS.md):\n * - `--as-test` flag emits a vitest source file that drives the same\n * replay loop with structured assertions.\n * - `--bisect <good.json>` for git-bisect over timeline frames.\n * - `--diff <other.json>` for causal-graph diff output.\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport pc from \"picocolors\";\nimport { loadSystem } from \"../lib/loader.js\";\nimport { loadTimelinePackage } from \"../lib/timeline-loader.js\";\n\ninterface ReplayCliOptions {\n systemPath?: string;\n maxFrames?: number;\n json: boolean;\n dispatchableOnly: boolean;\n verbose: boolean;\n}\n\nfunction parseArgs(args: string[]): {\n jsonPath: string;\n opts: ReplayCliOptions;\n} {\n const opts: ReplayCliOptions = {\n json: false,\n dispatchableOnly: true,\n verbose: false,\n };\n let jsonPath = \"\";\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n switch (arg) {\n case \"--system\":\n case \"-s\": {\n const val = args[++i];\n if (val) opts.systemPath = val;\n break;\n }\n case \"--max-frames\": {\n const val = args[++i];\n const n = val ? Number.parseInt(val, 10) : Number.NaN;\n if (Number.isFinite(n) && n > 0) opts.maxFrames = n;\n break;\n }\n case \"--all-frames\":\n case \"--no-dispatchable-only\":\n opts.dispatchableOnly = false;\n break;\n case \"--json\":\n opts.json = true;\n break;\n case \"--verbose\":\n case \"-v\":\n opts.verbose = true;\n break;\n default:\n if (arg && !arg.startsWith(\"-\") && !jsonPath) {\n jsonPath = arg;\n }\n }\n }\n\n return { jsonPath, opts };\n}\n\nfunction printUsage(): void {\n console.error(`\nUsage: directive replay <timeline.json> [options]\n\nReplay a serialized Directive timeline against a fresh system.\n\nArguments:\n <timeline.json> Path to a timeline produced by serializeTimeline()\n\nOptions:\n --system, -s <path> Path to a TypeScript file exporting a Directive\n system (default export or 'system' named export)\n --max-frames <n> Cap on frames replayed (default 100,000)\n --all-frames Walk every frame, not just dispatchable ones\n (diagnostic mode — most frames will skip silently)\n --json Emit ReplayResult as JSON\n --verbose, -v Print per-frame trace\n --help, -h Show this help\n\nExamples:\n directive replay bug-1234.json --system src/app/system.ts\n directive replay error.json --system src/system.ts --json\n directive replay error.json --system src/system.ts --verbose\n`);\n}\n\nexport async function replayCommand(args: string[]): Promise<void> {\n if (args.includes(\"--help\") || args.includes(\"-h\") || args.length === 0) {\n printUsage();\n process.exit(args.length === 0 ? 1 : 0);\n }\n\n const { jsonPath, opts } = parseArgs(args);\n\n if (!jsonPath) {\n console.error(pc.red(\"error: missing <timeline.json> argument\"));\n printUsage();\n process.exit(1);\n }\n if (!opts.systemPath) {\n console.error(\n pc.red(\"error: --system <path> is required\"),\n pc.dim(\"\\n (replay needs a fresh system to dispatch against)\"),\n );\n printUsage();\n process.exit(1);\n }\n\n const resolvedJson = resolve(jsonPath);\n if (!existsSync(resolvedJson)) {\n console.error(pc.red(`error: timeline file not found: ${resolvedJson}`));\n process.exit(1);\n }\n\n // Load the timeline JSON.\n let raw: string;\n try {\n raw = readFileSync(resolvedJson, \"utf8\");\n } catch (err) {\n console.error(\n pc.red(\n `error: failed to read ${resolvedJson}: ${(err as Error).message}`,\n ),\n );\n process.exit(1);\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (err) {\n console.error(\n pc.red(\n `error: ${resolvedJson} is not valid JSON: ${(err as Error).message}`,\n ),\n );\n process.exit(1);\n }\n\n // Lazy-import the timeline package — optional peer.\n const { deserializeTimeline, replayTimeline } = await loadTimelinePackage(\n opts.verbose,\n );\n\n // Validate + deserialize.\n let timeline: ReturnType<typeof deserializeTimeline>;\n try {\n timeline = deserializeTimeline(parsed);\n } catch (err) {\n console.error(\n pc.red(\n `error: timeline JSON failed validation: ${(err as Error).message}`,\n ),\n );\n process.exit(1);\n }\n\n // Load the user's system.\n let system: unknown;\n try {\n system = await loadSystem(opts.systemPath);\n } catch (err) {\n console.error(\n pc.red(`error: failed to load system file: ${(err as Error).message}`),\n );\n process.exit(1);\n }\n\n // Type-guard: replayTimeline needs a `dispatch` function.\n const sys = system as { dispatch?: unknown; start?: () => void };\n if (typeof sys.dispatch !== \"function\") {\n console.error(\n pc.red(\n `error: loaded system has no dispatch() method. The --system file must export a started Directive system or a factory.`,\n ),\n );\n process.exit(1);\n }\n\n // Start the system if it isn't already running. Many user files\n // export pre-started systems; double-start is safe (createSystem\n // handles it idempotently).\n if (typeof sys.start === \"function\") {\n try {\n sys.start();\n } catch {\n /* already running — fine */\n }\n }\n\n // Replay. The earlier `typeof sys.dispatch !== 'function'` guard\n // (line ~210) verifies the duck-type at runtime; the cast here just\n // bridges the unknown-typed loadSystem return to replayTimeline's\n // typed ReplayableSystem.\n const result = await replayTimeline(\n timeline,\n sys as {\n dispatch: (event: { type: string; [key: string]: unknown }) => void;\n },\n {\n dispatchableOnly: opts.dispatchableOnly,\n maxFrames: opts.maxFrames,\n },\n );\n\n if (opts.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n const { dispatched, skipped, truncated } = result;\n const ok = dispatched > 0;\n console.log(\n `${ok ? pc.green(\"✓\") : pc.yellow(\"⚠\")} replay complete:`,\n pc.bold(`${dispatched} dispatched`),\n pc.dim(`/ ${skipped} skipped`),\n truncated > 0 ? pc.yellow(`/ ${truncated} TRUNCATED`) : \"\",\n );\n if (dispatched === 0) {\n console.error(\n pc.yellow(\n \"warning: 0 frames dispatched. Either the timeline contains only non-dispatchable frames (system lifecycle, derivations, etc.) or the system shape doesn't match what the timeline recorded.\",\n ),\n );\n }\n if (truncated > 0) {\n console.error(\n pc.yellow(\n `warning: ${truncated} frames truncated by --max-frames cap. Raise it with --max-frames <n> if you need them.`,\n ),\n );\n }\n }\n\n // Exit cleanly. The caller's tests / assertions can chain off this\n // exit status: 0 = replay completed (independent of dispatched count\n // — that's a metric, not a pass/fail).\n process.exit(0);\n}\n","/**\n * `directive timeline diff <a.json> <b.json>`\n *\n * Semantic causal-graph diff between two serialized timelines. Pairs\n * with `@directive-run/timeline`'s `diffTimelines()` (R2.C). Typical\n * flow:\n *\n * 1. Engineer captures two timelines: a known-good run + a\n * regression-bearing run.\n * 2. Run:\n * directive timeline diff good.json bad.json\n * 3. CLI prints a structured report — frame counts, constraint-fire\n * deltas, mutation deltas, resolver-run deltas, new errors.\n *\n * Output modes:\n * - default: human-readable Markdown-style table.\n * - --json: raw `TimelineDiff` for piping into jq / CI.\n *\n * Exit codes:\n * 0 → identical timelines\n * 1 → CLI argument error\n * 2 → diff found differences (CI gate friendly)\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\n// R5 arch C2: import types directly from the timeline package. These\n// imports are fully erased at compile time (no runtime require), so the\n// optional-peer / lazy `await import()` pattern below is preserved\n// exactly. Sourcing the types from the package eliminates the silent\n// drift risk that would arise from re-declaring them here.\nimport type {\n CountDelta,\n ErrorDelta,\n ResolverRunDelta,\n} from \"@directive-run/timeline\";\nimport pc from \"picocolors\";\nimport { loadTimelinePackage } from \"../lib/timeline-loader.js\";\n\ninterface TimelineDiffCliOptions {\n json: boolean;\n verbose: boolean;\n}\n\nfunction parseArgs(args: string[]): {\n aPath: string;\n bPath: string;\n opts: TimelineDiffCliOptions;\n} {\n const opts: TimelineDiffCliOptions = { json: false, verbose: false };\n const positionals: string[] = [];\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n switch (arg) {\n case \"--json\":\n opts.json = true;\n break;\n case \"--verbose\":\n case \"-v\":\n opts.verbose = true;\n break;\n default:\n if (arg && !arg.startsWith(\"-\")) positionals.push(arg);\n }\n }\n return {\n aPath: positionals[0] ?? \"\",\n bPath: positionals[1] ?? \"\",\n opts,\n };\n}\n\nfunction printUsage(): void {\n console.error(`\nUsage: directive timeline diff <a.json> <b.json>\n\nCompare two serialized Directive timelines as a structured causal-graph\ndiff. Reports frame counts, constraint-fire deltas, mutation deltas,\nresolver runs, and new errors.\n\nArguments:\n <a.json> First timeline (typically the \"good\" / baseline run)\n <b.json> Second timeline (typically the \"bad\" / regression run)\n\nOptions:\n --json Emit TimelineDiff as JSON\n -v, --verbose Include unchanged categories in the human output\n --help, -h Show this help\n\nExit codes:\n 0 identical timelines\n 1 CLI argument error\n 2 diff found differences\n\nExamples:\n directive timeline diff baseline.json regression.json\n directive timeline diff a.json b.json --json | jq .constraintFires\n`);\n}\n\nfunction fmtSign(n: number): string {\n if (n > 0) return pc.green(`+${n}`);\n if (n < 0) return pc.red(`${n}`);\n return pc.dim(\" 0\");\n}\n\nfunction fmtCountDelta(rows: CountDelta[]): string[] {\n if (rows.length === 0) return [pc.dim(\" (no differences)\")];\n return rows.map(\n (r) =>\n ` ${pc.bold(r.id.padEnd(28))} ${String(r.aCount).padStart(4)} → ${String(r.bCount).padStart(4)} (${fmtSign(r.delta)})`,\n );\n}\n\nfunction fmtResolverRows(rows: ResolverRunDelta[]): string[] {\n if (rows.length === 0) return [pc.dim(\" (no differences)\")];\n return rows.map(\n (r) =>\n ` ${pc.bold(r.resolver.padEnd(28))} ` +\n `starts ${r.aStarts}→${r.bStarts} (${fmtSign(r.bStarts - r.aStarts)}) ` +\n `completes ${r.aCompletes}→${r.bCompletes} (${fmtSign(r.bCompletes - r.aCompletes)}) ` +\n `errors ${r.aErrors}→${r.bErrors} (${fmtSign(r.bErrors - r.aErrors)})`,\n );\n}\n\nfunction fmtErrors(rows: ErrorDelta[]): string[] {\n if (rows.length === 0) return [pc.dim(\" (no new errors)\")];\n return rows.map((e) => {\n const sideTag = e.side === \"a\" ? pc.cyan(\"a-only\") : pc.yellow(\"b-only\");\n const errStr = (() => {\n try {\n return JSON.stringify(e.error);\n } catch {\n return `[${typeof e.error}]`;\n }\n })();\n return ` ${sideTag} frame #${e.frameIndex} ${pc.bold(e.kind)} '${e.id}' ${pc.dim(errStr)}`;\n });\n}\n\nfunction readTimeline(path: string): unknown {\n const resolved = resolve(path);\n if (!existsSync(resolved)) {\n console.error(pc.red(`error: timeline file not found: ${resolved}`));\n process.exit(1);\n }\n let raw: string;\n try {\n raw = readFileSync(resolved, \"utf8\");\n } catch (err) {\n console.error(\n pc.red(`error: failed to read ${resolved}: ${(err as Error).message}`),\n );\n process.exit(1);\n }\n try {\n return JSON.parse(raw);\n } catch (err) {\n console.error(\n pc.red(`error: ${resolved} is not valid JSON: ${(err as Error).message}`),\n );\n process.exit(1);\n }\n}\n\nexport async function timelineDiffCommand(args: string[]): Promise<void> {\n if (args.includes(\"--help\") || args.includes(\"-h\") || args.length === 0) {\n printUsage();\n process.exit(args.length === 0 ? 1 : 0);\n }\n\n const { aPath, bPath, opts } = parseArgs(args);\n if (!aPath || !bPath) {\n console.error(pc.red(\"error: both <a.json> and <b.json> are required\"));\n printUsage();\n process.exit(1);\n }\n\n // Lazy-import the timeline package — optional peer.\n const { deserializeTimeline, diffTimelines } = await loadTimelinePackage(\n opts.verbose,\n );\n\n // Parse + validate.\n const aRaw = readTimeline(aPath);\n const bRaw = readTimeline(bPath);\n let aTl: ReturnType<typeof deserializeTimeline>;\n let bTl: ReturnType<typeof deserializeTimeline>;\n try {\n aTl = deserializeTimeline(aRaw);\n bTl = deserializeTimeline(bRaw);\n } catch (err) {\n console.error(\n pc.red(\n `error: timeline JSON failed validation: ${(err as Error).message}`,\n ),\n );\n process.exit(1);\n }\n\n const diff = diffTimelines(aTl, bTl);\n\n if (opts.json) {\n console.log(JSON.stringify(diff, null, 2));\n process.exit(diff.identical ? 0 : 2);\n }\n\n // Human output.\n if (diff.identical) {\n console.log(\n pc.green(\"✓ identical:\"),\n `both timelines have ${diff.aFrameCount} frames and the same causal shape.`,\n );\n process.exit(0);\n }\n\n console.log(pc.bold(\"Timeline diff\"), pc.dim(`(${aPath} vs ${bPath})`));\n console.log(\"\");\n console.log(\n `Frames: ${diff.aFrameCount} → ${diff.bFrameCount} (${fmtSign(diff.frameCountDelta)})`,\n );\n console.log(\"\");\n\n console.log(pc.bold(\"Constraint fires:\"));\n for (const line of fmtCountDelta(diff.constraintFires)) console.log(line);\n console.log(\"\");\n\n console.log(pc.bold(\"Mutations:\"));\n for (const line of fmtCountDelta(diff.mutations)) console.log(line);\n console.log(\"\");\n\n console.log(pc.bold(\"Resolver runs:\"));\n for (const line of fmtResolverRows(diff.resolverRuns)) console.log(line);\n console.log(\"\");\n\n console.log(pc.bold(\"New errors:\"));\n for (const line of fmtErrors(diff.newErrors)) console.log(line);\n console.log(\"\");\n\n process.exit(2);\n}\n","/**\n * `directive tune --history <frames.json> --original <spec.json> --template <spec.json> --sweep <key:range>`\n *\n * Sweep one or more `$hole`-marked parameters in a predicate template\n * against recorded history, render the resulting response curve as an\n * ASCII sparkline, and name the optimum.\n *\n * Two `--sweep` value formats:\n * • Numeric range: `--sweep threshold:25..200:25` → 25, 50, 75, …, 200\n * • Discrete values: `--sweep plan:free,plus,pro`\n *\n * Pass `--sweep` multiple times for a multi-hole grid search.\n *\n * The template is a regular `FactPredicate` JSON with `{ \"$hole\": \"name\" }`\n * placeholders inserted wherever a sweep value should land. The original\n * predicate JSON (the constraint's current `when`) is required as the\n * baseline against which deltas are reported.\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport {\n type ReplayFrame,\n type SweepReport,\n sweepUnder,\n toReplayFrames,\n} from \"@directive-run/core\";\nimport pc from \"picocolors\";\n\ninterface TuneCliOptions {\n historyPath?: string;\n originalPath?: string;\n templatePath?: string;\n sweepArgs: string[];\n entityKey?: string;\n json: boolean;\n}\n\nfunction parseArgs(args: string[]): TuneCliOptions {\n const opts: TuneCliOptions = { sweepArgs: [], json: false };\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n switch (arg) {\n case \"--history\": {\n const val = args[++i];\n if (val) opts.historyPath = val;\n break;\n }\n case \"--original\":\n case \"-o\": {\n const val = args[++i];\n if (val) opts.originalPath = val;\n break;\n }\n case \"--template\":\n case \"-t\": {\n const val = args[++i];\n if (val) opts.templatePath = val;\n break;\n }\n case \"--sweep\":\n case \"-s\": {\n const val = args[++i];\n if (val) opts.sweepArgs.push(val);\n break;\n }\n case \"--entity-key\": {\n const val = args[++i];\n if (val) opts.entityKey = val;\n break;\n }\n case \"--json\":\n opts.json = true;\n break;\n }\n }\n\n return opts;\n}\n\nfunction printUsage(): void {\n console.error(`\nUsage: directive tune --history <frames.json> --original <orig.json> \\\\\n --template <tmpl.json> --sweep <key:range>\n\nGrid-search one or more parameters in a predicate template against a\nrecorded fact history and print the response curve.\n\nOptions:\n --history <path> Recorded frames JSON (required)\n --original <path> Original predicate JSON — the baseline (required)\n --template <path> Predicate template with { \"$hole\": \"name\" } markers (required)\n --sweep <key:range> Repeatable. Range syntax:\n * numeric: key:25..200:25 (start..end:step)\n * discrete: key:val1,val2,val3\n --entity-key <fact> Fact key identifying an entity — also reports\n distinct-entity counts (e.g. userId)\n --json Emit the full SweepReport as JSON\n --help Show this help\n\nExample:\n directive tune --history sessions.json \\\\\n --original current.json --template proposed-template.json \\\\\n --sweep threshold:25..200:25\n`);\n}\n\nfunction readJsonFile(path: string, label: string): unknown {\n const resolved = resolve(path);\n if (!existsSync(resolved)) {\n console.error(pc.red(`error: ${label} file not found: ${resolved}`));\n process.exit(1);\n }\n try {\n return JSON.parse(readFileSync(resolved, \"utf8\"));\n } catch (err) {\n console.error(\n pc.red(`error: failed to parse ${label} (${resolved}): `) +\n (err as Error).message,\n );\n process.exit(1);\n }\n}\n\nfunction loadFrames(raw: unknown): ReplayFrame[] {\n try {\n return toReplayFrames(raw);\n } catch (err) {\n console.error(pc.red(`error: ${(err as Error).message}`));\n process.exit(1);\n }\n}\n\n/**\n * Parse a single `--sweep` argument into a `[name, values]` pair.\n *\n * Accepts:\n * - `name:start..end[:step]` for numeric ranges (step defaults to 1)\n * - `name:a,b,c` for discrete values (each parsed as a number if it\n * looks numeric, otherwise kept as a string)\n */\nfunction parseSweepArg(arg: string): [string, unknown[]] {\n const colon = arg.indexOf(\":\");\n if (colon < 1) {\n console.error(\n pc.red(`error: --sweep ${arg}: missing ':' between hole name and values`),\n );\n process.exit(1);\n }\n const name = arg.slice(0, colon);\n const rangeStr = arg.slice(colon + 1);\n\n // Range form: a..b[:step]\n const rangeMatch = rangeStr.match(/^(-?\\d+(?:\\.\\d+)?)\\.\\.(-?\\d+(?:\\.\\d+)?)(?::(-?\\d+(?:\\.\\d+)?))?$/);\n if (rangeMatch) {\n const [, startStr, endStr, stepStr] = rangeMatch;\n const start = Number(startStr);\n const end = Number(endStr);\n const step = stepStr ? Number(stepStr) : 1;\n if (step <= 0) {\n console.error(pc.red(`error: --sweep ${arg}: step must be positive`));\n process.exit(1);\n }\n if (end < start) {\n console.error(\n pc.red(`error: --sweep ${arg}: end (${end}) must be >= start (${start})`),\n );\n process.exit(1);\n }\n const values: number[] = [];\n for (let v = start; v <= end + 1e-9; v += step) {\n values.push(Math.round(v * 1e6) / 1e6);\n }\n\n return [name, values];\n }\n\n // Discrete form: a,b,c (parse each as number if possible, else string)\n const tokens = rangeStr.split(\",\").map((s) => s.trim()).filter((s) => s.length > 0);\n if (tokens.length === 0) {\n console.error(pc.red(`error: --sweep ${arg}: no values after ':'`));\n process.exit(1);\n }\n const values = tokens.map((t) => {\n const n = Number(t);\n return Number.isNaN(n) ? t : n;\n });\n\n return [name, values];\n}\n\n// ============================================================================\n// Sparkline renderer\n// ============================================================================\n\nconst BLOCKS = [\"▁\", \"▂\", \"▃\", \"▄\", \"▅\", \"▆\", \"▇\", \"█\"];\n\nfunction bar(value: number, max: number, width = 32): string {\n if (max <= 0) return \"\".padEnd(width);\n const filled = Math.round((value / max) * width);\n return \"█\".repeat(filled).padEnd(width);\n}\n\n/**\n * Render the sweep curve as an ASCII table with a bar per row plus a\n * one-line sparkline summary. Highlights the argmax row in green.\n */\nfunction printCurve(report: SweepReport, entityKey: string | undefined): void {\n const points = report.points;\n const maxMatched = Math.max(...points.map((p) => p.report.proposed.matched));\n const baselineMatched = report.baseline.report.original.matched;\n\n // Bars + sparkline track the OBJECTIVE score, not matched, so the green\n // \"best\" row also gets the longest bar even under a custom objective.\n // Normalize to [minScore..maxScore]; flat curves render empty bars.\n const scores = points.map((p) => p.score);\n const minScore = Math.min(...scores);\n const maxScore = Math.max(...scores);\n const scoreRange = maxScore - minScore;\n\n const sparkline = points\n .map((p) => {\n const r = scoreRange > 0 ? (p.score - minScore) / scoreRange : 0;\n return BLOCKS[Math.min(BLOCKS.length - 1, Math.round(r * (BLOCKS.length - 1)))];\n })\n .join(\"\");\n\n console.log(`\\n${pc.bold(\"directive tune\")} — parameter sweep`);\n console.log(\n `\\n frames evaluated ${points[0]?.report.framesEvaluated ?? 0}`,\n );\n console.log(\n ` baseline (current) matched ${baselineMatched} frames`,\n );\n console.log(` points evaluated ${points.length}\\n`);\n\n console.log(` sparkline ${pc.cyan(sparkline)}\\n`);\n\n // Detail table.\n const valueKeys = Object.keys(points[0]?.values ?? {});\n const header =\n valueKeys.map((k) => k.padEnd(12)).join(\" \") +\n \" \" +\n \"matched\".padStart(8) +\n \" \" +\n \"delta\".padStart(7) +\n (entityKey ? \" \" + `${entityKey}s`.padStart(8) : \"\") +\n \" bar\";\n console.log(pc.dim(\" \" + header));\n\n for (const p of points) {\n const valsStr = valueKeys\n .map((k) => String(p.values[k] ?? \"\").padEnd(12))\n .join(\" \");\n const matched = p.report.proposed.matched;\n const delta = p.report.delta;\n const entityStr = entityKey\n ? String(p.report.proposed.matchedEntities ?? \"\").padStart(8)\n : \"\";\n const deltaStr =\n delta > 0\n ? pc.green(`+${delta}`.padStart(7))\n : delta < 0\n ? pc.red(`${delta}`.padStart(7))\n : pc.dim(\"±0\".padStart(7));\n const barLen =\n scoreRange > 0 ? Math.round(((p.score - minScore) / scoreRange) * 24) : 0;\n const row =\n valsStr +\n \" \" +\n String(matched).padStart(8) +\n \" \" +\n deltaStr +\n (entityKey ? \" \" + entityStr : \"\") +\n \" \" +\n \"█\".repeat(barLen).padEnd(24);\n\n const isBest = p === report.best;\n console.log(isBest ? pc.green(\" \" + row) : \" \" + row);\n }\n\n console.log(\n `\\n ${pc.bold(pc.green(\"best\"))} — ${valueKeys\n .map((k) => `${k}=${report.best.values[k]}`)\n .join(\", \")} → matched ${report.best.report.proposed.matched} (score ${\n report.best.score\n })\\n`,\n );\n}\n\n// ============================================================================\n// Command entrypoint\n// ============================================================================\n\nexport async function tuneCommand(args: string[]): Promise<void> {\n if (args.includes(\"--help\") || args.length === 0) {\n printUsage();\n process.exit(args.length === 0 ? 1 : 0);\n }\n\n const opts = parseArgs(args);\n\n if (!opts.historyPath) {\n console.error(pc.red(\"error: --history <frames.json> is required\"));\n printUsage();\n process.exit(1);\n }\n if (!opts.originalPath) {\n console.error(pc.red(\"error: --original <spec.json> is required\"));\n printUsage();\n process.exit(1);\n }\n if (!opts.templatePath) {\n console.error(pc.red(\"error: --template <spec.json> is required\"));\n printUsage();\n process.exit(1);\n }\n if (opts.sweepArgs.length === 0) {\n console.error(pc.red(\"error: at least one --sweep <key:range> is required\"));\n printUsage();\n process.exit(1);\n }\n\n const frames = loadFrames(readJsonFile(opts.historyPath, \"--history\"));\n const original = readJsonFile(opts.originalPath, \"--original\");\n const template = readJsonFile(opts.templatePath, \"--template\");\n\n const sweep: Record<string, unknown[]> = {};\n for (const s of opts.sweepArgs) {\n const [name, values] = parseSweepArg(s);\n sweep[name] = values;\n }\n\n let report: SweepReport;\n try {\n report = sweepUnder({\n frames,\n // biome-ignore lint/suspicious/noExplicitAny: spec loaded from JSON\n original: original as any,\n template,\n sweep,\n entityKey: opts.entityKey,\n });\n } catch (err) {\n console.error(pc.red(`error: ${(err as Error).message}`));\n process.exit(1);\n }\n\n if (opts.json) {\n console.log(JSON.stringify(report, null, 2));\n\n return;\n }\n\n printCurve(report, opts.entityKey);\n}\n","import {\n aiRulesCheckCommand,\n aiRulesCommand,\n aiRulesUpdateCommand,\n} from \"./commands/ai-rules.js\";\nimport { bisectCommand } from \"./commands/bisect.js\";\nimport { doctorCommand } from \"./commands/doctor.js\";\nimport {\n examplesCopyCommand,\n examplesListCommand,\n} from \"./commands/examples.js\";\nimport { explainCommand } from \"./commands/explain.js\";\nimport { graphCommand } from \"./commands/graph.js\";\nimport { initCommand } from \"./commands/init.js\";\nimport { inspectCommand } from \"./commands/inspect.js\";\nimport { newModuleCommand, newOrchestratorCommand } from \"./commands/new.js\";\nimport { replayUnderCommand } from \"./commands/replay-under.js\";\nimport { replayCommand } from \"./commands/replay.js\";\nimport { timelineDiffCommand } from \"./commands/timeline-diff.js\";\nimport { tuneCommand } from \"./commands/tune.js\";\nimport { CLI_NAME } from \"./lib/constants.js\";\n\nconst HELP = `\n${CLI_NAME} — CLI tools for Directive\n\nUsage: ${CLI_NAME} <command> [options]\n\nCommands:\n init Project scaffolding wizard\n new module <name> Generate a module file\n new orchestrator <name> Generate an AI orchestrator\n inspect <file> Runtime system introspection\n explain <file> [req-id] Explain why a requirement exists\n graph <file> Visual dependency graph\n doctor Health check for project setup\n ai-rules init Install AI coding rules\n ai-rules update Refresh rules to latest version\n ai-rules check Validate rules are current (CI)\n examples list Browse available examples\n examples copy <name> Extract example to project\n replay <timeline.json> Replay a serialized Directive timeline\n (paired with @directive-run/timeline)\n tune --history ... Grid-search a predicate template's $hole\n parameters against recorded history\n replay-under --history ... Predicate backtest — diff a proposed\n predicate against recorded history\n bisect <timeline.json> Binary-search a timeline for the first\n frame that triggers a failing assertion\n timeline diff <a> <b> Semantic causal-graph diff between two\n serialized timelines\n\nOptions:\n --help, -h Show this help message\n --version, -v Show version\n\ninit options:\n --template <name> Template: counter, auth-flow, ai-orchestrator\n --dir <path> Target directory (default: cwd)\n --no-interactive Skip prompts, use defaults\n\nnew module options:\n --with <sections> Sections: derive,events,constraints,resolvers,effects\n --minimal Schema + init only\n --dir <path> Target directory (default: cwd)\n\ninspect options:\n --json Output as JSON\n --module <name> Inspect specific module\n\ngraph options:\n --ascii Terminal-only output\n --no-open Don't open in browser\n --output <path> Output file path\n\nai-rules init options:\n --force Overwrite existing files without asking\n --merge Use section markers to update only the Directive section\n --tool <name> Skip detection, install for specific tool(s)\n --dir <path> Target directory (default: cwd)\n\nexamples options:\n --filter <category> Filter by category or name\n --dest <dir> Destination directory for copy\n`.trim();\n\nasync function main() {\n const args = process.argv.slice(2);\n\n // Only treat `--help` / `-h` as a request for *global* help when there is\n // no command, or the first arg is itself the help flag. When a command is\n // present (`directive replay-under --help`), routing wins and the command\n // prints its own help — otherwise a command's `-h` alias and its own\n // `--help` handling would be unreachable.\n const first = args[0];\n const wantsGlobalHelp =\n args.length === 0 || first === \"--help\" || first === \"-h\";\n if (wantsGlobalHelp) {\n console.log(HELP);\n process.exit(0);\n }\n\n if (first === \"--version\" || first === \"-v\") {\n const { readFileSync } = await import(\"node:fs\");\n const { fileURLToPath } = await import(\"node:url\");\n const { dirname, join } = await import(\"node:path\");\n\n const __dirname = dirname(fileURLToPath(import.meta.url));\n const pkg = JSON.parse(\n readFileSync(join(__dirname, \"..\", \"package.json\"), \"utf-8\"),\n );\n\n console.log(pkg.version);\n process.exit(0);\n }\n\n const command = args[0];\n\n switch (command) {\n case \"init\": {\n await initCommand(args.slice(1));\n break;\n }\n\n case \"new\": {\n const subcommand = args[1];\n const name = args[2];\n\n if (subcommand === \"module\") {\n if (!name) {\n console.error(\"Usage: directive new module <name>\");\n process.exit(1);\n }\n await newModuleCommand(name, args.slice(3));\n } else if (subcommand === \"orchestrator\") {\n if (!name) {\n console.error(\"Usage: directive new orchestrator <name>\");\n process.exit(1);\n }\n await newOrchestratorCommand(name, args.slice(3));\n } else {\n console.error(\n `Unknown subcommand: ${subcommand ?? \"(none)\"}\\n` +\n `Usage: ${CLI_NAME} new module <name>\\n` +\n ` ${CLI_NAME} new orchestrator <name>`,\n );\n process.exit(1);\n }\n break;\n }\n\n case \"inspect\": {\n await inspectCommand(args.slice(1));\n break;\n }\n\n case \"explain\": {\n await explainCommand(args.slice(1));\n break;\n }\n\n case \"graph\": {\n await graphCommand(args.slice(1));\n break;\n }\n\n case \"doctor\": {\n await doctorCommand(args.slice(1));\n break;\n }\n\n case \"ai-rules\": {\n const subcommand = args[1];\n\n if (subcommand === \"init\") {\n await aiRulesCommand(args.slice(2));\n } else if (subcommand === \"update\") {\n await aiRulesUpdateCommand(args.slice(2));\n } else if (subcommand === \"check\") {\n await aiRulesCheckCommand(args.slice(2));\n } else {\n console.error(\n `Unknown subcommand: ${subcommand ?? \"(none)\"}\\n` +\n `Usage: ${CLI_NAME} ai-rules init\\n` +\n ` ${CLI_NAME} ai-rules update\\n` +\n ` ${CLI_NAME} ai-rules check`,\n );\n process.exit(1);\n }\n break;\n }\n\n case \"examples\": {\n const subcommand = args[1];\n\n if (subcommand === \"list\") {\n await examplesListCommand(args.slice(2));\n } else if (subcommand === \"copy\") {\n const name = args[2];\n if (!name) {\n console.error(\"Usage: directive examples copy <name>\");\n process.exit(1);\n }\n await examplesCopyCommand(name, args.slice(3));\n } else {\n console.error(\n `Unknown subcommand: ${subcommand ?? \"(none)\"}\\n` +\n `Usage: ${CLI_NAME} examples list [--filter <category>]\\n` +\n ` ${CLI_NAME} examples copy <name> [--dest <dir>]`,\n );\n process.exit(1);\n }\n break;\n }\n\n case \"replay\": {\n await replayCommand(args.slice(1));\n break;\n }\n\n case \"replay-under\": {\n await replayUnderCommand(args.slice(1));\n break;\n }\n\n case \"tune\": {\n await tuneCommand(args.slice(1));\n break;\n }\n\n case \"bisect\": {\n await bisectCommand(args.slice(1));\n break;\n }\n\n case \"timeline\": {\n const subcommand = args[1];\n if (subcommand === \"diff\") {\n await timelineDiffCommand(args.slice(2));\n } else {\n console.error(\n `Unknown subcommand: ${subcommand ?? \"(none)\"}\\n` +\n `Usage: ${CLI_NAME} timeline diff <a.json> <b.json>`,\n );\n process.exit(1);\n }\n break;\n }\n\n default:\n console.error(\n `Unknown command: ${command}\\nRun '${CLI_NAME} --help' for usage.`,\n );\n process.exit(1);\n }\n}\n\nmain().catch((err) => {\n console.error(err.message || err);\n process.exit(1);\n});\n"]}
|